{"code":"var GUI=function(e){function t(t){for(var a,i,s=t[0],l=t[1],c=t[2],u=0,p=[];u>16)&n,e=18e3*(65535&e)+(e>>16)&n;let a=(t<<16)+e&n;return a/=4294967296,a+1}}()}();const b=e=>{const{alignContent:t,alignItems:n,alignSelf:a,basis:r,children:i,className:s,componentRef:c,direction:d,element:u,grow:b,height:w,justifyContent:f,width:M,wrap:v,shrink:y,style:k}=e,j=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;ae===E.FETCHING_WITH_ID||e===E.FETCHING_NEW_DEFAULT,_=e=>e===E.LOADING_VM_WITH_ID||e===E.LOADING_VM_NEW_DEFAULT,D=e=>e===E.LOADING_VM_FILE_UPLOAD||e===E.LOADING_VM_WITH_ID||e===E.LOADING_VM_NEW_DEFAULT,T=e=>e===E.LOADING_VM_FILE_UPLOAD,O=e=>e===E.CREATING_NEW,A=e=>e===E.FETCHING_NEW_DEFAULT||e===E.LOADING_VM_NEW_DEFAULT||e===E.CREATING_NEW,P=e=>e===E.CREATING_COPY,z=e=>e===E.MANUAL_UPDATING,L=e=>e===E.REMIXING,R=e=>e===E.AUTO_UPDATING||e===E.MANUAL_UPDATING||e===E.UPDATING_BEFORE_COPY||e===E.UPDATING_BEFORE_NEW,U=e=>e===E.SHOWING_WITH_ID||e===E.SHOWING_WITHOUT_ID,B=e=>e===E.SHOWING_WITH_ID,G=e=>e===E.SHOWING_WITHOUT_ID,F=e=>e===E.ERROR,Z={error:null,projectData:null,projectId:null,loadingState:E.NOT_LOADED},W=function(e,t){switch(void 0===e&&(e=Z),t.type){case r:return e.loadingState===E.CREATING_NEW?Object.assign({},e,{loadingState:E.SHOWING_WITH_ID,projectId:t.projectId}):e;case s:return e.loadingState===E.FETCHING_WITH_ID?Object.assign({},e,{loadingState:E.LOADING_VM_WITH_ID,projectData:t.projectData}):e;case i:return e.loadingState===E.FETCHING_NEW_DEFAULT?Object.assign({},e,{loadingState:E.LOADING_VM_NEW_DEFAULT,projectData:t.projectData}):e;case d:return e.loadingState===E.LOADING_VM_FILE_UPLOAD||e.loadingState===E.LOADING_VM_NEW_DEFAULT?Object.assign({},e,{loadingState:E.SHOWING_WITHOUT_ID,projectId:x}):e;case c:return e.loadingState===E.LOADING_VM_WITH_ID?Object.assign({},e,{loadingState:E.SHOWING_WITH_ID}):e;case l:return e.loadingState===E.LOADING_VM_FILE_UPLOAD?Object.assign({},e,{loadingState:E.AUTO_UPDATING}):e;case u:return e.loadingState===E.REMIXING?Object.assign({},e,{loadingState:E.SHOWING_WITH_ID,projectId:t.projectId}):e;case o:return e.loadingState===E.CREATING_COPY?Object.assign({},e,{loadingState:E.SHOWING_WITH_ID,projectId:t.projectId}):e;case p:return e.loadingState===E.AUTO_UPDATING||e.loadingState===E.MANUAL_UPDATING?Object.assign({},e,{loadingState:E.SHOWING_WITH_ID}):e;case m:return e.loadingState===E.UPDATING_BEFORE_COPY?Object.assign({},e,{loadingState:E.CREATING_COPY}):e;case g:return e.loadingState===E.UPDATING_BEFORE_NEW?Object.assign({},e,{loadingState:E.FETCHING_NEW_DEFAULT,projectId:x}):e;case h:return null===e.projectId||e.projectId===x?Object.assign({},e,{loadingState:E.SHOWING_WITHOUT_ID,projectId:x}):Object.assign({},e,{loadingState:E.SHOWING_WITH_ID});case b:return e.projectId===t.projectId?e:e.loadingState===E.SHOWING_WITH_ID||e.loadingState!==E.SHOWING_WITHOUT_ID?t.projectId===x||null===t.projectId?Object.assign({},e,{loadingState:E.FETCHING_NEW_DEFAULT,projectId:x}):Object.assign({},e,{loadingState:E.FETCHING_WITH_ID,projectId:t.projectId}):t.projectId!==x&&null!==t.projectId?Object.assign({},e,{loadingState:E.FETCHING_WITH_ID,projectId:t.projectId}):e;case w:return e.loadingState===E.SHOWING_WITH_ID?Object.assign({},e,{loadingState:E.AUTO_UPDATING}):e;case f:return e.loadingState===E.SHOWING_WITHOUT_ID?Object.assign({},e,{loadingState:E.CREATING_NEW}):e;case v:return[E.SHOWING_WITH_ID,E.SHOWING_WITHOUT_ID].includes(e.loadingState)?Object.assign({},e,{loadingState:E.FETCHING_NEW_DEFAULT,projectId:x}):e;case y:return[E.NOT_LOADED,E.SHOWING_WITH_ID,E.SHOWING_WITHOUT_ID].includes(e.loadingState)?Object.assign({},e,{loadingState:E.LOADING_VM_FILE_UPLOAD}):e;case k:return e.loadingState===E.SHOWING_WITH_ID?Object.assign({},e,{loadingState:E.MANUAL_UPDATING}):e;case j:return e.loadingState===E.SHOWING_WITH_ID?Object.assign({},e,{loadingState:E.REMIXING}):e;case I:return e.loadingState===E.SHOWING_WITH_ID?Object.assign({},e,{loadingState:E.UPDATING_BEFORE_COPY}):e;case S:return e.loadingState===E.SHOWING_WITH_ID?Object.assign({},e,{loadingState:E.UPDATING_BEFORE_NEW}):e;case M:return[E.FETCHING_NEW_DEFAULT,E.FETCHING_WITH_ID,E.LOADING_VM_NEW_DEFAULT,E.LOADING_VM_WITH_ID].includes(e.loadingState)?Object.assign({},e,{loadingState:E.ERROR,error:t.error}):[E.AUTO_UPDATING,E.CREATING_COPY,E.MANUAL_UPDATING,E.REMIXING,E.UPDATING_BEFORE_COPY,E.UPDATING_BEFORE_NEW].includes(e.loadingState)?Object.assign({},e,{loadingState:E.SHOWING_WITH_ID,error:t.error}):e.loadingState===E.CREATING_NEW?e.projectId===x||null===e.projectId?Object.assign({},e,{loadingState:E.SHOWING_WITHOUT_ID,error:t.error}):Object.assign({},e,{loadingState:E.SHOWING_WITH_ID,error:t.error}):e;default:return e}},H=()=>({type:f}),Q=(e,t)=>{switch(t){case E.CREATING_NEW:return{type:r,projectId:e};case E.CREATING_COPY:return{type:o,projectId:e};case E.REMIXING:return{type:u,projectId:e}}},Y=(e,t)=>{switch(t){case E.FETCHING_WITH_ID:return{type:s,projectData:e};case E.FETCHING_NEW_DEFAULT:return{type:i,projectData:e}}},V=(e,t,n)=>{switch(e){case E.LOADING_VM_WITH_ID:return n?{type:c}:{type:h};case E.LOADING_VM_FILE_UPLOAD:return n?t?{type:l}:{type:d}:{type:h};case E.LOADING_VM_NEW_DEFAULT:return n?{type:d}:{type:M};default:return}},q=e=>{switch(e){case E.AUTO_UPDATING:case E.MANUAL_UPDATING:return{type:p};case E.UPDATING_BEFORE_COPY:return{type:m};case E.UPDATING_BEFORE_NEW:return{type:g}}},J=e=>({type:M,error:e}),X=e=>({type:b,projectId:e}),K=e=>e?{type:S}:{type:v},$=e=>{switch(e){case E.NOT_LOADED:case E.SHOWING_WITH_ID:case E.SHOWING_WITHOUT_ID:return{type:y}}},ee=()=>({type:w}),te=()=>({type:k}),ne=()=>({type:I}),ae=()=>({type:j})},,function(e,t,n){\"use strict\";n.d(t,\"r\",(function(){return j})),n.d(t,\"s\",(function(){return k})),n.d(t,\"t\",(function(){return x})),n.d(t,\"v\",(function(){return E})),n.d(t,\"x\",(function(){return C})),n.d(t,\"A\",(function(){return N})),n.d(t,\"D\",(function(){return _})),n.d(t,\"F\",(function(){return D})),n.d(t,\"E\",(function(){return T})),n.d(t,\"G\",(function(){return A})),n.d(t,\"u\",(function(){return O})),n.d(t,\"I\",(function(){return P})),n.d(t,\"C\",(function(){return z})),n.d(t,\"w\",(function(){return L})),n.d(t,\"B\",(function(){return R})),n.d(t,\"y\",(function(){return U})),n.d(t,\"H\",(function(){return B})),n.d(t,\"z\",(function(){return G})),n.d(t,\"a\",(function(){return F})),n.d(t,\"c\",(function(){return Z})),n.d(t,\"e\",(function(){return W})),n.d(t,\"h\",(function(){return H})),n.d(t,\"m\",(function(){return Y})),n.d(t,\"k\",(function(){return V})),n.d(t,\"l\",(function(){return q})),n.d(t,\"n\",(function(){return Q})),n.d(t,\"o\",(function(){return J})),n.d(t,\"b\",(function(){return X})),n.d(t,\"q\",(function(){return K})),n.d(t,\"j\",(function(){return $})),n.d(t,\"d\",(function(){return ee})),n.d(t,\"i\",(function(){return te})),n.d(t,\"f\",(function(){return ne})),n.d(t,\"p\",(function(){return ae})),n.d(t,\"g\",(function(){return oe}));const a=\"scratch-gui/modals/OPEN_MODAL\",o=\"scratch-gui/modals/CLOSE_MODAL\",r=\"backdropLibrary\",i=\"costumeLibrary\",s=\"extensionLibrary\",l=\"loadingProject\",c=\"telemetryModal\",d=\"soundLibrary\",u=\"spriteLibrary\",p=\"soundRecorder\",m=\"connectionModal\",g=\"tipsLibrary\",h=\"usernameModal\",b=\"settingsModal\",w=\"customExtensionModal\",f=\"restorePointModal\",M=\"fontsModal\",v=\"unknownPlatformModal\",y=\"invalidProjectModal\",k={[r]:!1,[i]:!1,[s]:!1,[l]:!1,[c]:!1,[d]:!1,[u]:!1,[p]:!1,[m]:!1,[g]:!1,[h]:!1,[b]:!1,[w]:!1,[f]:!1,[M]:!1,[v]:!1,[y]:!1},j=function(e,t){switch(void 0===e&&(e=k),t.type){case a:return Object.assign({},e,{[t.modal]:!0});case o:return Object.assign({},e,{[t.modal]:!1});default:return e}},I=function(e){return{type:a,modal:e}},S=function(e){return{type:o,modal:e}},x=function(){return I(r)},E=function(){return I(i)},C=function(){return I(s)},N=function(){return I(l)},_=function(){return I(d)},D=function(){return I(u)},T=function(){return I(p)},O=function(){return I(m)},A=function(){return I(g)},P=function(){return I(h)},z=function(){return I(b)},L=function(){return I(w)},R=function(){return I(f)},U=function(){return I(M)},B=function(){return I(v)},G=function(){return I(y)},F=function(){return S(r)},Z=function(){return S(i)},W=function(){return S(s)},H=function(){return S(l)},Q=function(){return S(c)},Y=function(){return S(u)},V=function(){return S(d)},q=function(){return S(p)},J=function(){return S(g)},X=function(){return S(m)},K=function(){return S(h)},$=function(){return S(b)},ee=function(){return S(w)},te=function(){return S(f)},ne=function(){return S(M)},ae=function(){return S(v)},oe=function(){return S(y)}},,function(e,t,n){\"use strict\";n.d(t,\"a\",(function(){return s})),n.d(t,\"c\",(function(){return d})),n.d(t,\"d\",(function(){return i})),n.d(t,\"e\",(function(){return r})),n.d(t,\"b\",(function(){return l})),n.d(t,\"f\",(function(){return c}));var a=n(42),o=n.n(a);const r=o()({large:null,small:null,full:null}),i=o()({large:null,small:null,constrained:null,full:null}),s=.675,l=480,c=1096-l,d={[i.large]:{width:l},[i.small]:{width:.5*l},[i.constrained]:{scale:.85},[i.full]:{scale:1}}},function(e,t,n){var a=n(515);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){\"use strict\";function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t[e,...e.descendants()]))}siblings(){return this.parent?this.parent.children.filter((e=>e.id!==this.id)):[]}findById(e){if(this.id===e)return this;for(const t of this.children){const n=t.findById(e);if(n)return n}return null}}const v=new M(\"root\").addChild(new M(f)).addChild(new M(h).addChild(new M(p)).addChild(new M(b)).addChild(new M(w))).addChild(new M(u)).addChild(new M(d)).addChild(new M(g)).addChild(new M(h)).addChild(new M(m)).addChild(new M(c)).addChild(new M(l)),y={[l]:!1,[c]:!1,[d]:!1,[u]:!1,[p]:!1,[m]:!1,[g]:!1,[h]:!1,[b]:!1,[w]:!1,[f]:!1},k=function(e,t){switch(void 0===e&&(e=y),t.type){case i:{const n=v.findById(t.menu).siblings().flatMap((e=>[e,...e.descendants()]));return o(o({},e),{},{[t.menu]:!0},Object.fromEntries(n.map((e=>{let{id:t}=e;return[t,!1]}))))}case s:{const n=v.findById(t.menu),a=[n,...n.descendants()];return o(o({},e),Object.fromEntries(a.map((e=>{let{id:t}=e;return[t,!1]}))))}default:return e}},j=e=>({type:i,menu:e}),I=e=>({type:s,menu:e}),S=()=>j(l),x=()=>I(l),E=e=>e.scratchGui.menus[l],C=()=>j(c),N=()=>I(c),_=e=>e.scratchGui.menus[c],D=()=>j(d),T=()=>I(d),O=e=>e.scratchGui.menus[d],A=()=>j(u),P=()=>I(u),z=e=>e.scratchGui.menus[u],L=()=>j(p),R=e=>e.scratchGui.menus[p],U=()=>j(m),B=()=>I(m),G=e=>e.scratchGui.menus[m],F=()=>j(g),Z=()=>I(g),W=e=>e.scratchGui.menus[g],H=()=>j(h),Q=()=>I(h),Y=e=>e.scratchGui.menus[h],V=()=>j(b),q=e=>e.scratchGui.menus[b],J=()=>j(w),X=e=>e.scratchGui.menus[w],K=()=>j(f),$=()=>I(f),ee=e=>e.scratchGui.menus[f]},function(e,t,n){var a=n(489);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){\"use strict\";n.d(t,\"d\",(function(){return m})),n.d(t,\"a\",(function(){return d})),n.d(t,\"b\",(function(){return g})),n.d(t,\"c\",(function(){return h})),n.d(t,\"e\",(function(){return p})),n.d(t,\"f\",(function(){return u})),n.d(t,\"g\",(function(){return f})),n.d(t,\"h\",(function(){return w})),n.d(t,\"i\",(function(){return b}));var a=n(45),o=n(82);const r=\"scratch-gui/alerts/SHOW_ALERT\",i=\"scratch-gui/alerts/SHOW_EXTENSION_ALERT\",s=\"scratch-gui/alerts/CLOSE_ALERT\",l=\"scratch-gui/alerts/CLOSE_ALERTS_WITH_ID\",c=\"scratch-gui/alerts/CLOSE_ALERT_WITH_ID\",d={visible:!0,alertsList:[]},u=e=>e.filter((e=>e.alertType===a.b.STANDARD||e.alertType===a.b.EXTENSION)),p=e=>e.filter((e=>e.alertType===a.b.INLINE)),m=function(e,t){switch(void 0===e&&(e=d),t.type){case r:{const n=t.alertId;if(n){const o={alertId:n,level:a.a.WARN},r=a.c.find((e=>e.alertId===n));if(r){const n=e.alertsList.filter((e=>!r.clearList||-1===r.clearList.indexOf(e.alertId)));return t.data&&t.data.message&&(o.message=t.data.message),o.alertType=r.alertType||a.b.STANDARD,o.closeButton=r.closeButton,o.content=r.content,o.iconURL=r.iconURL,o.iconSpinner=r.iconSpinner,o.level=r.level,o.showDownload=r.showDownload,o.showSaveNow=r.showSaveNow,n.push(o),Object.assign({},e,{alertsList:n})}}return e}case i:{const n=t.data.extensionId;if(n){const t=o.a.find((e=>e.extensionId===n));if(t){const o=e.alertsList.slice(),r={alertType:a.b.EXTENSION,closeButton:!0,extensionId:n,extensionName:t.name,iconURL:t.connectionSmallIconURL,level:a.a.WARN,showReconnect:!0};return o.push(r),Object.assign({},e,{alertsList:o})}}return e}case c:case s:{if(t.alertId&&(t.index=e.alertsList.findIndex((e=>e.alertId===t.alertId)),-1===t.index))return e;const n=e.alertsList.slice();return n.splice(t.index,1),Object.assign({},e,{alertsList:n})}case l:return Object.assign({},e,{alertsList:e.alertsList.filter((e=>e.alertId!==t.alertId))});default:return e}},g=function(e){return{type:s,index:e}},h=function(e){return{type:c,alertId:e}},b=function(e){return{type:r,alertId:e}},w=function(e){return{type:i,data:e}},f=function(e,t){const n=a.c.find((e=>e.alertId===t));n&&(e(b(t)),n.maxDisplaySecs&&setTimeout((()=>{e(function(e){return{type:l,alertId:e}}(t))}),1e3*n.maxDisplaySecs))}},function(e,t,n){var a=n(546);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(527);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){\"use strict\";n.d(t,\"c\",(function(){return j})),n.d(t,\"u\",(function(){return k})),n.d(t,\"k\",(function(){return I})),n.d(t,\"n\",(function(){return S})),n.d(t,\"g\",(function(){return x})),n.d(t,\"r\",(function(){return E})),n.d(t,\"s\",(function(){return C})),n.d(t,\"e\",(function(){return N})),n.d(t,\"m\",(function(){return _})),n.d(t,\"o\",(function(){return D})),n.d(t,\"i\",(function(){return T})),n.d(t,\"d\",(function(){return O})),n.d(t,\"h\",(function(){return A})),n.d(t,\"a\",(function(){return P})),n.d(t,\"b\",(function(){return z})),n.d(t,\"j\",(function(){return L})),n.d(t,\"t\",(function(){return R})),n.d(t,\"l\",(function(){return U})),n.d(t,\"f\",(function(){return B})),n.d(t,\"p\",(function(){return G})),n.d(t,\"q\",(function(){return F}));const a=\"tw/SET_FRAMERATE\",o=\"tw/SET_INTERPOLATION\",r=\"tw/SET_COMPILER_OPTIONS\",i=\"tw/SET_RUNTIME_OPTIONS\",s=\"tw/SET_USERNAME\",l=\"tw/SET_CLOUD\",c=\"tw/SET_HIGH_QUALITY_PEN\",d=\"tw/SET_WINDOW_FULLSCREEN\",u=\"tw/SET_DIMENSIONS\",p=\"tw/SET_AUTHOR\",m=\"tw/SET_DESCRIPTION\",g=\"tw/ADD_COMPILE_ERROR\",h=\"tw/CLEAR_COMPILE_ERRORS\",b=\"tw/SET_FILE_HANDLE\",w=\"tw/SET_USERNAME_INVALID\",f=\"tw/SET_HAS_CLOUD_VARIABLES\",M=\"tw/SET_CLOUD_HOST\",v=\"tw/SET_PLATFORM_MISMATCH_DETAILS\",y=\"tw/SET_PROJECT_ERROR\",k={framerate:30,interpolation:!1,cloud:!0,username:\"\",highQualityPen:!1,compilerOptions:{enabled:!0,warpTimer:!1},runtimeOptions:{maxClones:300,miscLimits:!0,fencing:!0},isWindowFullScreen:!1,dimensions:[0,0],author:{username:\"\",thumbnail:\"\"},description:{instructions:\"\",credits:\"\"},compileErrors:[],fileHandle:null,usernameInvalid:!1,hasCloudVariables:!1,cloudHost:\"\",platformMismatchDetails:{platform:null,callback:null},projectError:null},j=function(e,t){switch(void 0===e&&(e=k),t.type){case a:return Object.assign({},e,{framerate:t.framerate});case o:return Object.assign({},e,{interpolation:t.interpolation});case r:return Object.assign({},e,{compilerOptions:t.compilerOptions});case i:return Object.assign({},e,{runtimeOptions:t.runtimeOptions});case s:return Object.assign({},e,{username:t.username});case l:return Object.assign({},e,{cloud:t.cloud});case c:return Object.assign({},e,{highQualityPen:t.highQualityPen});case d:return Object.assign({},e,{isWindowFullScreen:t.isWindowFullScreen});case u:return Object.assign({},e,{dimensions:t.dimensions});case p:return Object.assign({},e,{author:t.author});case m:return Object.assign({},e,{description:t.description});case g:return Object.assign({},e,{compileErrors:[t.error,...e.compileErrors.slice(0,7)]});case h:return Object.assign({},e,{compileErrors:[]});case b:return Object.assign({},e,{fileHandle:t.fileHandle});case w:return Object.assign({},e,{usernameInvalid:t.usernameInvalid});case f:return Object.assign({},e,{hasCloudVariables:t.hasCloudVariables});case M:return Object.assign({},e,{cloudHost:t.cloudHost});case v:return Object.assign({},e,{platformMismatchDetails:{platform:t.platform,callback:t.callback}});case y:return Object.assign({},e,{projectError:t.projectError});default:return e}},I=function(e){return{type:a,framerate:e}},S=function(e){return{type:o,interpolation:e}},x=function(e){return{type:r,compilerOptions:e}},E=function(e){return{type:i,runtimeOptions:e}},C=function(e){return{type:s,username:e}},N=function(e){return{type:l,cloud:e}},_=function(e){return{type:c,highQualityPen:e}},D=function(e){return{type:d,isWindowFullScreen:e}},T=function(e){return{type:u,dimensions:e}},O=function(e){return{type:p,author:e}},A=function(e){return{type:m,description:e}},P=function(e){return{type:g,error:e}},z=function(){return{type:h}},L=function(e){return{type:b,fileHandle:e}},R=function(e){return{type:w,usernameInvalid:e}},U=function(e){return{type:f,hasCloudVariables:e}},B=function(e){return{type:M,cloudHost:e}},G=function(e,t){return{type:v,platform:e,callback:t}},F=function(e){return{type:y,projectError:e}}},,function(e,t,n){\"use strict\";var a=n(427),o=n.n(a),r=n(2),i=n(49);function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function l(e){for(var t=1;te.defaultMessage;var p=e=>{const t=e||u;return{targets:[{isStage:!0,name:\"Stage\",variables:{\"`jEk@4|i[#Fk?(8x)AV.-my variable\":[t(d.variable),0]},lists:{},broadcasts:{},blocks:{},currentCostume:0,costumes:[{assetId:\"cd21514d0531fdffb22204e0ec5ed84a\",name:t(d.backdrop,{index:1}),md5ext:\"cd21514d0531fdffb22204e0ec5ed84a.svg\",dataFormat:\"svg\",rotationCenterX:240,rotationCenterY:180}],sounds:[],volume:100},{isStage:!1,name:t(d.sprite,{index:1}),variables:{},lists:{},broadcasts:{},blocks:{},comments:{},currentCostume:0,costumes:[{assetId:\"927d672925e7b99f7813735c484c6922\",name:t(d.costume,{index:1}),bitmapResolution:1,md5ext:\"927d672925e7b99f7813735c484c6922.svg\",dataFormat:\"svg\",rotationCenterX:30.74937882782359,rotationCenterY:58.864768144346826}],sounds:[],volume:100,visible:!0,x:0,y:0,size:100,direction:90,draggable:!1,rotationStyle:\"all around\"}],meta:{semver:\"3.0.0\",vm:\"0.1.0\",agent:\"\"}}},m=n(229),g=n.n(m),h=n(296),b=n.n(h),w=n(297),f=n.n(w),M=n(147);var v=e=>{if(g.a.byteLength>0)return[{id:0,assetType:\"Project\",dataFormat:\"JSON\",data:g.a}];let t;t=void 0===M.TextEncoder?n(147).TextEncoder:M.TextEncoder;const a=new t,o=p(e);return[{id:0,assetType:\"Project\",dataFormat:\"JSON\",data:JSON.stringify(o)},{id:\"cd21514d0531fdffb22204e0ec5ed84a\",assetType:\"ImageVector\",dataFormat:\"SVG\",data:a.encode(b.a)},{id:\"927d672925e7b99f7813735c484c6922\",assetType:\"ImageVector\",dataFormat:\"SVG\",data:a.encode(f.a)}]};class y extends o.a{constructor(){super(),this.cacheDefaultProject()}addOfficialScratchWebStores(){this.addWebStore([this.AssetType.Project],this.getProjectGetConfig.bind(this),this.getProjectCreateConfig.bind(this),this.getProjectUpdateConfig.bind(this)),this.addWebStore([this.AssetType.ImageVector,this.AssetType.ImageBitmap,this.AssetType.Sound,this.AssetType.Font],this.getAssetGetConfig.bind(this),this.getAssetCreateConfig.bind(this),this.getAssetCreateConfig.bind(this))}setProjectHost(e){this.projectHost=e}setProjectToken(e){this.projectToken=e}getProjectGetConfig(e){return\"\".concat(this.projectHost,\"/\").concat(e.assetId)+(this.projectToken?\"?token=\".concat(this.projectToken):\"\")}getProjectCreateConfig(){return{url:\"\".concat(this.projectHost,\"/\"),withCredentials:!0}}getProjectUpdateConfig(e){return{url:\"\".concat(this.projectHost,\"/\").concat(e.assetId),withCredentials:!0}}setAssetHost(e){this.assetHost=e}getAssetGetConfig(e){return\"\".concat(this.assetHost,\"/internalapi/asset/\").concat(e.assetId,\".\").concat(e.dataFormat,\"/get/\")}getAssetCreateConfig(e){return{method:\"post\",url:\"\".concat(this.assetHost,\"/\").concat(e.assetId,\".\").concat(e.dataFormat),withCredentials:!0}}setTranslatorFunction(e){this.translator=e,this.cacheDefaultProject()}cacheDefaultProject(){v(this.translator).forEach((e=>this.builtinHelper._store(this.AssetType[e.assetType],this.DataFormat[e.dataFormat],e.data,e.id)))}}const k=new y;t.a=k},function(e,t,n){var a=n(498);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(519);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){\"use strict\";n.d(t,\"e\",(function(){return l})),n.d(t,\"f\",(function(){return s})),n.d(t,\"d\",(function(){return c})),n.d(t,\"a\",(function(){return o})),n.d(t,\"b\",(function(){return r})),n.d(t,\"c\",(function(){return i}));const a=\"scratch-gui/navigation/ACTIVATE_TAB\",o=0,r=1,i=2,s={activeTabIndex:o},l=function(e,t){return void 0===e&&(e=s),t.type===a?Object.assign({},e,{activeTabIndex:t.activeTabIndex}):e},c=function(e){return{type:a,activeTabIndex:e}}},function(e,t,n){var a=n(487);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(459);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(480);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(486);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(496);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(545);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(549);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){\"use strict\";var a=n(3),o=n.n(a),r=n(0),i=n.n(r),s=n(1),l=n.n(s),c=n(195),d=n.n(c);const u=[\"className\",\"disabled\",\"iconClassName\",\"iconSrc\",\"iconWidth\",\"iconHeight\",\"onClick\",\"children\"];function p(){return p=Object.assign?Object.assign.bind():function(e){for(var t=1;t{let{className:t,disabled:n,iconClassName:a,iconSrc:r,iconWidth:i,iconHeight:s,onClick:c,children:m}=e,g=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a0?Object.assign({},e,{step:e.step-1}):e;case u:return Object.assign({},e,{x:t.x,y:t.y});case p:return Object.assign({},e,{dragging:!0});case m:return Object.assign({},e,{dragging:!1});default:return e}},b=function(e){return{type:l,activeDeckId:e}},w=function(){return{type:r}},f=function(){return{type:i}},M=function(){return{type:c}},v=function(){return{type:d}},y=function(e,t){return{type:u,x:e,y:t}},k=function(){return{type:p}},j=function(){return{type:m}}},function(e,t,n){var a=n(456);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(544);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},,,function(e,t,n){\"use strict\";n.d(t,\"a\",(function(){return r})),n.d(t,\"b\",(function(){return o})),n.d(t,\"c\",(function(){return i})),n.d(t,\"d\",(function(){return s}));const a=\"scratch-gui/project-changed/SET_PROJECT_CHANGED\",o=!1,r=function(e,t){return void 0===e&&(e=o),t.type===a?t.changed:e},i=()=>({type:a,changed:!0}),s=()=>({type:a,changed:!1})},function(e,t,n){\"use strict\";n.d(t,\"a\",(function(){return r})),n.d(t,\"b\",(function(){return o})),n.d(t,\"c\",(function(){return i}));const a=\"projectTitle/SET_PROJECT_TITLE\",o=\"\",r=function(e,t){return void 0===e&&(e=o),t.type===a?t.title:e},i=e=>({type:a,title:e})},function(e,t,n){\"use strict\";let a=null;const o=()=>!!a;t.a={get:()=>{if(!o())throw new Error(\"scratch-blocks is not loaded yet\");return a},isLoaded:o,load:()=>a?Promise.resolve():n.e(94).then(n.t.bind(null,657,7)).then((e=>(a=e.default,a)))}},function(e,t,n){var a=n(455);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(536);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},,function(e,t,n){\"use strict\";var a=n(1),o=n.n(a),r=n(0),i=n.n(r),s=n(181),l=n(11);class c extends o.a.Component{constructor(e){super(e),this.state={error:null,errorInfo:null}}componentDidCatch(e,t){e=e||{stack:\"Unknown stack\",message:\"Unknown error\"},t=t||{componentStack:\"Unknown component stack\"},this.state.error||this.setState({error:e,errorInfo:t}),l.default.error([\"Unhandled Error with action='\".concat(this.props.action,\"': \").concat(e.stack),\"Component stack: \".concat(t.componentStack)].join(\"\\n\"))}handleBack(){window.history.back()}handleReload(){window.location.replace(window.location.origin+window.location.pathname)}formatErrorMessage(){let e=\"\";if(this.state.error?e+=\"\".concat(this.state.error):e+=\"Unknown error\",this.state.errorInfo){const t=this.state.errorInfo.componentStack.trim().split(\"\\n\").slice(0,2).map((e=>e.trim()));e+=\"\\nComponent stack: \".concat(t.join(\" \"),\" ...\")}return e}render(){return this.state.error?o.a.createElement(s.a,{errorMessage:this.formatErrorMessage(),onReload:this.handleReload}):this.props.children}}c.propTypes={action:i.a.string.isRequired,children:i.a.node};var d=c;t.a=function(e){return function(t){return n=>o.a.createElement(d,{action:e},o.a.createElement(t,n))}}},,function(e,t,n){\"use strict\";t.a={}},,function(e,t,n){var a=n(466);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(528);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},,,function(e,t,n){\"use strict\";var a=n(0),o=n.n(a),r=n(1),i=n.n(r),s=n(3),l=n.n(s),c=n(232),d=n.n(c);const u=[\"small\"];function p(){return p=Object.assign?Object.assign.bind():function(e){for(var t=1;t{const{small:t}=e,n=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a0&&void 0!==arguments[0]?arguments[0]:l,t=arguments.length>1?arguments[1]:void 0;return t.type===s?r(r({},e),{},{theme:t.theme}):e},d=e=>({type:s,theme:e})},,function(e,t,n){\"use strict\";n.d(t,\"c\",(function(){return je})),n.d(t,\"d\",(function(){return Ie})),n.d(t,\"b\",(function(){return Se}));var a=n(1),o=n.n(a),r=n(2),i=n(267),s=n.n(i),l=n(268),c=n.n(l),d=n(269),u=n.n(d),p=n(270),m=n.n(p),g=n(271),h=n.n(g),b=n(272),w=n.n(b),f=n(273),M=n.n(f),v=n(274),y=n.n(v),k=n(275),j=n.n(k),I=n(276),S=n.n(I),x=n(277),E=n.n(x),C=n(278),N=n.n(C),_=n(279),D=n.n(_),T=n(280),O=n.n(T),A=n(281),P=n.n(A),z=n(175),L=n.n(z),R=n(282),U=n.n(R),B=n(283),G=n.n(B),F=n(176),Z=n.n(F),W=n(284),H=n.n(W),Q=n(285),Y=n.n(Q),V=n(177),q=n.n(V),J=n(286),X=n.n(J),K=n(287),$=n.n(K),ee=n(288),te=n.n(ee),ne=n(178),ae=n.n(ne),oe=n(289),re=n.n(oe),ie=n(290),se=n.n(ie),le=n(291),ce=n.n(le),de=n(179),ue=n.n(de),pe=n(292),me=n.n(pe),ge=n(293),he=n.n(ge),be=n(294),we=n.n(be),fe=n(295),Me=n.n(fe),ve=n(194),ye=n.n(ve),ke=n(24);t.a=[{name:o.a.createElement(r.b,{defaultMessage:\"Music\",id:\"gui.extension.music.name\"}),extensionId:\"music\",iconURL:s.a,insetIconURL:c.a,description:o.a.createElement(r.b,{defaultMessage:\"Play instruments and drums.\",id:\"gui.extension.music.description\"}),tags:[\"scratch\"],featured:!0},{name:o.a.createElement(r.b,{defaultMessage:\"Pen\",id:\"gui.extension.pen.name\"}),extensionId:\"pen\",iconURL:u.a,insetIconURL:m.a,description:o.a.createElement(r.b,{defaultMessage:\"Draw with your sprites.\",id:\"gui.extension.pen.description\"}),tags:[\"scratch\"],featured:!0},{name:o.a.createElement(r.b,{defaultMessage:\"Video Sensing\",id:\"gui.extension.videosensing.name\"}),extensionId:\"videoSensing\",iconURL:h.a,insetIconURL:w.a,description:o.a.createElement(r.b,{defaultMessage:\"Sense motion with the camera.\",id:\"gui.extension.videosensing.description\"}),tags:[\"scratch\"],featured:!0},{name:o.a.createElement(r.b,{defaultMessage:\"Face Sensing\",id:\"tw.extension.faceSensing.name\"}),extensionId:\"faceSensing\",extensionURL:\"https://extensions.turbowarp.org/lab/face-sensing.js\",iconURL:M.a,insetIconURL:y.a,description:o.a.createElement(r.b,{defaultMessage:\"Sense faces with the camera.\",id:\"tw.extension.faceSensing.description\"}),tags:[\"scratch\"],featured:!0},{name:o.a.createElement(r.b,{defaultMessage:\"Text to Speech\",id:\"gui.extension.text2speech.name\"}),extensionId:\"text2speech\",collaborator:\"Amazon Web Services\",iconURL:j.a,insetIconURL:S.a,description:o.a.createElement(r.b,{defaultMessage:\"Make your projects talk.\",id:\"gui.extension.text2speech.description\"}),tags:[\"scratch\"],featured:!0,internetConnectionRequired:!0},{name:o.a.createElement(r.b,{defaultMessage:\"Translate\",id:\"gui.extension.translate.name\"}),extensionId:\"translate\",collaborator:\"Google\",iconURL:E.a,insetIconURL:N.a,description:o.a.createElement(r.b,{defaultMessage:\"Translate text into many languages.\",id:\"gui.extension.translate.description\"}),tags:[\"scratch\"],featured:!0,internetConnectionRequired:!0},{name:\"Makey Makey\",extensionId:\"makeymakey\",collaborator:\"JoyLabz\",iconURL:D.a,insetIconURL:O.a,description:o.a.createElement(r.b,{defaultMessage:\"Make anything into a key.\",id:\"gui.extension.makeymakey.description\"}),tags:[\"scratch\"],featured:!0},{name:\"micro:bit\",extensionId:\"microbit\",collaborator:\"micro:bit\",iconURL:P.a,insetIconURL:L.a,description:o.a.createElement(r.b,{defaultMessage:\"Connect your projects with the world.\",id:\"gui.extension.microbit.description\"}),tags:[\"scratch\"],featured:!0,disabled:!1,bluetoothRequired:!0,internetConnectionRequired:!0,launchPeripheralConnectionFlow:!0,useAutoScan:!1,connectionIconURL:U.a,connectionSmallIconURL:L.a,connectingMessage:o.a.createElement(r.b,{defaultMessage:\"Connecting\",id:\"gui.extension.microbit.connectingMessage\"}),helpLink:\"https://scratch.mit.edu/microbit\"},{name:\"LEGO MINDSTORMS EV3\",extensionId:\"ev3\",collaborator:\"LEGO\",iconURL:G.a,insetIconURL:Z.a,description:o.a.createElement(r.b,{defaultMessage:\"Build interactive robots and more.\",id:\"gui.extension.ev3.description\"}),tags:[\"scratch\"],featured:!0,disabled:!1,bluetoothRequired:!0,internetConnectionRequired:!0,launchPeripheralConnectionFlow:!0,useAutoScan:!1,connectionIconURL:H.a,connectionSmallIconURL:Z.a,connectingMessage:o.a.createElement(r.b,{defaultMessage:\"Connecting. Make sure the pin on your EV3 is set to 1234.\",id:\"gui.extension.ev3.connectingMessage\"}),helpLink:\"https://scratch.mit.edu/ev3\"},{name:\"LEGO BOOST\",extensionId:\"boost\",collaborator:\"LEGO\",iconURL:te.a,insetIconURL:ae.a,description:o.a.createElement(r.b,{defaultMessage:\"Bring robotic creations to life.\",id:\"gui.extension.boost.description\"}),tags:[\"scratch\"],featured:!0,disabled:!1,bluetoothRequired:!0,internetConnectionRequired:!0,launchPeripheralConnectionFlow:!0,useAutoScan:!0,connectionIconURL:re.a,connectionSmallIconURL:ae.a,connectionTipIconURL:se.a,connectingMessage:o.a.createElement(r.b,{defaultMessage:\"Connecting\",id:\"gui.extension.boost.connectingMessage\"}),helpLink:\"https://scratch.mit.edu/boost\"},{name:\"LEGO Education WeDo 2.0\",extensionId:\"wedo2\",collaborator:\"LEGO\",iconURL:Y.a,insetIconURL:q.a,description:o.a.createElement(r.b,{defaultMessage:\"Build with motors and sensors.\",id:\"gui.extension.wedo2.description\"}),tags:[\"scratch\"],featured:!0,disabled:!1,bluetoothRequired:!0,internetConnectionRequired:!0,launchPeripheralConnectionFlow:!0,useAutoScan:!0,connectionIconURL:X.a,connectionSmallIconURL:q.a,connectionTipIconURL:$.a,connectingMessage:o.a.createElement(r.b,{defaultMessage:\"Connecting\",id:\"gui.extension.wedo2.connectingMessage\"}),helpLink:\"https://scratch.mit.edu/wedo\"},{name:\"Go Direct Force & Acceleration\",extensionId:\"gdxfor\",collaborator:\"Vernier\",iconURL:ce.a,insetIconURL:ue.a,description:o.a.createElement(r.b,{defaultMessage:\"Sense push, pull, motion, and spin.\",id:\"gui.extension.gdxfor.description\"}),tags:[\"scratch\"],featured:!0,disabled:!1,bluetoothRequired:!0,internetConnectionRequired:!0,launchPeripheralConnectionFlow:!0,useAutoScan:!1,connectionIconURL:me.a,connectionSmallIconURL:ue.a,connectingMessage:o.a.createElement(r.b,{defaultMessage:\"Connecting\",id:\"gui.extension.gdxfor.connectingMessage\"}),helpLink:\"https://scratch.mit.edu/vernier\"},{name:o.a.createElement(r.b,{defaultMessage:\"Custom Reporters\",id:\"tw.customReporters.name\"}),extensionId:\"procedures_enable_return\",iconURL:Me.a,description:o.a.createElement(r.b,{defaultMessage:\"Allow custom blocks to output values and be used as inputs.\",id:\"tw.customReporters.description\"}),tags:[\"tw\"],incompatibleWithScratch:!0,featured:!0},{name:o.a.createElement(r.b,{defaultMessage:\"{APP_NAME} Blocks\",id:\"tw.twExtension.name\",values:{APP_NAME:ke.APP_NAME}}),extensionId:\"tw\",iconURL:he.a,description:o.a.createElement(r.b,{defaultMessage:\"Weird new blocks.\",id:\"tw.twExtension.description\"}),incompatibleWithScratch:!0,tags:[\"tw\"],featured:!0},{name:o.a.createElement(r.b,{defaultMessage:\"Custom Extension\",id:\"tw.customExtension.name\"}),extensionId:\"custom_extension\",iconURL:we.a,description:o.a.createElement(r.b,{defaultMessage:\"Load custom extensions from URLs, files, or JavaScript source code.\",id:\"tw.customExtension.description\"}),tags:[\"tw\"],featured:!0}];const je={name:o.a.createElement(r.b,{defaultMessage:\"{APP_NAME} Extension Gallery\",id:\"tw.extensionGallery.name\",values:{APP_NAME:ke.APP_NAME}}),href:\"https://extensions.turbowarp.org/\",extensionId:\"gallery\",iconURL:ye.a,description:o.a.createElement(r.b,{defaultMessage:\"Loading extension gallery...\",id:\"tw.extensionGallery.loading\"}),tags:[\"tw\"],featured:!0},Ie={name:o.a.createElement(r.b,{defaultMessage:\"{APP_NAME} Extension Gallery\",id:\"tw.extensionGallery.name\",values:{APP_NAME:ke.APP_NAME}}),href:\"https://extensions.turbowarp.org/\",extensionId:\"gallery\",iconURL:ye.a,description:o.a.createElement(r.b,{defaultMessage:\"Learn more about extensions at extensions.turbowarp.org.\",id:\"tw.extensionGallery.more\"}),tags:[\"tw\"],featured:!0},Se={name:o.a.createElement(r.b,{defaultMessage:\"{APP_NAME} Extension Gallery\",id:\"tw.extensionGallery.name\",values:{APP_NAME:ke.APP_NAME}}),href:\"https://extensions.turbowarp.org/\",extensionId:\"gallery\",iconURL:ye.a,description:o.a.createElement(r.b,{defaultMessage:\"Error loading extension gallery. Visit extensions.turbowarp.org to find more extensions.\",id:\"tw.extensionGallery.error\"}),tags:[\"tw\"],featured:!0}},function(e,t,n){\"use strict\";n.d(t,\"b\",(function(){return i})),n.d(t,\"a\",(function(){return r})),n.d(t,\"c\",(function(){return o})),n.d(t,\"d\",(function(){return s}));const a=\"tw/custom-stage-size/SET\",o={width:480,height:360},r=(()=>{if(\"undefined\"==typeof URLSearchParams)return null;const e=new URLSearchParams(location.search).get(\"size\");if(null===e)return null;const t=e.match(/^(\\d+)[^\\d]+(\\d+)$/);if(!t)return alert(\"Could not parse custom stage size\"),null;const[n,a,o]=t;if(!a||!o)return null;return{width:Math.max(0,Math.min(4096,+a)),height:Math.max(0,Math.min(4096,+o))}})()||o,i=function(e,t){return void 0===e&&(e=r),t.type===a?Object.assign({},e,{width:t.width,height:t.height}):e},s=function(e,t){return{type:a,width:e,height:t}}},function(e,t,n){\"use strict\";const a={event(){}};t.a=a},function(e,t,n){\"use strict\";n.d(t,\"b\",(function(){return u})),n.d(t,\"d\",(function(){return c})),n.d(t,\"a\",(function(){return m})),n.d(t,\"c\",(function(){return p})),n.d(t,\"e\",(function(){return g})),n.d(t,\"h\",(function(){return h})),n.d(t,\"f\",(function(){return b})),n.d(t,\"g\",(function(){return w}));var a=n(11);const o=\"scratch-gui/monitors/ADD_MONITOR_RECT\",r=\"scratch-gui/monitors/MOVE_MONITOR_RECT\",i=\"scratch-gui/monitors/RESIZE_MONITOR_RECT\",s=\"scratch-gui/monitors/REMOVE_MONITOR_RECT\",l=\"scratch-gui/monitors/RESET_MONITOR_LAYOUT\",c={monitors:{},savedMonitorPositions:{}},d=function(e,t){return Object.prototype.hasOwnProperty.call(e.monitors,t.monitorId)?(a.default.error(\"Can't add monitor, monitor with id \".concat(t.monitorId,\" already exists.\")),e):(n=t.upperStart,o=t.lowerEnd,!(isNaN(n.x)||isNaN(n.y)||isNaN(o.x)||isNaN(o.y))&&n.xe-t)),r.sort(((e,t)=>e-t));let l=null;for(const t of o)if(t!==i){i=t;e:for(const o of r){if(o===s)continue;s=o;const r={upperStart:{x:t+5,y:o+5},lowerEnd:{x:t+5+n,y:o+5+a}},i={upperStart:{x:t,y:o},lowerEnd:{x:t+n+10,y:o+a+10}};for(const t in e.monitors)if(c=e.monitors[t],d=i,!(c.upperStart.x>=d.lowerEnd.x||d.upperStart.x>=c.lowerEnd.x||c.upperStart.y>=d.lowerEnd.y||d.upperStart.y>=c.lowerEnd.y))continue e;if(!(i.lowerEnd.x>400||i.lowerEnd.y>300))return r;l||i.upperStart.x+40>400||i.upperStart.y+40>300||(l=r)}}var c,d;if(l)return l;const u=Math.ceil(200*Math.random()),p=Math.ceil(260*Math.random());return{upperStart:{x:u,y:p},lowerEnd:{x:u+n,y:p+a}}},m=function(e,t,n,a){return{type:o,monitorId:e,upperStart:t,lowerEnd:n,savePosition:a}},g=function(e,t,n){return{type:r,monitorId:e,newX:t,newY:n}},h=function(e,t,n){return{type:i,monitorId:e,newWidth:t,newHeight:n}},b=function(e){return{type:s,monitorId:e}},w=function(){return{type:l}}},function(e,t,n){var a=n(470);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(482);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(514);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},,function(e,t,n){var a=n(578);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){\"use strict\";var a=n(4),o=n.n(a),r=n(0),i=n.n(r),s=n(1),l=n.n(s);function c(){return c=Object.assign?Object.assign.bind():function(e){for(var t=1;ti.a.createElement(\"div\",{\"aria-label\":\"Close\",className:l()(d.a.closeButton,e.className,{[d.a.small]:e.size===f.SIZE_SMALL,[d.a.large]:e.size===f.SIZE_LARGE,[d.a.orange]:e.color===f.COLOR_ORANGE}),role:\"button\",tabIndex:\"0\",onClick:e.onClick},\"back\"===e.buttonType?i.a.createElement(\"img\",{className:d.a.backIcon,src:b.a,draggable:!1}):i.a.createElement(\"img\",{className:l()(d.a.closeIcon,{[d.a[e.color]]:e.color!==f.COLOR_NEUTRAL}),src:e.color&&w[e.color]?w[e.color]:p.a,draggable:!1}));f.SIZE_SMALL=\"small\",f.SIZE_LARGE=\"large\",f.COLOR_NEUTRAL=\"neutral\",f.COLOR_GREEN=\"green\",f.COLOR_ORANGE=\"orange\",w={[f.COLOR_NEUTRAL]:p.a,[f.COLOR_GREEN]:p.a,[f.COLOR_ORANGE]:g.a},f.propTypes={buttonType:o.a.oneOf([\"back\",\"close\"]),className:o.a.string,color:o.a.string,onClick:o.a.func.isRequired,size:o.a.oneOf([f.SIZE_SMALL,f.SIZE_LARGE])},f.defaultProps={color:f.COLOR_NEUTRAL,size:f.SIZE_LARGE,buttonType:\"close\"},t.a=f},function(e,t,n){var a=n(502);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},,function(e,t,n){\"use strict\";n.d(t,\"d\",(function(){return s})),n.d(t,\"c\",(function(){return c})),n.d(t,\"a\",(function(){return d})),n.d(t,\"b\",(function(){return u}));var a=n(220),o=n.n(a),r=n(11);let i=null;const s=()=>(null===i&&(i=o.a.isSupported()),i);let l=null;const c=()=>{if(null===l)try{new Function(\"\"),l=!0}catch(e){l=!1}return l},d=()=>{const e=[];if(\"object\"==typeof window.chibi&&Number(window.chibi.version)<=3&&e.push('You are using an old version of the \"Chibi\" userscript that has known project corruption bugs. Please disable it, uninstall it, or update to version 4.'),e.length>0){if(\"i_will_not_ask_for_help_if_something_breaks\"===new URLSearchParams(location.search).get(\"ignore_unsupported_userscripts\"))return r.default.error(\"Ignoring unsupported userscripts\",e),[]}return e},u=()=>c()&&s()&&0===d().length},,,function(e,t,n){\"use strict\";n.d(t,\"a\",(function(){return i})),n.d(t,\"b\",(function(){return r})),n.d(t,\"c\",(function(){return s})),n.d(t,\"d\",(function(){return l}));const a=\"scratch-gui/hovered-target/SET_HOVERED_SPRITE\",o=\"scratch-gui/hovered-target/SET_RECEIVED_BLOCKS\",r={sprite:null,receivedBlocks:!1},i=function(e,t){switch(void 0===e&&(e=r),t.type){case a:return{sprite:t.spriteId,receivedBlocks:!1};case o:return{sprite:e.sprite,receivedBlocks:t.receivedBlocks};default:return e}},s=function(e){return{type:a,spriteId:e,meta:{throttle:30}}},l=function(e){return{type:o,receivedBlocks:e}}},,,,,function(e,t){e.exports=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDQ4LjIgKDQ3MzI3KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5maWxlLXVwbG9hZDwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxkZWZzPjwvZGVmcz4KICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJmaWxlLXVwbG9hZCIgZmlsbD0iI0ZGRkZGRiI+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik01LjkxNzM3MDk4LDYuODg2MTI0NjMgTDkuNjM4ODg5OTcsMy4xNjQ2MDU2NSBDOS44NTcwMDA5NywyLjk0NTEzMTQ1IDEwLjE5Nzc5OTQsMi45NDUxMzE0NSAxMC40MTU5MTA0LDMuMTY0NjA1NjUgTDE0LjEzNzQyOTQsNi44ODYxMjQ2MyBDMTQuNDkxODU5OCw3LjI0MDU1NTAxIDE0LjIzMjg1Myw3LjgyNTM2NTE0IDEzLjc0MjEwMzIsNy44MjUzNjUxNCBMMTEuODg4MTU5Nyw3LjgyNTM2NTE0IEwxMC43ODM5NzI3LDEyLjIwMTIxNzEgQzEwLjY3NDkxNzIsMTIuNjI1MTcwNCAxMC4yMzg2OTUyLDEyLjg4MjgxNCA5LjgxNjEwNTE2LDEyLjc3Mzc1ODUgQzkuNTE2MjAyNTMsMTIuNzA2OTYyIDkuMjk4MDkxNTMsMTIuNDc1MjE5MSA5LjIyOTkzMTg0LDEyLjIwMTIxNzEgTDguMTI1NzQ0ODksNy44MjUzNjUxNCBMNi4zMTI2OTcxOCw3LjgyNTM2NTE0IEM1LjgyMTk0NzQyLDcuODI1MzY1MTQgNS41NjI5NDA2LDcuMjQwNTU1MDEgNS45MTczNzA5OCw2Ljg4NjEyNDYzIFogTTE3LDExLjYwMTc1MyBMMTcsMTMuODUxMDIyNyBDMTcsMTUuNTgyMjc4OCAxNS41OTU5MTA0LDE3LjAwMDAwMDMgMTMuODY0NjU0MywxNy4wMDAwMDAzIEw2LjE0ODk3NzYsMTcuMDAwMDAwMyBDNC40MDQwODk1OCwxNy4wMDAwMDAzIDMsMTUuNTgyMjc4OCAzLDEzLjg1MTAyMjcgTDMsMTEuNjAxNzUzIEMzLDExLjAyOTIxMTYgMy40NjM0ODU4OCwxMC41NzkzNTc2IDQuMDIyMzk1MzMsMTAuNTc5MzU3NiBDNC41ODEzMDQ3NywxMC41NzkzNTc2IDUuMDQ0NzkwNjUsMTEuMDI5MjExNiA1LjA0NDc5MDY1LDExLjYwMTc1MyBMNS4wNDQ3OTA2NSwxMy44NTEwMjI3IEM1LjA0NDc5MDY1LDE0LjQ1MDgyNzkgNS41MzU1NDA0MSwxNC45NTUyMDk2IDYuMTQ4OTc3NiwxNC45NTUyMDk2IEwxMy44NjQ2NTQzLDE0Ljk1NTIwOTYgQzE0LjQ2NDQ1OTYsMTQuOTU1MjA5NiAxNC45NTUyMDkzLDE0LjQ1MDgyNzkgMTQuOTU1MjA5MywxMy44NTEwMjI3IEwxNC45NTUyMDkzLDExLjYwMTc1MyBDMTQuOTU1MjA5MywxMS4wMjkyMTE2IDE1LjQxODY5NTIsMTAuNTc5MzU3NiAxNS45Nzc2MDQ3LDEwLjU3OTM1NzYgQzE2LjU1MDE0NjEsMTAuNTc5MzU3NiAxNywxMS4wMjkyMTE2IDE3LDExLjYwMTc1MyBaIiBpZD0iZmlsZS11cGxvYWQtaWNvbiI+PC9wYXRoPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+\"},function(e,t,n){e.exports=n.p+\"static/assets/00aa0c4320b93631ab3c223604ead431.svg\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUwLjIgKDU1MDQ3KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5zZWFyY2gtc3ByaXRlLWxpYnJhcnk8L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZGVmcz48L2RlZnM+CiAgICA8ZyBpZD0ic2VhcmNoLXNwcml0ZS1saWJyYXJ5IiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8cGF0aCBkPSJNOS4wODkyMDMyNSw1LjI4MjQ5NDIyIEMxMS4xNzQ0OTY3LDUuMjgyNDk0MjIgMTIuODk0NDgzMyw2Ljk4NzI1OTcgMTIuODk0NDgzMyw5LjA4Nzc3NDMgQzEyLjg5NDQ4MzMsMTEuMTg4Mjg4OSAxMS4xNzQ0OTY3LDEyLjg5MzA1NDQgOS4wODkyMDMyNSwxMi44OTMwNTQ0IEM2Ljk4ODY4ODY1LDEyLjg5MzA1NDQgNS4yODM5MjMxOCwxMS4xODgyODg5IDUuMjgzOTIzMTgsOS4wODc3NzQzIEM1LjI4MzkyMzE4LDYuOTg3MjU5NyA2Ljk4ODY4ODY1LDUuMjgyNDk0MjIgOS4wODkyMDMyNSw1LjI4MjQ5NDIyIE0xNi42Njc3OTksMTUuMDU0NDUzNSBMMTQuNTQ1OTc0OSwxMi45MzExMDcyIEMxNC4zMDA5MTQ4LDEyLjY4NDUyNSAxNC4yNjc0Mjg0LDEyLjMxMTYwNzYgMTQuNDM0ODYwNywxMi4wMDU2NjMxIEMxNS4yODcyNDM0LDEwLjQyNzIzMjkgMTUuNDk1NzcyOCw4LjQxMzQ3ODY3IDE0LjU3OTQ2MTMsNi40Mzc3NzcyNSBDMTMuODQ3MzI1NSw0Ljg1NjMwMjg1IDEyLjM5OTc5NjksMy42NDQ3MDE2OCAxMC43MTE3NzQ3LDMuMjA5Mzc3NjQgQzYuMjU5NTk2OTksMi4wNjAxODMwNiAyLjMwNjY3MjA1LDUuODE1MjMzNDMgMy4xMDI3MzY2NCwxMC4yMjYzMTQxIEMzLjUwNDU3NDIyLDEyLjQ0ODU5NzcgNS4yMDMyNTEyNCwxNC4zMTkyNzMzIDcuMzc1MzA1MTEsMTQuOTM0MjA2NiBDOS4wNTg3NjEwMSwxNS40MTIxNDk4IDEwLjY3MDY3NzcsMTUuMTUwMzQ2NSAxMS45OTE4NzA5LDE0LjQzMzQzMTcgQzEyLjI5NzgxNTQsMTQuMjY1OTk5NCAxMi42NzIyNTUsMTQuMjk5NDg1OSAxMi45MjAzNTkyLDE0LjU0NDU0NTkgTDE1LjA1NTg4MjQsMTYuNjY3ODkyMiBDMTUuMjY4OTc4MSwxNi44OTYyMDkgMTUuNTU4MTc5NCwxNy4wMDI3NTY5IDE1Ljg2MjYwMTgsMTcuMDAyNzU2OSBDMTYuMTUxODAzMSwxNy4wMDI3NTY5IDE2LjQ0MTAwNDQsMTYuODk2MjA5IDE2LjY2Nzc5OSwxNi42Njc4OTIyIEMxNy4xMTA3MzM3LDE2LjIyNjQ3OTcgMTcuMTEwNzMzNywxNS40OTU4NjU5IDE2LjY2Nzc5OSwxNS4wNTQ0NTM1IiBpZD0ic2VhcmNoIiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+CiAgICA8L2c+Cjwvc3ZnPg==\"},function(e,t,n){\"use strict\";var a=n(4),o=n.n(a),r=n(0),i=n.n(r),s=n(1),l=n.n(s),c=n(7),d=n(56),u=n(60),p=n(55),m=n(20),g=n(23),h=n(12),b=n(11);const w=e=>{let t=0;for(let n=0;n{const t=w(e),n=new Uint8Array(t);let a=0;for(let t=0;t{this.finishedSaving(),Object(u.a)(this.props.projectFilename,e)})))}async saveAsNew(){if(this.props.canSaveProject)try{const e=await this.props.showSaveFilePicker({suggestedName:this.props.projectFilename,types:[{description:\"Scratch 3 Project\",accept:{\"application/octet-stream\":\".sb3\"}}],excludeAcceptAllOption:!0});await this.saveToHandle(e),this.props.onSetFileHandle(e);const t=(e=>{if(!e)return\"\";const t=e.match(/^(.*)\\.sb[23]?$/);return t?t[1].substring(0,100):\"\"})(e.name);t&&this.props.onSetProjectTitle(t)}catch(e){this.handleSaveError(e)}}async saveToLastFile(){try{await this.saveToHandle(this.props.fileHandle)}catch(e){this.handleSaveError(e)}}saveToLastFileOrNew(){return this.props.fileHandle?this.saveToLastFile():this.saveAsNew()}async saveToHandle(e){if(!this.props.canSaveProject)return;const t=await e.createWritable();this.startedSaving(),await new Promise(((e,n)=>{const a=this.props.saveProjectSb3Stream(),o=new AbortController;a.on(\"error\",(e=>{o.abort(e)}));let r=!1;const i=()=>{r&&(r=!1,a.pause())},s=()=>{r||(r=!0,a.resume())},l=new ReadableStream({start:e=>{a.on(\"data\",(t=>{e.enqueue(t),e.desiredSize<=0&&i()})),a.on(\"end\",(()=>{e.close()})),s()},pull:()=>{s()},cancel:()=>{i()}},new ByteLengthQueuingStrategy({highWaterMark:5242880})),c=[],d=new WritableStream({write:e=>{c.push(e);if(w(c)>=1048576){const e=f(c);return c.length=0,t.write(e)}},close:async()=>{const e=f(c);e.byteLength&&await t.write(e),await t.close()},abort:async()=>{await t.abort()}});l.pipeTo(d,{signal:o.signal}).then((()=>{this.finishedSaving(),e()})).catch((e=>{n(e)}))}))}handleSaveError(e){e&&\"AbortError\"===e.name||(b.default.error(e),this.props.onShowSaveErrorAlert())}render(){const{children:e}=this.props;return e(this.props.className,this.downloadProject,this.props.showSaveFilePicker?{available:!0,name:this.props.fileHandle?this.props.fileHandle.name:null,saveAsNew:this.saveAsNew,saveToLastFile:this.saveToLastFile,saveToLastFileOrNew:this.saveToLastFileOrNew,smartSave:this.saveToLastFileOrNew}:{available:!1,smartSave:this.downloadProject})}}const v=(e,t)=>{let n=e;return n&&0!==n.length||(n=t),\"\".concat(n.substring(0,100),\".sb3\")};M.propTypes={children:i.a.func,className:i.a.string,fileHandle:i.a.shape({name:i.a.string}),onSaveFinished:i.a.func,projectFilename:i.a.string,saveProjectSb3:i.a.func,saveProjectSb3Stream:i.a.func,canSaveProject:i.a.bool,onSetFileHandle:i.a.func,onSetProjectTitle:i.a.func,onShowSavingAlert:i.a.func,onShowSaveSuccessAlert:i.a.func,onShowSaveErrorAlert:i.a.func,onProjectUnchanged:i.a.func,showSaveFilePicker:i.a.func},M.defaultProps={className:\"\",showSaveFilePicker:\"function\"!=typeof showSaveFilePicker||navigator.userAgent.includes(\"Android\")?null:window.showSaveFilePicker.bind(window)};t.a=Object(c.b)((e=>({fileHandle:e.scratchGui.tw.fileHandle,saveProjectSb3:e.scratchGui.vm.saveProjectSb3.bind(e.scratchGui.vm),saveProjectSb3Stream:e.scratchGui.vm.saveProjectSb3Stream.bind(e.scratchGui.vm),canSaveProject:Object(h.r)(e.scratchGui.projectState.loadingState),projectFilename:v(e.scratchGui.projectTitle,d.b)})),(e=>({onSetFileHandle:t=>e(Object(g.j)(t)),onSetProjectTitle:t=>e(Object(d.c)(t)),onShowSavingAlert:()=>Object(m.g)(e,\"saving\"),onShowSaveSuccessAlert:()=>Object(m.g)(e,\"twSaveToDiskSuccess\"),onShowSaveErrorAlert:()=>e(Object(m.i)(\"savingError\")),onProjectUnchanged:()=>e(Object(p.d)())})))(M)},function(e,t){e.exports=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUwLjIgKDU1MDQ3KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5iYWNrPC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGRlZnM+PC9kZWZzPgogICAgPGcgaWQ9ImJhY2siIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxwYXRoIGQ9Ik0xMC4xNTc1OTIyLDE2Ljk5NDEwMyBDOS44NDY1MDAyMSwxNi45OTQxMDMgOS41NTYxNDc2OCwxNi44NzUxOTY3IDkuMzQwNDU3MjMsMTYuNjYwODg4OSBMNC45OTg5OTU1OSwxMi4zMTk0MjcyIEM0LjY2MzAxNjIzLDExLjk2MjcwODQgNC41NzMxNDUyMSwxMS40NjIxOTU5IDQuNzU5ODAwNDEsMTEuMDMyMTk3NyBDNC45NDUwNzI5OCwxMC42MDIxOTk0IDUuMzU0MzMxNzgsMTAuMzM2NzM0MiA1LjgyODU3NDI1LDEwLjMzNjczNDIgTDcuNDc1Mjg3ODgsMTAuMzM2NzM0MiBMOC4zMTQ1NDQ5Niw0LjI5NDYzNjMzIEM4LjQzNDgzMzg2LDMuMzY5NjU2MTMgOS4yMzk1MjUxNiwyLjY2NTg5NjkgMTAuMTg2NjI3NSwyLjY2NTg5NjkgQzEwLjI2ODIwMjcsMi42NjU4OTY5IDEwLjM1MTE2MDYsMi42NzE0Mjc0MiAxMC40MzI3MzU4LDIuNjgxMTA1ODQgQzExLjI4NzIwMTgsMi44MTUyMjEwNiAxMS45NDY3MTY4LDMuNDgxNjQ5MjQgMTIuMDUwNDE0Miw0LjMwMTU0OTQ4IEwxMi45MTE3OTM0LDEwLjMzNjczNDIgTDE0LjQ4NjYxMDIsMTAuMzM2NzM0MiBDMTQuOTY2MzgzMiwxMC4zMzY3MzQyIDE1LjM5MzYxNjIsMTAuNjE4NzkxIDE1LjU3NDc0MDgsMTEuMDU0MzE5OCBDMTUuNzU1ODY1NSwxMS40OTI2MTM4IDE1LjY1NzY5ODcsMTEuOTc3OTE3MyAxNS4zMTYxODg4LDEyLjMxOTQyNzIgTDEwLjk3NDcyNzIsMTYuNjYwODg4OSBDMTAuNzU5MDM2NywxNi44NzUxOTY3IDEwLjQ2ODY4NDIsMTYuOTk0MTAzIDEwLjE1NzU5MjIsMTYuOTk0MTAzIiBpZD0iRmlsbC0xIiBmaWxsPSIjRkZGRkZGIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMC4xNjQxMDMsIDkuODMwMDAwKSByb3RhdGUoLTI3MC4wMDAwMDApIHRyYW5zbGF0ZSgtMTAuMTY0MTAzLCAtOS44MzAwMDApICI+PC9wYXRoPgogICAgPC9nPgo8L3N2Zz4=\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA3LjQ4IDcuNDgiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojZmZmO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6MnB4O308L3N0eWxlPjwvZGVmcz48dGl0bGU+aWNvbi0tYWRkPC90aXRsZT48bGluZSBjbGFzcz0iY2xzLTEiIHgxPSIzLjc0IiB5MT0iNi40OCIgeDI9IjMuNzQiIHkyPSIxIi8+PGxpbmUgY2xhc3M9ImNscy0xIiB4MT0iMSIgeTE9IjMuNzQiIHgyPSI2LjQ4IiB5Mj0iMy43NCIvPjwvc3ZnPg==\"},function(e,t,n){\"use strict\";n.d(t,\"d\",(function(){return s})),n.d(t,\"b\",(function(){return i})),n.d(t,\"a\",(function(){return l})),n.d(t,\"c\",(function(){return c}));const a=\"scratch-gui/color-picker/ACTIVATE_COLOR_PICKER\",o=\"scratch-gui/color-picker/DEACTIVATE_COLOR_PICKER\",r=\"scratch-gui/color-picker/SET_CALLBACK\",i={active:!1,callback:()=>{throw new Error(\"Color picker callback not initialized\")}},s=function(e,t){switch(void 0===e&&(e=i),t.type){case a:return Object.assign({},e,{active:!0,callback:t.callback});case o:return\"string\"==typeof t.color&&e.callback(t.color),Object.assign({},e,{active:!1});case r:return Object.assign({},e,{callback:t.callback});default:return e}},l=e=>({type:a,callback:e}),c=e=>({type:o,color:e})},function(e,t){e.exports=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjIgKDY3MTQ1KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5BbGVydHMvQ2hlY2s8L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZyBpZD0iQWxlcnRzL0NoZWNrIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8cGF0aCBkPSJNMTUuMjI0NzgyLDQuNTE0MjQ3MzIgQzE1LjgyNDQzMDEsMy44NjUxOTU4MiAxNi44MzY3MDEyLDMuODI1MTQ2NDUgMTcuNDg1NzUyNyw0LjQyNDc5NDU1IEMxOC4xMzQ4MDQyLDUuMDI0NDQyNjUgMTguMTc0ODUzNSw2LjAzNjcxMzY4IDE3LjU3NTIwNTUsNi42ODU3NjUxOCBMOS40NDUwMzY5LDE1LjQ4NTc1NjYgQzguODExNTczNTcsMTYuMTcxNDA5MyA3LjcyODA3NjgyLDE2LjE3MTQwOTMgNy4wOTQ2MTM0OSwxNS40ODU3NTY2IEwyLjQyNDc5NDU1LDEwLjQzMTIwMzcgQzEuODI1MTQ2NDUsOS43ODIxNTIyNCAxLjg2NTE5NTgyLDguNzY5ODgxMjEgMi41MTQyNDczMiw4LjE3MDIzMzExIEMzLjE2MzI5ODgzLDcuNTcwNTg1MDEgNC4xNzU1Njk4Niw3LjYxMDYzNDM5IDQuNzc1MjE3OTYsOC4yNTk2ODU4OSBMOC4yNjk4MjUxOSwxMi4wNDIyMDQ1IEwxNS4yMjQ3ODIsNC41MTQyNDczMiBaIiBpZD0iQ2hlY2siIGZpbGw9IiMwRUJEOEMiIGZpbGwtcnVsZT0ibm9uemVybyI+PC9wYXRoPgogICAgPC9nPgo8L3N2Zz4=\"},function(e,t,n){var a=n(454);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(471);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(508);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(511);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(518);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(526);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},,function(e,t,n){\"use strict\";n.d(t,\"b\",(function(){return r})),n.d(t,\"a\",(function(){return o})),n.d(t,\"c\",(function(){return i}));const a=\"scratch-gui/connection-modal/setId\",o={extensionId:null},r=function(e,t){return void 0===e&&(e=o),t.type===a?Object.assign({},e,{extensionId:t.extensionId}):e},i=function(e){return{type:a,extensionId:e}}},function(e,t,n){\"use strict\";function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e){for(var t=1;t!e.isStage)).reduce(((e,t,n)=>Object.assign(e,{[t.id]:o({order:n},t)})),{}),stage:t.targets.filter((e=>e.isStage))[0]||{},editingTarget:t.editingTarget});case s:return Object.assign({},e,{highlightedTargetId:t.targetId,highlightedTargetTime:t.updateTime});default:return e}},d=function(e,t){return{type:i,targets:e,editingTarget:t}},u=function(e){return{type:s,targetId:e,updateTime:Date.now()}}},function(e,t,n){\"use strict\";n.d(t,\"a\",(function(){return i})),n.d(t,\"c\",(function(){return r})),n.d(t,\"b\",(function(){return s}));var a=n(16);const o=\"scratch-gui/StageSize/SET_STAGE_SIZE\",r={stageSize:a.d.full},i=function(e,t){return void 0===e&&(e=r),t.type===o?{stageSize:t.stageSize}:e},s=function(e){return{type:o,stageSize:e}}},function(e,t,n){\"use strict\";n.d(t,\"a\",(function(){return p})),n.d(t,\"c\",(function(){return u})),n.d(t,\"b\",(function(){return g})),n.d(t,\"d\",(function(){return m}));var a=n(2),o=n(67),r=n(222),i=n(228);var s=e=>{for(const t of Object.keys(e)){const n=i[t.toLowerCase()];n&&Object.assign(e[t],n)}Object.assign(e[\"es-419\"],i.es)},l=n(205);s(r.a),Object(a.f)(o.c);const c=\"scratch-gui/locales/UPDATE_LOCALES\",d=\"scratch-gui/locales/SELECT_LOCALE\",u={isRtl:!1,locale:\"en\",messagesByLocale:r.a,messages:r.a.en},p=function(e,t){switch(void 0===e&&(e=u),t.type){case d:return Object.assign({},e,{isRtl:Object(o.b)(t.locale),locale:t.locale,messagesByLocale:e.messagesByLocale,messages:e.messagesByLocale[t.locale]});case c:return Object.assign({},e,{isRtl:e.isRtl,locale:e.locale,messagesByLocale:t.messagesByLocale,messages:t.messagesByLocale[e.locale]});default:return e}},m=function(e){try{localStorage.setItem(l.a,e)}catch(e){}return{type:d,locale:e}},g=function(e,t){return Object.prototype.hasOwnProperty.call(e.messagesByLocale,t)?Object.assign({},e,{isRtl:Object(o.b)(t),locale:t,messagesByLocale:e.messagesByLocale,messages:e.messagesByLocale[t]}):e}},function(e,t,n){var a=n(452);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(461);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(478);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(484);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},,,,,,function(e,t,n){\"use strict\";n.d(t,\"a\",(function(){return a})),n.d(t,\"b\",(function(){return o}));const a=1/0,o=10},function(e,t,n){\"use strict\";var a=n(3),o=n.n(a),r=n(0),i=n.n(r),s=n(1),l=n.n(s),c=n(163),d=n.n(c);const u=function(e){const{className:t,level:n,small:a,large:r}=e;return l.a.createElement(\"div\",{className:o()(t,d.a.spinner,d.a[n],{[d.a.small]:a,[d.a.large]:r})})};u.propTypes={className:i.a.string,large:i.a.bool,level:i.a.string,small:i.a.bool},u.defaultProps={className:\"\",large:!1,level:\"info\",small:!1},t.a=u},function(e,t,n){e.exports=n.p+\"static/assets/a11919e102077f40302da55fb9150440.svg\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTUiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxNSAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik01LjE3MTUgMTEuNDAzQzQuNzQ1MzMgMTEuNDAzIDQuMzE5MTYgMTEuMjM5OCAzLjk5NDUzIDEwLjkxNTJMMC43OTgyNDIgNy43MTg5MkMwLjE0NzMzMSA3LjA2ODAxIDAuMTQ3MzMxIDYuMDE1ODkgMC43OTgyNDIgNS4zNjQ5OEMxLjQ0OTE1IDQuNzE0MDcgMi41MDEyNyA0LjcxNDA3IDMuMTUyMTggNS4zNjQ5OEw1LjE3MTUgNy4zODQzMUwxMS40NjkyIDEuMDg4MjhDMTIuMTE4NCAwLjQzNzM3IDEzLjE3MjIgMC40MzczNyAxMy44MjMxIDEuMDg4MjhDMTQuNDcyNCAxLjczNzUzIDE0LjQ3MjQgMi43OTEzIDEzLjgyMzEgMy40NDIyMkw2LjM0ODQ3IDEwLjkxNTJDNi4wMjM4NCAxMS4yMzk4IDUuNTk3NjcgMTEuNDAzIDUuMTcxNSAxMS40MDNaIiBmaWxsPSJ3aGl0ZSIvPgo8L3N2Zz4K\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUwLjIgKDU1MDQ3KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5ibHVldG9vdGgtd2hpdGU8L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZGVmcz48L2RlZnM+CiAgICA8ZyBpZD0iYmx1ZXRvb3RoLXdoaXRlIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8cGF0aCBkPSJNMTAuMDA2NzkyOSwxMi4xMDY3NTA1IEwxMi4zOTU3Mzg3LDE0LjAwMTY2MDggTDEwLjAwNjc5MjksMTUuOTE3ODk1OSBMMTAuMDA2NzkyOSwxMi4xMDY3NTA1IFogTTEwLjAwNjc5MjksNC4wODkyODQxMyBMMTIuMzg1NDM0NCw1Ljk5NDUyMzYyIEwxMC4wMDY3OTI5LDcuODc5MTA0NjkgTDEwLjAwNjc5MjksNC4wODkyODQxMyBaIE04Ljg4NDk0ODk2LDEuMDA2ODQ3ODcgQzguMzgzMzYwMDgsMS4wNzAxNTU5MyA4LjAwODQxNDkyLDEuNDk5OTg0MzYgOC4wMTI0MDM2OSwyLjAwNjc4MjA2IEw4LjAxMjQwMzY5LDcuOTYyNDA0NzcgTDYuNjQxMjYxMTMsNi44Nzk1MDM3IEM2LjQzMTg1MDI2LDYuNzA3OTA1NTMgNi4xNjE5NDI5Miw2LjYyOTI3MDI1IDUuODkzMzY1MTgsNi42NjA5MjQyOCBDNS4zNDU1NzI5NSw2LjcxODU2Nzk0IDQuOTQ4MDI0Nyw3LjIxMDAzODQzIDUuMDA1NTI5NTksNy43NTkxNTI1NyBDNS4wMzQxMTU4NCw4LjAzNDA0Mjg0IDUuMTc1MDUyNjcsOC4yODQ5NDI2OSA1LjM5NDc2Nzg4LDguNDUxODc2MDYgTDcuMzQ3NjA3Myw5Ljk5MjkyNzU5IEw1LjM5NDc2Nzg4LDExLjU0NDMwODMgQzQuOTYxNjUzMDMsMTEuODg5NTAzOSA0Ljg4OTUyMjYyLDEyLjUyMTI1MTcgNS4yMzM4ODcxNSwxMi45NTUwNzg1IEM1LjU3NzkxOTI5LDEzLjM4OTU3MTggNi4yMDgxNDYyNywxMy40NjE1NDMgNi42NDEyNjExMywxMy4xMTY2ODA3IEw4LjAxMjQwMzY5LDEyLjAyMzQ1MDQgTDguMDEyNDAzNjksMTguMDAwMDY0NyBDOC4wMTI0MDM2OSwxOC41NTIxNzc3IDguNDU4NDgyMDgsMTguOTk5OTk4OSA5LjAwOTI2NTg5LDE4Ljk5OTk5ODkgQzkuMjM1OTYxNDYsMTkuMDAwMzMyMSA5LjQ1NjAwOTA3LDE4LjkyMzAyOTcgOS42MzI4NDQ5MSwxOC43ODEwODYzIEwxNC42MTg4MTc5LDE0Ljc4MjY4MjMgQzE1LjA1MTkzMjcsMTQuNDQxODE4NCAxNS4xMjcwNTQ3LDEzLjgxMzA2OTQgMTQuNzg3MDExNCwxMy4zNzg5MDkzIEMxNC43Mzc4MTY0LDEzLjMxNjI2NzcgMTQuNjgxMzA4NywxMy4yNTk2MjM2IDE0LjYxODgxNzksMTMuMjEwMzEgTDEwLjU2NzU0ODYsMTAuMDAzMjU2OCBMMTQuNjE4ODE3OSw2Ljc4NTg3NDQxIEMxNS4wNDg5NDEyLDYuNDQxMzQ1MjYgMTUuMTE5MDc3Miw1LjgxMTkyOTg0IDE0Ljc3NTM3NzQsNS4zODA3Njg2MSBDMTQuNzI5MTc0MSw1LjMyMjc5MTc1IDE0LjY3NjY1NTIsNS4yNzAxNDYxIDE0LjYxODgxNzksNS4yMjM4MzEyNiBMOS42MzI4NDQ5MSwxLjIyNTQyNzI5IEM5LjQyMzQzNDA1LDEuMDU0MTYyMzIgOS4xNTM1MjY3MSwwLjk3NTE5MzgzOCA4Ljg4NDk0ODk2LDEuMDA2ODQ3ODcgWiIgaWQ9IkZpbGwtMSIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPgogICAgPC9nPgo8L3N2Zz4=\"},function(e,t,n){\"use strict\";n.d(t,\"d\",(function(){return i})),n.d(t,\"b\",(function(){return r})),n.d(t,\"a\",(function(){return s})),n.d(t,\"c\",(function(){return l}));const a=\"scratch-gui/custom-procedures/ACTIVATE_CUSTOM_PROCEDURES\",o=\"scratch-gui/custom-procedures/DEACTIVATE_CUSTOM_PROCEDURES\",r={active:!1,mutator:null,callback:null},i=function(e,t){switch(void 0===e&&(e=r),t.type){case a:return Object.assign({},e,{active:!0,mutator:t.mutator,callback:t.callback});case o:return t.mutator&&e.callback(t.mutator),Object.assign({},e,{active:!1,mutator:null,callback:null});case\"scratch-gui/custom-procedures/SET_CALLBACK\":return Object.assign({},e,{callback:t.callback});default:return e}},s=(e,t)=>({type:a,mutator:e,callback:t}),l=e=>({type:o,mutator:e})},function(e,t,n){var a=n(473);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(504);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(541);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(542);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},,,,function(e,t,n){var a=n(600);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(579);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},,function(e,t,n){\"use strict\";n.r(t),n.d(t,\"TextEncoder\",(function(){return a})),n.d(t,\"TextDecoder\",(function(){return o}));const a=\"function\"==typeof TextEncoder?TextEncoder:class{constructor(e){if(null!=e&&\"utf-8\"!==e&&\"utf8\"!==e)throw new Error(\"Encoding is not supported\");this.encoding=\"utf-8\"}encode(e){if(\"string\"!=typeof e)throw new TypeError(\"Argument is not a string\");e=unescape(encodeURIComponent(e));const t=new Uint8Array(e.length);for(let n=0;n{e(Object(a.E)(t))},r=e=>{const t=(e=>{let t=e.toString();return t.length>0&&(t=\"?\".concat(t),t=t.replace(/=(?=$|&)/g,\"\").replace(/%2F/g,\"/\").replace(/%3A/g,\":\")),t})(e);location.search!==t&&history.replaceState(null,null,\"\".concat(location.pathname).concat(t).concat(location.hash))}},function(e,t,n){\"use strict\";n.d(t,\"b\",(function(){return r})),n.d(t,\"a\",(function(){return o})),n.d(t,\"c\",(function(){return i}));const a=\"scratch-gui/asset-drag/DRAG_UPDATE\",o={dragging:!1,currentOffset:null,img:null},r=function(e,t){return void 0===e&&(e=o),t.type===a?Object.assign({},e,t.state):e},i=function(e){return{type:a,state:e}}},function(e,t,n){\"use strict\";n.d(t,\"b\",(function(){return r})),n.d(t,\"a\",(function(){return o})),n.d(t,\"c\",(function(){return i}));const a=\"scratch-gui/block-drag/BLOCK_DRAG_UPDATE\",o=!1,r=function(e,t){return void 0===e&&(e=o),t.type===a?t.areBlocksOverGui:e},i=function(e){return{type:a,areBlocksOverGui:e,meta:{throttle:30}}}},function(e,t,n){\"use strict\";n.d(t,\"a\",(function(){return r})),n.d(t,\"b\",(function(){return o})),n.d(t,\"c\",(function(){return i}));const a=\"scratch-gui/mic-indicator/UPDATE\",o=!1,r=function(e,t){return void 0===e&&(e=o),t.type===a?t.visible:e},i=function(e){return{type:a,visible:e}}},function(e,t,n){\"use strict\";n.d(t,\"a\",(function(){return r})),n.d(t,\"b\",(function(){return o})),n.d(t,\"c\",(function(){return i}));const a=\"scratch-gui/monitors/UPDATE_MONITORS\",o=null,r=function(e,t){return void 0===e&&(e=o),t.type===a?t.monitors:e},i=function(e){return{type:a,monitors:e}}},function(e,t,n){\"use strict\";n.d(t,\"a\",(function(){return r})),n.d(t,\"b\",(function(){return o})),n.d(t,\"c\",(function(){return i}));const a=\"fontsLoaded/SET_FONTS_LOADED\",o=!1,r=function(e,t){return void 0===e&&(e=o),t.type===a?t.loaded:e},i=()=>({type:a,loaded:!0})},function(e,t,n){\"use strict\";n.d(t,\"a\",(function(){return r})),n.d(t,\"c\",(function(){return o})),n.d(t,\"b\",(function(){return i}));const a=\"timeout/SET_AUTOSAVE_TIMEOUT_ID\",o={autoSaveTimeoutId:null},r=function(e,t){return void 0===e&&(e=o),t.type===a?Object.assign({},e,{autoSaveTimeoutId:t.id}):e},i=e=>({type:a,id:e})},function(e,t,n){\"use strict\";n.d(t,\"a\",(function(){return i})),n.d(t,\"b\",(function(){return r})),n.d(t,\"c\",(function(){return s}));var a=n(180);const o=\"scratch-gui/toolbox/UPDATE_TOOLBOX\",r={toolboxXML:Object(a.a)(!0)},i=function(e,t){return void 0===e&&(e=r),t.type===o?Object.assign({},e,{toolboxXML:t.toolboxXML}):e},s=function(e){return{type:o,toolboxXML:e}}},function(e,t,n){\"use strict\";function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function o(e,t,n){return(t=function(e){var t=function(e,t){if(\"object\"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var a=n.call(e,t||\"default\");if(\"object\"!=typeof a)return a;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return(\"string\"===t?String:Number)(e)}(e,\"string\");return\"symbol\"==typeof t?t:t+\"\"}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}n.d(t,\"a\",(function(){return s})),n.d(t,\"c\",(function(){return i})),n.d(t,\"b\",(function(){return l}));const r=\"scratch-gui/workspace-metrics/UPDATE_METRICS\",i={targets:{}},s=function(e,t){return void 0===e&&(e=i),t.type===r?Object.assign({},e,{targets:Object.assign({},e.targets,{[t.targetID]:{scrollX:t.scrollX,scrollY:t.scrollY,scale:t.scale}})}):e},l=function(e){return function(e){for(var t=1;tu.a.createElement(\"div\",{className:e.className},u.a.createElement(\"div\",{\"data-delay-hide\":e.delayHide,\"data-delay-show\":e.delayShow,\"data-effect\":\"solid\",\"data-for\":e.tooltipId,\"data-place\":e.place,\"data-tip\":\"tooltip\"},e.children),u.a.createElement(j,{className:e.tooltipClassName,place:e.place,tooltipId:e.tooltipId}));I.propTypes={children:c.a.node.isRequired,className:c.a.string,delayHide:c.a.number,delayShow:c.a.number,place:c.a.oneOf([\"top\",\"right\",\"bottom\",\"left\"]),tooltipClassName:c.a.string,tooltipId:c.a.string.isRequired},I.defaultProps={delayHide:0,delayShow:0}},function(e,t,n){e.exports=n.p+\"static/assets/48df3abff5e8eb9a597f355daaf5348c.png\"},function(e,t,n){var a=n(463);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(475);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(488);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(494);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(532);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(538);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(547);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(548);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},,function(e,t,n){var a=n(580);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},,function(e,t,n){\"use strict\";var a=n(2),o=n(7);t.a=Object(o.b)((e=>({key:e.locales.locale,locale:e.locales.locale,messages:e.locales.messages})))(a.e)},function(e,t,n){e.exports=n.p+\"static/assets/7d043362c1c4cabd22aeb93b43fc5fc6.svg\"},function(e,t,n){e.exports=n.p+\"static/assets/40167d33efb7d0929a3bcbc591fc78b0.svg\"},function(e,t,n){e.exports=n.p+\"static/assets/86f568a0ecc0badac2c4952b39fff148.svg\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBzdHJva2U9IiM3Qzg3QTUiIGZpbGw9IiNGRkYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZD0iTTEgMTJoMzh2MTZIMXoiLz48cGF0aCBzdHJva2U9IiNFNkU3RTgiIGZpbGw9IiNFNkU3RTgiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZD0iTTE2IDEydjJoMXYtMWgydjFoMXYtMnoiLz48cGF0aCBkPSJNMTQuNSAxMkgyMiIgc3Ryb2tlPSIjN0M4N0E1IiBzdHJva2UtbGluZWNhcD0ic3F1YXJlIi8+PHBhdGggc3Ryb2tlPSIjN0M4N0E1IiBmaWxsPSIjRkZGIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGQ9Ik0xIDE2aDE5djZoNHY0aC00djJIMXoiLz48cGF0aCBzdHJva2U9IiM3Qzg3QTUiIGZpbGw9IiNFNkU3RTgiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZD0iTTEgMjZoMzh2Mkgxek0xIDE5aDlsMyAzaDR2NEgxeiIvPjxjaXJjbGUgZmlsbD0iI0ZGNjYxQSIgY3g9IjQuNSIgY3k9IjIyLjUiIHI9IjEuNSIvPjxjaXJjbGUgZmlsbD0iIzdDODdBNSIgY3g9IjIyIiBjeT0iMjQiIHI9IjEiLz48cGF0aCBzdHJva2U9IiM3Qzg3QTUiIGZpbGw9IiNGRkYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZD0iTTI5IDIyaDEwdjRIMjl6Ii8+PGNpcmNsZSBmaWxsPSIjN0M4N0E1IiBjeD0iMzEiIGN5PSIyNCIgcj0iMSIvPjxjaXJjbGUgZmlsbD0iIzdDODdBNSIgY3g9IjM0IiBjeT0iMjQiIHI9IjEiLz48Y2lyY2xlIGZpbGw9IiM3Qzg3QTUiIGN4PSIzNyIgY3k9IjI0IiByPSIxIi8+PGcgc3Ryb2tlPSIjN0M4N0E1IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik0zIDE2di0uNU01IDE2di0uNU03IDE2di0uNU05IDE2di0uNU0xMSAxNnYtLjVNMTMgMTZ2LS41Ii8+PC9nPjxnIHN0cm9rZT0iIzdDODdBNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cGF0aCBkPSJNMjEgMjJ2LS41TTIzIDIydi0uNSIvPjwvZz48ZyBzdHJva2U9IiM3Qzg3QTUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTMgMTJ2LS41TTUgMTJ2LS41TTcgMTJ2LS41TTkgMTJ2LS41TTExIDEydi0uNU0xMyAxMnYtLjUiLz48L2c+PGcgc3Ryb2tlPSIjN0M4N0E1IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik0yOCAxMnYtLjVNMjYgMTJ2LS41TTI0IDEydi0uNU0zMCAxMnYtLjVNMzIgMTJ2LS41TTM0IDEydi0uNU0zNiAxMnYtLjVNMzggMTJ2LS41Ii8+PC9nPjxnIHN0cm9rZT0iIzdDODdBNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cGF0aCBkPSJNMzEgMjJ2LS41TTMzIDIydi0uNU0zNSAyMnYtLjVNMzcgMjJ2LS41Ii8+PC9nPjwvZz48L3N2Zz4=\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoOCAuNSkiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+PHBhdGggZD0iTTEyIDM5YTMgMyAwIDAgMS0zLTNjMC0uNi40LTEgMS0xIC41IDAgMSAuNCAxIDFhMSAxIDAgMSAwIDIgMHYtLjJhMSAxIDAgMCAwLS4zLS43bC0uOC0uOGEzIDMgMCAwIDEtMS0yLjFWMzBjMC0uNi41LTEgMS0xIC42IDAgMSAuNCAxIDF2Mi4ybC40LjcuOC44Yy42LjYuOSAxLjMuOSAyLjF2LjJhMyAzIDAgMCAxLTMgM3oiIHN0cm9rZS1vcGFjaXR5PSIuMSIgc3Ryb2tlPSIjMDAwIiBmaWxsPSIjRTZFN0U4Ii8+PHBhdGggZD0iTTIzLjcuM0ExIDEgMCAwIDAgMjMgMEgxYTEgMSAwIDAgMC0uNy4zQTEgMSAwIDAgMCAwIDF2MjZjMCAuMy4xLjUuMy43LjIuMi40LjMuNy4zaDIyYy4zIDAgLjUtLjEuNy0uMy4yLS4yLjMtLjQuMy0uN1YxYTEgMSAwIDAgMC0uMy0uN3pNMTIgNGMyIDAgMy4zIDIgMi42IDMuOEwxMy4zIDExYTEuNCAxLjQgMCAwIDEtMi43IDBMOS41IDcuN2wtLjItMUM5LjIgNS40IDEwLjQgNCAxMiA0eiIgc3Ryb2tlPSIjN0M4N0E1IiBmaWxsPSIjODU5MkFGIiBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjxwYXRoIGQ9Ik0yIDJ2MjRoMjBWMkgyem0xMCAyYzIgMCAzLjMgMiAyLjYgMy44TDEzLjMgMTFhMS40IDEuNCAwIDAgMS0yLjcgMEw5LjUgNy43bC0uMi0xQzkuMiA1LjQgMTAuNCA0IDEyIDR6IiBzdHJva2U9IiM3Qzg3QTUiIGZpbGw9IiM1Q0IxRDYiIGZpbGwtcnVsZT0ibm9uemVybyIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PHBhdGggc3Ryb2tlPSIjN0M4N0E1IiBmaWxsPSIjODU5MkFGIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGQ9Ik0yMiAyNkgydi02bDIwLTR6Ii8+PHBhdGggZD0iTS4zIDI3LjdMMiAyNk0uMy4zTDIgMk0yMiAyTDIzLjcuM00yMy43IDI3LjdMMjIgMjYiIHN0cm9rZT0iIzdDODdBNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PGNpcmNsZSBmaWxsPSIjRkZCRjAwIiBjeD0iMTIiIGN5PSIxNC44IiByPSIxLjIiLz48cGF0aCBzdHJva2U9IiM3Qzg3QTUiIGZpbGw9IiNFNkU3RTgiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZD0iTTEwIDI4aDR2NGgtNHoiLz48cGF0aCBkPSJNMTUuNSAyMmgtN2EuNS41IDAgMCAxLS41LS41YzAtLjMuMi0uNS41LS41aDdjLjMgMCAuNS4yLjUuNXMtLjIuNS0uNS41ek0xNy41IDI0aC0xMWEuNS41IDAgMCAxLS41LS41YzAtLjMuMi0uNS41LS41aDExYy4zIDAgLjUuMi41LjVzLS4yLjUtLjUuNXoiIGZpbGw9IiNGRkJGMDAiLz48L2c+PC9zdmc+\"},function(e,t,n){\"use strict\";var a=n(57),o=n(15);const r='',i='',s=(e,t)=>a.a.isLoaded()?a.a.get().ScratchMsgs.translate(e,t):t,l=function(e){return e.replace(/[<>&'\"]/g,(e=>{switch(e){case\"<\":return\"<\";case\">\":return\">\";case\"&\":return\"&\";case\"'\":return\"'\";case'\"':return\""\"}}))},c='\\nis compiled?\\nis TurboWarp?\\n';t.a=function(e){let t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=arguments.length>2?arguments[2]:void 0,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],d=arguments.length>4&&void 0!==arguments[4]?arguments[4]:\"\",u=arguments.length>5&&void 0!==arguments[5]?arguments[5]:\"\",p=arguments.length>6&&void 0!==arguments[6]?arguments[6]:\"\",m=arguments.length>7&&void 0!==arguments[7]?arguments[7]:o.n;t=e||t;const g=[r];d=l(d),u=l(u),p=l(p),a=a.slice();const h=e=>{const t=a.findIndex((t=>t.id===e));if(t>=0){const[e]=a.splice(t,1);return e.xml}},b=h(\"motion\")||function(e,t,n,a){const o=s(\"MOTION_STAGE_SELECTED\",\"Stage selected: no motion blocks\");return'\\n \\n ').concat(t?'\\n \\n '):'\\n \\n \\n \\n 10\\n \\n \\n \\n \\n \\n \\n 15\\n \\n \\n \\n \\n \\n \\n 15\\n \\n \\n \\n '.concat(i,'\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n 0\\n \\n \\n \\n \\n 0\\n \\n \\n \\n \\n \\n \\n 1\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n 1\\n \\n \\n \\n \\n 0\\n \\n \\n \\n \\n 0\\n \\n \\n \\n ').concat(i,'\\n \\n \\n \\n 90\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n ').concat(i,'\\n \\n \\n \\n 10\\n \\n \\n \\n \\n \\n \\n 0\\n \\n \\n \\n \\n \\n \\n 10\\n \\n \\n \\n \\n \\n \\n 0\\n \\n \\n \\n ').concat(i,'\\n \\n ').concat(i,'\\n \\n ').concat(i,'\\n \\n \\n '),\"\\n \").concat(r,\"\\n \\n \")}(0,t,n,m.motion),w=h(\"looks\")||function(e,t,n,a,o,l){const c=s(\"LOOKS_HELLO\",\"Hello!\"),d=s(\"LOOKS_HMM\",\"Hmm...\");return'\\n \\n ').concat(t?\"\":'\\n \\n \\n \\n '.concat(c,'\\n \\n \\n \\n \\n 2\\n \\n \\n \\n \\n \\n \\n ').concat(c,'\\n \\n \\n \\n \\n \\n \\n ').concat(d,'\\n \\n \\n \\n \\n 2\\n \\n \\n \\n \\n \\n \\n ').concat(d,\"\\n \\n \\n \\n \").concat(i,\"\\n \"),\"\\n \").concat(t?'\\n \\n \\n \\n '.concat(o,'\\n \\n \\n \\n \\n \\n \\n ').concat(o,'\\n \\n \\n \\n \\n '):'\\n \\n \\n \\n ').concat(a,'\\n \\n \\n \\n \\n \\n \\n \\n ').concat(o,'\\n \\n \\n \\n \\n ').concat(i,'\\n \\n \\n \\n 10\\n \\n \\n \\n \\n \\n \\n 100\\n \\n \\n \\n '),\"\\n \").concat(i,'\\n \\n \\n \\n 25\\n \\n \\n \\n \\n \\n \\n 0\\n \\n \\n \\n \\n ').concat(i,\"\\n \").concat(t?\"\":'\\n \\n \\n '.concat(i,'\\n \\n \\n \\n \\n 1\\n \\n \\n \\n '),\"\\n \").concat(t?'\\n \\n ':'\\n \\n \\n \\n '),\"\\n \").concat(r,\"\\n \\n \")}(0,t,n,d,u,m.looks),f=h(\"sound\")||function(e,t,n,a,o){return'\\n \\n \\n \\n \\n ').concat(a,'\\n \\n \\n \\n \\n \\n \\n ').concat(a,'\\n \\n \\n \\n \\n ').concat(i,'\\n \\n \\n \\n 10\\n \\n \\n \\n \\n \\n \\n 100\\n \\n \\n \\n \\n ').concat(i,'\\n \\n \\n \\n -10\\n \\n \\n \\n \\n \\n \\n 100\\n \\n \\n \\n \\n ').concat(r,\"\\n \\n \")}(0,0,n,p,m.sounds),M=h(\"event\")||function(e,t,n,a){return'\\n \\n \\n \\n \\n ').concat(t?'\\n \\n ':'\\n \\n ','\\n \\n \\n ').concat(i,'\\n \\n \\n \\n 10\\n \\n \\n \\n ').concat(i,'\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n ').concat(r,\"\\n \\n \")}(0,t,0,m.event),v=h(\"control\")||function(e,t,n,a){return'\\n \\n \\n \\n \\n 1\\n \\n \\n \\n ').concat(i,'\\n \\n \\n \\n 10\\n \\n \\n \\n \\n ').concat(i,'\\n \\n \\n \\n \\n \\n ').concat(i,'\\n \\n ').concat(i,\"\\n \").concat(t?'\\n \\n \\n \\n \\n \\n ':'\\n \\n \\n \\n \\n \\n \\n \\n ',\"\\n \").concat(r,\"\\n \\n \")}(0,t,0,m.control),y=h(\"sensing\")||function(e,t,n,a){const o=s(\"SENSING_ASK_TEXT\",\"What's your name?\");return'\\n \\n ').concat(t?\"\":'\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n '.concat(i,\"\\n \"),\"\\n \").concat(e?\"\":'\\n \\n \\n \\n '.concat(o,\"\\n \\n \\n \\n \"),'\\n \\n ').concat(i,'\\n \\n \\n \\n \\n \\n \\n \\n \\n ').concat(t?\"\":\"\\n \".concat(i,'\\n \\'\\'+\\n ').concat(i,\"\\n \"),\"\\n \").concat(i,'\\n \\n ').concat(i,'\\n \\n \\n ').concat(i,'\\n \\n \\n \\n \\n \\n ').concat(i,'\\n \\n \\n ').concat(i,'\\n \\n \\n ').concat(r,\"\\n \\n \")}(e,t,0,m.sensing),k=h(\"operators\")||function(e,t,n,a){const o=s(\"OPERATORS_JOIN_APPLE\",\"apple\"),l=s(\"OPERATORS_JOIN_BANANA\",\"banana\"),c=s(\"OPERATORS_LETTEROF_APPLE\",\"a\");return'\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n ').concat(i,'\\n \\n \\n \\n 1\\n \\n \\n \\n \\n 10\\n \\n \\n \\n ').concat(i,'\\n \\n \\n \\n \\n \\n \\n \\n \\n 50\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n 50\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n 50\\n \\n \\n \\n ').concat(i,'\\n \\n \\n \\n ').concat(i,\"\\n \").concat(e?\"\":'\\n \\n \\n \\n '.concat(o,' \\n \\n \\n \\n \\n ').concat(l,'\\n \\n \\n \\n \\n \\n \\n 1\\n \\n \\n \\n \\n ').concat(o,'\\n \\n \\n \\n \\n \\n \\n ').concat(o,'\\n \\n \\n \\n \\n \\n \\n ').concat(o,'\\n \\n \\n \\n \\n ').concat(c,\"\\n \\n \\n \\n \"),\"\\n \").concat(i,'\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n ').concat(i,'\\n \\n \\n \\n \\n \\n \\n \\n ').concat(r,\"\\n \\n \")}(e,0,0,m.operators),j=h(\"data\")||function(e,t,n,a){return'\\n \\n \\n ')}(0,0,0,m.data),I=h(\"procedures\")||function(e,t,n,a){return'\\n \\n \\n ')}(0,0,0,m.more);let S=h(\"tw\");S&&!S.includes(c)&&(S=S.replace(\"',b,g,w,g,f,g,M,g,v,g,y,g,k,g,j,g,I];S&&x.push(g,S);for(const e of a)x.push(g,e.xml);return x.push(\"\"),x.join(\"\\n\")}},function(e,t,n){\"use strict\";var a=n(0),o=n.n(a),r=n(1),i=n.n(r),s=n(5),l=n(2),c=n(122),d=n.n(c),u=n(299),p=n.n(u);const m=e=>i.a.createElement(\"div\",{className:d.a.crashWrapper},i.a.createElement(s.a,{className:d.a.body},i.a.createElement(\"img\",{className:d.a.reloadIcon,src:p.a,draggable:!1}),i.a.createElement(\"p\",{className:d.a.header},i.a.createElement(l.b,{defaultMessage:\"Oops! Something went wrong.\",id:\"gui.crashMessage.label\"})),i.a.createElement(\"p\",null,i.a.createElement(l.b,{defaultMessage:\"We are so sorry, but it looks like the page has crashed. Please refresh your page to try again.\",id:\"tw.gui.crashMessage.description\"})),e.errorMessage&&i.a.createElement(\"p\",{className:d.a.errorMessage},e.errorMessage),e.eventId&&i.a.createElement(\"p\",null,i.a.createElement(l.b,{defaultMessage:\"Your error was logged with id {errorId}\",id:\"gui.crashMessage.errorNumber\",values:{errorId:e.eventId}})),i.a.createElement(\"button\",{className:d.a.reloadButton,onClick:e.onReload},i.a.createElement(l.b,{defaultMessage:\"Reload\",id:\"gui.crashMessage.reload\"}))));m.propTypes={eventId:o.a.string,errorMessage:o.a.string,onReload:o.a.func.isRequired},t.a=m},function(e,t,n){\"use strict\";n.d(t,\"a\",(function(){return a}));const a=()=>{const e=Math.round(1e4*Math.random()).toString().padStart(4,\"0\");return\"player\".concat(e)}},function(e,t,n){\"use strict\";t.a=function(e){const t={projectName:arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"\",language:arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"\",spriteCount:0,blocksCount:0,costumesCount:0,listsCount:0,scriptCount:0,soundsCount:0,variablesCount:0};for(const n of e.runtime.targets){++t.spriteCount,t.blocksCount+=Object.keys(n.sprite.blocks._blocks).length,t.costumesCount+=n.sprite.costumes_.length,t.scriptCount+=n.sprite.blocks._scripts.length,t.soundsCount+=n.sprite.sounds.length;for(const e in n.variables){\"list\"===n.variables[e].type?++t.listsCount:++t.variablesCount}}return t}},function(e,t){e.exports=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDQ4LjIgKDQ3MzI3KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5iYWNrLWljb248L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZGVmcz48L2RlZnM+CiAgICA8ZyBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0iYmFjay1pY29uIiBmaWxsPSIjRkZGRkZGIj4KICAgICAgICAgICAgPHBhdGggZD0iTTQuMTA4MDQ5MTIsOC41Nzc2NTA1NSBMOS4zMzIwMzYzOCwzLjM1MzY2MzI5IEM5LjYzODIwNDEzLDMuMDQ1NTgxOTkgMTAuMTE2NTkxMiwzLjA0NTU4MTk5IDEwLjQyMjc1OSwzLjM1MzY2MzI5IEwxNS42NDY3NDYyLDguNTc3NjUwNTUgQzE2LjE0NDI2ODgsOS4wNzUxNzMxNCAxNS43ODA2OTQ2LDkuODk2MDg1NDMgMTUuMDkxODE3Miw5Ljg5NjA4NTQzIEwxMi40ODkzOTEzLDkuODk2MDg1NDMgTDEwLjkzOTQxNzEsMTYuMDM4NTc1OSBDMTAuNzg2MzMzMiwxNi42MzM2ODk1IDEwLjE3Mzk5NzcsMTYuOTk1MzUwMiA5LjU4MDc5NzY4LDE2Ljg0MjI2NjMgQzkuMTU5ODE3MDIsMTYuNzQ4NTAyNCA4Ljg1MzY0OTI3LDE2LjQyMzE5OTIgOC43NTc5NzE4NCwxNi4wMzg1NzU5IEw3LjIwNzk5NzYsOS44OTYwODU0MyBMNC42NjI5NzgxNyw5Ljg5NjA4NTQzIEMzLjk3NDEwMDczLDkuODk2MDg1NDMgMy42MTA1MjY1Myw5LjA3NTE3MzE0IDQuMTA4MDQ5MTIsOC41Nzc2NTA1NSIgaWQ9IkZpbGwtMSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoOS44NzczOTgsIDEwLjAwMDAwMCkgcm90YXRlKC05MC4wMDAwMDApIHRyYW5zbGF0ZSgtOS44NzczOTgsIC0xMC4wMDAwMDApICI+PC9wYXRoPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+\"},function(e,t,n){\"use strict\";var a=n(3),o=n.n(a),r=n(0),i=n.n(r),s=n(1),l=n.n(s),c=n(309),d=n.n(c);const u=e=>{let{className:t}=e;return l.a.createElement(\"div\",{className:o()(d.a.divider,t)})};u.propTypes={className:i.a.string},t.a=u},function(e,t,n){e.exports=n.p+\"static/assets/78e3f697df85275aa8d384ca6fc0e288.svg\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNi42MyAxNy41Ij48ZGVmcz48c3R5bGU+LmNscy0xLC5jbHMtMntmaWxsOiM0Y2JmNTY7c3Ryb2tlOiM0NTk5M2Q7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO30uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuNXB4O308L3N0eWxlPjwvZGVmcz48dGl0bGU+aWNvbi0tZ3JlZW4tZmxhZzwvdGl0bGU+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNLjc1LDJBNi40NCw2LjQ0LDAsMCwxLDguNDQsMmgwYTYuNDQsNi40NCwwLDAsMCw3LjY5LDBWMTIuNGE2LjQ0LDYuNDQsMCwwLDEtNy42OSwwaDBhNi40NCw2LjQ0LDAsMCwwLTcuNjksMCIvPjxsaW5lIGNsYXNzPSJjbHMtMiIgeDE9IjAuNzUiIHkxPSIxNi43NSIgeDI9IjAuNzUiIHkyPSIwLjc1Ii8+PC9zdmc+\"},function(e,t,n){e.exports=n.p+\"static/assets/b3a6f3783f393f641dc3e51211dd50f4.svg\"},function(e,t,n){var a=n(513);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t){e.exports=\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xNS43ODQgNS41ODd2Ni4xNGMtLjAxNS40OS0uMzA1LjkwNy0uNzQxIDEuMDhhMS4xNDMgMS4xNDMgMCAwIDEtMS4yNDgtLjI2NWwtMS4xNjQtMS4xNjQtNC44NjYgMy42NzlhMS44ODcgMS44ODcgMCAwIDEtMi42MzktLjM1N2MtLjUxLS42OTktLjUwNC0xLjYzNi4wMDItMi4yOWwzLjY1OC00Ljg3Nkw3LjY3MyA2LjQyYy0uMzQtLjMzOS0uNDQyLS44NC0uMjYyLTEuMjc3YTEuMTQ1IDEuMTQ1IDAgMCAxIDEuMDc3LS43MTFoNi4xNGMuMzA0IDAgLjU5NC4xMjIuODEzLjM0Mi4yMi4yMi4zNDIuNTEuMzQzLjgxM3oiIGZpbGw9IiNmZmYiLz48L3N2Zz4=\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDQiIGhlaWdodD0iNDQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjBfZF8yODI4XzI2NDM0KSI+PHJlY3QgeD0iNCIgeT0iNCIgd2lkdGg9IjM2IiBoZWlnaHQ9IjM2IiByeD0iMTgiIGZpbGw9IiNGRjhDMUEiLz48Y2lyY2xlIGN4PSIyMiIgY3k9IjIyIiByPSIxMCIgZmlsbD0iI0ZGOEMxQSIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMjIgMjMuNDI0YTEuNDQgMS40NCAwIDAgMC0xLjQ1MiAxLjQzYzAgLjc5MS42NSAxLjQzMSAxLjQ1MiAxLjQzMWExLjQ0IDEuNDQgMCAwIDAgMS40NTItMS40M2MwLS43OS0uNjUtMS40My0xLjQ1Mi0xLjQzem0uODM0LTEuMzAzYy0uMzcuODE1LTEuMjk4LjgxNS0xLjY2OCAwbC0xLjE4LTIuNTg2Yy0uMzY4LS44MS4wOTQtMS44MjEuODM1LTEuODIxaDIuMzU4Yy43NCAwIDEuMjAzIDEuMDExLjgzNCAxLjgybC0xLjE4IDIuNTg3eiIgZmlsbD0iI2ZmZiIvPjwvZz48ZGVmcz48ZmlsdGVyIGlkPSJmaWx0ZXIwX2RfMjgyOF8yNjQzNCIgeD0iMCIgeT0iMCIgd2lkdGg9IjQ0IiBoZWlnaHQ9IjQ0IiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+PGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz48ZmVDb2xvck1hdHJpeCBpbj0iU291cmNlQWxwaGEiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDAiIHJlc3VsdD0iaGFyZEFscGhhIi8+PGZlTW9ycGhvbG9neSByYWRpdXM9IjQiIG9wZXJhdG9yPSJkaWxhdGUiIGluPSJTb3VyY2VBbHBoYSIgcmVzdWx0PSJlZmZlY3QxX2Ryb3BTaGFkb3dfMjgyOF8yNjQzNCIvPjxmZU9mZnNldC8+PGZlQ29tcG9zaXRlIGluMj0iaGFyZEFscGhhIiBvcGVyYXRvcj0ib3V0Ii8+PGZlQ29sb3JNYXRyaXggdmFsdWVzPSIwIDAgMCAwIDEgMCAwIDAgMCAwLjU0OTAyIDAgMCAwIDAgMC4xMDE5NjEgMCAwIDAgMC4xNSAwIi8+PGZlQmxlbmQgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0iZWZmZWN0MV9kcm9wU2hhZG93XzI4MjhfMjY0MzQiLz48ZmVCbGVuZCBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJlZmZlY3QxX2Ryb3BTaGFkb3dfMjgyOF8yNjQzNCIgcmVzdWx0PSJzaGFwZSIvPjwvZmlsdGVyPjwvZGVmcz48L3N2Zz4=\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUwLjIgKDU1MDQ3KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5oZWxwPC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGRlZnM+PC9kZWZzPgogICAgPGcgaWQ9ImhlbHAiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxwYXRoIGQ9Ik05Ljk5OTA1NDQ5LDE4IEM1LjU4MTYwOTc0LDE4IDIsMTQuNDE3MzQ2MSAyLDEwLjAwMDk0NTMgQzIsNS41ODI2NTM5MSA1LjU4MTYwOTc0LDIgOS45OTkwNTQ0OSwyIEMxNC40MTgzOTAzLDIgMTgsNS41ODI2NTM5MSAxOCwxMC4wMDA5NDUzIEMxOCwxNC40MTczNDYxIDE0LjQxODM5MDMsMTggOS45OTkwNTQ0OSwxOCBaIE05Ljg1MzI1NjEyLDEyLjM2MTUyNjYgQzkuMjY4OTI4MDIsMTIuMzYxNTI2NiA4LjgwNTYyNTgxLDEyLjgzNjA2MjkgOC44MDU2MjU4MSwxMy40MjIxNDM0IEM4LjgwNTYyNTgxLDEzLjk5MzA5OTQgOS4yNjg5MjgwMiwxNC40Njc2MzU2IDkuODUzMjU2MTIsMTQuNDY3NjM1NiBDMTAuNDM5NDc1MiwxNC40Njc2MzU2IDEwLjkxNDEyMzYsMTMuOTkzMDk5NCAxMC45MTQxMjM2LDEzLjQyMjE0MzQgQzEwLjkxNDEyMzYsMTIuODM2MDYyOSAxMC40Mzk0NzUyLDEyLjM2MTUyNjYgOS44NTMyNTYxMiwxMi4zNjE1MjY2IFogTTkuNDYxODEzMDIsMTEuNjQzMTA1MyBMMTAuMTU5NjAyOSwxMS42NDMxMDUzIEMxMC4zNDg3MDU4LDExLjY0MzEwNTMgMTAuNTI0NTcxNiwxMS41MjM5OTg2IDEwLjU2OTk1NjMsMTEuMzQwNjEyMSBDMTAuNjU4ODM0NywxMC45NzAwNTc5IDEwLjkxNDEyMzYsMTAuNzE2NzE5OCAxMS4yNTQ1MDg5LDEwLjQ2MTQ5MTIgTDExLjcxNTkyMDEsMTAuMTIxMTg2MyBDMTIuNDQ1ODU3NSw5LjU3MjkxNzQxIDEyLjg5NzgxMzUsOC45MDU1NDE3NyAxMi44OTc4MTM1LDcuOTMwMDAxMTggQzEyLjg5NzgxMzUsNi43MTQzNTY2MSAxMS45MTA2OTYxLDUuNTMyNzQyNTMgOS45MzgzNTI0NCw1LjUzMjc0MjUzIEM4LjE2MDc4NDc4LDUuNTMyNzQyNTMgNy4xMDE4MDgzLDYuNzM3MDQzNiA3LjEwMTgwODMsOC4xNjA2NTIyNSBDNy4xMDE4MDgzLDguMTk4NDYzOSA3LjEwMzY5OTMzLDguMjM2Mjc1NTUgNy4xMDM2OTkzMyw4LjI3NTk3Nzc5IEM3LjExMzE1NDQ3LDguNDk3MTc1OTQgNy4yODkwMjAyMSw4LjY3ODY3MTg3IDcuNTEwMjcwNjUsOC42ODYyMzQyIEw4LjM4MzkyNjI1LDguNzE2NDgzNTIgQzguNjI0MDg2OTksOC43MjU5MzY0MyA4LjgxODg2MzAyLDguNTMzMDk3MDEgOC44MTg4NjMwMiw4LjI5Mjk5MzAzIEw4LjgxODg2MzAyLDguMjgzNTQwMTIgQzguODE4ODYzMDIsNy43MTI1ODQxOSA5LjIzMjk5ODQ2LDcuMTM5NzM3NjggOS45MzgzNTI0NCw3LjEzOTczNzY4IEMxMC42NzAxODA4LDcuMTM5NzM3NjggMTEuMDIxOTEyMyw3LjYwMTAzOTgyIDExLjAyMTkxMjMsOC4wNzU1NzYwNCBDMTEuMDIxOTEyMyw4LjM5MzE5MzkgMTAuOTE0MTIzNiw4LjY4NjIzNDIgMTAuNTg1MDg0NSw4LjkzMDExOTM0IEw5Ljk2NDgyNjg1LDkuMzkzMzEyMDYgQzkuMjY4OTI4MDIsOS45MTUxMTI4NCA5LjAzNjMzMTQsMTAuNTM1MjIzOSA5LjAzNjMzMTQsMTEuMTA4MDcwNCBDOS4wMzYzMzE0LDExLjE1MTU1MzggOS4wMzgyMjI0MywxMS4xOTUwMzcyIDkuMDM4MjIyNDMsMTEuMjM0NzM5NSBDOS4wNDU3ODY1NSwxMS40NjM0OTk5IDkuMjMyOTk4NDYsMTEuNjQzMTA1MyA5LjQ2MTgxMzAyLDExLjY0MzEwNTMgWiIgaWQ9ImhlbHAtaWNvbiIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPgogICAgPC9nPgo8L3N2Zz4=\"},,function(e,t,n){e.exports=n.p+\"static/assets/5b36d8cf15d803226e2fe4c0737be43f.svg\"},function(e,t,n){var a=n(453);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(458);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(462);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(469);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(474);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(477);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(493);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(512);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(520);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(530);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},,,,function(e,t){e.exports=function(e){return null!=e&&\"object\"==typeof e}},function(e,t,n){\"use strict\";n.d(t,\"b\",(function(){return p})),n.d(t,\"a\",(function(){return h}));var a=n(1),o=n.n(a),r=n(0),i=n.n(r),s=n(7),l=n(11),c=n(56),d=n(23);const u=[\"reduxProjectId\",\"onSetAuthor\",\"onSetDescription\",\"onSetProjectTitle\"];const p=async e=>{const t=[\"https://trampoline.turbowarp.org/api/projects/\".concat(e),\"https://trampoline.turbowarp.xyz/api/projects/\".concat(e)];let n;for(const e of t)try{const t=await fetch(e),n=await t.json();if(t.ok)return n;if(404===t.status)throw new Error(\"Project is probably unshared\");throw new Error(\"Unexpected status code: \".concat(t.status))}catch(e){n||(n=e)}throw n},m=()=>document.querySelector('meta[name=\"robots\"][content=\"noindex\"]'),g=e=>{if(e){const e=m();e&&e.remove()}else if(!m()){const e=document.createElement(\"meta\");e.name=\"robots\",e.content=\"noindex\",document.head.appendChild(e)}},h=function(e){class t extends o.a.Component{componentDidUpdate(e){if(this.props.reduxProjectId!==e.reduxProjectId){this.props.onSetAuthor(\"\",\"\"),this.props.onSetDescription(\"\",\"\");const e=this.props.reduxProjectId;\"0\"===e||p(e).then((t=>{if(this.props.reduxProjectId!==e)return;const n=t.title;n&&this.props.onSetProjectTitle(n);const a=t.author.username,o=\"https://trampoline.turbowarp.org/avatars/\".concat(t.author.id);this.props.onSetAuthor(a,o);const r=t.instructions||\"\",i=t.description||\"\";(r||i)&&this.props.onSetDescription(r,i),g(!0)})).catch((e=>{g(!1),\"\".concat(e).includes(\"unshared\")&&this.props.onSetDescription(\"unshared\",\"unshared\"),l.default.warn(\"cannot fetch project meta\",e)}))}}render(){const t=this.props,{reduxProjectId:n,onSetAuthor:a,onSetDescription:r,onSetProjectTitle:i}=t,s=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a({reduxProjectId:e.scratchGui.projectState.projectId})),(e=>({onSetAuthor:(t,n)=>e(Object(d.d)({username:t,thumbnail:n})),onSetDescription:(t,n)=>e(Object(d.h)({instructions:t,credits:n})),onSetProjectTitle:t=>e(Object(c.c)(t))})))(t)}},function(e,t,n){\"use strict\";n.d(t,\"a\",(function(){return v}));var a=n(4),o=n.n(a),r=n(1),i=n.n(r),s=n(0),l=n.n(s),c=n(2),d=n(7),u=n(11),p=n(49),m=n(23),g=n(12),h=n(56),b=n(14),w=n(18);const f=[\"cancelFileUpload\",\"closeFileMenu\",\"isLoadingUpload\",\"isShowingWithoutId\",\"loadingState\",\"onLoadingFailed\",\"onLoadingFinished\",\"onLoadingStarted\",\"onSetFileHandle\",\"onSetProjectTitle\",\"projectChanged\",\"requestProjectUpload\",\"userOwnsProject\"];function M(){return M=Object.assign?Object.assign.bind():function(e){for(var t=1;t{try{const[e]=await this.props.showOpenFilePicker({multiple:!1,types:[{description:\"Scratch Project\",accept:{\"*/*\":[\".sb\",\".sb2\",\".sb3\"]}}]}),t=await e.getFile();this.handleChange({target:{files:[t],handle:e}})}catch(e){if(e&&\"AbortError\"===e.name)return;u.default.error(e)}})():(this.inputElement=document.createElement(\"input\"),this.inputElement.accept=\".sb,.sb2,.sb3\",this.inputElement.style=\"display: none;\",this.inputElement.type=\"file\",this.inputElement.onchange=this.handleChange,document.body.appendChild(this.inputElement),this.inputElement.click())}handleChange(e){const{intl:t,isShowingWithoutId:n,loadingState:a,projectChanged:o,userOwnsProject:r}=this.props,i=e.target;if(i.files){this.fileToUpload=i.files[0];let e=!0;if((r||o&&n)&&(e=confirm(t.formatMessage(p.a.replaceProjectWarning))),e){const e=i.handle;e&&(this.fileToUpload.name.endsWith(\".sb3\")?this.props.onSetFileHandle(e):this.props.onSetFileHandle(null)),this.props.requestProjectUpload(a)}else this.removeFileObjects();this.props.closeFileMenu()}}handleFinishedLoadingUpload(){this.expectingFileUploadFinish=!1,this.fileToUpload&&this.fileReader?this.fileReader.readAsArrayBuffer(this.fileToUpload):(this.props.cancelFileUpload(this.props.loadingState),this.removeFileObjects())}getProjectTitleFromFilename(e){if(!e)return\"\";const t=e.match(/^(.*)\\.sb[23]?$/);return t?t[1].substring(0,100):\"\"}onload(){if(this.fileReader){this.props.onLoadingStarted();const e=this.fileToUpload&&this.fileToUpload.name;let t=!1;this.props.vm.quit(),this.props.vm.loadProject(this.fileReader.result).then((()=>{if(e){const t=this.getProjectTitleFromFilename(e);this.props.onSetProjectTitle(t)}this.props.vm.renderer.draw(),t=!0})).catch((e=>{u.default.error(e),this.props.onLoadingFailed(e)})).then((()=>{this.props.onLoadingFinished(this.props.loadingState,t),this.removeFileObjects()}))}}removeFileObjects(){this.inputElement&&(this.inputElement.value=null,document.body.removeChild(this.inputElement)),this.inputElement=null,this.fileReader=null,this.fileToUpload=null}render(){const t=this.props,{cancelFileUpload:n,closeFileMenu:a,isLoadingUpload:o,isShowingWithoutId:r,loadingState:s,onLoadingFailed:l,onLoadingFinished:c,onLoadingStarted:d,onSetFileHandle:u,onSetProjectTitle:p,projectChanged:m,requestProjectUpload:g,userOwnsProject:h}=t,b=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a{const n=e.scratchGui.projectState.loadingState,a=e.session&&e.session.session&&e.session.session.user;return{isLoadingUpload:Object(g.n)(n),isShowingProject:Object(g.r)(n),isShowingWithoutId:Object(g.t)(n),loadingState:n,projectChanged:e.scratchGui.projectChanged,userOwnsProject:t.authorUsername&&a&&t.authorUsername===a.username,vm:e.scratchGui.vm}}),((e,t)=>({cancelFileUpload:t=>e(Object(g.x)(t,!1,!1)),closeFileMenu:()=>e(Object(w.i)()),onLoadingFailed:t=>{e(Object(m.q)(t)),e(Object(b.z)())},onLoadingFinished:(n,a)=>{e(Object(g.x)(n,t.canSave,a)),e(Object(b.h)()),e(Object(w.i)())},onLoadingStarted:()=>e(Object(b.A)()),onSetProjectTitle:t=>e(Object(h.c)(t)),requestProjectUpload:t=>e(Object(g.C)(t)),onSetFileHandle:t=>e(Object(m.j)(t))})),((e,t,n)=>Object.assign({},e,t,n)))(t))}},function(e,t,n){\"use strict\";var a=n(0),o=n.n(a),r=n(1),i=n.n(r),s=n(96),l=n.n(s),c=n(5),d=n(2),u=n(95),p=n(24),m=n(116),g=n.n(m),h=n(380),b=n.n(h);const w=[\"intl\"];const f=Object(d.g)({browserNotSupported:{id:\"gui.unsupportedBrowser.label\",defaultMessage:\"Browser is not supported\"},systemNotSupported:{id:\"tw.browserModal.desktopTitle\",defaultMessage:\"System is not supported\"}}),M=()=>{},v=e=>{let{intl:t}=e,n=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a0&&i.a.createElement(i.a.Fragment,null,o.map(((e,t)=>i.a.createElement(\"p\",{key:t},e)))),!Object(u.d)()&&i.a.createElement(i.a.Fragment,null,i.a.createElement(\"p\",null,i.a.createElement(d.b,{defaultMessage:\"{APP_NAME} requires WebGL, however your computer does not seem to support it. This is often a temporary error that can be fixed by restarting your computer.\",id:\"tw.browserModal.webgl1\",values:{APP_NAME:p.APP_NAME}})),n.onClickDesktopSettings?i.a.createElement(i.a.Fragment,null,i.a.createElement(\"p\",null,i.a.createElement(d.b,{defaultMessage:'You can also try toggling the \"graphics acceleration\" option in desktop settings:',id:\"tw.browserModal.webglDesktop\"})),i.a.createElement(\"div\",{className:g.a.desktopSettingsOuter},i.a.createElement(\"button\",{onClick:n.onClickDesktopSettings,className:g.a.desktopSettingsInner},i.a.createElement(d.b,{defaultMessage:\"Open Desktop Settings\",id:\"tw.browserModal.desktopSettings\"})))):i.a.createElement(\"p\",null,i.a.createElement(d.b,{defaultMessage:'Use a recent version of Chrome, Firefox, or Safari, and ensure your graphics drivers are up to date. You can also try toggling the \"graphics acceleration\" or \"hardware acceleration\" option in your browser\\'s settings.',id:\"tw.browserModal.webglBrowser\"}))))))};v.propTypes={intl:d.i.isRequired,isRtl:o.a.bool,onClickDesktopSettings:o.a.func};const y=Object(d.h)(v);y.setAppElement=l.a.setAppElement,t.a=y},function(e,t,n){\"use strict\";var a=n(3),o=n.n(a),r=n(7),i=n(44),s=n(2),l=n(0),c=n.n(l),d=n(4),u=n.n(d),p=n(218),m=n.n(p),g=n(1),h=n.n(g),b=n(13),w=n.n(b),f=n(5),M=n(36),v=n(188),y=n.n(v),k=n(239),j=n.n(k);const I=e=>{let{className:t,onClick:n}=e;return h.a.createElement(M.a,{className:o()(t,j.a.communityButton),iconClassName:j.a.communityButtonIcon,iconSrc:y.a,iconWidth:20,iconHeight:20,onClick:n},h.a.createElement(s.b,{defaultMessage:\"See Project Page\",id:\"gui.menuBar.seeProjectPage\"}))};I.propTypes={className:c.a.string,onClick:c.a.func},I.defaultProps={onClick:()=>{}};var S=I,x=n(240),E=n.n(x);const C=e=>{let{className:t,isShared:n,onClick:a}=e;return h.a.createElement(M.a,{className:o()(t,E.a.shareButton,{[E.a.shareButtonIsShared]:n}),onClick:a},n?h.a.createElement(s.b,{defaultMessage:\"Shared\",id:\"gui.menuBar.isShared\"}):h.a.createElement(s.b,{defaultMessage:\"Share\",id:\"gui.menuBar.share\"}))};C.propTypes={className:c.a.string,isShared:c.a.bool,onClick:c.a.func},C.defaultProps={onClick:()=>{}};var N=C,_=n(161),D=n(185),T=n(20),O=n(132),A=n(45),P=n(202),z=n.n(P);const L=e=>{let{content:t,iconSpinner:n,level:a}=e;return h.a.createElement(\"div\",{className:o()(z.a.inlineMessage,z.a[a])},n&&h.a.createElement(O.a,{small:!0,className:z.a.spinner,level:\"info\"}),t)};L.propTypes={content:c.a.element,iconSpinner:c.a.bool,level:c.a.string},L.defaultProps={level:A.a.INFO};var R=L;const U=e=>{let{alertsList:t,className:n}=e;if(!t)return null;const a=Object(T.e)(t);if(!a||!a.length)return null;const o=a[0],{content:r,iconSpinner:i,level:s}=o;return h.a.createElement(R,{className:n,content:r,iconSpinner:i,level:s})};U.propTypes={alertsList:c.a.arrayOf(c.a.object),className:c.a.string};var B=Object(r.b)((e=>({alertsList:e.scratchGui.alerts.alertsList})),(()=>({})))(U),G=n(12),F=n(189),Z=n.n(F);const W=e=>{let{alertsList:t,projectChanged:n,onClickSave:a}=e;return Object(T.e)(t).length>0?h.a.createElement(B,null):n&&h.a.createElement(\"div\",{className:Z.a.saveNow,onClick:a},h.a.createElement(s.b,{defaultMessage:\"Save Now\",id:\"gui.menuBar.saveNowLink\"}))};W.propTypes={alertsList:c.a.arrayOf(c.a.object),onClickSave:c.a.func,projectChanged:c.a.bool};Object(r.b)((e=>({alertsList:e.scratchGui.alerts.alertsList,projectChanged:e.scratchGui.projectChanged})),(e=>({onClickSave:()=>e(Object(G.v)())})))(W);class H extends h.a.Component{constructor(e){super(e),u()(this,[\"waitForUpdate\"]),this.state={waiting:!1}}componentDidUpdate(e){this.state.waiting&&this.props.isShowingWithId&&!e.isShowingWithId&&this.fulfill()}fulfill(){this.props.onDoneUpdating(),this.setState({waiting:!1})}waitForUpdate(e){e?this.setState({waiting:!0}):this.fulfill()}render(){return this.props.children(this.waitForUpdate)}}H.propTypes={children:c.a.func,isShowingWithId:c.a.bool,onDoneUpdating:c.a.func},H.defaultProps={onDoneUpdating:()=>{}};var Q=Object(r.b)((e=>{const t=e.scratchGui.projectState.loadingState;return{isShowingWithId:Object(G.s)(t)}}),(()=>({})))(H),Y=n(88),V=n.n(Y);const q=[\"children\",\"className\",\"place\"];function J(){return J=Object.assign?Object.assign.bind():function(e){for(var t=1;t{let{className:t=\"\",children:n,componentRef:a,place:r=\"right\"}=e;return h.a.createElement(\"ul\",{className:o()(V.a.menu,t,{[V.a.left]:\"left\"===r,[V.a.right]:\"right\"===r}),ref:a},n)};X.propTypes={children:c.a.node,className:c.a.string,componentRef:c.a.func,place:c.a.oneOf([\"left\",\"right\"])};const K=e=>{let{children:t,className:n,place:a}=e,r=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a{let{children:t,className:n,expanded:a=!1,onClick:r}=e;return h.a.createElement(\"li\",{className:o()(V.a.menuItem,V.a.hoverable,n,{[V.a.expanded]:a}),onClick:r},t)};$.propTypes={children:c.a.node,className:c.a.string,expanded:c.a.bool,onClick:c.a.func};const ee=(e,t)=>e&&h.a.cloneElement(e,{className:o()(e.className,{[V.a.menuSection]:0===t}),key:t}),te=e=>{let{children:t}=e;return h.a.createElement(h.a.Fragment,null,h.a.Children.map(t,ee))};te.propTypes={children:c.a.node};const ne=[\"open\",\"children\"];const ae=e=>{let{open:t,children:n}=e,a=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a{let{children:t,className:n,open:a,place:o=\"right\"}=e;return h.a.createElement(\"div\",{className:n},h.a.createElement(oe,{open:a,place:o},t))};re.propTypes={children:c.a.node,className:c.a.string,open:c.a.bool,place:c.a.oneOf([\"left\",\"right\"])};var ie=re,se=n(17),le=n.n(se);class ce extends h.a.Component{constructor(e){super(e),u()(this,[\"handleClick\",\"handleMouseUp\",\"menuRef\"])}componentDidMount(){this.props.open&&this.addListeners()}componentDidUpdate(e){this.props.open&&!e.open&&this.addListeners(),!this.props.open&&e.open&&this.removeListeners()}componentWillUnmount(){this.removeListeners()}addListeners(){document.addEventListener(\"mouseup\",this.handleMouseUp)}removeListeners(){document.removeEventListener(\"mouseup\",this.handleMouseUp)}handleClick(e){e.target.closest(\"div\")===this.menuEl&&(this.props.open?this.props.onClose():this.props.onOpen())}handleMouseUp(e){this.props.open&&!this.menuEl.contains(e.target)&&this.props.onClose()}menuRef(e){this.menuEl=e}render(){return h.a.createElement(\"div\",{className:o()(le.a.menuBarItem,le.a.hoverable,{[le.a.active]:this.props.open}),onClick:this.handleClick,ref:this.menuRef},this.props.children)}}ce.propTypes={children:c.a.node,open:c.a.bool,onOpen:c.a.func,onClose:c.a.func};var de=ce,ue=n(56),pe=n(91),me=n(69),ge=n(356),he=n.n(ge);const be=Object(pe.a)(me.a),we=Object(s.g)({projectTitlePlaceholder:{id:\"gui.gui.projectTitlePlaceholder\",defaultMessage:\"Project title here\"}}),fe=e=>{let{className:t,intl:n,onSubmit:a,projectTitle:r}=e;return h.a.createElement(be,{className:o()(he.a.titleField,t),maxLength:\"100\",placeholder:n.formatMessage(we.projectTitlePlaceholder),tabIndex:\"0\",type:\"text\",value:r,onSubmit:a})};fe.propTypes={className:c.a.string,intl:s.i.isRequired,onSubmit:c.a.func,projectTitle:c.a.string};var Me=Object(s.h)(Object(r.b)((e=>({projectTitle:e.scratchGui.projectTitle})),(e=>({onSubmit:t=>e(Object(ue.c)(t))})))(fe)),ve=n(357),ye=n.n(ve);const ke=e=>{let{className:t,imageUrl:n}=e;return h.a.createElement(\"img\",{className:o()(t,ye.a.userThumbnail),src:n,draggable:!1})};ke.propTypes={className:c.a.string,imageUrl:c.a.string};var je=ke,Ie=n(115),Se=n.n(Ie);const xe=[\"projectId\"];const Ee=e=>{let{className:t,imageUrl:n,projectTitle:a,userId:r,username:i}=e;return h.a.createElement(\"div\",{className:o()(t,Se.a.authorInfo)},h.a.createElement(je,{className:Se.a.avatar,imageUrl:n}),h.a.createElement(\"div\",{className:Se.a.titleAuthor},h.a.createElement(\"h1\",{className:Se.a.projectTitle},a),h.a.createElement(\"div\",null,h.a.createElement(\"span\",{className:Se.a.usernameLine},h.a.createElement(s.b,{defaultMessage:\"by {username}\",id:\"gui.authorInfo.byUser\",values:{username:h.a.createElement(\"span\",{className:Se.a.username},i)}})))))};Ee.propTypes={className:c.a.string,imageUrl:c.a.string,projectTitle:c.a.string,userId:c.a.oneOfType([c.a.string,c.a.bool]),username:c.a.oneOfType([c.a.string,c.a.bool])};const Ce=e=>{let{projectId:t}=e,n=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a({deletedItem:e.scratchGui.restoreDeletion.deletedItem,restore:e.scratchGui.restoreDeletion.restoreFun})),(e=>({dispatchUpdateRestore:t=>{e(Object(De.c)(t))}})))(ze);const Re=[\"children\",\"vm\"];class Ue extends h.a.Component{constructor(e){super(e),u()(this,[\"toggleTurboMode\"])}toggleTurboMode(){this.props.vm.setTurboMode(!this.props.turboMode)}render(){const e=this.props,{children:t,vm:n}=e,a=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a({vm:e.scratchGui.vm,turboMode:e.scratchGui.vmStatus.turbo})),(()=>({})))(Ue);const Ge=[\"projectChanged\"];function Fe(){return Fe=Object.assign?Object.assign.bind():function(e){for(var t=1;th.a.createElement(e,Fe({confirmReadyToReplaceProject:this.confirmReadyToReplaceProject,shouldSaveBeforeTransition:this.shouldSaveBeforeTransition,handleSaveProject:o.smartSave},a))))}}t.propTypes={canCreateNew:c.a.bool,canSave:c.a.bool,confirmWithMessage:c.a.func,projectChanged:c.a.bool,showSaveFilePicker:c.a.func},t.defaultProps={confirmWithMessage:e=>confirm(e)};return Object(r.b)((e=>({projectChanged:e.scratchGui.projectChanged})),(()=>({})),((e,t,n)=>Object.assign({},e,t,n)))(t)},We=n(67),He=n(134),Qe=n.n(He),Ye=n(358),Ve=n.n(Ye),qe=n(18),Je=n(121),Xe=n(27),Ke=n.n(Xe),$e=n(71),et=n.n($e);function tt(){return tt=Object.assign?Object.assign.bind():function(e){for(var t=1;th.a.createElement($,{key:e,className:Ke.a.languageMenuItem,onClick:()=>this.props.onChangeLanguage(e)},h.a.createElement(\"img\",tt({className:o()(Ke.a.check,{[Ke.a.selected]:this.props.currentLocale===e}),src:Qe.a,draggable:!1},this.props.currentLocale===e&&{ref:this.setRef})),We.a[e].name)))))}}nt.propTypes={currentLocale:c.a.string,isRtl:c.a.bool,label:c.a.string,menuOpen:c.a.bool,onChangeLanguage:c.a.func,onRequestCloseSettings:c.a.func,onRequestOpen:c.a.func};var at=Object(r.b)((e=>({currentLocale:e.locales.locale,isRtl:e.locales.isRtl,menuOpen:Object(qe.q)(e),messagesByLocale:e.locales.messagesByLocale})),((e,t)=>({onChangeLanguage:n=>{e(Object(Je.d)(n)),t.onRequestCloseSettings()},onRequestOpen:()=>e(Object(qe.B)())})))(nt),ot=n(15),rt=n(80),it=n(78),st=n(359),lt=n.n(st);const ct=Object(s.g)({[ot.e]:{id:\"tw.accent.red\",defaultMessage:\"Red\"},[ot.c]:{id:\"tw.accent.purple\",defaultMessage:\"Purple\"},[ot.a]:{id:\"tw.accent.blue\",defaultMessage:\"Blue\"},[ot.d]:{id:\"tw.accent.rainbow\",defaultMessage:\"Rainbow\"}}),dt={[ot.d]:lt.a},ut=e=>dt[e.id]?h.a.createElement(\"img\",{className:Ke.a.accentIconOuter,src:dt[e.id],draggable:!1,alt:\"\"}):h.a.createElement(\"div\",{className:Ke.a.accentIconOuter,style:{backgroundColor:ot.b[e.id].guiColors[\"looks-secondary\"],backgroundImage:ot.b[e.id].guiColors[\"menu-bar-background-image\"]}});ut.propTypes={id:c.a.string};const pt=e=>h.a.createElement($,{onClick:e.onClick},h.a.createElement(\"div\",{className:Ke.a.option},h.a.createElement(\"img\",{className:o()(Ke.a.check,{[Ke.a.selected]:e.isSelected}),width:15,height:12,src:Qe.a,draggable:!1}),h.a.createElement(ut,{id:e.id}),h.a.createElement(s.b,ct[e.id])));pt.propTypes={id:c.a.string,isSelected:c.a.bool,onClick:c.a.func};const mt=e=>{let{isOpen:t,isRtl:n,onChangeTheme:a,onOpen:o,theme:r}=e;return h.a.createElement($,{expanded:t},h.a.createElement(\"div\",{className:Ke.a.option,onClick:o},h.a.createElement(ut,{id:r.accent}),h.a.createElement(\"span\",{className:Ke.a.submenuLabel},h.a.createElement(s.b,{defaultMessage:\"Accent\",id:\"tw.menuBar.accent\"})),h.a.createElement(\"img\",{className:Ke.a.expandCaret,src:et.a,draggable:!1})),h.a.createElement(K,{place:n?\"left\":\"right\"},Object.keys(ct).map((e=>h.a.createElement(pt,{key:e,id:e,isSelected:r.accent===e,onClick:()=>a(r.set(\"accent\",e))})))))};mt.propTypes={isOpen:c.a.bool,isRtl:c.a.bool,onChangeTheme:c.a.func,onOpen:c.a.func,theme:c.a.instanceOf(ot.m)};var gt=Object(r.b)((e=>({isOpen:Object(qe.b)(e),isRtl:e.locales.isRtl,theme:e.scratchGui.theme.theme})),(e=>({onChangeTheme:t=>{e(Object(rt.b)(t)),e(Object(qe.l)()),Object(it.c)(t)},onOpen:()=>e(Object(qe.v)())})))(mt),ht=n(360),bt=n.n(ht),wt=n(361),ft=n.n(wt);const Mt=e=>{let{onChangeTheme:t,theme:n}=e;return h.a.createElement($,null,h.a.createElement(\"div\",{className:Ke.a.option,onClick:()=>t(n.set(\"gui\",n.gui===ot.k?ot.l:ot.k))},h.a.createElement(\"img\",{src:n.gui===ot.k?bt.a:ft.a,draggable:!1,width:24,height:24}),h.a.createElement(\"span\",{className:Ke.a.submenuLabel},n.gui===ot.k?h.a.createElement(s.b,{defaultMessage:\"Switch To Light Mode\",id:\"tw.darkMode\"}):h.a.createElement(s.b,{defaultMessage:\"Switch To Dark Mode\",id:\"tw.lightMode\"}))))};Mt.propTypes={onChangeTheme:c.a.func,theme:c.a.instanceOf(ot.m)};var vt=Object(r.b)((e=>({theme:e.scratchGui.theme.theme})),(e=>({onChangeTheme:t=>{e(Object(rt.b)(t)),e(Object(qe.l)()),Object(it.c)(t)}})))(Mt),yt=n(362),kt=n.n(yt),jt=n(363),It=n.n(jt),St=n(364),xt=n.n(St),Et=n(365),Ct=n.n(Et),Nt=n(366),_t=n.n(Nt);const Dt=Object(s.g)({[ot.j]:{id:\"tw.blockColors.three\",defaultMessage:\"Original\"},[ot.h]:{id:\"tw.blockColors.highContrast\",defaultMessage:\"High Contrast\"},[ot.g]:{id:\"tw.blockColors.dark\",defaultMessage:\"Dark (Beta)\"},[ot.f]:{id:\"tw.blockColors.custom\",defaultMessage:\"Customize in Addon Settings\"}}),Tt={[ot.j]:kt.a,[ot.h]:It.a,[ot.g]:xt.a,[ot.f]:Ct.a},Ot=e=>{let{id:t}=e;return h.a.createElement(\"img\",{src:Tt[t],draggable:!1,width:24})};Ot.propTypes={id:c.a.string};const At=e=>{let{id:t,disabled:n,isSelected:a,onClick:r}=e;return h.a.createElement($,{onClick:n?null:r},h.a.createElement(\"div\",{className:o()(Ke.a.option,{[Ke.a.disabled]:n})},h.a.createElement(\"img\",{width:15,height:12,className:o()(Ke.a.check,{[Ke.a.selected]:a}),src:Qe.a,draggable:!1}),h.a.createElement(Ot,{id:t}),h.a.createElement(s.b,Dt[t]),t===ot.f&&h.a.createElement(\"img\",{width:20,height:20,className:Ke.a.openLink,src:_t.a,draggable:!1})))};At.propTypes={id:c.a.string,isSelected:c.a.bool,onClick:c.a.func,disabled:c.a.bool};const Pt=e=>{let{isOpen:t,isRtl:n,onChangeTheme:a,onOpenCustomSettings:o,onOpenMenu:r,theme:i}=e;return h.a.createElement($,{expanded:t},h.a.createElement(\"div\",{className:Ke.a.option,onClick:r},h.a.createElement(Ot,{id:i.blocks}),h.a.createElement(\"span\",{className:Ke.a.submenuLabel},h.a.createElement(s.b,{defaultMessage:\"Block Colors\",id:\"tw.menuBar.blockColors\"})),h.a.createElement(\"img\",{className:Ke.a.expandCaret,src:et.a,draggable:!1})),h.a.createElement(K,{place:n?\"left\":\"right\"},[ot.j,ot.h,ot.g,...o?[ot.f]:[]].map((e=>h.a.createElement(At,{key:e,id:e,isSelected:i.blocks===e,onClick:e===ot.f?o:()=>a(i.set(\"blocks\",e)),disabled:e!==ot.f&&i.blocks===ot.f})))))};Pt.propTypes={isOpen:c.a.bool,isRtl:c.a.bool,onChangeTheme:c.a.func,onOpenCustomSettings:c.a.func,onOpenMenu:c.a.func,theme:c.a.instanceOf(ot.m)};var zt=Object(r.b)((e=>({isOpen:Object(qe.d)(e),isRtl:e.locales.isRtl,theme:e.scratchGui.theme.theme})),(e=>({onChangeTheme:t=>{e(Object(rt.b)(t)),e(Object(qe.l)()),Object(it.c)(t)},onOpenMenu:()=>e(Object(qe.x)())})))(Pt),Lt=n(367),Rt=n.n(Lt);const Ut=e=>h.a.createElement($,{onClick:e.onClick},h.a.createElement(\"div\",{className:Ke.a.option},h.a.createElement(\"img\",{src:Rt.a,draggable:!1,width:24,height:24,alt:\"\"}),h.a.createElement(s.b,{defaultMessage:\"Desktop Settings\",id:\"tw.menuBar.desktopSettings\"})));Ut.propTypes={onClick:c.a.func};var Bt=Ut,Gt=n(368),Ft=n.n(Gt);const Zt=e=>{let{canChangeLanguage:t,canChangeTheme:n,isRtl:a,onClickDesktopSettings:o,onOpenCustomSettings:r,onRequestClose:i,onRequestOpen:l,settingsMenuOpen:c}=e;return h.a.createElement(de,{open:c,onOpen:l,onClose:i},h.a.createElement(\"img\",{src:Ft.a,draggable:!1,width:20,height:20}),h.a.createElement(\"span\",{className:Ke.a.dropdownLabel},h.a.createElement(s.b,{defaultMessage:\"Settings\",id:\"gui.menuBar.settings\"})),h.a.createElement(\"img\",{src:et.a,draggable:!1,width:8,height:5}),h.a.createElement(ie,{className:le.a.menuBarMenu,open:c,place:a?\"left\":\"right\"},h.a.createElement(te,null,t&&h.a.createElement(at,{onRequestCloseSettings:i}),n&&h.a.createElement(h.a.Fragment,null,h.a.createElement(vt,null),h.a.createElement(zt,{onOpenCustomSettings:r}),h.a.createElement(gt,null)),o&&h.a.createElement(Bt,{onClick:o}))))};Zt.propTypes={canChangeLanguage:c.a.bool,canChangeTheme:c.a.bool,isRtl:c.a.bool,onClickDesktopSettings:c.a.func,onOpenCustomSettings:c.a.func,onRequestClose:c.a.func,onRequestOpen:c.a.func,settingsMenuOpen:c.a.bool};var Wt=Zt;const Ht=[\"intl\",\"children\",\"vm\"];const Qt=Object(s.g)({newFramerate:{id:\"tw.menuBar.newFramerate\",defaultMessage:\"New framerate:\"}});class Yt extends h.a.Component{constructor(e){super(e),u()(this,[\"changeFramerate\"])}async changeFramerate(e){if(e&&(e.ctrlKey||e.shiftKey)){const e=await prompt(this.props.intl.formatMessage(Qt.newFramerate),this.props.framerate);if(null===e)return;const t=+e;isFinite(t)&&t>0&&this.props.vm.setFramerate(t)}else 60===this.props.framerate?this.props.vm.setFramerate(30):this.props.vm.setFramerate(60)}render(){const e=this.props,{intl:t,children:n,vm:a}=e,o=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a({framerate:e.scratchGui.tw.framerate,vm:e.scratchGui.vm})),(()=>({})))(Yt)),qt=n(14),Jt=n(37);const Xt=Object(s.g)({cannotChangeWhileRunning:{id:\"tw.changeUsername.cannotChangeWhileRunning\",defaultMessage:\"Username cannot be changed while the project is running.\"}});class Kt extends h.a.Component{constructor(e){super(e),u()(this,[\"changeUsername\"])}changeUsername(){!this.props.running||Object(Jt.a)()?this.props.onOpenUsernameModal():alert(this.props.intl.formatMessage(Xt.cannotChangeWhileRunning))}render(){return this.props.children(this.changeUsername)}}Kt.propTypes={children:c.a.func,onOpenUsernameModal:c.a.func,running:c.a.bool,intl:s.i};var $t=Object(s.h)(Object(r.b)((e=>({running:e.scratchGui.vmStatus.running})),(e=>({onOpenUsernameModal:()=>{e(Object(qt.I)()),e(Object(qe.g)())}})))(Kt)),en=n(23);const tn=[\"children\"];const nn=Object(s.g)({cloudUnavailableAlert:{id:\"tw.menuBar.cloudUnavailableAlert\",defaultMessage:\"Cannot use cloud variables, most likely because you opened the editor.\"}});class an extends h.a.Component{constructor(e){super(e),u()(this,[\"toggleCloudVariables\"])}toggleCloudVariables(){if(this.props.canUseCloudVariables)this.props.onCloudChange(!this.props.enabled);else{const e=this.props.intl.formatMessage(nn.cloudUnavailableAlert);alert(e)}}render(){const e=this.props,{children:t}=e,n=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a({username:e.scratchGui.tw.username,enabled:e.scratchGui.tw.cloud,canUseCloudVariables:Object(Jt.a)()||!e.scratchGui.mode.hasEverEnteredEditor})),(e=>({onCloudChange:t=>e(Object(en.e)(t))})))(an));const rn=e=>{let{alertsList:t,fileHandle:n,projectChanged:a,showSaveFilePicker:o}=e;return Object(T.e)(t).length>0?h.a.createElement(B,null):a&&h.a.createElement(_e.a,{showSaveFilePicker:o},((e,t,a)=>{let{smartSave:o}=a;return h.a.createElement(\"div\",{onClick:o,className:Z.a.saveNow},n?h.a.createElement(s.b,{defaultMessage:\"Save as {file}\",id:\"tw.menuBar.saveAs\",values:{file:n.name}}):h.a.createElement(s.b,{defaultMessage:\"Save to your computer\",id:\"gui.menuBar.downloadToComputer\"}))}))};rn.propTypes={alertsList:c.a.arrayOf(c.a.object),fileHandle:c.a.shape({name:c.a.string}),projectChanged:c.a.bool,showSaveFilePicker:c.a.func};var sn=Object(r.b)((e=>({alertsList:e.scratchGui.alerts.alertsList,fileHandle:e.scratchGui.tw.fileHandle,projectChanged:e.scratchGui.projectChanged})),(()=>({})))(rn),ln=n(92),cn=n(203),dn=n.n(cn);const un=\"tw:closedNews\",pn=\"scratch-vulnerability\",mn=()=>h.a.createElement(\"div\",{className:dn.a.text,lang:\"en\"},h.a.createElement(\"div\",null,\"We discovered a critical vulnerability in all versions of Scratch. In the desktop app, opening a malicious project could install ransomware on your computer.\"),h.a.createElement(\"div\",null,\"We reported this to Scratch two years ago, but no fix has been released yet. The latest TurboWarp is not affected. \",h.a.createElement(\"a\",{href:\"https://muffin.ink/blog/scratch-vulnerability-disclosure/\",target:\"_blank\",rel:\"noreferrer\"},\"More details on my blog.\"))),gn=()=>{try{return localStorage.getItem(un)===pn}catch(e){return!1}};class hn extends h.a.Component{constructor(e){super(e),this.state={closed:gn()||!1},this.handleClose=this.handleClose.bind(this)}handleClose(){(()=>{try{localStorage.setItem(un,pn)}catch(e){}})(),this.setState({closed:!0},(()=>{window.dispatchEvent(new Event(\"resize\"))}))}render(){return this.state.closed||Object(Jt.b)()?null:h.a.createElement(\"div\",{className:dn.a.news},h.a.createElement(mn,null),h.a.createElement(ln.a,{className:dn.a.close,onClick:this.handleClose}))}}var bn=hn,wn=n(47),fn=n(72),Mn=n(183),vn=(n(227),n(521),n(522),n(369)),yn=n.n(vn),kn=n(241),jn=n.n(kn),In=n(370),Sn=n.n(In),xn=n(371),En=n.n(xn),Cn=n(372),Nn=n.n(Cn),_n=n(373),Dn=n.n(_n),Tn=n(374),On=n.n(Tn),An=n(375),Pn=n.n(An),zn=n(376),Ln=n.n(zn),Rn=n(377),Un=n.n(Rn),Bn=n(378),Gn=n.n(Bn),Fn=n(49),Zn=n(242),Wn=n.n(Zn);const Hn=e=>{let{className:t,onClick:n}=e;return h.a.createElement(M.a,{className:o()(t,Wn.a.seeInsideButton),iconClassName:Wn.a.seeInsideButtonIcon,iconSrc:y.a,iconWidth:20,iconHeight:20,onClick:n},h.a.createElement(s.b,{defaultMessage:\"See inside\",id:\"tw.menuBar.seeInside\"}))};Hn.propTypes={className:c.a.string,onClick:c.a.func},Hn.defaultProps={onClick:()=>{}};var Qn=Hn,Yn=n(24);Object(s.g)({tutorials:{id:\"gui.menuBar.tutorialsLibrary\",defaultMessage:\"Tutorials\"}});const Vn=Object(s.g)({compileError:{id:\"tw.menuBar.compileError\",defaultMessage:\"{sprite}: {error}\"}}),qn=e=>{let{children:t,className:n,enable:a,id:r,place:i=\"bottom\"}=e;return a?h.a.createElement(h.a.Fragment,null,t):h.a.createElement(_.a,{className:o()(le.a.comingSoon,n),place:i,tooltipClassName:le.a.comingSoonTooltip,tooltipId:r},t)};qn.propTypes={children:c.a.node,className:c.a.string,enable:c.a.bool,id:c.a.string,place:c.a.oneOf([\"top\",\"bottom\",\"left\",\"right\"])};c.a.node,c.a.string,c.a.string,c.a.bool;const Jn=e=>h.a.createElement(M.a,{className:o()(le.a.menuBarItem,le.a.hoverable),iconClassName:le.a.aboutIcon,iconSrc:jn.a,onClick:e.onClick});Jn.propTypes={onClick:c.a.func.isRequired};const Xn=e=>h.a.createElement(\"a\",{href:e.href,rel:\"noreferrer\",target:\"_blank\",className:le.a.menuItemLink},h.a.createElement($,null,e.children));Xn.propTypes={children:c.a.node.isRequired,href:c.a.string.isRequired};class Kn extends h.a.Component{constructor(e){super(e),u()(this,[\"handleClickSeeInside\",\"handleClickNew\",\"handleClickNewWindow\",\"handleClickRemix\",\"handleClickSave\",\"handleClickSaveAsCopy\",\"handleClickPackager\",\"handleClickDesktopSettings\",\"handleClickRestorePoints\",\"handleClickSeeCommunity\",\"handleClickShare\",\"handleSetMode\",\"handleKeyPress\",\"handleRestoreOption\",\"getSaveToComputerHandler\",\"restoreOptionMessage\"])}componentDidMount(){document.addEventListener(\"keydown\",this.handleKeyPress)}componentWillUnmount(){document.removeEventListener(\"keydown\",this.handleKeyPress)}handleClickNew(){const e=this.props.confirmReadyToReplaceProject(this.props.intl.formatMessage(Fn.a.replaceProjectWarning));this.props.onRequestCloseFile(),e&&this.props.onClickNew(this.props.canSave&&this.props.canCreateNew),this.props.onRequestCloseFile()}handleClickNewWindow(){this.props.onClickNewWindow(),this.props.onRequestCloseFile()}handleClickRemix(){this.props.onClickRemix(),this.props.onRequestCloseFile()}handleClickSave(){this.props.onClickSave(),this.props.onRequestCloseFile()}handleClickSaveAsCopy(){this.props.onClickSaveAsCopy(),this.props.onRequestCloseFile()}handleClickPackager(){this.props.onClickPackager(),this.props.onRequestCloseFile()}handleClickDesktopSettings(){this.props.onClickDesktopSettings(),this.props.onRequestCloseSettings()}handleClickRestorePoints(){this.props.onClickRestorePoints(),this.props.onRequestCloseFile()}handleClickSeeCommunity(e){this.props.shouldSaveBeforeTransition()?(this.props.autoUpdateProject(),e(!0)):e(!1)}handleClickShare(e){this.props.isShared||(this.props.canShare&&this.props.onShare(),this.props.canSave?(this.props.autoUpdateProject(),e(!0)):e(!1))}handleSetMode(e){return()=>{\"1920\"===e?(document.documentElement.style.filter=\"brightness(.9)contrast(.8)sepia(1.0)\",document.documentElement.style.height=\"100%\"):\"1990\"===e?(document.documentElement.style.filter=\"hue-rotate(40deg)\",document.documentElement.style.height=\"100%\"):(document.documentElement.style.filter=\"\",document.documentElement.style.height=\"\"),document.getElementById(\"logo_img\").src=\"1990\"===e?Pn.a:\"2020\"===e?Ln.a:\"1920\"===e?Gn.a:\"220022BC\"===e?Un.a:this.props.logo,this.props.onSetTimeTravelMode(e)}}handleRestoreOption(e){return()=>{e(),this.props.onRequestCloseEdit()}}handleKeyPress(e){(m.a.mac?e.metaKey:e.ctrlKey)&&(\"s\"===e.key.toLowerCase()?(this.props.handleSaveProject(),e.preventDefault()):\"o\"===e.key.toLowerCase()&&(e.preventDefault(),this.props.onStartSelectingFileUpload()))}getSaveToComputerHandler(e){return()=>{if(this.props.onRequestCloseFile(),e(),this.props.onProjectTelemetryEvent){const e=Object(Mn.a)(this.props.vm,this.props.projectTitle,this.props.locale);this.props.onProjectTelemetryEvent(\"projectDidSave\",e)}}}restoreOptionMessage(e){switch(e){case\"Sprite\":return h.a.createElement(s.b,{defaultMessage:\"Restore Sprite\",id:\"gui.menuBar.restoreSprite\"});case\"Sound\":return h.a.createElement(s.b,{defaultMessage:\"Restore Sound\",id:\"gui.menuBar.restoreSound\"});case\"Costume\":return h.a.createElement(s.b,{defaultMessage:\"Restore Costume\",id:\"gui.menuBar.restoreCostume\"});default:return h.a.createElement(s.b,{defaultMessage:\"Restore\",id:\"gui.menuBar.restore\"})}}handleClickSeeInside(){this.props.onClickSeeInside()}buildAboutMenu(e){return e?\"function\"==typeof e?h.a.createElement(Jn,{onClick:e}):h.a.createElement(de,{open:this.props.aboutMenuOpen,onOpen:this.props.onRequestOpenAbout,onClose:this.props.onRequestCloseAbout},h.a.createElement(\"img\",{className:le.a.aboutIcon,src:jn.a,draggable:!1}),h.a.createElement(ie,{className:o()(le.a.menuBarMenu),open:this.props.aboutMenuOpen,place:this.props.isRtl?\"right\":\"left\"},e.map((e=>h.a.createElement($,{key:e.title,isRtl:this.props.isRtl,onClick:this.wrapAboutMenuCallback(e.onClick)},e.title))))):null}wrapAboutMenuCallback(e){return()=>{e(),this.props.onRequestCloseAbout()}}render(){const e=h.a.createElement(s.b,{defaultMessage:\"Save now\",id:\"gui.menuBar.saveNow\"}),t=h.a.createElement(s.b,{defaultMessage:\"Save as a copy\",id:\"gui.menuBar.saveAsCopy\"}),n=h.a.createElement(s.b,{defaultMessage:\"Remix\",id:\"gui.menuBar.remix\"}),a=h.a.createElement(s.b,{defaultMessage:\"New\",id:\"gui.menuBar.new\"}),r=h.a.createElement(M.a,{className:o()(le.a.menuBarButton,le.a.remixButton),iconClassName:le.a.remixButtonIcon,iconSrc:yn.a,onClick:this.handleClickRemix},n),i=this.buildAboutMenu(this.props.onClickAbout),l=h.a.createElement(f.a,{className:o()(this.props.className,le.a.menuBar)},h.a.createElement(\"div\",{className:le.a.mainMenu},h.a.createElement(\"div\",{className:le.a.fileGroup},this.props.errors.length>0&&h.a.createElement(\"div\",null,h.a.createElement(de,{open:this.props.errorsMenuOpen,onOpen:this.props.onClickErrors,onClose:this.props.onRequestCloseErrors},h.a.createElement(\"img\",{src:Dn.a,draggable:!1,width:20,height:20}),h.a.createElement(\"img\",{src:et.a,draggable:!1,width:8,height:5}),h.a.createElement(ie,{className:o()(le.a.menuBarMenu),open:this.props.errorsMenuOpen,place:this.props.isRtl?\"left\":\"right\"},h.a.createElement(te,null,h.a.createElement(Xn,{href:\"https://scratch.mit.edu/users/GarboMuffin/#comments\"},h.a.createElement(s.b,{defaultMessage:\"Some scripts encountered errors.\",id:\"tw.menuBar.reportError1\"})),h.a.createElement(Xn,{href:\"https://scratch.mit.edu/users/GarboMuffin/#comments\"},h.a.createElement(s.b,{defaultMessage:\"This is a bug. Please report it.\",id:\"tw.menuBar.reportError2\"}))),h.a.createElement(te,null,this.props.errors.map((e=>{let{id:t,sprite:n,error:a}=e;return h.a.createElement($,{key:t},this.props.intl.formatMessage(Vn.compileError,{sprite:n,error:a}))})))))),(this.props.canChangeTheme||this.props.canChangeLanguage)&&h.a.createElement(Wt,{canChangeLanguage:this.props.canChangeLanguage,canChangeTheme:this.props.canChangeTheme,isRtl:this.props.isRtl,onClickDesktopSettings:this.props.onClickDesktopSettings&&this.handleClickDesktopSettings,onOpenCustomSettings:this.props.onClickAddonSettings&&this.props.onClickAddonSettings.bind(null,\"editor-theme3\"),onRequestClose:this.props.onRequestCloseSettings,onRequestOpen:this.props.onClickSettings,settingsMenuOpen:this.props.settingsMenuOpen}),this.props.canManageFiles&&h.a.createElement(de,{open:this.props.fileMenuOpen,onOpen:this.props.onClickFile,onClose:this.props.onRequestCloseFile},h.a.createElement(\"img\",{src:Sn.a,draggable:!1,width:20,height:20}),h.a.createElement(\"span\",{className:le.a.collapsibleLabel},h.a.createElement(s.b,{defaultMessage:\"File\",id:\"gui.menuBar.file\"})),h.a.createElement(\"img\",{src:et.a,draggable:!1,width:8,height:5}),h.a.createElement(ie,{className:o()(le.a.menuBarMenu),open:this.props.fileMenuOpen,place:this.props.isRtl?\"left\":\"right\"},h.a.createElement($,{isRtl:this.props.isRtl,onClick:this.handleClickNew},a),this.props.onClickNewWindow&&h.a.createElement($,{isRtl:this.props.isRtl,onClick:this.handleClickNewWindow},h.a.createElement(s.b,{defaultMessage:\"New window\",id:\"tw.menuBar.newWindow\"})),(this.props.canSave||this.props.canCreateCopy||this.props.canRemix)&&h.a.createElement(te,null,this.props.canSave&&h.a.createElement($,{onClick:this.handleClickSave},e),this.props.canCreateCopy&&h.a.createElement($,{onClick:this.handleClickSaveAsCopy},t),this.props.canRemix&&h.a.createElement($,{onClick:this.handleClickRemix},n)),h.a.createElement(te,null,h.a.createElement($,{onClick:this.props.onStartSelectingFileUpload},this.props.intl.formatMessage(Fn.a.loadFromComputerTitle)),h.a.createElement(_e.a,{showSaveFilePicker:this.props.showSaveFilePicker},((e,t,n)=>h.a.createElement(h.a.Fragment,null,n.available&&h.a.createElement(h.a.Fragment,null,null!==n.name&&h.a.createElement($,{onClick:this.getSaveToComputerHandler(n.saveToLastFile)},h.a.createElement(s.b,{defaultMessage:\"Save to {file}\",id:\"tw.saveTo\",values:{file:n.name}})),h.a.createElement($,{onClick:this.getSaveToComputerHandler(n.saveAsNew)},h.a.createElement(s.b,{defaultMessage:\"Save as...\",id:\"tw.saveAs\"}))),Object(Jt.c)()&&h.a.createElement($,{onClick:this.getSaveToComputerHandler(t)},n.available?h.a.createElement(s.b,{defaultMessage:\"Save to separate file...\",id:\"tw.oldDownload\"}):h.a.createElement(s.b,{defaultMessage:\"Save to your computer\",id:\"gui.menuBar.downloadToComputer\"})))))),this.props.onClickPackager&&h.a.createElement(te,null,h.a.createElement($,{onClick:this.handleClickPackager},h.a.createElement(s.b,{defaultMessage:\"Package project\",id:\"tw.menuBar.package\"}))),h.a.createElement(te,null,h.a.createElement($,{onClick:this.handleClickRestorePoints},h.a.createElement(s.b,{defaultMessage:\"Restore points\",id:\"tw.menuBar.restorePoints\"}))))),h.a.createElement(de,{open:this.props.editMenuOpen,onOpen:this.props.onClickEdit,onClose:this.props.onRequestCloseEdit},h.a.createElement(\"img\",{src:En.a,draggable:!1,width:20,height:20}),h.a.createElement(\"span\",{className:le.a.collapsibleLabel},h.a.createElement(s.b,{defaultMessage:\"Edit\",id:\"gui.menuBar.edit\"})),h.a.createElement(\"img\",{src:et.a,draggable:!1,width:8,height:5}),h.a.createElement(ie,{className:o()(le.a.menuBarMenu),open:this.props.editMenuOpen,place:this.props.isRtl?\"left\":\"right\"},this.props.isPlayerOnly?null:h.a.createElement(Le,null,((e,t)=>{let{restorable:n,deletedItem:a}=t;return h.a.createElement($,{className:o()({[le.a.disabled]:!n}),onClick:this.handleRestoreOption(e)},this.restoreOptionMessage(a))})),h.a.createElement(te,null,h.a.createElement(Be,null,((e,t)=>{let{turboMode:n}=t;return h.a.createElement($,{onClick:e},n?h.a.createElement(s.b,{defaultMessage:\"Turn off Turbo Mode\",id:\"gui.menuBar.turboModeOff\"}):h.a.createElement(s.b,{defaultMessage:\"Turn on Turbo Mode\",id:\"gui.menuBar.turboModeOn\"}))})),h.a.createElement(Vt,null,((e,t)=>{let{framerate:n}=t;return h.a.createElement($,{onClick:e},60===n?h.a.createElement(s.b,{defaultMessage:\"Turn off 60 FPS Mode\",id:\"tw.menuBar.60off\"}):h.a.createElement(s.b,{defaultMessage:\"Turn on 60 FPS Mode\",id:\"tw.menuBar.60on\"}))})),h.a.createElement($t,null,(e=>h.a.createElement($,{onClick:e},h.a.createElement(s.b,{defaultMessage:\"Change Username\",id:\"tw.menuBar.changeUsername\"})))),h.a.createElement(on,null,((e,t)=>{let{enabled:n,canUseCloudVariables:a}=t;return h.a.createElement($,{className:o()({[le.a.disabled]:!a}),onClick:e},a?n?h.a.createElement(s.b,{defaultMessage:\"Disable Cloud Variables\",id:\"tw.menuBar.cloudOff\"}):h.a.createElement(s.b,{defaultMessage:\"Enable Cloud Variables\",id:\"tw.menuBar.cloudOn\"}):h.a.createElement(s.b,{defaultMessage:\"Cloud Variables are not Available\",id:\"tw.menuBar.cloudUnavailable\"}))}))),h.a.createElement(te,null,h.a.createElement($,{onClick:this.props.onClickSettingsModal},h.a.createElement(s.b,{defaultMessage:\"Advanced Settings\",id:\"tw.menuBar.moreSettings\"}))))),this.props.isTotallyNormal&&h.a.createElement(de,{open:this.props.modeMenuOpen,onOpen:this.props.onClickMode,onClose:this.props.onRequestCloseMode},h.a.createElement(s.b,{defaultMessage:\"Mode\",id:\"gui.menuBar.modeMenu\"}),h.a.createElement(ie,{className:o()(le.a.menuBarMenu),open:this.props.modeMenuOpen,place:this.props.isRtl?\"left\":\"right\"},h.a.createElement(te,null,h.a.createElement($,{onClick:this.handleSetMode(\"NOW\")},h.a.createElement(\"span\",{className:o()({[le.a.inactive]:!this.props.modeNow})},\"✓\"),\" \",h.a.createElement(s.b,{defaultMessage:\"Normal mode\",id:\"gui.menuBar.normalMode\"})),h.a.createElement($,{onClick:this.handleSetMode(\"2020\")},h.a.createElement(\"span\",{className:o()({[le.a.inactive]:!this.props.mode2020})},\"✓\"),\" \",h.a.createElement(s.b,{defaultMessage:\"Caturday mode\",id:\"gui.menuBar.caturdayMode\"}))))),this.props.onClickAddonSettings&&h.a.createElement(\"div\",{className:o()(le.a.menuBarItem,le.a.hoverable),onClick:this.props.onClickAddonSettings},h.a.createElement(\"img\",{src:Nn.a,draggable:!1,width:20,height:20}),h.a.createElement(\"span\",{className:le.a.collapsibleLabel},h.a.createElement(s.b,{defaultMessage:\"Addons\",id:\"tw.menuBar.addons\"}))),this.props.onClickSettingsModal&&h.a.createElement(\"div\",{className:o()(le.a.menuBarItem,le.a.hoverable),onClick:this.props.onClickSettingsModal},h.a.createElement(\"img\",{src:On.a,draggable:!1,width:20,height:20}),h.a.createElement(\"span\",{className:le.a.collapsibleLabel},h.a.createElement(s.b,{defaultMessage:\"Advanced\",id:\"tw.menuBar.advanced\"})))),h.a.createElement(D.a,{className:le.a.divider}),this.props.canEditTitle?h.a.createElement(\"div\",{className:o()(le.a.menuBarItem,le.a.growable)},h.a.createElement(qn,{enable:!0,id:\"title-field\"},h.a.createElement(Me,{className:o()(le.a.titleFieldGrowable)}))):this.props.authorUsername&&this.props.authorUsername!==this.props.username?h.a.createElement(Ne,{className:le.a.authorInfo,imageUrl:this.props.authorThumbnailUrl,projectId:this.props.projectId,projectTitle:this.props.projectTitle,userId:this.props.authorId,username:this.props.authorUsername}):null,this.props.canShare?(this.props.isShowingProject||this.props.isUpdating)&&h.a.createElement(\"div\",{className:o()(le.a.menuBarItem)},h.a.createElement(Q,{onDoneUpdating:this.props.onSeeCommunity},(e=>h.a.createElement(N,{className:le.a.menuBarButton,isShared:this.props.isShared,onClick:()=>{this.handleClickShare(e)}})))):this.props.showComingSoon?h.a.createElement(\"div\",{className:o()(le.a.menuBarItem)},h.a.createElement(qn,{id:\"share-button\"},h.a.createElement(N,{className:le.a.menuBarButton}))):null,this.props.canRemix&&h.a.createElement(\"div\",{className:o()(le.a.menuBarItem)},r),h.a.createElement(\"div\",{className:o()(le.a.menuBarItem,le.a.communityButtonWrapper)},this.props.enableCommunity?(this.props.isShowingProject||this.props.isUpdating)&&h.a.createElement(Q,{onDoneUpdating:this.props.onSeeCommunity},(e=>h.a.createElement(S,{className:le.a.menuBarButton,onClick:()=>{this.handleClickSeeCommunity(e)}}))):this.props.showComingSoon?h.a.createElement(qn,{id:\"community-button\"},h.a.createElement(S,{className:le.a.menuBarButton})):this.props.enableSeeInside?h.a.createElement(Qn,{className:le.a.menuBarButton,onClick:this.handleClickSeeInside}):[]),h.a.createElement(\"div\",{className:le.a.menuBarItem},h.a.createElement(\"a\",{className:le.a.feedbackLink,href:\"https://scratch.mit.edu/users/GarboMuffin/#comments\",rel:\"noopener noreferrer\",target:\"_blank\"},h.a.createElement(M.a,{className:le.a.feedbackButton},h.a.createElement(s.b,{defaultMessage:\"{APP_NAME} Feedback\",id:\"tw.feedbackButton\",values:{APP_NAME:Yn.APP_NAME}}))))),h.a.createElement(\"div\",{className:le.a.accountInfoGroup},h.a.createElement(sn,{showSaveFilePicker:this.props.showSaveFilePicker})),i);return h.a.createElement(h.a.Fragment,null,l,h.a.createElement(bn,null))}}Kn.propTypes={enableSeeInside:c.a.bool,onClickSeeInside:c.a.func,aboutMenuOpen:c.a.bool,accountMenuOpen:c.a.bool,authorId:c.a.oneOfType([c.a.string,c.a.bool]),authorThumbnailUrl:c.a.string,authorUsername:c.a.oneOfType([c.a.string,c.a.bool]),autoUpdateProject:c.a.func,canChangeLanguage:c.a.bool,canChangeTheme:c.a.bool,canCreateCopy:c.a.bool,canCreateNew:c.a.bool,canEditTitle:c.a.bool,canManageFiles:c.a.bool,canRemix:c.a.bool,canSave:c.a.bool,canShare:c.a.bool,className:c.a.string,errors:c.a.arrayOf(c.a.shape({sprite:c.a.string,error:c.a.string,id:c.a.number})),errorsMenuOpen:c.a.bool,onClickErrors:c.a.func,onRequestCloseErrors:c.a.func,confirmReadyToReplaceProject:c.a.func,currentLocale:c.a.string.isRequired,editMenuOpen:c.a.bool,enableCommunity:c.a.bool,fileMenuOpen:c.a.bool,handleSaveProject:c.a.func,intl:s.i,isPlayerOnly:c.a.bool,isRtl:c.a.bool,isShared:c.a.bool,isShowingProject:c.a.bool,isTotallyNormal:c.a.bool,isUpdating:c.a.bool,locale:c.a.string.isRequired,loginMenuOpen:c.a.bool,mode1920:c.a.bool,mode1990:c.a.bool,mode2020:c.a.bool,mode220022BC:c.a.bool,modeMenuOpen:c.a.bool,modeNow:c.a.bool,onClickAbout:c.a.oneOfType([c.a.func,c.a.arrayOf(c.a.shape({title:c.a.string,onClick:c.a.func}))]),onClickAccount:c.a.func,onClickAddonSettings:c.a.func,onClickDesktopSettings:c.a.func,onClickPackager:c.a.func,onClickRestorePoints:c.a.func,onClickEdit:c.a.func,onClickFile:c.a.func,onClickLogin:c.a.func,onClickMode:c.a.func,onClickNew:c.a.func,onClickNewWindow:c.a.func,onClickRemix:c.a.func,onClickSave:c.a.func,onClickSaveAsCopy:c.a.func,onClickSettings:c.a.func,onClickSettingsModal:c.a.func,onLogOut:c.a.func,onOpenRegistration:c.a.func,onOpenTipLibrary:c.a.func,onProjectTelemetryEvent:c.a.func,onRequestCloseAbout:c.a.func,onRequestCloseAccount:c.a.func,onRequestCloseEdit:c.a.func,onRequestCloseFile:c.a.func,onRequestCloseLogin:c.a.func,onRequestCloseMode:c.a.func,onRequestCloseSettings:c.a.func,onRequestOpenAbout:c.a.func,onSeeCommunity:c.a.func,onSetTimeTravelMode:c.a.func,onShare:c.a.func,onStartSelectingFileUpload:c.a.func,onToggleLoginOpen:c.a.func,projectId:c.a.string,projectTitle:c.a.string,renderLogin:c.a.func,sessionExists:c.a.bool,settingsMenuOpen:c.a.bool,shouldSaveBeforeTransition:c.a.func,showSaveFilePicker:c.a.func,showComingSoon:c.a.bool,username:c.a.string,userOwnsProject:c.a.bool,vm:c.a.instanceOf(w.a).isRequired},Kn.defaultProps={onShare:()=>{}};t.a=Object(i.d)(s.h,Ze,Object(r.b)(((e,t)=>{const n=e.scratchGui.projectState.loadingState,a=e.session&&e.session.session&&e.session.session.user;return{authorUsername:e.scratchGui.tw.author.username,authorThumbnailUrl:e.scratchGui.tw.author.thumbnail,projectId:e.scratchGui.projectState.projectId,aboutMenuOpen:Object(qe.a)(e),accountMenuOpen:Object(qe.c)(e),currentLocale:e.locales.locale,fileMenuOpen:Object(qe.p)(e),editMenuOpen:Object(qe.n)(e),errors:e.scratchGui.tw.compileErrors,errorsMenuOpen:Object(qe.o)(e),isPlayerOnly:e.scratchGui.mode.isPlayerOnly,isRtl:e.locales.isRtl,isUpdating:Object(G.u)(n),isShowingProject:Object(G.r)(n),locale:e.locales.locale,loginMenuOpen:Object(qe.r)(e),modeMenuOpen:Object(qe.t)(e),projectTitle:e.scratchGui.projectTitle,sessionExists:e.session&&void 0!==e.session.session,settingsMenuOpen:Object(qe.F)(e),username:a?a.username:null,userOwnsProject:t.authorUsername&&a&&t.authorUsername===a.username,vm:e.scratchGui.vm,mode220022BC:Object(fn.e)(e),mode1920:Object(fn.b)(e),mode1990:Object(fn.c)(e),mode2020:Object(fn.d)(e),modeNow:Object(fn.f)(e)}}),(e=>({onClickSeeInside:()=>e(Object(wn.d)(!1)),autoUpdateProject:()=>e(Object(G.b)()),onOpenTipLibrary:()=>e(Object(qt.G)()),onClickAccount:()=>e(Object(qe.w)()),onRequestCloseAccount:()=>e(Object(qe.f)()),onClickFile:()=>e(Object(qe.A)()),onRequestCloseFile:()=>e(Object(qe.i)()),onClickEdit:()=>e(Object(qe.y)()),onRequestCloseEdit:()=>e(Object(qe.g)()),onClickErrors:()=>e(Object(qe.z)()),onRequestCloseErrors:()=>e(Object(qe.h)()),onClickLogin:()=>e(Object(qe.C)()),onRequestCloseLogin:()=>e(Object(qe.j)()),onClickMode:()=>e(Object(qe.D)()),onRequestCloseMode:()=>e(Object(qe.k)()),onRequestOpenAbout:()=>e(Object(qe.u)()),onRequestCloseAbout:()=>e(Object(qe.e)()),onClickRestorePoints:()=>e(Object(qt.B)()),onClickSettings:()=>e(Object(qe.E)()),onClickSettingsModal:()=>{e(Object(qe.g)()),e(Object(qt.C)())},onRequestCloseSettings:()=>e(Object(qe.l)()),onClickNew:t=>{e(Object(G.B)(t)),e(Object(en.j)(null))},onClickRemix:()=>e(Object(G.A)()),onClickSave:()=>e(Object(G.v)()),onClickSaveAsCopy:()=>e(Object(G.D)()),onSeeCommunity:()=>e(Object(wn.d)(!0)),onSetTimeTravelMode:t=>e(Object(fn.g)(t))}))))(Kn)},function(e,t,n){\"use strict\";t.a={available:()=>document.fullscreenEnabled||document.webkitFullscreenEnabled,enabled:()=>void 0!==document.fullscreenElement?null!==document.fullscreenElement:void 0!==document.webkitFullscreenElement&&null!==document.webkitFullscreenElement,request:()=>{document.body.requestFullscreen?document.body.requestFullscreen():document.body.webkitRequestFullscreen&&document.body.webkitRequestFullscreen()},exit:()=>{document.exitFullscreen?document.exitFullscreen():document.webkitExitFullscreen&&document.webkitExitFullscreen()}}},,,,,,,,,,,,function(e,t,n){\"use strict\";n.r(t),n.d(t,\"default\",(function(){return s})),n.d(t,\"ScratchPaintReducer\",(function(){return c}));var a=n(1),o=n.n(a);let r;const i=()=>(r||(r=n(642)),r),s=e=>o.a.createElement(i().default,e);let l=!1;const c=(e,t)=>(l||\"scratch-gui/navigation/ACTIVATE_TAB\"!==t.type||1!==t.activeTabIndex||(l=!0),l?i().ScratchPaintReducer(e,t):{})},function(e,t){e.exports=\"iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAACXBIWXMAAAlyAAAJcgErz99GAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAYBQTFRF////AAAAgICAZmZmVVWASW1tYGCAVVVxTWaAVVWAW1ttWlp4VWNxUV55WVlzXFxwWGJ2VV5xW1t2WGFyWlpzWGB4VV10WmJ4V15yVVtzV110VWB3WV50V1x3VWB1V1x1VV9zWF12WF10VV50Vl91WFx1Vl9zVl52V191Vl13WWB1Vl11WF90V151WF92Vl91WF51Vl91WF50V192WF12V191Vl52WF10V151WF92V150V191WF11V152V150WF91WF51V111WF52WF11Vl51V151Vl50Vl11V151V150V111WF52V151V192V191V111V111V151V111V150V151Vl51V191V151V151Vl11Vl51V151WF51WF51V151WF51WF52V151V151V151V152V150V151V151V151V151Vl51V151Vl52V191Vl51V151V151V151V151V151V151V151V151V151V151V151V151V151V151V151V151V151ZcERRAAAAH90Uk5TAAECBQYHCAkKDA4REhMUGRobHB0fICEiJiosLS4vMDIzNDc5Oz0+QUZHSEpLTE5TV1laW11eX2NkZmdpa2xydHp+gIOFh4iOkJWZmpucn6GkpaytsLGys7W3vb7AxsfJzM/R2Nnb3t/g4ePk5ujp6+3u7/Dx9Pb3+Pn6+/z9/q0U6K8AAAHASURBVFjD7ZVXV8JAEEYDomAXEbuiggXBgr2jKNgLWLBiQcSOYEWU+esyG8WD7kYSXnzI95J7hsw9G7KZ5Tg5cuT8/1Q65nuyMugffQGAowKp7QonkCxI7Fet8f1wJa0/d+ezH14k9WtPICOB+QZYAqs/vKQS7laaNuPAEmjxzcwye1unXIveEKQkVdCNpecSenv+LlDCC5SGGgVeDaQ2RxdsA1NgCAIclyIdYC2STeuvA6ZA6Ufy4RrMpNhJE/SzBUU8duEGPUNapQmGBVZwQXAfb3MhnYoUcOME47oEtiG954kU5EQI25KP0yRSwHkIOxHvkSxiBTOElxGDSL1iBQ5I/vkBpAGxghXC5CMIsTaCkEBB1g0jCdS8IzVTBEMCAgvPtQk0EiqmCKwCAh9BP6Id6Zq2kTS3TEEhjxN42yHSFvVr7IiyBKo7pEt1AqvIsBmkf88NG2HGI/TFAJ7akdxYiwocFupym/v192usnrRX4FX3hrX1P2ZqmUd4pMUNf47lsRhDUI8lbxqD3fLIGOvOOAT06RwNjV9Hw8OPH/TGNA/silP4HkOSUkQGcLRFsoDLmT4P75k4OXLkyEkzH2pOgd/43vP4AAAAAElFTkSuQmCC\"},function(e,t,n){e.exports=n.p+\"static/assets/c216c70ef78cc80a1538a3accc6612af.svg\"},function(e){e.exports=JSON.parse('{\"ar\":{\"tw.footer.credits\":\"الاعتمادات\",\"tw.usernameModal.reset\":\"إعادة تعيين\"},\"ca\":{\"tw.alerts.creatingRestorePoint\":\"S\\'està creant un punt de restauració...\",\"tw.alerts.lostPeripheralConnection\":\"S\\'ha perdut la connexió a {extensionName}.\",\"tw.alerts.savedToDisk\":\"Desat al teu ordinador.\",\"tw.backpack.rename\":\"Nou nom:\",\"tw.blocks.PROCEDURES_DOCS\":\"Com utilitzar el retorn\",\"tw.blocks.PROCEDURES_RETURN\":\"retorna {v}\",\"tw.blocks.PROCEDURES_TO_REPORTER\":\"Canvia a Reporter\",\"tw.blocks.PROCEDURES_TO_STATEMENT\":\"Canvia a Declaració\",\"tw.blocks.buttonIsDown\":\"[MOUSE_BUTTON] el botó del ratolí premut?\",\"tw.blocks.lastKeyPressed\":\"última tecla premuda\",\"tw.blocks.mouseButton.middle\":\"(1) mig\",\"tw.blocks.mouseButton.primary\":\"(0) primari\",\"tw.blocks.mouseButton.secondary\":\"(2) secundari\",\"tw.blocks.openDocs\":\"Obre la Documentació\",\"tw.cantUseCloud\":\"Tot i que pots crear variables al núvol, no funcionaran tret que aquest projecte es carregui a Scratch o es converteixi amb una eina com ara {packager}.\",\"tw.changeUsername.cannotChangeWhileRunning\":\"El nom d\\'usuari no es pot modificar si el projecte s\\'està executant.\",\"tw.clipboard.danger\":\"Si el vostre porta-retalls conté dades com ara contrasenyes, és possible que el projecte les comparteixi amb altres persones o servidors.\",\"tw.clipboard.permission\":\"L\\'accés al porta-retalls podria no funcionar en alguns navegadors. Si s\\'hi permet, es permetran automàticament propers accessos al porta-retalls.\",\"tw.clipboard.title\":\"El projecte vol llegir les dades del vostre porta-retalls.\",\"tw.cloudProvider\":\"Servidor proporcionat per {name}.\",\"tw.cloudServers\":\"Trieu un servidor a prop vostre:\",\"tw.code\":\"Codi font\",\"tw.confirmIncompatibleExtension\":\"Aquesta extensió és incompatible amb Scratch. Els projectes fets amb ell no es poden penjar al lloc web del Scratch. Segur que vols activar-lo?\",\"tw.createdBy\":\"Creat per:\",\"tw.customCloudServer\":\"Utilitzant un servidor de variables al núvol personalitzat: {server}\",\"tw.customExtension.description\":\"Carregueu extensions personalitzades des d\\'una adreça URL, fitxers o el codi font en JavaScript.\",\"tw.customExtension.name\":\"Extensió personalitzada\",\"tw.customExtensionModal.load\":\"Carregar\",\"tw.customExtensionModal.promptText\":\"Enganxeu el codi font en JavaScript de l\\'extensió:\",\"tw.customExtensionModal.promptURL\":\"Introduïu l\\'adreça URL de l\\'extensió:\",\"tw.customExtensionModal.title\":\"Carregar una extensió personalitzada\",\"tw.customExtensionModal.trusted\":\"Aquesta extensió es carregarà sense sandbox perquè ve d\\'una font verificada.\",\"tw.customExtensionModal.unsandboxedWarning1\":\"Carregar les extensions sense el sandbox és perillós i no s\\'hauria d\\'activar si no sabeu el què feu.\",\"tw.customExtensionModal.unsandboxedWarning2\":\"Les extensions sense \\\\\"sandbox\\\\\" poden corrompre el vostre projecte, suprimir les vostres configuracions, obtenir contrasenyes i altres actes perillosos. Els desenvolupadors de {APP_NAME} no es fan responsables dels problemes que se\\'n poden derivar.\",\"tw.customExtensionModal.untrusted\":\"Les extensions d\\'URL que no siguin fiables es carregaran sempre amb sandbox per la vostra seguretat.\",\"tw.documentation\":\"Documentació\",\"tw.embed.persistent\":\"Si s\\'hi permet, es permetran automàticament més embeds de la mateixa pàgina.\",\"tw.embed.risks\":\"Encara que la incrustació estigui aïllada en un entorn segur, encara podrà accedir a informació del vostre dispositiu, com ara la vostra adreça IP i la localització relativa.\",\"tw.embed.title1\":\"El projecte vol inserir contingut HTML a l\\'escenari:\",\"tw.embed.title2\":\"El projecte vol inserir contingut remot a l\\'escenari:\",\"tw.favorite\":\"Preferit\",\"tw.featuredProjectsStudio\":\"Veure l\\'estudi a Scratch.\",\"tw.feedback\":\"Comentaris i errors interns\",\"tw.fetch.title\":\"El projecte vol connectar-se a aquesta pàgina web:\",\"tw.fonts.add\":\"Afegeix\",\"tw.fonts.custom.file\":\"Seleccioneu un fitxer de tipus de lletra des de l\\'ordinador:\",\"tw.fonts.custom.name\":\"Poseu un nom a la família tipogràfica:\",\"tw.fonts.custom1\":\"Afegeix un tipus de lletra des d\\'un fitxer\",\"tw.fonts.custom2\":\"Probablement, no funcioni a Scratch. Formats compatibles: {formats}.\",\"tw.fonts.delete\":\"Voleu suprimir \\\\\"{font}\\\\\"? Qualsevol vestit vectorial utilitzarà la font alternativa.\",\"tw.fonts.fallback\":\"Trieu un tipus de lletra alternatiu per utilitzar-lo si no es carrega o s\\'elimina:\",\"tw.fonts.list\":\"Tipus de lletra instal·lats:\",\"tw.fonts.none\":\"Encara no s\\'ha afegit cap família tipogràfica.\",\"tw.fonts.readError\":\"Error en llegir el fitxer de tipus de lletra: {error}\",\"tw.fonts.system\":\"Família tipogràfica del sistema\",\"tw.fonts.system.name\":\"Escriviu el nom de qualsevol família tipogràfica integrada a l\\'ordinador. És possible que el tipus de lletra no aparegui correctament per a tots.\",\"tw.fonts.system1\":\"Afegir una família tipogràfica del sistema\",\"tw.fonts.system2\":\"Podria funcionar a Scratch, però no apareixerà correctament per a tots.\",\"tw.fonts.title\":\"Tipus de lletra\",\"tw.footer.credits\":\"Crèdits\",\"tw.footer.documentation\":\"Documentació\",\"tw.footer.embed\":\"Incrustació web\",\"tw.footer.parameters\":\"Paràmetres d\\'URL\",\"tw.geolocate.permission\":\"Si es permet, és possible que el navegador us demani que autoritzeu l\\'accés a la ubicació.\",\"tw.geolocate.title\":\"El projecte vol obtenir la vostra ubicació.\",\"tw.gui.crashMessage.description\":\"Ho sentim molt, però sembla que la pàgina s\\'ha bloquejat. Actualitza la pàgina per tornar-ho a provar.\",\"tw.gui.defaultProjectTitle\":\"Projecte\",\"tw.guiDefaultTitle\":\"Executa projectes del Scratch més ràpid\",\"tw.home.credit\":\"Notes i crèdits\",\"tw.home.instructions\":\"Instruccions\",\"tw.input.tooltip\":\"Copia i enganxa un enllaç d\\'un projecte del Scratch aquí!\",\"tw.interpolationEnabled\":\"Interpolació\",\"tw.invalidParameters.clones\":\"El paràmetre d\\'URL \\\\\"clone\\\\\" no és correcte\",\"tw.invalidParameters.fps\":\"El paràmetre d\\'URL \\\\\"fps\\\\\" no és correcte\",\"tw.loadExtension.embedded\":\"El projecte vol carregar una extensió personalitzada amb aquest codi:\",\"tw.loadExtension.sandboxed\":\"Tot i que el codi s\\'emmagatzemarà al sandbox, encara podrà tenir accés a informació sobre el vostre dispositiu, com ara la vostra adreça IP i la ubicació general. Assegureu-vos de confiar en l\\'autor d\\'aquesta extensió abans de seguir.\",\"tw.loadExtension.unsandboxedWarning\":\"Carregar extensions sense sandbox és perillós. Poden corrompre el vostre projecte, suprimir les vostres configuracions, obtenir contrasenyes i altres actes perillosos. Els desenvolupadors de {APP_NAME} no es fan responsables dels problemes que se\\'n poden derivar.\",\"tw.loadExtension.url\":\"El projecte vol carregar una extensió personalitzada a partir d\\'aquesta URL:\",\"tw.loader.downloadingAssets\":\"Baixant assets ({complete}/{total}) …\",\"tw.loader.projectData\":\"S\\'està carregant el projecte...\",\"tw.menuBar.60off\":\"Desactiva el mode de 60 FPS\",\"tw.menuBar.60on\":\"Activa el mode de 60 FPS\",\"tw.menuBar.advanced\":\"Avançat\",\"tw.menuBar.changeUsername\":\"Canvia el nom d\\'usuari\",\"tw.menuBar.cloudOff\":\"Desactiva les variables al núvol\",\"tw.menuBar.cloudOn\":\"Activa les variables al núvol\",\"tw.menuBar.cloudUnavailable\":\"Les variables al núvol no estan disponibles\",\"tw.menuBar.cloudUnavailableAlert\":\"No es poden utilitzar variables del núvol, probablement perquè heu obert l\\'editor.\",\"tw.menuBar.desktopSettings\":\"Configuració de l\\'escriptori\",\"tw.menuBar.moreSettings\":\"Configuració avançada\",\"tw.menuBar.newFramerate\":\"Nova velocitat de fotogrames:\",\"tw.menuBar.newWindow\":\"Nova finestra\",\"tw.menuBar.package\":\"Empaquetar projecte\",\"tw.menuBar.reportError2\":\"Això és un error. Informeu-ho si us plau.\",\"tw.menuBar.restorePoints\":\"Punts de restauració\",\"tw.menuBar.saveAs\":\"Desa com a {file}\",\"tw.menuBar.seeInside\":\"Veure per dins\",\"tw.moreCloud\":\"Més informació sobre les variables al núvol.\",\"tw.notify.permission\":\"Si es permet, és possible que es demani que habiliteu les notificacions al vostre navegador i es permetran més notificacions de forma automàtica.\",\"tw.notify.title\":\"El projecte demana mostrar notificacions.\",\"tw.oldDownload\":\"Desa com fitxer separat...\",\"tw.opcode.2000\":\"dies des del 2000\",\"tw.opcode.mousedown\":\"ratolí clicat?\",\"tw.opcode.mousex\":\"ratolí x\",\"tw.opcode.mousey\":\"ratolí y\",\"tw.openAdvanced\":\"Obrir la configuració avançada\",\"tw.openWindow.dangerous\":\"Els desenvolupadors de {APP_NAME} no han revisat aquest lloc web. Pot contenir codi perillós o maliciós.\",\"tw.openWindow.title\":\"El projecte vol obrir una finestra o una pestanya amb l\\'URL:\",\"tw.paint.alpha\":\"Opacitat\",\"tw.paint.fonts.more\":\"Afegir més tipus de lletra...\",\"tw.privacy\":\"Política de privacitat\",\"tw.recordAudio.permission\":\"Si es permet, és possible que se us demani que habiliteu l\\'accés al micròfon des del vostre navegador, i es permetran més accessos al micròfon de forma automàtica.\",\"tw.recordAudio.title\":\"El projecte vol gravar àudio del micròfon. Això pot incloure transcripció de text o dades d\\'arrel de l\\'àudio. És possible que el projecte comparteixi l\\'àudio amb altres persones o servidors.\",\"tw.recordVideo.permission\":\"Si es permet, és possible que se us demani que habiliteu l\\'accés a la càmera des del vostre navegador, i es permetran més accessos a la càmera de forma automàtica.\",\"tw.recordVideo.title\":\"El projecte vol gravar vídeo des de la càmera. És possible que el projecte comparteixi imatges amb altres persones o servidors.\",\"tw.redirect.dangerous\":\"Els desenvolupadors de {APP_NAME} no han revisat aquest lloc web. Pot contenir codi perillós o maliciós.\",\"tw.redirect.title\":\"El projecte vol reencaminar aquesta pestanya a l\\'URL:\",\"tw.restorePoints.1minute\":\"cada minut\",\"tw.restorePoints.assets\":\"{n} elements\",\"tw.restorePoints.deleteAll\":\"Esborra\\'ls tots\",\"tw.restorePoints.description\":\"{APP_NAME} realitza punts de restauració periòdics del vostre projecte al vostre ordinador per recuperar-lo si oblideu desar o es produeix un error. Tanmateix, el vostre ordinador pot eliminar aquests punts de restauració en qualsevol moment. NO CONFIEU EXCLUSIVAMENT en aquesta funció.\",\"tw.restorePoints.empty\":\"No s\\'ha trobat cap punt de restauració.\",\"tw.restorePoints.error\":\"S\\'ha produït un error en carregar el punt de restauració: {error}\",\"tw.restorePoints.intervalOption\":\"Els punts de restauració es creen {time}.\",\"tw.restorePoints.loading\":\"Carregant...\",\"tw.restorePoints.minutes\":\"cada {n} minuts\",\"tw.restorePoints.never\":\"mai\",\"tw.restorePoints.off\":\"Desactivar els punts de restauració és perillós.\",\"tw.restorePoints.size\":\"Estimació de l\\'emmagatzematge utilitzat: {size}\",\"tw.restorePoints.size2\":\"Només es desen una única vegada les disfresses o els sons utilitzats per diversos punts de restauració.\",\"tw.restorePoints.title\":\"Punts de restauració\",\"tw.sample\":\"Projecte d\\'exemple\",\"tw.saveAs\":\"Desa com a...\",\"tw.saveTo\":\"Desa a {file}\",\"tw.scratchUnsafeCloud\":\"Si fass aquesta variable al núvol, el projecte superarà el límit de {number} variables de l\\'Scratch i algunes variables no funcionaran si penges el projecte a l\\'Scratch.\",\"tw.securityManager.allow\":\"Permet\",\"tw.securityManager.deny\":\"Denega\",\"tw.securityManager.title\":\"Seguretat de l\\'Extensió\",\"tw.securityManager.trust\":\"Si s\\'hi permet, es permetran automàticament més sol·licituds al mateix lloc web.\",\"tw.securityManager.why\":\"Es pot utilitzar per descarregar imatges, so, implementar multijugador, accedir a una API o amb propòsits maliciosos. Això compartirà la vostra adreça IP, la ubicació generalitzada, i altres dades amb el lloc web.\",\"tw.settingsModal.customStageSize\":\"Mida personalitzada de l\\'escenari:\",\"tw.settingsModal.customStageSizeHelp\":\"Canvia la mida de l\\'escenari Scratch de 480x360 a una altra mida. Prova 640x360 per fer que l\\'escenari sigui panoràmic. Molt pocs projectes ho gestionen correctament.\",\"tw.settingsModal.dangerZone\":\"Zona perillosa\",\"tw.settingsModal.disableCompiler\":\"Desactiva el compilador\",\"tw.settingsModal.featured\":\"Destacat\",\"tw.settingsModal.fps\":\"60 FPS (FPS Personalitzats)\",\"tw.settingsModal.fpsHelp\":\"Executa scripts 60 vegades per segon en lloc de 30. La gran majoria dels projectes no executaran correctament amb aquesta funció. Hauríes de provar la interpolació amb el mode 60 FPS desactivat si és el cas.{customFramerate}.\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Fes click per utilitzar una velocitat de fotogrames diferent de 30 o 60\",\"tw.settingsModal.help\":\"Feu click per obtenir ajuda\",\"tw.settingsModal.highQualityPen\":\"Llapis d\\'alta qualitat\",\"tw.settingsModal.highQualityPenHelp\":\"Permet que els projectes amb l\\'extensiu de llapis es mostrin a resolucions més altes i desactiva alguns arrodoniments de coordenades a l\\'editor. No tots els projectes es beneficien d\\'aquesta eina i pot afectar el rendiment.\",\"tw.settingsModal.infiniteClones\":\"Clons infinits\",\"tw.settingsModal.infiniteClonesHelp\":\"Desactiva el límit de 300 clons d\\'Scratch.\",\"tw.settingsModal.interpolation\":\"Interpolació\",\"tw.settingsModal.interpolationHelp\":\"Fa que els projectes semblin més suaus i fluids interpolant el moviment dels personatges. La interpolació no s\\'ha d\\'utilitzar en projectes 3D, traçadors de raigs/raytracers, projectes amb l\\'extensió de llapis i projectes amb lag, ja que la interpolació farà que funcionin més lent sense que semblin suaus.\",\"tw.settingsModal.largeStageWarning\":\"No es recomana utilitzar una mida d\\'escenari personalitzada tan gran! En comptes d\\'això, utilitza una mida inferior amb la mateixa relació d\\'aspecte i deixa que el mode de pantalla completa l\\'augmenti perquè coincideixi amb la pantalla de l\\'usuari.\",\"tw.settingsModal.removeFencing\":\"Eliminar les limitacions de pantalla\",\"tw.settingsModal.removeFencingHelp\":\"Permet que els personatges es moguin fora de la pantalla, siguin tan grans o tan petits com vulguin, i fa que els blocs que es pugin fer click funcionin fora de la pantalla.\",\"tw.settingsModal.removeLimits\":\"Elimina els límits\",\"tw.settingsModal.removeMiscLimits\":\"Treure límits miscel·lanis\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Elimina els límits d\\'efectes de so i els límits de mida del llapis.\",\"tw.settingsModal.storeProjectOptions\":\"Emmagatzema la configuració al projecte\",\"tw.settingsModal.storeProjectOptionsHelp\":\"Emmagatzema la configuració seleccionada al projecte perquè s\\'apliquin automàticament quan TurboWarp carregui aquest projecte. El temporitzador Warp i el \\\\\"Desactiva el compilador\\\\\" no es desaran.\",\"tw.settingsModal.title\":\"Configuració avançada\",\"tw.settingsModal.warpTimer\":\"Temporitzador Warp\",\"tw.settingsModal.warpTimerHelp\":\"Fa que els scripts comprovin si estan encallars en un bucle llarg o infinit i s\\'executen a una velocitat de fotogrames baixa en lloc d\\'enganxar-se fins que s\\'acabi el bucle. Això corregeix la majoria de crashes, però té un impacte significatiu en el rendiment, de manera que només està activat de manera predeterminada a l\\'editor.\",\"tw.soundEditorNotSupported\":\"Aquest navegador no és compatible amb l\\'editor de so.\",\"tw.spriteSelectorItem.rename\":\"renombra\",\"tw.stereo\":\"Estèreo\",\"tw.stereoAlert\":\"Al editar aquest so estèreo és convertirà irreversiblement a mono.\",\"tw.studioview.authorAttribution\":\"fet per {author}\",\"tw.studioview.error\":\"S\\'ha produït un error al carregar la següent pàgina dels projectes.\",\"tw.studioview.hoverText\":\"{title}, fet per {author}\",\"tw.tooLarge\":\"És probable que aquest so sigui molt pesat per poder carregar-lo a l\\'Scratch.\",\"tw.twExtension.description\":\"Nous blocs estranys.\",\"tw.unfavorite\":\"No preferit\",\"tw.unshared.2\":\"Per a més informació, visita: {link}\",\"tw.unshared.bug\":\"Si realment aquest projecte s\\'ha compartit, si us plau informeu del error.\",\"tw.unshared.cache\":\"Si el projecte s\\'ha compartit recentment, aquest avís pot trigar uns minuts en desaparèixer.\",\"tw.unshared2.1\":\"Els projectes sense compartir ja no es poden veure.\",\"tw.usernameModal.help\":\"Aquest valor s\\'emmagatzemarà a les del vostre explorador. Es pot registrar quan interaccionis amb projectes que contenen variables al núvol.\",\"tw.usernameModal.help2\":\"Els valors que no corresponen a un compte del Scratch vàlid normalment seran rebutjats pel nostre servidor de variables al núvol. Us recomanem que ho deixis tal qual o que el canvïs pel teu nom d\\'usuari del Scratch.\",\"tw.usernameModal.mustChange\":\"Ho sentim, el servidor de variables al núvol creu que el teu nom d\\'usuari pot ser insegur. Si us plau, canvia-ho per una altre o {resetIt}.\",\"tw.usernameModal.mustChange.resetIt\":\"reseteja-ho (recomanat)\",\"tw.usernameModal.new\":\"Nou nom d\\'usuari:\",\"tw.usernameModal.reset\":\"Restableix\",\"tw.usernameModal.title\":\"Canvia el nom d\\'usuari\",\"tw.usesCloudVariables\":\"Aquest projecte utilitza variables al núvol.\",\"tw.usesCloudVariables2\":\"Les variables al núvol de {APP_NAME} no estan connectades a Scratch. Qualsevol pot {changeTheirUsername} per qualsevol, així que aneu amb compte amb la suplantació d\\'identitat.\",\"tw.usesCloudVariables2.change\":\"canviar el seu nom d\\'usuari\",\"tw.viewFeaturedProjects\":\"Fes click per veure els projectes destacats.\",\"tw.viewOnScratch\":\"Veure a l\\'Scratch\"},\"cs\":{\"tw.alerts.creatingRestorePoint\":\"Vytvářím bod obnovení...\",\"tw.alerts.savedToDisk\":\"Uloženo na váš počítač.\",\"tw.backpack.rename\":\"Nové jméno:\",\"tw.blocks.addons\":\"Doplňky\",\"tw.blocks.buttonIsDown\":\"[MOUSE_BUTTON]tlačítko myši stisknuto?\",\"tw.blocks.lastKeyPressed\":\"poslední stisknutá klávesa\",\"tw.blocks.mouseButton.middle\":\"(1) střední\",\"tw.blocks.mouseButton.primary\":\"(0) hlavní\",\"tw.blocks.mouseButton.secondary\":\"(2) sekundární\",\"tw.blocks.openDocs\":\"Otevřít dokumentaci\",\"tw.changeUsername.cannotChangeWhileRunning\":\"Jméno nemůže být změněno, když běží projekt.\",\"tw.code\":\"Zdrojový kód\",\"tw.confirmIncompatibleExtension\":\"Toto rozšíření není kompatibilní se Scratchem. Projekty vytvořené s tímto rozšířením nemůžou být nahrány na stránku Scratch. Jste si jisti, že chcete toto rozšíření aktivovat?\",\"tw.customExtension.name\":\"Vlastní rozšíření\",\"tw.featuredProjectsStudio\":\"Zhlédnout studio na Scratchi.\",\"tw.feedback\":\"Zpětná vazba & chyby\",\"tw.footer.credits\":\"Příspěvky\",\"tw.footer.embed\":\"Vkládání\",\"tw.footer.parameters\":\"Parametry odkazu\",\"tw.fps\":\"{framerate}FPS\",\"tw.gui.defaultProjectTitle\":\"Projekt\",\"tw.guiDefaultTitle\":\"Zrychlit projekty Scratch\",\"tw.home.credit\":\"Poznámky a příspěvky\",\"tw.home.instructions\":\"Instrukce\",\"tw.input.tooltip\":\"Sem zkopírujte a vložte link projektu Scratch!\",\"tw.interpolationEnabled\":\"Interpolace\",\"tw.invalidParameters.clones\":\"\\\\\"clone\\\\\" parametr odkazu je neplatný\",\"tw.invalidParameters.fps\":\"\\\\\"fps\\\\\" parametr odkazu je neplatný\",\"tw.invalidProject.title\":\"Chyba\",\"tw.loader.downloadingAssets\":\"Stahuji soubory ({complete}/{total}) ...\",\"tw.loader.projectData\":\"Načítám projekt ...\",\"tw.menuBar.60off\":\"Vypnout režím 60 FPS\",\"tw.menuBar.60on\":\"Zapnout režim 60 FPS\",\"tw.menuBar.addons\":\"Doplňky\",\"tw.menuBar.advanced\":\"Pokročilé\",\"tw.menuBar.changeUsername\":\"Změnit jméno\",\"tw.menuBar.cloudOff\":\"Vypnout cloudové proměnné\",\"tw.menuBar.cloudOn\":\"Zapnout cloudové proměnné\",\"tw.menuBar.cloudUnavailable\":\"Cloudové proměnné nejsou dostupné\",\"tw.menuBar.cloudUnavailableAlert\":\"Nelze použít cloudové proměnné, protože jste pravděpodobně otevřeli editor.\",\"tw.menuBar.compileError\":\"{sprite}:{error}\",\"tw.menuBar.moreSettings\":\"Pokročilé nastavení\",\"tw.menuBar.newFramerate\":\"Nová snímková frekvence:\",\"tw.menuBar.reportError2\":\"Toto je chyba, prosíme, nahlaste ji.\",\"tw.menuBar.saveAs\":\"Uložit jako {file}\",\"tw.menuBar.seeInside\":\"Pohlédnout dovnitř\",\"tw.paint.alpha\":\"Průhlednost\",\"tw.privacy\":\"Zásady ochrany osobních údajů\",\"tw.saveAs\":\"Uložit jako...\",\"tw.saveTo\":\"Uložit jako {file}\",\"tw.settingsModal.customStageSize\":\"Vlastní velikost scény\",\"tw.settingsModal.customStageSizeHelp\":\"Změní velikost scény Scratche z 480x360 na něco jiného. Zkuste 640x360, aby se změnilo rozlišení na širokoúhlé. Velmi málo projektů to zvládne.\",\"tw.settingsModal.dangerZone\":\"Zóna nebezpečí\",\"tw.settingsModal.disableCompiler\":\"Deaktivovat kompilátor\",\"tw.settingsModal.featured\":\"Vybrané\",\"tw.settingsModal.fps\":\"60 FPS (Vlastní FPS)\",\"tw.settingsModal.fpsHelp\":\"Spouští skripty 60krát za sekundu místo 30krát za sekundu. Většina projektů nebude fungovat správně s tímto nastavením. Měli byste zkusit interpolaci s deaktivovaným režimem 60 FPS, jestli se toto děje. {customFramerate}.\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Klikněte sem pro použití jiné snímkové frekvence než 30 nebo 60\",\"tw.settingsModal.help\":\"Klikněte sem pro pomoc\",\"tw.settingsModal.highQualityPen\":\"Pero s vysokým rozlišením\",\"tw.settingsModal.highQualityPenHelp\":\"Povolí projekty s perem, aby kreslili na větších rozlišeních a deaktivuje některé zaokrouhlování souřadnic v editoru. Ne všechny projekty mají výhodu v tomto nastavení a může to ovlivnit výkon. \",\"tw.settingsModal.infiniteClones\":\"Nekonečné klony\",\"tw.settingsModal.infiniteClonesHelp\":\"Deaktivuje limit 300 klonů Scratche\",\"tw.settingsModal.interpolation\":\"Interpolace\",\"tw.settingsModal.interpolationHelp\":\"Zrychlí projekty interpolací pohybu postav. Interpolace by se neměla používat na 3D projektech, raytracerech, projekty s perem a zpomalených projektech, protože je interpolace zpomalí bez jejich zrychlení.\",\"tw.settingsModal.largeStageWarning\":\"Používání vlastní obrovské velikosti scény není doporučeno! Místo toho používejte menší velikost se stejnými poměry stran a nechte režim plné obrazovky zvětšit rozlišení, aby se srovnalo s displejem uživatele.\",\"tw.settingsModal.removeFencing\":\"Odstranit hranice\",\"tw.settingsModal.removeLimits\":\"Odstranit limity\",\"tw.settingsModal.removeMiscLimits\":\"Odstranit různé limity\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Odstraní limity zvukových efektů a velikosti pera.\",\"tw.settingsModal.storeProjectOptions\":\"Ukládat nastavení v projektu\",\"tw.settingsModal.title\":\"Pokročilé nastavení\",\"tw.settingsModal.warpTimer\":\"Warp časovač\",\"tw.settingsModal.warpTimerHelp\":\"Skripty zkontrolují, jestli nejsou zaseklé ve dlouhém nebo nekonečném cyklu a poběží na malé snímkové frekvenci místo zaseknutí než se cyklus dokončí. Toto opraví většinu zastavení, ale má velký vliv na výkon, takže toto je jen výchozně aktivované v editoru.\",\"tw.spriteSelectorItem.rename\":\"přejmenovat\",\"tw.studioview.authorAttribution\":\"od {author}\",\"tw.studioview.error\":\"Při načítání další stránky projektů nastala chyba.\",\"tw.studioview.hoverText\":\"{title} od {author}\",\"tw.usernameModal.help\":\"Tato hodnota bude uložena ve vašem prohlížeči. Může být zapsaná, když upravujete projekty které mají cloudové proměnné.\",\"tw.usernameModal.mustChange\":\"Omlouváme se, server cloudových proměň si myslí, že vaše jméno není bezpečné. Prosíme, změňte jméno nebo {resetIt}.\",\"tw.usernameModal.mustChange.resetIt\":\"obnovit (doporučeno)\",\"tw.usernameModal.reset\":\"Obnovit\",\"tw.usernameModal.title\":\"Změnit jméno\",\"tw.viewFeaturedProjects\":\"Klikněte sem pro zhlédnutí vybraných projektů.\",\"tw.viewOnScratch\":\"Zhlédnout projekt na Scratchi\"},\"de\":{\"tw.accent.blue\":\"Blau\",\"tw.accent.purple\":\"Lila\",\"tw.accent.rainbow\":\"Regenbogen\",\"tw.accent.red\":\"Rot\",\"tw.alerts.creatingRestorePoint\":\"Wiederherstellungspunkt wird erstellt...\",\"tw.alerts.lostPeripheralConnection\":\"Verbindung zu {extensionName} verloren.\",\"tw.alerts.restorePointError\":\"Der Wiederherstellpunkt konnte nicht erstellt werden\",\"tw.alerts.restorePointSuccess\":\"Siehe \\\\\"Datei\\\\\" für die Wiederherstellpunkte\",\"tw.alerts.savedToDisk\":\"Auf deinem Computer gespeichert.\",\"tw.backpack.rename\":\"Neuer Name:\",\"tw.blockColors.custom\":\"In Addon-Einstellungen anpassen\",\"tw.blockColors.dark\":\"Dunkel (Beta)\",\"tw.blockColors.highContrast\":\"Hoher Kontrast\",\"tw.blocks.PROCEDURES_DOCS\":\"Wie funktioniert \\\\\"gebe aus\\\\\"?\",\"tw.blocks.PROCEDURES_RETURN\":\"gebe {v} aus \",\"tw.blocks.PROCEDURES_TO_REPORTER\":\"In Wertblock umwandeln\",\"tw.blocks.PROCEDURES_TO_STATEMENT\":\"In Stapelblock umwandeln\",\"tw.blocks.buttonIsDown\":\"[MOUSE_BUTTON] Maustaste gedrückt?\",\"tw.blocks.lastKeyPressed\":\"zuletzt gedrückte Taste\",\"tw.blocks.mouseButton.middle\":\"(1) mittlere\",\"tw.blocks.mouseButton.primary\":\"(0) linke\",\"tw.blocks.mouseButton.secondary\":\"(2) rechte\",\"tw.blocks.openDocs\":\"Dokumentation öffnen\",\"tw.browserModal.desktopSettings\":\"Desktopeinstellungen öffnen\",\"tw.browserModal.desktopTitle\":\"System nicht unterstützt\",\"tw.browserModal.webgl1\":\"{APP_NAME} benötigt WebGL, aber anscheinend wird es von deinem Computer nicht unterstützt. Dies ist meist ein temporärer Fehler, der durch einen Neustart des Computers behoben werden kann.\",\"tw.browserModal.webglBrowser\":\"Nutze eine aktuelle Version von Chrome, Firefox oder Safari und stelle sicher, dass deine Grafiktreiber aktuell sind. Du kannst auch versuchen, die \\\\\"Grafikbeschleunigung\\\\\" bzw. \\\\\"Hardwarebeschleunigung\\\\\" in den Browsereinstellungen ein- bzw. auszuschalten.\",\"tw.browserModal.webglDesktop\":\"Du kannst auch versuchen, die \\\\\"Grafikbeschleunigung\\\\\" in den Desktopeinstellungen ein- bzw. auszuschalten:\",\"tw.cantUseCloud\":\"Obwohl du Cloud-Variablen erstellen kannst, werden sie bis zum Hochladen auf Scratch oder auf einem Tool wie dem {packager} nicht funktionieren.\",\"tw.changeUsername.cannotChangeWhileRunning\":\"Der Benutzername kann nicht geändert werden, während das Projekt ausgeführt wird.\",\"tw.clipboard.danger\":\"Wenn deine Zwischenablage Sachen wie Passwörter einthält, könnte das Projekt in der Lage sein, sie mit anderen Nutzern oder Servern zu teilen.\",\"tw.clipboard.permission\":\"Der Zugriff auf die Zwischenablage könnte in manchen Browsern nicht funktionieren. Wenn zugelassen, werden zukünftige Zugriffe automatisch zugelassen.\",\"tw.clipboard.title\":\"Das Projekt möchte auf den Inhalt deiner Zwischenablage zugreifen.\",\"tw.cloudProvider\":\"Server bereitgestellt von {name}.\",\"tw.cloudServers\":\"Wähle einen Server in deiner Nähe:\",\"tw.code\":\"Quellcode\",\"tw.confirmIncompatibleExtension\":\"Diese Erweiterung ist nicht mit Scratch kompatibel. Projekte, die damit entwickelt werden, können nicht auf die Scratch-Website geladen werden. Bist du sicher, dass du sie aktivieren willst?\",\"tw.createdBy\":\"Entwickelt von:\",\"tw.customCloudServer\":\"Benutzerdefinierter Cloud-Variablen-Server in Verwendung: {server}\",\"tw.customExtension.description\":\"Lade eigene Erweiterungen von URLs, Dateien oder JavaScript-Quellcode.\",\"tw.customExtension.name\":\"Benutzerdefinierte Erweiterung\",\"tw.customExtensionModal.file\":\"Dateien\",\"tw.customExtensionModal.load\":\"Laden\",\"tw.customExtensionModal.promptFile\":\"Ziehe die JavaScript-Dateien der Erweiterung hierher:\",\"tw.customExtensionModal.promptText\":\"Füge den JavaScript-Quellcode mit der Erweiterung ein:\",\"tw.customExtensionModal.promptURL\":\"URL der Erweiterung eingeben:\",\"tw.customExtensionModal.title\":\"Benutzerdefinierte Erweiterung laden\",\"tw.customExtensionModal.trusted\":\"Diese Erweiterung wird ohne Sandbox geladen, weil sie aus einer vertrauenswürdigen Quelle stammt.\",\"tw.customExtensionModal.unsandboxed\":\"Ohne Sandbox ausführen\",\"tw.customExtensionModal.unsandboxedWarning1\":\"Das Laden von Erweiterungen ohne Sandbox ist gefährlich und du solltest es nur tun, wenn du dir sicher bist.\",\"tw.customExtensionModal.unsandboxedWarning2\":\"Erweiterungen ohne Sandbox können dein Projekt beschädigen, deine Einstellungen löschen, deine Passwörter phishen und sonstige schlechte Aktivitäten. Die Entwickler von {APP_NAME} sind nicht verantwortlich für jegliche Probleme.\",\"tw.customExtensionModal.untrusted\":\"Erweiterungen von Unvertrauenswürdigen URLs werden zur Sicherheit immer mit der Sandbox geladen.\",\"tw.customReporters.description\":\"Erlaubt es, eigenen Blöcken Werte ausgeben zu lassen und als Wertblöcke zu funktionieren.\",\"tw.customReporters.name\":\"Eigene Wertblöcke\",\"tw.darkMode\":\"Zu hellem Modus wechseln\",\"tw.desktopCloud\":\"In der Desktop-App werden Cloud-Variablen nur zwischen den Fenstern der Desktop-App synchronisiert. Lade das Projekt auf Scratch hoch oder nutze ein Tool wie den {packager}, um sie weltweit zu synchronisieren. \",\"tw.documentation\":\"Dokumentation\",\"tw.download.danger\":\"Diese Datei wurde nicht von den {APP_NAME}-Entwicklern geprüft.\",\"tw.download.executable\":\"Dies ist ein ausführbares Dateiformat, das schädlichen Code enthalten könnte.\",\"tw.download.file\":\"Dieses Projekt möchte eine Datei auf deinen Computer herunterladen. Es wird als {name} in deinem \\\\\"Downloads\\\\\"-Ordner gespeichert.\",\"tw.embed.persistent\":\"Wenn zugelassen, werden künftige EInbettungen zur selben Seite automatisch zugelassen.\",\"tw.embed.risks\":\"Während die Einbettung isoliert sein wird, wird sie weiterhin Zugriff auf Geräteinformationen wie deine IP-Adresse und Region haben.\",\"tw.embed.title1\":\"Dieses Projekt möchte HTML-Inhalt über die Bühne einbetten:\",\"tw.embed.title2\":\"Dieses Projekt möchte eine andere Seite über die Bühne einbetten:\",\"tw.extension.faceSensing.description\":\"Erkenne Gesichter mit der Kamera.\",\"tw.extension.faceSensing.name\":\"Gesichtserkennung\",\"tw.extensionGallery.error\":\"Erweiterungen-Sammlung konnte nicht laden werden. Besuche extensions.turbowarp.org, um mehr Erweiterungen zu finden.\",\"tw.extensionGallery.loading\":\"Erweiterungen werden geladen…\",\"tw.extensionGallery.more\":\"Erfahre mehr auf extensions.turbowarp.org.\",\"tw.extensionGallery.name\":\"Erweiterungsgalerie von {APP_NAME}\",\"tw.favorite\":\"Zu Favoriten hinzufügen \",\"tw.featuredProjectsStudio\":\"Studio auf Scratch anzeigen.\",\"tw.feedback\":\"Feedback & Fehler\",\"tw.feedbackButton\":\"Feedback für {APP_NAME}\",\"tw.fetch.title\":\"Das Projekt versucht, sich mit dieser Website zu verbinden:\",\"tw.fileInput.none\":\"Keine Dateien ausgewählt.\",\"tw.fileInput.selected\":\"Ausgewählt: {names}\",\"tw.fonts.add\":\"Hinzufügen\",\"tw.fonts.custom.file\":\"Wähle eine Schriftartdatei von deinem Computer aus:\",\"tw.fonts.custom.name\":\"Gebe der Schriftart einen Namen:\",\"tw.fonts.custom1\":\"Schriftart von einer Datei hinzufügen\",\"tw.fonts.custom2\":\"Wird normalerweise nicht auf Scratch funktionieren. Erlaubte Formate: {formats}\",\"tw.fonts.delete\":\"Bist du dir sicher, dass du \\\\\"{font}\\\\\" löschen willst? Alle Vektorkostüme werden stattdessen die Ersatzschriftart nutzen.\",\"tw.fonts.fallback\":\"Wähle eine Schriftart, die angezeigt werden soll, wenn die Schriftart nicht geladen werden kann oder gelöscht wird:\",\"tw.fonts.list\":\"Installierte Schriftarten:\",\"tw.fonts.none\":\"Es wurden noch keine Schriftarten hinzugefügt.\",\"tw.fonts.readError\":\"Schriftartdatei konnte nicht gelesen werden: {error}\",\"tw.fonts.system\":\"Systemschriftart\",\"tw.fonts.system.name\":\"Tippe den Namen einer Schriftart, die auf deinem Computer installiert ist. Die Schriftart könnte nicht für jeden richtig aussehen.\",\"tw.fonts.system1\":\"Systemschriftart hinzufügen\",\"tw.fonts.system2\":\"Kann auf Scratch funktionieren, wird aber nicht für jeden richtig aussehen\",\"tw.fonts.title\":\"Schriftarten\",\"tw.footer.credits\":\"Danksagungen\",\"tw.footer.disclaimer\":\"{APP_NAME} ist nicht mit Scratch, dem Scratch Team oder der Scratch Foundation assoziiert.\",\"tw.footer.documentation\":\"Dokumentation\",\"tw.footer.embed\":\"Einbettung\",\"tw.footer.parameters\":\"URL-Parameter\",\"tw.footer.scratchDisclaimer\":\"Scratch ist ein Projekt der Scratch Foundation. Es ist unter {scratchDotOrg} kostenlos verfügbar.\",\"tw.geolocate.permission\":\"Wenn du das erlaubt hast, könntest du von deinem Browser angefragt werden, Standortzugriff zu erlauben.\",\"tw.geolocate.title\":\"Dieses Projekt will deinen Standort einsehen.\",\"tw.gui.crashMessage.description\":\"Es tut uns leid, anscheinend ist die Seite abgestürzt. Bitte aktualisiere die Seite und versuche es erneut.\",\"tw.gui.defaultProjectTitle\":\"Projekt\",\"tw.guiDefaultTitle\":\"Scratch-Projekte schneller ausführen\",\"tw.home.credit\":\"Anmerkungen und Danksagungen\",\"tw.home.description\":\"{APP_NAME} ist eine Scratch-Modifikation, die Projekte in JavaScript kompiliert, damit sie sehr schnell ausgeführt werden. Probiere es aus, indem du die Projekt-ID oder URL oben einfügst oder eines der vorgestellten Projekte unten auswählst.\",\"tw.home.instructions\":\"Anleitung\",\"tw.input.tooltip\":\"Kopiere den Link zu einem Scratch-Projekt und füge ihn hier ein!\",\"tw.invalidParameters.clones\":\"URL-Parameter \\\\\"clone\\\\\" ist ungültig\",\"tw.invalidParameters.fps\":\"URL-Parameter \\\\\"fps\\\\\" ist ungültig\",\"tw.invalidProject.error\":\"Projekt konnte nicht geladen werden:\",\"tw.invalidProject.options\":\"Versuche, eine frühere Version des Projekts aus automatischen Wiederherstellungspunkten oder anderen Back-ups wiederherzustellen.\",\"tw.invalidProject.reportIt\":\"melde es\",\"tw.invalidProject.restorePoints\":\"Wiederherstellungspunkte anzeigen\",\"tw.invalidProject.sb3fix\":\"Verwende sb3fix, um das Projekt wiederherzustellen\",\"tw.invalidProject.title\":\"Fehler\",\"tw.invalidProject.validationError\":\"Dieser Fehler bedeutet meistens, dass ein kleiner Teil des Projekts beschädigt wurde, aber der Rest noch gültig ist. Dieses Problem kann oft leicht behoben werden, also {reportIt}.\",\"tw.invalidProject.zipCorruption\":\"Dieser Fehler bedeutet oft, dass die Datei beschädigt wurde, möglicherweise aufgrund eines fehlerhaften Speichergeräts, eines Stromausfalls oder des Trennens eines USB-Laufwerks ohne Auswerfen. Versuche {usingSb3fix}, da es diese Art von Fehler beheben kann.\",\"tw.lightMode\":\"Zu dunklem Modus wechseln\",\"tw.loadExtension.embedded\":\"Das Projekt will eine benutzerdefinierte Erweiterung laden, die folgenden Code hat:\",\"tw.loadExtension.sandboxed\":\"Obwohl der Code in der Sandbox ausgeführt wird, wird sie weiterhin Zugang zu Geräteinformationen wie deine IP-Adresse und ungefähre Position haben. Stelle sicher, dass du dem Entwickler dieser Erweiterung vertraust, bevor du fortfährst.\",\"tw.loadExtension.unsandboxed\":\"Ohne Sandbox ausführen\",\"tw.loadExtension.unsandboxedWarning\":\"Erweiterungen ohne Sandbox sind gefährlich. Sie können dann dein Projekt beschädigen, deine Einstellungen löschen, deine Passwörter phishen und sonstige schlechte Aktivitäten. Die Entwickler von {APP_NAME} sind nicht verantwortlich für jegliche Probleme.\",\"tw.loadExtension.url\":\"Das Projekt will eine benutzerdefinierte Erweiterung laden, die folgende URL hat:\",\"tw.loader.downloadingAssets\":\"Ressourcen werden heruntergeladen ({complete}/{total}) ...\",\"tw.loader.loadingAssets\":\"Ressourcen werden geladen ({complete}/{total}) ...\",\"tw.loader.projectData\":\"Projekt wird geladen ...\",\"tw.menuBar.60off\":\"60 FPS-Modus ausschalten\",\"tw.menuBar.60on\":\"60 FPS-Modus einschalten\",\"tw.menuBar.accent\":\"Akzent\",\"tw.menuBar.advanced\":\"Erweitert\",\"tw.menuBar.blockColors\":\"Blockfarben\",\"tw.menuBar.changeUsername\":\"Benutzernamen ändern\",\"tw.menuBar.cloudOff\":\"Cloud-Variablen ausschalten\",\"tw.menuBar.cloudOn\":\"Cloud-Variablen einschalten\",\"tw.menuBar.cloudUnavailable\":\"Cloud-Variablen sind nicht Verfügbar\",\"tw.menuBar.cloudUnavailableAlert\":\"Kann Cloud-Variablen nicht verwenden, wahrscheinlich, weil du den Editor geöffnet hast.\",\"tw.menuBar.desktopSettings\":\"Desktop-Einstellungen\",\"tw.menuBar.moreSettings\":\"Erweitert\",\"tw.menuBar.newFramerate\":\"Neue Framefrequenz:\",\"tw.menuBar.newWindow\":\"Neues Fenster\",\"tw.menuBar.package\":\"Paketisieren\",\"tw.menuBar.reportError1\":\"Bei manchen Skripten sind Fehler aufgetreten.\",\"tw.menuBar.reportError2\":\"Dies ist ein Fehler. Bitte melde ihn.\",\"tw.menuBar.restorePoints\":\"Wiederherstellpunkte\",\"tw.menuBar.saveAs\":\"Speichern unter {file}\",\"tw.menuBar.seeInside\":\"Schau hinein\",\"tw.moreCloud\":\"Mehr über Cloud-Variablen erfahren.\",\"tw.notify.permission\":\"Wenn du das erlaubst, könntest du von deinem Browser angefragt werden, Benachrichtigungen einzuschalten. Danach werden Benachrichtigungen automatisch erlaubt sein.\",\"tw.notify.title\":\"Das Projekt möchte Benachrichtigungen anzeigen.\",\"tw.oldDownload\":\"Kopie speichern unter...\",\"tw.opcode.2000\":\"Tage seit 2000\",\"tw.opcode.mousedown\":\"Maustaste gedrückt?\",\"tw.opcode.mousex\":\"Maus-x-Position\",\"tw.opcode.mousey\":\"Maus-y-Position\",\"tw.openAdvanced\":\"Öffne die fortgeschrittenen Einstellungen\",\"tw.openWindow.dangerous\":\"Diese Website wurde nicht von den {APP_NAME}-Entwicklern geprüft. Sie könnte schädlichen oder bösartigen Code enthalten.\",\"tw.openWindow.title\":\"Dieses Projekt möchte ein neues Fenster oder Tab mit dieser URL öffnen:\",\"tw.paint.alpha\":\"Durchsichtigkeit\",\"tw.paint.fonts.more\":\"Mehr Schriftarten hinzufügen...\",\"tw.pen.stageSelected\":\"Bühne ausgewählte: weniger Stift-Blöcke verfügbar\",\"tw.privacy\":\"Datenschutzerklärung\",\"tw.recordAudio.permission\":\"Wenn zugelassen, könnte eine Anfrage deines Browsers erscheinen, und zukünftige Zugriffe werden automatisch zugelassen.\",\"tw.recordAudio.title\":\"Dieses Projekt will von deinem Mikrofon Audio aufnehmen. Das kann ein Transkript oder rohe Audiodaten beinhalten. Das Projekt könnte das Audio mit anderen Nutzern oder Servern teilen.\",\"tw.recordVideo.permission\":\"Wenn du das erlaubst, könntest du von deinem Browser angefragt werden, Kamerazugriff zu erlauben, und weitere Kamerazugriffe werden automatisch erlaubt werden.\",\"tw.recordVideo.title\":\"Dieses Projekt möchte Video von deiner Kamera aufnehmen. Das Projekt könnte diese Bilder mit anderen Nutzern oder Servern teilen.\",\"tw.redirect.dangerous\":\"Diese Website wurde nicht von den {APP_NAME}-Entwicklern geprüft. Sie könnte schädlichen oder bösartigen Code enthalten.\",\"tw.redirect.title\":\"Das Projekt will von diesem Tab zur URL:\",\"tw.removedTrademarks\":\"Elemente mit Scratchs Markenzeichen werden hier nicht mehr aufgelistet.\",\"tw.restorePoints.1minute\":\"jede Minute\",\"tw.restorePoints.assets\":\"{n} Resourcen\",\"tw.restorePoints.confirmDelete\":\"Bist du dir sicher, dass du \\\\\"{projectTitle}\\\\\" löschen wirst? Dies kann nicht mehr rückgängig gemacht werden. \",\"tw.restorePoints.confirmDeleteAll\":\"Bist du dir sicher, dass du ALLE Wiederherstellpunkte löschen willst? Dies kann nicht mehr rückgängig gemacht weren.\",\"tw.restorePoints.confirmLoad\":\"Du hast ungespeicherte Änderungen. Willst du das momentane Projekt ersetzen?\",\"tw.restorePoints.deleteAll\":\"Alle löschen\",\"tw.restorePoints.description\":\"{APP_NAME}speichert periodisch Wiederherstellpunkte auf deinem Computer, damit dein Projekt wiederhergestellt werden kann, wenn du vergisst, zu speichern. Dies ist als letzter Ausweg für Wiederherstellung gedacht. Dein Computer kann jederzeit diese Wiederherstellpunkte unbemerkt löschen. Verlasse dich NICHT auf dieses Feature.\",\"tw.restorePoints.empty\":\"Keine Wiederherstellpunkte gefunden.\",\"tw.restorePoints.error\":\"Fehler beim Laden des Wiederherstellpunktes: {error}\",\"tw.restorePoints.exportError\":\"Fehler beim Exportieren des Wiederherstellungspunkts: {error}\",\"tw.restorePoints.intervalOption\":\"Wiederherstellpunkte werden {time} erstellt.\",\"tw.restorePoints.loading\":\"Laden...\",\"tw.restorePoints.minutes\":\"alle {n} Minuten \",\"tw.restorePoints.never\":\"nie\",\"tw.restorePoints.off\":\"Wiederherstellpunkte auszuschalten ist gefährlich.\",\"tw.restorePoints.size\":\"Ungefähre Anzahl an genutztem Speicherplatz: {size}\",\"tw.restorePoints.size2\":\"Kostüme oder Klänge, die von mehreren Wiederherstellungspunkten genutzt werden, werden nur einmal gespeichert.\",\"tw.restorePoints.title\":\"Wiederherstellpunkte\",\"tw.sample\":\"Beispielprojekt\",\"tw.saveAs\":\"Speichern unter...\",\"tw.saveTo\":\"Speichern unter {file}\",\"tw.scratchUnsafeCloud\":\"Wenn du diese Cloudvariable erstllst, wird dieses Projekt die maximale Anzahl von {number} Variablen überschreiten, und manche von ihnen werden beim Hochladen auf Scratch nicht funktionieren.\",\"tw.securityManager.allow\":\"Zulassen\",\"tw.securityManager.deny\":\"Verweigern\",\"tw.securityManager.title\":\"Erweiterungssicherheit\",\"tw.securityManager.trust\":\"Wenn es einmal zugelassen wird, werden zukünftige Anfragen zur selben Website automatisch zugelassen.\",\"tw.securityManager.why\":\"Das Projekt könnte dies zum Herunterladen von zusätzlichen Bildern und Klängen, Einbauen von Multiplayerfunktionen, Zugreifen auf eine API, aber auch für bösartige Zwecke benötigen. Es wird deine IP-Adresse, Region und möglicherweise weitere Daten mit der Website teilen.\",\"tw.settingsModal.customStageSize\":\"Benutzerdefinierte Bühnengröße:\",\"tw.settingsModal.customStageSizeHelp\":\"Ändert die Größe der Bühne von 480x360 zu etwas anderem. Versuche 640x360, um die Bühen erweitert zu machen. Sehr wenige Projekte behandlen diese Einstellung richtig.\",\"tw.settingsModal.dangerZone\":\"Gefahrenzone\",\"tw.settingsModal.disableCompiler\":\"Compiler ausschalten\",\"tw.settingsModal.disableCompilerHelp\":\"Deaktiviert den Compiler von {APP_NAME}. Du möchtest dies vielleicht während dem Bearbeiten von Projekten tun, damit die Skripte sofort aktualisiert werden. Ansonsten solltest du den Compiler aktiviert lassen.\",\"tw.settingsModal.featured\":\"Vorgestellt\",\"tw.settingsModal.fps\":\"60 FPS (Benutzerdefinierte FPS)\",\"tw.settingsModal.fpsHelp\":\"Führt Skripte 60 anstatt 30 Mal pro Sekunde aus. Die meisten Projekte werden mit diesem nicht richtig funktionieren. Falls dies der Fall ist, solltest du Interpolation ohne 60 FPS verwenden. {customFramerate}.\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Klicke, um eine andere Framefrequenz als 30 oder 60 zu verwenden\",\"tw.settingsModal.help\":\"Klicke für Hilfe\",\"tw.settingsModal.highQualityPen\":\"Stift mit Hoher Qualität\",\"tw.settingsModal.highQualityPenHelp\":\"Erlaubt Stiftprojekte mit höherer Auflösung zu rendern und deaktiviert manche Koordinatenrundungen im Editor. Nicht alle Projekte haben einen Vorteil von dieser EInstellung, und sie könnte die Leistung beeinflussen.\",\"tw.settingsModal.infiniteClones\":\"Unendliche Klone\",\"tw.settingsModal.infiniteClonesHelp\":\"Deaktiviert Scratch\\'s Limit von 300 Klonen.\",\"tw.settingsModal.interpolationHelp\":\"Macht die Ausführung des Projekts flüssiger, indem es die Bewegungen der Figuren interpoliert. Interpolation sollte nicht auf 3D-Projekten, Raytracern, Stiftprojekten und laggenden Projekten verwendet werden, da die Interpolation sie langsamer ausführen wird.\",\"tw.settingsModal.largeStageWarning\":\"Es wird nicht empfohlen, die Bühne so groß zu machen! Verwende stattdessen eine kleinere Zahl mit der gleichen Ansichtsratio und lass den Vollbildschirm sie größer machen, um sie mit dem Display des Benutzers anzupassen.\",\"tw.settingsModal.removeFencing\":\"Einzäunung entfernen\",\"tw.settingsModal.removeFencingHelp\":\"Lässt zu, dass sich Figuren über den Bildschirm hinaus bewegen, so groß oder so klein werden, wie sie wollen und macht die Erkennung von Berührungen zwischen Figuren außerhalb des Bildschirms möglich.\",\"tw.settingsModal.removeLimits\":\"Limits enfernen\",\"tw.settingsModal.removeMiscLimits\":\"Verschiedene Begrenzungen entfernen\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Entfernt Begrenzungen bei Klangeffekten und bei der Stiftgröße.\",\"tw.settingsModal.storeProjectOptions\":\"Einstellungen im Projekt speichern\",\"tw.settingsModal.storeProjectOptionsHelp\":\"Speichert die ausgewählten Einstellungen im Projekt, damit sie beim Laden in TurboWarp automatisch angewendet werden. Der Compiler und der Warp Timer werden nicht gespeichert.\",\"tw.settingsModal.title\":\"Erweiterte Einstellungen\",\"tw.settingsModal.warpTimerHelp\":\"Überprüft, ob Skripte in einer langen oder endlosen Schleife feststecken, und führt sie mit einer niedrigeren Framefrequenz aus, anstatt sie auf das Ende der Schleife warten zu zu lassen. was die meisten Abstürze verbessert aber einen bedeutenden Einfluss auf die Leistung hat, deshalb ist es standardmäßig außerhalb des Editors deaktiviert.\",\"tw.soundEditorNotSupported\":\"Der Klängeeditor wird von diesem Browser nicht unterstützt.\",\"tw.spriteSelectorItem.rename\":\"umbenennnen\",\"tw.stageHeader.full\":\"Zu voller Bühne wechseln\",\"tw.stereoAlert\":\"Dieses Stereogeräusch zu ändern wird es zu Mono umwandeln, ohne dass man es wieder zurückumwandeln kann.\",\"tw.studioview.authorAttribution\":\"von {author}\",\"tw.studioview.error\":\"Es gab einen Fehler beim Laden der nächsten Seite von Projekten.\",\"tw.studioview.hoverText\":\"{title} von {author}\",\"tw.tooLarge\":\"Dieses Geräusch könnte zu groß sein, um es auf Scratch hochzuladen.\",\"tw.twExtension.description\":\"Seltsame neue Blöcke.\",\"tw.twExtension.name\":\"Blöcke von {APP_NAME}\",\"tw.unfavorite\":\"Aus Favoriten entfernen\",\"tw.unknownPlatform.1\":\"Dieses Projekt wurde für eine andere Plattform entwickelt:\",\"tw.unknownPlatform.2\":\"Die Kompatibilität mit {APP_NAME} kann nicht garantiert werden. Du kannst auf eigene Gefahr fortfahren, aber wir könnten nicht in der Lage zu sein, dir bei Problemen zu helfen.\",\"tw.unknownPlatform.continue\":\"Verstanden\",\"tw.unknownPlatform.title\":\"Unbekannte Plattform\",\"tw.unshared.2\":\"Mehr Informationen unter: {link}\",\"tw.unshared.bug\":\"Falls das Projekt eigentlich veröffentlicht ist, bitte melde den Fehler.\",\"tw.unshared.cache\":\"Falls das Projekt erst vor Kurzem veröffentlicht wurde, wird diese Nachricht möglicherweise einige Minuten lang erscheinen.\",\"tw.unshared2.1\":\"Nicht veröffentlichte Projekte sind nicht mehr sichtbar\",\"tw.usernameModal.help\":\"Dieser Wert wird in deinem Browserspeicher gespeichert. Er könnte geloggt werden, wenn du mit Projekten, die Cloudvariablen enthalten, interagierst.\",\"tw.usernameModal.help2\":\"Werte, die nicht mit einem gültigen Scratch-Konto entsprechen, werden normalerweise vom Cloudserver abgelehnt. Es ist empfohlen, diesen Wert so zu lassen, wie er ist, oder ihn auf deinen Scratch-Benutzernamen zu setzen.\",\"tw.usernameModal.mustChange\":\"Es tut uns Leid, der Cloudvariablenserver denkt, dass dein Benutzername unsicher sein könnte. Bitte ändere ihn oder {resetIt}.\",\"tw.usernameModal.mustChange.resetIt\":\"setze ihn zurück (empfohlen)\",\"tw.usernameModal.new\":\"Neuer Benutzername:\",\"tw.usernameModal.reset\":\"Zurücksetzen\",\"tw.usernameModal.title\":\"Benutzernamen ändern\",\"tw.usesCloudVariables\":\"Dieses Projekt nutzt Cloudvariablen.\",\"tw.usesCloudVariables2\":\"{APP_NAME}s Cloud-Variablen sind nicht mit denen von Scratch verbunden. Jeder kann willkürlich {changeTheirUsername}.\",\"tw.usesCloudVariables2.change\":\"seinen Benutzernamen ändern\",\"tw.viewFeaturedProjects\":\"Klicke, um vorgestellte Projekte anzusehen.\",\"tw.viewOnScratch\":\"Projekt auf Scratch anzeigen\"},\"es\":{\"tw.accent.blue\":\"Azul\",\"tw.accent.purple\":\"Morado\",\"tw.accent.rainbow\":\"Arcoíris\",\"tw.accent.red\":\"Rojo\",\"tw.alerts.creatingRestorePoint\":\"Creando punto de restauración...\",\"tw.alerts.lostPeripheralConnection\":\"Se perdió la conexión con {extensionName}.\",\"tw.alerts.restorePointError\":\"No se pudo crear el punto de restauración\",\"tw.alerts.restorePointSuccess\":\"Acceder a puntos de restauración en \\\\\"Archivo\\\\\"\",\"tw.alerts.savedToDisk\":\"Guardado a tu computadora.\",\"tw.backpack.rename\":\"Nuevo nombre:\",\"tw.blockColors.custom\":\"Personalizar en Ajustes de Addons\",\"tw.blockColors.dark\":\"Oscuro (Beta)\",\"tw.blockColors.highContrast\":\"Alto Contraste\",\"tw.blocks.PROCEDURES_DOCS\":\"Cómo usar devolver\",\"tw.blocks.PROCEDURES_RETURN\":\"devolver {v}\",\"tw.blocks.PROCEDURES_TO_REPORTER\":\"Cambiar A Reportero\",\"tw.blocks.PROCEDURES_TO_STATEMENT\":\"Cambiar A Declaración\",\"tw.blocks.buttonIsDown\":\"¿botón del ratón [MOUSE_BUTTON] presionado?\",\"tw.blocks.lastKeyPressed\":\"última tecla presionada\",\"tw.blocks.mouseButton.middle\":\"(1) central\",\"tw.blocks.mouseButton.primary\":\"(0) primario\",\"tw.blocks.mouseButton.secondary\":\"(2) secundario\",\"tw.blocks.openDocs\":\"Abrir Documentación\",\"tw.browserModal.desktopSettings\":\"Abrir Ajustes de Desktop\",\"tw.browserModal.desktopTitle\":\"Sistema no es compatible\",\"tw.browserModal.webgl1\":\"{APP_NAME} requiere WebGL, pero parece que su computador no es compatible. Esto suele ser un error temporal, y puede arreglarlo reiniciando su computador.\",\"tw.browserModal.webglBrowser\":\"Use una versión reciente de Chrome, Firefox, o Safari, y asegúrese de que sus controladores de gráficos estén actualizados. También puede intentar cambiar la opción de \\\\\"aceleración de gráficos\\\\\" o \\\\\"aceleración de hardware\\\\\" en los ajustes de su navegador.\",\"tw.browserModal.webglDesktop\":\"También puede intentar cambiar la opción de \\\\\"aceleración de gráficos\\\\\" en los ajustes de desktop.\",\"tw.cantUseCloud\":\"Aunque puedes crear variables en la nube, no fucionarán a menos que este proyecto se suba a Scratch o se convierta usando una herramienta como el {packager}.\",\"tw.changeUsername.cannotChangeWhileRunning\":\"El nombre de usuario no puede ser cambiado mientras el proyecto se está ejecutando.\",\"tw.clipboard.danger\":\"Si su portapapeles tiene cosas como contraseñas, el proyecto podría compartirlas con otros usuarios o servidores.\",\"tw.clipboard.permission\":\"El acceso a el portapapeles podría no funcionaren algunos navegadores. Si se permite, las próximas lecturas del portapapeles se permitirán automáticamente.\",\"tw.clipboard.title\":\"El proyecto quiere leer los datos de su portapapeles.\",\"tw.cloudProvider\":\"Servidor proporcionado por {name}.\",\"tw.cloudServers\":\"Elija un servidor cerca de usted:\",\"tw.code\":\"Código Fuente\",\"tw.confirmIncompatibleExtension\":\"Esta extensión es incompatible con Scratch. Proyectos hechos con ella no podrán ser subidos al sitio web de Scratch. ¿Está seguro de que quiere activarla?\",\"tw.createdBy\":\"Creado por:\",\"tw.customCloudServer\":\"Usando un servidor de variables en la nube personalizado: {server}\",\"tw.customExtension.description\":\"Cargar extensiones personalizadas desde URLs, archivos o código fuente JavaScript.\",\"tw.customExtension.name\":\"Extensión Personalizada\",\"tw.customExtensionModal.file\":\"Archivos\",\"tw.customExtensionModal.load\":\"Cargar\",\"tw.customExtensionModal.promptFile\":\"Seleccionar o soltar archivos JavaScript de la extensión:\",\"tw.customExtensionModal.promptText\":\"Pegar código fuente JavaScript de la extensión:\",\"tw.customExtensionModal.promptURL\":\"Ingresar URL de la extensión:\",\"tw.customExtensionModal.text\":\"Texto\",\"tw.customExtensionModal.title\":\"Cargar Extensión Personalizada\",\"tw.customExtensionModal.trusted\":\"Esta extensión será cargada sin el sandbox porque es de una fuente confiada.\",\"tw.customExtensionModal.unsandboxed\":\"Ejecutar sin sandbox\",\"tw.customExtensionModal.unsandboxedWarning1\":\"Cargar extensiones sin el sandbox es peligroso y no debería habilitarlo si no sabe lo que está haciendo.\",\"tw.customExtensionModal.unsandboxedWarning2\":\"Extensiones sin sandbox pueden corromper su proyecto, eliminar sus ajustes, pescar sus contraseñas, y otras cosas malas. Los desarrolladores de {APP_NAME} no son responsables por ningún problema resultante.\",\"tw.customExtensionModal.untrusted\":\"Extensiones de URLs no confiadas siempre serán cargadas con sandbox por seguridad.\",\"tw.customReporters.description\":\"Permitir a bloques personalizados devolver resultados y ser usados como entradas.\",\"tw.customReporters.name\":\"Reporteros Personalizados\",\"tw.darkMode\":\"Cambiar a Tema Claro\",\"tw.desktopCloud\":\"En la app del escritorio, las variables de la nube se sincronizan entre todas las ventanas de esta computadora. Suba el proyecto a Scratch o use una herramienta como el {packager} para que se sincronicen de forma global.\",\"tw.documentation\":\"Documentación\",\"tw.download.danger\":\"Este archivo no ha sido revisado por los desarrolladores de {APP_NAME}.\",\"tw.download.executable\":\"Este es un formato de archivo ejecutable que puede contener código malicioso si lo ejecuta.\",\"tw.embed.persistent\":\"Si se permite, se permitirán automáticamente más incrustaciones en el mismo sitio.\",\"tw.embed.risks\":\"Si bien la inserción estará protegida, seguirá teniendo acceso a información sobre su dispositivo, como su IP y ubicación general.\",\"tw.embed.title1\":\"El proyecto quiere incrustar contenido HTML en el escenario:\",\"tw.embed.title2\":\"El proyecto quiere incorporar contenido remoto sobre el escenario:\",\"tw.extension.faceSensing.description\":\"Detecta caras con la cámara.\",\"tw.extension.faceSensing.name\":\"Sensor de Cara\",\"tw.extensionGallery.error\":\"Error al cargar la galería de extensiones. Visita extensions.turbowarp.org para encontrar más extensiones.\",\"tw.extensionGallery.loading\":\"Cargando galería de extensiones...\",\"tw.extensionGallery.more\":\"Obtenga más información sobre las extensiones en extensions.turbowarp.org.\",\"tw.extensionGallery.name\":\"Extensiones de {APP_NAME}\",\"tw.favorite\":\"Favorito\",\"tw.featuredProjectsStudio\":\"Ver estudio en Scratch\",\"tw.feedback\":\"Comentarios y Bugs\",\"tw.feedbackButton\":\"Feedback de {APP_NAME}\",\"tw.fetch.title\":\"El proyecto quiere conectarse al sitio web:\",\"tw.fileInput.none\":\"No se han seleccionado archivos.\",\"tw.fileInput.selected\":\"Seleccionado: {names}\",\"tw.fonts.add\":\"Agregar\",\"tw.fonts.custom.file\":\"Selecciona una fuente tipográfica de tu computador:\",\"tw.fonts.custom.name\":\"Dale un nombre a la fuente:\",\"tw.fonts.custom1\":\"Agrega fuente de un archivo\",\"tw.fonts.custom2\":\"Usualmente no funcionará en Scratch. Formatos soportados: {formats}\",\"tw.fonts.delete\":\"¿Estás seguro que quieres borrar \\\\\"{font}\\\\\"? Cualquier disfraz vector usará la fuente de reemplazo en vez.\",\"tw.fonts.fallback\":\"Elige una fuente alternativa que se utilizará si la fuente no se carga o se elimina:\",\"tw.fonts.list\":\"Fuentes instaladas:\",\"tw.fonts.none\":\"Sin fuentes añadidas aún.\",\"tw.fonts.readError\":\"Fallo en leer fuente tipográfica: {error}\",\"tw.fonts.system\":\"Fuente del sistema\",\"tw.fonts.system.name\":\"Escribe el nombre de cualquier fuente en tu computador. La fuente puede no aparecer correctamente para todos.\",\"tw.fonts.system1\":\"Agregar una fuente del sistema\",\"tw.fonts.system2\":\"Podría funcionar en Scratch, pero no aparecerá correctamente para todos.\",\"tw.fonts.title\":\"Fuentes\",\"tw.footer.credits\":\"Créditos\",\"tw.footer.disclaimer\":\"{APP_NAME} no está afiliado con Scratch, el Equipo de Scratch o la Scratch Foundation.\",\"tw.footer.documentation\":\"Documentación\",\"tw.footer.embed\":\"Incrustado\",\"tw.footer.parameters\":\"Parámetros de URL\",\"tw.footer.scratchDisclaimer\":\"Scratch es un proyecto de la Scratch Foundation. Está disponible gratis en {scratchDotOrg}.\",\"tw.geolocate.permission\":\"Si se permite, puede que su navegador le pida acceso a su ubicación.\",\"tw.geolocate.title\":\"El proyecto quiere saber su ubicación.\",\"tw.gui.crashMessage.description\":\"Lo lamentamos mucho, pero parece que la página dejó de funcionar. Por favor actualice la página para intentar de nuevo.\",\"tw.gui.defaultProjectTitle\":\"Proyecto\",\"tw.guiDefaultTitle\":\"Ejecute proyectos de Scratch más rápido\",\"tw.home.credit\":\"Notas y Créditos\",\"tw.home.description\":\"{APP_NAME} es un mod de Scratch que compila los proyectos a JavaScript para hacerlos ejecutar muy rápido. Pruébelo insertando un ID o URL de proyecto debajo o elija un proyecto destacado debajo.\",\"tw.home.instructions\":\"Instrucciones\",\"tw.input.tooltip\":\"¡Copie y pegue un enlace a un proyecto de Scratch aquí!\",\"tw.interpolationEnabled\":\"Interpolación\",\"tw.invalidParameters.clones\":\"Parámetro de URL «clone» es inválido\",\"tw.invalidParameters.fps\":\"Parámetro de URL «fps» es inválido\",\"tw.invalidProject.error\":\"No se ha podido cargar el proyecto:\",\"tw.invalidProject.reportIt\":\"reportarlo\",\"tw.invalidProject.restorePoints\":\"Ver Puntos de Restauración\",\"tw.invalidProject.sb3fix\":\"usar sb3fix para recuperar su proyecto\",\"tw.invalidProject.zipCorruption\":\"Este error a menudo significa que el archivo se ha dañado, posiblemente debido a un dispositivo almacenamiento defectuoso, un corte de energía o a la desconexión de una unidad USB. Probe {usingSb3fix} porque puede arreglar este tipo de error.\",\"tw.lightMode\":\"Cambiar a Tema Oscuro\",\"tw.loadExtension.embedded\":\"El proyecto quiere cargar una extensión personalizada con el código:\",\"tw.loadExtension.sandboxed\":\"A pesar de que el código tenga sandbox, tendrá acceso a la información de su dispositivo como su IP y su ubicación general. Asegúrese de confiar el autor de esta extensión antes de continuar.\",\"tw.loadExtension.unsandboxed\":\"Ejecutar sin sandbox\",\"tw.loadExtension.unsandboxedWarning\":\"Cargar extensiones sin sandbox es peligroso. Será capaz de corromper su proyecto, eliminar sus ajustes, pescar sus contraseñas, y otras cosas malas. Los desarrolladores de {APP_NAME} no son responsables de ningún problema resultante.\",\"tw.loadExtension.url\":\"El proyecto quiere cargar una extensión personalizada de la URL:\",\"tw.loader.downloadingAssets\":\"Descargando assets ({complete}/{total}) ...\",\"tw.loader.loadingAssets\":\"Cargando archivos ({complete}/{total}) ...\",\"tw.loader.projectData\":\"Cargando proyecto ...\",\"tw.menuBar.60off\":\"Desactivar modo 60 FPS\",\"tw.menuBar.60on\":\"Activar modo 60 FPS\",\"tw.menuBar.accent\":\"Acento\",\"tw.menuBar.advanced\":\"Avanzado\",\"tw.menuBar.blockColors\":\"Colores de los Bloques\",\"tw.menuBar.changeUsername\":\"Cambiar Nombre de Usuario\",\"tw.menuBar.cloudOff\":\"Desactivar Variables en la Nube\",\"tw.menuBar.cloudOn\":\"Activar Variables en la Nube\",\"tw.menuBar.cloudUnavailable\":\"Variables en la Nube no Disponibles\",\"tw.menuBar.cloudUnavailableAlert\":\"No se pueden usar variables en la nube, probablemente porque abriste el editor.\",\"tw.menuBar.desktopSettings\":\"Ajustes de Desktop\",\"tw.menuBar.moreSettings\":\"Ajustes Avanzados\",\"tw.menuBar.newFramerate\":\"Nuevo FPS:\",\"tw.menuBar.newWindow\":\"Nueva ventana\",\"tw.menuBar.package\":\"Convertir proyecto\",\"tw.menuBar.reportError1\":\"Algunos scripts encontraron errores.\",\"tw.menuBar.reportError2\":\"Esto es un bug. Por favor repórtelo.\",\"tw.menuBar.restorePoints\":\"Puntos de restauración\",\"tw.menuBar.saveAs\":\"Guardar como {file}\",\"tw.menuBar.seeInside\":\"Ver dentro\",\"tw.moreCloud\":\"Obtenga más información sobre las variables de la nube.\",\"tw.notify.permission\":\"Si se permite, puede que su navegador le pida habilitar notificaciones, y próximas notificaciones serán permitidas automáticamente.\",\"tw.notify.title\":\"El proyecto quiere mostrar notificaciones.\",\"tw.oldDownload\":\"Guardar a archivo separado...\",\"tw.opcode.2000\":\"días desde el 2000\",\"tw.opcode.mousedown\":\"¿ratón presionado?\",\"tw.opcode.mousex\":\"posición x del ratón\",\"tw.opcode.mousey\":\"posición y del ratón\",\"tw.openAdvanced\":\"Abrir opciones avanzadas\",\"tw.openWindow.dangerous\":\"Este sitio web no ha sido revisado por los desarrolladores de {APP_NAME}. Podría contener código peligroso o malicioso.\",\"tw.openWindow.title\":\"Este proyecto quiere abrir una nueva ventana o pestaña con la URL:\",\"tw.paint.alpha\":\"Opacidad\",\"tw.paint.fonts.more\":\"Agregar más fuentes...\",\"tw.pen.stageSelected\":\"Escenario seleccionado: menos bloques de lápiz\",\"tw.privacy\":\"Política de Privacidad\",\"tw.recordAudio.permission\":\"Si se permite, puede que su navegador le pida acceso al micrófono, y los próximos accesos al micrófono se permitirán automáticamente.\",\"tw.recordAudio.title\":\"El proyecto quiere grabar audio de su micrófono. Esto podría incluir un transcriptor a texto o datos de audio sin procesar. El proyecto podría compartir el audio con otros usuarios o servidores.\",\"tw.recordVideo.permission\":\"Si se permite, puede que su navegador le pida acceso a su cámara, y los próximos accesos a la cámara se permitirán autiomáticamente.\",\"tw.recordVideo.title\":\"El proyecto quiere grabar video de su cámara. El proyecto podría compartir imágenes con otros usuarios o servidores.\",\"tw.redirect.dangerous\":\"Este sitio web no ha sido revisado por los desarrolladores de {APP_NAME}. Podría contener código peligroso o malicioso.\",\"tw.redirect.title\":\"El proyecto quiere trasladar esta pestaña a la URL:\",\"tw.restorePoints.1minute\":\"cada minuto\",\"tw.restorePoints.confirmDelete\":\"¿Está seguro de que quiere eliminar \\\\\"{projectTitle}\\\\\"? Esto no se puede deshacer.\",\"tw.restorePoints.confirmDeleteAll\":\"¿Está seguro de que desea eliminar TODOS los puntos de restauración? Esto no se puede deshacer.\",\"tw.restorePoints.confirmLoad\":\"Tiene cambios sin guardar. ¿Remplazar el proyecto existente?\",\"tw.restorePoints.deleteAll\":\"Eliminar Todos\",\"tw.restorePoints.description\":\"{APP_NAME} Guarda periódicamente puntos de guardado en su computadora para ayudarlo a recuperar su proyecto olvida guardarlo. Esto es guardado como una última oportunidad de recuperación. Su computadora podría silenciosamente eliminar estos puntos de guardado en cualquier momento. NO confíe en esta función.\",\"tw.restorePoints.empty\":\"No se encontraron puntos de recuperación.\",\"tw.restorePoints.error\":\"Error al cargar punto de recuperación: {error}\",\"tw.restorePoints.exportError\":\"Error al exportar punto de recuperación: {error}\",\"tw.restorePoints.intervalOption\":\"Los puntos de recuperación son creados {time}.\",\"tw.restorePoints.loading\":\"Cargando...\",\"tw.restorePoints.minutes\":\"cada {n} minutos\",\"tw.restorePoints.never\":\"nunca\",\"tw.restorePoints.off\":\"Deshabilitar puntos de recuperación es peligroso.\",\"tw.restorePoints.size\":\"Estimación del almacenamiento usado: {size}\",\"tw.restorePoints.size2\":\"Los disfraces y sonidos usados por múltiples puntos de recuperación son solo almacenados una vez.\",\"tw.restorePoints.title\":\"Puntos de Restauración\",\"tw.sample\":\"Proyecto de muestra\",\"tw.saveAs\":\"Guardar como...\",\"tw.saveTo\":\"Guardar a {file}\",\"tw.scratchUnsafeCloud\":\"Si hace esto una variable en la nube, el proyecto exederá el límite de Scratch de {number} variables y algunas variables no funcionarán si sube el proyecto a Scratch.\",\"tw.securityManager.allow\":\"Permitir\",\"tw.securityManager.deny\":\"Denegar\",\"tw.securityManager.title\":\"Seguridad de la Extensión\",\"tw.securityManager.trust\":\"Si se permite, las próximas consultas al mismo sitio web serán automáticamente permitidas.\",\"tw.securityManager.why\":\"Esto podría ser usado para descargar imágenes o sonidos, implementar multijugador, acceder a una API, o con intenciones maliciosas. Esto compartirá tu dirección de IP, ubicación general, y probablemente otra información con el sitio web.\",\"tw.settingsModal.customStageSize\":\"Tamaño Personalizado del Escenario:\",\"tw.settingsModal.customStageSizeHelp\":\"Cambia el tamaño del escenario de Scratch de 480x360 a algo diferente. Pruebe 640x360 para hacer el escenario más ancho. Muy pocos proyectos manejarán esto adecuadamente.\",\"tw.settingsModal.dangerZone\":\"Zona Peligrosa\",\"tw.settingsModal.disableCompiler\":\"Desactivar Compilador\",\"tw.settingsModal.disableCompilerHelp\":\"Desactiva el compilador de {APP_NAME}. Puede que quiera activar esto mientras edita proyectos para que sus scripts se actualicen inmediatamente. Si ese no es el caso, no debería activar esto nunca.\",\"tw.settingsModal.featured\":\"Destacado\",\"tw.settingsModal.fps\":\"60 FPS (FPS Personalizado)\",\"tw.settingsModal.fpsHelp\":\"Ejecuta scripts 60 veces por segundo en vez de 30. La mayoría de los proyectos no funcionarán correctamente con esto activado. Debería probar Interpolación con modo 60 FPS desactivado si ese es el caso. {customFramerate}.\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Haga click para usar un framerate diferente a 30 o 60\",\"tw.settingsModal.help\":\"Haga click para ayuda\",\"tw.settingsModal.highQualityPen\":\"Lápiz de Alta Calidad\",\"tw.settingsModal.highQualityPenHelp\":\"Permite a los proyectos que usen la extensión del Lápiz renderizar en una mayor resolución y desactiva el redondeo de coordenadas dentro del editor. No todos los proyectos se ven beneficiados de esta configuración, pues puede afectar negativamente el rendimiento. \",\"tw.settingsModal.infiniteClones\":\"Clones Infinitos\",\"tw.settingsModal.infiniteClonesHelp\":\"Desactiva el límite de 300 clones de Scratch.\",\"tw.settingsModal.interpolation\":\"Interpolación\",\"tw.settingsModal.interpolationHelp\":\"Hace que los movimientos dentro de los proyectos se vean más suaves al interpolar los cambios de posición de los objetos. No es recomendable utilizar el ajuste de interpolación en proyectos 3D o proyectos que utilicen la extensión del Lápiz u otros proyectos que sean de bajo rendimiento, ya que esta función lo ralentizará aún más.\",\"tw.settingsModal.largeStageWarning\":\"Usar un tamaño personalizado del escenario tan grande no es recomendado. En cambio, use un tamaño más pequeño con la misma relación de aspecto y permita que el modo pantalla completa agrande el escenario para cubrir toda la pantalla del usuario.\",\"tw.settingsModal.removeFencing\":\"Quitar Fencing\",\"tw.settingsModal.removeFencingHelp\":\"Permite a los objetos moverse afuera de la pantalla o hacerse tan grandes o chicos como deseen y hace funcionar los bloques \\\\\"tocando\\\\\" fuera de la pantalla.\",\"tw.settingsModal.removeLimits\":\"Quitar Límites\",\"tw.settingsModal.removeMiscLimits\":\"Quitar Límites Varios\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Elimina los límites de sonido y de tamaño del lápiz.\",\"tw.settingsModal.storeProjectOptions\":\"Guardar ajustes en proyecto\",\"tw.settingsModal.storeProjectOptionsHelp\":\"Guarda los ajustes seleccionados en el proyecto para que sean aplicados automáticamente cuando TurboWarp carga este proyecto. Warp Timer y desactivar compilador no serán guardados.\",\"tw.settingsModal.title\":\"Ajustes Avanzados\",\"tw.settingsModal.warpTimerHelp\":\"Hace que los scripts revisen si están atascados en un bucle infinito y si es así, hace que vayan a una menor tasa de refresco hasta que el bucle termine, logrando evitar la mayoría de colapsos por este tipo de errores. Este ajuste tiene un impacto negativo significante en el rendimiento, por lo que solo está habilitado por defecto en el editor.\",\"tw.soundEditorNotSupported\":\"El editor de sonido no es compatible con este navegador.\",\"tw.spriteSelectorItem.rename\":\"renombrar\",\"tw.stageHeader.full\":\"Cambiar a un escenario lleno\",\"tw.stereo\":\"Estéreo\",\"tw.stereoAlert\":\"Editar este sonido estéreo lo convertirá irreversiblemente en mono.\",\"tw.studioview.authorAttribution\":\"por {author}\",\"tw.studioview.error\":\"Ocurrió un error cargando la siguiente página de proyectos.\",\"tw.studioview.hoverText\":\"{title} por {author}\",\"tw.tooLarge\":\"Este sonido podría ser demasiado grande como para cargarlo en Scratch.\",\"tw.twExtension.description\":\"Nuevos bloques extraños.\",\"tw.twExtension.name\":\"Bloques de {APP_NAME}\",\"tw.unfavorite\":\"No favorito\",\"tw.unshared.2\":\"Para más información, visite: {link}\",\"tw.unshared.bug\":\"Si el proyecto está realmente compartido, por favor reporte un error.\",\"tw.unshared.cache\":\"Si el proyecto se a compartido recientemente, este mensaje podría aparecer incorrectamente por algunos minutos.\",\"tw.unshared2.1\":\"Los proyectos no compartidos ya no son visibles\",\"tw.usernameModal.help\":\"Este valor será guardado en el almacenamiento de su navegador. Es posible que sea usado cuando interactúe con proyectos que contengan variables en la nube.\",\"tw.usernameModal.help2\":\"Valores que no corresponden a una cuenta de Scratch válida típicamente serán rechazadas por el servidor de variables en la nube. Se le recomienda dejarlo como está o cambiarlo a su nombre de usuario de Scratch.\",\"tw.usernameModal.mustChange\":\"Lo sentimos, el servidor de variables en la nube piensa que tu nombre de usuario puede ser inseguro. Por favor cámbielo a otra cosa o {resetIt}.\",\"tw.usernameModal.mustChange.resetIt\":\"resetéelo (recomendado)\",\"tw.usernameModal.new\":\"Nuevo nombre de usuario:\",\"tw.usernameModal.reset\":\"Reiniciar\",\"tw.usernameModal.title\":\"Cambiar Nombre de Usuario\",\"tw.usesCloudVariables\":\"Este proyecto utiliza variables de nube.\",\"tw.usesCloudVariables2\":\"Las variables de la nube de {APP_NAME} no están conectadas a las de Scratch. Cualquiera puede {changeTheirUsername}, así que tenga cuidado con la suplantación.\",\"tw.usesCloudVariables2.change\":\"cambiar su nombre de usuario\",\"tw.viewFeaturedProjects\":\"Clickee para ver proyectos destacados.\",\"tw.viewOnScratch\":\"Ver proyecto en Scratch\"},\"fi\":{\"tw.accent.blue\":\"Sininen\",\"tw.accent.purple\":\"Violetti\",\"tw.accent.rainbow\":\"Sateenkaari\",\"tw.accent.red\":\"Punainen\",\"tw.alerts.creatingRestorePoint\":\"Luodaan palautuskohtaa...\",\"tw.alerts.lostPeripheralConnection\":\"Yhteys laajennukseen {extensionName} katkesi.\",\"tw.alerts.restorePointError\":\"Palautuskohtaa ei voitu luoda\",\"tw.alerts.restorePointSuccess\":\"Palautuskohdat ovat \\\\\"Tiedosto\\\\\"-valikossa\",\"tw.alerts.savedToDisk\":\"Tallennettu tietokoneellesi.\",\"tw.backpack.rename\":\"Uusi nimi:\",\"tw.blockColors.custom\":\"Mukauta lisäosa-asetuksissa\",\"tw.blockColors.dark\":\"Tumma (beeta)\",\"tw.blockColors.highContrast\":\"Korkea kontrasti\",\"tw.blockColors.three\":\"Alkuperäinen\",\"tw.blocks.PROCEDURES_DOCS\":\"Palauta-lohkon käyttäminen\",\"tw.blocks.PROCEDURES_RETURN\":\"palauta {v}\",\"tw.blocks.PROCEDURES_TO_REPORTER\":\"Muuta ilmoituslohkoksi\",\"tw.blocks.PROCEDURES_TO_STATEMENT\":\"Muuta komennoksi\",\"tw.blocks.addons\":\"Lisäosat\",\"tw.blocks.buttonIsDown\":\"onko hiiren [MOUSE_BUTTON] nappi painettu?\",\"tw.blocks.lastKeyPressed\":\"viimeisin painettu näppäin\",\"tw.blocks.mouseButton.middle\":\"(1) keskimmäinen\",\"tw.blocks.mouseButton.primary\":\"(0) ensisijainen\",\"tw.blocks.mouseButton.secondary\":\"(2) toissijainen\",\"tw.blocks.openDocs\":\"Avaa opas\",\"tw.browserModal.desktopSettings\":\"Avaa selaimen asetukset\",\"tw.browserModal.desktopTitle\":\"Järjestelmää ei tueta\",\"tw.browserModal.webgl1\":\"{APP_NAME} vaatii WebGL:n, mutta tietokoneesi ei vaikuta tukevan sitä. Tämä virhe on usein väliaikainen, ja voit korjata sen käynnistämällä tietokoneesi uudelleen.\",\"tw.browserModal.webglBrowser\":\"Käytä Chromen, Firefoxin tai Safarin uutta versiota ja varmista, että grafiikka-ajurisi ovat ajan tasalla. Voit myös kytkeä \\\\\"grafiikkakiihdytys\\\\\"- tai \\\\\"laitteistokiihdytys\\\\\"-asetuksen päälle tai pois selaimesi asetuksissa.\",\"tw.browserModal.webglDesktop\":\"Voit myös koettaa kytkeä \\\\\"grafiikkakiihdytys\\\\\"-asetuksen päälle tai pois selaimen asetuksissa:\",\"tw.cantUseCloud\":\"Vaikka voit luoda pilvimuuttujia, ne eivät toimi, ellei tätä projektia ladata Scratchiin tai muunneta {packager} -pakkauskoneen kaltaisella työkalulla.\",\"tw.changeUsername.cannotChangeWhileRunning\":\"Käyttäjänimeä ei voi muuttaa, kun projekti on käynnissä.\",\"tw.clipboard.danger\":\"Jos leikepöytäsi sisältää salasanojen kaltaisia asioita, projekti saattaa voida jakaa niitä muiden käyttäjien tai palvelimien kanssa.\",\"tw.clipboard.permission\":\"Pääsy leikepöydän sisältöön ei välttämättä toimi joissakin selaimissa. Jos sallit sen nyt, pääsy leikepöydän sisältöön sallitaan jatkossa automaattisesti.\",\"tw.clipboard.title\":\"Projekti haluaa pääsyn leikepöytäsi sisältöön.\",\"tw.cloudProvider\":\"Palvelimen tarjoaa {name}.\",\"tw.cloudServers\":\"Valitse lähelläsi oleva palvelin:\",\"tw.code\":\"Lähdekoodi\",\"tw.confirmIncompatibleExtension\":\"Tämä laajennus ei ole yhteensopiva Scratchin kanssa. Sillä tehtyjä projekteja ei voi ladata Scratchin verkkosivustolle. Haluatko varmasti ottaa sen käyttöön?\",\"tw.createdBy\":\"Tekijät:\",\"tw.customCloudServer\":\"Käytä omaa pilvimuuttujapalvelinta: {server}\",\"tw.customExtension.description\":\"Lataa oma laajennus URL-osoitteista, tiedostoista tai JavaScript-lähdekoodista.\",\"tw.customExtension.name\":\"Oma laajennus\",\"tw.customExtensionModal.file\":\"Tiedostot\",\"tw.customExtensionModal.load\":\"Lataa\",\"tw.customExtensionModal.promptFile\":\"Valitse tai pudota laajennuksen JavaScript-tiedostot:\",\"tw.customExtensionModal.promptText\":\"Liitä laajennuksen JavaScript-lähdekoodi:\",\"tw.customExtensionModal.promptURL\":\"Anna laajennuksen URL-osoite:\",\"tw.customExtensionModal.text\":\"Teksti\",\"tw.customExtensionModal.title\":\"Lataa oma laajennus\",\"tw.customExtensionModal.trusted\":\"Tämä laajennus voidaan ladata hiekkalaatikon ulkopuolelle, koska se on peräisin luotetusta lähteestä.\",\"tw.customExtensionModal.unsandboxed\":\"Suorita hiekkalaatikon ulkopuolella\",\"tw.customExtensionModal.unsandboxedWarning1\":\"Laajennusten lataaminen hiekkalaatikon ulkopuolelle on vaarallista. Älä tee sitä, jos et tiedä, mitä teet.\",\"tw.customExtensionModal.unsandboxedWarning2\":\"Hiekkalaatikon ulkopuoliset laajennukset voivat turmella projektia, poistaa asetuksia, kalastella salasanoja ja tehdä muita pahoja asioita. {APP_NAME}in kehittäjät eivät ole vastuussa ilmenneistä ongelmista.\",\"tw.customExtensionModal.untrusted\":\"Epäluotettavista URL-osoitteista peräisin olevat laajennukset ladataan aina hiekkalaatikkoon turvallisuusyistä.\",\"tw.customExtensionModal.url\":\"URL-osoite\",\"tw.customReporters.description\":\"Käytä omia lohkoja syötteinä ja arvojen palauttamiseen.\",\"tw.customReporters.name\":\"Omat ilmoituslohkot\",\"tw.darkMode\":\"Vaihda vaaleaan tilaan\",\"tw.desktopCloud\":\"Työpöytäsovelluksessa pilvimuuttujat synkronoituvat kaikkien tämän tietokoneen sovellusikkunoiden välillä. Lataa projekti Scratchiin tai käytä {packager} -pakkauskonetta, jotta ne synkronoituvat maailmanlaajuisesti.\",\"tw.documentation\":\"Opas\",\"tw.download.danger\":\"{APP_NAME}in kehittäjät eivät ole tarkastaneet tätä tiedostoa.\",\"tw.download.executable\":\"Tämä on ajotiedosto, joka saattaa olla suoritettaessa haitallinen.\",\"tw.download.file\":\"Projekti haluaa ladata tiedoston tietokoneellesi. Se tallennetaan nimellä {name} Ladatut tiedostot -kansioosi.\",\"tw.embed.persistent\":\"Jos sallit tämän, tulevat upotukset samalta sivustolta sallitaan automaattisesti.\",\"tw.embed.risks\":\"Vaikka upotus on hiekkalaatikossa, sillä on silti pääsy laitteesi tietoihin, kuten IP-osoitteeseen ja likimääräiseen sijaintiin.\",\"tw.embed.title1\":\"Projekti haluaa upottaa HTML-sisältöä esiintymislavan ylle:\",\"tw.embed.title2\":\"Projekti haluaa upottaa ulkoista sisältöä esiintymislavan ylle:\",\"tw.extensionGallery.error\":\"Virhe laajennusgalleriaa ladatessa. Lisää laajennuksia löydät osoitteesta extensions.turbowarp.org.\",\"tw.extensionGallery.loading\":\"Ladataan laajennusgalleriaa...\",\"tw.extensionGallery.more\":\"Lisätietoja laajennuksista osoitteessa extensions.turbowarp.org.\",\"tw.extensionGallery.name\":\"{APP_NAME}in laajennusgalleria\",\"tw.favorite\":\"Lisää suosikiksi\",\"tw.featuredProjectsStudio\":\"Näytä studio Scratchissa.\",\"tw.feedback\":\"Palaute ja bugit\",\"tw.feedbackButton\":\"Palaute {APP_NAME}ista\",\"tw.fetch.title\":\"Projekti haluaa yhdistää verkkosivustoon:\",\"tw.fileInput.none\":\"Ei valittuja tiedostoja.\",\"tw.fileInput.selected\":\"Valitut: {names}\",\"tw.fonts.add\":\"Lisää\",\"tw.fonts.custom.file\":\"Valitse fonttitiedosto tietokoneeltasi:\",\"tw.fonts.custom.name\":\"Nimeä fontti:\",\"tw.fonts.custom1\":\"Lisää fontti tiedostosta\",\"tw.fonts.custom2\":\"Ei yleensä toimi Scratchissa. Tuetut tiedostotyypit: {formats}.\",\"tw.fonts.delete\":\"Haluatko varmasti poistaa fontin \\\\\"{font}\\\\\"? Kaikki vektoriasusteet alkavat käyttää varmistusfonttia sen sijaan.\",\"tw.fonts.fallback\":\"Valitse varmistusfontti, jota käytetään, jos fontin lataaminen epäonnistuu tai se on poistettu:\",\"tw.fonts.list\":\"Asennetut fontit:\",\"tw.fonts.none\":\"Fontteja ei ole vielä lisätty.\",\"tw.fonts.readError\":\"Fonttitiedoston lukeminen epäonnistui: {error}\",\"tw.fonts.system\":\"Järjestelmäfontti\",\"tw.fonts.system.name\":\"Kirjoita minkä tahansa tietokoneeseesi sisäänrakennetun fontin nimi. Fontti ei välttämättä näy oikein kaikille.\",\"tw.fonts.system1\":\"Lisää järjestelmäfontti\",\"tw.fonts.system2\":\"Saattaa toimia Scratchissa, mutta ei näy kaikille oikein.\",\"tw.fonts.title\":\"Fontit\",\"tw.footer.credits\":\"Tekijät\",\"tw.footer.disclaimer\":\"{APP_NAME} ei ole kytköksissä Scratchiin, Scratch-tiimiin tai Scratch-säätiöön.\",\"tw.footer.documentation\":\"Opas\",\"tw.footer.embed\":\"Upottaminen\",\"tw.footer.parameters\":\"URL-parametrit\",\"tw.footer.scratchDisclaimer\":\"Scratch on Scratch-säätiön projekti. Se on saatavilla ilmaiseksi osoitteessa {scratchDotOrg}.\",\"tw.fps\":\"{framerate} ruutua/s\",\"tw.geolocate.permission\":\"Jos sallit tämän, selaimesi saattaa pyytää sinua hyväksymään sijainnin käytön.\",\"tw.geolocate.title\":\"Projekti haluaa tietää sijaintisi.\",\"tw.gui.crashMessage.description\":\"Pahoittelut, mutta vaikuttaa siltä, että sivu kaatui. Yritä uudelleen päivittämällä sivu uudelleen.\",\"tw.gui.defaultProjectTitle\":\"Projekti\",\"tw.guiDefaultTitle\":\"Aja Scratch-projekteja nopeammin\",\"tw.home.credit\":\"Ilmoitukset ja kiitokset\",\"tw.home.description\":\"{APP_NAME} on Scratchin muunnelma, joka kääntää projektit JavaScriptiksi, jotta ne voidaan suorittaa todella nopeasti. Koeta kirjoittaa projektin tunnus tai URL-osoite ylle tai valitse valittu projekti alta.\",\"tw.home.instructions\":\"Ohjeet\",\"tw.input.tooltip\":\"Kopioi ja liitä Scratch-projektin linkki tähän!\",\"tw.interpolationEnabled\":\"Interpolaatio\",\"tw.invalidParameters.clones\":\"\\\\\"clone\\\\\"-URL-parametri ei ole kelvollinen\",\"tw.invalidParameters.fps\":\"\\\\\"fps\\\\\"-URL-parametri ei ole kelvollinen\",\"tw.invalidProject.error\":\"Projektia ei voitu ladata:\",\"tw.invalidProject.options\":\"Voit ehkä saada takaisin projektin vanhemman version automaattisista palautuskohdista tai muista varmuuskopioista.\",\"tw.invalidProject.reportIt\":\"ilmoita siitä\",\"tw.invalidProject.restorePoints\":\"Näytä palautuskohdat\",\"tw.invalidProject.title\":\"Virhe\",\"tw.invalidProject.validationError\":\"Tämä virhe tarkoittaa useimmiten sitä, että pieni osa projektista on turmeltunut, mutta muuten se toimii. Tämä voidaan helposti korjata, joten {reportIt}.\",\"tw.lightMode\":\"Vaihda tummaan tilaan\",\"tw.loadExtension.embedded\":\"Projekti haluaa ladata oman laajennuksen koodilla:\",\"tw.loadExtension.sandboxed\":\"Vaikka koodi on hiekkalaatikossa, sillä on silti pääsy laitteesi tietoihin, kuten IP-osoitteeseen ja likimääräiseen sijaintiin. Varmista ennen jatkamista, että tekijä on luotettava.\",\"tw.loadExtension.unsandboxed\":\"Suorita hiekkalaatikon ulkopuolella\",\"tw.loadExtension.unsandboxedWarning\":\"Laajennusten lataaminen hiekkalaatikon ulkopuolelle on vaarallista. Se voi turmella projektia, poistaa asetuksia, kalastella salasanoja ja tehdä muita pahoja asioita. {APP_NAME}in kehittäjät eivät ole vastuussa ilmenneistä ongelmista.\",\"tw.loadExtension.url\":\"Projekti haluaa ladata oman laajennuksen URL-osoitteesta:\",\"tw.loader.downloadingAssets\":\"Ladataan resursseja ({complete}/{total})...\",\"tw.loader.loadingAssets\":\"Ladataan resursseja ({complete}/{total})...\",\"tw.loader.projectData\":\"Ladataan projektia...\",\"tw.menuBar.60off\":\"Kytke 60 ruutua sekunnissa -tila pois\",\"tw.menuBar.60on\":\"Kytke 60 ruutua sekunnissa -tila päälle\",\"tw.menuBar.accent\":\"Korostus\",\"tw.menuBar.addons\":\"Lisäosat\",\"tw.menuBar.advanced\":\"Edistykselliset\",\"tw.menuBar.blockColors\":\"Lohkojen väri\",\"tw.menuBar.changeUsername\":\"Muuta käyttäjänimi\",\"tw.menuBar.cloudOff\":\"Poista pilvimuuttujat käytöstä\",\"tw.menuBar.cloudOn\":\"Ota pilvimuuttujat käyttöön\",\"tw.menuBar.cloudUnavailable\":\"Pilvimuuttujat eivät ole saatavilla\",\"tw.menuBar.cloudUnavailableAlert\":\"Pilvimuuttujia ei voida käyttää. Todennäköisesti siksi, koska sinä avasit editorin.\",\"tw.menuBar.desktopSettings\":\"Työpöytäversion asetukset\",\"tw.menuBar.moreSettings\":\"Edistykselliset asetukset\",\"tw.menuBar.newFramerate\":\"Uusi kuvataajuus:\",\"tw.menuBar.newWindow\":\"Uusi ikkuna\",\"tw.menuBar.package\":\"Pakkaa projekti\",\"tw.menuBar.reportError1\":\"Joissakin skripteissä tapahtui virheitä.\",\"tw.menuBar.reportError2\":\"Tämä on bugi. Ilmoita siitä.\",\"tw.menuBar.restorePoints\":\"Palautuskohdat\",\"tw.menuBar.saveAs\":\"Tallenna nimellä {file}\",\"tw.menuBar.seeInside\":\"Katso sisälle\",\"tw.mono\":\"Monoääni\",\"tw.moreCloud\":\"Lisätietoja pilvimuuttujista.\",\"tw.notify.permission\":\"Jos sallit tämän, käyttöjärjestelmäsi saattaa pyytää sinua ottamaan ilmoitukset käyttöön ja ilmoitukset sallitaan jatkossa automaattisesti.\",\"tw.notify.title\":\"Projekti haluaa näyttää ilmoituksia.\",\"tw.oldDownload\":\"Tallenna erilliseen tiedostoon...\",\"tw.opcode.2000\":\"päiviä vuoden 2000 jälkeen\",\"tw.opcode.mousedown\":\"onko hiiren nappi painettu?\",\"tw.opcode.mousex\":\"hiiren x-sijainti\",\"tw.opcode.mousey\":\"hiiren y-sijainti\",\"tw.openAdvanced\":\"Avaa edistykselliset asetukset\",\"tw.openWindow.dangerous\":\"{APP_NAME}in kehittäjät eivät ole tarkastaneet tätä verkkosivustoa. Se saattaa sisältää vaarallista tai pahantahtoista koodia.\",\"tw.openWindow.title\":\"Projekti haluaa avata uuden ikkunan tai välilehden URL-osoitteella:\",\"tw.paint.alpha\":\"Läpinäkyvyys\",\"tw.paint.fonts.more\":\"Lisää fontteja...\",\"tw.pen.stageSelected\":\"Esiintymislava valittu: vähemmän kynälohkoja\",\"tw.privacy\":\"Tietosuojakäytäntö\",\"tw.recordAudio.permission\":\"Jos sallit tämän, selaimesi saattaa pyytää sinua sallimaan mikrofonin käytön ja käyttö sallitaan jatkossa automaattisesti.\",\"tw.recordAudio.title\":\"Projekti haluaa nauhoittaa mikrofonisi ääntä. Tähän sisältyvät puheen tekstiksi muuttaminen sekä raaka äänidata. Projekti saattaa voida jakaa ääntä muiden käyttäjien ja palvelimien kanssa.\",\"tw.recordVideo.permission\":\"Jos sallit tämän, selaimesi saattaa pyytää sinua sallimaan kameran käytön ja käyttö sallitaan jatkossa automaattisesti.\",\"tw.recordVideo.title\":\"Projekti haluaa käyttää kameraasi. Projekti saattaa voida jakaa kuvia muiden käyttäjien ja palvelimien kanssa.\",\"tw.redirect.dangerous\":\"{APP_NAME}in kehittäjät eivät ole tarkastaneet tätä verkkosivustoa. Se saattaa sisältää vaarallista tai pahantahtoista koodia.\",\"tw.redirect.title\":\"Projekti haluaa siirtyä tällä välilehdellä URL-osoitteeseen:\",\"tw.removedTrademarks\":\"Jotkin Scratchin tavaramerkkejä sisältäneet kohteet eivät enää näy tässä luettelossa.\",\"tw.restorePoints.1minute\":\"minuutin välein\",\"tw.restorePoints.assets\":\"{n} resurssia\",\"tw.restorePoints.confirmDelete\":\"Haluatko varmasti poistaa projektin \\\\\"{projectTitle}\\\\\"? Tätä ei voi kumota.\",\"tw.restorePoints.confirmDeleteAll\":\"Haluatko varmasti poistaa KAIKKI palautuskohdat? Tätä ei voi kumota.\",\"tw.restorePoints.confirmLoad\":\"Sinulla on tallentamattomia muutoksia. Korvataanko nykyinen projekti?\",\"tw.restorePoints.deleteAll\":\"Poista kaikki\",\"tw.restorePoints.description\":\"{APP_NAME} tallentaa säännöllisesti palautuskohtia tietokoneellesi, jotta voit saada projektisi takaisin, jos unohdat tallentaa. Tämä on tarkoitettu viimeiseksi palautuskeinoksi. Tietokoneesi voi kaikessa hiljaisuudessa poistaa nämä palautuskohdat milloin tahansa. ÄLÄ LUOTA tähän toimintoon.\",\"tw.restorePoints.empty\":\"Palautuskohtia ei löytynyt.\",\"tw.restorePoints.error\":\"Virhe palautuskohtaa ladatessa: {error}\",\"tw.restorePoints.exportError\":\"Palautuskohdan viennissä tapahtui virhe: {error}\",\"tw.restorePoints.intervalOption\":\"Luo palautuskohta {time}.\",\"tw.restorePoints.loading\":\"Ladataan...\",\"tw.restorePoints.minutes\":\"{n} minuutin välein\",\"tw.restorePoints.never\":\"ei koskaan\",\"tw.restorePoints.off\":\"Palautuskohtien käytöstä poistaminen on vaarallista.\",\"tw.restorePoints.size\":\"Arvioitu tallennustilan käyttö: {size}\",\"tw.restorePoints.size2\":\"Useammassa tallennuskohdassa käytetyt asusteet ja äänet tallennetaan vain kerran.\",\"tw.restorePoints.title\":\"Palautuskohdat\",\"tw.sample\":\"Esimerkkiprojekti\",\"tw.saveAs\":\"Tallenna nimellä...\",\"tw.saveTo\":\"Tallenna tiedostoon {file}\",\"tw.scratchUnsafeCloud\":\"Jos teet tästä pilvimuuttujan, projekti ylittää Scratchin {number} muuttujan rajan, jolloin jotkin muuttujat eivät toimi, jos lataat projektin Scratchiin.\",\"tw.securityManager.allow\":\"Salli\",\"tw.securityManager.deny\":\"Kiellä\",\"tw.securityManager.title\":\"Laajennuksen turvallisuus\",\"tw.securityManager.trust\":\"Jos sallit tämän, tulevat pyynnöt samalle sivustolle sallitaan automaattisesti.\",\"tw.securityManager.why\":\"Tätä voidaan käyttää kuvien tai äänten lataamiseen, moninpelityökaluihin, ohjelmointirajapintoihin tai pahantahtoisiin tarkoituksiin. Tämä jakaa IP-osoitteesi, likimääräisen sijaintisi ja mahdollisia muita tietoja verkkosivuston kanssa.\",\"tw.settingsModal.customStageSize\":\"Oma esiintymislavan koko:\",\"tw.settingsModal.customStageSizeHelp\":\"Muuttaa Scratchin esiintymislavan koon 480x360 joksikin muuksi. Tee esiintymislavasta laajakuvainen käyttämällä kokoa 640x360.\",\"tw.settingsModal.dangerZone\":\"Vaaralliset asetukset\",\"tw.settingsModal.disableCompiler\":\"Poista kääntäjä käytöstä\",\"tw.settingsModal.disableCompilerHelp\":\"Poistaa {APP_NAME}in kääntäjän käytöstä. Tämän käyttämisestä on hyötyä, kun muokkaat projektia, jotta skriptit päivittyvät välittömästi. Muussa tapauksessa älä ikinä ota tätä käyttöön.\",\"tw.settingsModal.featured\":\"Suositut\",\"tw.settingsModal.fps\":\"60 ruutua/s (oma kuvataajuus)\",\"tw.settingsModal.fpsHelp\":\"Suorita skriptejä 60 kertaa sekunnissa 30:n sijaan. Useimmat projektit eivät toimi kunnolla, kun tämä on käytössä. Koeta siinä tapauksessa käyttää interpolaatiota ilman 60 ruutua/s -tilaa. {customFramerate}.\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Käytä muuta kuvataajuutta kuin 30 tai 60 napauttamalla\",\"tw.settingsModal.help\":\"Lisätietoja\",\"tw.settingsModal.highQualityPen\":\"Korkealaatuinen kynä\",\"tw.settingsModal.highQualityPenHelp\":\"Saa kynän piirtymään korkeampilaatuisena ja poistaa joidenkin koordinaattien pyöristymisen editorissa. Kaikki projektit eivät hyödy tästä asetuksesta. Asetus saattaa vaikuttaa suorituskykyyn.\",\"tw.settingsModal.infiniteClones\":\"Loputtomasti klooneja\",\"tw.settingsModal.infiniteClonesHelp\":\"Poistaa Scratchin 300 kloonin rajoituksen.\",\"tw.settingsModal.interpolation\":\"Interpolaatio\",\"tw.settingsModal.interpolationHelp\":\"Tekee projekteista sujuvamman näköisiä interpoloimalla hahmojen liikettä. Interpolaatiota ei tule käyttää 3D-, säteenseuranta- ja kynäprojekteissa eikä viiveellisissä projekteissa, koska se hidastaa niitä lisäämättä sujuvuutta.\",\"tw.settingsModal.largeStageWarning\":\"Näin suuren esiintymislavan käyttäminen ei ole suositeltavaa! Käytä sen sijaan pienempää kokoa samalla kuvasuhteella, jotta koko näytön tila muuttaa koon sopivaksi käyttäjän näytölle.\",\"tw.settingsModal.removeFencing\":\"Poista esiintymislavan rajat\",\"tw.settingsModal.removeFencingHelp\":\"Antaa hahmojen mennä esiintymislavan ulkopuolelle, kasvaa niin suureksi tai pieneksi kuin koodi määrää ja tekee kosketuslohkoista toimivia myös esiintymislavan ulkopuolella.\",\"tw.settingsModal.removeLimits\":\"Poista rajoitukset\",\"tw.settingsModal.removeMiscLimits\":\"Poista erilaiset rajoitukset\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Poistaa äänitehosteiden ja kynän koon rajoitukset.\",\"tw.settingsModal.storeProjectOptions\":\"Tallenna asetukset projektiin\",\"tw.settingsModal.storeProjectOptionsHelp\":\"Tallentaa valitut asetukset projektiin, jotta ne otetaan automaattisesti käyttöön, kun projekti avataan TurboWarpissa. Warp-ajastin- ja Poista kääntäjä käytöstä -asetuksia ei tallenneta.\",\"tw.settingsModal.title\":\"Edistykselliset asetukset\",\"tw.settingsModal.warpTimer\":\"Warp-ajastin\",\"tw.settingsModal.warpTimerHelp\":\"Tarkastaa, ovatko skriptit jumissa pitkässä tai loputtomassa silmukassa, ja suorittaa ne tällöin matalammalla kuvataajuudella jumiin jäämisen sijaan. Tämä korjaa useimmat kaatumiset, mutta sillä on merkittävä vaikutus suorituskykyyn, joten se on oletuksena käytössä editorissa.\",\"tw.soundEditorNotSupported\":\"Äänieditoria ei tueta tässä selaimessa.\",\"tw.spriteSelectorItem.rename\":\"nimeä uudelleen\",\"tw.stageHeader.full\":\"Vaihda suureen esiintymislavaan\",\"tw.stereo\":\"Stereoääni\",\"tw.stereoAlert\":\"Stereoäänen muokkaaminen muuntaa sen peruuttamattomasti monoääneksi.\",\"tw.studioview.authorAttribution\":\"tekijä: {author}\",\"tw.studioview.error\":\"Seuraavaa projektien sivua ladatessa tapahtui virhe.\",\"tw.studioview.hoverText\":\"käyttäjän {author} projekti {title}\",\"tw.tooLarge\":\"Tämä ääni saattaa olla liian suuri Scratchiin ladattavaksi.\",\"tw.twExtension.description\":\"Erikoisia uusia lohkoja.\",\"tw.twExtension.name\":\"{APP_NAME}in lohkot\",\"tw.unfavorite\":\"Poista suosikeista\",\"tw.unknownPlatform.1\":\"Projekti on tehty eri alustalle:\",\"tw.unknownPlatform.2\":\"Yhteensopivuutta {APP_NAME}in kanssa ei ole taattu. Voit jatkaa omalla vastuullasi, mutta emme voi auttaa, jos ongelmia ilmenee.\",\"tw.unknownPlatform.continue\":\"Ymmärrän\",\"tw.unknownPlatform.title\":\"Tuntematon alusta\",\"tw.unshared.2\":\"Lisätietoja: {link}\",\"tw.unshared.bug\":\"Jos projekti on todella jaettu, ilmoita bugista.\",\"tw.unshared.cache\":\"Jos projekti jaettiin äskettäin, tämän viesti saattaa näkyä virheellisesti muutamien minuuttien ajan.\",\"tw.unshared2.1\":\"Jakamattomat projektit eivät ole enää näkyvissä.\",\"tw.usernameModal.help\":\"Tämä arvo tallennetaan selaimesi muistiin. Se kirjataan, kun olet vuorovaikutuksessa pilvimuuttujia käyttävän projektin kanssa.\",\"tw.usernameModal.help2\":\"Scratch-tilin kanssa yhteensopimattomat arvot yleensä hylätään pilvimuuttujapalvelimella. Suosittelemme olemaan muokkaamatta nimeä tai muuttamaan sen Scratch-käyttäjänimeksesi.\",\"tw.usernameModal.mustChange\":\"Pahoittelut, pilvimuuttujapalvelimen mielestä käyttäjänimesi ei ole turvallinen. Muuta se joksikin muuksi tai {resetIt}.\",\"tw.usernameModal.mustChange.resetIt\":\"nollaa se (suositeltava)\",\"tw.usernameModal.new\":\"Uusi käyttäjänimi:\",\"tw.usernameModal.reset\":\"Nollaa\",\"tw.usernameModal.title\":\"Muuta käyttäjänimi\",\"tw.usesCloudVariables\":\"Tämä projekti käyttää pilvimuuttujia.\",\"tw.usesCloudVariables2\":\"{APP_NAME}in muuttujia ei ole yhdistetty Scratchiin. Kuka vain voi {changeTheirUsername} miksi vain, joten varo toisena henkilönä esiintymistä.\",\"tw.usesCloudVariables2.change\":\"vaihtaa käyttäjänimensä\",\"tw.viewFeaturedProjects\":\"Näytä valitut projektit napauttamalla\",\"tw.viewOnScratch\":\"Näytä projekti Scratchissa\"},\"fr\":{\"tw.accent.blue\":\"Bleu\",\"tw.accent.purple\":\"Violet\",\"tw.accent.rainbow\":\"Arc-en-ciel\",\"tw.accent.red\":\"Rouge\",\"tw.alerts.creatingRestorePoint\":\"Création d\\'un point de restauration…\",\"tw.alerts.lostPeripheralConnection\":\"Le périphérique {extensionName} vient d’être déconnecté.\",\"tw.alerts.savedToDisk\":\"Enregistré sur votre ordinateur.\",\"tw.backpack.rename\":\"Nouveau nom :\",\"tw.blockColors.highContrast\":\"Contraste élevé\",\"tw.blocks.buttonIsDown\":\"bouton [MOUSE_BUTTON] de la souris pressé ?\",\"tw.blocks.lastKeyPressed\":\"dernière touche pressée\",\"tw.blocks.mouseButton.middle\":\"(1) milieu\",\"tw.blocks.mouseButton.primary\":\"(0) primaire\",\"tw.blocks.mouseButton.secondary\":\"(2) secondaire\",\"tw.blocks.openDocs\":\"Ouvrir la documentation\",\"tw.browserModal.desktopTitle\":\"Système non pris en charge\",\"tw.cantUseCloud\":\"Bien que vous puissiez créer des variables cloud, elles ne fonctionneront que si ce projet est téléchargé sur Scratch ou converti à l\\'aide d\\'un outil comme le{packager}.\",\"tw.changeUsername.cannotChangeWhileRunning\":\"Le nom d\\'utilisateur ne peut pas être modifié pendant l\\'exécution du projet.\",\"tw.code\":\"Code source\",\"tw.confirmIncompatibleExtension\":\"Cette extension est incompatible avec Scratch. Les projets réalisés avec lui ne peuvent pas être téléchargés sur le site Web de Scratch. Voulez-vous vraiment l\\'activer ?\",\"tw.createdBy\":\"Créé par :\",\"tw.customExtension.name\":\"Extension customisée\",\"tw.customExtensionModal.load\":\"Charger\",\"tw.customExtensionModal.promptFile\":\"Sélectionnez ou déposez les fichiers JavaScript des extensions\",\"tw.customExtensionModal.promptText\":\"Collez le code source JavaScript de l\\'extension :\",\"tw.customExtensionModal.promptURL\":\"Entrez l\\'URL de l\\'extension :\",\"tw.customExtensionModal.trusted\":\"Cette extension sera chargée sans la sandbox car elle provient d\\'une source fiable.\",\"tw.customExtensionModal.unsandboxed\":\"Exécuter sans la sandbox\",\"tw.customExtensionModal.unsandboxedWarning1\":\"Le chargement d\\'extensions sans sandbox est dangereux et ne doit pas être activé si vous ne savez pas ce que vous faites.\",\"tw.customExtensionModal.unsandboxedWarning2\":\"Les extensions non sandboxées peuvent corrompre votre projet, supprimer vos paramètres, voler vos mots de passe et causer d\\'autres dommages. Les développeurs de {APP_NAME} ne sont pas responsables des problèmes qui pourraient en résulter.\",\"tw.customExtensionModal.untrusted\":\"Les extensions provenant d\\'URL non fiables seront toujours chargées avec la sandbox pour des raisons de sécurité.\",\"tw.darkMode\":\"Basculer sur le mode clair\",\"tw.favorite\":\"Ajouter aux favoris\",\"tw.featuredProjectsStudio\":\"Voir le studio sur scratch.\",\"tw.feedback\":\"retour et signalement de bugues\",\"tw.fileInput.none\":\"Aucun fichier sélectionné.\",\"tw.fileInput.selected\":\"Sélectionné : {names}\",\"tw.fonts.add\":\"Ajouter\",\"tw.fonts.custom.file\":\"Sélectionnez un fichier de police sur votre ordinateur :\",\"tw.fonts.custom.name\":\"Donnez un nom à la police :\",\"tw.fonts.fallback\":\"Choisissez une police de remplacement à utiliser si la police ne parvient pas à se charger ou est supprimée :\",\"tw.fonts.readError\":\"Échec de la lecture du fichier de police : {error}\",\"tw.fonts.system.name\":\"Saisissez le nom d\\'une police intégrée à votre ordinateur. Il est possible que la police ne s\\'affiche pas correctement pour tout le monde.\",\"tw.fonts.title\":\"Polices\",\"tw.footer.credits\":\"Crédits\",\"tw.footer.embed\":\"Intégrer\",\"tw.footer.parameters\":\"Paramères URL\",\"tw.gui.crashMessage.description\":\"Nous sommes vraiment désolés, mais il semble que TurboWarp a crashé. Veuillez actualiser la page pour réessayer.\",\"tw.gui.defaultProjectTitle\":\"Projet\",\"tw.guiDefaultTitle\":\"Exécute les projets Scratch plus rapidement\",\"tw.home.credit\":\"Notes et Crédits\",\"tw.input.tooltip\":\"Copie et colle le lien d\\'un projet Scratch ici !\",\"tw.invalidParameters.clones\":\"Le paramètre d\\'URL \\\\\"clone\\\\\" n\\'est pas valide.\",\"tw.invalidParameters.fps\":\"Le paramètre d\\'URL \\\\\"fps\\\\\" n\\'est pas valide.\",\"tw.invalidProject.title\":\"Erreur\",\"tw.lightMode\":\"Baculer sur le mode sombre\",\"tw.loadExtension.unsandboxed\":\"Exécuter sans la sandbox\",\"tw.loader.downloadingAssets\":\"Téléchargement des assets ({complete}/{total}) ...\",\"tw.loader.loadingAssets\":\"Chargement des assets ({complete}/{total})...\",\"tw.loader.projectData\":\"Lecture du projet ...\",\"tw.menuBar.60off\":\"Désactiver le mode 60 FPS\",\"tw.menuBar.60on\":\"Activer le mode 60 FPS\",\"tw.menuBar.advanced\":\"Avancé\",\"tw.menuBar.changeUsername\":\"Changer le nom d\\'utilisateur\",\"tw.menuBar.cloudOff\":\"Désactiver les variables cloud\",\"tw.menuBar.cloudOn\":\"Activer les variables cloud\",\"tw.menuBar.cloudUnavailable\":\"Les variables cloud ne sont pas disponibles\",\"tw.menuBar.cloudUnavailableAlert\":\"Impossible d\\'utiliser les variables cloud, probablement parce que vous avez ouvert l\\'éditeur.\",\"tw.menuBar.compileError\":\"{sprite} : {error}\",\"tw.menuBar.moreSettings\":\"Paramètres Avancés\",\"tw.menuBar.newFramerate\":\"Nouveau ratio d\\'images par seconde :\",\"tw.menuBar.newWindow\":\"Nouvelle fenêtre\",\"tw.menuBar.package\":\"Empaqueter le projet\",\"tw.menuBar.reportError2\":\"Ceci est un bug. Merci de le signaler.\",\"tw.menuBar.saveAs\":\"Enregistrer sous {file}\",\"tw.menuBar.seeInside\":\"Voir à l\\'intérieur\",\"tw.oldDownload\":\"Enregistrer dans un fichier séparé...\",\"tw.opcode.2000\":\"jours depuis 2000\",\"tw.opcode.mousedown\":\"clic gauche?\",\"tw.opcode.mousex\":\"souris x\",\"tw.opcode.mousey\":\"souris y\",\"tw.openAdvanced\":\"Ouvrir les paramètres avancés\",\"tw.openWindow.dangerous\":\"Ce site web n\\'a pas été vérifié par les développeurs de {APP_NAME}. Il peut contenir du code dangereux ou malveillant.\",\"tw.paint.alpha\":\"Opacité\",\"tw.paint.fonts.more\":\"Ajouter d\\'autres polices...\",\"tw.privacy\":\"Politique de Confidentialité\",\"tw.recordAudio.title\":\"Le projet souhaite enregistrer le son provenant de votre microphone. Il peut s\\'agir d\\'une transcription textuelle ou de données audio brutes. Le projet peut être en mesure de partager le son avec d\\'autres utilisateurs ou serveurs.\",\"tw.recordVideo.permission\":\"Si vous l\\'autorisez, votre navigateur peut vous demander d\\'activer l\\'accès à la caméra, et tout accès ultérieur à la caméra sera automatiquement autorisé.\",\"tw.recordVideo.title\":\"Le projet souhaite enregistrer des vidéos à partir de votre caméra. Le projet peut être en mesure de partager des images avec d\\'autres utilisateurs ou serveurs.\",\"tw.redirect.dangerous\":\"Ce site web n\\'a pas été vérifié par les développeurs de {APP_NAME}. Il peut contenir du code dangereux ou malveillant.\",\"tw.redirect.title\":\"Le projet souhaite naviguer vers cette URL à partir de cet onglet :\",\"tw.restorePoints.deleteAll\":\"Tout supprimer\",\"tw.restorePoints.loading\":\"Chargement...\",\"tw.saveAs\":\"Enregistrer sous...\",\"tw.saveTo\":\"Sauvegarder sous {file}\",\"tw.scratchUnsafeCloud\":\"Si vous créez cette variable cloud, le projet dépassera la limite de Scratch de {number} variables, et certaines variables ne fonctionneront pas si vous téléchargez le projet dans Scratch.\",\"tw.securityManager.allow\":\"Autoriser\",\"tw.securityManager.deny\":\"Refuser\",\"tw.securityManager.title\":\"Sécurité des extensions\",\"tw.settingsModal.customStageSize\":\"Taille de la scène personnalisé :\",\"tw.settingsModal.customStageSizeHelp\":\"Change la taille de la scène Scratch de 480x360 à autre chose. Essayez 640x360 pour rendre la scène grand écran. Très peu de projets gèrent cela correctement.\",\"tw.settingsModal.dangerZone\":\"Zone de danger\",\"tw.settingsModal.disableCompiler\":\"Désactiver le compilateur\",\"tw.settingsModal.featured\":\"En vedette\",\"tw.settingsModal.fps\":\"60 FPS (personnalisé)\",\"tw.settingsModal.fpsHelp\":\"Exécute les scripts 60 fois par seconde au lieu de 30. La plupart des projets ne fonctionneront pas correctement si cette option est activée. Vous devriez essayer l\\'interpolation avec le mode 60 FPS désactivé si tel est le cas.{customFramerate}\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Clique pour utiliser un autre ratio d\\'images par seconde (FPS) que 30 ou 60\",\"tw.settingsModal.help\":\"Clique pour obtenir de l\\'aide\",\"tw.settingsModal.highQualityPen\":\"Stylo de haute qualité\",\"tw.settingsModal.highQualityPenHelp\":\"Permet aux projets utilisant le stylo d\\'utiliser une plus grande résolution et permet de désactiver certains arrondis dans les coordonnées de l\\'éditeur. Tout le projet ne bénéfie pas de ce paramètre et il peut impacter la performance.\",\"tw.settingsModal.infiniteClones\":\"Clones Infinis\",\"tw.settingsModal.infiniteClonesHelp\":\"Désactive la limite de 300 clones de Scratch\",\"tw.settingsModal.interpolationHelp\":\"Rend les projets plus fluides en interpolant le mouvement du sprite. L\\'interpolation ne doit pas être utilisée sur les projets 3D, les lanceurs de rayons, les projets de stylet et les projets décalés, car l\\'interpolation les ralentira sans les rendre plus lisses.\",\"tw.settingsModal.largeStageWarning\":\"Utiliser une taille de scène personnalisée plus large n\\'est pas recommandé. Utilisez plutôt cette option pour une taille plus petite et avec le même ration longueur/largeur pour que le projet soit facilement utilisable par n\\'importe quel utilisateur.\",\"tw.settingsModal.removeFencing\":\"Supprimer les limites\",\"tw.settingsModal.removeFencingHelp\":\"Permet aux sprites de se déplacer hors de l\\'écran, de devenir aussi grands ou aussi petits qu\\'ils le souhaitent et de faire fonctionner les blocs tactiles hors de l\\'écran.\",\"tw.settingsModal.removeLimits\":\"Supprimer les limites\",\"tw.settingsModal.removeMiscLimits\":\"Supprimer diverses limites\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Supprime les limites des effets sonores ou celles de la taille du stylo.\",\"tw.settingsModal.storeProjectOptions\":\"Sauvegarder les paramètres du projet.\",\"tw.settingsModal.storeProjectOptionsHelp\":\"Stocke les paramètres sélectionnés dans le projet afin qu\\'ils soient automatiquement appliqués lorsque TurboWarp charge ce projet. Le temporisateur Warp et le compilateur désactivé ne seront pas enregistrés.\",\"tw.settingsModal.title\":\"Paramètres Avancés\",\"tw.settingsModal.warpTimer\":\"Vérificateur de boucles infinies.\",\"tw.settingsModal.warpTimerHelp\":\"Vérifie si les scripts sont bloqués dans des boucles infinies, et le cas échéant, fait tourner le programme a une vitesse très réduite pour empêcher le logiciel de crasher. Cela peut cependant fortement impacter les performances du programme.\",\"tw.spriteSelectorItem.rename\":\"renommer\",\"tw.stereo\":\"Stéréo\",\"tw.stereoAlert\":\"L\\'édition de ce son stéréo le convertira irréversiblement en mono.\",\"tw.studioview.authorAttribution\":\"Fait par {author}\",\"tw.studioview.error\":\"Il y a eu une erreur dans le chargement de la page suivante des projets\",\"tw.studioview.hoverText\":\"{title} fait par {author}\",\"tw.tooLarge\":\"Ce son peut être trop volumineux pour être chargé dans Scratch.\",\"tw.unfavorite\":\"Supprimer des favoris\",\"tw.unshared.2\":\"Pour plus d\\'informations, visitez : {link}\",\"tw.unshared.cache\":\"Si le projet a été partagé récemment, ce message peut s\\'afficher de manière incorrecte pendant quelques minutes.\",\"tw.usernameModal.help\":\"Cette valeur sera stockée dans la mémoire de votre navigateur. Il peut être consigné lorsque vous interagissez avec des projets contenant des variables cloud.\",\"tw.usernameModal.help2\":\"Les valeurs qui ne correspondent pas à un compte Scratch valide seront généralement rejetées par le serveur de variables cloud. Nous vous recommandons de le laisser tel quel ou de le remplacer par votre nom d\\'utilisateur Scratch.\",\"tw.usernameModal.mustChange\":\"Désolé, le serveur de variables cloud pense que votre nom d\\'utilisateur n\\'est peut-être pas sûr. Veuillez le changer pour autre chose ou{resetIt}.\",\"tw.usernameModal.mustChange.resetIt\":\"réinitialiser (recommandé)\",\"tw.usernameModal.reset\":\"Réinitialiser\",\"tw.usernameModal.title\":\"Changer votre nom d\\'utilisateur\",\"tw.usesCloudVariables\":\"Ce projet utilise des variables cloud.\",\"tw.viewFeaturedProjects\":\"Cliquez pour voir les projets sélectionnés.\",\"tw.viewOnScratch\":\"Voir le projet sur Scratch\"},\"he\":{\"tw.accent.blue\":\"כחול\",\"tw.accent.purple\":\"סגול\",\"tw.accent.rainbow\":\"צבעוני\",\"tw.accent.red\":\"אדום\",\"tw.alerts.creatingRestorePoint\":\"ביצוע נקודת שחזור קוד\",\"tw.alerts.lostPeripheralConnection\":\"איבד חיבור ל{extensionName}.\",\"tw.alerts.savedToDisk\":\"הקובץ נשמר בהתקן שלך.\",\"tw.backpack.rename\":\"שם חדש:\",\"tw.blockColors.dark\":\"כהה (בטא)\",\"tw.blockColors.highContrast\":\"ניגודיות גבוהה\",\"tw.blockColors.three\":\"מקורי\",\"tw.blocks.addons\":\"הרחבות\",\"tw.blocks.buttonIsDown\":\"[MOUSE_BUTTON]לחצן העכבר נלחץ?\",\"tw.blocks.lastKeyPressed\":\"מקש אחרון שנלחץ על המקלדת\",\"tw.blocks.mouseButton.middle\":\"(1) במרכז\",\"tw.blocks.mouseButton.primary\":\"(0)נורמלי\",\"tw.blocks.mouseButton.secondary\":\"(2) שני\",\"tw.blocks.openDocs\":\"פתח מסמכים\",\"tw.browserModal.desktopTitle\":\"המערכת לא נתמכת\",\"tw.changeUsername.cannotChangeWhileRunning\":\"אינך יכול לשנות את שם המשתמש שלך כאשר פרויקט הקוד פועל.\",\"tw.cloudProvider\":\"השרת מופעל על ידי {name}.\",\"tw.cloudServers\":\"בחר את השרת הקרוב אליך:\",\"tw.code\":\"קוד קוד פתוח\",\"tw.createdBy\":\"נוצר על ידי:\",\"tw.customExtension.name\":\"הרחבה מותאמת אישית\",\"tw.customExtensionModal.file\":\"קבצים\",\"tw.customExtensionModal.load\":\"העלאה\",\"tw.customExtensionModal.promptURL\":\"הזן את כתובת האתר של ההרחבה:\",\"tw.customExtensionModal.text\":\"טקסט\",\"tw.customExtensionModal.title\":\"העלה הרחבה מותאמת אישית\",\"tw.customExtensionModal.unsandboxed\":\"הפעל ללא ארגז חול\",\"tw.customExtensionModal.unsandboxedWarning1\":\"טעינת תוספים ללא ארגז חול מסוכנת ואין להפעיל אותה אם אתה לא יודע מה אתה עושה.\",\"tw.customExtensionModal.url\":\"כתובת אתר\",\"tw.darkMode\":\"החלף למצב בהיר\",\"tw.documentation\":\"מסמכים\",\"tw.featuredProjectsStudio\":\"הצג את הסטודיו על קידוד שריטות\",\"tw.feedback\":\"הצעות ושגיאות\",\"tw.feedbackButton\":\"משוב על {APP_NAME}\",\"tw.fileInput.none\":\"אף קובץ לא נבחר.\",\"tw.fileInput.selected\":\"נבחרו: {names}\",\"tw.fonts.add\":\"הוספה\",\"tw.fonts.list\":\"פונטים שהוספת:\",\"tw.fonts.none\":\"אף פונט לא נוסף עוד.\",\"tw.fonts.title\":\"פונטים\",\"tw.footer.credits\":\"קרידיטים\",\"tw.footer.disclaimer\":\"{APP_NAME} אינו קשור ל-Scratch, לצוות Scratch או לקרן Scratch.\",\"tw.footer.documentation\":\"מסמכים\",\"tw.footer.scratchDisclaimer\":\"Scratch הוא פרויקט של קרן Scratch. הוא זמין בחינם באתר {scratchDotOrg}.\",\"tw.fps\":\"{framerate} פריימים לשנייה\",\"tw.gui.crashMessage.description\":\"אנו מתנצלים; נראה שהדף קרס. אנא רענן דף זה כדי לנסות שוב.\",\"tw.gui.defaultProjectTitle\":\"פרויקט קידוד\",\"tw.guiDefaultTitle\":\"מריץ פרוייקטי Scratch מהר יותר\",\"tw.home.credit\":\"מידע וייחוסים\",\"tw.home.description\":\"{APP_NAME} הוא מוד Scratch שממיר פרויקטים ל-JavaScript כדי לגרום להם לרוץ מהר מאוד. נסו זאת על ידי הזנת מזהה פרויקט או כתובת אתר למעלה או בחירת פרויקט מומלץ למטה.\",\"tw.home.instructions\":\"איך להישתמש\",\"tw.input.tooltip\":\"העתק והדבק קישור לפרויקט Scratch כאן!\",\"tw.invalidParameters.clones\":\"פרמטר כתובת האתר \\\\\"כפול\\\\\" אינו חוקי\",\"tw.invalidParameters.fps\":\"פרמטר כתובת האתר \\\\\"מסגרות לשנייה\\\\\" אינו חוקי\",\"tw.invalidProject.error\":\"לא הצלחנו לטעון את הפרויקט:\",\"tw.invalidProject.reportIt\":\"דווח\",\"tw.invalidProject.restorePoints\":\"צפה בנקודות השחזור\",\"tw.invalidProject.title\":\"שגיאה\",\"tw.lightMode\":\"החלף למצב כהה\",\"tw.loadExtension.unsandboxed\":\"הפעל ללא ארגז חול\",\"tw.loader.downloadingAssets\":\"הורדה של נכסים({complete}/{total})...\",\"tw.loader.loadingAssets\":\"טוען נכסים ({complete} מתוך {total})...\",\"tw.loader.projectData\":\"טוען פרויקט...\",\"tw.menuBar.60off\":\"כבה את מצב \\\\\"מסגרות גבוהות לשנייה\\\\\".\",\"tw.menuBar.60on\":\"הפעל את מצב \\\\\"פריימים גבוהים לשניה\\\\\".\",\"tw.menuBar.addons\":\"הרחבות\",\"tw.menuBar.advanced\":\"מתקדם\",\"tw.menuBar.blockColors\":\"צבעי בלוקים\",\"tw.menuBar.changeUsername\":\"לשנות את שם המשתמש\",\"tw.menuBar.cloudOff\":\"כבה את משתני השרת\",\"tw.menuBar.cloudOn\":\"אפשר משתני שרת\",\"tw.menuBar.cloudUnavailable\":\"משתני שרת אינם זמינים\",\"tw.menuBar.cloudUnavailableAlert\":\"משתני שרת אינם זמינים. אתה כנראה משתמש בעורך הקוד.\",\"tw.menuBar.compileError\":\"{sprite}:{error}\",\"tw.menuBar.moreSettings\":\"הגדרות מתקדמות\",\"tw.menuBar.newFramerate\":\"קצב חדש של מסגרות לשנייה:\",\"tw.menuBar.newWindow\":\"חלון חדש\",\"tw.menuBar.package\":\"אריזת פרויקט\",\"tw.menuBar.reportError2\":\"יש שגיאה. אנא צור איתי קשר בנושא.\",\"tw.menuBar.restorePoints\":\"נקודות שחזור\",\"tw.menuBar.saveAs\":\"שמור בשם{file}\",\"tw.menuBar.seeInside\":\"עיין בקוד המקור\",\"tw.mono\":\"מונו\",\"tw.moreCloud\":\"למד עוד על משתני ענן.\",\"tw.opcode.2000\":\"ימים מאז 2000\",\"tw.opcode.mousedown\":\"עכבר נלחץ?\",\"tw.opcode.mousex\":\"מיקום עכבר בציר x\",\"tw.opcode.mousey\":\"מיקום עכבר בציר y\",\"tw.openAdvanced\":\"פתח הגדרות מתקדמות\",\"tw.paint.alpha\":\"שקיפות\",\"tw.paint.fonts.more\":\"הוסף פונטים נוספים...\",\"tw.privacy\":\"מדיניות הפרטיות\",\"tw.restorePoints.1minute\":\"כל דקה\",\"tw.restorePoints.deleteAll\":\"מחק הכל\",\"tw.restorePoints.empty\":\"לא נמצאו נקודות שחזור.\",\"tw.restorePoints.loading\":\"טוען...\",\"tw.restorePoints.minutes\":\"כל {n} דקות\",\"tw.restorePoints.never\":\"לעולם לא\",\"tw.restorePoints.title\":\"נקודות שחזור\",\"tw.sample\":\"פרויקט דוגמה\",\"tw.saveAs\":\"שמור בשם...\",\"tw.saveTo\":\"עדכן את {file}\",\"tw.scratchUnsafeCloud\":\"אם תיצור את משתנה הענן הזה, הפרויקט יחרוג ממגבלת {number} המשתנים של Scratch, וחלק מהמשתנים לא יפעלו אם תעלה את הפרויקט ל-Scratch.\",\"tw.securityManager.allow\":\"אישור\",\"tw.securityManager.deny\":\"ביטול\",\"tw.settingsModal.customStageSize\":\"גודל במה מותאם אישית:\",\"tw.settingsModal.help\":\"לחץ לעזרה\",\"tw.settingsModal.highQualityPen\":\"עט באיכות גבוהה\",\"tw.settingsModal.infiniteClones\":\"כפילים ללא הגבלה\",\"tw.settingsModal.infiniteClonesHelp\":\"מבטל את מגבלת 300 הכפילים של Scratch.\",\"tw.settingsModal.title\":\"הגדרות מתקדמות\",\"tw.spriteSelectorItem.rename\":\"שינוי שם\",\"tw.stereo\":\"סטריאו\",\"tw.studioview.authorAttribution\":\"על ידי{author}\",\"tw.studioview.error\":\"לא ניתן היה לטעון את העמוד הבא של פרויקטי קוד.\",\"tw.studioview.hoverText\":\"{title}נוצר על ידי{author}\",\"tw.tooLarge\":\"הצליל הזה אולי יהיה גדול מדי בשביל Scratch.\",\"tw.unknownPlatform.continue\":\"אני מבין\",\"tw.unshared.2\":\"לעוד מידע, היכנס ל{link}.\",\"tw.unshared2.1\":\"פרויקטים לא משותפים לא זמינים יותר לצפייה.\",\"tw.usernameModal.new\":\"שם משתמש חדש:\",\"tw.usernameModal.reset\":\"אִתחוּל\",\"tw.usernameModal.title\":\"לשנות את שם המשתמש\",\"tw.usesCloudVariables\":\"פרויקט זה משתמש במשתני ענן.\",\"tw.usesCloudVariables2\":\"משתני הענן של {APP_NAME} אינם מקושרים למשתני Scratch. כל אחד יכול {changeTheirUsername} לכל דבר, לכן היזהרו מהתחזות.\",\"tw.usesCloudVariables2.change\":\"שינוי שם המשתמש\",\"tw.viewFeaturedProjects\":\"לחץ על כפתור זה כדי להציג פרויקטי קוד נבחרים.\",\"tw.viewOnScratch\":\"צפה בפרויקט בScratch.\"},\"hu\":{\"tw.accent.blue\":\"Kék\",\"tw.accent.purple\":\"Lila\",\"tw.accent.rainbow\":\"Szivárvány\",\"tw.accent.red\":\"Piros\",\"tw.alerts.creatingRestorePoint\":\"Helyreállítási pont készítése...\",\"tw.alerts.lostPeripheralConnection\":\"Kapcsolat a(z) {extensionName} nevű bővítményhez elveszítve\",\"tw.alerts.restorePointError\":\"Nem lehetett készíteni egy helyreállítási pontot\",\"tw.alerts.restorePointSuccess\":\"Helyreállítási pontok a \\\\\"Fájl\\\\\" menüben vannak\",\"tw.alerts.savedToDisk\":\"Mentve a számítógépre.\",\"tw.backpack.rename\":\"Új név:\",\"tw.blockColors.custom\":\"Testreszabás a kiegészítő-beállításokban\",\"tw.blockColors.dark\":\"Sötét (béta)\",\"tw.blockColors.highContrast\":\"Magas kontraszt\",\"tw.blockColors.three\":\"Eredeti\",\"tw.blocks.PROCEDURES_DOCS\":\"Így használd a visszatérést\",\"tw.blocks.PROCEDURES_RETURN\":\"{v} visszaadása\",\"tw.blocks.PROCEDURES_TO_REPORTER\":\"Értékblokká alakítás\",\"tw.blocks.PROCEDURES_TO_STATEMENT\":\"Kirakóelemmé alakítás\",\"tw.blocks.addons\":\"Kiegészítők\",\"tw.blocks.buttonIsDown\":\"[MOUSE_BUTTON] egérbillentyű lenyomva?\",\"tw.blocks.lastKeyPressed\":\"utolsó lenyomott billentyű\",\"tw.blocks.mouseButton.middle\":\"(1) középső\",\"tw.blocks.mouseButton.primary\":\"(0) elsődleges\",\"tw.blocks.mouseButton.secondary\":\"(2) másodlagos\",\"tw.blocks.openDocs\":\"Dokumentáció megnyitása\",\"tw.browserModal.desktopSettings\":\"Asztali beállítások megnyitása\",\"tw.browserModal.desktopTitle\":\"A rendszer nem támogatott\",\"tw.browserModal.webgl1\":\"A {APP_NAME} WebGL-t igényel, amit úgy néz ki viszont, hogy az eszközöd nem támogat. Ez sokszor csak egy ideiglenesen fellépő gond, ami a géped újraindításával megszüntethető.\",\"tw.browserModal.webglBrowser\":\"Használd a Chrome, Firefox vagy Safari egy friss verzióját és győződj meg róla, hogy a grafikus meghajtók naprakészek. Megpróbálhatod a \\\\\"grafikus gyorsítás\\\\\" vagy a \\\\\"hardveres gyorsítás\\\\\" lehetőséget a böngésződ beállításai közt.\",\"tw.browserModal.webglDesktop\":\"Megpróbálhatod átkapcsolni a \\\\\"grafikus gyorsítás\\\\\" opciót az asztali beállításokban:\",\"tw.cantUseCloud\":\"Noha képes vagy megosztott változókat létrehozni, nem fognak működni, amíg ez a projekt fel nem töltődik a Scratchre vagy nem kerül sor olyan eszközök használatára, mint a {packager}.\",\"tw.changeUsername.cannotChangeWhileRunning\":\"A felhasználónév nem változtatható meg a projekt futása alatt.\",\"tw.clipboard.danger\":\"Ha a vágolapod olyan dolgokat, mint jelszavakat tartalmaz, a projekt esetleg megoszthatja másik felhasználókkal vagy szerverekkel.\",\"tw.clipboard.permission\":\"A vágólaphoz való hozzáférés, elképzelhető, hogy nem lesz minden böngészőben elérhető. Ha egyszer engedélyezett, későbbi vágólap-olvasások is akadály nélkül megtörténhetnek.\",\"tw.clipboard.title\":\"Ez a projekt szeretné a vágólapról adatot olvasni.\",\"tw.cloudProvider\":\"A szervert közzéteszi: {name}.\",\"tw.cloudServers\":\"Válassz egy nálad közeli lévő szervert:\",\"tw.code\":\"Forráskód\",\"tw.confirmIncompatibleExtension\":\"Ez a kiegészítés nem kompatibilis a Scratchhel. Ezzel készített projekteket nem lehet feltölteni a Scratch weboldalára. Biztos, hogy mégis engedélyezni szeretnéd őket?\",\"tw.createdBy\":\"Készítette:\",\"tw.customCloudServer\":\"Egy egyéni megosztott változó-szervert használsz: {server}\",\"tw.customExtension.description\":\"Tölts be egyéni bővítményeket URL-böl, fájlokból vagy JavaScript forráskódból.\",\"tw.customExtension.name\":\"Egyéni bővítmény\",\"tw.customExtensionModal.file\":\"Fájlok\",\"tw.customExtensionModal.load\":\"Betöltés\",\"tw.customExtensionModal.promptFile\":\"Jelölj ki vagy húzz ide bővítmények JavaScript fájlját:\",\"tw.customExtensionModal.promptText\":\"Illeszd be a bővítmény JavaScript forráskódját:\",\"tw.customExtensionModal.promptURL\":\"Add meg a bővítmény URL-jét:\",\"tw.customExtensionModal.text\":\"Szöveg\",\"tw.customExtensionModal.title\":\"Egyéni bővitmény betöltése\",\"tw.customExtensionModal.trusted\":\"Ez a bővítmény homokozó nélkül fog betöltődni, mivel egy megbízható forrásból származik.\",\"tw.customExtensionModal.unsandboxed\":\"Futtatás homokozó használata nélkül\",\"tw.customExtensionModal.unsandboxedWarning1\":\"A bővítmény betöltése homokozó nélkül veszélyes és nem érdemes megpróbálni, ha nem tudod pontosan, mit csinálsz.\",\"tw.customExtensionModal.unsandboxedWarning2\":\"A homokozóban nem futtatott bővítmények elronthatják a projektedet, kitörölhetik a beállításaidat, elhalászhatják jelszóidat és más rossz dolgokat is tehetnek. A {APP_NAME} fejlesztői nem felelősek semmilyen okozott kellemetlenségért.\",\"tw.customExtensionModal.untrusted\":\"Megbízhatatlan URL-ekből származó bővítmények mindig homokozó használatával kerülnek betöltésre a biztonság érdekében.\",\"tw.customReporters.description\":\"Lehetővé teszi a saját blokkoknak, hogy értékeket adjanak vissza és, hogy bemenetként lehessen használni.\",\"tw.customReporters.name\":\"Saját értékblokkok\",\"tw.darkMode\":\"Átváltás világos módra\",\"tw.desktopCloud\":\"Az asztali alkalmazásban a megosztott változók szinkronizálódnak minden e gépen levő ablak között. Töltsd fel a projektet Scratchre, vagy használj egy olyan eszközt mint a {packager}, hogy a felhőben is szinkronizálva legyenek.\",\"tw.documentation\":\"Dokumentáció\",\"tw.download.danger\":\"Ez a fájl nem lett átvizsgálva a {APP_NAME} fejlesztői által.\",\"tw.download.executable\":\"Ez egy futattható fájl formátum ami lehet, hogy rosszindulatú kódot tartalmazhat, ha futtatod.\",\"tw.download.file\":\"A projekt fájlt akar letölteni a számítógépedre. {name} néven lesz mentve a letöltés-mappádba.\",\"tw.embed.persistent\":\"Engedélyezés esetén a későbbi beágyazások ugyanehhez a weboldalhoz automatikusan el lesznek fogadva.\",\"tw.embed.risks\":\"Noha a beágyazandó tartalom homokozóban kerül futtatásra először, továbbra is hozzáférhet információkhoz az eszközödről, mint amilyen az IP-címed és a megközelítő tartózkodási helyed is.\",\"tw.embed.title1\":\"A projekt HTML-tartalmat szeretne a színpadra illeszteni.\",\"tw.embed.title2\":\"A projekt távoli tartalmat szeretne a színpadra illeszteni.\",\"tw.extensionGallery.error\":\"Hiba lépett fel a bővítménykönyvtár betöltésekor. Látogasd meg az extension.turbowarp.org-ot több bővítmény felleléséhez.\",\"tw.extensionGallery.loading\":\"Bövítménygaléria betöltése...\",\"tw.extensionGallery.more\":\"Tudj többet a bővítményekről a extensions.turbowarp.org weboldalon.\",\"tw.extensionGallery.name\":\"{APP_NAME}-bövítménygaléria\",\"tw.favorite\":\"Kedvencként jelölés\",\"tw.featuredProjectsStudio\":\"Műhely megtekintése a Scratchen.\",\"tw.feedback\":\"Visszajelzés és hibák\",\"tw.feedbackButton\":\"Visszajelzés a {APP_NAME}-ról\",\"tw.fetch.title\":\"A projekt csatlakozni szeretne a következő weboldalhoz:\",\"tw.fileInput.none\":\"Nincsenek kiválasztva fájlok.\",\"tw.fileInput.selected\":\"Kiválasztva: {names}\",\"tw.fonts.add\":\"Hozzáadás\",\"tw.fonts.custom.file\":\"Válassz egy betűkészletfájlot a számítógépedről:\",\"tw.fonts.custom.name\":\"Adj a betűtípusnak egy nevet:\",\"tw.fonts.custom1\":\"Betűtípus hozzáadása fájlból\",\"tw.fonts.custom2\":\"Általában nem fog működni a Scratchen. Támogatott formátumok: {formats}.\",\"tw.fonts.delete\":\"Biztos, hogy ki szeretnéd törölni a következő betűtípust: „{font}”? Minden vektoros jelmez a tartalék-betűtípust fogja helyette használni.\",\"tw.fonts.fallback\":\"Válassz ki egy tartalék-betűtípust, ha a betűtípust nem sikerül betölteni vagy már ki lett törölve:\",\"tw.fonts.list\":\"Telepített betűtípusok:\",\"tw.fonts.none\":\"Még nincs betűtípus hozzáadva.\",\"tw.fonts.readError\":\"Nem sikerült beolvasni a betűtípus-fájlt: {error}\",\"tw.fonts.system\":\"Rendszerbetűtípus\",\"tw.fonts.system.name\":\"Írd be a nevét bármilyen számítógépeden megtalálható betűtípusnak. A betűtípus nem biztos, hogy mindenkinek megfelelő módon fog megjelenni.\",\"tw.fonts.system1\":\"Rendszerbetűtípus hozzáadása\",\"tw.fonts.system2\":\"Működhet a Scratch-ben, de nem fog mindenkinek helyesen megjelenni.\",\"tw.fonts.title\":\"Betűtípusok\",\"tw.footer.credits\":\"Stáblista\",\"tw.footer.disclaimer\":\"A {APP_NAME} nem áll hivatalos kapcsolatban a Scratch-vel, a Scratch Csapattal vagy a Scratch Alapítvánnyal.\",\"tw.footer.documentation\":\"Dokumentáció\",\"tw.footer.embed\":\"Beágyazás\",\"tw.footer.parameters\":\"URL paraméterek\",\"tw.footer.scratchDisclaimer\":\"A Scratch a Scratch Alapítvány egy projektje, ami elérhető {scratchDotOrg} ingyenesen.\",\"tw.geolocate.permission\":\"Amennyiben elfogadod, lehet hogy a böngésző által is meg leszel kérve a helyadatokhoz való hozzáférés engedélyezéséhez.\",\"tw.geolocate.title\":\"A projekt hozzá szeretne férni a tartózkodási helyedhez.\",\"tw.gui.crashMessage.description\":\"Nagyon sajnáljuk, de úgy tűnik, hogy a projekt összeomlott. Kérjük frissítsd az oldalt, és próbáld újra.\",\"tw.gui.defaultProjectTitle\":\"Projekt\",\"tw.guiDefaultTitle\":\"Scratch projektek futtatása gyorsabban\",\"tw.home.credit\":\"Megjegyzések és stáblista\",\"tw.home.description\":\"A {APP_NAME} egy Scratch-modifikáció, ami átfordítja a projekteket JavaScriptbe, így igazán gyorsan lefuttatva őket. Próbáld ki egy projekt azonosítójának (ID) vagy URL-jének a fenti mezőbe történő beillesztésével, illetve egy kiemelt projekt választásával lentről.\",\"tw.home.instructions\":\"Utasítások\",\"tw.input.tooltip\":\"Másolj, majd illessz be Scratch-projekt linkeket ide!\",\"tw.interpolationEnabled\":\"Interpoláció\",\"tw.invalidParameters.clones\":\"A \\\\\"clone\\\\\" URL paraméter érvénytelen\",\"tw.invalidParameters.fps\":\"Az \\\\\"fps\\\\\" URL paraméter érvénytelen\",\"tw.invalidProject.error\":\"Nem sikerült betölteni a projektet.\",\"tw.invalidProject.options\":\"Lehet, hogy vissza tudod tölteni egy korábbi verzióját a projektnek egy automatikus vagy másmilyen biztonsági mentésből.\",\"tw.invalidProject.reportIt\":\"jelentsd\",\"tw.invalidProject.restorePoints\":\"Biztonsági mentések megtekintése\",\"tw.invalidProject.title\":\"Hiba\",\"tw.invalidProject.validationError\":\"Ez a hiba gyakran azt jelenti, hogy egy kis része a projektnek megsérült, de máskülönben szabályos. Ebben az esetben könnyen megjavítható a hiba, így kérlek {reportIt}.\",\"tw.lightMode\":\"Átváltás sötét módra\",\"tw.loadExtension.embedded\":\"A projekt be szeretne tölteni egy egyedi bővítményt a következő kóddal:\",\"tw.loadExtension.sandboxed\":\"A kódnak a homokozóban történő futása közben továbbra is alkalma lesz hozzáférni információkhoz az eszközödről, mint például az IP-címedhez, vagy a körülbelüli tartózkodási helyedhez. Győződj meg róla a továbblépés előtt, hogy bízol-e a bővítmény készítőiben.\",\"tw.loadExtension.unsandboxed\":\"Futtatás homokozó használata nélkül\",\"tw.loadExtension.unsandboxedWarning\":\"Bővítmények betöltése homokozó nélkül veszélyes. Elronthatják a projektedet, kitörölhetik a beállításaidat, elhalászhatják jelszóidat és más rossz dolgokat is tehetnek. A {APP_NAME} fejlesztői nem felelősek semmilyen okozott kellemetlenségért.\",\"tw.loadExtension.url\":\"A projekt be szeretne tölteni egy egyedi bővítményt a következő URL-ből:\",\"tw.loader.downloadingAssets\":\"Tartozékok letöltése ({complete}/{total}) …\",\"tw.loader.loadingAssets\":\"Tartozékok betöltése ({complete}/{total}) …\",\"tw.loader.projectData\":\"Projekt betöltése ...\",\"tw.menuBar.60off\":\"60 FPS mód kikapcsolása\",\"tw.menuBar.60on\":\"60 FPS mód bekapcsolása\",\"tw.menuBar.accent\":\"Kiemelés\",\"tw.menuBar.addons\":\"Kiegészítők\",\"tw.menuBar.advanced\":\"Haladó\",\"tw.menuBar.blockColors\":\"Blokk-színek\",\"tw.menuBar.changeUsername\":\"Felhasználónév megváltoztatása\",\"tw.menuBar.cloudOff\":\"Megosztott változók kikapcsolása\",\"tw.menuBar.cloudOn\":\"Megosztott változók bekapcsolása\",\"tw.menuBar.cloudUnavailable\":\"Nem érhetőek el a megosztott változók\",\"tw.menuBar.cloudUnavailableAlert\":\"Nem használhatóak a megosztott változók, legvalószínűbben azért, mert megnyitottad a szerkesztőt.\",\"tw.menuBar.desktopSettings\":\"Asztali beállítások\",\"tw.menuBar.moreSettings\":\"Haladó beállítások\",\"tw.menuBar.newFramerate\":\"Új képkockaarány:\",\"tw.menuBar.newWindow\":\"Új ablak\",\"tw.menuBar.package\":\"Projekt csomagolása\",\"tw.menuBar.reportError1\":\"Néhány szkript hibákat észlelt.\",\"tw.menuBar.reportError2\":\"Ez egy hiba. Kérjük jelentsd.\",\"tw.menuBar.restorePoints\":\"Helyreállítási pontok\",\"tw.menuBar.saveAs\":\"Mentés {file}-ként\",\"tw.menuBar.seeInside\":\"Megnézem belülről\",\"tw.mono\":\"Monó\",\"tw.moreCloud\":\"Megosztott változókról több megtudása.\",\"tw.notify.permission\":\"Amennyiben engedélyezed, lehet hogy a böngésződ megkér, hogy hagyd jóvá az értesítések megjelenítését, s akkor további értesítések már automatikusan engedélyezve lesznek.\",\"tw.notify.title\":\"A projekt értesítéseket szeretne megjeleníteni.\",\"tw.oldDownload\":\"Mentés más fájlba...\",\"tw.opcode.2000\":\"napok 2000 óta\",\"tw.opcode.mousedown\":\"egér lenyomva?\",\"tw.opcode.mousex\":\"egér x\",\"tw.opcode.mousey\":\"egér y\",\"tw.openAdvanced\":\"Haladó beállítások megnyitása\",\"tw.openWindow.dangerous\":\"Ez a weboldal nem került ellenőrzésre a {APP_NAME} fejlesztői által. Veszélyes vagy rossz szándékú kódot is tartalmazhat.\",\"tw.openWindow.title\":\"A projekt egy új ablakot vagy lapot szeretne megnyitni az alábbi URL-lel:\",\"tw.paint.alpha\":\"Áttetszőség\",\"tw.paint.fonts.more\":\"Betűtípusok hozzáadása...\",\"tw.pen.stageSelected\":\"A színpad van kiválasztva: kevesebb tollblokk\",\"tw.privacy\":\"Adatvédelmi Irányelvek\",\"tw.recordAudio.permission\":\"Amennyiben engedélyezed, lehet hogy a böngésződ megkér, hogy hagyd jóvá a mikrofonhoz való hozzáférést, s akkor további felvételek a mikrofonnal már automatikusan engedélyezve lesznek.\",\"tw.recordAudio.title\":\"A projekt hangot szeretne rögzíteni a mikrofonoddal. Ez magába foglalhatja egy szöveg felolvasását vagy nyers hanganyagot. A projekt lehet, hogy képes megosztani hangfájlokat más felhasználókkal vagy szerverekkel.\",\"tw.recordVideo.permission\":\"Amennyiben engedélyezed, lehet hogy a böngésződ megkér, hogy hagyd jóvá a kamerádhoz való hozzáférést, s akkor további felvételek a kamerával már automatikusan engedélyezve lesznek.\",\"tw.recordVideo.title\":\"A projekt videót szeretne rögzíteni a kamera segítségével. A projekt lehet, hogy képes megosztani képeket más felhasználókkal vagy szerverekkel.\",\"tw.redirect.dangerous\":\"Ez a weboldal nem került ellenőrzésre a {APP_NAME} fejlesztői által. Veszélyes vagy rossz szándékú kódot is tartalmazhat.\",\"tw.redirect.title\":\"A projekt a következő URL-hez szeretné irányítani ezt a lapot:\",\"tw.removedTrademarks\":\"Néhány elem elkerült innen, amely tartalmazott Scratch védjegyet.\",\"tw.restorePoints.1minute\":\"percenként\",\"tw.restorePoints.assets\":\"{n} tartozék\",\"tw.restorePoints.confirmDelete\":\"Biztos, ki szeretnéd törölni ezt a mentést: „{projectTitle}”? Nem vonható vissza a törlés.\",\"tw.restorePoints.confirmDeleteAll\":\"Biztos, hogy MINDEN biztonsági mentést törölni szeretnél? Nem csinálhatod vissza később.\",\"tw.restorePoints.confirmLoad\":\"Mentetlen változtatásaid vannak. Le szeretnéd cserélni a projektet mégis?\",\"tw.restorePoints.deleteAll\":\"Összes törlése\",\"tw.restorePoints.description\":\"A {APP_NAME} időközönként helyreállítási pontokat készít a számtógépeden annak érdekében, hogy könnyebben visszanyerd projektedet abban az esetben, ha elfelejtenél menteni. Azonban a számítógéped szó nélkül ki törölheti ezeket a helyreállítási pontokat bármikor. NE támaszkodj csak erre a funkcióra.\",\"tw.restorePoints.empty\":\"Nincsenek helyreállítási pontok.\",\"tw.restorePoints.error\":\"Hiba a helyreállítási pont betöltése közben: {error}\",\"tw.restorePoints.exportError\":\"Hiba a biztonsági mentés exportálása közben: {error}\",\"tw.restorePoints.intervalOption\":\"Helyreállítási pontok {time}vannak készítve.\",\"tw.restorePoints.loading\":\"Betöltés...\",\"tw.restorePoints.minutes\":\"{n} percenként\",\"tw.restorePoints.never\":\"soha\",\"tw.restorePoints.off\":\"A helyreállítási pontok letiltása veszélyes.\",\"tw.restorePoints.size\":\"Becsült használt tárhely: {size}\",\"tw.restorePoints.size2\":\"Több helyreállítási pont által is használt jelmezek és hangokat csak egyszer vannak tárolva.\",\"tw.restorePoints.title\":\"Helyreállítási pontok\",\"tw.sample\":\"Mintaprojekt\",\"tw.saveAs\":\"Mentés másként...\",\"tw.saveTo\":\"Mentés ide: {file}\",\"tw.scratchUnsafeCloud\":\"Ha létrehozod ezt a megosztott változót, a projekt túllépi a Scratch {number}-es változólimitjét, amik közül néhány nem fog működni, ha feltöltöd a projektet Scratchre.\",\"tw.securityManager.allow\":\"Engedélyezés\",\"tw.securityManager.deny\":\"Tagadás\",\"tw.securityManager.title\":\"Bővítmény-biztonság\",\"tw.securityManager.trust\":\"Engedélyezés esetén a későbbi kérelmek ugyanehhez a weboldalhoz automatikusan el lesznek fogadva.\",\"tw.securityManager.why\":\"Képek vagy hangok letöltéséhez, többjátékos mód kivitelezéséhez, APIk eléréséhez vagy esetleg rosszindulatú célokra használható. Meg fogja osztani az IP-címedet, megközelítő tartózkodási helyedet és esetlegesen még más adatokat is a weboldallal.\",\"tw.settingsModal.customStageSize\":\"Egyedi színpadméret:\",\"tw.settingsModal.customStageSizeHelp\":\"Megváltoztatja a méretét a Scratch színpadnak 480×360-ról valami másra. Próbálja ki a 640×360-t, hogy a színpad képernyő méretű legyen. Csak nagyon kevés projekt kezeli ezt megfelelően.\",\"tw.settingsModal.dangerZone\":\"Veszélyzóna\",\"tw.settingsModal.disableCompiler\":\"Fordítóprogram mellőzése\",\"tw.settingsModal.disableCompilerHelp\":\"Kikapcsolja a {APP_NAME} fordítóprogramját. Projektek szerkesztése közben elképzelhető, hogy szükséged lehet rá a szkriptek azonnali frissítése végett. Egyéb helyzetekben sose pipáld be ezt a lehetőséget!\",\"tw.settingsModal.featured\":\"Kiemelt\",\"tw.settingsModal.fps\":\"60 FPS (Egyéni FPS)\",\"tw.settingsModal.fpsHelp\":\"Az utasításokat 30 helyett 60-szor futtatja le másodpercenként. A legtöbb projekt nem fog megfelelően működni ezzel. Ki kell próbálnod az Interpolációt 60 FPS nélkül, ha ez a helyzet. {customFramerate}.\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Kattintson 30, vagy 60-tól eltérő képkockaarány használatához\",\"tw.settingsModal.help\":\"Kattintson segítségért\",\"tw.settingsModal.highQualityPen\":\"Magas Minőségű Toll\",\"tw.settingsModal.highQualityPenHelp\":\"Lehetővé teszi a tollal készített projekteket, hogy magasabb felbontásban fussanak, valamint letilt bizonyos koordinátakerekítést is a szerkesztőben. Nem minden projektnek előnyös ez a beállítás, valamint lehet, hogy a teljesítményre is hatással van.\",\"tw.settingsModal.infiniteClones\":\"Végtelen másolatszám\",\"tw.settingsModal.infiniteClonesHelp\":\"Letiltja a Scratch 300-as másolatkorlátját\",\"tw.settingsModal.interpolation\":\"Interpoláció\",\"tw.settingsModal.interpolationHelp\":\"Simábban jeleníti meg a projekteket azáltal, hogy interpolálja a szereplők mozgását. Az interpolációt nem szabad 3D projektekre, \\\\\"raytracer\\\\\"-ekre, tollat használó projektekre és laggolós projektekre alkalmazni, hiszen az interpoláció csak lassabbá fogja tenni a lefuttatásukat, viszont a megjelenésükön nem fog igazítani.\",\"tw.settingsModal.largeStageWarning\":\"Egyéni színpadméret használatánál nem ajánlott ilyen nagyot alkalmazni. Helyette használj egy kisebb méretet, de megegyező aránnyal, és bízd rá a teljes képernyőre, hogy felnagyítsa a felhasználó lejátszójának méretéhez.\",\"tw.settingsModal.removeFencing\":\"Lekerítés eltávolítása\",\"tw.settingsModal.removeFencingHelp\":\"Lehetővé teszi a szereplőket, hogy a színpadon kívülre menjenek, olyan nagyok, vagy kicsik legyenek, amilyenek csak akarnak, valamint az érzékelős blokkokat is működőképessé teszi színpadon kívül is.\",\"tw.settingsModal.removeLimits\":\"Korlátok eltávolítása\",\"tw.settingsModal.removeMiscLimits\":\"Egyéb Korlátok Eltávolítása\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Eltávolítja a hangeffekt limiteket, és a tollméret korlátozottságait.\",\"tw.settingsModal.storeProjectOptions\":\"Beállítások eltárolása a projektben.\",\"tw.settingsModal.storeProjectOptionsHelp\":\"Eltárolja a kiválasztott beállításokat a projektben, így azonnal alkalmazhatja a TurboWarp őket betöltésnél. A Warp Időzítő és a Fordítóprogram Kikapcsolása nem lesz elmentve.\",\"tw.settingsModal.title\":\"Haladó Beállítások\",\"tw.settingsModal.warpTimer\":\"Warp Időzítő\",\"tw.settingsModal.warpTimerHelp\":\"Leellenőrzi a szkripteket, hogy nem-e ragadtak bele egy hosszú- vagy végtelen-ciklusba, és alacsony képkockaarányban futtatja őket, ahelyett hogy leragadjanak, amíg a ciklus véget ér. Ez tehát megjavítja a legtöbb összeomlást, de cserébe van egy jelentős teljesítménybehatása is, így csak a szerkesztőben van automatikusan bekapcsolva.\",\"tw.soundEditorNotSupported\":\"A hangszerkesztő nincs támogatva ebben a böngészőben\",\"tw.spriteSelectorItem.rename\":\"átnevezés\",\"tw.stageHeader.full\":\"Váltás teljes színpadra\",\"tw.stereo\":\"Sztereó\",\"tw.stereoAlert\":\"Ennek a sztereóhangfájlnak a szerkesztésekor visszavonhatatlanul monóvá fogja azt alakítani.\",\"tw.studioview.authorAttribution\":\"{author} által\",\"tw.studioview.error\":\"Hiba történt a projektek következő oldalának betöltése közben.\",\"tw.studioview.hoverText\":\"{title}, {author} által\",\"tw.tooLarge\":\"Ez a hang túl nagy lehet ahhoz, hogy a Scratchre kerülhessen.\",\"tw.twExtension.description\":\"Furcsa új blokkok.\",\"tw.twExtension.name\":\"{APP_NAME}-blokkok \",\"tw.unfavorite\":\"Kedvencként jelölés eltávolítása\",\"tw.unknownPlatform.1\":\"A projekt egy másik felület számára készült:\",\"tw.unknownPlatform.2\":\"A {APP_NAME}-val való kompatibilitás nem biztosított. Továbbléphetsz saját felelősségre, de nem feltétlen tudunk segíteni ha nehézségek lépnek fel a használat során.\",\"tw.unknownPlatform.continue\":\"Megértettem\",\"tw.unknownPlatform.title\":\"Ismeretlen felület\",\"tw.unshared.2\":\"Több információért látogass el ide: {link}\",\"tw.unshared.bug\":\"Ha ez a projekt igazából meg van osztva, kérjük jelentsd ezt a hibát nekünk.\",\"tw.unshared.cache\":\"Ha a projekt nemrég került megosztásra, ez az üzenet pár percig helytelenül jelenhet meg.\",\"tw.unshared2.1\":\"A nem megosztott projektek többé nem érhetőek el.\",\"tw.usernameModal.help\":\"Ez az érték a böngésződ tárában fog eltárolódni. Lehet, hogy naplózva lesz amikor olyan projektekkel lépsz kapcsolatba, amik tartalmaznak megosztott változókat.\",\"tw.usernameModal.help2\":\"Olyan értékeket, amik nem egyeznek meg egy érvényes Scratch fiókkal sem, a megosztott változók szervere elutasít jellemzően. Azt javasoljuk, hogy hagyd, ahogy van, vagy állítsd a Scratch felhasználónevedre.\",\"tw.usernameModal.mustChange\":\"Bocsánat, a megosztott változók szervere szerint a felhasználóneved nem lehet föltétlenül biztonságos. Kérjük változtasd meg valami másra, vagy {resetIt}.\",\"tw.usernameModal.mustChange.resetIt\":\"állítsd vissza (ajánlott)\",\"tw.usernameModal.new\":\"Új felhasználónév\",\"tw.usernameModal.reset\":\"Visszaállítás\",\"tw.usernameModal.title\":\"Felhasználónév megváltoztatása\",\"tw.usesCloudVariables\":\"Ez a projekt megosztott változókat használ.\",\"tw.usesCloudVariables2\":\"A {APP_NAME} megosztott változói nem vannak csatlakozva a Scratch-ével. Barki {changeTheirUsername} bármire, ezért légy figyelmes a megszemélyesítésről.\",\"tw.usesCloudVariables2.change\":\"megváltoztathatja a felhasználónevét\",\"tw.viewFeaturedProjects\":\"Egy kattintás a kiemelt projektek megtekintéséhez.\",\"tw.viewOnScratch\":\"Projekt megtekintése a Scratchen.\"},\"it\":{\"tw.accent.blue\":\"Azzurro\",\"tw.accent.purple\":\"Viola\",\"tw.accent.rainbow\":\"Arcobaleno\",\"tw.accent.red\":\"Rosso\",\"tw.alerts.creatingRestorePoint\":\"Creazione di un punto di ripristino...\",\"tw.alerts.lostPeripheralConnection\":\"Persa la connessione a {extensionName}.\",\"tw.alerts.restorePointError\":\"Impossibile creare il punto di ripristino\",\"tw.alerts.restorePointSuccess\":\"Puoi accedere ai punti di ripristino nel menu \\\\\"File\\\\\"\",\"tw.alerts.savedToDisk\":\"Salvato sul computer.\",\"tw.backpack.rename\":\"Nuovo nome:\",\"tw.blockColors.custom\":\"Personalizza nelle Impostazioni degli Addon\",\"tw.blockColors.dark\":\"Scura (Beta)\",\"tw.blockColors.highContrast\":\"Contrasto Elevato\",\"tw.blockColors.three\":\"Originale\",\"tw.blocks.PROCEDURES_DOCS\":\"Come usare il blocco Risultato\",\"tw.blocks.PROCEDURES_RETURN\":\"risultato {v}\",\"tw.blocks.PROCEDURES_TO_REPORTER\":\"Trasforma in Monitor\",\"tw.blocks.PROCEDURES_TO_STATEMENT\":\"Trasforma in Comando\",\"tw.blocks.addons\":\"Addon\",\"tw.blocks.buttonIsDown\":\"pulsante [MOUSE_BUTTON] del mouse premuto\",\"tw.blocks.lastKeyPressed\":\"ultimo tasto premuto\",\"tw.blocks.mouseButton.middle\":\"(1) centrale\",\"tw.blocks.mouseButton.primary\":\"(0) primario\",\"tw.blocks.mouseButton.secondary\":\"(2) secondario\",\"tw.blocks.openDocs\":\"Apri Documentazione\",\"tw.browserModal.desktopSettings\":\"Apri Impostazioni app Desktop\",\"tw.browserModal.desktopTitle\":\"Sistema non supportato\",\"tw.browserModal.webgl1\":\"{APP_NAME} richiede WebGL, ma il tuo computer sembra non supportarlo. A volte questo errore è temporaneo, e può essere risolto riavviando il computer.\",\"tw.browserModal.webglBrowser\":\"Usa una versione recente di Chrome, Firefox o Safari, e assicurati che i driver grafici siano aggiornati. Puoi anche provare ad attivare l\\'opzione \\\\\"accelerazione grafica\\\\\" o \\\\\"accelerazione hardware\\\\\" nelle impostazioni del tuo browser.\",\"tw.browserModal.webglDesktop\":\"Puoi anche provare ad attivare l\\'opzione \\\\\"accelerazione grafica\\\\\" nelle impostazioni dell\\'app desktop:\",\"tw.cantUseCloud\":\"Sebbene tu possa creare variabili cloud, queste funzioneranno solo quando il progetto è caricato sul sito di Scratch o sarà convertito usando un tool come {packager}.\",\"tw.changeUsername.cannotChangeWhileRunning\":\"Non è possibile cambiare lo username mentre il progetto è in esecuzione.\",\"tw.clipboard.danger\":\"Se i tuoi appunti contengono delle password, il progetto può condividerle con altri utenti o altri server.\",\"tw.clipboard.permission\":\"L\\'accesso agli appunti potrebbe non funzionare in alcuni browser. Se consentito, accessi futuri agli appunti verranno conserntiti automaticamente.\",\"tw.clipboard.title\":\"Il progetto vuole leggere dei dati dai tuoi appunti.\",\"tw.cloudProvider\":\"Server fornito da {name}.\",\"tw.cloudServers\":\"Scegli un server vicino a te:\",\"tw.code\":\"Codice Sorgente\",\"tw.confirmIncompatibleExtension\":\"Questa estensione non è compatibile con Scratch. I progetti che vengono creati con essa non possono essere caricati sul sito di Scratch. Sei sicuro di volerla attivare?\",\"tw.createdBy\":\"Creato da:\",\"tw.customCloudServer\":\"Usare un server personale per le variabili cloud: {server}\",\"tw.customExtension.description\":\"Carica estensioni personalizzate da URL, file o codice Javascript.\",\"tw.customExtension.name\":\"Estensioni Personalizzate\",\"tw.customExtensionModal.file\":\"File\",\"tw.customExtensionModal.load\":\"Carica\",\"tw.customExtensionModal.promptFile\":\"Seleziona o trascina i file JavaScript dell’estensione:\",\"tw.customExtensionModal.promptText\":\"Incolla il codice JavaScript dell\\'estensione:\",\"tw.customExtensionModal.promptURL\":\"Inserisci la URL dell\\'estensione:\",\"tw.customExtensionModal.text\":\"Testo\",\"tw.customExtensionModal.title\":\"Carica Estensione Personalizzata\",\"tw.customExtensionModal.trusted\":\"L\\'estensione verrà caricata senza sandbox in quanto proviene da una fonte affidabile.\",\"tw.customExtensionModal.unsandboxed\":\"Esegui senza sandbox\",\"tw.customExtensionModal.unsandboxedWarning1\":\"Caricare le estensioni senza sandbox è rischioso, non dovresti abilitarlo se non sai esattamente cosa stai facendo.\",\"tw.customExtensionModal.unsandboxedWarning2\":\"Le estensioni eseguite senza sandbox possono corrompere il tuo progetto, cancellare le tue impostazioni, rubare le tue password e fare altre cose malevole. Gli sviluppatori di {APP_NAME} non si ritengono responsabili per qualunque problema dovesse verificarsi.\",\"tw.customExtensionModal.untrusted\":\"Le estensioni da URL non affidabili saranno sempre caricate con una sandbox per ragioni di sicurezza.\",\"tw.customReporters.description\":\"Permette ai blocchi personalizzati di restituire un valore e di essere usati come monitor.\",\"tw.customReporters.name\":\"Monitor Personalizzati\",\"tw.darkMode\":\"Passa alla Modalità Chiara\",\"tw.desktopCloud\":\"Nell\\'app desktop le variabili cloud vengono sincronizzate tra tutte le finestre dell\\'app che girano nello stesso computer. Per fare in modo che siano invece sincronizzate globalmente, carica il progetto sul sito di Scratch, oppure usa il {packager}.\",\"tw.documentation\":\"Documentazione\",\"tw.download.danger\":\"Il file è stato validato dagli sviluppatori di {APP_NAME}.\",\"tw.download.executable\":\"Il file è in formato eseguibile. Se lo esegui tieni conto del fatto che potrebbe trattarsi di un malware.\",\"tw.download.file\":\"Il progetto sta scaricando un file sul tuo computer. Sarà salvato come {name} nella cartella Download.\",\"tw.embed.persistent\":\"Nel caso l\\'inserimento venga consentito, futuri tentativi di inserimento di contenuti provenienti dallo stesso sito saranno automaticamente consentiti.\",\"tw.embed.risks\":\"Anche se il contenuto sarà inserito in una sandbox, avrà comunque accesso alle informazioni sul tuo dispositivo come il tuo indirizzo IP e la tua posizione.\",\"tw.embed.title1\":\"Il progetto sta cercando di inserire del contenuto HTML sopra allo Stage:\",\"tw.embed.title2\":\"Il progetto sta cercando di inserire contenuto remoto sopra allo Stage:\",\"tw.extension.faceSensing.description\":\"Rileva i movimenti del volto usando la webcam.\",\"tw.extension.faceSensing.name\":\"Sensore del Volto\",\"tw.extensionGallery.error\":\"Errore nel caricamento della galleria delle estensioni. Visita extensions.turbowarp.org per ulteriori informazioni sulle estensioni.\",\"tw.extensionGallery.loading\":\"Caricamento galleria estensioni in corso...\",\"tw.extensionGallery.more\":\"Ulteriori informazioni sulle estensioni disponibili a extensions.turbowarp.org.\",\"tw.extensionGallery.name\":\"Galleria delle Estensioni di {APP_NAME}\",\"tw.favorite\":\"Preferito\",\"tw.featuredProjectsStudio\":\"Vai alla galleria sul sito di Scratch.\",\"tw.feedback\":\"Feedback & Bug\",\"tw.feedbackButton\":\"Feedback {APP_NAME}\",\"tw.fetch.title\":\"Il progetto vuole collegarsi al sito:\",\"tw.fileInput.none\":\"Nessun file selezionato.\",\"tw.fileInput.selected\":\"Selezionati: {names}\",\"tw.fonts.add\":\"Aggiungi\",\"tw.fonts.custom.file\":\"Seleziona un file di caratteri dal tuo computer:\",\"tw.fonts.custom.name\":\"Dai un nome la carattere:\",\"tw.fonts.custom1\":\"Aggiungi carattere da un file\",\"tw.fonts.custom2\":\"Di solito non funziona in Scratch. Formati supportati: {formats}.\",\"tw.fonts.delete\":\"Sei sicuro di voler cancellare \\\\\"{font}\\\\\"? Tutti i costumi vettoriali che lo usano useranno al suo posto il carattere sostitutivo.\",\"tw.fonts.fallback\":\"Scegli un carattere sostitutivo da usare se il carattere non può essere caricato o se viene cancellato:\",\"tw.fonts.list\":\"Caratteri installati:\",\"tw.fonts.none\":\"Ancora nessun carattere aggiunto.\",\"tw.fonts.readError\":\"Errore nella lettura del file di caratteri: {error}\",\"tw.fonts.system\":\"Carattere di sistema\",\"tw.fonts.system.name\":\"Inserisci il nome di un carattere presente nel tuo computer. Il carattere potrebbe non apparire a tutti in modo corretto.\",\"tw.fonts.system1\":\"Aggiungi un carattere di sistema\",\"tw.fonts.system2\":\"Potrebbe funzionare in Scratch, ma potrebbe non apparire per tutti in modo corretto.\",\"tw.fonts.title\":\"Caratteri\",\"tw.footer.credits\":\"Crediti\",\"tw.footer.disclaimer\":\"{APP_NAME} non è affiliato con Scratch, lo Scratch Team o la Scratch Foundation.\",\"tw.footer.documentation\":\"Documentazione\",\"tw.footer.embed\":\"Inclusione\",\"tw.footer.parameters\":\"Parametri URL\",\"tw.footer.scratchDisclaimer\":\"Scratch è un progetto della Scratch Foundation. E’ disponibile gratuitamentesul sito {scratchDotOrg}.\",\"tw.geolocate.permission\":\"Se consentito, il tuo browser potrebbe chiederti di consentire l\\'accesso alla localizzazione.\",\"tw.geolocate.title\":\"Il progetto vuole conoscere la tua posizione.\",\"tw.gui.crashMessage.description\":\"Ci dispiace, sembra che la pagina abbia avuto un arresto anomalo. Aggiorna la pagina per riprovare.\",\"tw.gui.defaultProjectTitle\":\"Progetto\",\"tw.guiDefaultTitle\":\"Esegue i progetti Scratch più velocemente\",\"tw.home.credit\":\"Note e Crediti\",\"tw.home.description\":\"{APP_NAME} è una Modifica di Scratch che compila i progetti in JavaScript per renderli molto più veloci. Provalo, inserisci qui sopra un ID di un progetto o una URL o scegli uno dei progetti in primo piano che trovi qui sotto.\",\"tw.home.instructions\":\"Istruzioni\",\"tw.input.tooltip\":\"Copia e incolla il link di un progetto Scratch qui!\",\"tw.interpolationEnabled\":\"Interpolazione\",\"tw.invalidParameters.clones\":\"Il parametro URL \\\\\"clone\\\\\" non è valido\",\"tw.invalidParameters.fps\":\"Il parametro URL \\\\\"fps\\\\\" non è valido\",\"tw.invalidProject.error\":\"Impossibile caricare il progetto:\",\"tw.invalidProject.options\":\"Potresti riuscire a recuperare una vecchia versione del progetto dai punti di ripristino automatici, o da un vecchio backup.\",\"tw.invalidProject.reportIt\":\"segnalarlo\",\"tw.invalidProject.restorePoints\":\"Vai ai Punti di Ripristino\",\"tw.invalidProject.sb3fix\":\"ad usare sb3fix per recuperare il progetto\",\"tw.invalidProject.title\":\"Errore\",\"tw.invalidProject.validationError\":\"Questo errore spesso significa che una piccola parte del progetto si è corrotta, ma che per il resto è valido. Siccome potrebbe essere semplice risolverlo, ti preghiamo di {reportIt}.\",\"tw.invalidProject.zipCorruption\":\"Questo errore indica spesso che il file è corrotto, a causa di dispositivo di memorizzazione malfunzionante o all\\'estrazione di un dispositivo di memorizzazione senza averlo prima espulso. Prova {usingSb3fix}, pensato proprio per risolvere questo tipo di problemi.\",\"tw.lightMode\":\"Passa alla Modalità Scura\",\"tw.loadExtension.embedded\":\"Il progetto vuole caricare una estensione personalizzata con il seguente codice:\",\"tw.loadExtension.sandboxed\":\"Anche se il codice è eseguito in una sandbox, l\\'estensione avrà comunque accesso a informazioni sul tuo dispositivo come ad esempio il tuo indirizzo IP e la tua localizzazione. Assicurati di fidarti dell\\'autore dell\\'estensione prima di continuare.\",\"tw.loadExtension.unsandboxed\":\"Esegui senza sandbox\",\"tw.loadExtension.unsandboxedWarning\":\"Le estensioni eseguite senza sandbox possono corrompere il tuo progetto, cancellare le tue impostazioni, rubare le tue password e fare altre cose malevole. Gli sviluppatori di {APP_NAME} non si ritengono responsabili per qualunque problema dovesse verificarsi.\",\"tw.loadExtension.url\":\"Il progetto vuole caricare una estensione personalizzata dall\\'URL:\",\"tw.loader.downloadingAssets\":\"Scaricamento risorse in corso ({complete}/{total}) ...\",\"tw.loader.loadingAssets\":\"Caricamento risorse ({complete}/{total}) …\",\"tw.loader.projectData\":\"Caricamento del progetto in corso …\",\"tw.menuBar.60off\":\"Disabilita modalità 60 FPS\",\"tw.menuBar.60on\":\"Abilita modalità 60 FPS\",\"tw.menuBar.accent\":\"Colore di evidenziazione\",\"tw.menuBar.addons\":\"Addon\",\"tw.menuBar.advanced\":\"Impostazioni Avanzate\",\"tw.menuBar.blockColors\":\"Colore dei Blocchi\",\"tw.menuBar.changeUsername\":\"Cambia Username\",\"tw.menuBar.cloudOff\":\"Disabilita Variabili Cloud\",\"tw.menuBar.cloudOn\":\"Abilita Variabili Cloud\",\"tw.menuBar.cloudUnavailable\":\"Le Variabili Cloud non sono Disponibili\",\"tw.menuBar.cloudUnavailableAlert\":\"Impossibile usare le variabili cloud, probabilmente perché è stato aperto l\\'editor.\",\"tw.menuBar.desktopSettings\":\"Impostazioni Desktop\",\"tw.menuBar.moreSettings\":\"Impostazioni Avanzate\",\"tw.menuBar.newFramerate\":\"Nuovo framerate:\",\"tw.menuBar.newWindow\":\"Nuova finestra\",\"tw.menuBar.package\":\"Crea pacchetto\",\"tw.menuBar.reportError1\":\"L\\'esecuzione di alcuni script ha causato errori.\",\"tw.menuBar.reportError2\":\"Si è verificato un problema. Ti invitiamo a segnalarlo.\",\"tw.menuBar.restorePoints\":\"Punti di ripristino\",\"tw.menuBar.saveAs\":\"Salva come {file}\",\"tw.menuBar.seeInside\":\"Guarda dentro\",\"tw.moreCloud\":\"Ulteriori informazioni sulle variabili cloud\",\"tw.notify.permission\":\"Se viene consentito, il tuo browser potrebbe chiederti se vuoi consentire le notifiche e le future notifiche saranno consentite automaticamente.\",\"tw.notify.title\":\"Il progetto vuole mostrare delle notifiche.\",\"tw.oldDownload\":\"Salve in un file separato...\",\"tw.opcode.2000\":\"giorni dal 2000\",\"tw.opcode.mousedown\":\"pulsante del mouse premuto\",\"tw.opcode.mousex\":\"x del mouse\",\"tw.opcode.mousey\":\"y del mouse\",\"tw.openAdvanced\":\"Apri impostazioni avanzate\",\"tw.openWindow.dangerous\":\"Questo sito web non è stato recensito dagli sviluppatori di {APP_NAME}. Può contenere codice pericoloso o dannoso.\",\"tw.openWindow.title\":\"Il progetto richiede di aprire in una nuova finestra o scheda l\\'URL:\",\"tw.paint.alpha\":\"Opacità\",\"tw.paint.fonts.more\":\"Aggiungi caratteri...\",\"tw.pen.stageSelected\":\"Stage selezionato: blocchi penna ridotti\",\"tw.privacy\":\"Politica della Privacy\",\"tw.recordAudio.permission\":\"Se viene consentito, il tuo browser potrebbe chiederti se vuoi consentire l\\'accesso al micrfono e i futuri accessi al microfono saranno consentiti automaticamente.\",\"tw.recordAudio.title\":\"Il progetto vuole registrare l\\'audio del microfono. L\\'audio includerà una trascrizione testuale o dati audio grezzi. Il progetto potrebbe condividere l\\'audio con altri utenti o altri server.\",\"tw.recordVideo.permission\":\"Se viene consentito, il tuo browser potrebbe chiederti se vuoi consentire l\\'accesso alla webcam e i futuri accessi alla webcam saranno consentiti automaticamente.\",\"tw.recordVideo.title\":\"Il progetto vuole registrare il video della tua webcam. Il progetto potrebbe condividere immagini con altri utenti o altri server.\",\"tw.redirect.dangerous\":\"Questo sito web non è stato recensito dagli sviluppatori di {APP_NAME}. Può contenere codice pericoloso o dannoso.\",\"tw.redirect.title\":\"Il progetto richiede di aprire in questa scheda l\\'URL:\",\"tw.removedTrademarks\":\"Alcuni elementi che contenevano il marchio di Scratch sono stati rimossi.\",\"tw.restorePoints.1minute\":\"ogni minuto\",\"tw.restorePoints.assets\":\"{n} risorse\",\"tw.restorePoints.confirmDelete\":\"Sei sicuro di voler cancellare \\\\\"{projectTitle}\\\\\"? Questa operazione non potrà essere annullata.\",\"tw.restorePoints.confirmDeleteAll\":\"Sei sicuro di voler cancellare TUTTI i punti di ripristino? Questa operazione non potrà annullata.\",\"tw.restorePoints.confirmLoad\":\"Ci sono modifiche non salvate. Rimpiazzare il progetto corrente?\",\"tw.restorePoints.deleteAll\":\"Rimuovi Tutto\",\"tw.restorePoints.description\":\"{APP_NAME} salva periodicamente dei punti di ripristino sul computer per aiutarti a recuperare il progetto se dimentichi di salvare. Questo sistema fornisce un ultima risorsa per poter recuperare il tuo progetto. il tuo computer potrebbe rimuovere senza preavviso questi punti di interruzione. NON fare affidamento su questa possibilità.\",\"tw.restorePoints.empty\":\"Nessun punto di ripristino trovato.\",\"tw.restorePoints.error\":\"Errore nel caricamento del punto di ripristino: {error}\",\"tw.restorePoints.exportError\":\"Errore nell\\'esportazione del punto di ripristino: {error}\",\"tw.restorePoints.intervalOption\":\"I punti di ripristino vengono creati {time}.\",\"tw.restorePoints.loading\":\"Caricamento...\",\"tw.restorePoints.minutes\":\"ogni {n} minuti\",\"tw.restorePoints.never\":\"mai\",\"tw.restorePoints.off\":\"Disabilitare i punti di ripristino è rischioso.\",\"tw.restorePoints.size\":\"Spazio di archiviazione usato: {size}\",\"tw.restorePoints.size2\":\"Costumi e suoni usati da più punti di ripristino vengono archiviati una sola volta.\",\"tw.restorePoints.title\":\"Ripristina Punti di Ripristino\",\"tw.sample\":\"Progetto di esempio\",\"tw.saveAs\":\"Salva come...\",\"tw.saveTo\":\"Salva come {file}\",\"tw.scratchUnsafeCloud\":\"Se crei questa variabile cloud, il progetto supererà il limite massimo di {number} variabili previsto da Scratch e alcune variabili non funzioneranno se caricerai il progetto sul sito di Scratch.\",\"tw.securityManager.allow\":\"Consenti\",\"tw.securityManager.deny\":\"Nega\",\"tw.securityManager.title\":\"Sicurezza Estensione\",\"tw.securityManager.trust\":\"Se si dà il permesso, richieste future allo stesso sito web verranno permesse automaticamente.\",\"tw.securityManager.why\":\"Potrebbe venire utilizzato per scraicare immagini e suoni, implementare funzionalità multiplayer, accedere ad una API, oppure per scopi dannosi. Condividerà con il sito il tuo indirizzo IP, la tua area geografica e potenzialmente anche altri dati.\",\"tw.settingsModal.customStageSize\":\"Dimensioni Stage Personalizzate:\",\"tw.settingsModal.customStageSizeHelp\":\"Cambia la dimensione dello stage di Scratch da 480x360 a un altro valore. Prova 640x360 per rendere lo stage widescreen. Pochi progetti potranno gestire questa proprietà.\",\"tw.settingsModal.dangerZone\":\"Zona Pericolosa\",\"tw.settingsModal.disableCompiler\":\"Disabilita Compilatore\",\"tw.settingsModal.disableCompilerHelp\":\"Disabilita il compilatore di {APP_NAME}. E\\' un\\'opzione che è utile attivare soltanto quando si modificano i progetti, in modo che gli script si aggiornino immediatamente. E\\' ad esempio utile quando si eseguono gli script passo passo grazie all\\'addon Debugger. Si sconsiglia di usare questa opzione in altri casi. \",\"tw.settingsModal.featured\":\"In Evidenza\",\"tw.settingsModal.fps\":\"60 FPS (FPS personalizzato)\",\"tw.settingsModal.fpsHelp\":\"Esegue gli script 60 volte al secondo invece di 30. Alcuni progetti potrebbero non funzionare correttamente con questa impostazione abilitata. In questo caso puoi provare ad abilitare l\\'interpolazione senza abilitare la modalità 60 FPS. {customFramerate}.\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Clicca qui per usare un framerate diverso da 30 o 60\",\"tw.settingsModal.help\":\"Clicca per aiuto\",\"tw.settingsModal.highQualityPen\":\"Penna Alta Qualità\",\"tw.settingsModal.highQualityPenHelp\":\"Permette ai progetti di essere visualizzati ad una risoluzione maggiore e disabilita l\\'arrotondamento delle coordinate fatto dall\\'editor. Non tutti i progetti si giovano di questa impostazione che può avere impatto sulla performance del progetto.\",\"tw.settingsModal.infiniteClones\":\"Cloni Infiniti\",\"tw.settingsModal.infiniteClonesHelp\":\"Disabilita il limite di Scratch di 300 cloni.\",\"tw.settingsModal.interpolation\":\"Interpolazione\",\"tw.settingsModal.interpolationHelp\":\"Fa apparire i progetti più fluidi interpolando il movimento degli sprite. L\\'interpolazione non dovrebbe essere usata nei progetti 3D, nei raytracer, nei progetti basati sull\\'uso della penna e nei progetti che laggano in quanto l\\'interpolazione li farebbe eseguire più lentamente senza farli apparire più fluidi.\",\"tw.settingsModal.largeStageWarning\":\"L\\'uso di uno stage personalizzato così grande non è raccomandato! Ti suggeriamo di usare una dimensione inferiore con le stesse proporzioni e usare poi il fullscreen per portarlo alle dimensioni dello schermo dell\\'utente.\",\"tw.settingsModal.removeFencing\":\"Rimozione Recinto\",\"tw.settingsModal.removeFencingHelp\":\"Permette agli sprite di muoversi completamente fuori dallo Stage e di diventare grandi o piccoli quando si desidera e permette ai blocchi sensori che verificano il contatto di funzionare anche quando gli sprite sono completamente fuori dallo Stage.\",\"tw.settingsModal.removeLimits\":\"Rimozione Limiti\",\"tw.settingsModal.removeMiscLimits\":\"Rimozione Limiti Vari\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Rimuove i limiti agli effetti sonori e alla dimensione della penna.\",\"tw.settingsModal.storeProjectOptions\":\"Memorizza le impostazioni nel progetto\",\"tw.settingsModal.storeProjectOptionsHelp\":\"Memorizza nel progetto le impostazioni selezionate in modo che siano applicate automaticamente quando il progetto viene caricato in TurboWarp. Il warp timer e la disabilitazione del compilatore non verranno memorizzati.\",\"tw.settingsModal.title\":\"Impostazioni Avanzate\",\"tw.settingsModal.warpTimerHelp\":\"Permette ai progetti di verificare se sono bloccati in un loop molto lungo o infinito e di essere quindi eseguiti ad un framerate più basso invece di apparire bloccati fino a che il loop non termina. Questa opzione risolve molte cause di blocco ma ha un impatto significativo sulla performance, quindi è abilitata come impostazione predeterminata solo all\\'interno dell\\'editor.\",\"tw.soundEditorNotSupported\":\"L\\'editor di suoni non è supportato in questo browser.\",\"tw.spriteSelectorItem.rename\":\"rinomina\",\"tw.stageHeader.full\":\"Passa alla visualizzazione con Stage completo\",\"tw.stereoAlert\":\"Modificando questo suono stereo verrà convertito in modo in maniera irreversibile. \",\"tw.studioview.authorAttribution\":\"di {author}\",\"tw.studioview.error\":\"Si è verificato un errore nel caricamento della pagina di progetti successiva.\",\"tw.studioview.hoverText\":\"{title} di {author}\",\"tw.tooLarge\":\"Questo suono potrebbe essere troppo pesante per essere caricato su Scratch.\",\"tw.twExtension.description\":\"Nuovi blocchi strani.\",\"tw.twExtension.name\":\"Blocchi di {APP_NAME}\",\"tw.unfavorite\":\"Non preferito\",\"tw.unknownPlatform.1\":\"Questo progetto è stato creato per una versione diversa dell\\'app:\",\"tw.unknownPlatform.2\":\"La compatibilità con {APP_NAME} non è garantita. Puoi scegliere di continuare, ma potremmo non riuscire a fornirti supporto nel caso dovessi incontrare dei problemi\",\"tw.unknownPlatform.continue\":\"Ho capito\",\"tw.unknownPlatform.title\":\"Piattaforma Sconosciuta\",\"tw.unshared.2\":\"Per ulteriori informazioni vai a {link}\",\"tw.unshared.bug\":\"Se sei certo che questo progetto è condiviso, segnala il problema.\",\"tw.unshared.cache\":\"Se il progetto è stato condiviso di recente questo messaggio può apparire erroneamente per alcuni minuti.\",\"tw.unshared2.1\":\"I progetti non condivisi non sono più visibili.\",\"tw.usernameModal.help\":\"Questo valore verrà archiviato nello spazio di archiviazione del tuo browser. Potrebbe essere loggato quando interagisci con progetti che usano le variabili cloud.\",\"tw.usernameModal.help2\":\"Valori che non corrispondono ad un account Scratch valido saranno di solito rifiutati dal server delle variabili cloud. Raccomandiamo di lasciarli così come sono o cambiandolo nel tuo username Scratch.\",\"tw.usernameModal.mustChange\":\"Il server delle variabili cloud pensa che il tuo username possa non essere sicuro. Ti preghiamo di cambiarlo con qualcos\\'altro o di {resetIt}\",\"tw.usernameModal.mustChange.resetIt\":\"resettarlo (raccomandato)\",\"tw.usernameModal.new\":\"Nuovo username:\",\"tw.usernameModal.reset\":\"Resetta\",\"tw.usernameModal.title\":\"Cambia Username\",\"tw.usesCloudVariables\":\"Questo progetto usa le variabili cloud.\",\"tw.usesCloudVariables2\":\"Le variabili cloud di {APP_NAME} non sono collegate a quelle di Scratch. Chiunque può {changeTheirUsername} come preferisce, fai quindi attenzione a chi tenta di spacciarsi per qualcun altro.\",\"tw.usesCloudVariables2.change\":\"cambiare il proprio username\",\"tw.viewFeaturedProjects\":\"Clicca per vedere i progetti in primo piano.\",\"tw.viewOnScratch\":\"Mostra il progetto nel sito di Scratch\"},\"ja\":{\"tw.accent.blue\":\"青\",\"tw.accent.purple\":\"紫\",\"tw.accent.rainbow\":\"レインボー\",\"tw.accent.red\":\"赤\",\"tw.alerts.creatingRestorePoint\":\"復元ポイントを作成しています…\",\"tw.alerts.lostPeripheralConnection\":\"{extensionName}との接続が切れました。\",\"tw.alerts.restorePointError\":\"復元ポイントを作成できませんでした\",\"tw.alerts.restorePointSuccess\":\"”ファイル”から復元ポイントにアクセス\",\"tw.alerts.savedToDisk\":\"コンピューターに保存する\",\"tw.backpack.rename\":\"新しい名前:\",\"tw.blockColors.custom\":\"アドオンの設定でカスタマイズする\",\"tw.blockColors.dark\":\"ダーク(ベータ版)\",\"tw.blockColors.highContrast\":\"ハイコントラスト\",\"tw.blockColors.three\":\"オリジナル\",\"tw.blocks.PROCEDURES_DOCS\":\"~を返すの使い方\",\"tw.blocks.PROCEDURES_RETURN\":\"{v}を返す\",\"tw.blocks.PROCEDURES_TO_REPORTER\":\"リポーターへ変更\",\"tw.blocks.PROCEDURES_TO_STATEMENT\":\"ステートメントへ変更\",\"tw.blocks.addons\":\"アドオン\",\"tw.blocks.buttonIsDown\":\"マウスの[MOUSE_BUTTON]が押された\",\"tw.blocks.lastKeyPressed\":\"最後に押されたキー\",\"tw.blocks.mouseButton.middle\":\"(1) ホイール\",\"tw.blocks.mouseButton.primary\":\"(0) 左ボタン\",\"tw.blocks.mouseButton.secondary\":\"(2) 右ボタン\",\"tw.blocks.openDocs\":\"ドキュメントを開く\",\"tw.browserModal.desktopSettings\":\"デスクトップの設定を開く\",\"tw.browserModal.desktopTitle\":\"システムはサポートされていません\",\"tw.browserModal.webgl1\":\"{APP_NAME}はWebGLを必要としますが、お使いのパソコンはWebGLをサポートしていないようです。これは一時的なエラーであることが多く、コンピュータを再起動することで解決できる場合があります。\",\"tw.browserModal.webglBrowser\":\"Chrome、Firefox、またはSafariの最新バージョンを使って、グラフィックドライバーが最新であることを確認してください。ブラウザの設定で「グラフィックアクセラレーション」または「ハードウェアアクセラレーション」の項目を切り替えてみることもできます。\",\"tw.browserModal.webglDesktop\":\"デスクトップの設定で「グラフィックアクセラレーション」の項目を切り替えてみることもできます。\",\"tw.cantUseCloud\":\"クラウド変数を作成することはできますが、このプロジェクトをScratchにアップロードするか、{packager}などのツールを使用しないと、動作しません。\",\"tw.changeUsername.cannotChangeWhileRunning\":\"ユーザー名をプロジェクトの実行中に変えることはできません。\",\"tw.clipboard.danger\":\"クリップボードにパスワードなどが含まれている場合、プロジェクトが他のユーザーや、サーバーに共有してしまう可能性があります。\",\"tw.clipboard.permission\":\"クリップボードへのアクセスは、ブラウザによって動作しない場合があります。許可されている場合、クリップボードの読み込みは自動で許可されます。\",\"tw.clipboard.title\":\"プロジェクトがクリップボードからデータを読み込もうとしています。\",\"tw.cloudProvider\":\"サーバーは{name}によって提供されます。\",\"tw.cloudServers\":\"近いサーバーを選択:\",\"tw.code\":\"ソースコード\",\"tw.confirmIncompatibleExtension\":\"この拡張機能はScratchとの互換性がありません。これを使って作ったプロジェクトは、Scratchのウェブサイトにアップロードできません。本当に使用しますか?\",\"tw.createdBy\":\"製作者:\",\"tw.customCloudServer\":\"使用しているカスタムクラウド変数サーバー : {server}\",\"tw.customExtension.description\":\"URL、ファイル、JavaScriptのソースコードからカスタム拡張機能を読み込む。\",\"tw.customExtension.name\":\"カスタム拡張機能\",\"tw.customExtensionModal.file\":\"ファイル\",\"tw.customExtensionModal.load\":\"読み込む\",\"tw.customExtensionModal.promptFile\":\"拡張機能のJavaScriptファイルを選択又はドラッグアンドドロップする:\",\"tw.customExtensionModal.promptText\":\"拡張機能のJavaScriptのソースコードをペーストする:\",\"tw.customExtensionModal.promptURL\":\"拡張機能のURLを入力: \",\"tw.customExtensionModal.text\":\"テキスト\",\"tw.customExtensionModal.title\":\"カスタム拡張機能を読み込む\",\"tw.customExtensionModal.trusted\":\"この拡張機能は信頼できるソースからのものであるため、サンドボックスなしで読み込みます。\",\"tw.customExtensionModal.unsandboxed\":\"サンドボックスなしで実行する\",\"tw.customExtensionModal.unsandboxedWarning1\":\"サンドボックスなしで拡張機能を読み込むのは危険です。よく分からない場合は無効にしてください。\",\"tw.customExtensionModal.unsandboxedWarning2\":\"サンドボックス化していない拡張機能は、プロジェクトを破損させたり、設定を削除したり、パスワードをフィッシングしたり、その他の悪いことをする可能性があります。{APP_NAME}の開発者は、この拡張機能によって生じるいかなる問題にも責任を負いません。\",\"tw.customExtensionModal.untrusted\":\"信頼できないURLからの拡張機能は、セキュリティのため常にサンドボックスで読み込みます。\",\"tw.customReporters.description\":\"カスタムブロックが値を出力し、入力として使えるようにする。\",\"tw.customReporters.name\":\"カスタム定義\",\"tw.darkMode\":\"ライトモードに切り替える\",\"tw.desktopCloud\":\"デスクトップアプリでは、クラウド変数はこのコンピューター上のすべてのデスクトップアプリのウィンドウ間で同期されます。プロジェクトをScratchにアップロードするか、{packager}などのツールを使用してグローバルに同期してください。\",\"tw.documentation\":\"ドキュメント\",\"tw.download.danger\":\"このファイルはまだ{APP_NAME}の開発者によって審査されていません。\",\"tw.download.executable\":\"このファイルは実行可能ファイルです。実行すると、あなたのコンピュータに危害を加える恐れがあります。\",\"tw.download.file\":\"プロジェクトがコンピューターにファイルをダウンロードしようとしています。ファイルはあなたのダウンロードフォルダーに{name}として保存されます。\",\"tw.embed.persistent\":\"許可した場合、同じサイトから読み込まれる埋め込みは、自動的に許可されます。\",\"tw.embed.risks\":\"埋め込まれるコンテンツはサンドボックス化されますが、IPアドレスや、位置情報といった端末情報にはまだアクセスすることができます。\",\"tw.embed.title1\":\"プロジェクトはHTMLコンテンツをステージに埋め込もうとしています:\",\"tw.embed.title2\":\"プロジェクトは、リモートのコンテンツをステージに埋め込もうとしています:\",\"tw.extensionGallery.error\":\"拡張機能ギャラリーを読み込み中にエラーが発生しました。extensions.turbowarp.org にアクセスしてさらに多くの拡張機能を発見してください\",\"tw.extensionGallery.loading\":\"拡張機能ギャラリーを読み込み中…\",\"tw.extensionGallery.more\":\"詳しくは、extensions.turbowarp.org をご確認ください。\",\"tw.extensionGallery.name\":\"{APP_NAME}拡張機能ギャラリー\",\"tw.favorite\":\"お気に入りにする\",\"tw.featuredProjectsStudio\":\"Scratchのスタジオで見る\",\"tw.feedback\":\"フィードバックとバグ\",\"tw.feedbackButton\":\"{APP_NAME}フィードバック\",\"tw.fetch.title\":\"プロジェクトがウェブサイトに接続しようとしています:\",\"tw.fileInput.none\":\"ファイルが選択されていません。\",\"tw.fileInput.selected\":\"選択済み:{names}\",\"tw.fonts.add\":\"追加する\",\"tw.fonts.custom.file\":\"コンピュータからフォントを選択 : \",\"tw.fonts.custom.name\":\"フォントの名前をつける:\",\"tw.fonts.custom1\":\"ファイルからフォントを追加\",\"tw.fonts.custom2\":\"Scratchでは大抵の場合動きません。サポートされているフォーマット:{formats}\",\"tw.fonts.delete\":\"\\\\\"{font}\\\\\" を削除してもよろしいですか? ベクターコスチュームでは代わりに他のフォントに置き換わります。\",\"tw.fonts.fallback\":\"フォントの読み込みに失敗した場合や削除された場合に使用する代わりのフォントを選択します。\",\"tw.fonts.list\":\"インストール済みのフォント : \",\"tw.fonts.none\":\"フォントが追加されていません。\",\"tw.fonts.readError\":\"フォントのファイルを読み込めませんでした: {error}\",\"tw.fonts.system\":\"システムフォント\",\"tw.fonts.system.name\":\"コンピュータにインストールされているフォントの名前を入力します。フォントはユーザーによって正しく表示されない可能性があります。\",\"tw.fonts.system1\":\"フォントを追加\",\"tw.fonts.system2\":\"Scratchで動作する可能性がありますが、ユーザーによって正しく表示されない可能性があります。\",\"tw.fonts.title\":\"フォント\",\"tw.footer.credits\":\"クレジット\",\"tw.footer.disclaimer\":\"{APP_NAME}は、Scratch、Scratchチームおよび、Scratch財団と提携していません。\",\"tw.footer.documentation\":\"ドキュメント\",\"tw.footer.embed\":\"埋め込みコード\",\"tw.footer.parameters\":\"URLパラメーター\",\"tw.footer.scratchDisclaimer\":\"Scratchは、Scratch財団のプロジェクトです。{scratchDotOrg}で無料で利用できます。\",\"tw.geolocate.permission\":\"許可すると、位置情報へのアクセスを許可するようブラウザから促されることがあります。\",\"tw.geolocate.title\":\"このプロジェクトはあなたの位置情報を知ろうとしています。\",\"tw.gui.crashMessage.description\":\"申し訳ありませんが、ページがクラッシュしたようです。ページを再読み込みしてもう一度やり直してみてください。\",\"tw.gui.defaultProjectTitle\":\"プロジェクト\",\"tw.guiDefaultTitle\":\"Scratchのプロジェクトを速く動かす\",\"tw.home.credit\":\"メモとクレジット\",\"tw.home.description\":\"{APP_NAME}は、プロジェクトをJavaScriptにコンパイルし、高速に実行できるようにするScratch modです。プロジェクトのIDまたは、URLを入力するか、下の注目のプロジェクトから選択してみてください。\",\"tw.home.instructions\":\"使い方\",\"tw.input.tooltip\":\"ScratchのプロジェクトのURLをコピー&ペーストして見ることができます\",\"tw.interpolationEnabled\":\"補完機能\",\"tw.invalidParameters.clones\":\"「クローン」のURLパラメーターが無効です\",\"tw.invalidParameters.fps\":\"「FPS」のURLパラメーターが無効です\",\"tw.invalidProject.error\":\"プロジェクトを読み込めませんでした:\",\"tw.invalidProject.options\":\"プロジェクトの自動復元ポイント機能もしくは、他のバックアップを使用して、プロジェクトを復元できる場合があります。\",\"tw.invalidProject.reportIt\":\"報告してください\",\"tw.invalidProject.restorePoints\":\"復元ポイントを見る\",\"tw.invalidProject.validationError\":\"このエラーは多くの場合、プロジェクトのごく一部が破損していることを意味していますが、それ以外は問題ありません。このエラーは簡単に修正が可能ですので、{reportIt}\",\"tw.lightMode\":\"ダークモードに切り替える\",\"tw.loadExtension.embedded\":\"このプロジェクトは、コードと共にカスタム拡張機能を読み込もうとしています:\",\"tw.loadExtension.sandboxed\":\"コードは保護されますが、IPや位置などのデバイスに関する情報には引き続きアクセスできます。続行する前に、この拡張機能の作成者が信頼できることを確認してください。\",\"tw.loadExtension.unsandboxed\":\"サンドボックスなしで実行する\",\"tw.loadExtension.unsandboxedWarning\":\"サンドボックスなしで拡張機能を読み込むことは危険です。プロジェクトを破壊したり、設定を削除したり、パスワードを盗まれたり、その他の悪いことができるようになります。{APP_NAME}の開発者は、これによって生じるいかなる問題にも責任を負いません。\",\"tw.loadExtension.url\":\"このプロジェクトは、次のURLからカスタム拡張機能を読み込もうとしています:\",\"tw.loader.downloadingAssets\":\"プロジェクトをダウンロード中 ({complete}/{total}) ...\",\"tw.loader.loadingAssets\":\"{total}個中{complete}個読み込み完了…\",\"tw.loader.projectData\":\"プロジェクトを読み込み中…\",\"tw.menuBar.60off\":\"60FPSモードを解除する\",\"tw.menuBar.60on\":\"60FPSモードにする\",\"tw.menuBar.accent\":\"アクセント\",\"tw.menuBar.addons\":\"アドオン\",\"tw.menuBar.advanced\":\"高度な設定\",\"tw.menuBar.blockColors\":\"ブロックの色\",\"tw.menuBar.changeUsername\":\"ユーザー名を変える\",\"tw.menuBar.cloudOff\":\"クラウド変数を無効にする\",\"tw.menuBar.cloudOn\":\"クラウド変数を有効にする\",\"tw.menuBar.cloudUnavailable\":\"クラウド変数は使用できません\",\"tw.menuBar.cloudUnavailableAlert\":\"中を見たのでクラウド変数を使用できません。\",\"tw.menuBar.desktopSettings\":\"デスクトップの設定\",\"tw.menuBar.moreSettings\":\"高度な設定\",\"tw.menuBar.newFramerate\":\"新しいフレームレート:\",\"tw.menuBar.newWindow\":\"新しいウィンドウ\",\"tw.menuBar.package\":\"プロジェクトをパッケージ化する\",\"tw.menuBar.reportError1\":\"スクリプトでエラーが発生しました。\",\"tw.menuBar.reportError2\":\"これは不具合です。報告してください。\",\"tw.menuBar.restorePoints\":\"復元ポイント\",\"tw.menuBar.saveAs\":\"{file}として保存する\",\"tw.menuBar.seeInside\":\"中を見る\",\"tw.mono\":\"モノラル録音\",\"tw.moreCloud\":\"クラウド変数の詳細については、こちらをご覧ください。\",\"tw.notify.permission\":\"許可した場合、オペレーションシステムからの通知許可の確認が表示され、以降の通知は自動的に許可されます。\",\"tw.notify.title\":\"このプロジェクトは通知を表示しようとしています。\",\"tw.oldDownload\":\"別ファイルで保存する...\",\"tw.opcode.2000\":\"2000年からの日数\",\"tw.opcode.mousedown\":\"マウスが押された\",\"tw.opcode.mousex\":\"マウス x\",\"tw.opcode.mousey\":\"マウス y\",\"tw.openAdvanced\":\"高度な設定を開く\",\"tw.openWindow.dangerous\":\"このウェブサイトは{APP_NAME}開発者による審査を受けていません。危険または悪意のあるコードが含まれている可能性があります。\",\"tw.openWindow.title\":\"プロジェクトは新しいウィンドウまたはタブでURLを開こうとしています:\",\"tw.paint.alpha\":\"透明度\",\"tw.paint.fonts.more\":\"フォントを追加する…\",\"tw.pen.stageSelected\":\"ステージ選択: ペンブロックが足りません。\",\"tw.privacy\":\"プライバシーポリシー\",\"tw.recordAudio.permission\":\"許可した場合、マイクへのアクセス許可の確認が表示され、以降のマイクへのアクセス許可は自動的に許可されます。\",\"tw.recordAudio.title\":\"このプロジェクトは、マイクから録音しようとしています。これには音声認識または、生の音声データが含まれます。このプロジェクトが他のユーザーやサーバーと音声を共有することができる場合があります。\",\"tw.recordVideo.permission\":\"許可した場合、カメラへのアクセス許可の確認が表示され、以降のカメラへのアクセス許可は自動的に許可されます。\",\"tw.recordVideo.title\":\"このプロジェクトは、カメラから録画しようとしています。このプロジェクトが他のユーザーやサーバーと画像を共有することができる場合があります。\",\"tw.redirect.dangerous\":\"このウェブサイトは{APP_NAME}開発者による審査を受けていません。危険または悪意のあるコードが含まれている可能性があります。\",\"tw.redirect.title\":\" このプロジェクトは、このタブで次のURLを開こうとしています:\",\"tw.removedTrademarks\":\"いくつかのアイテムは、Scratchのトレードマークを含んでいるため、使用できないようになっています。\",\"tw.restorePoints.1minute\":\"1分ごと\",\"tw.restorePoints.assets\":\"{n}個のアセット\",\"tw.restorePoints.confirmDelete\":\"\\\\\"{projectTitle}\\\\\"を本当に削除しますか? 元に戻すことはできません。\",\"tw.restorePoints.confirmDeleteAll\":\"本当に全ての復元ポイントを削除しますか? 元に戻すことはできません。\",\"tw.restorePoints.confirmLoad\":\"保存していない変更があります。既存のプロジェクトを置き換えますか?\",\"tw.restorePoints.deleteAll\":\"全て消去する\",\"tw.restorePoints.description\":\"{APP_NAME}は、保存を忘れた場合にプロジェクトを回復できるように、復元ポイントをコンピュータに定期的に保存します。これは復元のための最後の手段として意図されています。これらの復元ポイントは削除される可能性があります。できるだけこの機能に依存しないでください。\",\"tw.restorePoints.empty\":\"復元ポイントはありません。\",\"tw.restorePoints.error\":\"復元ポイントを読み込み中のエラー:{error}\",\"tw.restorePoints.exportError\":\"復元ポイントのエクスポート中にエラーが発生しました:{error}\",\"tw.restorePoints.intervalOption\":\"{time}に復元ポイントを作る\",\"tw.restorePoints.loading\":\"読み込み中…\",\"tw.restorePoints.minutes\":\"{n}分ごと\",\"tw.restorePoints.never\":\"なし\",\"tw.restorePoints.off\":\"復元ポイントを無効にするのは危険です。\",\"tw.restorePoints.size\":\"推定ストレージ使用量: {size}\",\"tw.restorePoints.size2\":\"コスチュームと、サウンドは1回だけの保存ではなく、複数回保存されます。\",\"tw.restorePoints.title\":\"復元ポイント\",\"tw.sample\":\"サンプルプロジェクト\",\"tw.saveAs\":\"…として保存する\",\"tw.saveTo\":\"{file}に保存する\",\"tw.scratchUnsafeCloud\":\"このクラウド変数を作ると、{number}変数のScratchの上限を超えます。Scratchにこのプロジェクトをアップロードしたとき、一部の変数が機能しなくなります。\",\"tw.securityManager.allow\":\"許可\",\"tw.securityManager.deny\":\"拒否\",\"tw.securityManager.title\":\"拡張機能セキュリティ\",\"tw.securityManager.trust\":\"許可した場合、同じサイトへのリクエストは、自動的に許可されます。\",\"tw.securityManager.why\":\"これは画像や音声のダウンロード、マルチプレイヤーの実装、APIへのアクセス、または悪意ある目的に使用される可能性があります。これにより、あなたのIPアドレス、位置情報、おそらくその他のデータがウェブサイトと共有されます。\",\"tw.settingsModal.customStageSize\":\"ステージの大きさを変える:\",\"tw.settingsModal.customStageSizeHelp\":\"ステージのサイズを480x360から他のサイズに変更します。ステージをワイドスクリーンにするには、640x360をお試しください。これを適切に処理できるプロジェクトはほとんどありません。\",\"tw.settingsModal.dangerZone\":\"危険区域\",\"tw.settingsModal.disableCompiler\":\"コンパイラを無効にする\",\"tw.settingsModal.disableCompilerHelp\":\"{APP_NAME}コンパイラを無効化します。プロジェクトを編集中に有効にすると、スクリプトがすぐに更新されるようになります。必要がないときは*絶対に*有効化すべきではありません。\",\"tw.settingsModal.featured\":\"おすすめ\",\"tw.settingsModal.fps\":\"60 FPS (カスタム FPS)\",\"tw.settingsModal.fpsHelp\":\"スクリプトの実行回数を30回/秒から60回/秒に変更します。この機能を有効にすると、ほとんどのプロジェクトが正常に動作しなくなります。そのような場合には、60FPSモードを無効にして補間機能を試してみてください。{customFramerate}.\",\"tw.settingsModal.fpsHelp.customFramerate\":\"30または60以外のFPSを設定する\",\"tw.settingsModal.help\":\"クリックしてヘルプ\",\"tw.settingsModal.highQualityPen\":\"ペンできれいに描画する\",\"tw.settingsModal.highQualityPenHelp\":\"ペンのプロジェクトをより高い解像度でレンダリングする代わりに、エディタでの座標丸めを一部無効にします。全てのプロジェクトでこの設定が有効とはいえず、パフォーマンスに影響を与えることがあります。\",\"tw.settingsModal.infiniteClones\":\"クローンの制限を解除\",\"tw.settingsModal.infiniteClonesHelp\":\"Scratchの、クローンが300個までしか作れない制限を解除します。\",\"tw.settingsModal.interpolation\":\"補完機能\",\"tw.settingsModal.interpolationHelp\":\"スプライトの動きを補間することで、プロジェクトをより滑らかに見せます。この機能は、3Dのプロジェクト、レイトレーサー、ペンを使ったプロジェクトや、重いプロジェクトには使用しないでください。スムーズではなくなり、動作が遅くなります。\",\"tw.settingsModal.largeStageWarning\":\"ステージのサイズを大きくすることはおすすめできません。その代わり、同じアスペクト比の小さなサイズを使用し、フルスクリーンにすることでお使いのディスプレイの大きさに合わせてください。\",\"tw.settingsModal.removeFencing\":\"動く範囲と大きさの制限を解除する\",\"tw.settingsModal.removeFencingHelp\":\"スプライトを画面の外へ移動させたり、好きなだけ大きさを変えたり、触れたブロックを画面外で作動させたりすることができます。\",\"tw.settingsModal.removeLimits\":\"制限を解除する\",\"tw.settingsModal.removeMiscLimits\":\"その他の制限を解除\",\"tw.settingsModal.removeMiscLimitsHelp\":\"効果音の制限とペンの大きさの制限を解除する\",\"tw.settingsModal.storeProjectOptions\":\"高度な設定を保存する\",\"tw.settingsModal.storeProjectOptionsHelp\":\"選択した設定をプロジェクトに保存し、TurboWarpがこのプロジェクトを読み込んだときに自動的に適用されるようにします。Warpタイマーとコンパイラの無効化の設定は保存されません。\",\"tw.settingsModal.title\":\"高度な設定\",\"tw.settingsModal.warpTimer\":\"Warpタイマー\",\"tw.settingsModal.warpTimerHelp\":\"スクリプトが長いループや無限ループに陥っているかどうかをチェックし、ループが終了するまで動けないのを避け、低いフレームレートで実行するようにします。これにより、ほとんどのクラッシュが修正されます。しかし、パフォーマンスへの影響が大きいため、デフォルトではエディタでのみ有効になっています。\",\"tw.soundEditorNotSupported\":\"このブラウザではサウンドエディタがサポートされていません。\",\"tw.spriteSelectorItem.rename\":\"名前を変える\",\"tw.stageHeader.full\":\"フルステージに切り替える\",\"tw.stereo\":\"ステレオ録音\",\"tw.stereoAlert\":\"このステレオサウンドを編集すると、不可逆的にモノラルに変換されます。\",\"tw.studioview.error\":\"プロジェクトを次のページで読み込む際にエラーが発生しました。\",\"tw.tooLarge\":\"この音は大きすぎてスクラッチにアップロードできないかもしれません。\",\"tw.twExtension.description\":\"不思議な新しいブロック\",\"tw.twExtension.name\":\"{APP_NAME}ブロック\",\"tw.unfavorite\":\"お気に入りを外す\",\"tw.unknownPlatform.1\":\"このプロジェクトは別のプラットフォーム向けに作成されました:\",\"tw.unknownPlatform.2\":\"{APP_NAME}との互換性はありません。リスクがあることを理解した上で、続けることはできますが、不具合が発生した場合、サポートを受けられない場合があります。\",\"tw.unknownPlatform.continue\":\"理解しました\",\"tw.unknownPlatform.title\":\"不明なプラットフォーム\",\"tw.unshared.2\":\"詳しくはこちらをご覧ください: {link}\",\"tw.unshared.bug\":\"このプロジェクトが共有済みにも関わらず読み込めない場合は不具合報告をお願いします。\",\"tw.unshared.cache\":\"プロジェクトが最近共有された場合、このメッセージは数分間誤って表示される可能性があります。\",\"tw.unshared2.1\":\"非共有のプロジェクトは表示されません。\",\"tw.usernameModal.help\":\"この名前は、ブラウザのストレージに保存されます。クラウド変数を含むプロジェクトを見る際に記録されることがあります。\",\"tw.usernameModal.help2\":\"有効なScratchのアカウント名に対応していないと、通常はクラウド変数サーバに拒否されます。そのままにしておくか、Scratchのユーザー名に変えることをおすすめします。\",\"tw.usernameModal.mustChange\":\"申し訳ありませんが、あなたのユーザー名は適切でない可能性があります。他のユーザー名に変更するか、{resetIt}をしてください。\",\"tw.usernameModal.mustChange.resetIt\":\"リセット(おすすめ)\",\"tw.usernameModal.new\":\"新しいユーザー名:\",\"tw.usernameModal.reset\":\"リセット\",\"tw.usernameModal.title\":\"ユーザー名を変える\",\"tw.usesCloudVariables\":\"このプロジェクトはクラウド変数を使っています。\",\"tw.usesCloudVariables2\":\"{APP_NAME}のクラウド変数はScratchとは接続されていません。\\\\n誰でも{changeTheirUsername}して何でも入力することができるので、気をつけてください。\",\"tw.usesCloudVariables2.change\":\"ユーザー名を変更\",\"tw.viewFeaturedProjects\":\"クリックしてプロジェクトの特集を見る。\",\"tw.viewOnScratch\":\"Scratchでプロジェクトを見る\"},\"ja-hira\":{\"tw.alerts.creatingRestorePoint\":\"ふくげんしています…\",\"tw.alerts.savedToDisk\":\"コンピューターに保存(ほぞん)する\",\"tw.backpack.rename\":\"あたらしいなまえ : \",\"tw.blocks.addons\":\"アドオン\",\"tw.blocks.buttonIsDown\":\"マウスの[MOUSE_BUTTON]がおされた\",\"tw.blocks.lastKeyPressed\":\"さいごにおされたキー\",\"tw.blocks.mouseButton.middle\":\"(1)ホイール\",\"tw.blocks.mouseButton.primary\":\"(0)ひだりボタン\",\"tw.blocks.mouseButton.secondary\":\"(2)みぎボタン\",\"tw.blocks.openDocs\":\"ドキュメントをひらく\",\"tw.changeUsername.cannotChangeWhileRunning\":\"ユーザーめいはプロジェクトを実行中(じっこうちゅう)にかえることはできません。\",\"tw.code\":\"ソースコード\",\"tw.customExtension.name\":\"カスタムかくちょうきのう\",\"tw.featuredProjectsStudio\":\"Scratchのスタジオでみる。\",\"tw.feedback\":\"フィードバックとバグ\",\"tw.footer.credits\":\"クレジット\",\"tw.footer.embed\":\"うめこみコード\",\"tw.footer.parameters\":\"URLパラメーター\",\"tw.gui.crashMessage.description\":\"もうしわけありませんが、ページがクラッシュしたようです。ページをもういちどよみこんでください。\",\"tw.gui.defaultProjectTitle\":\"プロジェクト\",\"tw.guiDefaultTitle\":\"Scratchのプロジェクトをはやくうごかす\",\"tw.home.credit\":\"メモとクレジット\",\"tw.home.instructions\":\"つかいかた\",\"tw.input.tooltip\":\"ScratchのプロジェクトのURLをコピー&ペーストしてみることができます\",\"tw.interpolationEnabled\":\"ほかんきのう\",\"tw.invalidParameters.clones\":\"「クローン」のURLパラメーターが無効(むこう)です\",\"tw.invalidParameters.fps\":\"「FPS」のURLパラメーターが無効(むこう)です\",\"tw.invalidProject.title\":\"エラー\",\"tw.loader.downloadingAssets\":\"{total}つのうち{complete}つダウンロードをかんりょう…\",\"tw.loader.projectData\":\"プロジェクトをよみこみちゅう…\",\"tw.menuBar.60off\":\"60FPSモードをかいじょする\",\"tw.menuBar.60on\":\"60FPSモードにする\",\"tw.menuBar.addons\":\"アドオン\",\"tw.menuBar.advanced\":\"こうどなせってい\",\"tw.menuBar.changeUsername\":\"ユーザーめいをかえる\",\"tw.menuBar.cloudOff\":\"クラウドへんすうをむこうにする\",\"tw.menuBar.cloudOn\":\"クラウドへんすうをゆうこうにする\",\"tw.menuBar.cloudUnavailable\":\"クラウドへんすうはつかえません\",\"tw.menuBar.desktopSettings\":\"デスクトップのせってい\",\"tw.menuBar.moreSettings\":\"こうどなせってい\",\"tw.menuBar.newFramerate\":\"あたらしいフレームレート:\",\"tw.menuBar.package\":\"プロジェクトをパッケージにする\",\"tw.menuBar.reportError2\":\"これはバグです。ほうこくしてください。\",\"tw.menuBar.saveAs\":\"{file}としてほぞんする\",\"tw.menuBar.seeInside\":\"なかをみる\",\"tw.mono\":\"モノラル\",\"tw.oldDownload\":\"べつのファイルでほぞんする...\",\"tw.opcode.mousex\":\"マウス x\",\"tw.opcode.mousey\":\"マウス y\",\"tw.paint.alpha\":\"とうめいど\",\"tw.privacy\":\"プライバシーポリシー\",\"tw.saveAs\":\"…としてほぞんする\",\"tw.saveTo\":\"{file}にほぞんする\",\"tw.settingsModal.customStageSize\":\"ステージのおおきさをかえる:\",\"tw.settingsModal.dangerZone\":\"危険区域(きけんくいき)\",\"tw.settingsModal.disableCompiler\":\"コンパイラをつかわない\",\"tw.settingsModal.featured\":\"おすすめ\",\"tw.settingsModal.fps\":\"60 FPS (カスタム FPS)\",\"tw.settingsModal.fpsHelp\":\"通常(つうじょう)FPSが30のところ、60でスクリプトをうごかします。この機能(きのう)を有効(ゆうこう)にすると、ほとんどのプロジェクトがただしく動作(どうさ)しません。そのような場合(ばあい)は、この機能(きのう)を無効(むこう)にして「ほかんきのう」をためしてください。{customFramerate}\",\"tw.settingsModal.fpsHelp.customFramerate\":\"クリックして30または60いがいのFPSにせっていする\",\"tw.settingsModal.help\":\"クリックしてヘルプ\",\"tw.settingsModal.highQualityPen\":\"ペンできれいにびょうがする\",\"tw.settingsModal.highQualityPenHelp\":\"ペンのプロジェクトをよりたかい解像度(かいぞうど)でレンダリングするかわりに、エディタでのの座標(ざひょう)まるめを一部無効(いちぶむこう)にします。すべてのプロジェクトでこの設定(せってい)が有効(ゆうこう)とはいえず、パフォーマンスに影響(えいきょう)をあたえることがあります。\",\"tw.settingsModal.infiniteClones\":\"クローンの制限(せいげん)を解除(かいじょ)\",\"tw.settingsModal.infiniteClonesHelp\":\"Scratchの、クローンが300こまでしかつくれない制限(せいげん)を解除(かいじょ)します。\",\"tw.settingsModal.interpolation\":\"ほかんきのう\",\"tw.settingsModal.interpolationHelp\":\"スプライトのうごきを補間(ほかん)することで、プロジェクトをよりなめらかにします。このきのうは、3Dのプロジェクト、レイトレーサー、ペンをつかったプロジェクトや、おもいプロジェクトにはつかわないでください。うごきがおそくなります。\",\"tw.settingsModal.removeFencing\":\"うごく範囲(はんい)とおおきさの制限(せいげん)を解除(かいじょ)する\",\"tw.settingsModal.removeFencingHelp\":\"スプライトを画面(がめん)の外(そと)へ移動(いどう)させたり、すきなだけおおきさをかえたり、ふれたブロックを画面外(がめんがい)でうごかしたりすることができます。\",\"tw.settingsModal.removeLimits\":\"せいげんをなくす\",\"tw.settingsModal.removeMiscLimits\":\"そのほかのせいげんをなくす\",\"tw.settingsModal.removeMiscLimitsHelp\":\"効果音(こうかおん)の制限(せいげん)とペンのおおきさの制限(せいげん)を解除(かいじょ)する\",\"tw.settingsModal.storeProjectOptions\":\"こうどなせっていをほぞんする\",\"tw.settingsModal.title\":\"こうどなせってい\",\"tw.settingsModal.warpTimer\":\"Warpタイマー\",\"tw.settingsModal.warpTimerHelp\":\"スクリプトがながいループや無限(むげん)ループにおちいっているかどうかをチェックし、ループが終了(しゅうりょう)するまでうごけないのをさけ、ひくいフレームレートで実行(じっこう)するようにします。これにより、ほとんどのクラッシュが修正(しゅうせい)されます。しかし、パフォーマンスへの影響(えいきょう)がおおきいため、デフォルトではエディタでのみ有効(ゆうこう)になっています。\",\"tw.spriteSelectorItem.rename\":\"なまえをかえる\",\"tw.stereo\":\"ステレオ\",\"tw.studioview.error\":\"プロジェクトをつぎのページでよみこむときにエラーが発生(はっせい)しました。\",\"tw.twExtension.description\":\"ふしぎなあたらしいブロック\",\"tw.usernameModal.mustChange\":\"もうしわけありません、あなたのユーザーめいが安全(あんぜん)でない可能性(かのうせい)があります。ほかのユーザーめいに変更(へんこう)するか、{resetIt}をしてください。\",\"tw.usernameModal.mustChange.resetIt\":\"リセット(おすすめ)\",\"tw.usernameModal.new\":\"あたらしいゆーざーめい:\",\"tw.usernameModal.reset\":\"リセット\",\"tw.usernameModal.title\":\"ユーザーめいをかえる\",\"tw.viewFeaturedProjects\":\"クリックしてプロジェクトの特集(とくしゅう)をみる。\",\"tw.viewOnScratch\":\"Scratchでプロジェクトをみる\"},\"ko\":{\"tw.accent.blue\":\"푸른색\",\"tw.accent.purple\":\"보라색\",\"tw.accent.rainbow\":\"무지개색\",\"tw.accent.red\":\"붉은색\",\"tw.alerts.creatingRestorePoint\":\"복원 지점 생성 중...\",\"tw.alerts.lostPeripheralConnection\":\"{extensionName} 확장 기능과 연결이 끊어졌습니다.\",\"tw.alerts.restorePointError\":\"복원 지점을 생성할 수 없습니다.\",\"tw.alerts.restorePointSuccess\":\"\\\\\"파일\\\\\" 탭에 복원 지점이 생성되었습니다\",\"tw.alerts.savedToDisk\":\"컴퓨터에 저장되었습니다.\",\"tw.backpack.rename\":\"새로운 이름:\",\"tw.blockColors.custom\":\"애드온 설정에서 사용자 지정하기\",\"tw.blockColors.dark\":\"다크 (베타)\",\"tw.blockColors.highContrast\":\"고대비\",\"tw.blockColors.three\":\"기본\",\"tw.blocks.PROCEDURES_DOCS\":\"반환을 사용하는 방법\",\"tw.blocks.PROCEDURES_RETURN\":\"{v} 반환하기\",\"tw.blocks.PROCEDURES_TO_REPORTER\":\"리포터 블록으로 변경하기\",\"tw.blocks.PROCEDURES_TO_STATEMENT\":\"커맨드 블록으로 변경하기\",\"tw.blocks.addons\":\"애드온\",\"tw.blocks.buttonIsDown\":\"[MOUSE_BUTTON]마우스 버튼을 눌렀는가?\",\"tw.blocks.lastKeyPressed\":\"마지막으로 눌린 키\",\"tw.blocks.mouseButton.middle\":\"(1) 가운데\",\"tw.blocks.mouseButton.primary\":\"(0) 왼쪽\",\"tw.blocks.mouseButton.secondary\":\"(2) 오른쪽\",\"tw.blocks.openDocs\":\"문서 열기\",\"tw.browserModal.desktopSettings\":\"데스크톱 설정 열기\",\"tw.cantUseCloud\":\"클라우드 변수를 생성할 수는 있으나, 해당 프로젝트가 Scratch에 업로드 하거나, {packager}와 같은 도구를 통해 변환하지 않는 한 클라우드 변수는 작동하지 않습니다.\",\"tw.changeUsername.cannotChangeWhileRunning\":\"\\'사용자 이름\\'은 프로젝트가 실행되는 동안 변경할 수 없습니다.\",\"tw.clipboard.danger\":\"클립보드에 비밀번호와 같은 민감한 정보가 포함되어 있을 경우, 프로젝트에 의해 해당 정보가 다른 사용자 또는 서버와 공유될 수 있습니다.\",\"tw.clipboard.permission\":\"일부 브라우저에서는 클립보드에 접근이 불가능할 수 있습니다. 권한을 허용할 경우, 추가적인 클립보드 읽기 요청이 자동으로 허용됩니다.\",\"tw.clipboard.title\":\"프로젝트가 클립보드의 데이터 읽기 권한을 요청합니다.\",\"tw.cloudProvider\":\"서버 제공자 : {name}\",\"tw.cloudServers\":\"거주지 근처에 있는 서버를 선택하세요 :\",\"tw.code\":\"소스코드\",\"tw.confirmIncompatibleExtension\":\"이 확장 기능은 스크래치와 호환되지 않습니다.\\\\n해당 확장 기능을 활성화할 경우 프로젝트가 스크래치 웹사이트에 업로드되지 않을 수 있습니다. 계속하시겠습니까?\",\"tw.createdBy\":\"제작자 : \",\"tw.customCloudServer\":\"사용자 지정 클라우드 변수 서버 사용 중 : {server}\",\"tw.customExtension.description\":\"사용자 지정 확장 기능을 URL, 파일 또는 JavaScript 소스코드를 통해 불러옵니다.\",\"tw.customExtension.name\":\"사용자 지정 확장 기능\",\"tw.customExtensionModal.file\":\"파일\",\"tw.customExtensionModal.load\":\"불러오기\",\"tw.customExtensionModal.promptFile\":\"JavaScript 파일을 선택하거나 끌어다 놓으세요 :\",\"tw.customExtensionModal.promptText\":\"확장 기능의 JavaScript 소스코드를 붙여넣기 하세요 : \",\"tw.customExtensionModal.promptURL\":\"확장 기능의 URL을 입력하세요 : \",\"tw.customExtensionModal.text\":\"텍스트\",\"tw.customExtensionModal.title\":\"사용자 지정 확장 기능 불러오기\",\"tw.customExtensionModal.trusted\":\"해당 확장 기능은 신뢰할 수 있는 공급원으로부터 제공받아, 샌드박스하지 않고 불러옵니다.\",\"tw.customExtensionModal.unsandboxed\":\"샌드박스하지 않고 실행하기\",\"tw.customExtensionModal.unsandboxedWarning1\":\"확장 기능을 샌드박스하지 않고 불러오는 것은 위험하므로, 이로 인한 영향을 명확히 인지하지 못할 경우 활성화하지 마시기 바랍니다.\",\"tw.customExtensionModal.unsandboxedWarning2\":\"샌드박스하지 않은 확장 기능은 프로젝트를 망치고, 사용자 설정을 삭제하거나, 비밀번호를 유출하는 등의 악의적 행위의 여지가 있습니다.\\\\n{APP_NAME}의 개발자는 해당 문제로 인해 야기되는 결과에 어떤 책임도 지지 않습니다.\",\"tw.customExtensionModal.untrusted\":\"신뢰할 수 없는 URL로부터 제공되는 확장 기능은 보안을 위해 항상 샌드박스하여 불러옵니다.\",\"tw.customReporters.description\":\"사용자 정의 블록이 값을 출력하거나 입력으로 사용될 수 있도록 합니다.\",\"tw.customReporters.name\":\"사용자 정의 리포터 블록\",\"tw.darkMode\":\"밝은 화면으로 전환하기\",\"tw.desktopCloud\":\"데스크톱 앱의 경우, 클라우드 변수는 컴퓨터 내에서 실행되는 모든 데스크톱 앱 창에서 동기화됩니다. 해당 프로젝트를 스크래치에 업로드하거나, {packager}와 같은 도구를 사용하여 전역적으로 동기화가 가능합니다. \",\"tw.documentation\":\"문서\",\"tw.download.danger\":\"해당 파일은 {APP_NAME} 개발진에 의해 검수되지 않았습니다.\",\"tw.download.executable\":\"해당 파일은 실행 파일이므로 악의적인 코드가 실행될 여지가 있습니다.\",\"tw.download.file\":\"프로젝트가 사용자의 기기에 파일을 다운로드하기를 요청합니다. 파일은 다운로드 폴더에 {name}(으)로 저장됩니다.\",\"tw.embed.persistent\":\"해당 권한을 허용할 경우, 현재 웹사이트에서의 추가적인 임베딩이 자동으로 허용됩니다.\",\"tw.embed.risks\":\"임베디드 콘텐츠는 샌드박스되지만, 여전히 사용자 기기의 IP 주소 또는 위치 정보와 같은 기기 정보에 접근할 수 있습니다.\",\"tw.embed.title1\":\"프로젝트가 무대에 HTML 콘텐츠를 표시하려고 합니다 :\",\"tw.embed.title2\":\"프로젝트가 무대에 원격 콘텐츠를 표시하려고 합니다 :\",\"tw.extension.faceSensing.description\":\"카메라로 안면을 인식합니다.\",\"tw.extension.faceSensing.name\":\"얼굴 인식\",\"tw.extensionGallery.error\":\"확장 기능 갤러리를 불러오는 중 문제가 발생했습니다. extensions.turbowarp.org 에서 더 많은 확장 기능을 찾아보세요.\",\"tw.extensionGallery.loading\":\"확장 기능 갤러리를 불러오는 중...\",\"tw.extensionGallery.more\":\"extensions.turbowarp.org 에서 확장 기능에 대해 자세히 알아보기\",\"tw.extensionGallery.name\":\"{APP_NAME} 확장 기능 갤러리\",\"tw.favorite\":\"즐겨찾기\",\"tw.featuredProjectsStudio\":\"스크래치 스튜디오에서 특집 프로젝트 목록 보기\",\"tw.feedback\":\"문의 및 오류 신고\",\"tw.feedbackButton\":\"{APP_NAME} 문의하기\",\"tw.fetch.title\":\"프로젝트가 웹사이트 연결을 요청합니다 : \",\"tw.fileInput.none\":\"선택된 파일 없음.\",\"tw.fileInput.selected\":\"선택된 파일 : {names}\",\"tw.fonts.add\":\"추가하기\",\"tw.fonts.custom.file\":\"컴퓨터에서 글꼴 파일 선택 : \",\"tw.fonts.custom.name\":\"글꼴 이름 지정 : \",\"tw.fonts.custom1\":\"파일에서 글꼴 추가\",\"tw.fonts.custom2\":\"스크래치에서 호환되지 않는 글꼴 확장자입니다. 지원되는 확장자 : {formats}\",\"tw.fonts.delete\":\"정말로 \\\\\"{font}\\\\\" 폰트를 삭제하시겠습니까? 해당 폰트를 사용하는 모든 벡터 그래픽이 대체 글꼴로 변경됩니다.\",\"tw.fonts.fallback\":\"글꼴이 삭제되었거나 불러오는 데 실패했을 경우 사용할 대체 글꼴을 선택하세요.\",\"tw.fonts.list\":\"설치된 글꼴 : \",\"tw.fonts.none\":\"추가된 글꼴 없음\",\"tw.fonts.readError\":\"글꼴 파일 읽기에 실패했습니다 : {error}\",\"tw.fonts.system\":\"시스템 글꼴\",\"tw.fonts.system.name\":\"컴퓨터에 내장된 사용하려는 글꼴의 이름을 입력하세요. 시스템 글꼴은 일부 사용자에게 올바르게 나타나지 않을 수 있습니다.\",\"tw.fonts.system1\":\"시스템 글꼴 추가\",\"tw.fonts.system2\":\"스크래치에서 작동할 수 있으나, 일부 사용자에게 올바르게 나타나지 않을 수 있습니다.\",\"tw.fonts.title\":\"글꼴\",\"tw.footer.credits\":\"도움을 준 사람들\",\"tw.footer.disclaimer\":\"{APP_NAME}은(는) 스크래치, 스크래치 팀, 스크래치 재단에 소속되어 있지 않습니다.\",\"tw.footer.documentation\":\"문서\",\"tw.footer.embed\":\"임베딩\",\"tw.footer.parameters\":\"URL 파라미터\",\"tw.footer.scratchDisclaimer\":\"스크래치는 스크래치 재단의 프로젝트입니다. {scratchDotOrg} 에서 무료로 사용 가능합니다.\",\"tw.geolocate.permission\":\"해당 권한을 허용할 경우, 사용자의 브라우저에 따라 위치 권한을 요청하는 알림이 추가적으로 나타날 수 있습니다.\",\"tw.geolocate.title\":\"프로젝트가 사용자의 위치 정보에 접근할 수 있는 권한을 요청합니다.\",\"tw.gui.crashMessage.description\":\"페이지에 충돌이 발생했습니다.\\\\n페이지를 새로고침한 후에 다시 시도해 주세요.\",\"tw.gui.defaultProjectTitle\":\"프로젝트\",\"tw.guiDefaultTitle\":\"스크래치 프로젝트를 더 빠르게 실행하기\",\"tw.home.credit\":\"참고사항 및 참여자\",\"tw.home.description\":\"{APP_NAME}은(는) 스크래치 프로젝트를 JavaScript로 컴파일하여 매우 빠르게 실행할 수 있도록 해주는 스크래치 기반의 Mod입니다. \\\\n프로젝트 ID 또는 프로젝트 URL을 붙여넣거나, 아래의 특집 프로젝트를 선택해서 실행해 보세요.\",\"tw.home.instructions\":\"사용 방법\",\"tw.input.tooltip\":\"스크래치 프로젝트 주소를 복사한 후 여기에 붙여넣기 하세요!\",\"tw.interpolationEnabled\":\"보간법 활성화\",\"tw.invalidParameters.clones\":\"\\\\\"clone\\\\\" URL 파라미터가 유효하지 않습니다\",\"tw.invalidParameters.fps\":\"\\\\\"fps\\\\\" URL 파라미터가 유효하지 않습니다\",\"tw.invalidProject.error\":\"프로젝트를 불러올 수 없습니다 :\",\"tw.invalidProject.options\":\"자동 복구 지점 또는 그 외의 백업본을 통해 프로젝트의 이전 버전을 복구할 수 있습니다.\",\"tw.invalidProject.reportIt\":\"해당 현상을 제보\",\"tw.invalidProject.restorePoints\":\"복원 지점 보기\",\"tw.invalidProject.title\":\"오류\",\"tw.invalidProject.validationError\":\"해당 오류는 프로젝트의 일부분이 손상되었을 경우 자주 발생하며, 쉽게 복구가 가능합니다. 따라서 {reportIt}해주시기를 부탁드립니다.\",\"tw.lightMode\":\"어두운 화면으로 전환하기\",\"tw.loadExtension.embedded\":\"프로젝트가 코드를 포함한 사용자 지정 확장 기능 불러오기를 요청합니다 : \",\"tw.loadExtension.sandboxed\":\"코드가 샌드박스되지만, 여전히 IP 주소나 위치 정보와 같은 사용자 기기 정보에 접근할 수 있습니다.\\\\n계속하기 전에 해당 확장 기능의 제작자를 신뢰할 수 있는지 확인하세요.\",\"tw.loadExtension.unsandboxed\":\"샌드박스하지 않고 실행하기\",\"tw.loadExtension.unsandboxedWarning\":\"샌드박스 없이 확장 기능을 불러오는 것은 위험합니다. 이는 프로젝트를 망치고, 사용자 설정이 삭제되거나, 비밀번호가 유출되는 등의 악의적 행위의 여지가 있습니다.\\\\n{APP_NAME}의 개발자는 해당 문제로 인해 야기되는 결과에 어떤 책임도 지지 않습니다.\",\"tw.loadExtension.url\":\"프로젝트가 URL로부터 사용자 지정 확장 기능 불러오기를 요구합니다 : \",\"tw.loader.downloadingAssets\":\"에셋 다운로드 중... ({complete}/{total})\",\"tw.loader.loadingAssets\":\"에셋 불러오기 중... ({complete}/{total})\",\"tw.loader.projectData\":\"프로젝트를 불러오는 중...\",\"tw.menuBar.60off\":\"60 FPS 모드 비활성화\",\"tw.menuBar.60on\":\"60 FPS 모드 활성화\",\"tw.menuBar.accent\":\"강조 색상\",\"tw.menuBar.addons\":\"애드온\",\"tw.menuBar.advanced\":\"고급 설정\",\"tw.menuBar.blockColors\":\"블록 색상\",\"tw.menuBar.changeUsername\":\"사용자 이름 변경하기\",\"tw.menuBar.cloudOff\":\"클라우드 변수 비활성화\",\"tw.menuBar.cloudOn\":\"클라우드 변수 활성화\",\"tw.menuBar.cloudUnavailable\":\"클라우드 변수를 이용할 수 없습니다\",\"tw.menuBar.cloudUnavailableAlert\":\"편집기를 여는 동안 클라우드 변수를 사용할 수 없습니다.\",\"tw.menuBar.desktopSettings\":\"데스크톱 설정\",\"tw.menuBar.moreSettings\":\"고급 설정\",\"tw.menuBar.newFramerate\":\"사용할 FPS:\",\"tw.menuBar.newWindow\":\"새 창 열기\",\"tw.menuBar.package\":\"프로젝트 패키징하기\",\"tw.menuBar.reportError1\":\"일부 스크립트에서 오류가 발생했습니다.\",\"tw.menuBar.reportError2\":\"오류가 발생했습니다. 해당 오류를 보고해주시길 부탁드립니다.\",\"tw.menuBar.restorePoints\":\"복원 지점\",\"tw.menuBar.saveAs\":\"{file}(으)로 저장하기\",\"tw.menuBar.seeInside\":\"스크립트 보기\",\"tw.mono\":\"모노\",\"tw.moreCloud\":\"클라우드 변수에 대해 자세히 알아보기\",\"tw.notify.permission\":\"해당 권한을 허용할 경우, 브라우저에서 알림 표시 허용 여부를 묻는 알림 창이 나타날 수 있으며, 추가적인 알림 표시 요청이 자동으로 허용됩니다.\",\"tw.notify.title\":\"프로젝트가 알림 표시 권한을 요청합니다.\",\"tw.oldDownload\":\"다른 파일로 저장하기\",\"tw.opcode.2000\":\"2000년 이후 경과 날짜 수\",\"tw.opcode.mousedown\":\"마우스가 눌렸는가?\",\"tw.opcode.mousex\":\"마우스 x좌표\",\"tw.opcode.mousey\":\"마우스 y좌표\",\"tw.openAdvanced\":\"고급 설정 열기\",\"tw.openWindow.dangerous\":\"해당 웹사이트는 {APP_NAME}의 개발자에 의해 보고된 웹사이트가 아니며, 위험하거나 악의적인 코드를 포함할 여지가 있습니다.\",\"tw.openWindow.title\":\"프로젝트가 다음 URL을 새 창이나 탭에서 열기를 요청합니다 : \",\"tw.paint.alpha\":\"불투명도\",\"tw.paint.fonts.more\":\"글꼴 추가...\",\"tw.pen.stageSelected\":\"무대 선택됨: 펜 블록 일부 지원\",\"tw.privacy\":\"개인정보 보호 정책\",\"tw.recordAudio.permission\":\"해당 권한을 허용할 경우, 브라우저에서 마이크 접근 허용 여부를 묻는 알림 창이 나타날 수 있으며, 추가적인 마이크 접근 요청이 자동으로 허용됩니다.\",\"tw.recordAudio.title\":\"프로젝트가 사용자의 마이크를 통한 오디오 녹음 권한을 요청합니다. 여기에는 텍스트 변환 음성이나 원시 오디오 데이터가 포함됩니다.\\\\n녹음된 오디오는 프로젝트에 의해 다른 사용자 또는 서버와 공유될 수 있습니다.\",\"tw.recordVideo.permission\":\"해당 권한을 허용할 경우, 브라우저에서 카메라 접근 허용 여부를 묻는 알림 창이 나타날 수 있으며, 추가적인 카메라 접근 요청이 자동으로 허용됩니다.\",\"tw.recordVideo.title\":\"프로젝트가 사용자의 카메라를 통한 비디오 녹화 권한을 요청합니다.\\\\n녹화된 데이터는 프로젝트에 의해 다른 사용자 또는 서버와 공유될 수 있습니다.\",\"tw.redirect.dangerous\":\"해당 웹사이트는 {APP_NAME}의 개발자가 검수한 웹사이트가 아니며, 위험하거나 악의적인 코드를 포함할 여지가 있습니다.\",\"tw.redirect.title\":\"프로젝트가 해당 탭을 다음의 URL로 전환하기를 요청합니다 : \",\"tw.removedTrademarks\":\"일부 스크래치 상표를 포함하는 모양들은 제외되었습니다.\",\"tw.restorePoints.1minute\":\"1분\",\"tw.restorePoints.assets\":\"{n} 에셋\",\"tw.restorePoints.confirmDelete\":\"정말로 \\\\\"{projectTitle}\\\\\" 프로젝트를 삭제하시겠습니까?\\\\n이 작업은 되돌릴 수 없습니다.\",\"tw.restorePoints.confirmDeleteAll\":\"정말로 모든 복원 지점을 삭제하시겠습니까?\\\\n이 작업은 되돌릴 수 없습니다.\",\"tw.restorePoints.confirmLoad\":\"저장되지 않은 변경 사항이 있습니다. 현재 프로젝트에 덮어쓰기 하시겠습니까?\",\"tw.restorePoints.deleteAll\":\"모든 복원 지점 삭제하기\",\"tw.restorePoints.description\":\"{APP_NAME}에서는 사용자가 프로젝트를 저장하지 않고 종료할 시를 대비해 주기적으로 복원 지점을 생성합니다.\\\\n해당 기능은 프로젝트를 복구하기 위한 최후의 수단입니다. 저장된 복원 지점은 언제든지 기기의 시스템에 의해 자동으로 삭제될 수 있으므로 절대로 해당 기능에 의존하지 마십시오.\",\"tw.restorePoints.empty\":\"복원 지점을 찾을 수 없습니다.\",\"tw.restorePoints.error\":\"복원 지점을 불러오는 중 문제가 발생했습니다 : {error}\",\"tw.restorePoints.exportError\":\"복원 지점 내보내기 중 오류가 발생했습니다: {error}\",\"tw.restorePoints.intervalOption\":\"복원 지점이 {time} 간격으로 생성됩니다.\",\"tw.restorePoints.loading\":\"불러오는 중...\",\"tw.restorePoints.minutes\":\"{n}분\",\"tw.restorePoints.never\":\"없음\",\"tw.restorePoints.off\":\"복원 지점을 비활성화하는 것은 위험합니다.\",\"tw.restorePoints.size\":\"예상 저장 공간 사용량 : {size}\",\"tw.restorePoints.size2\":\"다중 복원 지점에서 사용되는 모양 및 소리 리소스는 한 번만 저장되어 공간을 절약합니다.\",\"tw.restorePoints.title\":\"복원 지점\",\"tw.sample\":\"예제 프로젝트\",\"tw.saveAs\":\"다른 이름으로 저장하기\",\"tw.saveTo\":\"{file}(으)로 저장하기\",\"tw.scratchUnsafeCloud\":\"만약 이 클라우드 변수를 생성할 경우, 해당 프로젝트는 최대 {number}개인 클라우드 변수의 개수 제한을 초과하게 됩니다.\\\\n이 경우 해당 프로젝트를 Scratch에 업로드할 때, 일부 변수가 정상적으로 작동하지 않을 수 있습니다.\",\"tw.securityManager.allow\":\"허용\",\"tw.securityManager.deny\":\"거부\",\"tw.securityManager.title\":\"확장 기능 보안\",\"tw.securityManager.trust\":\"해당 권한을 허용할 경우, 현재 웹사이트에서의 추가적인 요청이 자동으로 허용됩니다.\",\"tw.securityManager.why\":\"해당 권한은 이미지 또는 소리 파일 다운로드, 멀티플레이어 구현, API 액세스를 위해 사용될 수 있지만 타인에 의해 악용될 수도 있습니다. 권한을 허용할 시에 내 컴퓨터의 IP 주소, 위치 정보 및 기타 정보를 공유합니다.\",\"tw.settingsModal.customStageSize\":\"사용자 지정 무대 크기\",\"tw.settingsModal.customStageSizeHelp\":\"무대 크기를 480x360이 아닌 다른 크기로 바꿉니다.\\\\n와이드스크린(16:9) 화면비의 경우 640x360을 추천합니다. 다만 대부분 올바르게 작동하지 않습니다.\",\"tw.settingsModal.dangerZone\":\"위험한 기능\",\"tw.settingsModal.disableCompiler\":\"컴파일러 비활성화\",\"tw.settingsModal.disableCompilerHelp\":\"{APP_NAME} 컴파일러를 비활성화합니다.\\\\n프로젝트 실행 도중에 스크립트의 수정 사항이 즉각적으로 반영되는 것을 원하는 경우가 아니라면, 컴파일러를 비활성화하지 마시기 바랍니다.\",\"tw.settingsModal.featured\":\"추천 기능\",\"tw.settingsModal.fps\":\"60 FPS (또는 사용자 지정 FPS) 활성화\",\"tw.settingsModal.fpsHelp\":\"스크립트를 초당 30회로 실행하는 대신 초당 60회 실행합니다. 대부분의 프로젝트는 이 기능이 활성화된 상태에서 제대로 작동하지 않으며, 이 같은 경우에는 60 FPS모드 대신 보간법을 사용해야 합니다. {customFramerate}\",\"tw.settingsModal.fpsHelp.customFramerate\":\"FPS 사용자 정의하기\",\"tw.settingsModal.help\":\"클릭하여 도움말 열기\",\"tw.settingsModal.highQualityPen\":\"고품질 펜 활성화\",\"tw.settingsModal.highQualityPenHelp\":\"펜 중심의 프로젝트를 보다 높은 해상도로 렌더링하고, 편집기에서 적용되는 일부 좌표의 소수점 반올림을 비활성화합니다. 이 옵션은 모든 프로젝트에 이롭지는 않으며 성능에 영향을 미칠 수 있습니다.\",\"tw.settingsModal.infiniteClones\":\"무제한 복제본 활성화\",\"tw.settingsModal.infiniteClonesHelp\":\"스크래치의 300개 복제본 제한을 비활성화합니다.\",\"tw.settingsModal.interpolation\":\"보간법 활성화\",\"tw.settingsModal.interpolationHelp\":\"스프라이트의 움직임을 보간해 프로젝트의 동작을 더 부드럽게 만듭니다. 보간법은 3D 프로젝트, 레이트레이싱 프로젝트, 펜 중심 프로젝트, 버벅임이 심한 프로젝트 등에서 사용할 경우 오히려 프로젝트를 더 느려지게 만들 수 있습니다.\",\"tw.settingsModal.largeStageWarning\":\"사용자 지정 무대의 크기가 너무 큽니다!\\\\n더 작은 크기의 동일한 화면비를 가진 사용자 지정 무대를 설정하고, 풀스크린 모드로 전환하여 화면이 자동으로 업스케일되도록 하는 것을 권장합니다.\",\"tw.settingsModal.removeFencing\":\"무대 밖 동작 활성화\",\"tw.settingsModal.removeFencingHelp\":\"스프라이트가 화면 밖으로 나갈 수 있도록 하거나, 스프라이트가 원하는 만큼 커지거나 작아질 수 있도록 하거나, 충돌 감지 블록이 화면 밖에서도 작동할 수 있도록 합니다.\",\"tw.settingsModal.removeLimits\":\"제한 해제\",\"tw.settingsModal.removeMiscLimits\":\"기타 제한 비활성화\",\"tw.settingsModal.removeMiscLimitsHelp\":\"이미지 효과 제한과 펜 굵기 제한을 제거합니다.\",\"tw.settingsModal.storeProjectOptions\":\"프로젝트에 고급 설정 저장하기\",\"tw.settingsModal.storeProjectOptionsHelp\":\"TurboWarp가 이 프로젝트를 불러올 때 현재 설정이 자동으로 적용되도록 고급 설정을 프로젝트에 저장합니다.\\\\n\\'워프 타이머 활성화\\'와 \\'컴파일러 비활성화\\'는 저장되지 않습니다.\",\"tw.settingsModal.title\":\"고급 설정\",\"tw.settingsModal.warpTimer\":\"워프 타이머 활성화\",\"tw.settingsModal.warpTimerHelp\":\"스크립트가 긴 반복문 또는 무한 반복문에 갇힌 경우, 반복문이 끝날 때까지 코드가 멈춰 있지 않고 낮은 프레임에서 실행되고 있는지 확인합니다.\\\\n이 기능은 대부분의 충돌을 막을 수 있지만 성능을 확연히 저하시킵니다. 따라서 해당 기능은 편집기에서만 활성화됩니다.\",\"tw.soundEditorNotSupported\":\"해당 브라우저에서는 소리 편집기가 지원되지 않습니다.\",\"tw.spriteSelectorItem.rename\":\"이름 재설정하기\",\"tw.stageHeader.full\":\"전체 화면\",\"tw.stereo\":\"스테레오\",\"tw.stereoAlert\":\"해당 스테레오 음원을 수정하면 자동으로 모노 음원으로 변환되며, 이 작업은 되돌릴 수 없습니다.\",\"tw.studioview.authorAttribution\":\"제작자 : {author}\",\"tw.studioview.error\":\"프로젝트의 다음 페이지를 불러오는 도중 오류가 발생했습니다.\",\"tw.studioview.hoverText\":\"{author}의 \\\\\"{title}\\\\\"\",\"tw.tooLarge\":\"해당 음원은 파일 용량이 너무 커서 Scratch에 업로드가 불가능할 수 있습니다.\",\"tw.twExtension.description\":\"이상하고 새로운 블록들입니다.\",\"tw.twExtension.name\":\"{APP_NAME} 블록\",\"tw.unfavorite\":\"즐겨찾기 해제\",\"tw.unknownPlatform.1\":\"프로젝트가 다른 플랫폼에서 만들어졌습니다:\",\"tw.unknownPlatform.2\":\"{APP_NAME}와(과) 호환되지 않습니다. 위험을 감수하고 진행할 수 있으나, 이후 발생하는 어떠한 문제에도 지원을 받을 수 없습니다.\",\"tw.unknownPlatform.continue\":\"이해했습니다\",\"tw.unknownPlatform.title\":\"알 수 없는 플랫폼\",\"tw.unshared.2\":\"더 알아보기를 원하시면, 다음 링크로 접속해 주세요 : {link}\",\"tw.unshared.bug\":\"만약 해당 프로젝트가 실제로 공유된 프로젝트인 경우, 오류 신고를 해주실 것을 부탁드립니다.\",\"tw.unshared.cache\":\"만약 최근에 공유된 프로젝트일 경우, 이 메시지는 몇 분간 잘못 표시될 수 있습니다.\",\"tw.unshared2.1\":\"공유되지 않은 프로젝트는 더 이상 볼 수 없습니다.\",\"tw.usernameModal.help\":\"이 값은 브라우저의 저장소에 저장됩니다. 클라우드 변수를 포함하는 프로젝트와 상호 작용할 때 기록될 수 있습니다.\",\"tw.usernameModal.help2\":\"Scratch 계정과 일치하지 않는 사용자 이름은 클라우드 변수 서버에서 거부됩니다. 귀하의 Scratch 사용자 이름에 맞게 변경하거나 그대로 두고 변경하지 않는 것을 권장합니다.\",\"tw.usernameModal.mustChange\":\"클라우드 변수 서버에서 귀하의 사용자 이름이 안전하지 않다고 판단했습니다. 다른 것으로 변경하거나 {resetIt}해 주세요.\",\"tw.usernameModal.mustChange.resetIt\":\"초기화(권장됨)\",\"tw.usernameModal.new\":\"새 사용자 이름:\",\"tw.usernameModal.reset\":\"초기화하기\",\"tw.usernameModal.title\":\"사용자 이름 변경하기\",\"tw.usesCloudVariables\":\"해당 프로젝트는 클라우드 변수를 사용합니다.\",\"tw.usesCloudVariables2\":\"{APP_NAME} 프로젝트의 클라우드 변수가 스크래치 서버에 연결되지 않았습니다. 모든 사용자가 {changeTheirUsername}을 다른 사용자 이름으로 변경할 수 있으므로 사칭에 주의해야 합니다.\",\"tw.usesCloudVariables2.change\":\"자기 자신의 사용자 이름\",\"tw.viewFeaturedProjects\":\"클릭하여 특집 프로젝트 보기\",\"tw.viewOnScratch\":\"스크래치에서 프로젝트 보기\"},\"lt\":{\"tw.alerts.creatingRestorePoint\":\"Atkuriamas atkūrimo taškas...\",\"tw.alerts.lostPeripheralConnection\":\"Prarastas {extensionName} ryšys.\",\"tw.alerts.savedToDisk\":\"Išsaugota į jūsų kompiuterį.\",\"tw.backpack.rename\":\"Naujas vardas:\",\"tw.blocks.addons\":\"Įskiepiai\",\"tw.blocks.buttonIsDown\":\"[MOUSE_BUTTON] pelės mygtukas spusteltas?\",\"tw.blocks.lastKeyPressed\":\"paskutinis paspaustas mygtukas\",\"tw.blocks.mouseButton.middle\":\"(1) vidurys\",\"tw.blocks.mouseButton.primary\":\"(0) pagrindinis\",\"tw.blocks.mouseButton.secondary\":\"(2) antrasis\",\"tw.blocks.openDocs\":\"Atidaryti Dokumentacijas\",\"tw.changeUsername.cannotChangeWhileRunning\":\"Naudotojo vardas negali būti pakeistas kol projektas yra paleistas.\",\"tw.code\":\"Šaltinio kodas\",\"tw.confirmIncompatibleExtension\":\"Šis papildinys nėra suderinamas su Scratch. Projektai sukurti su šiuo papildiniu negali būti įkelti į Scratch svetainę. Ar jūs tikri kad norite jį įjungti?\",\"tw.customExtension.name\":\"Pasirinktinis papildinys\",\"tw.featuredProjectsStudio\":\"Peržiurėti studiją per Scratch.\",\"tw.feedback\":\"Atsiliepimai ir Klaidos\",\"tw.footer.credits\":\"Padėkos\",\"tw.footer.embed\":\"Įterpimas\",\"tw.footer.parameters\":\"URL Parametrai\",\"tw.gui.crashMessage.description\":\"Labai atsiprašome, bet atrodo, kad puslapis užstrigo. Prašome perkrauti puslapį ir pabandyti dar kartą.\",\"tw.gui.defaultProjectTitle\":\"Projektas\",\"tw.guiDefaultTitle\":\"Paleisk Scratch projektus greičiau\",\"tw.home.credit\":\"Pastabos ir Padėkos\",\"tw.home.instructions\":\"Instrukcijos\",\"tw.input.tooltip\":\"Nukopijuokite ir įklijuokite Scratch projekto nuorodą čia!\",\"tw.interpolationEnabled\":\"Interpoliacija\",\"tw.invalidParameters.clones\":\"\\\\\"klono\\\\\" URL parametras yra neteisingas\",\"tw.invalidParameters.fps\":\"\\\\\"fps\\\\\" URL parametras yra neteisingas\",\"tw.invalidProject.title\":\"Klaida\",\"tw.loader.downloadingAssets\":\"atsisiunčiami duomenys ({complete}/{total}) ...\",\"tw.loader.projectData\":\"Projektas kraunamas...\",\"tw.menuBar.60off\":\"Išjungti 60 FPS režimą\",\"tw.menuBar.60on\":\"Įjungti 60 FPS režimą\",\"tw.menuBar.addons\":\"Įskiepiai\",\"tw.menuBar.advanced\":\"Išplėstiniai\",\"tw.menuBar.changeUsername\":\"Pakeisti Naudotojo vardą\",\"tw.menuBar.cloudOff\":\"Išjungti Debesies kintamuosius\",\"tw.menuBar.cloudOn\":\"Įjungti debesies kintamuosius\",\"tw.menuBar.cloudUnavailable\":\"Debesies kintamieji nepasiekiami\",\"tw.menuBar.cloudUnavailableAlert\":\"Negalite naudotis debesies kintamaisiais, tikriausia kad jūs įjungėte redaguotoją.\",\"tw.menuBar.desktopSettings\":\"Darbalaukio nustatymai\",\"tw.menuBar.moreSettings\":\"Išplėstiniai nustatymai\",\"tw.menuBar.newFramerate\":\"Naujas kadrų per sekundę greitis:\",\"tw.menuBar.package\":\"Supakuoti projektą\",\"tw.menuBar.reportError2\":\"Tai klaida. Prašau mums apie ją reportuoti.\",\"tw.menuBar.saveAs\":\"Išsaugoti kaip {file}\",\"tw.menuBar.seeInside\":\"Peržiurėti vidų\",\"tw.oldDownload\":\"Išsaugoti į atskirą failą...\",\"tw.paint.alpha\":\"Nepermatomumas\",\"tw.privacy\":\"Privatumo politika\",\"tw.saveAs\":\"Išsaugoti kaip...\",\"tw.saveTo\":\"Išsaugoti į {file}\",\"tw.settingsModal.customStageSize\":\"Pasirinktinis Scenos dydis:\",\"tw.settingsModal.customStageSizeHelp\":\"Pakeičia Scratch scenos dydį iš 480x360 į kitą. Išbandykite 640x360, kad scena būtų plačiaekranė. Tik nedaugelis projektų su tuo susidoros tinkamai.\",\"tw.settingsModal.dangerZone\":\"Pavojinga zona\",\"tw.settingsModal.disableCompiler\":\"Išjungti kompiliatorių\",\"tw.settingsModal.featured\":\"Rekomenduojama\",\"tw.settingsModal.fps\":\"60 FPS (Pasirinktiniai FPS)\",\"tw.settingsModal.fpsHelp\":\"Paleidžia kodus 60 kadrų per sekundę greičiu užuot paleidus 30. Daugiausia projektų neveiks su šiuo nustatymu įjungtu. Pabandykite Interpoliaciją su 60 FPS režimu išjungtu jei tai priežastis. {customFramerate}.\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Spustelėkite kito nei 30 ar 60 kadrų per sekundę nustatymui\",\"tw.settingsModal.help\":\"Spustėlkite dėl pagalbos\",\"tw.settingsModal.highQualityPen\":\"Aukštos kokybės pieštukas\",\"tw.settingsModal.highQualityPenHelp\":\"Leidžia pieštuko projektams veikti didesne skiriamąja geba ir išjungia kai kurių koordinačių apvalinimą redaktoriuje. Šis nustatymas nėra naudingas visiems projektams ir gali turėti įtakos našumui.\",\"tw.settingsModal.infiniteClones\":\"Begaliniai Klonai\",\"tw.settingsModal.infiniteClonesHelp\":\"Panaikina Scratch 300 klonų limitą.\",\"tw.settingsModal.interpolation\":\"Interpoliacija\",\"tw.settingsModal.interpolationHelp\":\"Projektai atrodo sklandžiau, nes interpoliuojamas personažų udėjimas. Interpoliacija neturėtų būti naudojama 3D projektuose, \\\\\"Raytracer\\\\\" projektuose, piešimo projektuose ir stringančiuose projektuose, nes dėl interpoliacijos jie veiks lėčiau, bet neatrodys sklandžiau.\",\"tw.settingsModal.largeStageWarning\":\"Nerekomenduojama naudoti tokio dydžio pasirinktinio scenos dydžio! Vietoj to naudokite mažesnį dydį su tuo pačiu kraštinių santykiu ir leiskite viso ekrano režimui padidinti jo mastelį, kad jis atitiktų naudotojo ekraną.\",\"tw.settingsModal.removeFencing\":\"Panaikinti scenos aptvarus\",\"tw.settingsModal.removeFencingHelp\":\"Suteikia galimybę personažams judėti už ekrano ribų, tapti tokiais dideliais arba mažais, kokiais jie nori, ir leidžia liesti blokus už ekrano ribų.\",\"tw.settingsModal.removeLimits\":\"Pašalinti limitus\",\"tw.settingsModal.removeMiscLimits\":\"Pašalinti įvairius limitus.\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Pašalina garso efektų limitus bei pieštuko dydžio limitus.\",\"tw.settingsModal.storeProjectOptions\":\"Išsaugoti nustatymus projekte.\",\"tw.settingsModal.storeProjectOptionsHelp\":\"Įrašo pasirinktus nustatymus į projektą, kad jie būtų automatiškai taikomi, kai TurboWarp įkelia šį projektą. \\\\\"Nukreipimo laikmatis\\\\\" ir \\\\\"išjungti kompiliatorių\\\\\" nebus išsaugoti.\",\"tw.settingsModal.title\":\"Išplėstiniai nustatymai\",\"tw.settingsModal.warpTimer\":\"Nukreipimo laikmatis\",\"tw.settingsModal.warpTimerHelp\":\"Kodai tikrina, ar jie nėra įstrigę ilgoje arba begalinėje kilpoje, ir veikia nedideliu kadrų dažniu, užuot įstrigę, kol kilpa baigsis. Tai išsprendžia daugumą gedimų, tačiau turi didelį poveikį našumui, todėl pagal numatytuosius nustatymus ši funkcija įjungta tik redaktoriuje.\",\"tw.spriteSelectorItem.rename\":\"pervardinti\",\"tw.studioview.authorAttribution\":\"Sukurta {author}\",\"tw.studioview.error\":\"Kraunant kitą projektų puslapį įvyko klaida.\",\"tw.studioview.hoverText\":\"{title} sukurta {author}\",\"tw.unshared.2\":\"Dėl daugiau informacijos, aplankykite: {link}\",\"tw.usernameModal.help\":\"Ši vertė bus išsaugota jūsų naršyklės saugykloje. Ji turėtų būti prijungta kai naudojates projektais kurie turi debesies kintamuosius.\",\"tw.usernameModal.help2\":\"Vertes, kurios neatitinka galiojančios Scratch paskyros, debesies kintamųjų serveris paprastai atmeta. Rekomenduojame palikti jį tokį, koks yra, arba pakeisti į Scratch naudotojo vardą.\",\"tw.usernameModal.mustChange\":\"Atsiprašome, bet debesies kintamųjų serveris mano kad jūsų naudotojo vardas gali būti nesaugus. Prašome jį pakeisti arba {resetIt}.\",\"tw.usernameModal.mustChange.resetIt\":\"Iš naujo nustatyti jį (rekomenduojama)\",\"tw.usernameModal.reset\":\"nustatyti iš naujo\",\"tw.usernameModal.title\":\"Pakeisti Naudotojo vardą\",\"tw.viewFeaturedProjects\":\"Spustelkite kad pažiurėtumėte rekomenduojamus projektus.\",\"tw.viewOnScratch\":\"Peržiurėti projektą per Scratch\"},\"nb\":{\"tw.accent.blue\":\"Blå\",\"tw.accent.purple\":\"Lilla\",\"tw.accent.red\":\"Rød\",\"tw.alerts.creatingRestorePoint\":\"Oppretter gjenopprettingspunkt...\",\"tw.alerts.lostPeripheralConnection\":\"Mistet forbindelsen til {extensionName}.\",\"tw.alerts.restorePointError\":\"Kunne ikke opprette gjenopprettingspunkt\",\"tw.alerts.restorePointSuccess\":\"Tilgang til gjenopprettingspunkter i \\\\\"Fil\\\\\"\",\"tw.alerts.savedToDisk\":\"Lagret på datamaskinet.\",\"tw.backpack.rename\":\"Nytt navn:\",\"tw.blockColors.custom\":\"Tilpass i Addon-innstillinger\",\"tw.blockColors.dark\":\"Mørk (Beta)\",\"tw.blockColors.highContrast\":\"Høykontrast\",\"tw.blocks.PROCEDURES_DOCS\":\"Hvordan bruke return\",\"tw.blocks.PROCEDURES_RETURN\":\"returnere {v}\",\"tw.blocks.PROCEDURES_TO_REPORTER\":\"Endre til Rapportør\",\"tw.blocks.PROCEDURES_TO_STATEMENT\":\"Endre til Uttalelse\",\"tw.blocks.addons\":\"Utvidelser\",\"tw.blocks.buttonIsDown\":\"[MOUSE_BUTTON] mus knappen ned?\",\"tw.blocks.lastKeyPressed\":\"sist tast trykket\",\"tw.blocks.mouseButton.middle\":\"(1) mellom\",\"tw.blocks.mouseButton.primary\":\"(0) primær\",\"tw.blocks.mouseButton.secondary\":\"(2) sekundær\",\"tw.blocks.openDocs\":\"Åpne dokumentasjon\",\"tw.cantUseCloud\":\"Selv om du kan opprette skyvariabler, vil de ikke fungere med mindre dette prosjektet lastes opp til Scratch eller konverteres ved hjelp av et verktøy som {packager}.\",\"tw.changeUsername.cannotChangeWhileRunning\":\"Brukernavn kan ikke byttes mens prosjektet er på.\",\"tw.clipboard.danger\":\"Hvis utklippstavlen inneholder ting som passord, kan prosjektet kanskje dele dem med andre brukere eller servere.\",\"tw.clipboard.permission\":\"Tilgang til utklippstavlen fungerer kanskje ikke i noen nettlesere. Hvis tillatt, vil ytterligere utklippstavlesninger automatisk tillates.\",\"tw.clipboard.title\":\"Prosjektet ønsker å lese data fra utklippstavlen.\",\"tw.cloudProvider\":\"Server levert av {name}.\",\"tw.cloudServers\":\"Velg en server nær deg:\",\"tw.code\":\"Kildekode\",\"tw.confirmIncompatibleExtension\":\"Denne utvidelsen er ikke kompatibel med Scratch. Prosjekter laget med den kan ikke lastes opp til Scratch-nettstedet. Er du sikker på at du vil aktivere den?\",\"tw.createdBy\":\"Lagd av: \",\"tw.customCloudServer\":\"Bruk av en tilpasset skyvariabelserver: {server}\",\"tw.customExtension.description\":\"Last inn tilpassede utvidelser fra URL-er, filer eller JavaScript kildekode.\",\"tw.customExtension.name\":\"Tilpasset Utvidelse\",\"tw.customExtensionModal.file\":\"Filer\",\"tw.customExtensionModal.load\":\"Last inn\",\"tw.customExtensionModal.promptFile\":\"Velg eller dropp JavaScript-filer til utvidelsen:\",\"tw.customExtensionModal.promptText\":\"Lim inn kildekoden til utvidelsen sin JavaScript-fil:\",\"tw.customExtensionModal.promptURL\":\"Skriv inn URL-en til utvidelsen:\",\"tw.customExtensionModal.text\":\"Tekst\",\"tw.customExtensionModal.title\":\"Last inn tilpasset utvidelse\",\"tw.customExtensionModal.trusted\":\"Denne utvidelsen vil bli lastet uten sandkassen fordi den kommer fra en pålitelig kilde.\",\"tw.customExtensionModal.unsandboxed\":\"Kjør uten sandkasse\",\"tw.customExtensionModal.unsandboxedWarning1\":\"Å laste inn utvidelser uten sandkassen er farlig og bør ikke aktiveres hvis du ikke vet hva du gjør.\",\"tw.customExtensionModal.unsandboxedWarning2\":\"Usikrede utvidelser kan ødelegge prosjektet ditt, slette innstillingene dine, fiske etter passord og gjøre andre dårlige ting. Utviklerne av {APP_NAME} er ikke ansvarlige for eventuelle problemer som oppstår.\",\"tw.customExtensionModal.untrusted\":\"Utvidelser fra upålitelige URL-er vil alltid bli lastet med sandkassen for sikkerhet.\",\"tw.customReporters.description\":\"Tillat tilpassede blokker å gi ut verdier og bli brukt som inndata.\",\"tw.customReporters.name\":\"Tilpassede rapporter\",\"tw.darkMode\":\"Bytt Til Lys Modus\",\"tw.documentation\":\"Dokumentasjon\",\"tw.embed.persistent\":\"Hvis tillatt, vil ytterligere innbygginger på samme nettsted automatisk bli tillatt.\",\"tw.embed.risks\":\"Selv om innbyggingen vil være sandkassebeskyttet, vil den fortsatt ha tilgang til informasjon om enheten din, som din IP-adresse og generelle plassering.\",\"tw.embed.title1\":\"Prosjektet ønsker å integrere HTML-innhold over scenen.\",\"tw.embed.title2\":\"Prosjektet ønsker å integrere eksternt innhold over scenen.\",\"tw.extensionGallery.error\":\"Feil ved lasting av utvidelsesgalleri. Besøk extensions.turbowarp.org for å finne flere utvidelser.\",\"tw.extensionGallery.loading\":\"Laster inn utvidelsesgalleri...\",\"tw.extensionGallery.more\":\"Lær mer om utvidelser på extensions.turbowarp.org.\",\"tw.extensionGallery.name\":\"{APP_NAME} Utvidelse-Galleriet\",\"tw.favorite\":\"Favoritt\",\"tw.featuredProjectsStudio\":\"Se galeriet på Scratch.\",\"tw.feedback\":\"Tilbakemelding & feil\",\"tw.feedbackButton\":\"{APP_NAME} Tilbakemelding\",\"tw.fetch.title\":\"Prosjektet ønsker å koble til nettsiden:\",\"tw.fileInput.none\":\"Ingen filer valgt.\",\"tw.fileInput.selected\":\"Valgt: {names}\",\"tw.fonts.add\":\"Legg til\",\"tw.fonts.custom.file\":\"Velg en skriftfil fra datamaskinen din:\",\"tw.fonts.custom.name\":\"Gi skrifttypen et navn:\",\"tw.fonts.custom1\":\"Legg til skrifttype fra en fil\",\"tw.fonts.custom2\":\"Vanligvis vil det ikke fungere i Scratch. Støttede formater: {formats}.\",\"tw.fonts.delete\":\"Er du sikker på at du vil slette \\\\\"{font}\\\\\"? Eventuelle vektor-kostymer vil bruke reserve skrift type i stedet.\",\"tw.fonts.fallback\":\"Velg en reservefont som skal brukes hvis skrifttypen ikke lastes inn eller slettes.\",\"tw.fonts.list\":\"Installerte skrifttyper:\",\"tw.fonts.none\":\"Ingen skrifttyper er lagt til ennå.\",\"tw.fonts.readError\":\"Feilet å lese skriftfil: {error}\",\"tw.fonts.system\":\"Systemskrift\",\"tw.fonts.system.name\":\"Skriv inn navnet på en hvilken som helst skrifttype som er innebygd i datamaskinen din. Skrifttypen kan vises feil for noen.\",\"tw.fonts.system1\":\"Legg til en systemskrift\",\"tw.fonts.system2\":\"Kan fungere i Scratch, men vil ikke vises riktig for alle.\",\"tw.fonts.title\":\"Skrifter\",\"tw.footer.credits\":\"Kreditter\",\"tw.footer.documentation\":\"Dokumentasjon\",\"tw.footer.embed\":\"Innebygging\",\"tw.footer.parameters\":\"URL-parametere\",\"tw.geolocate.permission\":\"Hvis tillatt, kan du bli bedt om å tillate stedstilgang av nettleseren din.\",\"tw.geolocate.title\":\"Prosjektet ønsker å vite din plassering.\",\"tw.gui.crashMessage.description\":\"Beklager, det ser ut til at side har kræsjet. Start siden på nytt til å prøve igjen.\",\"tw.gui.defaultProjectTitle\":\"Prosjekt\",\"tw.guiDefaultTitle\":\"Kjør Scratch prosjekter raskere\",\"tw.home.credit\":\"Merknader og bidragsytere\",\"tw.home.description\":\"{APP_NAME} er en Scratch-mod som samler prosjekter til JavaScript for å få dem til å kjøre veldig raskt. Prøv det ved å legge inn en prosjekt-ID eller URL ovenfor eller velge et utvalgt prosjekt nedenfor.\",\"tw.home.instructions\":\"Hvordan bruke prosjektet\",\"tw.input.tooltip\":\"Kopier og lim inn en Scratch-prosjektkobling her!\",\"tw.interpolationEnabled\":\"Interpolasjon\",\"tw.invalidParameters.clones\":\"\\\\\"klon\\\\\" Url-parameteren er ugyldig\",\"tw.invalidParameters.fps\":\"\\\\\"fps\\\\\" Url-parameteren er ugyldig\",\"tw.invalidProject.title\":\"Feil\",\"tw.lightMode\":\"Bytt Til Mørk Modus\",\"tw.loadExtension.embedded\":\"Prosjektet ønsker å laste inn en tilpasset utvidelse med koden:\",\"tw.loadExtension.sandboxed\":\"Mens koden vil være sandkasse, vil den fortsatt ha tilgang til informasjon om enheten din, som din IP og generelle plassering. Sørg for at du stoler på forfatteren av denne utvidelsen før du fortsetter.\",\"tw.loadExtension.unsandboxed\":\"Kjør uten sandkasse\",\"tw.loadExtension.unsandboxedWarning\":\"Å laste inn utvidelser uten sandkassen er farlig. Det kan ødelegge prosjektet ditt, slette innstillingene dine, fiske etter passord og gjøre andre dårlige ting. Utviklerne av {APP_NAME} er ikke ansvarlige for eventuelle problemer som oppstår.\",\"tw.loadExtension.url\":\"Prosjektet ønsker å laste inn en tilpasset utvidelse fra URL-en:\",\"tw.loader.downloadingAssets\":\"Laster ned eiendeler ({complete}/{total}) ...\",\"tw.loader.loadingAssets\":\"Laster ned eiendeler ({complete}/{total}) ...\",\"tw.loader.projectData\":\"Laster prosjekt ...\",\"tw.menuBar.60off\":\"Slå av 60 FPS Modus\",\"tw.menuBar.60on\":\"Slå på 60 FPS Modus\",\"tw.menuBar.accent\":\"Aksent\",\"tw.menuBar.addons\":\"Utvidelser\",\"tw.menuBar.advanced\":\"Avansert\",\"tw.menuBar.blockColors\":\"Blokk Farger\",\"tw.menuBar.changeUsername\":\"Bytt Brukernavn\",\"tw.menuBar.cloudOff\":\"Slå av nett-variabler\",\"tw.menuBar.cloudOn\":\"Slå på nett-variabler\",\"tw.menuBar.cloudUnavailable\":\"Nett-variabler er ikke tilgjengelig\",\"tw.menuBar.cloudUnavailableAlert\":\"Kan ikke bruke nett-variabler, det er kanskje fordi du åpnet redigerer\",\"tw.menuBar.compileError\":\"{sprite}:{error}\",\"tw.menuBar.desktopSettings\":\"Skrivebordsinnstillinger\",\"tw.menuBar.moreSettings\":\"Avansert innstillinger\",\"tw.menuBar.newFramerate\":\"Nytt bildefrekvens:\",\"tw.menuBar.newWindow\":\"Nytt vindu\",\"tw.menuBar.package\":\"Pakke prosjekt\",\"tw.menuBar.reportError1\":\"Noen skript oppdaget feil.\",\"tw.menuBar.reportError2\":\"Dette er en feil. Vennligst meld det.\",\"tw.menuBar.restorePoints\":\"Gjenopprettingspunkter\",\"tw.menuBar.saveAs\":\"Lagre som {file}\",\"tw.menuBar.seeInside\":\"Se inni\",\"tw.moreCloud\":\"Lær mer om skyvariabler.\",\"tw.notify.permission\":\"Hvis det er tillatt, kan du bli bedt om å aktivere varslinger av nettleseren din, og ytterligere varsler blir automatisk tillatt.\",\"tw.notify.title\":\"Prosjektet ønsker å vise varsler.\",\"tw.oldDownload\":\"Lagre for å skille fil ...\",\"tw.opcode.2000\":\"dager siden 2000\",\"tw.opcode.mousedown\":\"mus ned?\",\"tw.opcode.mousex\":\"mus x\",\"tw.opcode.mousey\":\"mus y\",\"tw.openAdvanced\":\"Åpne avanserte innstillinger\",\"tw.openWindow.dangerous\":\"Denne nettsiden har ikke blitt gjennomgått av {APP_NAME} utviklerne. Den kan inneholde farlig eller ondsinnet kode.\",\"tw.openWindow.title\":\"Prosjektet ønsker å åpne et nytt vindu eller en ny fane med URL-en:\",\"tw.paint.alpha\":\"Opasitet\",\"tw.paint.fonts.more\":\"Legg til flere skrifter...\",\"tw.pen.stageSelected\":\"Valgt scene: færre pennblokker\",\"tw.privacy\":\"Personvernregler\",\"tw.recordAudio.permission\":\"Hvis tillatt, kan du bli bedt om å aktivere mikrofontilgang av nettleseren din, og videre mikrofontilgang vil bli automatisk tillatt.\",\"tw.recordAudio.title\":\"Prosjektet ønsker å ta opp lyd fra mikrofonen din. Dette kan inkludere en teksttranskripsjon eller rå lyddata. Prosjektet kan muligens dele lyd med andre brukere eller servere.\",\"tw.recordVideo.permission\":\"Hvis tillatt, kan du bli bedt om å aktivere kameratilgang av nettleseren din, og videre kameratilgang vil bli automatisk tillatt.\",\"tw.recordVideo.title\":\"Prosjektet ønsker å ta opp video fra kameraet ditt. Prosjektet kan muligens dele bilder med andre brukere eller servere.\",\"tw.redirect.dangerous\":\"Denne nettsiden har ikke blitt gjennomgått av {APP_NAME} utviklerne. Den kan inneholde farlig eller ondsinnet kode.\",\"tw.redirect.title\":\"Prosjektet ønsker å navigere denne fanen til URL-en:\",\"tw.restorePoints.1minute\":\"hvert minutt\",\"tw.restorePoints.assets\":\"{n} eiendeler\",\"tw.restorePoints.confirmDelete\":\"Er du sikker på at du vil slette \\\\\"{projectTitle}\\\\\"? Dette kan ikke angres.\",\"tw.restorePoints.confirmDeleteAll\":\"Er du sikker på at du vil slette ALLE gjenopprettingspunkter? Dette kan ikke angres.\",\"tw.restorePoints.confirmLoad\":\"Du har ulagrede endringer. Erstatt eksisterende prosjekt?\",\"tw.restorePoints.deleteAll\":\"Slett ALT\",\"tw.restorePoints.description\":\"{APP_NAME} lagrer regelmessig gjenopprettingspunkter på datamaskinen for å gjenopprette prosjektet hvis du glemmer å lagre. Dette er ment som en siste utvei for utvinning. Datamaskinen kan når som helst slette disse gjenopprettingspunktene stille. IKKE stol på denne funksjonen.\",\"tw.restorePoints.empty\":\"Ingen gjenopprettingspunkter funnet.\",\"tw.restorePoints.error\":\"Feil ved lasting av gjenopprettingspunkt: {error}\",\"tw.restorePoints.intervalOption\":\"Gjenopprettingspunkter opprettes {time}.\",\"tw.restorePoints.loading\":\"Laster...\",\"tw.restorePoints.minutes\":\"hver {n} minutter\",\"tw.restorePoints.never\":\"aldri\",\"tw.restorePoints.off\":\"Deaktivering av gjenopprettingspunkter er farlig.\",\"tw.restorePoints.size\":\"Estimert lagringsplass brukt: {size}\",\"tw.restorePoints.size2\":\"Kostymer eller lyder som brukes av flere gjenopprettingspunkter lagres bare én gang.\",\"tw.restorePoints.title\":\"Gjenopprettingspunkter\",\"tw.sample\":\"Eksempel på prosjekt\",\"tw.saveAs\":\"Lagre som...\",\"tw.saveTo\":\"Lagre til {file}\",\"tw.scratchUnsafeCloud\":\"Hvis du gjør denne skyvariabelen, vil prosjektet overstige Scratchs grense på {number} variabler, og noen variabler vil ikke fungere hvis du laster opp prosjektet til Scratch.\",\"tw.securityManager.allow\":\"Tillat\",\"tw.securityManager.deny\":\"Avslå\",\"tw.securityManager.title\":\"Utvidelse Sikkerhet\",\"tw.securityManager.trust\":\"Hvis tillatt, vil ytterligere forespørsler til samme nettsted automatisk bli tillatt.\",\"tw.securityManager.why\":\"Dette kan brukes til å laste ned bilder eller lyder, implementere flerspiller, få tilgang til et API eller til ondsinnede formål. Dette vil dele din IP-adresse, generelle plassering og muligens annen data med nettsiden.\",\"tw.settingsModal.customStageSize\":\"Bytt scene størrelse:\",\"tw.settingsModal.customStageSizeHelp\":\"Endrer størrelsen på Scratch-scenen fra 480x360 til noe annet. Prøv 640x360 for å gjøre scenen bredskjerm. Svært få prosjekter vil håndtere dette riktig.\",\"tw.settingsModal.dangerZone\":\"Faresone\",\"tw.settingsModal.disableCompiler\":\"Deaktiver kompilatoren\",\"tw.settingsModal.disableCompilerHelp\":\"Deaktiverer {APP_NAME} kompilatoren. Du kan ønske å aktivere dette mens du redigerer prosjekter slik at skriptene oppdateres umiddelbart. Ellers bør du aldri aktivere dette.\",\"tw.settingsModal.featured\":\"Anbefalt\",\"tw.settingsModal.fps\":\"60 FPS (tilpassede fps)\",\"tw.settingsModal.fpsHelp\":\"Kjører skript 60 ganger per sekund i stedet for 30. De fleste prosjekter vil ikke fungere skikkelig med dette aktivert. Du bør prøve interpolasjon med 60 FPS-modus deaktivert hvis det er tilfelle. {customFramerate}.\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Klikk her til å velge mellom 30 eller 60 FPS\",\"tw.settingsModal.help\":\"Klikk her for hjelp\",\"tw.settingsModal.highQualityPen\":\"Høy kvalitet penn \",\"tw.settingsModal.highQualityPenHelp\":\"Tillater pennprosjekter å vises med høyere oppløsning og deaktiverer noe av avrunding av koordinater i redigeringsprogrammet. Ikke alle prosjekter har nytte av denne innstillingen, og det kan påvirke ytelsen.\",\"tw.settingsModal.infiniteClones\":\"Uendelige kloner\",\"tw.settingsModal.infiniteClonesHelp\":\"Den slår av Scratchs 300 klon grense\",\"tw.settingsModal.interpolation\":\"Interpolasjon\",\"tw.settingsModal.interpolationHelp\":\"Gjør prosjekter mer jevne ved å interpolere bevegelsen til sprite. Interpolasjon bør ikke brukes på 3D-prosjekter, raytracere, penneprosjekter og trege prosjekter, da interpolasjon vil få dem til å kjøre tregere uten å gjøre dem jevnere.\",\"tw.settingsModal.largeStageWarning\":\"Å bruke en så stor tilpasset scenestørrelse anbefales ikke! I stedet bør du bruke en mindre størrelse med samme sideforhold og la fullskjermmodus skalere det opp for å passe brukerens skjerm.\",\"tw.settingsModal.removeFencing\":\"Fjern gjerde\",\"tw.settingsModal.removeFencingHelp\":\"Tillater sprites å bevege seg utenfor skjermen, bli så store eller små som de ønsker, og gjør at berøringsblokker fungerer utenfor skjermen.\",\"tw.settingsModal.removeLimits\":\"Fjern grenser\",\"tw.settingsModal.removeMiscLimits\":\"Fjern diverse begrensninger\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Fjerner begrensninger for lydeffekter og penntykkelse.\",\"tw.settingsModal.storeProjectOptions\":\"Lagre innstillinger i prosjektet\",\"tw.settingsModal.storeProjectOptionsHelp\":\"Lagrer de valgte innstillingene i prosjektet slik at de automatisk blir brukt når TurboWarp laster inn dette prosjektet. Warp-timeren og deaktivert kompilator vil ikke bli lagret.\",\"tw.settingsModal.title\":\"Avansert innstillinger\",\"tw.settingsModal.warpTimerHelp\":\"Gjør skript sjekke om de er sittende fast i en lang eller uendelig løkke og kjøre med lav bildefrekvens i stedet for å bli sittende fast til løkken er ferdig. Dette løser de fleste krasjer, men har en betydelig ytelsespåvirkning, så det er bare aktivert som standard i redigeringsprogrammet.\",\"tw.soundEditorNotSupported\":\"Lydredigering støttes ikke i denne nettleseren.\",\"tw.spriteSelectorItem.rename\":\"endre navn\",\"tw.stageHeader.full\":\"Bytt til full scene\",\"tw.stereoAlert\":\"Å redigere denne stereolyden vil uopprettelig konvertere den til mono.\",\"tw.studioview.authorAttribution\":\"fra {author}\",\"tw.studioview.error\":\"Det oppsto en feil under innlasting av neste side av prosjekter.\",\"tw.studioview.hoverText\":\"{title} fra {author}\",\"tw.tooLarge\":\"Denne lyden kan være for stor til å laste opp til Scratch.\",\"tw.twExtension.description\":\"Rare nye blokker.\",\"tw.twExtension.name\":\"{APP_NAME} Blokker\",\"tw.unfavorite\":\"Ufavoritt\",\"tw.unknownPlatform.2\":\"Kompatibilitet med {APP_NAME} kan ikke garanteres. Du kan fortsette på egen risiko, men vi kan kanskje ikke hjelpe deg hvis du støter på problemer.\",\"tw.unknownPlatform.continue\":\"Jeg skjønner\",\"tw.unknownPlatform.title\":\"Ukjent Plattform\",\"tw.unshared.2\":\"For mer informasjon, besøk: {link}\",\"tw.unshared.bug\":\"Hvis dette prosjektet faktisk deles, vennligst rapporter en feil.\",\"tw.unshared.cache\":\"Hvis prosjektet ble delt nylig, kan denne meldingen vises feilaktig i noen minutter.\",\"tw.unshared2.1\":\"Udelte prosjekter er ikke lenger synlige.\",\"tw.usernameModal.help\":\"Denne verdien vil bli lagret i nettleserens lagring. Den kan bli logget når du samhandler med prosjekter som inneholder skyvariabler.\",\"tw.usernameModal.help2\":\"Verdier som ikke samsvarer med en gyldig Scratch-konto vil vanligvis bli avvist av skyvariabelserveren. Vi anbefaler å la det være som det er eller endre det til ditt Scratch-brukernavn.\",\"tw.usernameModal.mustChange\":\"Beklager, Nett-variabel server tror at brukernavnet din er usikre. Bytt brukernavnet eller {resetIt}\",\"tw.usernameModal.mustChange.resetIt\":\"nullstille det (anbefales)\",\"tw.usernameModal.new\":\"Nytt brukernavn:\",\"tw.usernameModal.reset\":\"Nullstille\",\"tw.usernameModal.title\":\"Bytt Brukernavn\",\"tw.usesCloudVariables\":\"Dette prosjektet bruker skyvariabler.\",\"tw.usesCloudVariables2\":\"{APP_NAME}s skyvariabler er ikke koblet til Scratch sine. Alle kan {changeTheirUsername} til hva som helst, så vær forsiktig med å bli utgitt for å være noen andre.\",\"tw.usesCloudVariables2.change\":\"bytt ditt brukernavn\",\"tw.viewFeaturedProjects\":\"Klikk til å se anbefalte prosjekter.\",\"tw.viewOnScratch\":\"Se prosjektet på Scratch\"},\"nl\":{\"tw.accent.blue\":\"Blauw\",\"tw.accent.purple\":\"Paars\",\"tw.accent.rainbow\":\"Regenboog\",\"tw.accent.red\":\"Rood\",\"tw.alerts.creatingRestorePoint\":\"Bezig met herstelpunt maken...\",\"tw.alerts.lostPeripheralConnection\":\"Verbinding verloren met {extensionName}.\",\"tw.alerts.restorePointError\":\"Kon herstelpunt niet maken\",\"tw.alerts.restorePointSuccess\":\"Herstelpunten vind je onder \\\\\"Bestand\\\\\"\",\"tw.alerts.savedToDisk\":\"Opgeslagen op je computer.\",\"tw.backpack.rename\":\"Nieuwe naam:\",\"tw.blockColors.custom\":\"Meer opties in addon-instellingen\",\"tw.blockColors.dark\":\"Donker (bèta)\",\"tw.blockColors.highContrast\":\"Hoog contrast\",\"tw.blockColors.three\":\"Origineel\",\"tw.blocks.PROCEDURES_DOCS\":\"Hoe gebruik ik retourneer?\",\"tw.blocks.PROCEDURES_RETURN\":\"retourneer {v}\",\"tw.blocks.PROCEDURES_TO_REPORTER\":\"Veranderen naar waardeblok\",\"tw.blocks.PROCEDURES_TO_STATEMENT\":\"Veranderen naar stapelblok\",\"tw.blocks.buttonIsDown\":\"[MOUSE_BUTTON] muisknop ingedrukt?\",\"tw.blocks.lastKeyPressed\":\"laatst ingedrukte toets\",\"tw.blocks.mouseButton.middle\":\"(1) middelste\",\"tw.blocks.mouseButton.primary\":\"(0) primaire\",\"tw.blocks.mouseButton.secondary\":\"(2) secundaire\",\"tw.blocks.openDocs\":\"Documentatie Openen\",\"tw.cantUseCloud\":\"Hoewel je cloudvariabelen kunt maken, zullen ze niet werken, behalve als dit project is geüpload naar Scratch of omgezet d.m.v. een tool zoals de {packager}.\",\"tw.changeUsername.cannotChangeWhileRunning\":\"Gebruikersnaam kan niet worden veranderd terwijl het project bezig is.\",\"tw.clipboard.danger\":\"Als je klembord dingen zoals wachtwoorden bevat, kan het project deze informatie delen met andere gebruikers of servers.\",\"tw.clipboard.permission\":\"Klembordtoegang werkt niet in alle browsers. Indien toegestaan wordt toekomstige klembordtoegang automatisch toegestaan.\",\"tw.clipboard.title\":\"Het project wilt toegang krijgen tot gegevens uit je klembord.\",\"tw.cloudProvider\":\"Server aangeboden door {name}.\",\"tw.cloudServers\":\"Kies een server bij jou in de buurt:\",\"tw.code\":\"Broncode\",\"tw.confirmIncompatibleExtension\":\"Deze extensie is niet compatibel met Scratch. Projecten die het gebruiken kunnen niet worden geüpload naar de Scratch website. Weet je zeker dat je het in wilt schakelen?\",\"tw.createdBy\":\"Gemaakt door:\",\"tw.customCloudServer\":\"Een aangepaste server voor cloudvariabelen wordt gebruikt: {server}\",\"tw.customExtension.description\":\"Aangepaste extensies laden van URL\\'s, bestanden of JavaScript-broncode.\",\"tw.customExtension.name\":\"Aangepaste extensie\",\"tw.customExtensionModal.file\":\"Bestanden\",\"tw.customExtensionModal.load\":\"Laden\",\"tw.customExtensionModal.promptFile\":\"Selecteer of sleep JavaScript-bestanden van extensie hierheen:\",\"tw.customExtensionModal.promptText\":\"Plak hier de JavaScript-broncode van de extensie:\",\"tw.customExtensionModal.promptURL\":\"Voer de URL van de extensie in:\",\"tw.customExtensionModal.text\":\"Tekst\",\"tw.customExtensionModal.title\":\"Aangepaste Extensie Laden\",\"tw.customExtensionModal.trusted\":\"Deze extensie wordt zonder sandbox geladen omdat het afkomstig is van een vertrouwde bron.\",\"tw.customExtensionModal.unsandboxed\":\"Uitvoeren zonder sandbox\",\"tw.customExtensionModal.unsandboxedWarning1\":\"Extensies laden zonder sandbox is gevaarlijk, doe dit niet als je niet weet wat je doet.\",\"tw.customExtensionModal.unsandboxedWarning2\":\"Extensies die geladen zijn zonder sandbox kunnen je project beschadigen, je instellingen verwijderen, wachtwoorden phishen, en zorgen voor nog andere slechte zaken. De ontwikkelaars van {APP_NAME} zijn niet verantwoordelijk voor eventuele resulterende problemen.\",\"tw.customExtensionModal.untrusted\":\"Wegens veiligheidsredenen worden extensies van onbetrouwbare URL\\'s altijd geladen met de sandbox.\",\"tw.customReporters.description\":\"Geef zelfgemaakte blokken onder de categorie \\\\\"Mijn blokken\\\\\" de mogelijkheid om waarden te hebben en te worden gebruikt als invoer.\",\"tw.customReporters.name\":\"Aangepaste waardeblokken\",\"tw.darkMode\":\"Lichte modus gebruiken\",\"tw.desktopCloud\":\"In de desktop-app worden cloudvariabelen gesynchroniseerd tussen alle vensters van de desktop-app op deze computer. Upload het project naar Scratch of gebruik een tool zoals de {packager} om ze globaal te synchroniseren.\",\"tw.documentation\":\"Documentatie\",\"tw.embed.persistent\":\"Indien toegestaan worden toekomstige invoegingen naar dezelfde website automatisch toegestaan.\",\"tw.embed.risks\":\"Hoewel de embed wordt geladen met sandbox, heeft het nog wel toegang tot informatie over je apparaat, zoals je IP-adres en algemene locatie.\",\"tw.embed.title1\":\"Het project wilt HTML-inhoud invoegen op het speelveld:\",\"tw.embed.title2\":\"Het project wilt inhoud op afstand invoegen op het speelveld:\",\"tw.extensionGallery.error\":\"Kon extensiegalerij niet laden. Ga naar extensions.turbowarp.org om meer extensies te vinden.\",\"tw.extensionGallery.loading\":\"Bezig met extensiegalerij laden...\",\"tw.extensionGallery.more\":\"Ga naar extensions.turbowarp.org om meer te weten te komen over extensies.\",\"tw.extensionGallery.name\":\"{APP_NAME}-extensiegalerij\",\"tw.favorite\":\"Favoriet Maken\",\"tw.featuredProjectsStudio\":\"Deze studio bekijken op Scratch.\",\"tw.feedbackButton\":\"{APP_NAME}-feedback geven\",\"tw.fetch.title\":\"Het project wilt verbinding maken met de website:\",\"tw.fileInput.none\":\"Geen bestanden geselecteerd.\",\"tw.fileInput.selected\":\"Geselecteerd: {names}\",\"tw.fonts.add\":\"Toevoegen\",\"tw.fonts.custom.file\":\"Selecteer een lettertypebestand van je computer:\",\"tw.fonts.custom.name\":\"Geef het lettertype een naam:\",\"tw.fonts.custom1\":\"Lettertype toevoegen uit een bestand\",\"tw.fonts.custom2\":\"Werkt meestal niet in Scratch. Ondersteunde formaten: {formats}\",\"tw.fonts.delete\":\"Weet je zeker dat je \\\\\"{font}\\\\\" wilt verwijderen? Elk vector-uiterlijk zal het terugval-lettertype gebruiken.\",\"tw.fonts.fallback\":\"Kies een terugval-lettertype als het lettertype niet kan worden geladen of is verwijderd:\",\"tw.fonts.list\":\"Geïnstalleerde lettertypen:\",\"tw.fonts.none\":\"Nog geen lettertypen toegevoegd.\",\"tw.fonts.readError\":\"Kon lettertypebestand niet lezen: {error}\",\"tw.fonts.system\":\"Systeemlettertype\",\"tw.fonts.system.name\":\"Typ de naam van een lettertype die in je computer is ingebouwd. Het lettertype wordt misschien niet voor iedereen correct weergegeven.\",\"tw.fonts.system1\":\"Een systeemlettertype toevoegen\",\"tw.fonts.system2\":\"Werkt misschien in Scratch, maar wordt niet voor iedereen correct weergegeven.\",\"tw.fonts.title\":\"Lettertypen\",\"tw.footer.disclaimer\":\"{APP_NAME} is niet aangesloten bij Scratch, het Scratch Team of de Scratch Foundation.\",\"tw.footer.documentation\":\"Documentatie\",\"tw.footer.embed\":\"Invoeging\",\"tw.footer.parameters\":\"URL-Parameters\",\"tw.footer.scratchDisclaimer\":\"Scratch is een project van de Scratch Foundation en is gratis verkrijgbaar op {scratchDotOrg}.\",\"tw.geolocate.permission\":\"Indien toegestaan kan je door je browser worden gevraagd om toegang tot je locatie toe te staan.\",\"tw.geolocate.title\":\"Het project wilt toegang tot je locatie.\",\"tw.gui.crashMessage.description\":\"Het spijt ons, maar het ziet ernaar uit dat de pagina is gecrasht. Ververs je pagina om het opnieuw te proberen.\",\"tw.guiDefaultTitle\":\"Speel Scratch-projecten sneller af\",\"tw.home.credit\":\"Opmerkingen en credits\",\"tw.home.description\":\"{APP_NAME} is een modificatie van Scratch die projecten omzet naar JavaScript om ze heel snel te laten werken. Probeer het door hierboven een project-ID of URL in te voeren of hieronder een uitgelicht project te kiezen.\",\"tw.home.instructions\":\"Instructies\",\"tw.input.tooltip\":\"Plak hier een link naar een Scratch-project!\",\"tw.interpolationEnabled\":\"Interpolatie\",\"tw.invalidParameters.clones\":\"URL-parameter \\\\\"clone\\\\\" is ongeldig\",\"tw.invalidParameters.fps\":\"URL-parameter \\\\\"fps\\\\\" is ongeldig\",\"tw.invalidProject.error\":\"Project laden mislukt:\",\"tw.invalidProject.options\":\"Het is misschien mogelijk om een oudere versie van het project te herstellen door middel van automatische herstelpunten of andere back-ups.\",\"tw.invalidProject.reportIt\":\"maak een melding\",\"tw.invalidProject.restorePoints\":\"Herstelpunten bekijken\",\"tw.invalidProject.title\":\"Fout\",\"tw.invalidProject.validationError\":\"Deze foutmelding betekent vaak dat een klein deel van het project is beschadigd, maar dat het voor de rest nog wel geldig is. Dit is (meestal) makkelijk op te lossen, dus {reportIt}.\",\"tw.lightMode\":\"Donkere modus gebruiken\",\"tw.loadExtension.embedded\":\"Het project wilt een aangepaste extensie laden met de code:\",\"tw.loadExtension.sandboxed\":\"Hoewel de code wordt gesandboxed heeft het nog steeds toegang tot informatie van je apparaat, zoals je IP-adres en algemene locatie. Ga alleen verder als je de maker van deze extensie vertrouwt.\",\"tw.loadExtension.unsandboxed\":\"Uitvoeren zonder sandbox\",\"tw.loadExtension.unsandboxedWarning\":\"Extensies laden zonder sandbox is gevaarlijk. De extensie kan je project beschadigen, je instellingen verwijderen, wachtwoorden phishen, en zorgen voor nog andere slechte zaken. De ontwikkelaars van {APP_NAME} zijn niet verantwoordelijk voor eventuele resulterende problemen.\",\"tw.loadExtension.url\":\"Het project wilt een aangepaste extensie laden van de URL:\",\"tw.loader.downloadingAssets\":\"Bezig met onderdelen downloaden ({complete}/{total}) ...\",\"tw.loader.loadingAssets\":\"Bezig met onderdelen laden ({complete}/{total}) ...\",\"tw.loader.projectData\":\"Bezig met laden van project ...\",\"tw.menuBar.60off\":\"60 FPS-stand uitzetten\",\"tw.menuBar.60on\":\"60 FPS-stand aanzetten\",\"tw.menuBar.advanced\":\"Geavanceerd\",\"tw.menuBar.blockColors\":\"Blokkleuren\",\"tw.menuBar.changeUsername\":\"Gebruikersnaam veranderen\",\"tw.menuBar.cloudOff\":\"Cloudvariabelen uitschakelen\",\"tw.menuBar.cloudOn\":\"Cloudvariabelen inschakelen\",\"tw.menuBar.cloudUnavailable\":\"Cloudvariabelen zijn niet beschikbaar\",\"tw.menuBar.cloudUnavailableAlert\":\"Kan geen cloudvariabelen gebruiken, waarschijnlijk omdat je de editor hebt geopend.\",\"tw.menuBar.desktopSettings\":\"Desktopinstellingen\",\"tw.menuBar.moreSettings\":\"Geavanceerde instellingen\",\"tw.menuBar.newFramerate\":\"Nieuwe framerate:\",\"tw.menuBar.newWindow\":\"Nieuw venster\",\"tw.menuBar.package\":\"Project packagen\",\"tw.menuBar.reportError1\":\"Bij sommige scripts is een fout opgetreden.\",\"tw.menuBar.reportError2\":\"Dit is een bug, meld deze alsjeblieft.\",\"tw.menuBar.restorePoints\":\"Herstelpunten\",\"tw.menuBar.saveAs\":\"Opslaan als {file}\",\"tw.menuBar.seeInside\":\"Bekijk van binnen\",\"tw.moreCloud\":\"Meer informatie over cloudvariabelen.\",\"tw.notify.permission\":\"Indien toegestaan kan je door je browser worden gevraagd om meldingen in te schakelen en worden toekomstige meldingen automatisch toegestaan.\",\"tw.notify.title\":\"Het project wilt meldingen weergeven.\",\"tw.oldDownload\":\"Opslaan naar apart bestand...\",\"tw.opcode.2000\":\"dagen sinds 2000\",\"tw.opcode.mousedown\":\"muis ingedrukt?\",\"tw.opcode.mousex\":\"muis x\",\"tw.opcode.mousey\":\"muis y\",\"tw.openAdvanced\":\"Geavanceerde instellingen openen\",\"tw.openWindow.dangerous\":\"Deze website is niet beoordeeld door de ontwikkelaars van {APP_NAME}. Het kan gevaarlijke of kwaadaardige code bevatten.\",\"tw.openWindow.title\":\"Het project wilt een nieuw venster of tabblad openen met de URL:\",\"tw.paint.alpha\":\"Ondoorzichtigheid\",\"tw.paint.fonts.more\":\"Meer lettertypen toevoegen...\",\"tw.pen.stageSelected\":\"Speelveld geselecteerd: minder penblokken\",\"tw.privacy\":\"Privacybeleid\",\"tw.recordAudio.permission\":\"Indien toegestaan kan je door je browser worden gevraagd om microfoontoegang in te schakelen. Ook wordt toekomstige microfoontoegang automatisch toegestaan.\",\"tw.recordAudio.title\":\"Het project wilt audio van je microfoon opnemen. Dit kan een tekst-transcript of ruwe audiogegevens inhouden. Het project kan audio delen met andere gebruikers of servers.\",\"tw.recordVideo.permission\":\"Indien toegestaan kan je door je browser worden gevraagd om cameratoegang in te schakelen. Ook wordt toekomstige cameratoegang automatisch toegestaan.\",\"tw.recordVideo.title\":\"Het project wilt video van je camera opnemen. Het project kan afbeeldingen delen met andere gebruikers of servers.\",\"tw.redirect.dangerous\":\"Deze website is niet beoordeeld door de ontwikkelaars van {APP_NAME}. Het kan gevaarlijke of kwaadaardige code bevatten.\",\"tw.redirect.title\":\"Het project wil dit tabblad doorsturen naar de URL:\",\"tw.removedTrademarks\":\"Een aantal items die handelsmerken van Scratch bevatten zijn verwijderd uit deze lijst.\",\"tw.restorePoints.1minute\":\"elke minuut\",\"tw.restorePoints.assets\":\"{n} onderdelen\",\"tw.restorePoints.confirmDelete\":\"Weet je zeker dat je \\\\\"{projectTitle}\\\\\" wilt verwijderen? Dit kan niet ongedaan worden gemaakt.\",\"tw.restorePoints.confirmDeleteAll\":\"Weet je zeker dat je ALLE herstelpunten wilt verwijderen? Dit kan niet ongedaan worden gemaakt.\",\"tw.restorePoints.confirmLoad\":\"Er zijn niet-opgeslagen wijzigingen. Wil je het bestaand project vervangen?\",\"tw.restorePoints.deleteAll\":\"Alles Verwijderen\",\"tw.restorePoints.description\":\"{APP_NAME} slaat af en toe herstelpunten op je computer op zodat je je project terug kan halen als je vergeet op te slaan. Dit is een laatste redmiddel voor herstel. Je computer kan deze herstelpunten op elk moment verwijderen. Hang NIET af van deze functie.\",\"tw.restorePoints.empty\":\"Geen herstelpunten gevonden.\",\"tw.restorePoints.error\":\"Er is een fout opgetreden bij het laden van het herstelpunt: {error}\",\"tw.restorePoints.intervalOption\":\"Herstelpunten worden {time} gemaakt.\",\"tw.restorePoints.loading\":\"Bezig met laden...\",\"tw.restorePoints.minutes\":\"elke {n} minuten\",\"tw.restorePoints.never\":\"nooit\",\"tw.restorePoints.off\":\"Herstelpunten uitschakelen is gevaarlijk.\",\"tw.restorePoints.size\":\"Schatting gebruikte opslagruimte: {size}\",\"tw.restorePoints.size2\":\"Onderdelen zoals uiterlijken en geluiden die gebruikt worden door meerdere herstelpunten worden maar één keer opgeslagen.\",\"tw.restorePoints.title\":\"Herstelpunten\",\"tw.sample\":\"Voorbeeldproject\",\"tw.saveAs\":\"Opslaan als...\",\"tw.saveTo\":\"Opslaan in {file}\",\"tw.scratchUnsafeCloud\":\"Als je deze cloudvariabele maakt, zal het project het limiet van {number} variabelen overschrijden, en sommige variabelen zullen niet goed werken als je het project uploadt naar Scratch.\",\"tw.securityManager.allow\":\"Toestaan\",\"tw.securityManager.deny\":\"Weigeren\",\"tw.securityManager.title\":\"Extensiebeveiliging\",\"tw.securityManager.trust\":\"Indien toegestaan worden toekomstige verzoeken naar dezelfde website automatisch toegestaan.\",\"tw.securityManager.why\":\"Dit kan gebruikt worden om afbeeldingen of geluiden te downloaden, multiplayer mogelijk te maken, toegang te krijgen tot een API, of misschien voor kwaadaardige bedoelingen. Dit zal je IP-adres, je algemene locatie en mogelijk overige gegevens delen met de website.\",\"tw.settingsModal.customStageSize\":\"Aangepaste speelveldgrootte:\",\"tw.settingsModal.customStageSizeHelp\":\"Verandert de grootte van het Scratch-speelveld van 480x360 naar iets anders. Probeer 640x360 voor een breed beeld. Maar heel weinig projecten zullen hier goed mee werken.\",\"tw.settingsModal.dangerZone\":\"Gevarenzone\",\"tw.settingsModal.disableCompiler\":\"Compiler uitschakelen\",\"tw.settingsModal.disableCompilerHelp\":\"Schakelt de compiler van {APP_NAME} uit. Dit is handig tijdens het bewerken van projecten, omdat scripts dan gelijk updaten. Anders zou je dit nooit aan moeten zetten.\",\"tw.settingsModal.featured\":\"Uitgelicht\",\"tw.settingsModal.fps\":\"60 FPS (aangepaste FPS)\",\"tw.settingsModal.fpsHelp\":\"Voert scripts 60 keer per seconde uit in plaats van 30. De meeste projecten zullen hier niet goed mee werken. Probeer interpolatie zonder 60 FPS als dit het geval is. {customFramerate}.\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Klik hier om een andere framerate dan 30 of 60 te gebruiken\",\"tw.settingsModal.help\":\"Klik hier voor hulp\",\"tw.settingsModal.highQualityPen\":\"Pen met hoge kwaliteit\",\"tw.settingsModal.highQualityPenHelp\":\"Geeft pen-tekeningen een hogere resolutie en schakelt een paar gevallen van afronding van coördinaten uit in de editor. Niet alle projecten hebben hier voordeel van en het kan prestaties verminderen.\",\"tw.settingsModal.infiniteClones\":\"Kloonlimiet weghalen\",\"tw.settingsModal.infiniteClonesHelp\":\"Haalt de limiet van 300 klonen van Scratch weg.\",\"tw.settingsModal.interpolation\":\"Interpolatie\",\"tw.settingsModal.interpolationHelp\":\"Laat projecten er soepeler uitzien door spritebewegingen te interpoleren. Gebruik dit niet in 3D-projecten, raytracers, penprojecten, en trage projecten. Interpolatie maakt die projecten juist trager, waardoor je het tegenovergestelde resultaat bereikt.\",\"tw.settingsModal.largeStageWarning\":\"Het gebruiken van een speelveld van deze grootte is niet aangeraden! Gebruik in plaats daarvan een kleinere grootte met dezelfde beeldverhouding en laat het volledig scherm-modus het vergroten om het op de weergave van de gebruiker af te stemmen.\",\"tw.settingsModal.removeFencing\":\"Waarde-limieten van sprites weghalen\",\"tw.settingsModal.removeFencingHelp\":\"Geeft sprites de mogelijkheid om van het scherm af te bewegen, zo groot of klein te worden als ze maar willen, en laat blokken voor aanrakingen zelfs buiten het scherm werken.\",\"tw.settingsModal.removeLimits\":\"Limieten Weghalen\",\"tw.settingsModal.removeMiscLimits\":\"Diverse limieten weghalen\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Haalt limieten van o.a. geluidseffecten en pengrootte weg.\",\"tw.settingsModal.storeProjectOptions\":\"Instellingen opslaan in project\",\"tw.settingsModal.storeProjectOptionsHelp\":\"Slaat de geselecteerde instellingen op in het project zodat ze automatisch worden toegepast wanneer dit project wordt geladen met TurboWarp. Warp timer en compiler uitschakelen worden niet opgeslagen.\",\"tw.settingsModal.title\":\"Geavanceerde Instellingen\",\"tw.settingsModal.warpTimer\":\"Warp timer\",\"tw.settingsModal.warpTimerHelp\":\"Laat scripts controleren of ze vastzitten in een lange of oneindige lus en voor een lage framerate zorgen, in plaats van vast blijven zitten tot de lus eindigt. Dit lost de meeste crashes op, maar heeft een grote invloed op prestaties, dus het is alleen standaard ingeschakeld in de editor.\",\"tw.soundEditorNotSupported\":\"De geluidseditor is niet ondersteund in deze browser.\",\"tw.spriteSelectorItem.rename\":\"naam wijzigen\",\"tw.stageHeader.full\":\"Schakel naar volledig speelveld\",\"tw.stereoAlert\":\"Het bewerken van dit stereogeluid zal het onomkeerbaar veranderen naar mono.\",\"tw.studioview.authorAttribution\":\"door {author}\",\"tw.studioview.error\":\"Er is een fout opgetreden bij het laden van de volgende pagina van projecten.\",\"tw.studioview.hoverText\":\"{title} door {author}\",\"tw.tooLarge\":\"Dit geluidsbestand is mogelijk te groot voor Scratch.\",\"tw.twExtension.description\":\"Gekke nieuwe blokken.\",\"tw.twExtension.name\":\"{APP_NAME}-blokken\",\"tw.unfavorite\":\"Niet Favoriet Maken\",\"tw.unknownPlatform.2\":\"Compatibiliteit met {APP_NAME} is niet gegarandeerd. Je kan doorgaan op eigen risico, maar dan is het voor ons misschien niet mogelijk om te helpen als er iets misgaat.\",\"tw.unknownPlatform.continue\":\"Begrepen\",\"tw.unknownPlatform.title\":\"Onbekend platform\",\"tw.unshared.2\":\"Voor meer informatie, bezoek: {link}\",\"tw.unshared.bug\":\"Als dit project wel gedeeld is, meld dan een bug.\",\"tw.unshared.cache\":\"Als dit project recentelijk is gedeeld, kan het zijn dat dit bericht een paar minuten lang verkeerd wordt weergegeven.\",\"tw.unshared2.1\":\"Niet-gedeelde projecten zijn niet meer zichtbaar.\",\"tw.usernameModal.help\":\"Deze waarde wordt opgeslagen in de opslag van je browser. Het kan worden gelogd wanneer je iets doet met projecten die cloudvariabelen bevatten.\",\"tw.usernameModal.help2\":\"Waarden die niet corresponderen met een geldig Scratch-account worden normaal gesproken geweigerd door de server voor cloudvariabelen. We raden je aan het zo te laten of het te veranderen naar je Scratch-gebruikersnaam.\",\"tw.usernameModal.mustChange\":\"Het spijt ons, maar de server voor cloudvariabelen vermoedt dat je gebruikersnaam onveilig is. Verander het alsjeblieft naar iets anders of {resetIt}.\",\"tw.usernameModal.mustChange.resetIt\":\"reset het (aanbevolen)\",\"tw.usernameModal.new\":\"Nieuwe gebruikersnaam:\",\"tw.usernameModal.reset\":\"Resetten\",\"tw.usernameModal.title\":\"Gebruikersnaam veranderen\",\"tw.usesCloudVariables\":\"Dit project gebruikt cloudvariabelen.\",\"tw.usesCloudVariables2\":\"De cloudvariabelen van {APP_NAME} zijn niet verbonden met die van Scratch. Iedereen kan {changeTheirUsername} naar wat ze maar willen, dus pas op voor imitatie.\",\"tw.usesCloudVariables2.change\":\"hun gebruikersnaam veranderen\",\"tw.viewFeaturedProjects\":\"Klik hier om uitgelichte projecten te zien.\",\"tw.viewOnScratch\":\"Dit project bekijken op Scratch\"},\"pl\":{\"tw.alerts.creatingRestorePoint\":\"Tworzenie punktu przywracania…\",\"tw.alerts.lostPeripheralConnection\":\"Utracono połączenie do {extensionName}.\",\"tw.alerts.savedToDisk\":\"Zapisano na twoim komputerze.\",\"tw.backpack.rename\":\"Nowa nazwa:\",\"tw.blocks.addons\":\"Dodatki\",\"tw.blocks.buttonIsDown\":\"kliknięto [MOUSE_BUTTON] przycisk myszy?\",\"tw.blocks.lastKeyPressed\":\"ostatnio naciśnięty przycisk\",\"tw.blocks.mouseButton.middle\":\"(1) środkowy\",\"tw.blocks.mouseButton.primary\":\"(0) podstawowy\",\"tw.blocks.mouseButton.secondary\":\"(2) dodatkowy\",\"tw.blocks.openDocs\":\"Otwórz Dokumentację\",\"tw.changeUsername.cannotChangeWhileRunning\":\"Nazwa użytkownika nie może zostać zmieniona, kiedy projekt jest uruchomiony\",\"tw.code\":\"Kod Źródłowy\",\"tw.customExtension.name\":\"Niestandardowe Rozszerzenie\",\"tw.customExtensionModal.file\":\"Pliki\",\"tw.customExtensionModal.text\":\"Tekst\",\"tw.customExtensionModal.title\":\"Załaduj Niestandardowe Rozszerzenie\",\"tw.documentation\":\"Dokumentacja\",\"tw.featuredProjectsStudio\":\"Zobacz studio w Scratchu.\",\"tw.feedback\":\"Opinie i Błędy\",\"tw.fetch.title\":\"Projekt chce połączyć się z:\",\"tw.footer.credits\":\"Podziękowania\",\"tw.footer.documentation\":\"Dokumentacja\",\"tw.footer.embed\":\"Osadzanie\",\"tw.footer.parameters\":\"Parametry URL\",\"tw.gui.defaultProjectTitle\":\"Projekt\",\"tw.guiDefaultTitle\":\"Uruchamiaj projekty Scratch szybciej\",\"tw.home.credit\":\"Notatki i Podziękowania\",\"tw.home.instructions\":\"Instrukcje\",\"tw.input.tooltip\":\"Skopiuj i wklej link do projektu Scratcha tutaj!\",\"tw.interpolationEnabled\":\"Interpolacja\",\"tw.invalidParameters.clones\":\"Parametr URL \\\\\"clone\\\\\" jest nieprawidłowy\",\"tw.invalidParameters.fps\":\"Parametr URL \\\\\"fps\\\\\" jest nieprawidłowy\",\"tw.invalidProject.title\":\"Błąd\",\"tw.loader.downloadingAssets\":\"Pobieranie zasobów ({complete}/{total}) ...\",\"tw.loader.projectData\":\"Ładowanie projektu ...\",\"tw.menuBar.60off\":\"Wyłącz tryb 60 FPS\",\"tw.menuBar.60on\":\"Włącz tryb 60 FPS\",\"tw.menuBar.addons\":\"Dodatki\",\"tw.menuBar.advanced\":\"Zaawansowane\",\"tw.menuBar.changeUsername\":\"Zmień Nazwę Użytkownika\",\"tw.menuBar.cloudOff\":\"Wyłącz Zmienne W Chmurze\",\"tw.menuBar.cloudOn\":\"Włącz Zmienne W Chmurze\",\"tw.menuBar.cloudUnavailable\":\"Zmienne W Chmurze nie są Dostępne\",\"tw.menuBar.cloudUnavailableAlert\":\"Nie można użyć zmiennych w chmurze, najprawdopodobniej dlatego, że masz włączony edytor.\",\"tw.menuBar.desktopSettings\":\"Ustawienia Wersji na Pulpit\",\"tw.menuBar.moreSettings\":\"Zaawansowane Ustawienia\",\"tw.menuBar.newFramerate\":\"Nowa liczba klatek na sekundę:\",\"tw.menuBar.reportError2\":\"To jest błąd. Proszę zgłoś to.\",\"tw.menuBar.saveAs\":\"Zapisz jako {file}\",\"tw.menuBar.seeInside\":\"Zajrzyj do środka\",\"tw.oldDownload\":\"Zapisz do osobnego pliku...\",\"tw.opcode.2000\":\"dni od 2000\",\"tw.opcode.mousedown\":\"kliknięto myszką?\",\"tw.opcode.mousex\":\"x myszy\",\"tw.opcode.mousey\":\"y myszy\",\"tw.openAdvanced\":\"Otwórz zaawansowane ustawienia\",\"tw.openWindow.dangerous\":\"Ta strona nie została zweryfikowana przez twórców {APP_NAME}. Może zawierać niebezpieczny lub złośliwy kod.\",\"tw.openWindow.title\":\"Projekt chce otworzyć nowe okno lub kartę z URL:\",\"tw.paint.alpha\":\"Nieprzezroczystość\",\"tw.privacy\":\"Polityka Prywatności\",\"tw.redirect.dangerous\":\"Ta strona nie została zweryfikowana przez twórców {APP_NAME}. Może zawierać niebezpieczny lub złośliwy kod.\",\"tw.redirect.title\":\"Projekt chce przejść na tej karcie do URL:\",\"tw.saveAs\":\"Zapisz jako...\",\"tw.saveTo\":\"Zapisz do {file}\",\"tw.securityManager.allow\":\"Zezwól\",\"tw.securityManager.title\":\"Bezpieczeństwo Rozszerzeń\",\"tw.settingsModal.customStageSize\":\"Niestandardowy Rozmiar Sceny:\",\"tw.settingsModal.customStageSizeHelp\":\"Zmienia wielkość ekranu używanego w Scratchu z 480x360 do jakiejś innej wielkości. Spróbuj 640x360 żeby zrobić ekran szerszy. Bardzo niewiele projektów poradzi sobie z tym prawidłowo.\",\"tw.settingsModal.dangerZone\":\"Niebezpieczna Strefa\",\"tw.settingsModal.disableCompiler\":\"Wyłącz Kompilator\",\"tw.settingsModal.featured\":\"Wyróżnione\",\"tw.settingsModal.fps\":\"60 FPS (Niestandardowe FPS)\",\"tw.settingsModal.fpsHelp\":\"Uruchamia skrypty 60 razy na sekundę, zamiast 30. Większość projektów nie będzie działać poprawnie z tą opcją włączoną. W takim przypadku spróbuj Interpolację z wyłączonym trybem 60 FPS. {customFramerate}\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Kliknij, aby ustawić liczbę klatek na sekundę inną niż 30 lub 60.\",\"tw.settingsModal.help\":\"Kliknij po pomoc\",\"tw.settingsModal.highQualityPen\":\"Wysokiej Jakości Pióro\",\"tw.settingsModal.highQualityPenHelp\":\"Umożliwia renderowanie pisaka z wyższą rozdzielczością, oraz wyłącza zaokrąglanie współrzędnych dla pisaka (większa dokładność). Nie wszystkie projekty pozytywnie skorzystają z tego ustawienia i może ono negatywnie wpłynąć na wydajność.\",\"tw.settingsModal.infiniteClones\":\"Nieskończone Klony\",\"tw.settingsModal.infiniteClonesHelp\":\"Wyłącza domyślny limit 300 klonów.\",\"tw.settingsModal.interpolation\":\"Interpolacja\",\"tw.settingsModal.removeFencing\":\"Usuń Ograniczenia\",\"tw.settingsModal.removeFencingHelp\":\"Pozwala duszkom poruszać się i wykrywać kolizję poza sceną oraz mieć dowolny rozmiar.\",\"tw.settingsModal.removeLimits\":\"Usuń Limity\",\"tw.settingsModal.removeMiscLimits\":\"Usuń Różne Limity\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Usuwa limity efektów dźwiękowych i rozmiaru pisaka.\",\"tw.settingsModal.storeProjectOptions\":\"Przechowaj ustawienia w projekcie\",\"tw.settingsModal.title\":\"Zaawansowane Ustawienia\",\"tw.settingsModal.warpTimer\":\"Warp Stoper\",\"tw.spriteSelectorItem.rename\":\"zmień nazwę\",\"tw.stereoAlert\":\"Edytowanie tego dźwięku stereo bezpowrotnie konwertuje go do mono.\",\"tw.studioview.authorAttribution\":\"przez {author}\",\"tw.studioview.error\":\"Wystąpił błąd przy ładowaniu następnej strony projektów.\",\"tw.studioview.hoverText\":\"{title} autorstwa {author}\",\"tw.tooLarge\":\"Ten dźwięk może być zbyt duży, aby wczytać go do Scratch.\",\"tw.twExtension.description\":\"Dziwne nowe bloki.\",\"tw.unshared2.1\":\"Nieudostępnione projekty nie są już widoczne.\",\"tw.usernameModal.mustChange.resetIt\":\"zresetuj to (zalecane)\",\"tw.usernameModal.reset\":\"Resetuj\",\"tw.usernameModal.title\":\"Zmień Nazwę Użytkownika\",\"tw.viewFeaturedProjects\":\"Kliknij, aby zobaczyć polecane projekty.\",\"tw.viewOnScratch\":\"Zobacz projekt w Scratchu\"},\"pt\":{\"tw.alerts.creatingRestorePoint\":\"Criando ponto de restauração...\",\"tw.alerts.savedToDisk\":\"Salvo no seu computador.\",\"tw.backpack.rename\":\"Novo nome:\",\"tw.blocks.buttonIsDown\":\"botão [MOUSE_BUTTON] do mouse pressionado?\",\"tw.blocks.lastKeyPressed\":\"última tecla pressionada\",\"tw.blocks.mouseButton.middle\":\"(1) do meio\",\"tw.blocks.mouseButton.primary\":\"(0) primário\",\"tw.blocks.mouseButton.secondary\":\"(2) secundário\",\"tw.blocks.openDocs\":\"Abrir Documentação\",\"tw.changeUsername.cannotChangeWhileRunning\":\"O nome de usuário não pode ser alterado enquanto o projeto está em execução.\",\"tw.code\":\"Código-fonte\",\"tw.confirmIncompatibleExtension\":\"Essa extensão não é compatível com o Scratch. Projetos feitos com ela não funcionarão se você fizer upload no site do Scratch. Tem certeza que quer ativá-la?\",\"tw.customExtension.name\":\"Extensão Customizada\",\"tw.featuredProjectsStudio\":\"Ver estúdio no Scratch.\",\"tw.feedback\":\"Feedback e bugs\",\"tw.footer.credits\":\"Créditos\",\"tw.footer.embed\":\"Incorporação\",\"tw.footer.parameters\":\"Parâmetros de URL\",\"tw.gui.defaultProjectTitle\":\"Projeto\",\"tw.guiDefaultTitle\":\"Rode projetos do Scratch mais rapidamente\",\"tw.home.credit\":\"Notas e Créditos\",\"tw.home.instructions\":\"Instruções\",\"tw.input.tooltip\":\"Copie e cole um link de um projeto no Scratch aqui!\",\"tw.interpolationEnabled\":\"Interpolação\",\"tw.invalidParameters.clones\":\"parâmetro de URL \\\\\"clone\\\\\" é inválido\",\"tw.invalidParameters.fps\":\"parâmetro de URL \\\\\"fps\\\\\" é inválido\",\"tw.invalidProject.title\":\"Erro\",\"tw.loader.downloadingAssets\":\"Baixando recursos ({complete}/{total}) ...\",\"tw.loader.loadingAssets\":\"Carregando recursos ({complete}/{total}) …\",\"tw.loader.projectData\":\"Carregando projeto …\",\"tw.menuBar.60off\":\"Desativar modo 60 FPS\",\"tw.menuBar.60on\":\"Ativar modo 60 FPS\",\"tw.menuBar.advanced\":\"Avançado\",\"tw.menuBar.changeUsername\":\"Mudar nome de usuário\",\"tw.menuBar.cloudOff\":\"Desativar variáveis na nuvem\",\"tw.menuBar.cloudOn\":\"Ativar variáveis na nuvem\",\"tw.menuBar.cloudUnavailable\":\"Variáveis na nuvem não estão disponíveis\",\"tw.menuBar.cloudUnavailableAlert\":\"Não pôde usar variáveis na nuvem, provavelmente porque você abriu o editor.\",\"tw.menuBar.desktopSettings\":\"Configurações de área de trabalho\",\"tw.menuBar.moreSettings\":\"Configurações Avançadas\",\"tw.menuBar.newFramerate\":\"Novo FPS:\",\"tw.menuBar.reportError2\":\"Isso é um bug. Por favor, reporte-o.\",\"tw.menuBar.saveAs\":\"Salvar como {file}\",\"tw.menuBar.seeInside\":\"Ver interior\",\"tw.oldDownload\":\"Salvar como arquivo separado...\",\"tw.paint.alpha\":\"Opacidade\",\"tw.privacy\":\"Política de Privacidade\",\"tw.saveAs\":\"Salvar como...\",\"tw.saveTo\":\"Salvar como {file}\",\"tw.settingsModal.customStageSize\":\"Tamanho Customizado do Palco:\",\"tw.settingsModal.customStageSizeHelp\":\"Muda o tamanho do palco do Scratch de 480x360 para outro valor. Tente 640x360 para deixar o palco em widescreen. Quase nenhum projeto irá funcionar direito com essa opção.\",\"tw.settingsModal.dangerZone\":\"Zona de Perigo\",\"tw.settingsModal.disableCompiler\":\"Desativar Compilador\",\"tw.settingsModal.featured\":\"Em destaque\",\"tw.settingsModal.fps\":\"60 FPS (FPS customizado)\",\"tw.settingsModal.fpsHelp\":\"Roda scripts 60 vezes por segundo ao invés de 30. A maioria dos projetos não vão funcionar adequadamente com isso ativado. Se esse for o caso, você pode tentar usar Interpolação e desligar o modo 60 FPS. {customFramerate}.\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Clique para escolher FPS além de 30 ou 60\",\"tw.settingsModal.help\":\"Ajuda\",\"tw.settingsModal.highQualityPen\":\"Caneta de Alta Qualidade\",\"tw.settingsModal.highQualityPenHelp\":\"Permite que projetos renderizem a caneta em uma qualidade melhor e reduz arredondamento de coordenadas no editor. Nem todo projeto se beneficia dessa opção, e ela pode piorar a performance.\",\"tw.settingsModal.infiniteClones\":\"Clones Infinitos\",\"tw.settingsModal.infiniteClonesHelp\":\"Desativa o limite de 300 clones do Scratch.\",\"tw.settingsModal.interpolation\":\"Interpolação\",\"tw.settingsModal.interpolationHelp\":\"Faz projetos parecerem rodar em framerates mais altas interpolando o movimento de atores. Interpolação não deve ser usada em projetos 3D, raytracers, projetos que usam caneta e projetos lagados porque a interpolação só vai fazer eles rodarem mais devagar sem deixá-los mais suaves.\",\"tw.settingsModal.largeStageWarning\":\"Não é recomendado usar um tamanho de palco tão grande! Ao invés disso, use um tamanho menor com a mesma proporção e o modo tela cheia irá aumentar o palco para preencher a tela do usuário.\",\"tw.settingsModal.removeFencing\":\"Remover Borda\",\"tw.settingsModal.removeFencingHelp\":\"Deixa atores andarem para fora da tela, ficarem grandes ou pequenos sem limitação de tamanho e permite que os blocos \\\\\"tocando\\\\\" funcionem fora dos limites do palco.\",\"tw.settingsModal.removeLimits\":\"Remover Limites\",\"tw.settingsModal.removeMiscLimits\":\"Remover Outros Limites\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Remove os limites de efeitos de som e tamanho da caneta.\",\"tw.settingsModal.storeProjectOptions\":\"Salvar configurações no projeto\",\"tw.settingsModal.storeProjectOptionsHelp\":\"Salva suas configurações no projeto e automaticamente os aplica quando você abrir o projeto no TurboWarp. \\\\\"Warp timer\\\\\" e \\\\\"desativar compilador\\\\\" não serão salvos.\",\"tw.settingsModal.title\":\"Configurações Avançadas\",\"tw.settingsModal.warpTimerHelp\":\"Faz scripts detectarem se estão presos em um loop longo ou infinito e roda a uma framerate baixa ao invés de travar até o loop terminar. Isso conserta a maioria dos crashes mas prejudica muito a performance, então não está ativado por padrão fora do editor.\",\"tw.spriteSelectorItem.rename\":\"renomear\",\"tw.studioview.authorAttribution\":\"por {author}\",\"tw.studioview.error\":\"Erro ao carregar a próxima página de projetos.\",\"tw.studioview.hoverText\":\"{title} por {author}\",\"tw.usernameModal.help\":\"Esse valor será guardado no armazenamento do seu navegador. Projetos que contenham variáveis na nuvem podem querer registrá-lo.\",\"tw.usernameModal.help2\":\"Valores que não correspondem a uma conta válida no Scratch normalmente serão rejeitados pelo servidor de variáveis na nuvem. Recomendamos que você deixe este valor como está ou mude-o para o seu nome de usuário do Scratch.\",\"tw.usernameModal.mustChange\":\"Desculpe, o servidor de variáveis na nuvem acha que o seu nome de usuário pode ser inapropriado. Por favor, mude para outra coisa ou {resetIt}.\",\"tw.usernameModal.mustChange.resetIt\":\"resete-o (recomendado)\",\"tw.usernameModal.new\":\"Novo nome de usuário:\",\"tw.usernameModal.reset\":\"Redefinir\",\"tw.usernameModal.title\":\"Mudar nome de usuário\",\"tw.viewFeaturedProjects\":\"Clique para ver projetos em destaque.\",\"tw.viewOnScratch\":\"Ver projeto no Scratch\"},\"pt-br\":{\"tw.accent.blue\":\"Azul\",\"tw.accent.purple\":\"Roxo\",\"tw.accent.red\":\"Vermelho\",\"tw.alerts.creatingRestorePoint\":\"Criando ponto de restauração...\",\"tw.alerts.lostPeripheralConnection\":\"Conexão com {extensionName} foi perdida.\",\"tw.alerts.savedToDisk\":\"Salvo no seu computador.\",\"tw.backpack.rename\":\"Novo nome:\",\"tw.blockColors.custom\":\"Customizar em Configurações de Addon\",\"tw.blockColors.dark\":\"Escuro (Beta)\",\"tw.blockColors.highContrast\":\"Alto Contraste\",\"tw.blocks.buttonIsDown\":\"botão [MOUSE_BUTTON] do mouse pressionado?\",\"tw.blocks.lastKeyPressed\":\"última tecla pressionada\",\"tw.blocks.mouseButton.middle\":\"(1) do meio\",\"tw.blocks.mouseButton.primary\":\"(0) primário\",\"tw.blocks.mouseButton.secondary\":\"(2) secundário\",\"tw.blocks.openDocs\":\"Abrir Documentação\",\"tw.cantUseCloud\":\"Embora você possa criar variáveis de nuvem, elas não funcionarão a menos que este projeto seja publicado no Scratch ou convertido usando uma ferramenta como o {packager}.\",\"tw.changeUsername.cannotChangeWhileRunning\":\"O nome de usuário não pode ser alterado enquanto o projeto está em execução.\",\"tw.clipboard.danger\":\"Se a sua área de transferência conter informações vulneráveis como senhas, este projeto pode compartilhar tais dados com outros usuários ou servidores.\",\"tw.clipboard.title\":\"Este projeto quer ler as informações da sua área de transferência.\",\"tw.cloudProvider\":\"Servidor providenciado por {name}\",\"tw.cloudServers\":\"Selecionar um servidor próximo a você:\",\"tw.code\":\"Código-fonte\",\"tw.confirmIncompatibleExtension\":\"Essa extensão não é compatível com o Scratch. Projetos feitos com ela não funcionarão se você fizer upload no site do Scratch. Tem certeza que quer ativá-la?\",\"tw.createdBy\":\"Criado por:\",\"tw.customCloudServer\":\"Usando o servidor de variável em nuvem personalizada: {server}\",\"tw.customExtension.name\":\"Extensão Customizada\",\"tw.customExtensionModal.load\":\"Carregar\",\"tw.customExtensionModal.promptText\":\"Cole o código fonte em JavaScript da extensão:\",\"tw.customExtensionModal.promptURL\":\"Insira a URL da extensão:\",\"tw.customExtensionModal.text\":\"Texto\",\"tw.customExtensionModal.title\":\"Carregar Extensão Customizada\",\"tw.customExtensionModal.trusted\":\"Essa extensão será carregada fora do sandbox pois vem de uma fonte confiável.\",\"tw.customExtensionModal.unsandboxedWarning1\":\"Carregar extensões fora do sandbox é perigoso e não deve ser ativado a não ser que você seja experiente.\",\"tw.customExtensionModal.unsandboxedWarning2\":\"Extensões sem sandbox podem corromper seu projeto, apagar suas configurações, roubar senhas e causar outros tormentos. Os desenvolvedores do aplicativo {APP_NAME} não são responsáveis por qualquer resultado consequente.\",\"tw.customExtensionModal.untrusted\":\"Extensões com URLs não confiáveis serão sempre carregadas com sandbox por segurança.\",\"tw.darkMode\":\"Alternar para Tema Claro\",\"tw.documentation\":\"Documentação\",\"tw.favorite\":\"Favoritar\",\"tw.featuredProjectsStudio\":\"Ver estúdio no Scratch.\",\"tw.feedback\":\"Feedback e bugs\",\"tw.feedbackButton\":\"{APP_NAME} Opinar\",\"tw.fetch.title\":\"Este projeto quer se conectar ao site: \",\"tw.fonts.add\":\"Adicionar\",\"tw.fonts.custom.file\":\"Escolha um arquivo de fonte do seu computador:\",\"tw.fonts.custom.name\":\"Nomeie a fonte:\",\"tw.fonts.custom1\":\"Adicionar fonte por arquivo\",\"tw.fonts.list\":\"Fontes instaladas:\",\"tw.fonts.none\":\"Nenhuma fonte adicionada.\",\"tw.fonts.readError\":\"Falha ao ler o arquivo de fonte: {error}\",\"tw.fonts.system\":\"Fonte do sistema operacional\",\"tw.fonts.system1\":\"Adicionar uma fonte do sistema operacional\",\"tw.fonts.title\":\"Fontes\",\"tw.footer.credits\":\"Créditos\",\"tw.footer.documentation\":\"Documentação\",\"tw.footer.embed\":\"Incorporação\",\"tw.footer.parameters\":\"Parâmetros de URL\",\"tw.gui.crashMessage.description\":\"Lamentamos, mas parece que a página parou de funcionar. Por favor, renicie-a para tentar novamente.\",\"tw.gui.defaultProjectTitle\":\"Projeto\",\"tw.guiDefaultTitle\":\"Rode projetos do Scratch mais rapidamente\",\"tw.home.credit\":\"Notas e Créditos\",\"tw.home.instructions\":\"Instruções\",\"tw.input.tooltip\":\"Copie e cole um link de um projeto no Scratch aqui!\",\"tw.interpolationEnabled\":\"Interpolação\",\"tw.invalidParameters.clones\":\"parâmetro de URL \\\\\"clone\\\\\" é inválido\",\"tw.invalidParameters.fps\":\"parâmetro de URL \\\\\"fps\\\\\" é inválido\",\"tw.invalidProject.title\":\"Erro\",\"tw.lightMode\":\"Alternar para Tema Escuro\",\"tw.loader.downloadingAssets\":\"Baixando recursos ({complete}/{total}) ...\",\"tw.loader.loadingAssets\":\"Carregando recursos ({complete}/{total}) …\",\"tw.loader.projectData\":\"Carregando projeto …\",\"tw.menuBar.60off\":\"Desativar modo 60 FPS\",\"tw.menuBar.60on\":\"Ativar modo 60 FPS\",\"tw.menuBar.accent\":\"Destaque\",\"tw.menuBar.advanced\":\"Avançado\",\"tw.menuBar.blockColors\":\"Cores de Bloco\",\"tw.menuBar.changeUsername\":\"Mudar nome de usuário\",\"tw.menuBar.cloudOff\":\"Desativar variáveis na nuvem\",\"tw.menuBar.cloudOn\":\"Ativar variáveis na nuvem\",\"tw.menuBar.cloudUnavailable\":\"Variáveis na nuvem não estão disponíveis\",\"tw.menuBar.cloudUnavailableAlert\":\"Não pôde usar variáveis na nuvem, provavelmente porque você abriu o editor.\",\"tw.menuBar.desktopSettings\":\"Configurações de área de trabalho\",\"tw.menuBar.moreSettings\":\"Configurações Avançadas\",\"tw.menuBar.newFramerate\":\"Novo FPS:\",\"tw.menuBar.newWindow\":\"Nova janela\",\"tw.menuBar.package\":\"Exportar projeto\",\"tw.menuBar.reportError1\":\"Alguns scripts apresentaram erros.\",\"tw.menuBar.reportError2\":\"Isso é um bug. Por favor, reporte-o.\",\"tw.menuBar.restorePoints\":\"Pontos de restauração\",\"tw.menuBar.saveAs\":\"Salvar como {file}\",\"tw.menuBar.seeInside\":\"Ver interior\",\"tw.mono\":\"Monodirecional\",\"tw.moreCloud\":\"Saiba mais sobre variáveis na nuvem.\",\"tw.notify.title\":\"Este projeto quer mostrar notificações.\",\"tw.oldDownload\":\"Salvar como arquivo separado...\",\"tw.opcode.2000\":\"dias desde 2000\",\"tw.opcode.mousedown\":\"mouse pressionado?\",\"tw.opcode.mousex\":\"x do mouse\",\"tw.opcode.mousey\":\"y do mouse\",\"tw.openAdvanced\":\"Abrir configurações avançadas\",\"tw.openWindow.dangerous\":\"Este site não foi revisado pelos desenvolvedores do {APP_NAME}. Pode conter códigos perigosos ou maliciosos.\",\"tw.openWindow.title\":\"Este projeto quer abrir uma nova janela ou aba para acessar a seguinte URL:\",\"tw.paint.alpha\":\"Opacidade\",\"tw.paint.fonts.more\":\"Adicionar mais fontes...\",\"tw.privacy\":\"Política de Privacidade\",\"tw.redirect.dangerous\":\"Este site não foi revisado pelos desenvolvedores do {APP_NAME}. Pode conter códigos perigosos ou maliciosos.\",\"tw.redirect.title\":\"O projeto deseja navegar nesta guia para o URL:\",\"tw.restorePoints.1minute\":\"cada minuto\",\"tw.restorePoints.assets\":\"{n} arquivos\",\"tw.restorePoints.deleteAll\":\"Apagar Todos\",\"tw.restorePoints.empty\":\"Nenhum ponto de restauração encontrado.\",\"tw.restorePoints.loading\":\"Carregando.\",\"tw.restorePoints.minutes\":\"cada {n} minutos\",\"tw.restorePoints.never\":\"nunca\",\"tw.restorePoints.title\":\"Pontos de restauração\",\"tw.sample\":\"Projeto demonstrativo\",\"tw.saveAs\":\"Salvar como...\",\"tw.saveTo\":\"Salvar como {file}\",\"tw.scratchUnsafeCloud\":\"Se você criar essa variável de nuvem, o projeto excederá o limite de {number} variáveis do Scratch e algumas variáveis não funcionarão se você enviar o projeto para o Scratch.\",\"tw.securityManager.allow\":\"Permitir\",\"tw.securityManager.deny\":\"Negar\",\"tw.securityManager.title\":\"Segurança de Extensão\",\"tw.securityManager.why\":\"Isso pode ser usado para baixar imagens ou sons, implementar mecânicas de multiplayer, acessar uma API ou para fins maliciosos. Isso compartilhará seu endereço IP, localização geral e possivelmente outros dados com o site.\",\"tw.settingsModal.customStageSize\":\"Tamanho Customizado do Palco:\",\"tw.settingsModal.customStageSizeHelp\":\"Muda o tamanho do palco do Scratch de 480x360 para outro valor. Tente 640x360 para deixar o palco em widescreen. Quase nenhum projeto irá funcionar direito com essa opção.\",\"tw.settingsModal.dangerZone\":\"Zona de Perigo\",\"tw.settingsModal.disableCompiler\":\"Desativar compilador\",\"tw.settingsModal.featured\":\"Em destaque\",\"tw.settingsModal.fps\":\"60 FPS (FPS customizado)\",\"tw.settingsModal.fpsHelp\":\"Roda scripts 60 vezes por segundo ao invés de 30. A maioria dos projetos não vão funcionar adequadamente com isso ativado. Se esse for o caso, você pode tentar usar Interpolação e desligar o modo 60 FPS. {customFramerate}.\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Clique para escolher FPS além de 30 ou 60\",\"tw.settingsModal.help\":\"Ajuda\",\"tw.settingsModal.highQualityPen\":\"Caneta de Alta Qualidade\",\"tw.settingsModal.highQualityPenHelp\":\"Permite que projetos renderizem a caneta em uma qualidade melhor e reduz arredondamento de coordenadas no editor. Nem todo projeto se beneficia dessa opção, e ela pode piorar a performance.\",\"tw.settingsModal.infiniteClones\":\"Clones Infinitos\",\"tw.settingsModal.infiniteClonesHelp\":\"Desativa o limite de 300 clones do Scratch.\",\"tw.settingsModal.interpolation\":\"Interpolação\",\"tw.settingsModal.interpolationHelp\":\"Faz projetos parecerem rodar em framerates mais altas interpolando o movimento de atores. Interpolação não deve ser usada em projetos 3D, raytracers, projetos que usam caneta e projetos lagados porque a interpolação só vai fazer eles rodarem mais devagar sem deixá-los mais suaves.\",\"tw.settingsModal.largeStageWarning\":\"Não é recomendado usar um tamanho de palco tão grande! Ao invés disso, use um tamanho menor com a mesma proporção e o modo tela cheia irá aumentar o palco para preencher a tela do usuário.\",\"tw.settingsModal.removeFencing\":\"Remover Borda\",\"tw.settingsModal.removeFencingHelp\":\"Deixa atores andarem para fora da tela, ficarem grandes ou pequenos sem limitação de tamanho e permite que os blocos \\\\\"tocando\\\\\" funcionem fora dos limites do palco.\",\"tw.settingsModal.removeLimits\":\"Remover Limites\",\"tw.settingsModal.removeMiscLimits\":\"Remover Outros Limites\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Remove os limites de efeitos de som e tamanho da caneta.\",\"tw.settingsModal.storeProjectOptions\":\"Salvar configurações no projeto\",\"tw.settingsModal.storeProjectOptionsHelp\":\"Salva suas configurações no projeto e automaticamente os aplica quando você abrir o projeto no TurboWarp. \\\\\"Warp timer\\\\\" e \\\\\"desativar compilador\\\\\" não serão salvos.\",\"tw.settingsModal.title\":\"Configurações Avançadas\",\"tw.settingsModal.warpTimerHelp\":\"Faz scripts detectarem se estão presos em um loop longo ou infinito e roda a uma framerate baixa ao invés de travar até o loop terminar. Isso conserta a maioria dos crashes mas prejudica muito a performance, então não está ativado por padrão fora do editor.\",\"tw.spriteSelectorItem.rename\":\"renomear\",\"tw.stereo\":\"Estéreo\",\"tw.stereoAlert\":\"Editar este som estéreo irá convertê-lo irreversivelmente em mono.\",\"tw.studioview.authorAttribution\":\"por {author}\",\"tw.studioview.error\":\"Erro ao carregar a próxima página de projetos.\",\"tw.studioview.hoverText\":\"{title} por {author}\",\"tw.tooLarge\":\"Esse som excede os limites de tamanho de sons do Scratch.\",\"tw.twExtension.description\":\"Novos blocos estranhos.\",\"tw.unfavorite\":\"Desfavoritar\",\"tw.unshared.2\":\"Para mais informações, visite: {link}\",\"tw.unshared.bug\":\"Se este projeto estiver compartilhado, por favor denuncie o bug.\",\"tw.unshared.cache\":\"Se o projeto foi compartilhado recentemente, esta mensagem pode aparecer indevidamente por alguns minutos.\",\"tw.unshared2.1\":\"Projetos descompartilhados não são mais acessíveis.\",\"tw.usernameModal.help\":\"Esse valor será guardado no armazenamento do seu navegador. Projetos que contenham variáveis na nuvem podem querer registrá-lo.\",\"tw.usernameModal.help2\":\"Valores que não correspondem a uma conta válida no Scratch normalmente serão rejeitados pelo servidor de variáveis na nuvem. Recomendamos que você deixe este valor como está ou mude-o para o seu nome de usuário do Scratch.\",\"tw.usernameModal.mustChange\":\"Desculpe, o servidor de variáveis na nuvem acha que o seu nome de usuário possa ser inapropriado. Por favor, mude para outra coisa ou {resetIt}.\",\"tw.usernameModal.mustChange.resetIt\":\"resete-o (recomendado)\",\"tw.usernameModal.reset\":\"Redefinir\",\"tw.usernameModal.title\":\"Mudar nome de usuário\",\"tw.usesCloudVariables\":\"Este projeto utiliza variáveis em nuvem.\",\"tw.usesCloudVariables2\":\"As variáveis em nuvem do {APP_NAME} não são conectadas ao servidor do Scratch. Qualquer um pode {changeTheirUsername} para qualquer coisa, então tome cuidado pois algumas pessoas podem se fingir de outras.\",\"tw.usesCloudVariables2.change\":\"mudar nome de usuário \",\"tw.viewFeaturedProjects\":\"Clique para ver projetos em destaque.\",\"tw.viewOnScratch\":\"Ver projeto no Scratch\"},\"ro\":{\"tw.alerts.creatingRestorePoint\":\"Se creează punctul de recuperare…\",\"tw.alerts.savedToDisk\":\"Salvat pe calculatorul tău.\",\"tw.blocks.addons\":\"Extensii\",\"tw.blocks.buttonIsDown\":\"butonul mouse-ului [MOUSE_BUTTON] apăsat?\",\"tw.blocks.lastKeyPressed\":\"ultima tastă apăsată\",\"tw.blocks.mouseButton.middle\":\"(1) mijloc\",\"tw.blocks.mouseButton.primary\":\"(0) principal\",\"tw.blocks.mouseButton.secondary\":\"(2) secundar\",\"tw.blocks.openDocs\":\"Deschide Documentarea\",\"tw.changeUsername.cannotChangeWhileRunning\":\"Numele de utilizator nu poate fi schimbat cât timp proiectul rulează.\",\"tw.code\":\"Cod sursă\",\"tw.featuredProjectsStudio\":\"Vezi atilierul pe Scratch.\",\"tw.feedback\":\"Sugestii și Erori\",\"tw.footer.credits\":\"Credite\",\"tw.footer.embed\":\"Încorporare\",\"tw.footer.parameters\":\"Parametri URL\",\"tw.fps\":\"{framerate} Cadre Pe Secundă\",\"tw.gui.defaultProjectTitle\":\"Proiect\",\"tw.guiDefaultTitle\":\"Rulează proiecte Scratch mai rapid\",\"tw.home.credit\":\"Observații și Credite\",\"tw.home.instructions\":\"Instrucțiuni\",\"tw.invalidParameters.clones\":\"parametrul URL „clone” este invalid\",\"tw.invalidParameters.fps\":\"parametrul URL „fps” este invalid\",\"tw.loader.loadingAssets\":\"Se încarcă blocurile ({complete}/{total}) …\",\"tw.loader.projectData\":\"Se încarcă proiectul …\",\"tw.menuBar.60off\":\"Oprește modul de 60 Cadre Pe Secundă (FPS)\",\"tw.menuBar.60on\":\"Pornește modul de 60 Cadre Pe Secundă (FPS)\",\"tw.menuBar.addons\":\"Extensii\",\"tw.menuBar.advanced\":\"Avansat\",\"tw.menuBar.changeUsername\":\"Schimbă Utilizatorul\",\"tw.menuBar.cloudOff\":\"Oprește Variabilele Cloud\",\"tw.menuBar.cloudOn\":\"Pornește Variabilele Cloud\",\"tw.menuBar.cloudUnavailable\":\"Variabilele Cloud nu sunt valabile\",\"tw.menuBar.cloudUnavailableAlert\":\"Nu se pot folosi variabilele cloud, cel mai probabil deoarece ai deschis editorul.\",\"tw.menuBar.newFramerate\":\"Cadre Pe Secundă:\",\"tw.menuBar.reportError2\":\"Aceasta este o eroare. Vă rugăm s-o raportați.\",\"tw.menuBar.saveAs\":\"Salvează ca {file}\",\"tw.menuBar.seeInside\":\"Vezi în interior\",\"tw.privacy\":\"Politica de Confidențialitate\",\"tw.settingsModal.disableCompiler\":\"Oprește Compilerul\",\"tw.studioview.authorAttribution\":\"de {author}\",\"tw.studioview.error\":\"A apărut o eroare la încărcarea paginii urmatoare cu proiecte.\",\"tw.studioview.hoverText\":\"{title} de {author}\",\"tw.usernameModal.new\":\"Nume de utilizator nou:\",\"tw.usernameModal.reset\":\"Resetează\",\"tw.usernameModal.title\":\"Schimbă Utilizatorul\",\"tw.viewFeaturedProjects\":\"Vezi proiectele recomandate (dați click).\"},\"ru\":{\"tw.accent.blue\":\"Синий\",\"tw.accent.purple\":\"Фиолетовый\",\"tw.accent.rainbow\":\"Радуга\",\"tw.accent.red\":\"Красный\",\"tw.alerts.creatingRestorePoint\":\"Создание точку восстановления...\",\"tw.alerts.lostPeripheralConnection\":\"Потеря соединения с {extensionName}.\",\"tw.alerts.restorePointError\":\"Не удалось создать точку восстановления\",\"tw.alerts.restorePointSuccess\":\"Получите доступ к точкам восстановления в разделе \\\\\"Файл\\\\\"\",\"tw.alerts.savedToDisk\":\"Сохранено на ваш компьютер.\",\"tw.backpack.rename\":\"Новое имя:\",\"tw.blockColors.custom\":\"Кастомизация в Настройках Аддонов\",\"tw.blockColors.dark\":\"Тёмный (Beta)\",\"tw.blockColors.highContrast\":\"Высокий Контраст\",\"tw.blockColors.three\":\"Оригинал\",\"tw.blocks.PROCEDURES_DOCS\":\"Как использовать \\\\\"вернуть\\\\\"\",\"tw.blocks.PROCEDURES_RETURN\":\"вернуть {v}\",\"tw.blocks.PROCEDURES_TO_REPORTER\":\"Переключиться на Репортера\",\"tw.blocks.PROCEDURES_TO_STATEMENT\":\"Перейти к Заявлению\",\"tw.blocks.addons\":\"Аддоны\",\"tw.blocks.buttonIsDown\":\"[MOUSE_BUTTON] кнопка мыши нажата?\",\"tw.blocks.lastKeyPressed\":\"последняя нажатая клавиша\",\"tw.blocks.mouseButton.middle\":\"(1) средняя\",\"tw.blocks.mouseButton.primary\":\"(0) основная\",\"tw.blocks.mouseButton.secondary\":\"(2) дополнительная\",\"tw.blocks.openDocs\":\"Открыть Документацию\",\"tw.browserModal.desktopSettings\":\"Открыть Настройки Рабочего стола\",\"tw.browserModal.desktopTitle\":\"Система не поддерживается\",\"tw.browserModal.webgl1\":\" {APP_NAME} требует WebGL, однако ваш компьютер, похоже, не поддерживает его. Часто это временная ошибка, которую можно устранить, перезагрузив компьютер.\",\"tw.browserModal.webglBrowser\":\"Используйте последнюю версию Chrome, Firefox или Safari и убедитесь, что ваши графические драйверы обновлены. Вы также можете попробовать включить опцию \\\\\"графическое ускорение\\\\\" или \\\\\"аппаратное ускорение\\\\\" в настройках браузера.\",\"tw.browserModal.webglDesktop\":\"Вы также можете попробовать включить опцию \\\\\"ускорение графики\\\\\" в настройках рабочего стола:\",\"tw.cantUseCloud\":\"Хотя вы можете создавать облачные переменные, они не будут работать до тех пор, пока проект не будет загружен в Scratch или преобразован с помощью такого инструмента, как {packager}.\",\"tw.changeUsername.cannotChangeWhileRunning\":\"Имя пользователя не может быть изменено, пока проект запущен.\",\"tw.clipboard.danger\":\"Если ваш Буфер Обмена содержит такие штуки как пароли, проект сможет иметь к ним доступ чтобы поделиться с другими пользователями или серверами.\",\"tw.clipboard.permission\":\"Доступ к Буферу Обмена может не работать в некоторых браузерах. Если это разрешено, дальнейшее чтение из буфера обмена будет разрешено автоматически.\",\"tw.clipboard.title\":\"Этот проект хочет прочитать данные из вашего Буфера Обмена.\",\"tw.cloudProvider\":\"Сервер, предоставленный от {name}.\",\"tw.cloudServers\":\"Выберите сервер рядом с вами:\",\"tw.code\":\"Исходный Код\",\"tw.confirmIncompatibleExtension\":\"Это дополнение не совместимо со Scratch. Проекты, которые используют это дополнение, не могут быть опубликованы на сайт Scratch. Вы уверены, что хотите включить это дополнение?\",\"tw.createdBy\":\"Создано:\",\"tw.customCloudServer\":\"Пользование пользовательского сервера облачных переменных: {server}\",\"tw.customExtension.description\":\"Загружайте пользовательские расширения из URL-адресов, файлов, или исходного кода JavaScript.\",\"tw.customExtension.name\":\"Пользовательское Расширение\",\"tw.customExtensionModal.file\":\"Файлы\",\"tw.customExtensionModal.load\":\"Загрузить\",\"tw.customExtensionModal.promptFile\":\"Выберите или опустите файлы JavaScript расширения:\",\"tw.customExtensionModal.promptText\":\"Вставьте исходный код расширения JavaScript:\",\"tw.customExtensionModal.promptURL\":\"Введите URL-адрес расширения:\",\"tw.customExtensionModal.text\":\"Текст\",\"tw.customExtensionModal.title\":\"Загрузить Пользовательское Расширение\",\"tw.customExtensionModal.trusted\":\"Это расширение будет загружено без песочницы, поскольку оно получено из доверенного источника.\",\"tw.customExtensionModal.unsandboxed\":\"Запустить без песочницы\",\"tw.customExtensionModal.unsandboxedWarning1\":\"Загрузка расширений без режима песочницы опасно и не должна быть включена, если вы не знаете, что делаете.\",\"tw.customExtensionModal.unsandboxedWarning2\":\"Незашифрованные расширения могут повредить ваш проект, удалить ваши настройки, подделать пароли и другие плохие вещи. Разработчики {APP_NAME} не несут ответственности за любые возникающие проблемы.\",\"tw.customExtensionModal.untrusted\":\"Расширения с ненадежных URL-адресов всегда будут загружаться в изолированную среду для обеспечения безопасности.\",\"tw.customExtensionModal.url\":\"URL-адрес\",\"tw.customReporters.description\":\"Разрешить пользовательским блокам выводить значения и использовать их в качестве входных данных.\",\"tw.customReporters.name\":\"Пользовательские Репортеры\",\"tw.darkMode\":\"Поменять на Светлый Режим\",\"tw.desktopCloud\":\"В настольном приложении облачные переменные синхронизируются между всеми окнами настольного приложения на этом компьютере. Загрузите проект в Scratch или используйте инструмент, подобный {packager}, для их глобальной синхронизации.\",\"tw.documentation\":\"Документация\",\"tw.download.danger\":\"Этот файл не был рассмотрен разработчиками {APP_NAME}.\",\"tw.download.executable\":\"Этот файл выполнимого формата может содержать вредоносный код, если вы его запустите.\",\"tw.download.file\":\"Проект хочет скачать файл на ваш компьютер. Он будет сохранён как {name} в вашей папке скачиваний.\",\"tw.embed.persistent\":\"Если разрешить, дальнейшие вставки на тот же сайт будут разрешены автоматически.\",\"tw.embed.risks\":\"Хотя встраиваемое приложение будет изолировано, оно по-прежнему будет иметь доступ к информации о вашем устройстве, такой как ваш IP-адрес и общее местоположение.\",\"tw.embed.title1\":\"Проект хочет вставить HTML контент поверх всей сцены:\",\"tw.embed.title2\":\"Проект хочет вставить удаленный контент поверх всей сцены:\",\"tw.extension.faceSensing.description\":\"Распознавайте лица с помощью камеры.\",\"tw.extension.faceSensing.name\":\"Распознание Лиц\",\"tw.extensionGallery.error\":\"Ошибка загрузки галереи расширений. Посетите extensions.turbowarp.org чтобы найти больше расширений.\",\"tw.extensionGallery.loading\":\"Загрузка галереи расширений...\",\"tw.extensionGallery.more\":\"Почитать подробнее об расширениях на extensions.turbowarp.org.\",\"tw.extensionGallery.name\":\"Галерея {APP_NAME} Расширений\",\"tw.favorite\":\"Избраннуть\",\"tw.featuredProjectsStudio\":\"Посмотреть студию на Scratch.\",\"tw.feedback\":\"Обратная связь и Баги\",\"tw.feedbackButton\":\"Обратная Связь {APP_NAME}\",\"tw.fetch.title\":\"Проект хочет подключиться к сайту:\",\"tw.fileInput.none\":\"Нет выбранных файлов.\",\"tw.fileInput.selected\":\"Выбрано: {names}\",\"tw.fonts.add\":\"Добавить\",\"tw.fonts.custom.file\":\"Выберите файл шрифта с вашего компьютера:\",\"tw.fonts.custom.name\":\"Дать шрифту название:\",\"tw.fonts.custom1\":\"Добавить шрифт из файла\",\"tw.fonts.custom2\":\"Обычно не работает для Scratch. Поддерживаемые форматы: {formats}.\",\"tw.fonts.delete\":\"Вы уверены, что хотите удалить \\\\\"{font}\\\\\"? В любых векторных костюмах вместо этого будет использоваться резервный шрифт.\",\"tw.fonts.fallback\":\"Выберите резервный шрифт, который будет использоваться, если шрифт не загрузится или будет удален:\",\"tw.fonts.list\":\"Скачанные шрифты:\",\"tw.fonts.none\":\"Нету добавленных шрифтов\",\"tw.fonts.readError\":\"Не удалось прочитать файл шрифта: {error}\",\"tw.fonts.system\":\"Системный шрифт\",\"tw.fonts.system.name\":\"Введите название любого шрифта, встроенного в ваш компьютер. Шрифт может отображаться неправильно у всех.\",\"tw.fonts.system1\":\"Добавить системный шрифт\",\"tw.fonts.system2\":\"Может работать в Scratch, но не будет отображаться правильно у всех.\",\"tw.fonts.title\":\"Шрифты\",\"tw.footer.credits\":\"Благодарности\",\"tw.footer.disclaimer\":\"{APP_NAME} не связан со Scratch, командой Scratch или фондом Scratch Foundation.\",\"tw.footer.documentation\":\"Документация\",\"tw.footer.embed\":\"Встраивание\",\"tw.footer.parameters\":\"Параметры URL\",\"tw.footer.scratchDisclaimer\":\"Scratch - это проект Фонда Scratch Foundation. Он доступен бесплатно на сайте {scratchDotOrg}.\",\"tw.geolocate.permission\":\"Если разрешить, вашему браузеру может быть предложено разрешить доступ к местоположению.\",\"tw.geolocate.title\":\"Проект хочет знать ваше местоположение.\",\"tw.gui.crashMessage.description\":\"Нам очень жаль, но похоже, что страница дала сбой. Пожалуйста, обновите страницу, чтобы повторить попытку.\",\"tw.gui.defaultProjectTitle\":\"Проект\",\"tw.guiDefaultTitle\":\"Запускайте проекты Scratch быстрее\",\"tw.home.credit\":\"Примечания и Благодарности\",\"tw.home.description\":\"{APP_NAME} - это мод на Scratch, который компилирует проекты в JavaScript, чтобы они работали быстрее. Попробуйте ввести ссылку на проект выше или выберете из избранных проектов ниже.\",\"tw.home.instructions\":\"Инструкции\",\"tw.input.tooltip\":\"Скопируйте ссылку на проект Scratch и вставьте её сюда!\",\"tw.interpolationEnabled\":\"Интерполяция\",\"tw.invalidParameters.clones\":\"Параметр \\\\\"clone\\\\\" в URL-адресе некорректен\",\"tw.invalidParameters.fps\":\"Параметр \\\\\"fps\\\\\" в URL-адресе некорректен\",\"tw.invalidProject.error\":\"Не удалось загрузить проект:\",\"tw.invalidProject.options\":\"Вы возможно не сможете восстановить старые версии проекта из автоматических точек восстановления или других резервных копий.\",\"tw.invalidProject.reportIt\":\"сообщите об этом\",\"tw.invalidProject.restorePoints\":\"Посмотреть Точки Восстановления\",\"tw.invalidProject.sb3fix\":\"использовать sb3fix, чтобы восстановить ваш проект\",\"tw.invalidProject.title\":\"Ошибка\",\"tw.invalidProject.validationError\":\"Эта ошибка появляется тогда, когда маленькая часть проекта была заражена, но в остальное правильно. Это легко можно починить так, пожалуйста, {reportIt}.\",\"tw.invalidProject.zipCorruption\":\"Эта ошибка часто означает, что файл был повреждён, возможно, из-за неисправного устройства хранения данных, отключения питания или извлечения USB-накопителя без предварительного отключения. Попробуйте {usingSb3fix}, так как это может помочь устранить ошибку такого типа.\",\"tw.lightMode\":\"Поменять на Тёмный Режим\",\"tw.loadExtension.embedded\":\"Проект хочет загрузить пользовательское расширение с кодом:\",\"tw.loadExtension.sandboxed\":\"Хотя код будет изолирован, он по-прежнему будет иметь доступ к информации о вашем устройстве, такое как ваш IP адрес и общее местоположение. Прежде чем продолжить, убедитесь, что вы доверяете автору этого расширения.\",\"tw.loadExtension.unsandboxed\":\"Запустить без песочницы\",\"tw.loadExtension.unsandboxedWarning\":\"Загрузка расширений без песочницы опасна. Это может привести к повреждению вашего проекта, удалению настроек, вымогательству паролей и другим плохим вещам. Разработчики {APP_NAME} не несут ответственности за любые возникающие проблемы.\",\"tw.loadExtension.url\":\"Проект хочет загрузить пользовательское расширение из URL-адреса:\",\"tw.loader.downloadingAssets\":\"Скачивание ресурсов ({complete} / {total}) ...\",\"tw.loader.loadingAssets\":\"Загрузка ресурсов ({complete}/{total})...\",\"tw.loader.projectData\":\"Загрузка проекта ...\",\"tw.menuBar.60off\":\"Выключить режим 60 FPS\",\"tw.menuBar.60on\":\"Включить режим 60 FPS\",\"tw.menuBar.accent\":\"Акцент\",\"tw.menuBar.addons\":\"Аддоны\",\"tw.menuBar.advanced\":\"Дополнительно\",\"tw.menuBar.blockColors\":\"Цвета Блоков\",\"tw.menuBar.changeUsername\":\"Изменить Имя Пользователя\",\"tw.menuBar.cloudOff\":\"Отключить облачные переменные\",\"tw.menuBar.cloudOn\":\"Включить облачные переменные\",\"tw.menuBar.cloudUnavailable\":\"Облачные переменные Недоступны\",\"tw.menuBar.cloudUnavailableAlert\":\"Невозможно использовать облачные переменные, скорее всего, потому, что вы открыли редактор.\",\"tw.menuBar.desktopSettings\":\"Настройки Рабочего Места\",\"tw.menuBar.moreSettings\":\"Расширенные Настройки\",\"tw.menuBar.newFramerate\":\"Новая частота кадров:\",\"tw.menuBar.newWindow\":\"Новое окно\",\"tw.menuBar.package\":\"Упаковать проект\",\"tw.menuBar.reportError1\":\"В некоторых скриптах возникли ошибки.\",\"tw.menuBar.reportError2\":\"Это баг. Пожалуйста, сообщите о ней.\",\"tw.menuBar.restorePoints\":\"Точки восстановления\",\"tw.menuBar.saveAs\":\"Сохранить как {file}\",\"tw.menuBar.seeInside\":\"Войти внутрь проекта\",\"tw.mono\":\"Моно\",\"tw.moreCloud\":\"Узнать побольше об облачных переменных.\",\"tw.notify.permission\":\"Если разрешить, ваш браузер может предложить вам включить уведомления, и дальнейшие уведомления будут разрешены автоматически.\",\"tw.notify.title\":\"Проект хочет отображать уведомления.\",\"tw.oldDownload\":\"Сохранить в отдельный файл...\",\"tw.opcode.2000\":\"дни с 2000 года\",\"tw.opcode.mousedown\":\"колесо нажато?\",\"tw.opcode.mousex\":\"x курсора\",\"tw.opcode.mousey\":\"y курсора\",\"tw.openAdvanced\":\"Открыть расширенные настройки\",\"tw.openWindow.dangerous\":\"Этот веб-сайт не проверялся разработчиками {APP_NAME}. Он может содержать опасный или вредоносный код.\",\"tw.openWindow.title\":\"Проект хочет открыть новое окно или вкладку с URL-адресом:\",\"tw.paint.alpha\":\"Непрозрачность\",\"tw.paint.fonts.more\":\"Добавить больше шрифтов…\",\"tw.pen.stageSelected\":\"Выбран этап: меньше блоков пера\",\"tw.privacy\":\"Политика Конфиденциальности\",\"tw.recordAudio.permission\":\"Если разрешить, вашему браузеру может быть предложено включить доступ к микрофону, и дальнейший доступ к микрофону будет разрешен автоматически.\",\"tw.recordAudio.title\":\"Проект хочет записать аудио с вашего микрофона. Это может включать текстовую расшифровку или необработанные аудиоданные. Проект может иметь возможность обмениваться аудио с другими пользователями или серверами.\",\"tw.recordVideo.permission\":\"Если разрешить, вам может быть предложено включить доступ к камере в вашем браузере, и дальнейший доступ к камере будет разрешен автоматически.\",\"tw.recordVideo.title\":\"Проект хочет записать видео с вашей камеры. Возможно, проект сможет обмениваться изображениями с другими пользователями или серверами.\",\"tw.redirect.dangerous\":\"Этот веб-сайт не проверялся разработчиками {APP_NAME}. Он может содержать опасный или вредоносный код.\",\"tw.redirect.title\":\"Проект хочет перейти на эту вкладку по URL-адресу:\",\"tw.removedTrademarks\":\"Некоторые товары, содержащие товарные знаки Scratch, больше не перечислены здесь.\",\"tw.restorePoints.1minute\":\"каждую минуту\",\"tw.restorePoints.assets\":\"Ресурсы {n}\",\"tw.restorePoints.confirmDelete\":\"Вы уверены, что хотите удалить \\\\\"{projectTitle}\\\\\"? Это невозможно отменить.\",\"tw.restorePoints.confirmDeleteAll\":\"Вы уверены, что хотите удалить ВСЕ точки восстановления? Это невозможно отменить.\",\"tw.restorePoints.confirmLoad\":\"У вас есть несохраненные изменения. Заменить проект который сейчас редактируется?\",\"tw.restorePoints.deleteAll\":\"Удалить Всё\",\"tw.restorePoints.description\":\"{APP_NAME} периодически сохраняет точки восстановления на вашем компьютере, чтобы помочь восстановить ваш проект, если вы забудете сохранить. Это предназначено в качестве последнего средства для восстановления. Ваш компьютер может автоматически удалить эти точки восстановления в любое время. НЕ полагайтесь на эту функцию.\",\"tw.restorePoints.empty\":\"Точки восстановления не найдены.\",\"tw.restorePoints.error\":\"Ошибка загрузки точки восстановления: {error}\",\"tw.restorePoints.exportError\":\"Ошибка при экспорте точки восстановления: {error}\",\"tw.restorePoints.intervalOption\":\"Точки восстановления созданы {time}.\",\"tw.restorePoints.loading\":\"Загрузка...\",\"tw.restorePoints.minutes\":\"каждые {n} минут\",\"tw.restorePoints.never\":\"никогда\",\"tw.restorePoints.off\":\"Выключать точки восстановления опасно.\",\"tw.restorePoints.size\":\"Предполагаемый объем используемого хранилища: {size}\",\"tw.restorePoints.size2\":\"Костюмы или звуки, используемые несколькими точками восстановления, сохраняются только один раз.\",\"tw.restorePoints.title\":\"Точки Восстановления\",\"tw.sample\":\"Пример Проекта\",\"tw.saveAs\":\"Сохранить как...\",\"tw.saveTo\":\"Сохранить в {file}\",\"tw.scratchUnsafeCloud\":\"Если вы сделаете эту облачную переменную, проект превысит лимит Scratch в {number} переменных, и некоторые переменные не будут работать, если вы загрузите проект в Scratch.\",\"tw.securityManager.allow\":\"Разрешить\",\"tw.securityManager.deny\":\"Запретить\",\"tw.securityManager.title\":\"Расширение Безопасности\",\"tw.securityManager.trust\":\" Если разрешить, дальнейшие запросы на тот же сайт будут разрешены автоматически.\",\"tw.securityManager.why\":\"Это может быть использовано для загрузки изображений или звуков, реализации многопользовательской игры, доступа к API или в злонамеренных целях. При этом веб-сайт получит доступ к вашему IP-адресу, общему местоположению и, возможно, другим данным.\",\"tw.settingsModal.customStageSize\":\"Пользовательский размер сцены:\",\"tw.settingsModal.customStageSizeHelp\":\"Изменяет размер сцены из 480х360 на что-то другое. Попробуйте использовать 640х360, чтобы сделать сцену широкоэкранной. Лишь некоторые проекты будут работать правильно с этой настройкой.\",\"tw.settingsModal.dangerZone\":\"Опасная Зона\",\"tw.settingsModal.disableCompiler\":\"Отключить Компилятор\",\"tw.settingsModal.disableCompilerHelp\":\"Отключает компилятор {APP_NAME}. Возможно, вы захотите включить это при редактировании проектов, чтобы скрипты обновлялись немедленно. В противном случае вам никогда не следует включать это.\",\"tw.settingsModal.featured\":\"Избранное\",\"tw.settingsModal.fps\":\"60 FPS (Пользовательское FPS)\",\"tw.settingsModal.fpsHelp\":\"Выполняет скрипты 60 раз в секунду вместо 30. Большинство проектов не будут работать должным образом, если этот параметр включен. Если это так, вам следует попробовать интерполяцию с отключенным режимом 60 FPS. {customFramerate}.\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Нажмите, чтобы использовать частоту кадров другую, чем 30 или 60\",\"tw.settingsModal.help\":\"Нажмите для справки\",\"tw.settingsModal.highQualityPen\":\"Перо в Высоком Качестве\",\"tw.settingsModal.highQualityPenHelp\":\"Позволяет выполнять рендеринг проектов пера с более высоким разрешением и отключает некоторое округление координат в редакторе. Этот параметр полезен не для всех проектов, и это может повлиять на производительность.\",\"tw.settingsModal.infiniteClones\":\"Бесконечные клоны\",\"tw.settingsModal.infiniteClonesHelp\":\"Отключает ограничение Scratch в 300 клонов.\",\"tw.settingsModal.interpolation\":\"Интерполяция\",\"tw.settingsModal.interpolationHelp\":\"Делает, чтобы проекты производились более плавно, интерполируя движение спрайтов. Не используйте интерполяцию в 3D проектах, проектах с трассировкой лучей, проектах, выполненных пером и медленных проектах, интерполяция сделает их медленнее и не сделает их более плавными.\",\"tw.settingsModal.largeStageWarning\":\"Использовать настолько большой пользовательский размер сцены не рекомендуется! Лучше, используйте сцену меньшего размера, но с таким же соотношением сторон изображения и дайте полноэкранному режиму увеличить сцену так, чтобы она могла подойти по размерам к дисплею пользователя.\",\"tw.settingsModal.removeFencing\":\"Убрать Рамку\",\"tw.settingsModal.removeFencingHelp\":\"Позволяет спрайтам выходить за рамки сцены, становится настолько большими или маленькими, насколько они захотят, и делает, чтобы блоки касания работали за рамками сцены.\",\"tw.settingsModal.removeLimits\":\"Убрать Ограничения\",\"tw.settingsModal.removeMiscLimits\":\"Удалить Разные Ограничения\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Убирает лимиты звуков и размера пера.\",\"tw.settingsModal.storeProjectOptions\":\"Сохранить настройки проекта\",\"tw.settingsModal.storeProjectOptionsHelp\":\"Сохранение выбранных настроек в проекте, чтобы они автоматически применялись при загрузке этого проекта TurboWarp\\'ом. Warp-таймер и отключение компилятора не будут сохранены.\",\"tw.settingsModal.title\":\"Расширенные Настройки\",\"tw.settingsModal.warpTimer\":\"Warp Таймер\",\"tw.settingsModal.warpTimerHelp\":\"Проверяет, какие скрипты застряли в долгом или бесконечном цикле и понижает частоту кадров, вместо того, чтобы он застыл пока цикл не завершится. Исправляет большую часть критических ошибок, но это негативно отражается на скорости проекта, поэтому он включается по умолчанию только в редакторе.\",\"tw.soundEditorNotSupported\":\"Редактор звука не поддерживается в этом браузере.\",\"tw.spriteSelectorItem.rename\":\"переименовать\",\"tw.stageHeader.full\":\"Поменять на полную сцену\",\"tw.stereo\":\"Стерео\",\"tw.stereoAlert\":\"Редактирование этого стерео звука необратимо преобразует его в моно звук.\",\"tw.studioview.authorAttribution\":\"от {author}\",\"tw.studioview.error\":\"Произошла ошибка во время загрузки следующей страницы проектов.\",\"tw.studioview.hoverText\":\"{title} от {author}\",\"tw.tooLarge\":\"Этот звук может быть слишком большим для загрузки в Scratch.\",\"tw.twExtension.description\":\"Новые странные блоки.\",\"tw.twExtension.name\":\"Блоки {APP_NAME}\",\"tw.unfavorite\":\"Отизбраннуть\",\"tw.unknownPlatform.1\":\"Проект был сделан для другой платформы:\",\"tw.unknownPlatform.2\":\"Совместимость с {APP_NAME} не гарантирована. Вы можете продолжить на свой страх и риск, но мы не сможем гарантировать помощь при встрече с какими либо проблемами.\",\"tw.unknownPlatform.continue\":\"Я понимаю\",\"tw.unknownPlatform.title\":\"Неизвестная Платформа\",\"tw.unshared.2\":\"Для получения большей информации посетите этот сайт: {link}\",\"tw.unshared.bug\":\"Если этот проект вообще является общим, пожалуйста, сообщите об этом.\",\"tw.unshared.cache\":\"Если проект был опубликован недавно, то это сообщение может ложно отображаться в течение нескольких минут.\",\"tw.unshared2.1\":\"Личные/Приватные проекты больше не видимы.\",\"tw.usernameModal.help\":\"Это значение будет сохранено в данных вашего браузера. Оно будет использоваться, когда вы используете проекты, в которых есть облачные переменные.\",\"tw.usernameModal.help2\":\"Значения, которые не соответствуют настоящим именам пользователя будут заблокированными сервером облачных переменных. Мы рекомендуем оставлять это значение, которым оно есть или изменять его на своё имя пользователя в Scratch.\",\"tw.usernameModal.mustChange\":\"Извините, сервер облачных переменных считает, что ваше имя пользователя может быть небезопасным. Измените имя пользователя на {resetIt} или другое.\",\"tw.usernameModal.mustChange.resetIt\":\"сбросить это (рекомендуется)\",\"tw.usernameModal.new\":\"Новое имя пользователя:\",\"tw.usernameModal.reset\":\"Сбросить\",\"tw.usernameModal.title\":\"Изменить Имя Пользователя\",\"tw.usesCloudVariables\":\"Этот проект использует облачные переменные.\",\"tw.usesCloudVariables2\":\"Облачные переменные {APP_NAME} не подключены к Scratch. Любой может {changeTheirUsername} на что угодно, поэтому остерегайтесь олицетворения.\",\"tw.usesCloudVariables2.change\":\"изменить их же имя пользователя\",\"tw.viewFeaturedProjects\":\"Нажмите, чтобы посмотреть избранные проекты.\",\"tw.viewOnScratch\":\"Посмотреть проект на Scratch\"},\"sk\":{\"tw.feedbackButton\":\"{APP_NAME} Spätná väzba\",\"tw.interpolationEnabled\":\"Interpolácia\",\"tw.menuBar.moreSettings\":\"Pokročilé Nastavenia\",\"tw.paint.alpha\":\"priehľadnosť\",\"tw.settingsModal.fps\":\"60 FPS (Vlastné FPS)\",\"tw.settingsModal.fpsHelp\":\"Spúšťa scenáre 60 krát za sekundu namiesto 30. Väčšina projektov nefunguje pri použití tohto nastavenia, ak je tak aj v tvojom prípade, skús použiť Interpoláciu s vypnutým módom 60 FPS. {customFramerate}.\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Klikni pre použitie rýchlosti snímkov inej ako 30 alebo 60 FPS\",\"tw.settingsModal.highQualityPen\":\"Vysoká Kvalita Pera\",\"tw.settingsModal.highQualityPenHelp\":\"Umožňuje \\\\\"pen\\\\\" projektom, aby sa renderovali vo vyšších rozlíšeniach a zabraňuje niektoré zaokrúhľovania súradníc v editore. Nie všetky projekty benefitujú z tohto nastavenia a môže to ovplyvniť výkonnosť.\",\"tw.settingsModal.interpolation\":\"Interpolácia\",\"tw.settingsModal.interpolationHelp\":\"Spraví projekt plynulejší interpolovaním pohybu postavy. Interpolácia by nemala byť použitá pre 3D projekty, raytracery, \\\\\"pen\\\\\" projekty a sekajúce projekty, pretože interpolácia ich spomalí bez zlepšenia plynulosti.\",\"tw.settingsModal.title\":\"Pokročilé Nastavenia\",\"tw.stageHeader.full\":\"Prepni na veľkú scénu\"},\"sl\":{\"tw.accent.blue\":\"Modra\",\"tw.accent.purple\":\"Vijolična\",\"tw.accent.rainbow\":\"Mavrica\",\"tw.accent.red\":\"Rdeča\",\"tw.alerts.creatingRestorePoint\":\"Ustvarjanje obnovitvene različice...\",\"tw.alerts.savedToDisk\":\"Shranjeno na računalnik.\",\"tw.backpack.rename\":\"Novo ime:\",\"tw.blockColors.custom\":\"Prilagodi v nastavitvah dodatkov\",\"tw.blocks.PROCEDURES_DOCS\":\"Kako uporabljati blok Vrni\",\"tw.blocks.PROCEDURES_RETURN\":\"vrni {v}\",\"tw.blocks.addons\":\"Dodatki\",\"tw.blocks.buttonIsDown\":\"[MOUSE_BUTTON] miškina tipka pritisnjena?\",\"tw.blocks.lastKeyPressed\":\"zadnja pritisnjena tipka\",\"tw.blocks.mouseButton.middle\":\"(1) srenja\",\"tw.blocks.mouseButton.primary\":\"(0) glavna\",\"tw.blocks.mouseButton.secondary\":\"(2) sekundarna\",\"tw.blocks.openDocs\":\"Odpri dokumentacijo\",\"tw.changeUsername.cannotChangeWhileRunning\":\"Uporabniškega imena ni mogoče spremeniti med izvajanjem projekta.\",\"tw.clipboard.danger\":\"Če vaše odložišče vsebuje zaupne podatke, kot so gesla, jih bo projekt lahko delil z drugimi uporabniki ali strežniki.\",\"tw.clipboard.permission\":\"V nekaterih brskalnikih dostop do odložišča ne deluje. Če dostop dovolite, bo samodejno dovoljeno tudi nadaljnje branje z odložišča.\",\"tw.clipboard.title\":\"Ta projekt želi brati podatke z vašega odložišča.\",\"tw.cloudServers\":\"Izberite strežni blizu vas:\",\"tw.code\":\"Izvirna koda\",\"tw.confirmIncompatibleExtension\":\"Ta razširitev ni združljiva s Scratchem. Projektov, narejenih z njo, ni mogoče naložiti na Scratchevo spletno stran. Ste prepričani, da jo želite vključiti?\",\"tw.createdBy\":\"Avtorji:\",\"tw.customExtension.name\":\"Razširitev po meri\",\"tw.customExtensionModal.file\":\"Datoteke\",\"tw.customExtensionModal.load\":\"Naloži\",\"tw.customExtensionModal.promptFile\":\"Izberite ali povlecite datoteke JavaScript:\",\"tw.customExtensionModal.promptText\":\"Prilepite izvirno kodo JavaScript:\",\"tw.customExtensionModal.promptURL\":\"Vnesite URL razširitve:\",\"tw.customExtensionModal.text\":\"Besedilo\",\"tw.customExtensionModal.title\":\"Naloži razširitev po meri\",\"tw.customExtensionModal.unsandboxedWarning1\":\"Nalaganje razširitev brez peskovnika je nevarno, zato ga ne vključite, če ne veste, kaj to pomeni.\",\"tw.customExtensionModal.unsandboxedWarning2\":\"Razširitve zunaj peskovnika lahko pokvarijo projekt, izbrišejo vaše nastavitve, kradejo gesla in delajo druge slabe stvari. Razvijalci aplikacije {APP_NAME} niso odgovorni za težave, ki jih to povzroči.\",\"tw.darkMode\":\"Spremeni v svetli način\",\"tw.documentation\":\"Dokumentacija\",\"tw.download.danger\":\"Te datoteke razvijalci aplikacije {APP_NAME} niso pregledali.\",\"tw.download.executable\":\"To je izvedljiva datoteka, ki lahko vsebuje škodljivo kodo, če jo zaženete.\",\"tw.download.file\":\"Ta projekt želi prenesti datoteko na vaš računalnik. Shranjena bo kot {name} v vašo mapo s prenosi.\",\"tw.extensionGallery.error\":\"Napaka pri nalaganju galerije razširitev. Za več razširitev obiščite extensions.turbowarp.org.\",\"tw.extensionGallery.loading\":\"Nalaganje galerije razširitev...\",\"tw.extensionGallery.name\":\"Galerija razširitev za {APP_NAME}\",\"tw.featuredProjectsStudio\":\"Ogled studia na Scratchu.\",\"tw.feedback\":\"Povratne informacije in napake\",\"tw.feedbackButton\":\"Povratne informacije o {APP_NAME}\",\"tw.fetch.title\":\"Ta projekt se želi povezati s spletno stranjo:\",\"tw.fileInput.none\":\"Nobena datoteka ni izbrana.\",\"tw.fileInput.selected\":\"Izbrano: {names}\",\"tw.fonts.add\":\"Dodaj\",\"tw.fonts.custom.file\":\"Izberite datoteko s pisavo s svojega računalnika:\",\"tw.fonts.custom.name\":\"Poimenujte pisavo:\",\"tw.fonts.custom1\":\"Dodaj povezavo iz datoteke\",\"tw.fonts.custom2\":\"Verjetno ne bo delovala v Scratchu. Podprte oblike: {formats}.\",\"tw.fonts.list\":\"Nameščene pisave:\",\"tw.fonts.none\":\"Nobena pisava še ni dodana.\",\"tw.fonts.readError\":\"Branje datoteke s pisavo ni uspelo: {error}\",\"tw.fonts.system\":\"Sistemska pisava\",\"tw.fonts.system.name\":\"Vnesite ime katere koli pisave, ki je vgrajena v vaš računalnik. Pisave morda ne bodo vsi videli pravilno.\",\"tw.fonts.system1\":\"Dodaj sistemsko pisavo\",\"tw.fonts.system2\":\"Morda bo delovala v Scratchu, vendar je ne bodo vsi videli pravilno.\",\"tw.fonts.title\":\"Pisave\",\"tw.footer.credits\":\"Zasluge\",\"tw.footer.disclaimer\":\"{APP_NAME} ni povezan s Scratchem, skupino Scratch ali fundacijo Scratch.\",\"tw.footer.documentation\":\"Dokumentacija\",\"tw.footer.embed\":\"Vgraditev\",\"tw.footer.parameters\":\"URL parametri\",\"tw.footer.scratchDisclaimer\":\"Scratch je projekt fundacije Scratch Foundation. Brezplačno je na voljo na {scratchDotOrg}.\",\"tw.geolocate.permission\":\"Če to omogočite, vas bo brskalnik morda vprašal, če dovolite dostop do lokacije.\",\"tw.geolocate.title\":\"Ta projekt želi uporabljati vašo lokacijo.\",\"tw.gui.crashMessage.description\":\"Žal je videti, da je na tej strani prišlo do napake. Prosimo, da znova naložite stran, če želite poskusiti znova.\",\"tw.gui.defaultProjectTitle\":\"Projekt\",\"tw.guiDefaultTitle\":\"Izvedite Scratcheve projekte hitreje\",\"tw.home.credit\":\"Opombe in zasluge\",\"tw.home.description\":\"{APP_NAME} je spremenjena različica Scratcha, ki prevede projekte v JavaScript, da delujejo zelo hitro. Preizkusite ga tako, da zgoraj vnesete ID ali URL projekta ali pa spodaj izberete enega od izpostavljenih projektov.\",\"tw.home.instructions\":\"Navodila\",\"tw.input.tooltip\":\"Prilepite povezavo na Scratchev projekt sem!\",\"tw.interpolationEnabled\":\"Interpolacija\",\"tw.invalidParameters.clones\":\"Parameter \\\\\"clone\\\\\" v URL-ju ni veljaven\",\"tw.invalidParameters.fps\":\"Parameter \\\\\"fps\\\\\" v URL-ju ni veljaven\",\"tw.invalidProject.error\":\"Nalaganje projekta ni uspelo:\",\"tw.invalidProject.reportIt\":\"prijavite\",\"tw.invalidProject.title\":\"Napaka\",\"tw.invalidProject.validationError\":\"Ta napaka pogosto pomeni, da je majhen del projekta pokvarjen, čeprav sicer ni nič narobe. To je včasih enostavno popraviti, zato prosimo, da napako {reportIt}.\",\"tw.lightMode\":\"Spremeni v temni način\",\"tw.loadExtension.embedded\":\"Ta projekt želi naložiti razširitev po meri s kodo:\",\"tw.loadExtension.sandboxed\":\"Čeprav bo koda v peskovniku, bo imela dostop do podatkov o vaši napravi, kot je IP naslov in približna lokacija. Prepričajte se, da zaupajte avtorju te razširitve, preden nadaljujete.\",\"tw.loadExtension.unsandboxedWarning\":\"Nalaganje razširitev brez peskovnika je nevarno. Razširitev lahko pokvari projekt, izbriše vaše nastavitve, krade gesla in dela druge slabe stvari. Razvijalci aplikacije {APP_NAME} niso odgovorni za težave, ki jih to povzroči.\",\"tw.loadExtension.url\":\"Ta projekt želi naložiti razširitev po meri z URL-ja:\",\"tw.loader.downloadingAssets\":\"Nalaganje projekta ({complete}/{total}) ...\",\"tw.loader.loadingAssets\":\"Nalaganje videzov in zvokov ({complete}/{total}) ...\",\"tw.loader.projectData\":\"Nalaganje projekta ...\",\"tw.menuBar.60off\":\"Izključi 60 FPS način\",\"tw.menuBar.60on\":\"Vključi 60 FPS način\",\"tw.menuBar.accent\":\"Barva poudarkov\",\"tw.menuBar.addons\":\"Dodatki\",\"tw.menuBar.advanced\":\"Napredno\",\"tw.menuBar.blockColors\":\"Barve blokov\",\"tw.menuBar.changeUsername\":\"Spremeni uporabniško ime\",\"tw.menuBar.cloudOff\":\"Onemogoči spremenljivke v oblaku\",\"tw.menuBar.cloudOn\":\"Omogoči spremenljivke v oblaku\",\"tw.menuBar.cloudUnavailable\":\"Spremenljivke v oblaku niso na voljo\",\"tw.menuBar.cloudUnavailableAlert\":\"Ni mogoče uporabiti spremenljivk v oblaku, verjetno zato, ker ste odprli urejevalnik\",\"tw.menuBar.desktopSettings\":\"Nastavitve namizne različice\",\"tw.menuBar.moreSettings\":\"Napredne nastavitve\",\"tw.menuBar.newFramerate\":\"Nov FPS:\",\"tw.menuBar.newWindow\":\"Novo okno\",\"tw.menuBar.package\":\"Zapakiraj projekt\",\"tw.menuBar.reportError1\":\"V nekaterih skriptah je prišlo do napake.\",\"tw.menuBar.reportError2\":\"To je napaka. Prosimo, da jo prijavite.\",\"tw.menuBar.saveAs\":\"Shrani kot {file}\",\"tw.menuBar.seeInside\":\"Poglej v\",\"tw.notify.permission\":\"Če to dovolite, vas bo brskalnik morda vprašal, ali želite omogočiti obvestila. Nadaljnja obvestila bodo samodejno omogočena.\",\"tw.notify.title\":\"Ta projekt želi prikazovati obvestila.\",\"tw.oldDownload\":\"Shrani v ločeno datoteko...\",\"tw.opcode.2000\":\"dni od leta 2000\",\"tw.opcode.mousedown\":\"je miškin gumb pritisnjen?\",\"tw.opcode.mousex\":\"miškin x\",\"tw.opcode.mousey\":\"miškin y\",\"tw.openAdvanced\":\"Odpri napredne nastavitve\",\"tw.openWindow.dangerous\":\"Te spletne strani razvijalci aplikacije {APP_NAME} niso pregledali. Lahko vsebuje nevarno ali škodljivo kodo.\",\"tw.openWindow.title\":\"Ta projekt želi odpreti novo okno ali zavihek z URL-jem:\",\"tw.paint.alpha\":\"Neprosojnost\",\"tw.paint.fonts.more\":\"Dodaj več pisav...\",\"tw.pen.stageSelected\":\"Izbran oder: manj blokov za svinčnik\",\"tw.privacy\":\"Politika zasebnosti\",\"tw.recordVideo.permission\":\"Če to dovolite, vas bo brskalnik morda vprašal, ali želite omogočiti dostop do kamere. Nadaljnji dostop bo samodejno dovoljen.\",\"tw.recordVideo.title\":\"Ta projekt želi snemati video z vašo kamero. Projekt lahko deli slike z drugimi uporabniki ali strežniki.\",\"tw.redirect.dangerous\":\"Te spletne strani razvijalci aplikacije {APP_NAME} niso pregledali. Lahko vsebuje nevarno ali škodljivo kodo.\",\"tw.redirect.title\":\"Ta projekt želi v tem zavihku odpreti URL:\",\"tw.removedTrademarks\":\"Nekateri predmeti, ki so vsebovali Scratcheve blagovne znamke, niso več na tem seznamu.\",\"tw.restorePoints.1minute\":\"vsako minuto\",\"tw.restorePoints.assets\":\"{n} slik in zvokov\",\"tw.restorePoints.deleteAll\":\"Izbriši vse\",\"tw.restorePoints.loading\":\"Nalaganje...\",\"tw.restorePoints.minutes\":\"vsakih {n} minut\",\"tw.restorePoints.never\":\"nikoli\",\"tw.restorePoints.size\":\"Ocena porabljenega prostora: {size}\",\"tw.sample\":\"Primer projekta\",\"tw.saveAs\":\"Shrani kot...\",\"tw.saveTo\":\"Shrani v {file}\",\"tw.scratchUnsafeCloud\":\"Če naredite to spremenljivko v oblaku, bo projekt prekoračil Scratchevo omejitev {number} spremenljivk. Nekatere spremenljivke ne bodo delovale, če projekt naložite v Scratch.\",\"tw.securityManager.allow\":\"Dovoli\",\"tw.securityManager.deny\":\"Ne dovoli\",\"tw.securityManager.title\":\"Varnost razširitev\",\"tw.securityManager.trust\":\"Če dostop dovolite, bodo nadaljnje povezave z isto stranjo samodejno dovoljene.\",\"tw.securityManager.why\":\"To lahko uporablja za prenos slik ali zvokov, igre z več igralci, dostop do programskih vmesnikov ali za škodljive namene. S spletno stranjo bo deljen vaš IP naslov, približna lokacija in morda še drugi podatki.\",\"tw.settingsModal.customStageSize\":\"Velikost odra po meri:\",\"tw.settingsModal.customStageSizeHelp\":\"Spremeni velikost Scratchevega odra iz običajne 480x360. Poskusite 640x360 za širokozaslonski prikaz. Samo zelo redki projekti se pravilno prilagodijo tej nastavitvi.\",\"tw.settingsModal.dangerZone\":\"Nevarno območje\",\"tw.settingsModal.disableCompiler\":\"Onemogoči prevajalnik\",\"tw.settingsModal.disableCompilerHelp\":\"Izključi prevajalnik {APP_NAME}. Morda boste to potrebovali med urejanjem projektov, da se skripte takoj posodobijo. Sicer je bolje, da te možnosti ne vključite.\",\"tw.settingsModal.featured\":\"Izpostavljeno\",\"tw.settingsModal.fps\":\"60 FPS (FPS po meri)\",\"tw.settingsModal.fpsHelp\":\"Izvede skripte 60-krat na sekundo namesto 30-krat. Večina projektov ne deluje pravilno, če je ta nastavitev omogočena. V tem primeru preizkusite interpolacijo namesto 60 FPS načina. {customFramerate}.\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Kliknite, da uporabite hitrost, ki ni 30 ali 60 FPS\",\"tw.settingsModal.help\":\"Kliknite za pomoč\",\"tw.settingsModal.highQualityPen\":\"Visoka ločljivost svinčnika\",\"tw.settingsModal.highQualityPenHelp\":\"Poveča ločljivost projektov, ki uporabljajo razširitev Svinčnik, in odstrani zaokroževanje koordinat v urejevalniku. Ta nastavitev ni primerna za vse projekte in lahko vpliva na hitrost delovanja.\",\"tw.settingsModal.infiniteClones\":\"Neskončno klonov\",\"tw.settingsModal.infiniteClonesHelp\":\"Odstrani Scratchevo omejitev 300 klonov.\",\"tw.settingsModal.interpolation\":\"Interpolacija\",\"tw.settingsModal.interpolationHelp\":\"S pomočjo interpolacije naredi gibanje figur bolj tekoče. Interpolacije ne uporabljajte za 3D projekte, projekte, ki uporabljajo svinčnik in počasne projekte. Zaradi interpolacije delovali počasneje, ne da bi izgledali bolje.\",\"tw.settingsModal.largeStageWarning\":\"Uporaba tako velikega odra ni priporočena! Namesto tega nastavite manjšo velikost z istim razmerjem stranic, saj jo bo celozaslonski način povečal, da jo prilagodi uporabnikovemu zaslonu.\",\"tw.settingsModal.removeFencing\":\"Odstrani omejitve premikanja figur\",\"tw.settingsModal.removeFencingHelp\":\"Omogoči figuram, da se premaknejo ven iz odra in postanejo poljubno velike ali majhne ter omogoči uporabo blokov za zaznavanje dotikanja zunaj odra.\",\"tw.settingsModal.removeLimits\":\"Odstrani omejitve\",\"tw.settingsModal.removeMiscLimits\":\"Odstrani razne omejitve\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Odstrani omejitve zvočnih učinkov in velikosti svinčnika.\",\"tw.settingsModal.storeProjectOptions\":\"Shrani nastavitve v projektu\",\"tw.settingsModal.storeProjectOptionsHelp\":\"Shrani izbrane nastavitve v projektu. TurboWarp jih bo uporabil, ko naslednjič naloži ta projekt. Warp timer in onemogočen prevajalnik ne bosta shranjena.\",\"tw.settingsModal.title\":\"Napredne nastavitve\",\"tw.settingsModal.warpTimerHelp\":\"Preveri, če pride do dolge ali neskončne zanke, in v tem primeru zmanjša hitrost osveževanja zaslona, namesto da bi skripto zamrznil. To pogosto prepreči sesutje, vendar vpliva na hitrost projekta, zato običajno ni vključeno zunaj urejevalnika.\",\"tw.soundEditorNotSupported\":\"Urejanje zvokov v tem brskalniku ni podprto.\",\"tw.spriteSelectorItem.rename\":\"preimenuj\",\"tw.studioview.authorAttribution\":\"{author}\",\"tw.studioview.error\":\"Pri nalaganju naslednje strani projektov je prišlo do napake.\",\"tw.studioview.hoverText\":\"{title} avtorja {author}\",\"tw.twExtension.description\":\"Čudni novi bloki.\",\"tw.twExtension.name\":\"Bloki {APP_NAME}\",\"tw.unknownPlatform.continue\":\"Razumem\",\"tw.unknownPlatform.title\":\"Neznan urejevalnik\",\"tw.unshared.2\":\"Za več informacij obiščite: {link}\",\"tw.unshared.bug\":\"Če je projekt v resnici deljen, prosimo, da prijavite napako.\",\"tw.unshared.cache\":\"Če je bil projekt deljen pred kratkim, se lahko nekaj minut za tem to sporočilo še prikaže.\",\"tw.unshared2.1\":\"Nedeljeni projekti niso več vidni.\",\"tw.usernameModal.help\":\"Ta vrednost bo shranjena v vašem brskalniku. Morda bo zapisana med uporabo projektov, ki vsebujejo spremenljivke v oblaku.\",\"tw.usernameModal.help2\":\"Vrednosti, ki se ne ujemajo z obstoječim računom na Scratchu, bo strežnik za spremenljivke v oblaku običajno zavrnil. Priporočamo, da te nastavitve ne spreminjate ali pa uporabite svoje uporabniško ime na Scratchu.\",\"tw.usernameModal.mustChange\":\"Strežnik za spremenljivke v oblaku misli, da vaše uporabniško ime morda ni varno. Prosimo, daga spremenite ali {resetIt}.\",\"tw.usernameModal.mustChange.resetIt\":\"ga ponastavite (priporočeno)\",\"tw.usernameModal.new\":\"Novo uporabniško ime:\",\"tw.usernameModal.reset\":\"Ponastavi\",\"tw.usernameModal.title\":\"Spremeni uporabniško ime\",\"tw.usesCloudVariables\":\"Ta projekt uporablja spremenljivke v oblaku.\",\"tw.viewFeaturedProjects\":\"Kliknite za ogled izpostavljenih projektov.\",\"tw.viewOnScratch\":\"Ogled projekta na Scratchu\"},\"sr\":{\"tw.alerts.creatingRestorePoint\":\"Прављење тачке враћања...\",\"tw.alerts.savedToDisk\":\"Сачувано на вашем компјутеру.\",\"tw.backpack.rename\":\"Ново име:\",\"tw.blocks.addons\":\"Додаци\",\"tw.blocks.buttonIsDown\":\"[MOUSE_BUTTON] миш притиснут?\",\"tw.blocks.lastKeyPressed\":\"последњи притиснут тастер\",\"tw.blocks.mouseButton.middle\":\"(1) средњи\",\"tw.blocks.mouseButton.primary\":\"(0) примарни\",\"tw.blocks.mouseButton.secondary\":\"(2) секундарни\",\"tw.blocks.openDocs\":\"Отвори документацију\",\"tw.changeUsername.cannotChangeWhileRunning\":\"Корисничко име се не може мењати док пројекат ради.\",\"tw.code\":\"Изворни код\",\"tw.confirmIncompatibleExtension\":\"Ово проширење није компатибилно са Scratch-ом. Пројекти са њим се не могу отпремити на Scratch сајт. Да ли сте сигурни да желите да га укључите?\",\"tw.customExtension.name\":\"Прилагођена проширења\",\"tw.featuredProjectsStudio\":\"Погледај студио на Scratch-у.\",\"tw.feedback\":\"Повратне информације и грешке\",\"tw.footer.credits\":\"Заслуге\",\"tw.footer.embed\":\"Уграђивање\",\"tw.footer.parameters\":\"URL параметри\",\"tw.gui.defaultProjectTitle\":\"Пројекат\",\"tw.guiDefaultTitle\":\"Убрзајте Scratch пројекте\",\"tw.home.credit\":\"Белешке и заслуге\",\"tw.home.instructions\":\"Упутства\",\"tw.input.tooltip\":\"Прекопирај линк Scratch пројекта овде!\",\"tw.interpolationEnabled\":\"Интерполација\",\"tw.invalidParameters.clones\":\"\\\\\"clone\\\\\" URL параметар није валидан\",\"tw.invalidParameters.fps\":\"\\\\\"fps\\\\\" URL параметар није валидан\",\"tw.loader.downloadingAssets\":\"Преузимање ресурса ({complete}/{total}) ...\",\"tw.loader.projectData\":\"Учитавање пројекта ...\",\"tw.menuBar.60off\":\"Искључи опцију 60 FPS\",\"tw.menuBar.60on\":\"Укључи опцију 60 FPS\",\"tw.menuBar.addons\":\"Додаци\",\"tw.menuBar.advanced\":\"Напредно\",\"tw.menuBar.changeUsername\":\"Промени корисничко име\",\"tw.menuBar.cloudOff\":\"Онемогући променљиве у облаку\",\"tw.menuBar.cloudOn\":\"Омогући променљиве у облаку\",\"tw.menuBar.cloudUnavailable\":\"Променљиве у облаку нису доступне\",\"tw.menuBar.cloudUnavailableAlert\":\"Променљиве у облаку се не могу користити, вероватно зато што сте у едитору.\",\"tw.menuBar.moreSettings\":\"Напредна подешавања\",\"tw.menuBar.newFramerate\":\"Нови FPS:\",\"tw.menuBar.reportError2\":\"Ово је грешка. Молимо Вас да је пријавите.\",\"tw.menuBar.saveAs\":\"Сачувај као {file}\",\"tw.menuBar.seeInside\":\"Погледај изнутра\",\"tw.oldDownload\":\"Сачувај у посебну датотеку...\",\"tw.paint.alpha\":\"Непровидност\",\"tw.privacy\":\"Политика приватности\",\"tw.saveAs\":\"Сачувај као...\",\"tw.saveTo\":\"Сачувај у {file}\",\"tw.settingsModal.customStageSize\":\"Прилагођена величина позорнице:\",\"tw.settingsModal.customStageSizeHelp\":\"Мења величину Scratch-ове позорнице са 480x360 на нешто друго. Пробајте 640x360 да би позорница постала широки екран. Мало пројеката ће ово подржати.\",\"tw.settingsModal.dangerZone\":\"Опасно\",\"tw.settingsModal.disableCompiler\":\"Онемогући преводилац кода\",\"tw.settingsModal.featured\":\"Истакнуто\",\"tw.settingsModal.fps\":\"60 FPS (Прилагођен FPS)\",\"tw.settingsModal.fpsHelp\":\"Покреће код 60 пута у секунди уместо 30. Многи пројекти неће исправно радити са овим подешавањем. Уместо тога онда искористите Интерполацију уместо опције 60 FPS. {customFramerate}.\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Кликните за FPS који није 30 или 60\",\"tw.settingsModal.help\":\"Кликни за помоћ\",\"tw.settingsModal.highQualityPen\":\"Оловка високог квалитета\",\"tw.settingsModal.highQualityPenHelp\":\"Црта пројекте са оловком у већој резолуцији и онемогућава заокругљивање координата у едитору. Ово подешавање није најбоље за неке пројекте и може утицати на перформансе.\",\"tw.settingsModal.infiniteClones\":\"Бесконачно умножака\",\"tw.settingsModal.infiniteClonesHelp\":\"Онемогућава Scratch-ову границу од 300 умножака\",\"tw.settingsModal.interpolation\":\"Интерполација\",\"tw.settingsModal.interpolationHelp\":\"Чини да пројекти изгледају брже помоћу интерполације кретања ликова. Интерполација се не треба користити за 3D пројекте, пројекте са оловком и пројекте који лагују јер ће радити спорије, а да не изгледају брже.\",\"tw.settingsModal.largeStageWarning\":\"Коришћење оволике величине позорнице није препоручљиво! Уместо тога, користите мање величине са истим односом ширине и висине, а онда укључите приказ преко целог екрана да све повећа тако да се поклапа са корисниковим приказом.\",\"tw.settingsModal.removeFencing\":\"Уклони границе\",\"tw.settingsModal.removeFencingHelp\":\"Дозвољава ликовима да се крећу ван граница екрана, да им величина не буде ограничена, и чини да \\\\\"додирује ли\\\\\" блокови раде ван екрана.\",\"tw.settingsModal.removeLimits\":\"Уклони граничне вредности\",\"tw.settingsModal.removeMiscLimits\":\"Уклони различите максималне вредности\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Уклања граничне вредности за звучне ефекте и величину оловке.\",\"tw.settingsModal.storeProjectOptions\":\"Складишти подешавања у пројекту\",\"tw.settingsModal.storeProjectOptionsHelp\":\"Складишти одабрана подешавања у пројекту тако да се аутоматски примене када TurboWarp учита пројекат. Warp тајмер и онемогућавање преводиоца кода се неће сачувати.\",\"tw.settingsModal.title\":\"Напредна подешавања\",\"tw.settingsModal.warpTimer\":\"Warp тајмер\",\"tw.settingsModal.warpTimerHelp\":\"Чини да код проверава да ли је заглављен у дугачкој или бескрајној петљи и смањује квалитет уместо заглављивања док се петља не заврши. Поправља већину кварова, али има значајан утицај на перформансе, па је подразумевано укључен само у едитору.\",\"tw.spriteSelectorItem.rename\":\"преименуј\",\"tw.studioview.authorAttribution\":\"од {author}\",\"tw.studioview.error\":\"Десила се грешка у учитавању следеће странице пројеката.\",\"tw.studioview.hoverText\":\"{title} од {author}\",\"tw.usernameModal.help\":\"Ова вредност ће бити сачувана у меморији вашег прегледача. Може се сама учитати када користите пројекте са променљивама у облику.\",\"tw.usernameModal.help2\":\"Вредности које не одговарају валидном Scratch налогу ће бити одбијене од стране сервера променљивих у облаку. Препоручујемо да га оставите како јесте или га промените у своје Scratch корисничко име.\",\"tw.usernameModal.mustChange\":\"Извињавамо се, али сервер променљивих у облаку мисли да је Ваше корисничко име можда небезбедно. Молимо Вас да га промените или {resetIt}.\",\"tw.usernameModal.mustChange.resetIt\":\"ресејтујте га (препоручено)\",\"tw.usernameModal.reset\":\"Ресетуј\",\"tw.usernameModal.title\":\"Промени корисничко име\",\"tw.viewFeaturedProjects\":\"Кликни да видиш истакнуте пројекте\",\"tw.viewOnScratch\":\"Погледај пројекат на Scratch-у\"},\"sv\":{\"tw.alerts.creatingRestorePoint\":\"Skapar återställningspunkt...\",\"tw.alerts.lostPeripheralConnection\":\"Förlorade anslutningen till {extensionName}.\",\"tw.alerts.savedToDisk\":\"Sparad på datorn.\",\"tw.backpack.rename\":\"Nytt namn: \",\"tw.blocks.addons\":\"Tillägg\",\"tw.blocks.buttonIsDown\":\"[MOUSE_BUTTON]Musknappen nere?\",\"tw.blocks.lastKeyPressed\":\"Sista tangenten nertryckt \",\"tw.blocks.mouseButton.middle\":\"(1) mitten\",\"tw.blocks.mouseButton.primary\":\"(0) primär\",\"tw.blocks.mouseButton.secondary\":\"(2) andra\",\"tw.blocks.openDocs\":\"Öppna dokumentation\",\"tw.cantUseCloud\":\"Även om du kan skapa molnvariabler så kommer de inte att funka om du inte kommer att ladda upp projektet till Scratch eller att använda ett verktyg som {packager}.\",\"tw.changeUsername.cannotChangeWhileRunning\":\"Användarnamn kan inte ändras när projektet är igång.\",\"tw.clipboard.danger\":\"Om ditt urklipp har saker som lösenord, kan projektet dela de med andra servrar.\",\"tw.clipboard.permission\":\"Tillgång till urklipp kan kanske inte fungera i alla webbläsare. Om tillåtet, senare läsningar från urklippen kommer att vara automatiskt tillåtna.\",\"tw.clipboard.title\":\"Projektet vill läsa data från ditt urklipp.\",\"tw.code\":\"Källkod\",\"tw.confirmIncompatibleExtension\":\"Detta tillägg är inkompatibelt med Scratch. Projekt skapade med det kan inte bli uppladdade till Scratch-webbplatsen. Är du säker att aktivera det?\",\"tw.customExtension.description\":\"Ladda in anpassade tillägg från URL:s, filer, eller JavaScript källkod.\",\"tw.customExtension.name\":\"Anpassatt tillägg\",\"tw.customExtensionModal.load\":\"Ladda in\",\"tw.customExtensionModal.promptText\":\"Klistra in tilläggets JavaScript källkod:\",\"tw.customExtensionModal.promptURL\":\"Ange tilläggets URL:\",\"tw.customExtensionModal.title\":\"Ladda in ett anpassat tillägg\",\"tw.customExtensionModal.trusted\":\"Tillägget kan vara laddat in utan sandboxen eftersom den är från en betrodd källa.\",\"tw.customExtensionModal.unsandboxedWarning1\":\"Att ladda in anpassade utan sandboxen är farligt och ska inte vara aktiverat om du inte vet vad du gör.\",\"tw.customExtensionModal.unsandboxedWarning2\":\"Osandlådade tillägg kan förstöra ditt projekt, ta bort dina inställningar, nätfiska för lösenord, och andra dåliga saker. Utvecklarna för {APP_NAME} är inte ansvariga för resulterade problem.\",\"tw.customExtensionModal.untrusted\":\"Tillägg från opålitliga URL:s kommer alltid att vara laddade in med sandboxen för säkerhet.\",\"tw.documentation\":\"Dokumentation\",\"tw.featuredProjectsStudio\":\"Se studion på Scratch.\",\"tw.feedback\":\"Respons & buggar\",\"tw.fetch.title\":\"Projektet vill koppa sig till webbsidan: \",\"tw.fonts.add\":\"Lägg till\",\"tw.fonts.custom.name\":\"Ge teckensnittet ett namn:\",\"tw.fonts.title\":\"Teckensnitt\",\"tw.footer.credits\":\"Krediter\",\"tw.footer.documentation\":\"Dokumentation\",\"tw.footer.embed\":\"Inbäddning\",\"tw.footer.parameters\":\"URL Parametrar\",\"tw.gui.crashMessage.description\":\"Vi är ledsna men det ser ut som sidan har krashat. Ladda om sidan för att försöka igen.\",\"tw.gui.defaultProjectTitle\":\"Projekt\",\"tw.guiDefaultTitle\":\"Kör scratchprojekt snabbare\",\"tw.home.credit\":\"Anteckningar och kerditer\",\"tw.home.instructions\":\"Instruktioner\",\"tw.input.tooltip\":\"Kopiera och klistra in en Scratch länk här!\",\"tw.invalidParameters.clones\":\"\\\\\"klon\\\\\" URL är ogiltig\",\"tw.invalidParameters.fps\":\"\\\\\"fps\\\\\" URL parameter är ogiltig\",\"tw.invalidProject.title\":\"Fel\",\"tw.loadExtension.embedded\":\"Projektet vill att ladda in ett anpassat tillägg med koden:\",\"tw.loadExtension.sandboxed\":\"Medan koden kommer att bli sandboxad, kommer det att ha tillgång till information om din enhet som till exempel din IP adress och din position. Kontrollera att du litar på författaren av detta tillägg innan du fortsätter.\",\"tw.loadExtension.unsandboxedWarning\":\"Att ladda tillägg utan sandboxen är farligt. Det kommer at kunna förstöra ditt projekt, ta bort dina inställningar, nätfiska för lösenord, och andra dåliga saker. Utvecklarna för {APP_NAME} är inte ansvariga för resulterade problem.\",\"tw.loadExtension.url\":\"Projektet vill ladda in ett anpassad tillägg från denna URL:\",\"tw.loader.downloadingAssets\":\"Hämtar tillgångar ({complete}/{total})...\",\"tw.loader.projectData\":\"Laddar projekt...\",\"tw.menuBar.60off\":\"Avaktivera 60 FPS\",\"tw.menuBar.60on\":\"Aktivera 60 FPS\",\"tw.menuBar.addons\":\"Tillägg\",\"tw.menuBar.advanced\":\"Avancerat\",\"tw.menuBar.changeUsername\":\"Ändra användarnamn\",\"tw.menuBar.cloudOff\":\"Avaktivera molnvariabler\",\"tw.menuBar.cloudOn\":\"Aktivera molnvariabler\",\"tw.menuBar.cloudUnavailable\":\"Molnvariabler är inte tillgängliga\",\"tw.menuBar.cloudUnavailableAlert\":\"Kan inte använda molnvariabler, mest troligt att du öppnade editorn.\",\"tw.menuBar.compileError\":\"{sprite}:{error}\",\"tw.menuBar.desktopSettings\":\"Skrivbordsinställningar\",\"tw.menuBar.moreSettings\":\"Avancerade inställningar\",\"tw.menuBar.newFramerate\":\"Ny upplösningshastighet:\",\"tw.menuBar.package\":\"Packa projektet\",\"tw.menuBar.reportError2\":\"Detta är en bugg. Snälla rapportera buggen. \",\"tw.menuBar.restorePoints\":\"Återställspunkter\",\"tw.menuBar.saveAs\":\"Spara som {file}\",\"tw.menuBar.seeInside\":\"Se inuti\",\"tw.notify.permission\":\"Om tillåtet, kommer du kanske att bli frågad om att tillåta notifikationer av din webbläsare, och senare notifikationer kommer att bli automatiskt tillåtna. \",\"tw.notify.title\":\"Projektet vill visa notifikationer.\",\"tw.oldDownload\":\"Spara till separat fil...\",\"tw.opcode.2000\":\"dagar från år 2000\",\"tw.opcode.mousedown\":\"Musknapp nedtryckt?\",\"tw.opcode.mousex\":\"mus x\",\"tw.opcode.mousey\":\"mus y\",\"tw.openAdvanced\":\"Öppna avancerade inställningar\",\"tw.openWindow.dangerous\":\"Denna webbsida har inte granskats av utvecklarna {APP_NAME} . Den kan innehålla farlig eller skadlig kod.\",\"tw.openWindow.title\":\"Projektet vill öppna ett fönster eller en flik med länken: \",\"tw.paint.alpha\":\"Opacitet\",\"tw.paint.fonts.more\":\"Lägg till fler font...\",\"tw.privacy\":\"Integritetspolicy\",\"tw.recordAudio.permission\":\"Om tillåtet, kommer du kanske att bli frågad om att tillåta tillgång till mikrofonen från din webbläsare, och senare tillgång till mikrofonen kommer att bli automatiskt tillåtet.\",\"tw.recordAudio.title\":\"Projektet vill spela in ljud från din mikrofon. Detta kan inkludera ett textutskrift eller rå ljud. Projektet kan dela ljudet med andra personer eller servrar.\",\"tw.recordVideo.permission\":\"Om tillåtet, kommer du kanske att bli frågad av din webbläsare att få tillgång till din kamera, och senare tillgång till kameran kommer att bli automatiskt tillåtet.\",\"tw.recordVideo.title\":\"Projektet vill spela in video från din kamera. Projektet kan dela bilder med andra användare eller servrar.\",\"tw.redirect.dangerous\":\"Denna webbsida har inte granskats av utvecklarna {APP_NAME} . Den kan innehålla farlig eller skadlig kod.\",\"tw.redirect.title\":\"Projektet will navigera dig till denna webbsida:\",\"tw.restorePoints.deleteAll\":\"Radera allt\",\"tw.restorePoints.description\":\"{APP_NAME} sparar återställspunkter med jämna mellanrum på don dator för att hjälpa återställa projekt om du glömde spara. Detta är avsett som sista utvägen för återhämtning. Din dator kan ta bart återställningspunkterna när som helts. Bero INTE på denna funktion.\",\"tw.restorePoints.error\":\"Ett fel uppstod under laddningen av återställningspunkten: {error}\",\"tw.restorePoints.loading\":\"Laddar...\",\"tw.restorePoints.title\":\"Återställspunkter\",\"tw.saveAs\":\"Spara som...\",\"tw.saveTo\":\"Spara till {file}\",\"tw.scratchUnsafeCloud\":\"Om du gör denna molnvariabel så kommer projektet att överskrida Scratchs gräns av {number} variabler och några variabler kommer inte fungera om du kommer ladda upp projektet till Scratch.\",\"tw.securityManager.allow\":\"Tillåt\",\"tw.securityManager.deny\":\"Avvisa\",\"tw.securityManager.title\":\"Tilläggssäkerhet\",\"tw.securityManager.trust\":\"Om tillåtet, senare förfrågor till samma websida kommer att automatiskt vara tillåtna.\",\"tw.securityManager.why\":\"Detta kan vara använt till att ladda ned bilder eller ljud, implementera multiplayer, få tillgång till API, eller för skadliga syften. Detta kommer att dela din IP adress, allmän plats, och kanske annan data med websidan.\",\"tw.settingsModal.customStageSize\":\"Anpassad scenstorlek:\",\"tw.settingsModal.customStageSizeHelp\":\"Ändrar storleken av Scratch scenen från 480x360 till något annat. Prova 640x360 för att göra scenen widescreen. Väldigt få projekt funkar rätt med detta\",\"tw.settingsModal.dangerZone\":\"Farliga zonen\",\"tw.settingsModal.disableCompiler\":\"Avaktivera kompilatorn\",\"tw.settingsModal.featured\":\"Utvalda\",\"tw.settingsModal.fps\":\"60 FPS (Anpassat FPS)\",\"tw.settingsModal.fpsHelp\":\"Kör skripter 60 gånger i sekunden istället för 30. De flesta projekt kommer inte att funka rätt med detta aktiverat. Do kan prova interpolation med 60 FPS läget avaktiverat om så är fallet. {customFramerate}.\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Klicka för att använda en hastighet förutom 30 och 60 FPS\",\"tw.settingsModal.help\":\"Klicka för hjälp\",\"tw.settingsModal.highQualityPen\":\"Högkvalitativ penna\",\"tw.settingsModal.highQualityPenHelp\":\"Tillåter att projekt med penna kan rendera med högre kvalité och tar bort några koordinat avrundning i editorn. Inte alla projekt drar nytta av den här inställningen och det kan påverka prestandan.\",\"tw.settingsModal.infiniteClones\":\"Oändliga kloner\",\"tw.settingsModal.infiniteClonesHelp\":\"Avaktiverar Scratch\\'s 300 klongräns.\",\"tw.settingsModal.interpolationHelp\":\"Får projekt att se jämnare ut genom att interpolera sprite-rörelser. Interpolering bör inte användas på 3D-projekt, raytracers, pennprojekt och långsamma projekt eftersom interpolering kommer att göra att de går långsammare utan att få dem att se jämnare ut.\",\"tw.settingsModal.largeStageWarning\":\"Att använda en scenstorlek som detta är inte rekomenderat! Istället, använd en mindre storlek med samma sidförhållande och låt fullskärmen att uppskala den så att storleken matchar datorns skärm.\",\"tw.settingsModal.removeFencing\":\"Ta bort scengränser\",\"tw.settingsModal.removeFencingHelp\":\"Tillåter sprites att flytta utanför skärmen, bli så stora eller så små som de vill, och gör att beröringsblock fungerar utanför skärmen.\",\"tw.settingsModal.removeLimits\":\"Ta bort limitationerna\",\"tw.settingsModal.removeMiscLimits\":\"Ta bort diverse gränser\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Tar bort ljud limitationer och gränser för pennstorlek\",\"tw.settingsModal.storeProjectOptions\":\"Spara inställningarna i projektet\",\"tw.settingsModal.storeProjectOptionsHelp\":\"Sparar de valda inställningarna i projektet så de kommer bli automatiskt tillämpas när TurboWarp laddar projektet. Warp timer och avaktivera kompilatorn kommer inte vara sparade.\",\"tw.settingsModal.title\":\"Avancerade inställningar\",\"tw.settingsModal.warpTimerHelp\":\"Ser till så att skript är inte fasta i en lång eller oändlig loop och gör så att de körs på låg hastighet istället för att fastna tills loopen blir klar. Detta fixar de flesta kraschar men har en betydande prestationspåverkan så det är bara aktiverat i editorn som standard.\",\"tw.spriteSelectorItem.rename\":\"Döp om\",\"tw.stereoAlert\":\"Om du redigerar detta stereoljud konverteras det oåterkalleligt till mono.\",\"tw.studioview.authorAttribution\":\"av {author}\",\"tw.studioview.error\":\"Det uppstod ett fel när nästa sida med projekt skulle laddas.\",\"tw.studioview.hoverText\":\"{title} av {author}\",\"tw.tooLarge\":\"Detta ljud kommer att kanske vara för stort för att ladda upp till Scratch.\",\"tw.twExtension.description\":\"Konstiga nya block.\",\"tw.unshared.2\":\"För mer information se: {link}\",\"tw.unshared.bug\":\"Om detta projektet är delat, rapportera en bugg.\",\"tw.unshared.cache\":\"Om projektet var delat nyligen så kan detta meddelandet vara ogiltigt i några minuter.\",\"tw.unshared2.1\":\"Odelade projekt är inte tillgängliga längre.\",\"tw.usernameModal.help\":\"Detta värde kommer att lagras i din webbläsares lagring. Det kan loggas när du interagerar med projekt som innehåller molnvariabler.\",\"tw.usernameModal.help2\":\"Värden som inte korresponderar till ett valt Scratch konto kommer vanligtvis att avvisas av molnvariabelservern. Vi rekomenderar att lämna det så som det är eller att ändra det till ditt Scratch användarnamn\",\"tw.usernameModal.mustChange\":\"Förlåt, men det ser ut som om att servern tänker att ditt användarnamn är osäkert. Ändra det till något annat eller {resetIt}.\",\"tw.usernameModal.mustChange.resetIt\":\"Återställa (Rekomenderat)\",\"tw.usernameModal.reset\":\"Starta om\",\"tw.usernameModal.title\":\"Ändra användarnamn\",\"tw.viewFeaturedProjects\":\"Klicka för att se utvalda projekt\",\"tw.viewOnScratch\":\"Se projektet på Scratch\"},\"th\":{\"tw.settingsModal.featured\":\"ได้รับการฟีเจอร์\",\"tw.usernameModal.reset\":\"รีเซ็ต\"},\"tr\":{\"tw.accent.blue\":\"Mavi\",\"tw.accent.purple\":\"Mor\",\"tw.accent.red\":\"Kırmızı\",\"tw.alerts.creatingRestorePoint\":\"Yükleme noktası yapılıyor\",\"tw.alerts.lostPeripheralConnection\":\"Bağlantı kesildi {extensionName}\",\"tw.alerts.restorePointError\":\"Geri yükleme noktası oluşturulamadı\",\"tw.alerts.restorePointSuccess\":\"\\\\\"Dosya\\\\\"daki geri yükleme noktalarına erişin\",\"tw.alerts.savedToDisk\":\"Bilgisayarına kaydedilmiştir.\",\"tw.backpack.rename\":\"Yeni kullanıcı adı:\",\"tw.blockColors.custom\":\"Eklenti Ayarlarında Özelleştir\",\"tw.blockColors.dark\":\"Karanlık (Beta)\",\"tw.blockColors.highContrast\":\"Yüksek Kontrast\",\"tw.blockColors.three\":\"Orijinal\",\"tw.blocks.PROCEDURES_DOCS\":\"Return nasıl kullanılır\",\"tw.blocks.PROCEDURES_RETURN\":\"{v} geri dön\",\"tw.blocks.PROCEDURES_TO_REPORTER\":\"Reporter olarak Değiştir\",\"tw.blocks.PROCEDURES_TO_STATEMENT\":\"İfadeye Değiştir\",\"tw.blocks.addons\":\"Eklentiler\",\"tw.blocks.buttonIsDown\":\"[MOUSE_BUTTON] fare düğmesi basılımı?\",\"tw.blocks.lastKeyPressed\":\"basılan son tuş\",\"tw.blocks.mouseButton.middle\":\"(1) orta\",\"tw.blocks.mouseButton.primary\":\"(0) birincil\",\"tw.blocks.mouseButton.secondary\":\"(2) ikincil\",\"tw.blocks.openDocs\":\"Belgeyi Aç\",\"tw.cantUseCloud\":\"Bulut değişkenleri oluşturabilseniz de, bu proje Scratch\\'e yüklenmediği veya {packager} gibi bir araç kullanılarak dönüştürülmediği sürece bunlar çalışmayacaktır.\",\"tw.changeUsername.cannotChangeWhileRunning\":\"Proje çalışırken kullanıcı adı değiştirilemez.\",\"tw.clipboard.danger\":\"Panonuzda şifre gibi şeyler varsa proje bunları diğer kullanıcılarla veya sunucularla paylaşabilir.\",\"tw.clipboard.permission\":\"Pano erişimi bazı tarayıcılarda çalışmayabilir. İzin verilirse, daha fazla pano okumasına otomatik olarak izin verilecektir.\",\"tw.clipboard.title\":\"Proje panonuzdaki verileri okumak istiyor.\",\"tw.cloudProvider\":\"{name} tarafından sağlanan sunucu\",\"tw.cloudServers\":\"Yakınınızdaki bir sunucuyu seçin:\",\"tw.code\":\"Kaynak Kodu\",\"tw.confirmIncompatibleExtension\":\"Bu eklenti Scratch ile kullanamılınıyor. Bununla yapılan projeler Scratch web sitesine yüklenemez. Etkinleştirmek istediğinizden emin misiniz?\",\"tw.createdBy\":\"Yazar:\",\"tw.customCloudServer\":\"Özel bir bulut değişken sunucusu kullanma:{server}\",\"tw.customExtension.description\":\"URL\\'lerden, dosyalardan veya JavaScript kaynak kodundan özel uzantılar yükleyin.\",\"tw.customExtension.name\":\"Görenek Eklenti\",\"tw.customExtensionModal.load\":\"Yükle\",\"tw.customExtensionModal.promptText\":\"Uzantının JavaScript kaynak kodunu yapıştırın:\",\"tw.customExtensionModal.promptURL\":\"Uzantının URL\\'sini girin:\",\"tw.customExtensionModal.text\":\"Metin\",\"tw.customExtensionModal.title\":\"Özel Uzantıyı Yükle\",\"tw.customExtensionModal.trusted\":\"Bu uzantı, güvenilir bir kaynaktan geldiği için korumalı alan olmadan yüklenecek.\",\"tw.customExtensionModal.unsandboxedWarning1\":\"Uzantıları korumalı alan olmadan yüklemek tehlikelidir ve ne yaptığınızı bilmiyorsanız etkinleştirilmemelidir.\",\"tw.customExtensionModal.unsandboxedWarning2\":\"Korumalı alanda olmayan uzantılar projenizi bozabilir, ayarlarınızı silebilir, şifreleri ele geçirmek için kimlik avı yapabilir ve diğer kötü şeylere neden olabilir. {APP_NAME} geliştiricileri ortaya çıkan sorunlardan sorumlu değildir.\",\"tw.customExtensionModal.untrusted\":\"Güvenilmeyen URL\\'lerden gelen uzantılar, güvenlik amacıyla her zaman korumalı alanla birlikte yüklenecektir.\",\"tw.customReporters.description\":\"Özel blokların değerlerin çıktısını almasına ve girdi olarak kullanılmasına izin verin.\",\"tw.customReporters.name\":\"Özel Haberciler\",\"tw.darkMode\":\"Işık Moduna Geçiş\",\"tw.documentation\":\"Belgesel\",\"tw.embed.persistent\":\"İzin verilirse aynı siteye daha fazla yerleştirme yapılmasına otomatik olarak izin verilecektir.\",\"tw.embed.risks\":\"Yerleştirme korumalı alana alınsa da, cihazınızla ilgili IP\\'niz ve genel konumunuz gibi bilgilere erişmeye devam edecektir.\",\"tw.embed.title1\":\"Proje, HTML içeriğini sahneye yerleştirmek istiyor:\",\"tw.embed.title2\":\"Proje, uzak içeriği sahneye yerleştirmek istiyor:\",\"tw.extensionGallery.error\":\"Uzantı galerisi yüklenirken hata oluştu. Daha fazla uzantı bulmak için extensions.turbowarp.org adresini ziyaret edin.\",\"tw.extensionGallery.loading\":\"Uzantı galerisi yükleniyor...\",\"tw.extensionGallery.more\":\"extensions.turbowarp.org adresinde uzantılar hakkında daha fazla bilgi edinin.\",\"tw.extensionGallery.name\":\"{APP_NAME} Uzatma Galerisi\",\"tw.favorite\":\"Favori\",\"tw.featuredProjectsStudio\":\"Stüdyoyu Scratch\\'te görüntüleyin.\",\"tw.feedback\":\"Geribildirim ve Hatalar\",\"tw.feedbackButton\":\"{APP_NAME} Geri bildirim\",\"tw.fetch.title\":\"Proje web sitesine bağlanmak istiyor:\",\"tw.fonts.add\":\"Ekle\",\"tw.fonts.custom.file\":\"Bilgisayarınızdan bir yazı tipi dosyası seçin:\",\"tw.fonts.custom.name\":\"Yazı tipine bir ad verin:\",\"tw.fonts.custom1\":\"Bir dosyadan yazı tipi ekleme\",\"tw.fonts.custom2\":\"Genellikle Scratch\\'te çalışmaz. Desteklenen formatlar: {formats}.\",\"tw.fonts.delete\":\"\\\\\"{font}\\\\\"i silmek istediğinizden emin misiniz? Herhangi bir vektör kostümü bunun yerine yedek yazı tipini kullanacaktır.\",\"tw.fonts.fallback\":\"Yazı tipinin yüklenememesi veya silinmesi durumunda kullanılacak bir yedek yazı tipi seçin:\",\"tw.fonts.list\":\"Yüklü yazı tipleri:\",\"tw.fonts.none\":\"Henüz yazı tipi eklenmedi.\",\"tw.fonts.readError\":\"Yazı tipi dosyası okunamadı: {error}\",\"tw.fonts.system\":\"Sistem yazı tipi\",\"tw.fonts.system.name\":\"Bilgisayarınızda yerleşik olan herhangi bir yazı tipinin adını yazın. Yazı tipi herkes için doğru görünmeyebilir.\",\"tw.fonts.system1\":\"Sistem yazı tipi ekleme\",\"tw.fonts.system2\":\"Scratch\\'te çalışabilir ancak herkes için doğru şekilde görünmeyecektir.\",\"tw.fonts.title\":\"Yazı tipleri\",\"tw.footer.credits\":\"Krediler\",\"tw.footer.documentation\":\"Belgesel\",\"tw.footer.embed\":\"Gömmek\",\"tw.footer.parameters\":\" URL parametreler\",\"tw.geolocate.permission\":\"İzin verilirse tarayıcınız tarafından konum erişimine izin vermeniz istenebilir.\",\"tw.geolocate.title\":\"Proje konumunuzu bilmek istiyor.\",\"tw.gui.crashMessage.description\":\"Çok üzgünüz ancak sayfanın çökmüş olduğu anlaşılıyor. Tekrar denemek için lütfen sayfanızı yenileyin.\",\"tw.gui.defaultProjectTitle\":\"Proje\",\"tw.guiDefaultTitle\":\"Scratch Projeleri daha hızlı yapın\",\"tw.home.credit\":\"Notlar ve Krediler\",\"tw.home.description\":\"{APP_NAME}, projeleri gerçekten hızlı çalışmasını sağlamak için JavaScript\\'e derleyen bir Scratch modudur. Yukarıda bir proje kimliği veya URL girerek veya aşağıda öne çıkan bir proje seçerek deneyin.\",\"tw.home.instructions\":\"Kurallar\",\"tw.input.tooltip\":\"Bir Scratch proje linki buraya kopyala ve yapıştır!\",\"tw.interpolationEnabled\":\"Enterpolasyon\",\"tw.invalidParameters.clones\":\"\\\\\"klon\\\\\" URL parametresi geçersizdir\",\"tw.invalidParameters.fps\":\"\\\\\"fps\\\\\" URL parametresi geçersizdir\",\"tw.invalidProject.title\":\"Hata\",\"tw.lightMode\":\"Koyu Moda Geçin\",\"tw.loadExtension.embedded\":\"Proje şu kodu içeren özel bir uzantı yüklemek istiyor:\",\"tw.loadExtension.sandboxed\":\"Kod korumalı alana alınsa da, cihazınızla ilgili IP\\'niz ve genel konumunuz gibi bilgilere erişmeye devam edecektir. Devam etmeden önce bu uzantının yazarına güvendiğinizden emin olun.\",\"tw.loadExtension.unsandboxedWarning\":\"Korumalı alan olmadan uzantıların yüklenmesi tehlikelidir. Projenizi bozabilir, ayarlarınızı silebilir, şifreleri ele geçirebilir ve diğer kötü şeyleri yapabilir. {APP_NAME}geliştiricileri ortaya çıkan sorunlardan sorumlu değildir.\",\"tw.loadExtension.url\":\"Proje, URL\\'den özel bir uzantı yüklemek istiyor:\",\"tw.loader.downloadingAssets\":\"Varlıklar indiriliyor ({complete}/{total}) ...\",\"tw.loader.loadingAssets\":\"Varlıklar yükleniyor ({complete}/{total}) ...\",\"tw.loader.projectData\":\"Proje yükleniyor ...\",\"tw.menuBar.60off\":\"60 FPS modunu kapat\",\"tw.menuBar.60on\":\"60 FPS modunu aç\",\"tw.menuBar.accent\":\"Aksan\",\"tw.menuBar.addons\":\"Eklentiler\",\"tw.menuBar.advanced\":\"Gelişmiş\",\"tw.menuBar.blockColors\":\"Blok Renkler\",\"tw.menuBar.changeUsername\":\"Adını değiştir\",\"tw.menuBar.cloudOff\":\"Bulut değişkenleri kapat\",\"tw.menuBar.cloudOn\":\"Bulut değişkenleri aç\",\"tw.menuBar.cloudUnavailable\":\"Bulut Değişkenleri bulamıyoruz\",\"tw.menuBar.cloudUnavailableAlert\":\"Bulut değişkenleri kullanamıyoruz, büyük ihtimalle editörü açtığınız için.\",\"tw.menuBar.desktopSettings\":\"Masaüstü Ayarları\",\"tw.menuBar.moreSettings\":\"Gelişmiş Ayarlar\",\"tw.menuBar.newFramerate\":\"Yeni karehızı:\",\"tw.menuBar.newWindow\":\"Yeni Pencere\",\"tw.menuBar.package\":\"Projeyi paketle\",\"tw.menuBar.reportError1\":\"Bazı komut dosyaları hatalarla karşılaştı.\",\"tw.menuBar.reportError2\":\"Bu bir hatadır. Lütfen bildirin.\",\"tw.menuBar.restorePoints\":\"Son kayıtlı nokta\",\"tw.menuBar.saveAs\":\"{file} olarak kaydet\",\"tw.menuBar.seeInside\":\"İçeri bak\",\"tw.moreCloud\":\"Bulut değişkenleri hakkında daha fazla bilgi edinin.\",\"tw.notify.permission\":\"İzin verilirse, tarayıcınız tarafından bildirimleri etkinleştirmeniz istenebilir ve daha sonraki bildirimlere otomatik olarak izin verilir.\",\"tw.notify.title\":\"Proje bildirimleri görüntülemek istiyor.\",\"tw.oldDownload\":\"Farklı dosyaya kaydet...\",\"tw.opcode.2000\":\"2000\\'den beri günler\",\"tw.opcode.mousedown\":\"fare basılı mı?\",\"tw.opcode.mousex\":\"fare x\",\"tw.opcode.mousey\":\"fare y\",\"tw.openAdvanced\":\"Gelişmiş ayarları aç\",\"tw.openWindow.dangerous\":\"Bu web sitesi {APP_NAME} geliştiricileri tarafından incelenmemiştir. Tehlikeli veya kötü amaçlı kod içerebilir.\",\"tw.openWindow.title\":\"Proje, URL\\'yi içeren yeni bir pencere veya sekme açmak istiyor:\",\"tw.paint.alpha\":\"Saydamlık\",\"tw.paint.fonts.more\":\"Daha fazla yazı tipi ekleyin...\",\"tw.pen.stageSelected\":\"Seçilen aşama: daha az kalem bloğu\",\"tw.privacy\":\"Gizillik Politikası\",\"tw.recordAudio.permission\":\"İzin verilirse, tarayıcınız tarafından mikrofon erişimini etkinleştirmeniz istenebilir ve daha fazla mikrofon erişimine otomatik olarak izin verilecektir.\",\"tw.recordAudio.title\":\"Proje mikrofonunuzdan ses kaydetmek istiyor. Bu, bir metin transkriptini veya ham ses verilerini içerebilir. Proje sesi diğer kullanıcılarla veya sunucularla paylaşabilir.\",\"tw.recordVideo.permission\":\"İzin verilirse, tarayıcınız tarafından kamera erişimini etkinleştirmeniz istenebilir ve daha fazla kamera erişimine otomatik olarak izin verilecektir.\",\"tw.recordVideo.title\":\"Proje kameranızdan video kaydetmek istiyor. Proje, görüntüleri diğer kullanıcılarla veya sunucularla paylaşabilir.\",\"tw.redirect.dangerous\":\"Bu web sitesi {APP_NAME} geliştiricileri tarafından incelenmemiştir. Tehlikeli veya kötü amaçlı kod içerebilir.\",\"tw.redirect.title\":\"Proje bu sekmeyi şu URL\\'ye yönlendirmek istiyor:\",\"tw.restorePoints.1minute\":\"her dakika\",\"tw.restorePoints.assets\":\"{n} varlıklar\",\"tw.restorePoints.confirmDelete\":\"\\\\\"{projectTitle}\\\\\"i silmek istediğinizden emin misiniz? Bu geri alınamaz.\",\"tw.restorePoints.confirmDeleteAll\":\"TÜM geri yükleme noktalarını silmek istediğinizden emin misiniz? Bu geri alınamaz.\",\"tw.restorePoints.confirmLoad\":\"Kaydedilmemiş değişiklikleriniz var. Mevcut projeyi değiştirmek mi?\",\"tw.restorePoints.deleteAll\":\"Hepsini sil\",\"tw.restorePoints.description\":\"{APP_NAME}, kaydetmeyi unutursanız projenizi kurtarmanıza yardımcı olmak için periyodik olarak bilgisayarınıza geri yükleme noktaları kaydeder. Bu, iyileşme için son çare olarak tasarlanmıştır. Bilgisayarınız bu geri yükleme noktalarını istediği zaman sessizce silebilir. Bu özelliğe güvenmeyin.\",\"tw.restorePoints.empty\":\"Geri yükleme noktası bulunamadı.\",\"tw.restorePoints.error\":\"Geri yükleme noktası yüklenirken hata oluştu: {error}\",\"tw.restorePoints.intervalOption\":\"{time} geri yükleme noktaları oluşturuldu.\",\"tw.restorePoints.loading\":\"Yükleniyor...\",\"tw.restorePoints.minutes\":\"her {n} dakikada bir\",\"tw.restorePoints.never\":\"Asla\",\"tw.restorePoints.off\":\"Geri yükleme noktalarını devre dışı bırakmak tehlikelidir.\",\"tw.restorePoints.size\":\"Kullanılan tahmini depolama alanı: {size}\",\"tw.restorePoints.size2\":\"Birden çok geri yükleme noktası tarafından kullanılan kostümler veya sesler yalnızca bir kez depolanır.\",\"tw.restorePoints.title\":\"Geri Yükleme Noktaları\",\"tw.sample\":\"Örnek Proje\",\"tw.saveAs\":\"Farklı kaydet...\",\"tw.saveTo\":\"{file} dosyasına kaydet\",\"tw.scratchUnsafeCloud\":\"Bu bulut değişkenini yaparsanız proje Scratch\\'in {number} değişkenleri sınırını aşacaktır ve projeyi Scratch\\'e yüklerseniz bazı değişkenler çalışmayacaktır.\",\"tw.securityManager.allow\":\"İzin vermek\",\"tw.securityManager.deny\":\"Reddetmek\",\"tw.securityManager.title\":\"Uzantı Güvenliği\",\"tw.securityManager.trust\":\"İzin verilirse, aynı web sitesine yapılacak başka isteklere de otomatik olarak izin verilecektir.\",\"tw.securityManager.why\":\"Bu, görüntüleri veya sesleri indirmek, çok oyunculu modu uygulamak, bir API\\'ye erişmek veya kötü amaçlarla kullanılabilir. Bu, IP adresinizi, genel konumunuzu ve muhtemelen diğer verilerinizi web sitesiyle paylaşacaktır.\",\"tw.settingsModal.customStageSize\":\"Özel Sahne Büyüklüğü:\",\"tw.settingsModal.customStageSizeHelp\":\"Scratch\\'in büyüklüğünü 480x360\\'den başka büyüklüğe değiştiriyor. Eğer geniş ekran istiyorsanız, 640x360yi deneyin. Sadece bir kaç projeler bunu düzgün bir şekilde halledebilir.\",\"tw.settingsModal.dangerZone\":\"Tehlikeli yer\",\"tw.settingsModal.disableCompiler\":\"Derlemeyi kapat\",\"tw.settingsModal.disableCompilerHelp\":\"{APP_NAME} derleyicisini devre dışı bırakır. Kodların hemen güncellenmesi için projeleri düzenlerken bunu etkinleştirmek isteyebilirsiniz. Aksi takdirde, bunu asla etkinleştirmemelisiniz.\",\"tw.settingsModal.featured\":\"Özellikli\",\"tw.settingsModal.fps\":\"60 FPS (Özel FPS)\",\"tw.settingsModal.fpsHelp\":\"Blokarı 30FPS yerinde 60FPS ile çalıştırır. Çoğu projeler bu mod ile 30FPS gibi çalışamaz. Bu durumda Enterpolasyonu 60 FPS modu devre dışı bırakarak denemelisiniz. {customFramerate}.\",\"tw.settingsModal.fpsHelp.customFramerate\":\"30FPS yada 60FPS\\'den başka kare hızı ile çalıştırmak istiyorsan bunu tıkla.\",\"tw.settingsModal.help\":\"Yardım için buraya tıkla\",\"tw.settingsModal.highQualityPen\":\"Yüksek kalite kalem\",\"tw.settingsModal.highQualityPenHelp\":\"Yüksek Kaliteli Kalem, kalem projelerinin daha yüksek kalitede görüntülemekte sağlar. ve oluşturucudaki bazı yuvarlamaları da görünmemesini sağlar. Bu ayardan tüm projelere bir advantaj veremiyor ve performansı etkileyebilir.\",\"tw.settingsModal.infiniteClones\":\"Sonsuz klonlar\",\"tw.settingsModal.infiniteClonesHelp\":\"Scratch\\'in 300 klon limiti çıkarıyor.\",\"tw.settingsModal.interpolation\":\"Enterpolasyon\",\"tw.settingsModal.interpolationHelp\":\"Enterpolasyon, hareketli grafik hareketini interpolasyon yaparak, projenin davranışını değiştirmeden daha yüksek kare hızlarında çalışıyormuş gibi görünmesini sağlayan deneysel bir özelliktir. Eğer bir projeyi 60 FPS\\'de çalıştırdıysanız ve çok hızlı çalıştığını fark ettiyseniz, İnterpolasyon bunu çözer. Enterpolasyon 3B projelerde, raytracer ve kalem projelerde kullanmayın çünkü projeleri yavaşlatır ve daha pürüzsüz yapmaz.\",\"tw.settingsModal.largeStageWarning\":\"Bu büyüklükte özel bir sahne boyutu kullanılması önerilmez! Bunun yerine, aynı en boy oranına sahip daha düşük bir boyut kullanın ve tam ekran modunun kullanıcının ekranına uyacak şekilde yükseltmesine izin verin.\",\"tw.settingsModal.removeFencing\":\"Eskirimi çıkart\",\"tw.settingsModal.removeFencingHelp\":\"Kuklaları ekran dışı yerler gitmeyi izin verir ve kuklaların istediği kadar büyük yada küçük olmasını izin verir, ve dokunma blokları ekran dışında kullanılabilir.\",\"tw.settingsModal.removeLimits\":\"Limitleri çıkart\",\"tw.settingsModal.removeMiscLimits\":\"Çeşitli Limitleri Kaldır\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Ses efekti limitleri gibi projeleri bozmaması olmayan çeşitli limitleri kaldırır.\",\"tw.settingsModal.storeProjectOptions\":\"Proje ayarlarını kaydet\",\"tw.settingsModal.storeProjectOptionsHelp\":\"TurboWarp bu projeyi yüklediğinde, ayarların otomatik olarak uygulanması için seçilmiş ayarları projede kaydeder. Warp zamanlayıcısı ve derleyiciyi devre dışı bırakma ayarları kaydedilmeyecektir.\",\"tw.settingsModal.title\":\"Gelişmiş Ayarlar\",\"tw.settingsModal.warpTimer\":\"Warp zamanlayıcı\",\"tw.settingsModal.warpTimerHelp\":\"Warp zamanlayıcı bloklara uzun veya sonsuz bir döngüde takılıp kalmadıklarını kontrol etmesini sağlar ve çok yavaş bir karehızında yürütüyor, ve bu da çoğu çökmeyi düzeltir. Bunun çok büyük bir performans etkisi vardır, bu nedenle editörün dışında varsayılan olarak etkinleştirilmez.\",\"tw.soundEditorNotSupported\":\"Ses düzenleyici bu tarayıcıda desteklenmiyor.\",\"tw.spriteSelectorItem.rename\":\"yeniden adlandır\",\"tw.stageHeader.full\":\"Tam kademeye geç\",\"tw.stereo\":\"Müzik seti\",\"tw.stereoAlert\":\"Bu stereo sesi düzenlemek onu geri dönülemez bir şekilde monoya dönüştürecektir.\",\"tw.studioview.authorAttribution\":\"{author} tarafından\",\"tw.studioview.error\":\"Sonraki proje sayfası yüklenirken hata oluştu.\",\"tw.studioview.hoverText\":\"{title} tarafından {author}\",\"tw.tooLarge\":\"Bu ses Scratch\\'e yüklenemeyecek kadar büyük olabilir.\",\"tw.twExtension.description\":\"Tuhaf yeni bloklar.\",\"tw.twExtension.name\":\"{APP_NAME} Blokları\",\"tw.unfavorite\":\"Favori Olmayan\",\"tw.unshared.2\":\"Daha fazla bilgi için şu adresi ziyaret edin: {link}\",\"tw.unshared.bug\":\"Bu proje gerçekten paylaşılıyorsa lütfen bir hata bildirin.\",\"tw.unshared.cache\":\"Proje yakın zamanda paylaşıldıysa bu mesaj birkaç dakika boyunca hatalı görünebilir.\",\"tw.unshared2.1\":\"Paylaşılmayan projeler artık görünmez.\",\"tw.usernameModal.help\":\"Bu kullanıcı adı web tarayıcının çerezlerinde olacak. Bulut değişkenleri olan projelerle etkileşim kurduğunuzda kaydedilebilir.\",\"tw.usernameModal.help2\":\"Geçerli bir Scratch hesabına karşılık gelen değerler genellikle bulut değişken sunucusu tarafından reddedilirecek. Olduğu gibi ybırakmanızı vea Scratch kullanıcı adınızı değiştirmenizi öneririz.\",\"tw.usernameModal.mustChange\":\"Üzgünüz, bulut değişken sunucusu kullanıcı adınızın güvensiz olabileceğini düşünüyor. Lütfen başka bir şeyle değiştirin yada {resetIt}.\",\"tw.usernameModal.mustChange.resetIt\":\"sıfırlayın (önerildi)\",\"tw.usernameModal.new\":\"Yeni kullanıcı adı:\",\"tw.usernameModal.reset\":\"Sıfırla\",\"tw.usernameModal.title\":\"Adını değiştir\",\"tw.usesCloudVariables\":\"Bu proje bulut değişkenlerini kullanıyor.\",\"tw.usesCloudVariables2\":\"{APP_NAME}\\'in bulut değişkenleri Scratch\\'inkilere bağlı değil. Herkes {changeTheirUsername} herhangi bir şey yapabilir, bu nedenle kimliğe bürünmeye karşı dikkatli olun.\",\"tw.usesCloudVariables2.change\":\"kullanıcı adını değiştir\",\"tw.viewFeaturedProjects\":\"Özellikli projeleri görmek için buraya tıklayınız.\",\"tw.viewOnScratch\":\"Projeyi Scratch\\'te görüntüleyin.\"},\"uk\":{\"tw.accent.blue\":\"Синій\",\"tw.accent.purple\":\"Фіолетовий\",\"tw.accent.rainbow\":\"Різнобарвний\",\"tw.accent.red\":\"Червоний\",\"tw.alerts.creatingRestorePoint\":\"Створення точки відновлення...\",\"tw.alerts.lostPeripheralConnection\":\"Втрачено зв\\'язок з {extensionName}\",\"tw.alerts.restorePointError\":\"Не вдалося створити точку відновлення.\",\"tw.alerts.restorePointSuccess\":\"Отримайте доступ до точок відновлення у відділі \\\\\"Файл\\\\\"\",\"tw.alerts.savedToDisk\":\"Збережено на ваш комп\\'ютер.\",\"tw.backpack.rename\":\"Нова назва:\",\"tw.blockColors.custom\":\"Редагувати в Налаштуваннях Доповнень\",\"tw.blockColors.dark\":\"Темні (Бета)\",\"tw.blockColors.highContrast\":\"Високий контраст\",\"tw.blockColors.three\":\"Оригінальні\",\"tw.blocks.PROCEDURES_DOCS\":\"Як використовувати блоки, що повертають значення\",\"tw.blocks.PROCEDURES_RETURN\":\"повернути {v}\",\"tw.blocks.PROCEDURES_TO_REPORTER\":\"Перетворити На Репортер\",\"tw.blocks.PROCEDURES_TO_STATEMENT\":\"Перетворити На Звичайний\",\"tw.blocks.addons\":\"Доповнення\",\"tw.blocks.buttonIsDown\":\"[MOUSE_BUTTON] кнопку миші натиснуто?\",\"tw.blocks.lastKeyPressed\":\"остання клавіша натиснута\",\"tw.blocks.mouseButton.middle\":\"(1) середня\",\"tw.blocks.mouseButton.primary\":\"(0) основна\",\"tw.blocks.mouseButton.secondary\":\"(2) додаткова\",\"tw.blocks.openDocs\":\"Відкрити документацію\",\"tw.browserModal.desktopSettings\":\"Відкрити Налаштування Програми\",\"tw.browserModal.desktopTitle\":\"Система не підтримується\",\"tw.browserModal.webgl1\":\"{APP_NAME} потребує WebGL, проте, схоже що ваш комп\\'ютер цього не підтримує. Зазвичай це тимчасова помилка, якої можна позбавитись перезавантаживши комп\\'ютер.\",\"tw.browserModal.webglBrowser\":\"Використовуйте нову версію Chrome, Firefox, або Safari, і переконайтеся що ваші драйвери сучасні. Ви можете спробувати увімкнути \\\\\"апаратне прискорення\\\\\" або \\\\\"графічне прискорення\\\\\" у налаштуваннях вашого браузера.\",\"tw.browserModal.webglDesktop\":\"Ви можете спробувати увімкнути \\\\\"апаратне прискорення\\\\\" у налаштуваннях програми:\",\"tw.cantUseCloud\":\"Хоча ви можете створювати хмарні змінні, вони не будуть працювати до тих пір, доки проєкт не буде завантажений на Scratch, або упакований за допомогою {packager}\",\"tw.changeUsername.cannotChangeWhileRunning\":\"Неможливо змінити ім\\'я користувача, поки проєкт працює.\",\"tw.clipboard.danger\":\"Якщо у вашому буфері обміну є такі речі, як паролі, можливо, цей проєкт може передавати їх іншим користувачам або серверам.\",\"tw.clipboard.permission\":\"Доступ до буферу обміну може не надаватися деякими браузерами. Якщо дозволите, то подальші запити будуть автоматично дозволені.\",\"tw.clipboard.title\":\"Цей проєкт хоче бачити вміст вашого буферу обміну.\",\"tw.cloudProvider\":\"Сервер надає: {name}.\",\"tw.cloudServers\":\"Виберіть сервер біля вас:\",\"tw.code\":\"Початковий Код\",\"tw.confirmIncompatibleExtension\":\"Це розширення несумісне зі Scratch. Проєкти, створені за допомогою цього розширення, неможливо завантажити на Scratch. Ви дійсно хочете увімкнути це?\",\"tw.createdBy\":\"Створено:\",\"tw.customCloudServer\":\"Використовується користувальницький сервер хмарних змінних: {server}\",\"tw.customExtension.description\":\"Завантажте користувальницьке розширення з URL, файлу або коду JavaScript.\",\"tw.customExtension.name\":\"Користувальницьке розширення\",\"tw.customExtensionModal.file\":\"Файли\",\"tw.customExtensionModal.load\":\"Завантажити\",\"tw.customExtensionModal.promptFile\":\"Виберіть або закиньте JavaScript файли розширення:\",\"tw.customExtensionModal.promptText\":\"Вставте джерельний JavaScript код розширення:\",\"tw.customExtensionModal.promptURL\":\"Введіть URL розширення:\",\"tw.customExtensionModal.text\":\"Текст\",\"tw.customExtensionModal.title\":\"Завантажити Користувальницьке Розширення\",\"tw.customExtensionModal.trusted\":\"Це розширення буде завантажено без пісочниці, оскільки воно з довіреного джерела.\",\"tw.customExtensionModal.unsandboxed\":\"Запуск без пісочниці\",\"tw.customExtensionModal.unsandboxedWarning1\":\"Завантажувати розширення без пісочниці небезпечно і не має бути дозволено, якщо ви не знаєте що робите.\",\"tw.customExtensionModal.unsandboxedWarning2\":\"Розширення, запущені не в пісочниці, можуть псувати ваш проєкт, видаляти налаштування, вимагати паролі або робити інші погані речі. Розробники {APP_NAME} не відповідальні ні за які результативні проблеми.\",\"tw.customExtensionModal.untrusted\":\"Для безпеки, розширення з не довірених джерел буде завантажено в пісочниці. \",\"tw.customReporters.description\":\"Дозволяє користувальницьким блокам повертати значення а також бути використаними як ввід.\",\"tw.customReporters.name\":\"Користувальницькі Репортери\",\"tw.darkMode\":\"Увімкнути Світлу Тему\",\"tw.desktopCloud\":\"У версії для комп\\'ютера хмарні змінні синхронізуються між усіма відчиненими вікнами на одному комп\\'ютері. Завантажте проєкт на Scratch або використайте {packager}, щоб вони синхронізувалися глобально.\",\"tw.documentation\":\"Документація\",\"tw.download.danger\":\"Цей файл не був перевірений розробниками {APP_NAME}.\",\"tw.download.executable\":\"Це формат виконуваного файлу, який може запустити шкідливий код, якщо ви його відкриєте.\",\"tw.download.file\":\"Проєкт хоче завантажити файл на ваш комп\\'ютер. Його буде збережено як {name} у ваших завантаженнях.\",\"tw.embed.persistent\":\"Якщо ви дозволите, подальші вставки на такий самий сайт будуть автоматично дозволені.\",\"tw.embed.risks\":\"Незважаючи на те, що вставна програма буде ізольована, в неї все одно буде доступ до інформації про ваш пристрій, такої як ваше IP та загальне місцезнаходження.\",\"tw.embed.title1\":\"Проєкт хоче вставити HTML контент поверх сцени:\",\"tw.embed.title2\":\"Проєкт хоче вставити віддалений контент поверх сцени:\",\"tw.extensionGallery.error\":\"Помилка при завантаженні галереї розширень. Перегляньте extensions.turbowarp.org щоб знайти більше розширень.\",\"tw.extensionGallery.loading\":\"Завантажуємо галерею розширень...\",\"tw.extensionGallery.more\":\"Дізнайтеся більше про розширення на сайті extentions.turbowarp.org.\",\"tw.extensionGallery.name\":\"Галерея Розширень {APP_NAME}\",\"tw.favorite\":\"Позначити як улюблений\",\"tw.featuredProjectsStudio\":\"Переглянути студію на Scratch.\",\"tw.feedback\":\"Зв\\'язок з розробником та помилки\",\"tw.feedbackButton\":\"{APP_NAME} Зворотній зв\\'язок\",\"tw.fetch.title\":\"Цей проєкт хоче під\\'єднатися до вебсайту:\",\"tw.fileInput.none\":\"Немає вибраних файлів.\",\"tw.fileInput.selected\":\"Вибрано: {names}\",\"tw.fonts.add\":\"Додати\",\"tw.fonts.custom.file\":\"Виберіть файл з шрифтом зі свого комп\\'ютера:\",\"tw.fonts.custom.name\":\"Назвіть шрифт:\",\"tw.fonts.custom1\":\"Додати шрифт з файлу\",\"tw.fonts.custom2\":\"Може не працювати на Scratch. Підтримувані формати: {formats}\",\"tw.fonts.delete\":\"Ви впевнені, що хочете видалити \\\\\"{font}\\\\\"? В будь-яких векторних образах замість цього буде використано резервний шрифт.\",\"tw.fonts.fallback\":\"Виберіть резервний шрифт, який буде використано, якщо цей шрифт не завантажиться або буде видалено.\",\"tw.fonts.list\":\"Встановлені шрифти:\",\"tw.fonts.none\":\"Покищо не додано ніяких шрифтів.\",\"tw.fonts.readError\":\"Не вдалося прочитати файл шрифту: {error}\",\"tw.fonts.system\":\"Системний шрифт\",\"tw.fonts.system.name\":\"Введіть назву будь якого шрифту, вбудованого на вашому комп\\'ютері. Шрифт може не відображатися правильно для всіх.\",\"tw.fonts.system1\":\"Додати системний шрифт\",\"tw.fonts.system2\":\"Може працювати у Scratch, але не буде відображатися правильно для всіх.\",\"tw.fonts.title\":\"Шрифти\",\"tw.footer.credits\":\"Подяки\",\"tw.footer.disclaimer\":\"{APP_NAME} ніяк не пов\\'язаний зі Scratch, Scratch Team або Scratch Foundation.\",\"tw.footer.documentation\":\"Документація\",\"tw.footer.embed\":\"Вбудовування\",\"tw.footer.parameters\":\"Параметри URL\",\"tw.footer.scratchDisclaimer\":\"Scratch, це проєкт організації Scratch Foundation. Він доступний безкоштовно на {scratchDotOrg}.\",\"tw.fps\":\"{framerate}Кадрів у секунду\",\"tw.geolocate.permission\":\"Якщо ви дозволите, ваш браузер можуть попросити дозволити доступ до місцеположення.\",\"tw.geolocate.title\":\"Цей проєкт хоче знати ваше місцезнаходження.\",\"tw.gui.crashMessage.description\":\"Нам дуже шкода, але схоже що сторінка дала збій. Будь ласка, оновіть сторінку, щоб повторити спробу.\",\"tw.gui.defaultProjectTitle\":\"Проєкт\",\"tw.guiDefaultTitle\":\"Запускайте проєкти Scratch швидше\",\"tw.home.credit\":\"Замітки та Подяки\",\"tw.home.description\":\"{APP_NAME} - це модифікація на Scratch, що компілює проєкти у JavaScript, заставляючи їх працювати набагато швидше. Спробуйте ввести посилання на проєкт вище або виберіть з обраних проєктів нище.\",\"tw.home.instructions\":\"Інструкції\",\"tw.input.tooltip\":\"Скопіюйте та вставте URL адресу Scratch проєкту сюди!\",\"tw.interpolationEnabled\":\"Інтерполяція\",\"tw.invalidParameters.clones\":\"Параметр \\\\\"clone\\\\\" в URL некоректний\",\"tw.invalidParameters.fps\":\"Параметр \\\\\"fps\\\\\" в URL некоректний\",\"tw.invalidProject.error\":\"Не вийшло завантажити проєкт:\",\"tw.invalidProject.options\":\"Можливо, ви можете відновити старішу версію проєкту з автоматичних точок відновлення, або з його резервних копій.\",\"tw.invalidProject.reportIt\":\"надішліть звіт\",\"tw.invalidProject.restorePoints\":\"Переглянути Точки Відновлення\",\"tw.invalidProject.title\":\"Помилка\",\"tw.invalidProject.validationError\":\"Зазвичай ця помилка означає, що невеличка частина проєкту була пошкоджена, але це може бути не так. Тому {reportIt} про це, будь ласка.\",\"tw.lightMode\":\"Увімкнути Темну Тему\",\"tw.loadExtension.embedded\":\"Цей проєкт хоче завантажити користувальницьке розширення з кодом:\",\"tw.loadExtension.sandboxed\":\"Незважаючи на те, що код буде ізольований, в нього все одно буде доступ до інформації про ваш пристрій, такої як ваше IP та загальне місцезнаходження. Перед тим як продовжити, переконайтеся, що ви довіряєте автору цього розширення.\",\"tw.loadExtension.unsandboxed\":\"Запуск без пісочниці\",\"tw.loadExtension.unsandboxedWarning\":\"Завантажувати розширення без пісочниці небезпечно. Вони можуть пошкодити ваш проєкт, видалити налаштування, вимагати паролі або робити інші погані речі. Розробники {APP_NAME} не відповідальні ні за які результативні проблеми.\",\"tw.loadExtension.url\":\"Цей проєкт хоче завантажити користувальницьке розширення з посилання:\",\"tw.loader.downloadingAssets\":\"Завантаження ресурсів ({complete}/{total}) ...\",\"tw.loader.loadingAssets\":\"Завантаження ресурсів ({complete}/{total}) ...\",\"tw.loader.projectData\":\"Завантаження проєкту...\",\"tw.menuBar.60off\":\"Вимкнути режим 60 FPS\",\"tw.menuBar.60on\":\"Увімкнути режим 60 FPS\",\"tw.menuBar.accent\":\"Акцентний колір\",\"tw.menuBar.addons\":\"Доповнення\",\"tw.menuBar.advanced\":\"Розширені\",\"tw.menuBar.blockColors\":\"Кольори Блоків\",\"tw.menuBar.changeUsername\":\"Змінити ім\\'я користувача\",\"tw.menuBar.cloudOff\":\"Вимкнути хмарні змінні\",\"tw.menuBar.cloudOn\":\"Увімкнути хмарні змінні\",\"tw.menuBar.cloudUnavailable\":\"Хмарні змінні недоступні\",\"tw.menuBar.cloudUnavailableAlert\":\"Не вдається використати хмарні змінні, швидше за все, тому що ви відкрили редактор.\",\"tw.menuBar.desktopSettings\":\"Налаштування робочого столу\",\"tw.menuBar.moreSettings\":\"Розширені Налаштування\",\"tw.menuBar.newFramerate\":\"Нова частота кадрів:\",\"tw.menuBar.newWindow\":\"Нове вікно\",\"tw.menuBar.package\":\"Упакувати проєкт\",\"tw.menuBar.reportError1\":\"В деяких скриптах з\\'явилися помилки.\",\"tw.menuBar.reportError2\":\"Це помилка. Будь-ласка, повідомте нам про це.\",\"tw.menuBar.restorePoints\":\"Точки відновлення\",\"tw.menuBar.saveAs\":\"Зберегти як {file}\",\"tw.menuBar.seeInside\":\"Переглянути код\",\"tw.mono\":\"Моно\",\"tw.moreCloud\":\"Дізнайтеся більше про хмарні змінні.\",\"tw.notify.permission\":\"Якщо дозволите, ваш браузер може також пропонувати вам увімкнути сповіщення, тоді подальші запити на показ сповіщень будуть автоматично дозволені.\",\"tw.notify.title\":\"Цей проєкт хоче показувати сповіщення.\",\"tw.oldDownload\":\"Зберегти як окремий файл...\",\"tw.opcode.2000\":\"днів від 2000 року\",\"tw.opcode.mousedown\":\"мишку натиснуто?\",\"tw.opcode.mousex\":\"вказівник x\",\"tw.opcode.mousey\":\"вказівник y\",\"tw.openAdvanced\":\"Відкрити розширені налаштування\",\"tw.openWindow.dangerous\":\"Цей сайт не був перевірений розробниками {APP_NAME}. Він може містити небезпечний або шкідливий код.\",\"tw.openWindow.title\":\"Даний проєкт хоче відкрити нове вікно або вкладку за посиланням:\",\"tw.paint.alpha\":\"Непрозорість\",\"tw.paint.fonts.more\":\"Додати більше шрифтів...\",\"tw.pen.stageSelected\":\"Вибрано сцену: менше блоків для пера\",\"tw.privacy\":\"Політика Конфіденсійності\",\"tw.recordAudio.permission\":\"Якщо дозволите, ваш браузер може також пропонувати вам надати доступ до мікрофону, тоді подальші запити на доступ до мікрофону будуть автоматично дозволені.\",\"tw.recordAudio.title\":\"Проєкт хоче записати аудіо з вашого мікрофону. Це може включати текстову розшифровку або необроблені аудіодані. Він може мати можливість обмінюватися цими даними з іншими користувачами або серверами.\",\"tw.recordVideo.permission\":\"Якщо дозволите, ваш браузер може також пропонувати вам надати доступ до камери, тоді подальші запити на доступ до камери будуть автоматично дозволені.\",\"tw.recordVideo.title\":\"Проєкт хоче записати відео з вашої камери. Можливо, проєкт зможе обмінюватися зображеннями з іншими користувачами або серверами.\",\"tw.redirect.dangerous\":\"Цей сайт не був перевірений розробниками {APP_NAME}. Він може містити небезпечний або шкідливий код.\",\"tw.redirect.title\":\"Проєкт хоче перевести цю вкладку за посиланням:\",\"tw.removedTrademarks\":\"Деякі спрайти та образи з торговою маркою Scratch більше не відображаються у цьому списку.\",\"tw.restorePoints.1minute\":\"кожної хвилини\",\"tw.restorePoints.assets\":\"{n} ресурсів\",\"tw.restorePoints.confirmDelete\":\"Ви впевнені, що хочете видалити \\\\\"{projectTitle}\\\\\"? Цю дію не можна відмінити.\",\"tw.restorePoints.confirmDeleteAll\":\"Ви впевнені, що хочете видалити ВСІ точки відновлень? Цю дію не можна відмінити.\",\"tw.restorePoints.confirmLoad\":\"У вас є незбережені зміни. Замінити поточний проєкт?\",\"tw.restorePoints.deleteAll\":\"Видалити все\",\"tw.restorePoints.description\":\"{APP_NAME} періодично зберігає точки відновлення на вашому комп\\'ютері, щоб допомогти вам відновити ваш проєкт, якшо ви забудете зберегти його. Це створено, як остання можливість відновити ваш проєкт. Ваш комп\\'ютер може автоматично видаляти їх будь-коли. НЕ ПОКЛАДАЙТЕСЯ на цю функцію.\",\"tw.restorePoints.empty\":\"Точок відновлення не знайдено.\",\"tw.restorePoints.error\":\"Помилка при завантаженні точки відновлення: {error}\",\"tw.restorePoints.exportError\":\"Помилка при експортуванні точки відновлення: {error}\",\"tw.restorePoints.intervalOption\":\"Точки відновлення буде створювано {time}.\",\"tw.restorePoints.loading\":\"Завантаження...\",\"tw.restorePoints.minutes\":\"кожні {n} хвилин\",\"tw.restorePoints.never\":\"ніколи\",\"tw.restorePoints.off\":\"Вимикати точки відновлення небезпечно.\",\"tw.restorePoints.size\":\"Використано пам\\'яті: {size}\",\"tw.restorePoints.size2\":\"Образи та звуки, які використовуються кількома точками відновлення одночасно, зберігаються лише один раз.\",\"tw.restorePoints.title\":\"Точки Відновлення\",\"tw.sample\":\"Проєкт-шаблон\",\"tw.saveAs\":\"Зберегти як...\",\"tw.saveTo\":\"Зберегти як {file}\",\"tw.scratchUnsafeCloud\":\"Якщо ви створите цю хмарну змінну, проєкт перевищить ліміт Scratch в {number} змінних, тому деякі змінні не працюватимуть, якщо завантажити проєкт на Scratch.\",\"tw.securityManager.allow\":\"Дозволити\",\"tw.securityManager.deny\":\"Відхилити\",\"tw.securityManager.title\":\"Система Безпеки\",\"tw.securityManager.trust\":\"Якщо ви дозволите, подальші запити на такий самий сайт будуть автоматично дозволені.\",\"tw.securityManager.why\":\"Це може бути використано, щоб завантажувати зображення або звуки, реалізації багатокористувальницької гри, доступу до API, або в зловмисних цілях. При цьому сайт отримає доступ до вашої IP адреси, загальному місцеположенню та, можливо, іншим даним.\",\"tw.settingsModal.customStageSize\":\"Користувальницький розмір сцени:\",\"tw.settingsModal.customStageSizeHelp\":\"Змінює розмір сцени з 480x360 на щось інше. Спробуйте використати 640x360, щоб зробити сцену широкоформатною. Тільки одиниці з проєктів будуть працювати правильно з цим налаштуванням.\",\"tw.settingsModal.dangerZone\":\"Небезпечна Зона\",\"tw.settingsModal.disableCompiler\":\"Вимкнути Компілятор\",\"tw.settingsModal.disableCompilerHelp\":\"Вимикає компілятор {APP_NAME}. Ви можете вмикати цю опцію, коли ви редагуєте проект, щоб скрипти оновлювалися моментально. В інших випадках вам не варто вмикати цю опцію.\",\"tw.settingsModal.featured\":\"Обране\",\"tw.settingsModal.fps\":\"60 FPS (Користувальницькі FPS)\",\"tw.settingsModal.fpsHelp\":\"Виконує скрипти 60 раз в секунду замість 30. Більшість проєктів не будуть працювати належним чином, коли цей параметр увімкнено. Якщо це так, спробуйте інтерполяцію з вимкненим режимом 60 FPS.{customFramerate}.\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Натисніть, щоб використати іншу частоту кадрів, замість 30 або 60\",\"tw.settingsModal.help\":\"Натисніть, щоб побачити подробиці\",\"tw.settingsModal.highQualityPen\":\"Перо Високої Якості\",\"tw.settingsModal.highQualityPenHelp\":\"Дозволяє виконувати візуалізацію пера з більш високою якістю, також вимикає деякі округлення координат в редакторі. Цей параметр корисний не для всіх проєктів, і може вплинути на продуктивність.\",\"tw.settingsModal.infiniteClones\":\"Безмежна Кількість Клонів\",\"tw.settingsModal.infiniteClonesHelp\":\"Вимикає ліміт Scratch на 300 клонів.\",\"tw.settingsModal.interpolation\":\"Інтерполяція\",\"tw.settingsModal.interpolationHelp\":\"Інтерполює рухи спрайтів, роблячи проєкт більш плавним. Не використовуйте інтерполяцію в 3D проєктах, проєктах з трассуванням променів, проєктах на основі пера та повільних проєктах, оскільки інтерполяція не зробить їх більш плавними, і навіть негативно вплине на їх швидкість.\",\"tw.settingsModal.largeStageWarning\":\"Використовувати настільки великий розмір сцени не рекомендується! Краще використовуйте сцену меншого розміру, але з таким самим співвідношенням сторін і дайте повноекранному режиму збільшити сцену так, щоб вона могла підійти по розміру до дисплею користувача.\",\"tw.settingsModal.removeFencing\":\"Прибрати Рамку\",\"tw.settingsModal.removeFencingHelp\":\"Дозволяє спрайтам виходити за межі сцени, ставати настільки великими або маленькими, наскільки вони захочуть, та робить так, щоб блоки доторкань працювали за межами сцени.\",\"tw.settingsModal.removeLimits\":\"Прибрати Обмеження\",\"tw.settingsModal.removeMiscLimits\":\"Прибрати Різні Обмеження\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Прибирає обмеження звукових еффектів та розміру пера.\",\"tw.settingsModal.storeProjectOptions\":\"Зберегти налаштування у проєкті\",\"tw.settingsModal.storeProjectOptionsHelp\":\"Зберігає вибрані налаштування в проєкті щоб вони автоматично застосовувалися, коли проєкт відкривається TurboWarp\\'ом. Warp Таймер і відключення компілятора не буде збережено. \",\"tw.settingsModal.title\":\"Розширені Налаштування\",\"tw.settingsModal.warpTimer\":\"Warp Таймер\",\"tw.settingsModal.warpTimerHelp\":\"Перевіряє, які скрипти застрягли в довгому, або безкінечному циклі та знижує часоту кадрів, замість того щоб проєкт застиг, доки цикл не завершиться. Це виправляє велику частину критичних помилок, але це негативно впливає на швидкість проєкту, тому за умовчанням цей параметр увімкнений тільки в редакторі.\",\"tw.soundEditorNotSupported\":\"Редактор звуків не підтримується в цьому браузері.\",\"tw.spriteSelectorItem.rename\":\"перейменувати\",\"tw.stageHeader.full\":\"На весь екран\",\"tw.stereo\":\"Стерео\",\"tw.stereoAlert\":\"Редактування цого стерео звуку приведе до його конвертування в моно.\",\"tw.studioview.authorAttribution\":\"від {author}\",\"tw.studioview.error\":\"При завантаженні наступної сторінки проєктів сталася помилка.\",\"tw.studioview.hoverText\":\"{title} від {author}\",\"tw.tooLarge\":\"Цей звук може бути занадто великим для експорту на Scratch.\",\"tw.twExtension.description\":\"Дивні нові блоки.\",\"tw.twExtension.name\":\"Блоки {APP_NAME}\",\"tw.unfavorite\":\"Прибрати марку\",\"tw.unknownPlatform.1\":\"Цей проєкт був створений для іншої платформи:\",\"tw.unknownPlatform.2\":\"Сумісність з {APP_NAME} не гарантована. Якщо ви продовжите, це буде на вашій відповідальності, і ми, можливо, не зможемо вам допомогти, якщо з\\'являться проблеми.\",\"tw.unknownPlatform.continue\":\"Я розумію\",\"tw.unknownPlatform.title\":\"Невідома Платформа\",\"tw.unshared.2\":\"Перейдіть на {link}, щоб отримати більше інформації\",\"tw.unshared.bug\":\"Якщо насправді цей проєкт опубліковано, повідомте нам про помилку.\",\"tw.unshared.cache\":\"Якщо проєкт був опублікований нещодавно, це повідомлення може відображатися ще декілька хвилин.\",\"tw.unshared2.1\":\"Проєкти, що не опубліковані, більше не є доступними.\",\"tw.usernameModal.help\":\"Це значення буде зберігатися в пам\\'яті вашого браузера. Воно буде використовуватися, коли ви взаємодієте з проєктами, що містять хмарні змінні.\",\"tw.usernameModal.help2\":\"Значення, які не відповідають дійсному обліковому запису Scratch, зазвичай відхиляються сервером хмарних змінних. Ми рекомендуємо залишити його як є або змінити його на своє ім\\'я користувача в Scratch.\",\"tw.usernameModal.mustChange\":\"Вибачте, сервер хмарних змінних вважає, що ваше ім\\'я користувача неприйнятне, Будь-ласка змініть ім\\'я користувача на щось інше або на {resetIt}\",\"tw.usernameModal.mustChange.resetIt\":\"скинути його (рекомендовано)\",\"tw.usernameModal.new\":\"Нове ім\\'я користувача:\",\"tw.usernameModal.reset\":\"Скинути\",\"tw.usernameModal.title\":\"Змінити ім\\'я користувача\",\"tw.usesCloudVariables\":\"Цей проєкт використовує хмарні змінні.\",\"tw.usesCloudVariables2\":\"Хмарні змінні {APP_NAME} не під\\'єднані до Scratch. Будь хто може {changeTheirUsername}, тому остерігайтеся уособлення.\",\"tw.usesCloudVariables2.change\":\"змінити своє ім\\'я користувача\",\"tw.viewFeaturedProjects\":\"Натисніть щоб переглянути обрані проєкти.\",\"tw.viewOnScratch\":\"Переглянути проєкт на Scratch\"},\"vi\":{\"tw.alerts.creatingRestorePoint\":\"Đang tạo điiểm khôi phục\",\"tw.alerts.lostPeripheralConnection\":\"Mất kết nối từ {extensionName}\",\"tw.alerts.savedToDisk\":\"Đã lưu vời máy tính bạn.\",\"tw.backpack.rename\":\"Tên mới:\",\"tw.blocks.openDocs\":\"Mở tài liệu\",\"tw.changeUsername.cannotChangeWhileRunning\":\"Tên người dùng không thể đổi khi dự án đang chạy.\",\"tw.fps\":\"{framerate}FPS\",\"tw.gui.crashMessage.description\":\"Chúng tôi xin lỗi, nhưng hình như trang có vấn đề. Xin vui lòng tải lại trang của bạn để thử lại.\",\"tw.home.credit\":\"Ghi chú và Tín dụng\",\"tw.home.instructions\":\"Hướng đẫn\",\"tw.input.tooltip\":\"Sao chép và đán một đường dẫn dự án Scratch vào đây!\",\"tw.loader.projectData\":\"Đang tải dự án...\",\"tw.menuBar.60off\":\"Tắt chế độ 60 FPS\",\"tw.menuBar.60on\":\"Bật chế độ 60 FPS\",\"tw.menuBar.advanced\":\"Nâng cao\",\"tw.menuBar.changeUsername\":\"Đổi tên người dùng\",\"tw.menuBar.cloudOff\":\"Vô hiệu hóa biến đám mây\",\"tw.menuBar.cloudOn\":\"Kích hoạt biến đám mây\",\"tw.menuBar.cloudUnavailable\":\"Biến đám mây không có sẵn\",\"tw.menuBar.cloudUnavailableAlert\":\"Không thể dùng biến đám mây, hầu như vì bạn mở phần chỉnh sửa\",\"tw.menuBar.moreSettings\":\"Cài đặt nâng cao\",\"tw.menuBar.newFramerate\":\"Tỷ lệ mới:\",\"tw.menuBar.package\":\"Đóng gói dự án\",\"tw.menuBar.reportError2\":\"Đây là một lỗi. Xin vui lòng báo cáo.\",\"tw.menuBar.saveAs\":\"Lưu thành {file}\",\"tw.menuBar.seeInside\":\"Xem bên trong\",\"tw.oldDownload\":\"Lưu để tách tệp tin...\",\"tw.saveAs\":\"Lưu thành...\",\"tw.saveTo\":\"Lưu về {file}\",\"tw.settingsModal.customStageSize\":\"Cỡ sân khấu tùy chỉnh:\",\"tw.settingsModal.dangerZone\":\"Vùng nguy hiểm\",\"tw.settingsModal.disableCompiler\":\"Vô hiệu hóa biên dịch\",\"tw.settingsModal.featured\":\"Đặc sắc\",\"tw.settingsModal.fps\":\"60 FPS (FPS tủy chỉnh)\",\"tw.settingsModal.fpsHelp.customFramerate\":\"Bấm để dùng một tỷ lệ khung hình từ 30 hoặc 60\",\"tw.settingsModal.help\":\"Bấm để hỗ trợ\",\"tw.settingsModal.highQualityPen\":\"Bút chất lượng Cao\",\"tw.settingsModal.infiniteClones\":\"Bản sao vô hạn\",\"tw.settingsModal.infiniteClonesHelp\":\"Vô hiệu hóa giới hạn 300 bản sao của Scratch\",\"tw.settingsModal.removeLimits\":\"Xóa giới hạn\",\"tw.settingsModal.removeMiscLimits\":\"Xóa các giới hạn khác\",\"tw.settingsModal.removeMiscLimitsHelp\":\"Xóa giới hạn hiệu ứng âm thanh và cỡ bút.\",\"tw.settingsModal.storeProjectOptions\":\"Lưu trữ cài đặt trong dự án\",\"tw.settingsModal.title\":\"Cài đặt nâng cao\",\"tw.spriteSelectorItem.rename\":\"đổi tên thành\",\"tw.studioview.authorAttribution\":\"bởi {author}\",\"tw.studioview.error\":\"Hình như có một lỗi tải trang tiếp theo của dự án\",\"tw.studioview.hoverText\":\"{title} bởi {author}\",\"tw.usernameModal.mustChange.resetIt\":\"cài lại (khuyến nghị)\",\"tw.usernameModal.reset\":\"Cài đặt lại\",\"tw.usernameModal.title\":\"Đổi tên người dùng\",\"tw.viewFeaturedProjects\":\"Bấm để xem dự án đặc sắc\",\"tw.viewOnScratch\":\"Xem dự án trên Scratch\"},\"zh-cn\":{\"tw.accent.blue\":\"蓝色\",\"tw.accent.purple\":\"紫色\",\"tw.accent.rainbow\":\"彩虹色\",\"tw.accent.red\":\"红色\",\"tw.alerts.creatingRestorePoint\":\"新建还原点中...\",\"tw.alerts.lostPeripheralConnection\":\"与 {extensionName} 的连接中断了。\",\"tw.alerts.restorePointError\":\"无法创建还原点\",\"tw.alerts.restorePointSuccess\":\"可在“文件”菜单中访问还原点\",\"tw.alerts.savedToDisk\":\"已保存至您的计算机。\",\"tw.backpack.rename\":\"新名称:\",\"tw.blockColors.custom\":\"请在插件设置中自定义\",\"tw.blockColors.dark\":\"深色(测试)\",\"tw.blockColors.highContrast\":\"高对比度\",\"tw.blockColors.three\":\"原样式\",\"tw.blocks.PROCEDURES_DOCS\":\"如何使用返回值\",\"tw.blocks.PROCEDURES_RETURN\":\"返回 {v}\",\"tw.blocks.PROCEDURES_TO_REPORTER\":\"转换为返回值积木\",\"tw.blocks.PROCEDURES_TO_STATEMENT\":\"转换为命令积木\",\"tw.blocks.addons\":\"插件\",\"tw.blocks.buttonIsDown\":\"按下鼠标[MOUSE_BUTTON]键?\",\"tw.blocks.lastKeyPressed\":\"最后按下的按键\",\"tw.blocks.mouseButton.middle\":\"(1) 中键\",\"tw.blocks.mouseButton.primary\":\"(0) 左键\",\"tw.blocks.mouseButton.secondary\":\"(2) 右键\",\"tw.blocks.openDocs\":\"打开文档\",\"tw.browserModal.desktopSettings\":\"打开桌面设置\",\"tw.browserModal.desktopTitle\":\"系统不支持\",\"tw.browserModal.webgl1\":\"{APP_NAME}需要 WebGL ,但是您的电脑似乎不支持它。这通常是临时性错误,可以通过重启电脑修复\",\"tw.browserModal.webglBrowser\":\"使用最新版本的 Chrome、Firefox 或 Safari,并确保您的显卡驱动程序是最新的。您还可以尝试在浏览器设置中切换“图形加速”或“硬件加速”选项。\",\"tw.browserModal.webglDesktop\":\"您还可以尝试在桌面设置中切换“图形加速”选项:\",\"tw.cantUseCloud\":\"你创建的云变量仅在被上传到有云变量功能的网站或使用 {packager} 这样的工具转换时才生效。\",\"tw.changeUsername.cannotChangeWhileRunning\":\"作品运行时无法更改用户名。\",\"tw.clipboard.danger\":\"如果你的剪贴板包含像密码之类的内容,此作品可能会共享这些给其他用户或服务器。\",\"tw.clipboard.permission\":\"在一些浏览器上,剪贴板可能不允许被访问。如果允许,以后对剪贴板的读取将自动允许。\",\"tw.clipboard.title\":\"此作品想要获取你剪贴板的数据。\",\"tw.cloudProvider\":\"云变量服务器由 {name} 提供。\",\"tw.cloudServers\":\"选择您附近的服务器:\",\"tw.code\":\"源代码\",\"tw.confirmIncompatibleExtension\":\"此扩展与 Scratch 不兼容。用它制作的作品不能上传到 Scratch 网站。您确定要启用它吗?\",\"tw.createdBy\":\"作者:\",\"tw.customCloudServer\":\"使用自定义云变量服务器:{server}\",\"tw.customExtension.description\":\"从 URL 网址、文件或 JavaScript 源代码加载自定义扩展。\",\"tw.customExtension.name\":\"自定义扩展\",\"tw.customExtensionModal.file\":\"文件\",\"tw.customExtensionModal.load\":\"加载\",\"tw.customExtensionModal.promptFile\":\"选择或拖放扩展的JavaScript文件:\",\"tw.customExtensionModal.promptText\":\"粘贴扩展的 JavaScript 源代码:\",\"tw.customExtensionModal.promptURL\":\"输入扩展的 URL:\",\"tw.customExtensionModal.text\":\"文本\",\"tw.customExtensionModal.title\":\"加载自定义扩展\",\"tw.customExtensionModal.trusted\":\"因为此扩展来自可信任的来源,它将在非沙盒环境下运行。\",\"tw.customExtensionModal.unsandboxed\":\"在非沙盒环境下运行\",\"tw.customExtensionModal.unsandboxedWarning1\":\"在没有沙盒的情况下加载扩展是危险的,如果你不知道自己在做什么,就不应该启用它。\",\"tw.customExtensionModal.unsandboxedWarning2\":\"未被沙盒隔离的扩展可能会使你的作品报错,删除你的设置,盗取你的密码,或造成其他严重后果。{APP_NAME} 开发人员不对由此产生的任何问题负责。\",\"tw.customExtensionModal.untrusted\":\"为了保障安全,来自不可信任的 URL 网址的扩展将总是在沙盒环境下运行。\",\"tw.customReporters.description\":\"允许自制积木提供返回值。\",\"tw.customReporters.name\":\"自定义返回值\",\"tw.darkMode\":\"切换到亮色主题\",\"tw.desktopCloud\":\"在桌面版应用中,云变量只会在这台电脑上的所有桌面版应用窗口间同步。将作品上传到 Scratch 或使用类似{packager}的工具来让它们在全球范围内同步。\",\"tw.documentation\":\"文档\",\"tw.download.danger\":\"此文件尚未经由{APP_NAME}的开发者审查。\",\"tw.download.executable\":\"此文件为可执行文件,运行可能导致您的电脑受到恶意代码的损害。\",\"tw.download.file\":\"此作品想要向您的电脑上下载一个文件。该文件将会在您的下载目录中以{name}的名称被保存。\",\"tw.embed.persistent\":\"如果允许,将自动允许后续同一站点的嵌入内容。\",\"tw.embed.risks\":\"即使嵌入内容在沙盒中运行,它仍能访问像IP地址或大概位置等设备信息。\",\"tw.embed.title1\":\"此作品想要在舞台上嵌入 HTML 内容:\",\"tw.embed.title2\":\"此作品想要在舞台上嵌入在线内容:\",\"tw.extension.faceSensing.description\":\"使用摄像头侦测人脸。\",\"tw.extension.faceSensing.name\":\"人脸侦测\",\"tw.extensionGallery.error\":\"加载扩展库时出错。 访问 extensions.turbowarp.org 以查找更多扩展。\",\"tw.extensionGallery.loading\":\"正在加载扩展库……\",\"tw.extensionGallery.more\":\"要了解有关扩展的更多信息,请访问 extensions.turbowarp.org\",\"tw.extensionGallery.name\":\"{APP_NAME}扩展库\",\"tw.favorite\":\"收藏\",\"tw.featuredProjectsStudio\":\"在 Scratch 上查看工作室\",\"tw.feedback\":\"反馈与漏洞提交\",\"tw.feedbackButton\":\"{APP_NAME} 反馈\",\"tw.fetch.title\":\"此作品想要连接该网站:\",\"tw.fileInput.none\":\"未选择文件。\",\"tw.fileInput.selected\":\"选中:{names}\",\"tw.fonts.add\":\"添加\",\"tw.fonts.custom.file\":\"从你的电脑中选择一个字体文件\",\"tw.fonts.custom.name\":\"给字体命名:\",\"tw.fonts.custom1\":\"从文件添加字体\",\"tw.fonts.custom2\":\"通常在 Scratch 中不起作用。支持的格式包括:{formats}\",\"tw.fonts.delete\":\"您确定要删除“{font}”吗?所有矢量造型的该字体将使用备用字体代替。\",\"tw.fonts.fallback\":\"选择字体加载失败或被删除时的备用字体:\",\"tw.fonts.list\":\"已安装字体:\",\"tw.fonts.none\":\"尚未添加字体。\",\"tw.fonts.readError\":\"读取字体文件失败:{error}\",\"tw.fonts.system\":\"系统字体\",\"tw.fonts.system.name\":\"输入电脑中的字体名称。这个字体可能无法对所有人正确显示。\",\"tw.fonts.system1\":\"添加系统字体\",\"tw.fonts.system2\":\"也许能在 Scratch 中运行,但不一定所有人都能正确显示。\",\"tw.fonts.title\":\"字体\",\"tw.footer.credits\":\"鸣谢\",\"tw.footer.disclaimer\":\"{APP_NAME} 不属于 Scratch、Scratch 团队或 Scratch 基金会。\",\"tw.footer.documentation\":\"文档\",\"tw.footer.embed\":\"将作品嵌入到网站\",\"tw.footer.parameters\":\"网址参数\",\"tw.footer.scratchDisclaimer\":\"Scratch 是 Scratch 基金会的一个项目。它可在 {scratchDotOrg} 免费使用。\",\"tw.fps\":\"{framerate} 帧\",\"tw.geolocate.permission\":\"如果允许,浏览器可能会向您获取位置访问权限的许可。\",\"tw.geolocate.title\":\"此作品希望知道您的位置。\",\"tw.gui.crashMessage.description\":\"抱歉,页面似乎已经崩溃。请刷新页面以重试。\",\"tw.gui.defaultProjectTitle\":\"作品\",\"tw.guiDefaultTitle\":\"让 Scratch 作品快如闪电\",\"tw.home.credit\":\"备注与鸣谢\",\"tw.home.description\":\"{APP_NAME} 是一款可以将作品编译成 JavaScript,使其运行速度快如闪电的 Scratch 的修改版。不妨在上面输入一个 Scratch 官网的作品 ID 或网页链接,或者在下面选择一个特色作品。\",\"tw.home.instructions\":\"操作说明\",\"tw.input.tooltip\":\"在这里粘贴一个 Scratch 作品的链接!\",\"tw.interpolationEnabled\":\"补帧\",\"tw.invalidParameters.clones\":\"“clone” URL 参数不合法\",\"tw.invalidParameters.fps\":\"“fps” URL 参数不合法\",\"tw.invalidProject.error\":\"无法加载作品:\",\"tw.invalidProject.options\":\"你可以从自动创建的还原点或其他备份中恢复这个作品的旧版本。\",\"tw.invalidProject.reportIt\":\"上报\",\"tw.invalidProject.restorePoints\":\"查看还原点\",\"tw.invalidProject.sb3fix\":\"使用 sb3fix\",\"tw.invalidProject.title\":\"错误\",\"tw.invalidProject.validationError\":\"这个错误通常意味着作品的一小部分已损坏,但其他部分仍然正常。这很容易修复,所以请{reportIt}。\",\"tw.invalidProject.zipCorruption\":\"这个错误通常意味着文件已损坏,例如存储设备故障,电源耗尽或者热插拔 USB 存储器。为了修复这种问题,可以尝试 {usingSb3fix}\",\"tw.lightMode\":\"切换到暗色主题\",\"tw.loadExtension.embedded\":\"此作品希望通过以下代码加载一个自定义扩展:\",\"tw.loadExtension.sandboxed\":\"即使代码在沙盒中运行,它仍能访问像IP地址或大概位置等设备信息。请在继续使用扩展前确保你信任此作者。\",\"tw.loadExtension.unsandboxed\":\"在非沙盒环境下运行\",\"tw.loadExtension.unsandboxedWarning\":\"未被沙盒隔离的扩展可能会使你的作品报错,删除你的设置,盗取你的密码,或造成其他严重后果。{APP_NAME} 开发人员不对由此产生的任何问题负责。\",\"tw.loadExtension.url\":\"此作品想通过此URL网址加载一个自定义扩展:\",\"tw.loader.downloadingAssets\":\"下载素材中……(第 {complete} / {total} 个)\",\"tw.loader.loadingAssets\":\"加载素材中……(第{complete}/{total}个)\",\"tw.loader.projectData\":\"加载作品中……\",\"tw.menuBar.60off\":\"关闭 60 帧模式\",\"tw.menuBar.60on\":\"打开 60 帧模式\",\"tw.menuBar.accent\":\"主题色\",\"tw.menuBar.addons\":\"插件\",\"tw.menuBar.advanced\":\"高级\",\"tw.menuBar.blockColors\":\"积木颜色\",\"tw.menuBar.changeUsername\":\"更改用户名\",\"tw.menuBar.cloudOff\":\"禁用云变量\",\"tw.menuBar.cloudOn\":\"启用云变量\",\"tw.menuBar.cloudUnavailable\":\"云变量不可用\",\"tw.menuBar.cloudUnavailableAlert\":\"无法使用云变量,可能因为你打开了编辑器。\",\"tw.menuBar.compileError\":\"{sprite}:{error}\",\"tw.menuBar.desktopSettings\":\"桌面设置\",\"tw.menuBar.moreSettings\":\"高级设置\",\"tw.menuBar.newFramerate\":\"帧率:\",\"tw.menuBar.newWindow\":\"新窗口\",\"tw.menuBar.package\":\"打包作品\",\"tw.menuBar.reportError1\":\"一些脚本在编译时发生了错误。\",\"tw.menuBar.reportError2\":\"这是一个漏洞,请将它报告给开发团队。 \",\"tw.menuBar.restorePoints\":\"还原点\",\"tw.menuBar.saveAs\":\"另存为 {file}\",\"tw.menuBar.seeInside\":\"转到源代码\",\"tw.mono\":\"单声道\",\"tw.moreCloud\":\"了解有关云变量的更多信息\",\"tw.notify.permission\":\"如果允许,浏览器可能会提醒你启用通知,以后对通知的显示将自动允许。\",\"tw.notify.title\":\"此作品希望显示通知。\",\"tw.oldDownload\":\"保存到文件\",\"tw.opcode.2000\":\"2000年至今的天数\",\"tw.opcode.mousedown\":\"按下鼠标?\",\"tw.opcode.mousex\":\"鼠标的x坐标\",\"tw.opcode.mousey\":\"鼠标的y坐标\",\"tw.openAdvanced\":\"打开高级设置\",\"tw.openWindow.dangerous\":\"该网站未被 {APP_NAME} 开发人员审核。它可能包含危险或恶意的代码。\",\"tw.openWindow.title\":\"此作品希望通过此URL网址打开新的窗口或标签页:\",\"tw.paint.alpha\":\"不透明度\",\"tw.paint.fonts.more\":\"添加更多字体……\",\"tw.pen.stageSelected\":\"已选中舞台:仅有限画笔积木可用\",\"tw.privacy\":\"隐私政策\",\"tw.recordAudio.permission\":\"如果允许,浏览器可能会提醒你启用麦克风,以后对麦克风的访问将自动允许。\",\"tw.recordAudio.title\":\"此作品想通过你的麦克风录入音频。这可能包含转文字结果或原始音频。此作品可能会共享这些音频给其他用户或服务器。\",\"tw.recordVideo.permission\":\"如果允许,浏览器可能会提醒你启用摄像头,以后对摄像头的访问将自动允许。\",\"tw.recordVideo.title\":\"此作品想从你的摄像头录制视频。此作品可能会与其他用户或服务器共享图像。\",\"tw.redirect.dangerous\":\"该网站未被 {APP_NAME} 开发人员审核。它可能包含危险或恶意的代码。\",\"tw.redirect.title\":\"此作品想跳转至此网址:\",\"tw.removedTrademarks\":\"此处不再列出某些包含 Scratch 商标的物品。\",\"tw.restorePoints.1minute\":\"每分钟\",\"tw.restorePoints.assets\":\"{n} 个素材\",\"tw.restorePoints.confirmDelete\":\"您确定要删除\\\\\"{projectTitle}\\\\\"吗?这将无法恢复。\",\"tw.restorePoints.confirmDeleteAll\":\"您确定要删除所有还原点吗?这将无法恢复。\",\"tw.restorePoints.confirmLoad\":\"您有未保存的更改。替换现有作品?\",\"tw.restorePoints.deleteAll\":\"删除全部\",\"tw.restorePoints.description\":\"{APP_NAME} 会定期在计算机上保存还原点,以便在忘记保存时帮助恢复作品。这是恢复的最后手段。您的计算机可能会随时悄悄删除这些还原点。请勿依赖此功能。\",\"tw.restorePoints.empty\":\"未找到还原点。\",\"tw.restorePoints.error\":\"加载还原点时出错:{error}\",\"tw.restorePoints.exportError\":\"导出还原点时出错:{error}\",\"tw.restorePoints.intervalOption\":\"{time}创建还原点\",\"tw.restorePoints.loading\":\"加载中……\",\"tw.restorePoints.minutes\":\"每 {n} 分钟\",\"tw.restorePoints.never\":\"永不\",\"tw.restorePoints.off\":\"禁用还原点十分危险。\",\"tw.restorePoints.size\":\"预计占用空间: {size}\",\"tw.restorePoints.size2\":\"多个还原点使用的同一造型或声音只会被存储一次。\",\"tw.restorePoints.title\":\"还原点\",\"tw.sample\":\"示例作品\",\"tw.saveAs\":\"另存为\",\"tw.saveTo\":\"保存到 {file}\",\"tw.scratchUnsafeCloud\":\"如果你创建这个云变量,作品就会超过 Scratch 的 {number} 个变量的限制,如果你把作品上传到 Scratch,有些云变量就不能正常发挥其作用。\",\"tw.securityManager.allow\":\"允许\",\"tw.securityManager.deny\":\"拒绝\",\"tw.securityManager.title\":\"扩展安全警告\",\"tw.securityManager.trust\":\"如果允许,将自动允许后续对同一站点的请求。\",\"tw.securityManager.why\":\"这将会被用来下载图片或音频,实现多人游戏,访问API,或者用于恶意目的。这将与网站分享你的IP地址、大概位置和其它可能的数据。\",\"tw.settingsModal.customStageSize\":\"自定义舞台大小:\",\"tw.settingsModal.customStageSizeHelp\":\"改变 Scratch 的屏幕大小,原大小为 480x360。例如,将分辨率改为 640x360 可实现宽屏作品。但是只有极少作品能在修改尺寸后正常运行。\",\"tw.settingsModal.dangerZone\":\"危险功能\",\"tw.settingsModal.disableCompiler\":\"禁用编译器\",\"tw.settingsModal.disableCompilerHelp\":\"禁用 {APP_NAME} 编译器。您可能在编辑作品时希望启用此项以及时更新脚本。除此之外,您永远不应该启用此项。\",\"tw.settingsModal.featured\":\"特色\",\"tw.settingsModal.fps\":\"60 帧(自定义帧率)\",\"tw.settingsModal.fpsHelp\":\"每秒运行脚本 60 次,而不是 30 次。启用此选项后,大多数作品将无法正常工作。如果是这种情况,您应该尝试在禁用 60 帧模式的情况下使用补帧。{customFramerate}。\",\"tw.settingsModal.fpsHelp.customFramerate\":\"点击设置 30 或 60 以外的帧率\",\"tw.settingsModal.help\":\"点击查看帮助\",\"tw.settingsModal.highQualityPen\":\"高清画笔\",\"tw.settingsModal.highQualityPenHelp\":\"允许有画笔的作品以更高的分辨率渲染,并且避免编辑器中的一些坐标精度丢失。该功能可能会影响运行性能,且不是所有作品都适合该功能。\",\"tw.settingsModal.infiniteClones\":\"无限克隆\",\"tw.settingsModal.infiniteClonesHelp\":\"取消 Scratch 的 300 个克隆体限制。\",\"tw.settingsModal.interpolation\":\"补帧\",\"tw.settingsModal.interpolationHelp\":\"通过在角色的运动中插入帧使角色运动看起来更平滑。此功能不应该在 3D、光线追踪、纯画笔作品等运算量大的作品中使用,这会使它们运行得更慢而没有明显的平滑效果。\",\"tw.settingsModal.largeStageWarning\":\"我们不推荐使用自定义舞台大小!请使用具有相同长宽比的较低尺寸,并让用户开启全屏模式将其放大以匹配显示器来代替它。\",\"tw.settingsModal.removeFencing\":\"角色可穿过边缘\",\"tw.settingsModal.removeFencingHelp\":\"允许角色移到屏幕之外,根据需要变大或变小,并使触摸块在屏幕外有效。\",\"tw.settingsModal.removeLimits\":\"移除限制\",\"tw.settingsModal.removeMiscLimits\":\"移除其他限制\",\"tw.settingsModal.removeMiscLimitsHelp\":\"取消音效范围限制和画笔大小限制。\",\"tw.settingsModal.storeProjectOptions\":\"在作品中保留设置\",\"tw.settingsModal.storeProjectOptionsHelp\":\"在作品文件中储存已选择的设置,它们会在 TurboWarp 加载作品文件时自动被应用。循环计时器和不使用编译不会被保存。\",\"tw.settingsModal.title\":\"高级设置\",\"tw.settingsModal.warpTimer\":\"循环计时器\",\"tw.settingsModal.warpTimerHelp\":\"让脚本检查它们是否卡在长循环或无限循环中,并以低帧率运行,从而避免它们在循环结束前使浏览器假死。这会解决大多数崩溃,但对性能有很大负面影响,所以它只在编辑器中默认启用。\",\"tw.soundEditorNotSupported\":\"浏览器不支持声音编辑器。\",\"tw.spriteSelectorItem.rename\":\"重命名\",\"tw.stageHeader.full\":\"完整大小\",\"tw.stereo\":\"双声道\",\"tw.stereoAlert\":\"编辑立体声音频会将音频永久转换成单声道。\",\"tw.studioview.authorAttribution\":\"作者:{author}\",\"tw.studioview.error\":\"加载下一页作品出错。\",\"tw.studioview.hoverText\":\"{title} 作者:{author}\",\"tw.tooLarge\":\"这个音频文件太大了,无法上传到 Scratch。\",\"tw.twExtension.description\":\"奇怪的新积木。与 Scratch 不兼容,但可以在 Scratch 加载。\",\"tw.twExtension.name\":\"{APP_NAME}积木\",\"tw.unfavorite\":\"取消收藏\",\"tw.unknownPlatform.1\":\"该项目是为其他平台开发的:\",\"tw.unknownPlatform.2\":\"无法保证与{APP_NAME}的兼容性。您可以无视风险继续操作,但如果您遇到任何问题,我们可能无法提供帮助。\",\"tw.unknownPlatform.continue\":\"我明白了\",\"tw.unknownPlatform.title\":\"未知平台\",\"tw.unshared.2\":\"欲知更多,请见 {link}\",\"tw.unshared.bug\":\"如果该作品实际上是已发布的,请报告这个漏洞。\",\"tw.unshared.cache\":\"新作品发布的数分钟内,可能会错误地显示这个消息。\",\"tw.unshared2.1\":\"未发布的作品不可见。\",\"tw.usernameModal.help\":\"此变量将存储在浏览器中。当您与包含云变量的作品交互时,它可能会被记录。\",\"tw.usernameModal.help2\":\"与有效的 Scratch 帐户不对应的值通常会被云变量服务器拒绝。我们建议保持原样或将其更改为您的 Scratch 用户名。\",\"tw.usernameModal.mustChange\":\"抱歉,云变量服务器认为您的用户名可能不安全。请把它改成别的或 {resetIt}。\",\"tw.usernameModal.mustChange.resetIt\":\"重置(推荐)\",\"tw.usernameModal.new\":\"用户名:\",\"tw.usernameModal.reset\":\"重置\",\"tw.usernameModal.title\":\"更改用户名\",\"tw.usesCloudVariables\":\"本作品使用云变量。\",\"tw.usesCloudVariables2\":\"{APP_NAME} 的云变量与 Scratch 的云变量没有关联。任何人都可以把 {changeTheirUsername} 改成任何东西,所以请小心冒名顶替。\",\"tw.usesCloudVariables2.change\":\"自己的用户名\",\"tw.viewFeaturedProjects\":\"点击以查看特色作品。\",\"tw.viewOnScratch\":\"在 Scratch 网站上查看作品\"},\"zh-tw\":{\"tw.alerts.lostPeripheralConnection\":\"與{extensionName}的連線中斷了。\",\"tw.backpack.rename\":\"新名稱:\",\"tw.blocks.addons\":\"擴充功能\",\"tw.blocks.buttonIsDown\":\"[MOUSE_BUTTON] 被按下?\",\"tw.blocks.lastKeyPressed\":\"上一次按下的按鍵\",\"tw.blocks.mouseButton.middle\":\"(1)中鍵\",\"tw.blocks.mouseButton.primary\":\"(0)左鍵\",\"tw.blocks.mouseButton.secondary\":\"(2)右鍵\",\"tw.blocks.openDocs\":\"開啟文檔\",\"tw.browserModal.desktopSettings\":\"開啟桌面設置\",\"tw.browserModal.desktopTitle\":\"系統未被支援\",\"tw.browserModal.webgl1\":\"{APP_NAME}需要WebGL,但是你的電腦似乎不支援它。這通常是一個暫時性的錯誤,只需要重啟就可以解決。\",\"tw.browserModal.webglBrowser\":\"使用最新版本的Chrome, Firebox或者Safari, 並且確保你的圖形驅動程式是最新版本。你也可以嘗試在瀏覽器設置中開啟\\\\\"圖形加速\\\\\"或者\\\\\"硬體加速“。\",\"tw.browserModal.webglDesktop\":\"你也可以嘗試在桌面設置開啟\\\\\"圖形加速\\\\\"設定:\",\"tw.cantUseCloud\":\"即使你創建了雲端變量,你也需要把這個項目上傳到Scratch或者使用類似{packager}的工具轉換,才能讓它生效。\",\"tw.code\":\"原始碼\",\"tw.createdBy\":\"創建者:\",\"tw.documentation\":\"文檔\",\"tw.favorite\":\"收藏\",\"tw.featuredProjectsStudio\":\"在 Scratch 查看該創作坊\",\"tw.feedback\":\"回報建議及錯誤\",\"tw.feedbackButton\":\"{APP_NAME}反饋\",\"tw.footer.credits\":\"感謝\",\"tw.footer.documentation\":\"文檔\",\"tw.footer.embed\":\"嵌入\",\"tw.footer.parameters\":\"網址參數\",\"tw.gui.crashMessage.description\":\"我們非常抱歉,但是頁面似乎崩潰了。請刷新你的頁面試試看。\",\"tw.guiDefaultTitle\":\"使 Scratch 專案跑得更快\",\"tw.home.credit\":\"備註與謝誌\",\"tw.home.instructions\":\"操作說明\",\"tw.input.tooltip\":\"把 Scratch 專案連結貼在這裡!\",\"tw.interpolationEnabled\":\"運動補償\",\"tw.invalidParameters.clones\":\"無效的「分身」網址參數\",\"tw.invalidParameters.fps\":\"無效的「影格率」網址參數\",\"tw.invalidProject.title\":\"錯誤\",\"tw.loader.downloadingAssets\":\"下載素材中({complete}/{total})……\",\"tw.loader.loadingAssets\":\"加載資源中(第{complete} /{total}個)\",\"tw.loader.projectData\":\"載入專案中……\",\"tw.menuBar.60off\":\"關閉 60 FPS模式\",\"tw.menuBar.60on\":\"開啟 60 FPS模式\",\"tw.menuBar.addons\":\"擴充功能\",\"tw.menuBar.advanced\":\"進階\",\"tw.menuBar.changeUsername\":\"更改用戶名稱\",\"tw.menuBar.cloudOff\":\"禁用雲端變數\",\"tw.menuBar.cloudOn\":\"啟用雲端變數\",\"tw.menuBar.cloudUnavailable\":\"雲端變數不可用\",\"tw.menuBar.compileError\":\"{sprite}:{error}\",\"tw.menuBar.desktopSettings\":\"桌面設定\",\"tw.menuBar.moreSettings\":\"進階設定\",\"tw.menuBar.newWindow\":\"新窗口\",\"tw.menuBar.package\":\"打包作品\",\"tw.menuBar.reportError1\":\"有些代碼在編譯時發生了錯誤\",\"tw.menuBar.reportError2\":\"這是個錯誤,請回報。\",\"tw.menuBar.restorePoints\":\"還原點\",\"tw.menuBar.saveAs\":\"儲存為 {file}\",\"tw.menuBar.seeInside\":\"切換到程式頁面\",\"tw.mono\":\"單聲道\",\"tw.oldDownload\":\"存儲為獨立文件…\",\"tw.paint.alpha\":\"不透明度\",\"tw.paint.fonts.more\":\"增加更多字體\",\"tw.privacy\":\"隱私權政策\",\"tw.sample\":\"例子作品\",\"tw.saveAs\":\"另存為…\",\"tw.saveTo\":\"存儲為{file}\",\"tw.settingsModal.customStageSize\":\"自訂舞臺大小:\",\"tw.settingsModal.customStageSizeHelp\":\"更改 Scratch 的舞臺大小。你可以試試 640×360,比例會變成 16:9。僅有極少數的專案能在更改後正常運行。\",\"tw.settingsModal.dangerZone\":\"危險\",\"tw.settingsModal.disableCompiler\":\"停用編譯器\",\"tw.settingsModal.featured\":\"精選\",\"tw.settingsModal.fps\":\"60 FPS(自訂影格率)\",\"tw.settingsModal.fpsHelp\":\"程式運行速度從每秒 30 次改為每秒 60 次,大多數專案都會無法正常運行,你應該試試運動補償。{customFramerate}。\",\"tw.settingsModal.fpsHelp.customFramerate\":\"使用30或60以外的其他影格率\",\"tw.settingsModal.help\":\"點擊查看幫助\",\"tw.settingsModal.highQualityPen\":\"高品質畫筆\",\"tw.settingsModal.highQualityPenHelp\":\"使畫筆精度提高,並在編輯器中關閉坐標四捨五入。不是所有專案都適合,且可能影響性能。\",\"tw.settingsModal.infiniteClones\":\"無限分身\",\"tw.settingsModal.infiniteClonesHelp\":\"移除 300 分身限制。\",\"tw.settingsModal.interpolation\":\"運動補償\",\"tw.settingsModal.interpolationHelp\":\"在角色移動中進行運動補償以提升流暢度。你不該在 3D 專案、光線追蹤專案、畫筆專案或運算量大的專案啟用它,不僅效果低下,還會影響效能。\",\"tw.settingsModal.largeStageWarning\":\"不建議把舞臺調得這麼大!你應當使用同比例但較小的舞臺並讓用戶以全螢幕運行。\",\"tw.settingsModal.removeFencing\":\"移除屏障\",\"tw.settingsModal.removeLimits\":\"移除限制\",\"tw.settingsModal.removeMiscLimits\":\"移除各類限制\",\"tw.settingsModal.removeMiscLimitsHelp\":\"移除音效效果限制及畫筆大小限制。\",\"tw.settingsModal.storeProjectOptions\":\"將設定存至專案內\",\"tw.settingsModal.title\":\"進階設定\",\"tw.settingsModal.warpTimer\":\"防卡死\",\"tw.settingsModal.warpTimerHelp\":\"程式卡在迴圈裡時會以低幀率運行,以防止卡死。這可以防止崩潰,但會影響性能,僅在編輯器預設啟用。\",\"tw.spriteSelectorItem.rename\":\"重新命名\",\"tw.stereo\":\"雙聲道\",\"tw.studioview.authorAttribution\":\"作者:{author}\",\"tw.studioview.hoverText\":\"{title},作者:{author}\",\"tw.unfavorite\":\"取消搜藏\",\"tw.usernameModal.reset\":\"重設\",\"tw.usernameModal.title\":\"更改用戶名稱\",\"tw.viewFeaturedProjects\":\"瀏覽精選專案\",\"tw.viewOnScratch\":\"在 Scratch 查看該作品\"}}')},function(e,t,n){e.exports=n(626)(\"\")},function(e,t,n){var a=n(457);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(468);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(476);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(483);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(485);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(491);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(492);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){e.exports=n.p+\"static/assets/679ce05ac8c35bbf83f596e895ab711b.svg\"},function(e,t,n){var a=n(503);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(509);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(510);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t){e.exports=\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+PGRlZnM+PHBhdGggZD0iTTEwIDJjNC40MTggMCA4IDMuNTgyIDggOHMtMy41ODIgOC04IDgtOC0zLjU4Mi04LTggMy41ODItOCA4LTh6bS0uMDcyIDEwLjQyYy0uMjU2IDAtLjQ3Mi4wNzYtLjY0OC4yMjctLjE3Ni4xNTEtLjI2NC4zMzgtLjI2NC41NiAwIC4yNS4wOTEuNDQ1LjI3My41ODQuMTgyLjEzOS4zOTUuMjA5LjYzOS4yMDkuMjM2IDAgLjQ0NC0uMDcuNjI0LS4yMTFzLjI3LS4zMzUuMjctLjU4MWMwLS4yMjItLjA4Ni0uNDA5LS4yNTgtLjU2LS4xNzItLjE1MS0uMzg0LS4yMjctLjYzNi0uMjI3em0uMTQ0LTYuNDJjLS42MjQgMC0xLjE3LjExMy0xLjYzOC4zMzgtLjQ2OC4yMjUtLjgyNC41MS0xLjA2OC44NTMtLjI0NC4zNDMtLjM2Ni42ODMtLjM2NiAxLjAxNyAwIC4xNjIuMDc3LjMxMy4yMzEuNDUyLjE1NC4xMzkuMzQzLjIwOS41NjcuMjA5LjM4IDAgLjYzOC0uMTk5Ljc3NC0uNTk3LjE0NC0uMzguMzItLjY2OC41MjgtLjg2NC4yMDgtLjE5Ni41MzItLjI5My45NzItLjI5My4zNzYgMCAuNjgzLjA5Ny45MjEuMjkxLjIzOC4xOTQuMzU3LjQzMi4zNTcuNzEzIDAgLjE0NC0uMDM5LjI3OC0uMTE3LjQwMi0uMDc4LjEyMy0uMTc0LjIzNS0uMjg4LjMzNi0uMTE0LjEtLjI5OS4yNDktLjU1NS40NDYtLjI5Mi4yMjUtLjUyNC40Mi0uNjk2LjU4NC0uMTcyLjE2NC0uMzEuMzU0LS40MTQuNTcxLS4xMDQuMjE3LS4xNTYuNDczLS4xNTYuNzY5IDAgLjIzNi4wNzEuNDE0LjIxMy41MzQuMTQyLjEyLjMxNy4xOC41MjUuMTguNCAwIC42MzgtLjE4My43MTQtLjU1bC4wOTktLjM2Mi4wOTMtLjIwNi4xODMtLjIyNy4zMjctLjI4OGMuNDkyLS4zODcuODMzLS42NjMgMS4wMjMtLjgyNy4xOS0uMTY0LjM1NC0uMzU4LjQ5Mi0uNTg0LjEzOC0uMjI1LjIwNy0uNDg4LjIwNy0uNzg3IDAtLjM4LS4xMjEtLjczMy0uMzYzLTEuMDU3LS4yNDItLjMyNC0uNTg1LS41OC0xLjAyOS0uNzY5LS40NDQtLjE4OC0uOTU2LS4yODMtMS41MzYtLjI4M3oiIGlkPSJhIi8+PC9kZWZzPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yIC0yKSIgZmlsbD0ibm9uZSI+PG1hc2s+PHVzZSB4bGluazpocmVmPSIjYSIvPjwvbWFzaz48dXNlIGZpbGw9IiNmZmYiIHhsaW5rOmhyZWY9IiNhIi8+PC9nPjwvc3ZnPg==\"},function(e,t,n){var a=n(523);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t){e.exports=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDQ5LjIgKDUxMTYwKSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5OZXh0PC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGRlZnM+PC9kZWZzPgogICAgPGcgaWQ9Ik5leHQiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxwYXRoIGQ9Ik0xMC4xNTc1OTIyLDE2Ljk5NDEwMyBDOS44NDY1MDAyMSwxNi45OTQxMDMgOS41NTYxNDc2OCwxNi44NzUxOTY3IDkuMzQwNDU3MjMsMTYuNjYwODg4OSBMNC45OTg5OTU1OSwxMi4zMTk0MjcyIEM0LjY2MzAxNjIzLDExLjk2MjcwODQgNC41NzMxNDUyMSwxMS40NjIxOTU5IDQuNzU5ODAwNDEsMTEuMDMyMTk3NyBDNC45NDUwNzI5OCwxMC42MDIxOTk0IDUuMzU0MzMxNzgsMTAuMzM2NzM0MiA1LjgyODU3NDI1LDEwLjMzNjczNDIgTDcuNDc1Mjg3ODgsMTAuMzM2NzM0MiBMOC4zMTQ1NDQ5Niw0LjI5NDYzNjMzIEM4LjQzNDgzMzg2LDMuMzY5NjU2MTMgOS4yMzk1MjUxNiwyLjY2NTg5NjkgMTAuMTg2NjI3NSwyLjY2NTg5NjkgQzEwLjI2ODIwMjcsMi42NjU4OTY5IDEwLjM1MTE2MDYsMi42NzE0Mjc0MiAxMC40MzI3MzU4LDIuNjgxMTA1ODQgQzExLjI4NzIwMTgsMi44MTUyMjEwNiAxMS45NDY3MTY4LDMuNDgxNjQ5MjQgMTIuMDUwNDE0Miw0LjMwMTU0OTQ4IEwxMi45MTE3OTM0LDEwLjMzNjczNDIgTDE0LjQ4NjYxMDIsMTAuMzM2NzM0MiBDMTQuOTY2MzgzMiwxMC4zMzY3MzQyIDE1LjM5MzYxNjIsMTAuNjE4NzkxIDE1LjU3NDc0MDgsMTEuMDU0MzE5OCBDMTUuNzU1ODY1NSwxMS40OTI2MTM4IDE1LjY1NzY5ODcsMTEuOTc3OTE3MyAxNS4zMTYxODg4LDEyLjMxOTQyNzIgTDEwLjk3NDcyNzIsMTYuNjYwODg4OSBDMTAuNzU5MDM2NywxNi44NzUxOTY3IDEwLjQ2ODY4NDIsMTYuOTk0MTAzIDEwLjE1NzU5MjIsMTYuOTk0MTAzIiBpZD0iRmlsbC0xIiBmaWxsPSIjRkZGRkZGIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMC4xNjQxMDMsIDkuODMwMDAwKSByb3RhdGUoLTkwLjAwMDAwMCkgdHJhbnNsYXRlKC0xMC4xNjQxMDMsIC05LjgzMDAwMCkgIj48L3BhdGg+CiAgICA8L2c+Cjwvc3ZnPg==\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDQ5LjIgKDUxMTYwKSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5QcmV2aW91czwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxkZWZzPjwvZGVmcz4KICAgIDxnIGlkPSJQcmV2aW91cyIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPHBhdGggZD0iTTEwLjE1NzU5MjIsMTYuOTk0MTAzIEM5Ljg0NjUwMDIxLDE2Ljk5NDEwMyA5LjU1NjE0NzY4LDE2Ljg3NTE5NjcgOS4zNDA0NTcyMywxNi42NjA4ODg5IEw0Ljk5ODk5NTU5LDEyLjMxOTQyNzIgQzQuNjYzMDE2MjMsMTEuOTYyNzA4NCA0LjU3MzE0NTIxLDExLjQ2MjE5NTkgNC43NTk4MDA0MSwxMS4wMzIxOTc3IEM0Ljk0NTA3Mjk4LDEwLjYwMjE5OTQgNS4zNTQzMzE3OCwxMC4zMzY3MzQyIDUuODI4NTc0MjUsMTAuMzM2NzM0MiBMNy40NzUyODc4OCwxMC4zMzY3MzQyIEw4LjMxNDU0NDk2LDQuMjk0NjM2MzMgQzguNDM0ODMzODYsMy4zNjk2NTYxMyA5LjIzOTUyNTE2LDIuNjY1ODk2OSAxMC4xODY2Mjc1LDIuNjY1ODk2OSBDMTAuMjY4MjAyNywyLjY2NTg5NjkgMTAuMzUxMTYwNiwyLjY3MTQyNzQyIDEwLjQzMjczNTgsMi42ODExMDU4NCBDMTEuMjg3MjAxOCwyLjgxNTIyMTA2IDExLjk0NjcxNjgsMy40ODE2NDkyNCAxMi4wNTA0MTQyLDQuMzAxNTQ5NDggTDEyLjkxMTc5MzQsMTAuMzM2NzM0MiBMMTQuNDg2NjEwMiwxMC4zMzY3MzQyIEMxNC45NjYzODMyLDEwLjMzNjczNDIgMTUuMzkzNjE2MiwxMC42MTg3OTEgMTUuNTc0NzQwOCwxMS4wNTQzMTk4IEMxNS43NTU4NjU1LDExLjQ5MjYxMzggMTUuNjU3Njk4NywxMS45Nzc5MTczIDE1LjMxNjE4ODgsMTIuMzE5NDI3MiBMMTAuOTc0NzI3MiwxNi42NjA4ODg5IEMxMC43NTkwMzY3LDE2Ljg3NTE5NjcgMTAuNDY4Njg0MiwxNi45OTQxMDMgMTAuMTU3NTkyMiwxNi45OTQxMDMiIGlkPSJGaWxsLTEiIGZpbGw9IiNGRkZGRkYiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEwLjE2NDEwMywgOS44MzAwMDApIHJvdGF0ZSgtMjcwLjAwMDAwMCkgdHJhbnNsYXRlKC0xMC4xNjQxMDMsIC05LjgzMDAwMCkgIj48L3BhdGg+CiAgICA8L2c+Cjwvc3ZnPg==\"},,,function(e,t,n){var a=n(248),o=n(584),r=n(585),i=a?a.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?\"[object Undefined]\":\"[object Null]\":i&&i in Object(e)?o(e):r(e)}},function(e,t,n){var a=n(583).Symbol;e.exports=a},,function(e,t,n){var a=n(581),o=n(588),r=n(593),i=n(594);e.exports=function(e,t,n){return Array.isArray(e)||(e=[e]),i(e.map((function(e){return r(e)?function(e,t,n){var i=0,s=0;if(\"\"===e)return e;if(!e||!r(e))throw new TypeError(\"First argument to react-string-replace#replaceString must be a string\");var l=t;a(l)||(l=new RegExp(\"(\"+o(l)+\")\",\"gi\"));for(var c=e.split(l),d=1,u=c.length;dp,e.exports.loadFonts=()=>(()=>{const e=[];for(const t of Object.keys(u))e.push(fetch(u[t]).then((e=>{if(!e.ok)throw new Error(\"Cannot load font: \".concat(t,\" (invalid HTTP response)\"));return e.blob()})).then((e=>new Promise(((n,a)=>{const o=new FileReader;o.onload=()=>n(o.result),o.onerror=()=>a(new Error(\"Cannot load font: \".concat(t,\" (could not read)\"))),o.readAsDataURL(e)})))).then((e=>{p[t]='@font-face{font-family:\"'.concat(t,'\";src:url(\"').concat(e,'\");}')})).catch((e=>{d.error(e)})));return Promise.all(e)})().then((()=>((()=>{if(document.getElementById(\"scratch-font-styles\"))return;let e=\"\";for(const t of Object.keys(u)){const n=p[t];n&&(e+=n)}const t=document.createElement(\"style\");t.id=\"scratch-font-styles\",t.textContent=e,document.body.insertBefore(t,document.body.firstChild)})(),(()=>{const e=[];if(document.fonts&&document.fonts.load)for(const t in p)e.push(document.fonts.load(\"12px \".concat(t)));return Promise.all(e)})()))).catch((e=>{d.error(e)})),e.exports.FONTS=p},,,,,function(e,t){e.exports=\"data:image/svg+xml;base64,PCEtLSBodHRwczovL2ZvbnRzLmdvb2dsZS5jb20vaWNvbnM/c2VsZWN0ZWQ9TWF0ZXJpYWwrU3ltYm9scytPdXRsaW5lZDpjb21wdXRlcjpGSUxMQDA7d2dodEA0MDA7R1JBREAwO29wc3pANDggLS0+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBoZWlnaHQ9IjQ4IiB2aWV3Qm94PSIwIC05NjAgOTYwIDk2MCIgd2lkdGg9IjQ4Ij48cGF0aCBkPSJNNzAtMTIwcS0xMi43NSAwLTIxLjM3NS04LjY3NVE0MC0xMzcuMzUxIDQwLTE1MC4xNzUgNDAtMTYzIDQ4LjYyNS0xNzEuNVQ3MC0xODBoODIwcTEyLjc1IDAgMjEuMzc1IDguNjc1IDguNjI1IDguNjc2IDguNjI1IDIxLjUgMCAxMi44MjUtOC42MjUgMjEuMzI1VDg5MC0xMjBINzBabTcwLTEyMHEtMjQgMC00Mi0xOHQtMTgtNDJ2LTQ4MHEwLTI0IDE4LTQydDQyLTE4aDY4MHEyNCAwIDQyIDE4dDE4IDQydjQ4MHEwIDI0LTE4IDQydC00MiAxOEgxNDBabTAtNjBoNjgwdi00ODBIMTQwdjQ4MFptMCAwdi00ODAgNDgwWiIvPjwvc3ZnPg==\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PCEtLSBodHRwczovL2ZvbnRzLmdvb2dsZS5jb20vaWNvbnM/c2VsZWN0ZWQ9TWF0ZXJpYWwrU3ltYm9scytPdXRsaW5lZDpmaWxlX29wZW46RklMTEAwO3dnaHRANDAwO0dSQURAMDtvcHN6QDQ4IC0tPgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgaGVpZ2h0PSI0OCIgdmlld0JveD0iMCAtOTYwIDk2MCA5NjAiIHdpZHRoPSI0OCI+PHBhdGggZD0iTTIyMC04MHEtMjQgMC00Mi0xOHQtMTgtNDJ2LTY4MHEwLTI0IDE4LTQydDQyLTE4aDM0MGwyNDAgMjQwdjI3MGgtNjB2LTIzMEg1MjB2LTIyMEgyMjB2NjgwaDQxMHY2MEgyMjBabTY1OCAxTDc1MC0yMDd2MTI1aC02MHYtMjI4aDIyOHY2MEg3OTJsMTI4IDEyOC00MiA0M1ptLTY1OC02MXYtNjgwIDY4MFoiLz48L3N2Zz4=\"},function(e,t){var n=Array.isArray;e.exports=n},function(e,t,n){\"use strict\";function a(e){const t=atob(e.split(\",\")[1]),n=e.split(\",\")[0].split(\":\")[1].split(\";\")[0],a=new ArrayBuffer(t.length),o=new Uint8Array(a);for(let e=0;e{const n=c(e,t);return d.a.appStateReducer(t,e,n),n}),o,a),window.ReduxStore=this.store,d.a.appStateStore=this.store}componentDidUpdate(e){t||(e.isPlayerOnly!==this.props.isPlayerOnly&&this.store.dispatch(Object(p.d)(this.props.isPlayerOnly)),e.isFullScreen!==this.props.isFullScreen&&this.store.dispatch(Object(p.c)(this.props.isFullScreen)))}render(){const t=this.props,{isFullScreen:n,isPlayerOnly:a,showTelemetryModal:r}=t,i=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a\\n \\x3c!-- Exported by Scratch - http://scratch.mit.edu/ --\\x3e\\n'},function(e,t){e.exports=''},function(e,t,n){var a=n(451);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t){e.exports=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNDBweCIgaGVpZ2h0PSI0N3B4IiB2aWV3Qm94PSIwIDAgNDAgNDciIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDQ4LjIgKDQ3MzI3KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5SZWxvYWQ8L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZGVmcz48L2RlZnM+CiAgICA8ZyBpZD0iVjItLS1HZW5lcmFsLU9vcHMiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC02MjEuMDAwMDAwLCAtMjI0LjAwMDAwMCkiPgogICAgICAgIDxnIGlkPSJ2MS1XZWxjb21lLU1vZGFsLSIgZmlsbD0iI0ZGRkZGRiI+CiAgICAgICAgICAgIDxnIGlkPSJVbnN1cHBvcnRlZCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNDI4LjAwMDAwMCwgMjE5LjAwMDAwMCkiPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTIzMywzMS44OTY0NjgxIEMyMzMsNDIuOTM2ODgzOSAyMjQuMDM4NjI0LDUxLjg5ODI2MDMgMjEzLjAwMTc5Miw1MS44OTgyNjAzIEMyMDEuOTk3MjIyLDUxLjg5ODI2MDMgMTkzLDQyLjkzNjg4MzkgMTkzLDMxLjg5NjQ2ODEgQzE5MywyMS40Mjk1ODA0IDIwMS4xMzMzNDUsMTIuODI2NjU4OSAyMTEuMzg4NzQ1LDEyLjAwMjIxMjMgTDIxMS4zODg3NDUsNy40ODU2Nzg1NyBDMjExLjM4ODc0NSw1LjUxNDE3NTc1IDIxMy41MzU4OSw0LjMzMTI3NDA1IDIxNS4yMjA2MjksNS40MDY2MzkyMyBMMjI2Ljk3Nzk1NSwxMi45NzAwNDEgQzIyOC41MTkzMTIsMTMuOTM3ODY5NiAyMjguNTE5MzEyLDE2LjE2MDI5MSAyMjYuOTc3OTU1LDE3LjE2Mzk2NTIgTDIxNS4yMjA2MjksMjQuNjkxNTIxNCBDMjEzLjUzNTg5LDI1Ljc2Njg4NjYgMjExLjM4ODc0NSwyNC41ODM5ODQ5IDIxMS4zODg3NDUsMjIuNjEyNDgyIEwyMTEuMzg4NzQ1LDE4LjMxMTAyMTMgQzIwNC41NzQ1MTQsMTkuMDk5NjIyNSAxOTkuMjcyOTY0LDI0Ljg3MDc0ODkgMTk5LjI3Mjk2NCwzMS44OTY0NjgxIEMxOTkuMjcyOTY0LDM5LjQ5NTcxNTMgMjA1LjQzODM5MSw0NS42MjUyOTY4IDIxMy4wMDE3OTIsNDUuNjI1Mjk2OCBDMjIwLjU2MTYwOSw0NS42MjUyOTY4IDIyNi43MjcwMzYsMzkuNDk1NzE1MyAyMjYuNzI3MDM2LDMxLjg5NjQ2ODEgQzIyNi43MjcwMzYsMzAuMTc5NDY4MyAyMjguMTI4NTk2LDI4Ljc3NzkwOTEgMjI5Ljg4MTQ0MSwyOC43Nzc5MDkxIEMyMzEuNjAyMDI1LDI4Ljc3NzkwOTEgMjMzLDMwLjE3OTQ2ODMgMjMzLDMxLjg5NjQ2ODEiIGlkPSJSZWxvYWQiPjwvcGF0aD4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+\"},function(e,t,n){\"use strict\";n.d(t,\"a\",(function(){return E}));var a=n(1),o=n.n(a),r=n(0),i=n.n(r),s=n(7),l=n(4),c=n.n(l),d=n(13),u=n.n(d),p=n(11),m=n(2),g=n(23),h=n(12),b=n(47),w=n(182),f=n(152),M=n(83);const v=[\"intl\",\"customStageSize\",\"isFullScreen\",\"isPlayerOnly\",\"isEmbedded\",\"projectChanged\",\"compilerOptions\",\"runtimeOptions\",\"highQualityPen\",\"framerate\",\"interpolation\",\"turbo\",\"onSetIsFullScreen\",\"onSetIsPlayerOnly\",\"onSetProjectId\",\"onSetUsername\",\"reduxProjectId\",\"routingStyle\",\"username\",\"vm\"];const y=Object(m.g)({invalidFPS:{id:\"tw.invalidParameters.fps\",defaultMessage:'\"fps\" URL parameter is invalid'},invalidClones:{id:\"tw.invalidParameters.clones\",defaultMessage:'\"clone\" URL parameter is invalid'}}),k=\"tw:username\",j=()=>{const e=location.hash.match(/#(\\d+)/);return null===e?null:e[1]};class I{constructor(e){let{onSetProjectId:t,onSetIsPlayerOnly:n,onSetIsFullScreen:a}=e;this.onSetProjectId=t,this.onSetIsPlayerOnly=n,this.onSetIsFullScreen=a}onhashchange(){}onpathchange(){}generateURL(){return\"\"}}class S extends I{onhashchange(){this.onSetProjectId(j()||h.e)}generateURL(e){let{projectId:t}=e;const n=location.hash.split(\"?\")[1];return\"\".concat(location.pathname).concat(location.search,\"#\").concat(t).concat(n?\"?\".concat(n):\"\")}}const x={none:I,hash:S,filehash:class extends S{constructor(e){super(e),this.playerPath=location.pathname.substring(0,location.pathname.lastIndexOf(\"/\")+1),this.editorPath=\"\".concat(this.playerPath,\"editor.html\"),this.fullscreenPath=\"\".concat(this.playerPath,\"fullscreen.html\")}onpathchange(){const e=location.pathname;e===this.playerPath?(this.onSetIsPlayerOnly(!0),this.onSetIsFullScreen(!1)):e===this.editorPath?(this.onSetIsPlayerOnly(!1),this.onSetIsFullScreen(!1)):e===this.fullscreenPath&&this.onSetIsFullScreen(!0)}generateURL(e){let{projectId:t,isPlayerOnly:n,isFullScreen:a}=e,o=\"\",r=\"\";\"0\"!==t&&(r=t);const i=location.hash.split(\"?\")[1];return i&&(r+=\"?\".concat(i)),o=a?this.fullscreenPath:n?this.playerPath:this.editorPath,\"\".concat(o).concat(location.search).concat(r?\"#\".concat(r):\"\")}},wildcard:class extends I{constructor(e){super(e),this.root=\"\"}onhashchange(){const e=j();if(e){this.onSetProjectId(e)&&history.replaceState(null,null,\"\".concat(location.pathname).concat(location.search))}else this.parseURL(!1)}onpathchange(){this.parseURL(!0)}parseURL(e){const t=location.pathname.substr(this.root.length).split(\"/\"),n=e=>{e?this.onSetProjectId(e):this.onSetProjectId(h.e)},a=t=>{e&&(\"fullscreen\"===t?this.onSetIsFullScreen(!0):\"editor\"===t?(this.onSetIsPlayerOnly(!1),this.onSetIsFullScreen(!1)):(this.onSetIsPlayerOnly(!0),this.onSetIsFullScreen(!1)))};+t[0]&&Number.isFinite(+t[0])?(n(t[0]),a(t[1])):(this.onSetProjectId(h.e),a(t[0]))}generateURL(e){let{projectId:t,isPlayerOnly:n,isFullScreen:a}=e;const o=[];\"0\"!==t&&o.push(t),a?o.push(\"fullscreen\"):n||o.push(\"editor\");const r=\"\".concat(this.root).concat(o.join(\"/\")),i=\"\".concat(location.origin).concat(this.root).concat(\"0\"===t?\"\":t);return(()=>{let e=document.querySelector(\"link[rel=canonical]\");return e||(e=document.createElement(\"link\"),e.rel=\"canonical\",document.head.appendChild(e)),e})().href=i,\"\".concat(r).concat(location.search).concat(location.hash)}}},E=function(e){class t extends o.a.Component{constructor(e){super(e),c()(this,[\"handleHashChange\",\"handlePopState\",\"onSetProjectId\",\"onSetIsPlayerOnly\",\"onSetIsFullScreen\"])}componentDidMount(){const e=new URLSearchParams(location.search);if(e.has(\"fps\")){const t=+e.get(\"fps\");Number.isNaN(t)||t<0?alert(this.props.intl.formatMessage(y.invalidFPS)):this.props.vm.setFramerate(t)}else e.has(\"60fps\")&&this.props.vm.setFramerate(60);if(e.has(\"interpolate\")&&this.props.vm.setInterpolation(!0),e.has(\"username\")){const t=e.get(\"username\");this.doNotPersistUsername=t,this.props.onSetUsername(t)}else{const e=this.props.isEmbedded?null:(e=>{try{return localStorage.getItem(e)}catch(e){}return null})(k);if(null===e){const e=Object(w.a)();this.props.onSetUsername(e),this.props.isEmbedded&&(this.doNotPersistUsername=e)}else this.props.onSetUsername(e)}if(e.has(\"hqpen\")&&this.props.vm.renderer.setUseHighQualityRender(!0),e.has(\"turbo\")&&this.props.vm.setTurboMode(!0),(e.has(\"stuck\")||e.has(\"warp_timer\"))&&this.props.vm.setCompilerOptions({warpTimer:!0}),e.has(\"nocompile\")&&this.props.vm.setCompilerOptions({enabled:!1}),e.has(\"clones\")){const t=+e.get(\"clones\");Number.isNaN(t)||t<0?alert(this.props.intl.formatMessage(y.invalidClones)):this.props.vm.setRuntimeOptions({maxClones:t})}e.has(\"offscreen\")&&this.props.vm.setRuntimeOptions({fencing:!1}),e.has(\"limitless\")&&this.props.vm.setRuntimeOptions({miscLimits:!1});for(const t of e.getAll(\"extension\"))this.props.vm.extensionManager.loadExtensionURL(t);const t={onSetProjectId:this.onSetProjectId,onSetIsPlayerOnly:this.onSetIsPlayerOnly,onSetIsFullScreen:this.onSetIsFullScreen};this.router=((e,t)=>{const n=[\"none\",\"hash\"];if((\"http:\"===location.protocol||\"https:\"===location.protocol)&&n.push(\"filehash\"),n.includes(e)||(p.default.warn(\"routing style is unknown or not supported: \".concat(e,\", falling back to hash\")),e=\"hash\"),Object.prototype.hasOwnProperty.call(x,e))return new x[e](t);throw new Error(\"unknown router: \".concat(e))})(this.props.routingStyle,t),this.router.onhashchange(),window.addEventListener(\"hashchange\",this.handleHashChange),window.addEventListener(\"popstate\",this.handlePopState)}componentDidUpdate(e){if(this.props.username!==e.username&&this.props.username!==this.doNotPersistUsername&&((e,t)=>{try{localStorage.setItem(e,t)}catch(e){}})(k,this.props.username),this.props.reduxProjectId!==e.reduxProjectId||this.props.isPlayerOnly!==e.isPlayerOnly||this.props.isFullScreen!==e.isFullScreen){const e=\"\".concat(location.pathname).concat(location.search).concat(location.hash),t={projectId:this.props.reduxProjectId,isPlayerOnly:this.props.isPlayerOnly,isFullScreen:this.props.isFullScreen},n=this.router.generateURL(t);n&&n!==e&&history.pushState(null,null,n)}if(this.props.customStageSize!==e.customStageSize||this.props.runtimeOptions!==e.runtimeOptions||this.props.compilerOptions!==e.compilerOptions||this.props.highQualityPen!==e.highQualityPen||this.props.framerate!==e.framerate||this.props.interpolation!==e.interpolation||this.props.turbo!==e.turbo){const e=new URLSearchParams(location.search),t=this.props.runtimeOptions,n=this.props.compilerOptions;e.delete(\"60fps\");const{width:a,height:o}=this.props.customStageSize;a===M.c.width&&o===M.c.height?e.delete(\"size\"):e.set(\"size\",\"\".concat(a,\"x\").concat(o)),30===this.props.framerate?e.delete(\"fps\"):e.set(\"fps\",this.props.framerate),this.props.interpolation?e.set(\"interpolate\",\"\"):e.delete(\"interpolate\"),this.props.turbo?e.set(\"turbo\",\"\"):e.delete(\"turbo\"),this.props.highQualityPen?e.set(\"hqpen\",\"\"):e.delete(\"hqpen\"),n.enabled&&e.delete(\"nocompile\"),this.props.isPlayerOnly&&(n.warpTimer?e.set(\"stuck\",\"\"):e.delete(\"stuck\")),300===t.maxClones?e.delete(\"clones\"):e.set(\"clones\",t.maxClones),t.fencing?e.delete(\"offscreen\"):e.set(\"offscreen\",\"\"),t.miscLimits?e.delete(\"limitless\"):e.set(\"limitless\",\"\"),Object(f.b)(e)}}componentWillUnmount(){window.removeEventListener(\"hashchange\",this.handleHashChange),window.removeEventListener(\"popstate\",this.handlePopState)}handleHashChange(){this.router.onhashchange()}handlePopState(){this.router.onpathchange()}onSetProjectId(e){return\"\".concat(e)===\"\".concat(this.props.reduxProjectId)||!(this.props.projectChanged&&!confirm(\"Are you sure you want to switch project?\"))&&(this.props.onSetProjectId(e),!0)}onSetIsPlayerOnly(e){this.props.onSetIsPlayerOnly(e)}onSetIsFullScreen(e){this.props.onSetIsFullScreen(e)}render(){const t=this.props,{intl:n,customStageSize:a,isFullScreen:r,isPlayerOnly:i,isEmbedded:s,projectChanged:l,compilerOptions:c,runtimeOptions:d,highQualityPen:u,framerate:p,interpolation:m,turbo:g,onSetIsFullScreen:h,onSetIsPlayerOnly:b,onSetProjectId:w,onSetUsername:f,reduxProjectId:M,routingStyle:y,username:k,vm:j}=t,I=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a({customStageSize:e.scratchGui.customStageSize,isFullScreen:e.scratchGui.mode.isFullScreen,isPlayerOnly:e.scratchGui.mode.isPlayerOnly,isEmbedded:e.scratchGui.mode.isEmbedded,projectChanged:e.scratchGui.projectChanged,reduxProjectId:e.scratchGui.projectState.projectId,compilerOptions:e.scratchGui.tw.compilerOptions,runtimeOptions:e.scratchGui.tw.runtimeOptions,highQualityPen:e.scratchGui.tw.highQualityPen,framerate:e.scratchGui.tw.framerate,interpolation:e.scratchGui.tw.interpolation,turbo:e.scratchGui.vmStatus.turbo,username:e.scratchGui.tw.username,vm:e.scratchGui.vm})),(e=>({onSetIsFullScreen:t=>e(Object(b.c)(t)),onSetIsPlayerOnly:t=>e(Object(b.d)(t)),onSetProjectId:t=>e(Object(h.E)(t)),onSetUsername:t=>e(Object(g.s)(t))})))(t))}},function(e,t){e.exports=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUxLjMgKDU3NTQ0KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5JY29uPC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGRlZnM+CiAgICAgICAgPHBhdGggZD0iTTE1LjQ2NDkzNSwxNS40NjcyOTcgQzE0Ljc2NDQwNTksMTYuMTc3NzcwNSAxMy42MTg1ODc3LDE2LjE3Nzc3MDUgMTIuOTA4MTE0MiwxNS40NjcyOTcgTDkuOTk4ODE4OTksMTIuNTU4MDAxOCBMNy4wODg0MTg4NSwxNS40NjcyOTcgQzYuMzgyMzY1MDYsMTYuMTczMzUwOCA1LjIzNzY1MTg3LDE2LjE3MzM1MDggNC41MzE1OTgwNywxNS40NjcyOTcgQzQuMTc5MTIzNjQsMTUuMTE0ODIyNiA0LjAwMDEyNDA5LDE0LjY0ODUzOTggNC4wMDAxMjQwOSwxNC4xODg4ODY2IEM0LjAwMDEyNDA5LDEzLjcyODEyODUgNC4xNzkxMjM2NCwxMy4yNjI5NTA2IDQuNTMxNTk4MDcsMTIuOTEwNDc2MiBMNy40NDA4OTMyOCwxMC4wMDExODEgTDQuNTI3MTc4MzMsNy4wODYzNjExMiBDNC4xNzM1OTg5Nyw2LjczMjc4MTc2IDMuOTk0NTk5NDEsNi4yNjc2MDM5MSA0LjAwMDEyNDA5LDUuODAyNDI2MDYgQzQuMDAwMTI0MDksNS4zNDE2Njc5NSA0LjE3MzU5ODk3LDQuODgyMDE0NzcgNC41MjcxNzgzMyw0LjUyOTU0MDM0IEM1LjIzMjEyNzE5LDMuODIzNDg2NTUgNi4zNzY4NDAzOCwzLjgyMzQ4NjU1IDcuMDgzOTk5MTEsNC41Mjk1NDAzNCBMOS45OTg4MTg5OSw3LjQ0MzI1NTI5IEwxMi45MTI1MzM5LDQuNTI5NTQwMzQgQzEzLjYxODU4NzcsMy44MjM0ODY1NSAxNC43NjQ0MDU5LDMuODIzNDg2NTUgMTUuNDcwNDU5Nyw0LjUyOTU0MDM0IEMxNi4xNzY1MTM0LDUuMjM0NDg5MiAxNi4xNzY1MTM0LDYuMzgwMzA3MzMgMTUuNDcwNDU5Nyw3LjA4NjM2MTEyIEwxMi41NTQ1MzQ4LDEwLjAwMTE4MSBMMTUuNDcwNDU5NywxMi45MTQ4OTYgQzE2LjE3NjUxMzQsMTMuNjIwOTQ5NyAxNi4xNzY1MTM0LDE0Ljc1NTcxODUgMTUuNDY0OTM1LDE1LjQ2NzI5NyIgaWQ9InBhdGgtMSI+PC9wYXRoPgogICAgPC9kZWZzPgogICAgPGcgaWQ9Ikljb24iIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJFeHRlbnNpb25zL0Nvbm5lY3Rpb24vQ2xvc2UiPgogICAgICAgICAgICA8bWFzayBpZD0ibWFzay0yIiBmaWxsPSJ3aGl0ZSI+CiAgICAgICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNwYXRoLTEiPjwvdXNlPgogICAgICAgICAgICA8L21hc2s+CiAgICAgICAgICAgIDx1c2UgaWQ9ImNsb3NlIiBmaWxsPSIjRkZGRkZGIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHhsaW5rOmhyZWY9IiNwYXRoLTEiPjwvdXNlPgogICAgICAgICAgICA8ZyBpZD0iQ29sb3IvVGFuZ2VyaW5lLzFfVGFuZ2VyaW5lIiBtYXNrPSJ1cmwoI21hc2stMikiIGZpbGw9IiNGRjhDMUEiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iQ29sb3IiIHg9IjAiIHk9IjAiIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCI+PC9yZWN0PgogICAgICAgICAgICA8L2c+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4=\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUwLjIgKDU1MDQ3KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5oZWxwPC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGRlZnM+PC9kZWZzPgogICAgPGcgaWQ9ImhlbHAiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxwYXRoIGQ9Ik05Ljk5OTA1NDQ5LDE4IEM1LjU4MTYwOTc0LDE4IDIsMTQuNDE3MzQ2MSAyLDEwLjAwMDk0NTMgQzIsNS41ODI2NTM5MSA1LjU4MTYwOTc0LDIgOS45OTkwNTQ0OSwyIEMxNC40MTgzOTAzLDIgMTgsNS41ODI2NTM5MSAxOCwxMC4wMDA5NDUzIEMxOCwxNC40MTczNDYxIDE0LjQxODM5MDMsMTggOS45OTkwNTQ0OSwxOCBaIE05Ljg1MzI1NjEyLDEyLjM2MTUyNjYgQzkuMjY4OTI4MDIsMTIuMzYxNTI2NiA4LjgwNTYyNTgxLDEyLjgzNjA2MjkgOC44MDU2MjU4MSwxMy40MjIxNDM0IEM4LjgwNTYyNTgxLDEzLjk5MzA5OTQgOS4yNjg5MjgwMiwxNC40Njc2MzU2IDkuODUzMjU2MTIsMTQuNDY3NjM1NiBDMTAuNDM5NDc1MiwxNC40Njc2MzU2IDEwLjkxNDEyMzYsMTMuOTkzMDk5NCAxMC45MTQxMjM2LDEzLjQyMjE0MzQgQzEwLjkxNDEyMzYsMTIuODM2MDYyOSAxMC40Mzk0NzUyLDEyLjM2MTUyNjYgOS44NTMyNTYxMiwxMi4zNjE1MjY2IFogTTkuNDYxODEzMDIsMTEuNjQzMTA1MyBMMTAuMTU5NjAyOSwxMS42NDMxMDUzIEMxMC4zNDg3MDU4LDExLjY0MzEwNTMgMTAuNTI0NTcxNiwxMS41MjM5OTg2IDEwLjU2OTk1NjMsMTEuMzQwNjEyMSBDMTAuNjU4ODM0NywxMC45NzAwNTc5IDEwLjkxNDEyMzYsMTAuNzE2NzE5OCAxMS4yNTQ1MDg5LDEwLjQ2MTQ5MTIgTDExLjcxNTkyMDEsMTAuMTIxMTg2MyBDMTIuNDQ1ODU3NSw5LjU3MjkxNzQxIDEyLjg5NzgxMzUsOC45MDU1NDE3NyAxMi44OTc4MTM1LDcuOTMwMDAxMTggQzEyLjg5NzgxMzUsNi43MTQzNTY2MSAxMS45MTA2OTYxLDUuNTMyNzQyNTMgOS45MzgzNTI0NCw1LjUzMjc0MjUzIEM4LjE2MDc4NDc4LDUuNTMyNzQyNTMgNy4xMDE4MDgzLDYuNzM3MDQzNiA3LjEwMTgwODMsOC4xNjA2NTIyNSBDNy4xMDE4MDgzLDguMTk4NDYzOSA3LjEwMzY5OTMzLDguMjM2Mjc1NTUgNy4xMDM2OTkzMyw4LjI3NTk3Nzc5IEM3LjExMzE1NDQ3LDguNDk3MTc1OTQgNy4yODkwMjAyMSw4LjY3ODY3MTg3IDcuNTEwMjcwNjUsOC42ODYyMzQyIEw4LjM4MzkyNjI1LDguNzE2NDgzNTIgQzguNjI0MDg2OTksOC43MjU5MzY0MyA4LjgxODg2MzAyLDguNTMzMDk3MDEgOC44MTg4NjMwMiw4LjI5Mjk5MzAzIEw4LjgxODg2MzAyLDguMjgzNTQwMTIgQzguODE4ODYzMDIsNy43MTI1ODQxOSA5LjIzMjk5ODQ2LDcuMTM5NzM3NjggOS45MzgzNTI0NCw3LjEzOTczNzY4IEMxMC42NzAxODA4LDcuMTM5NzM3NjggMTEuMDIxOTEyMyw3LjYwMTAzOTgyIDExLjAyMTkxMjMsOC4wNzU1NzYwNCBDMTEuMDIxOTEyMyw4LjM5MzE5MzkgMTAuOTE0MTIzNiw4LjY4NjIzNDIgMTAuNTg1MDg0NSw4LjkzMDExOTM0IEw5Ljk2NDgyNjg1LDkuMzkzMzEyMDYgQzkuMjY4OTI4MDIsOS45MTUxMTI4NCA5LjAzNjMzMTQsMTAuNTM1MjIzOSA5LjAzNjMzMTQsMTEuMTA4MDcwNCBDOS4wMzYzMzE0LDExLjE1MTU1MzggOS4wMzgyMjI0MywxMS4xOTUwMzcyIDkuMDM4MjIyNDMsMTEuMjM0NzM5NSBDOS4wNDU3ODY1NSwxMS40NjM0OTk5IDkuMjMyOTk4NDYsMTEuNjQzMTA1MyA5LjQ2MTgxMzAyLDExLjY0MzEwNTMgWiIgaWQ9ImhlbHAtaWNvbiIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPgogICAgPC9nPgo8L3N2Zz4=\"},function(e,t,n){e.exports=n.p+\"static/assets/ed3fe9e11706e76990709ac2e567ada6.svg\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjUycHgiIGhlaWdodD0iNTJweCIgdmlld0JveD0iMCAwIDUyIDUyIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCA0My4yICgzOTA2OSkgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CiAgICA8dGl0bGU+c3RvcC1wbGF5YmFjazwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxkZWZzPgogICAgICAgIDxyZWN0IGlkPSJwYXRoLTEiIHg9IjAiIHk9IjAiIHdpZHRoPSI0NCIgaGVpZ2h0PSI0NCIgcng9IjQiPjwvcmVjdD4KICAgICAgICA8ZmlsdGVyIHg9Ii0xMy42JSIgeT0iLTEzLjYlIiB3aWR0aD0iMTI3LjMlIiBoZWlnaHQ9IjEyNy4zJSIgZmlsdGVyVW5pdHM9Im9iamVjdEJvdW5kaW5nQm94IiBpZD0iZmlsdGVyLTIiPgogICAgICAgICAgICA8ZmVNb3JwaG9sb2d5IHJhZGl1cz0iMiIgb3BlcmF0b3I9ImRpbGF0ZSIgaW49IlNvdXJjZUFscGhhIiByZXN1bHQ9InNoYWRvd1NwcmVhZE91dGVyMSI+PC9mZU1vcnBob2xvZ3k+CiAgICAgICAgICAgIDxmZU9mZnNldCBkeD0iMCIgZHk9IjAiIGluPSJzaGFkb3dTcHJlYWRPdXRlcjEiIHJlc3VsdD0ic2hhZG93T2Zmc2V0T3V0ZXIxIj48L2ZlT2Zmc2V0PgogICAgICAgICAgICA8ZmVDb21wb3NpdGUgaW49InNoYWRvd09mZnNldE91dGVyMSIgaW4yPSJTb3VyY2VBbHBoYSIgb3BlcmF0b3I9Im91dCIgcmVzdWx0PSJzaGFkb3dPZmZzZXRPdXRlcjEiPjwvZmVDb21wb3NpdGU+CiAgICAgICAgICAgIDxmZUNvbG9yTWF0cml4IHZhbHVlcz0iMCAwIDAgMCAwLjI5ODAzOTIxNiAgIDAgMCAwIDAgMC41OTIxNTY4NjMgICAwIDAgMCAwIDEgIDAgMCAwIDAuMSAwIiB0eXBlPSJtYXRyaXgiIGluPSJzaGFkb3dPZmZzZXRPdXRlcjEiPjwvZmVDb2xvck1hdHJpeD4KICAgICAgICA8L2ZpbHRlcj4KICAgIDwvZGVmcz4KICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJEZXNrdG9wLS0tMTI4MHg3MjAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC02MTkuMDAwMDAwLCAtMzQ1LjAwMDAwMCkiPgogICAgICAgICAgICA8ZyBpZD0iU3RlcC00LS0tUGxheWluZy1UcmltIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLjAwMDAwMCwgNDIuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICA8ZyBpZD0iUGxheS0vLVJlY29yZC0vLVN0b3AiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDYyMy4wMDAwMDAsIDMwNy4wMDAwMDApIj4KICAgICAgICAgICAgICAgICAgICA8ZyBpZD0ic3RvcC1wbGF5YmFjayI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx1c2UgZmlsbD0iYmxhY2siIGZpbGwtb3BhY2l0eT0iMSIgZmlsdGVyPSJ1cmwoI2ZpbHRlci0yKSIgeGxpbms6aHJlZj0iI3BhdGgtMSI+PC91c2U+CiAgICAgICAgICAgICAgICAgICAgICAgIDx1c2UgZmlsbD0iI0ZGRkZGRiIgZmlsbC1ydWxlPSJldmVub2RkIiB4bGluazpocmVmPSIjcGF0aC0xIj48L3VzZT4KICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgc3Ryb2tlPSIjRkZGRkZGIiBzdHJva2Utd2lkdGg9IjEiIHg9IjAuNSIgeT0iMC41IiB3aWR0aD0iNDMiIGhlaWdodD0iNDMiIHJ4PSI0Ij48L3JlY3Q+CiAgICAgICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8L2c+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4K\"},function(e,t,n){e.exports=n.p+\"static/assets/79a644579518611a7b397f85a32cfb85.svg\"},function(e,t,n){e.exports=n.p+\"static/assets/e91530fe8f85b7fdc983b48ab3b9885d.svg\"},function(e,t,n){e.exports=n.p+\"static/assets/2501d1b87cf04e00cc3a623fa8b5d95c.svg\"},function(e,t,n){e.exports=n.p+\"static/assets/d1f6af6170e0178514f35fedc62e5eab.svg\"},function(e,t,n){var a=n(460);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(464);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(465);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t){e.exports=\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1NyA0OSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtvcGFjaXR5OjAuMzt9LmNscy0ye29wYWNpdHk6MC4xO30uY2xzLTN7ZmlsbDojZmY2NjgwO3N0cm9rZS1taXRlcmxpbWl0OjEwO30uY2xzLTMsLmNscy00e3N0cm9rZTojZjM1O30uY2xzLTR7ZmlsbDojZmY0ZDZhO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDt9PC9zdHlsZT48L2RlZnM+PHRpdGxlPlIxXyBDLlByb2NlZHVyZSBFZGl0YmxlIElucHV0czwvdGl0bGU+PGcgaWQ9ImJvb2xlYW5fYm9vbGVhbl9pbnB1dHMiIGRhdGEtbmFtZT0iYm9vbGVhbiArIGJvb2xlYW4gaW5wdXRzIj48cmVjdCBjbGFzcz0iY2xzLTMiIHg9IjAuNSIgeT0iMC41IiB3aWR0aD0iNTYiIGhlaWdodD0iNDgiIHJ4PSI0IiByeT0iNCIvPjxwYXRoIGNsYXNzPSJjbHMtNCIgZD0iTTMyLjUsNDAuNWgtOGwtMTYtMTZoMGwxNi0xNmg4bDE2LDE2aDBaIi8+PC9nPjwvc3ZnPg==\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1NyA0OSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtvcGFjaXR5OjAuMzt9LmNscy0ye29wYWNpdHk6MC4xO30uY2xzLTN7ZmlsbDojZmY2NjgwO3N0cm9rZS1taXRlcmxpbWl0OjEwO30uY2xzLTMsLmNscy00e3N0cm9rZTojZjM1O30uY2xzLTR7ZmlsbDojZmY0ZDZhO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDt9PC9zdHlsZT48L2RlZnM+PHRpdGxlPlIxXyBDLlByb2NlZHVyZSBFZGl0YmxlIElucHV0czwvdGl0bGU+PGcgaWQ9ImJvb2xlYW5fYm9vbGVhbl9pbnB1dHMiIGRhdGEtbmFtZT0iYm9vbGVhbiArIGJvb2xlYW4gaW5wdXRzIj48cmVjdCBjbGFzcz0iY2xzLTMiIHg9IjAuNSIgeT0iMC41IiB3aWR0aD0iNTYiIGhlaWdodD0iNDgiIHJ4PSI0IiByeT0iNCIvPjxyZWN0IGNsYXNzPSJjbHMtNCIgeD0iOC41IiB5PSI4LjUiIHdpZHRoPSI0MCIgaGVpZ2h0PSIzMiIgcng9IjE2IiByeT0iMTYiLz48L2c+PC9zdmc+\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1NyA0OSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtvcGFjaXR5OjAuMzt9LmNscy0ye29wYWNpdHk6MC4xO30uY2xzLTN7ZmlsbDojZmY2NjgwO3N0cm9rZTojZjM1O3N0cm9rZS1taXRlcmxpbWl0OjEwO30uY2xzLTR7Zm9udC1zaXplOjEycHg7ZmlsbDojZmZmO2ZvbnQtZmFtaWx5OkhlbHZldGljYU5ldWUtQm9sZCwgSGVsdmV0aWNhIE5ldWUsIHNhbnMtc2VyaWY7Zm9udC13ZWlnaHQ6NzAwO2xldHRlci1zcGFjaW5nOjBlbTt9PC9zdHlsZT48L2RlZnM+PHRpdGxlPlIxXyBDLlByb2NlZHVyZSBFZGl0YmxlIElucHV0czwvdGl0bGU+PGcgaWQ9ImJvb2xlYW5fYm9vbGVhbl9pbnB1dHMiIGRhdGEtbmFtZT0iYm9vbGVhbiArIGJvb2xlYW4gaW5wdXRzIj48cmVjdCBjbGFzcz0iY2xzLTMiIHg9IjAuNSIgeT0iMC41IiB3aWR0aD0iNTYiIGhlaWdodD0iNDgiIHJ4PSI0IiByeT0iNCIvPjx0ZXh0IGNsYXNzPSJjbHMtNCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTcuNTcgMjcuNSkiPnRleHQ8L3RleHQ+PC9nPjwvc3ZnPgo=\"},function(e,t,n){e.exports=n.p+\"static/assets/bc0fbf502b38884f440135ddae40016d.svg\"},function(e,t,n){e.exports=n.p+\"static/assets/f6d9f33ec366a89a58b3cf0e125adf97.svg\"},function(e,t,n){e.exports=n.p+\"static/assets/165746cd277a144ddefd62ac5d67b696.svg\"},function(e,t,n){var a=n(479);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t){e.exports=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjE2cHgiIGhlaWdodD0iMTZweCIgdmlld0JveD0iMCAwIDE2IDE2IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCA0OC4yICg0NzMyNykgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CiAgICA8dGl0bGU+eC1pY29uX1YyPC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGRlZnM+PC9kZWZzPgogICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj4KICAgICAgICA8ZyBpZD0ieC1pY29uX1YyIiBzdHJva2U9IiM1NzVFNzUiIHN0cm9rZS13aWR0aD0iMiI+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0zLDggTDEyLDgiIGlkPSJTdHJva2UtMSI+PC9wYXRoPgogICAgICAgICAgICA8cG9seWxpbmUgaWQ9IlN0cm9rZS01IiBwb2ludHM9IjQgMTAgMiA3Ljk5OTQzNDIzIDQgNiI+PC9wb2x5bGluZT4KICAgICAgICAgICAgPHBvbHlsaW5lIGlkPSJTdHJva2UtNS1Db3B5IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMy4wMDAwMDAsIDguMDAwMDAwKSBzY2FsZSgtMSwgMSkgdHJhbnNsYXRlKC0xMy4wMDAwMDAsIC04LjAwMDAwMCkgIiBwb2ludHM9IjE0IDEwIDEyIDcuOTk5NDM0MjMgMTQgNiI+PC9wb2x5bGluZT4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg==\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjE2cHgiIGhlaWdodD0iMTZweCIgdmlld0JveD0iMCAwIDE2IDE2IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCA0OC4yICg0NzMyNykgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CiAgICA8dGl0bGU+eSBpY29uIFYyPC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGRlZnM+PC9kZWZzPgogICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj4KICAgICAgICA8ZyBpZD0ieS1pY29uLVYyIiBzdHJva2U9IiM1NzVFNzUiIHN0cm9rZS13aWR0aD0iMiI+CiAgICAgICAgICAgIDxnIGlkPSJ5LWljb24iIHRyYW5zZm9ybT0idHJhbnNsYXRlKDguMDAwMDAwLCA4LjAwMDAwMCkgcm90YXRlKDkwLjAwMDAwMCkgdHJhbnNsYXRlKC04LjAwMDAwMCwgLTguMDAwMDAwKSB0cmFuc2xhdGUoMi4wMDAwMDAsIDYuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMSwyIEwxMCwyIiBpZD0iU3Ryb2tlLTEiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDxwb2x5bGluZSBpZD0iU3Ryb2tlLTUiIHBvaW50cz0iMiA0IDAgMS45OTk0MzQyMyAyIDAiPjwvcG9seWxpbmU+CiAgICAgICAgICAgICAgICA8cG9seWxpbmUgaWQ9IlN0cm9rZS01LUNvcHkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDExLjAwMDAwMCwgMi4wMDAwMDApIHNjYWxlKC0xLCAxKSB0cmFuc2xhdGUoLTExLjAwMDAwMCwgLTIuMDAwMDAwKSAiIHBvaW50cz0iMTIgNCAxMCAxLjk5OTQzNDIzIDEyIDAiPjwvcG9seWxpbmU+CiAgICAgICAgICAgIDwvZz4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg==\"},function(e,t,n){e.exports=n.p+\"static/assets/7d2d28d80d4ae06acb4fdbde429448e6.svg\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTAwcHgiIGhlaWdodD0iMTAwcHgiIHZpZXdCb3g9IjAgMCAyMCAyMCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgIDwhLS0gR2VuZXJhdG9yOiBTa2V0Y2ggNDkuMyAoNTExNjcpIC0gaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoIC0tPgogICAgPHRpdGxlPlNvdW5kPC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGRlZnM+PC9kZWZzPgogICAgPGcgaWQ9IlNvdW5kIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8cGF0aCBkPSJNMTIuNDc4NTA1OCwxMi42NjY2NjY3IEMxMi4zMTQ0OTQ3LDEyLjY2NjY2NjcgMTIuMTQ1ODg1MiwxMi42MjcyMDQ0IDExLjk5MjYwMzgsMTIuNTQ0MDUxNyBDMTEuNTM3MzU4LDEyLjI5NjAwMzEgMTEuMzg1NjA5NCwxMS43NTYyMTU2IDExLjY1NTM4NDcsMTEuMzM3NjMzNSBDMTIuMTY4ODc3NCwxMC41MzcxMTMxIDEyLjE2ODg3NzQsOS41NDQ5MTg2NyAxMS42NTUzODQ3LDguNzQ1ODA3NTYgQzExLjM4NTYwOTQsOC4zMjU4MTYxOCAxMS41MzczNTgsNy43ODYwMjg2MSAxMS45OTI2MDM4LDcuNTM3OTgwMDEgQzEyLjQ1MjQ0OCw3LjI5Mjc1MDE0IDEzLjAzNzk4MjksNy40MzA4NjgxMSAxMy4zMDQ2OTI2LDcuODQ4MDQwNzYgQzE0LjE3Mzc5ODEsOS4yMDEwMzMxMSAxNC4xNzM3OTgxLDEwLjg4MDk5ODYgMTMuMzA0NjkyNiwxMi4yMzM5OTEgQzEzLjEyNjg4NjIsMTIuNTEzMDQ1NyAxMi44MDY1MjgsMTIuNjY2NjY2NyAxMi40Nzg1MDU4LDEyLjY2NjY2NjcgWiBNMTUuMzgwNjc4NCwxMy44MzMzMzMzIEMxNS4yNDA4OTAyLDEzLjgzMzMzMzMgMTUuMDk1ODc2MywxMy43OTYyODEgMTQuOTY2NTM5NiwxMy43MTgyMDY0IEMxNC41Nzg1Mjk1LDEzLjQ4NTMwNiAxNC40NDkxOTI4LDEyLjk3ODQ4MjkgMTQuNjc5MTI0NywxMi41ODU0NjM0IEMxNS41OTQ5MzMxLDExLjAxNjAzMjEgMTUuNTk0OTMzMSw5LjA2NTQ5MSAxNC42NzkxMjQ3LDcuNDk3MzgyOTkgQzE0LjQ0OTE5MjgsNy4xMDQzNjM1MiAxNC41Nzg1Mjk1LDYuNTk2MjE3MTIgMTQuOTY2NTM5Niw2LjM2MzMxNjY5IEMxNS4zNTU4NTYyLDYuMTM0Mzg2MTYgMTUuODU0OTEyOSw2LjI2Mjc0NjA1IDE2LjA4NDg0NDgsNi42NTQ0NDIyMyBDMTcuMzA1MDUxNyw4Ljc0MjYwNjMyIDE3LjMwNTA1MTcsMTEuMzM4OTE2OCAxNi4wODQ4NDQ4LDEzLjQyNzA4MDkgQzE1LjkzMTk5MjQsMTMuNjg5MDkzOSAxNS42NjAyNTQ3LDEzLjgzMzMzMzMgMTUuMzgwNjc4NCwxMy44MzMzMzMzIFogTTEwLjMwNDM0NzgsNS42MjUwMTU1NyBMMTAuMzA0MzQ3OCwxMy44NzM2NzUgQzEwLjMwNDM0NzgsMTQuODUwOTM0IDkuMTA5Njk4NDksMTUuMzYyNTEwMSA4LjM2NDc4MzExLDE0LjcwMzgwNTIgTDYuNzU2NjAxMywxMy4yNzk3NjA3IEM2LjE4NzEyMzk0LDEyLjc3NjI4MzQgNS40NDQ5OTMyOSwxMi40OTY4NzM3IDQuNjczNjIyOTcsMTIuNDk2ODczNyBMNC4zOTIzNjUyLDEyLjQ5Njg3MzcgQzMuNjIzNzc5NjEsMTIuNDk2ODczNyAzLDExLjg5MzUxMDggMywxMS4xNDcwNjg2IEwzLDguMzY2NDY5ODkgQzMsNy42MjEzNzc0MyAzLjYyMzc3OTYxLDcuMDE2NjY0NzEgNC4zOTIzNjUyLDcuMDE2NjY0NzEgTDQuNjU4MzA2OTUsNy4wMTY2NjQ3MSBDNS40Mjk2NzcyNyw3LjAxNjY2NDcxIDYuMTcxODA3OTIsNi43MzcyNTUwNCA2Ljc0MTI4NTI5LDYuMjMzNzc3NzEgTDguMzY0NzgzMTEsNC43OTYyMzUxOSBDOS4xMDk2OTg0OSw0LjEzNzUzMDI2IDEwLjMwNDM0NzgsNC42NDkxMDY0MyAxMC4zMDQzNDc4LDUuNjI1MDE1NTcgWiIgaWQ9IkNvbWJpbmVkLVNoYXBlIiBmaWxsPSIjNTc1RTc1Ij48L3BhdGg+CiAgICA8L2c+Cjwvc3ZnPgo=\"},function(e,t,n){e.exports=n.p+\"static/assets/f9a0fb45ee35279e05b6f4e637509777.svg\"},function(e,t,n){e.exports=n.p+\"static/assets/af8e46c9477a8cadeb6c26b4686407a5.svg\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDQ4LjIgKDQ3MzI3KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5yZWNvcmQ8L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZGVmcz48L2RlZnM+CiAgICA8ZyBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0icmVjb3JkIiBmaWxsPSIjRkZGRkZGIj4KICAgICAgICAgICAgPHBhdGggZD0iTTE1LjkzNjUwMDYsMTEuMTQ4MzgxIEMxNS4wMzY5NzA3LDEzLjMzMzIyODUgMTMuMDUxODAxMSwxNC44MjY0Njk3IDEwLjc3MTk1OCwxNS4xMDkzOTk2IEwxMC43NzE5NTgsMTcuMjE0MDgzNiBDMTAuNzcxOTU4LDE3LjY1NTc2ODYgMTAuNDMwNzU3LDE4IDkuOTk2NTAxMTYsMTggQzkuNTYyMjQ1MzMsMTggOS4yMjEwNDQzMiwxNy42NTU3Njg2IDkuMjIxMDQ0MzIsMTcuMjE0MDgzNiBMOS4yMjEwNDQzMiwxNS4xMDkzOTk2IEM2Ljk1NjcxMDMzLDE0LjgyNjQ2OTcgNC45NzMwOTE3MSwxMy4zNDczNzUgNC4wNTY1MDE3MiwxMS4xNzk4MTc3IEMzLjkwMTQxMDM1LDEwLjc4Njg1OTUgNC4wNzM1NjE3NywxMC4zMTUzMDk3IDQuNDc1MjQ4NDIsMTAuMTU4MTI2NCBDNC44NjI5NzY4NCw5Ljk4NTIyNDc3IDUuMzI4MjUwOTUsMTAuMTU4MTI2NCA1LjQ4MzM0MjMyLDEwLjU2NjgwMjkgQzYuMjU4Nzk5MTYsMTIuMzkwMTI4OSA4LjAyNjg0MDc3LDEzLjU4NDcyMTggOS45OTY1MDExNiwxMy41ODQ3MjE4IEMxMS45NjYxNjE2LDEzLjU4NDcyMTggMTMuNzQ5NzEyMywxMi4zOTAxMjg5IDE0LjUwOTY2LDEwLjUzMzc5NDQgQzE0LjY4MDI2MDUsMTAuMTQwODM2MiAxNS4xNDU1MzQ2LDkuOTUzNzg4MTIgMTUuNTMzMjYzLDEwLjEyNjY4OTcgQzE1LjkyMDk5MTUsMTAuMjk5NTkxMyAxNi4xMDcxMDExLDEwLjc1NTQyMjggMTUuOTM2NTAwNiwxMS4xNDgzODEgWiBNNy4yODIyNDcxMSw4LjY0NjkyOTgyIEw3LjI4MjI0NzExLDQuNjg2NDAzNTEgQzcuMjgyMjQ3MTEsMy4xOTczNjg0MiA4LjQ3MDAzNTQ4LDIgOS45MTM0MjM4OCwyIEMxMS4zNzE4NDc2LDIgMTIuNTQ0NjAwNywzLjE5NzM2ODQyIDEyLjU0NDYwMDcsNC42ODY0MDM1MSBMMTIuNTQ0NjAwNyw4LjY0NjkyOTgyIEMxMi41NDQ2MDA3LDEwLjEyMDYxNCAxMS4zNzE4NDc2LDExLjMzMzMzMzMgOS45MTM0MjM4OCwxMS4zMzMzMzMzIEM4LjQ3MDAzNTQ4LDExLjMzMzMzMzMgNy4yODIyNDcxMSwxMC4xMjA2MTQgNy4yODIyNDcxMSw4LjY0NjkyOTgyIFoiIGlkPSJyZWNvcmQtaWNvbiI+PC9wYXRoPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+Cg==\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjUycHgiIGhlaWdodD0iNTJweCIgdmlld0JveD0iMCAwIDUyIDUyIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCA0My4yICgzOTA2OSkgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CiAgICA8dGl0bGU+c3RvcC1yZWNvcmRpbmc8L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZGVmcz4KICAgICAgICA8cmVjdCBpZD0icGF0aC0xIiB4PSIyMCIgeT0iMCIgd2lkdGg9IjQ0IiBoZWlnaHQ9IjQ0IiByeD0iNCI+PC9yZWN0PgogICAgICAgIDxmaWx0ZXIgeD0iLTEzLjYlIiB5PSItMTMuNiUiIHdpZHRoPSIxMjcuMyUiIGhlaWdodD0iMTI3LjMlIiBmaWx0ZXJVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giIGlkPSJmaWx0ZXItMiI+CiAgICAgICAgICAgIDxmZU1vcnBob2xvZ3kgcmFkaXVzPSIyIiBvcGVyYXRvcj0iZGlsYXRlIiBpbj0iU291cmNlQWxwaGEiIHJlc3VsdD0ic2hhZG93U3ByZWFkT3V0ZXIxIj48L2ZlTW9ycGhvbG9neT4KICAgICAgICAgICAgPGZlT2Zmc2V0IGR4PSIwIiBkeT0iMCIgaW49InNoYWRvd1NwcmVhZE91dGVyMSIgcmVzdWx0PSJzaGFkb3dPZmZzZXRPdXRlcjEiPjwvZmVPZmZzZXQ+CiAgICAgICAgICAgIDxmZUNvbXBvc2l0ZSBpbj0ic2hhZG93T2Zmc2V0T3V0ZXIxIiBpbjI9IlNvdXJjZUFscGhhIiBvcGVyYXRvcj0ib3V0IiByZXN1bHQ9InNoYWRvd09mZnNldE91dGVyMSI+PC9mZUNvbXBvc2l0ZT4KICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggdmFsdWVzPSIwIDAgMCAwIDEgICAwIDAgMCAwIDAuNCAgIDAgMCAwIDAgMC4xMDE5NjA3ODQgIDAgMCAwIDAuMSAwIiB0eXBlPSJtYXRyaXgiIGluPSJzaGFkb3dPZmZzZXRPdXRlcjEiPjwvZmVDb2xvck1hdHJpeD4KICAgICAgICA8L2ZpbHRlcj4KICAgIDwvZGVmcz4KICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJEZXNrdG9wLS0tMTI4MHg3MjAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC02MTkuMDAwMDAwLCAtMzQ1LjAwMDAwMCkiPgogICAgICAgICAgICA8ZyBpZD0iU3RlcC0yLS0tUmVjb3JkaW5nIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLjAwMDAwMCwgNDIuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICA8ZyBpZD0iUGxheS0vLVJlY29yZC0vLVN0b3AiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDYwMy4wMDAwMDAsIDMwNy4wMDAwMDApIj4KICAgICAgICAgICAgICAgICAgICA8ZyBpZD0ic3RvcC1yZWNvcmRpbmciPgogICAgICAgICAgICAgICAgICAgICAgICA8dXNlIGZpbGw9ImJsYWNrIiBmaWxsLW9wYWNpdHk9IjEiIGZpbHRlcj0idXJsKCNmaWx0ZXItMikiIHhsaW5rOmhyZWY9IiNwYXRoLTEiPjwvdXNlPgogICAgICAgICAgICAgICAgICAgICAgICA8dXNlIGZpbGw9IiNGRjY2MUEiIGZpbGwtcnVsZT0iZXZlbm9kZCIgeGxpbms6aHJlZj0iI3BhdGgtMSI+PC91c2U+CiAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHN0cm9rZT0iI0U2NEQwMCIgc3Ryb2tlLXdpZHRoPSIxIiB4PSIyMC41IiB5PSIwLjUiIHdpZHRoPSI0MyIgaGVpZ2h0PSI0MyIgcng9IjQiPjwvcmVjdD4KICAgICAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDwvZz4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg==\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjQ5cHgiIGhlaWdodD0iNTJweCIgdmlld0JveD0iLTUgMCA0OSA0OCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgIDwhLS0gR2VuZXJhdG9yOiBTa2V0Y2ggNDMuMiAoMzkwNjkpIC0gaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoIC0tPgogICAgPHRpdGxlPnBsYXk8L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZGVmcz4KICAgICAgICA8cGF0aCBkPSJNMTcuMjIxNDY1MSw4LjM0NDk5NDQzIEMxOS43NzY2NDE5LDQuMDg2MzY2NTMgMjMuOTIzNDA1Nyw0LjA5MzAzOTQ2IDI2LjQ3NDU3ODcsOC4zNDQ5OTQ0MyBMNDAuMTUyMDk3NCwzMS4xNDA4NTkgQzQyLjcwNzI3NDEsMzUuMzk5NDg2OSA0MC43NDg5NjcyLDM4Ljg1MTc4NjkgMzUuNzcyNjYzNywzOC44NTE3ODY5IEw3LjkyMzM4MDA2LDM4Ljg1MTc4NjkgQzIuOTQ5NTA4OSwzOC44NTE3ODY5IDAuOTkyNzczNDI5LDM1LjM5MjgxNCAzLjU0Mzk0NjQxLDMxLjE0MDg1OSBMMTcuMjIxNDY1MSw4LjM0NDk5NDQzIFoiIGlkPSJwYXRoLTEiPjwvcGF0aD4KICAgIDwvZGVmcz4KICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJEZXNrdG9wLS0tMTI4MHg3MjAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC02MjMuMDAwMDAwLCAtMzQ3LjAwMDAwMCkiPgogICAgICAgICAgICA8ZyBpZD0iU3RlcC0zLS0tQWx0ZXJpbmctU3VnZ2VzdGVkLVRyaW0iIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAuMDAwMDAwLCA0Mi4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxnIGlkPSJQbGF5LS8tUmVjb3JkLS8tU3RvcCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNjIzLjAwMDAwMCwgMzA3LjAwMDAwMCkiPgogICAgICAgICAgICAgICAgICAgIDxnIGlkPSJwbGF5IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMS44NDkxMzEsIDIyLjAwMjY1Nikgcm90YXRlKDkwLjAwMDAwMCkgdHJhbnNsYXRlKC0yMS44NDkxMzEsIC0yMi4wMDI2NTYpICI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx1c2Ugc3Ryb2tlPSIjRkZGRkZGIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9IiNGRkZGRkYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgeGxpbms6aHJlZj0iI3BhdGgtMSI+PC91c2U+CiAgICAgICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8L2c+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4K\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjUycHgiIGhlaWdodD0iNTJweCIgdmlld0JveD0iMCAwIDUyIDUyIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCA0My4yICgzOTA2OSkgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CiAgICA8dGl0bGU+c3RvcC1wbGF5YmFjazwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxkZWZzPgogICAgICAgIDxyZWN0IGlkPSJwYXRoLTEiIHg9IjAiIHk9IjAiIHdpZHRoPSI0NCIgaGVpZ2h0PSI0NCIgcng9IjQiPjwvcmVjdD4KICAgIDwvZGVmcz4KICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJEZXNrdG9wLS0tMTI4MHg3MjAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC02MTkuMDAwMDAwLCAtMzQ1LjAwMDAwMCkiPgogICAgICAgICAgICA8ZyBpZD0iU3RlcC00LS0tUGxheWluZy1UcmltIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLjAwMDAwMCwgNDIuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICA8ZyBpZD0iUGxheS0vLVJlY29yZC0vLVN0b3AiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDYyMy4wMDAwMDAsIDMwNy4wMDAwMDApIj4KICAgICAgICAgICAgICAgICAgICA8ZyBpZD0ic3RvcC1wbGF5YmFjayI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx1c2UgZmlsbD0iI0ZGRkZGRiIgZmlsbC1ydWxlPSJldmVub2RkIiB4bGluazpocmVmPSIjcGF0aC0xIj48L3VzZT4KICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgc3Ryb2tlPSIjRkZGRkZGIiBzdHJva2Utd2lkdGg9IjEiIHg9IjAuNSIgeT0iMC41IiB3aWR0aD0iNDMiIGhlaWdodD0iNDMiIHJ4PSI0Ij48L3JlY3Q+CiAgICAgICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8L2c+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4K\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjIwcHgiIGhlaWdodD0iMjBweCIgdmlld0JveD0iMCAwIDIwIDIwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCA0OC4yICg0NzMyNykgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CiAgICA8dGl0bGU+aWNvbi0tZmFzdGVyPC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGRlZnM+PC9kZWZzPgogICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9ImZhc3RlciIgZmlsbD0iI0NGNjNDRiI+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMC40MDMwMTY4LDE1LjMzMDUyMDUgQzkuNjM2MzE4MTgsMTUuODA5MDQzIDguNjc4OTQ0OTYsMTUuMjE1MDE1IDguNjc4OTQ0OTYsMTQuMjg5NTk2NSBMOC42Nzg5NDQ5NiwxMi4zMDUzNzggTDMuNzI0MDcxODQsMTUuMzMwNTIwNSBDMi45NTczNzMyMiwxNS44MDkwNDMgMiwxNS4yMTUwMTUgMiwxNC4yODk1OTY1IEwyLDUuNzE4ODE3OTcgQzIsNC43Nzk2NDg3NSAyLjk1NzM3MzIyLDQuMTk5MzcxNDQgMy43MjQwNzE4NCw0LjY2Mjc2ODI1IEw4LjY3ODk0NDk2LDcuNjg3OTEwNjcgTDguNjc4OTQ0OTYsNS43MTg4MTc5NyBDOC42Nzg5NDQ5Niw0Ljc3OTY0ODc1IDkuNjM2MzE4MTgsNC4xOTkzNzE0NCAxMC40MDMwMTY4LDQuNjYyNzY4MjUgTDE3LjQyNTk3NjEsOC45NDc0Njk5NiBDMTguMTkxMzQxMyw5LjQxMDg2Njc4IDE4LjE5MTM0MTMsMTAuNTgyNDIxOSAxNy40MjU5NzYxLDExLjA2MDk0NDUgTDEwLjQwMzAxNjgsMTUuMzMwNTIwNSBaIj48L3BhdGg+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4=\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjIwcHgiIGhlaWdodD0iMjBweCIgdmlld0JveD0iMCAwIDIwIDIwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCA0OC4yICg0NzMyNykgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CiAgICA8dGl0bGU+aWNvbi0tc2xvd2VyPC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGRlZnM+PC9kZWZzPgogICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9InNsb3dlciIgZmlsbD0iI0NGNjNDRiI+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0yLjU3NCw4LjkzOTM2NDQxIEw5LjU5NjY2NjY3LDQuNjY5OTg5NDEgQzEwLjM2MzMzMzMsNC4xOTE0ODk0MSAxMS4zMjA2NjY3LDQuNzg1NDg5NDEgMTEuMzIwNjY2Nyw1LjcxMDg2NDQxIEwxMS4zMjA2NjY3LDcuNjk0OTg5NDEgTDE2LjI3NTMzMzMsNC42Njk5ODk0MSBDMTcuMDQyLDQuMTkxNDg5NDEgMTcuOTk5MzMzMyw0Ljc4NTQ4OTQxIDE3Ljk5OTMzMzMsNS43MTA4NjQ0MSBMMTcuOTk5MzMzMywxNC4yODEyMzk0IEMxNy45OTkzMzMzLDE1LjIyMDM2NDQgMTcuMDQyLDE1LjgwMDYxNDQgMTYuMjc1MzMzMywxNS4zMzcyMzk0IEwxMS4zMjA2NjY3LDEyLjMxMjIzOTQgTDExLjMyMDY2NjcsMTQuMjgxMjM5NCBDMTEuMzIwNjY2NywxNS4yMjAzNjQ0IDEwLjM2MzMzMzMsMTUuODAwNjE0NCA5LjU5NjY2NjY3LDE1LjMzNzIzOTQgTDIuNTc0LDExLjA1MjczOTQgQzEuODA4NjY2NjcsMTAuNTg5MzY0NCAxLjgwODY2NjY3LDkuNDE3ODY0NDEgMi41NzQsOC45MzkzNjQ0MSI+PC9wYXRoPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjIwcHgiIGhlaWdodD0iMjBweCIgdmlld0JveD0iMCAwIDIwIDIwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCA0OC4yICg0NzMyNykgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CiAgICA8dGl0bGU+bG91bmRlcjwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxkZWZzPjwvZGVmcz4KICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJsb3VuZGVyIj4KICAgICAgICAgICAgPGcgaWQ9ImxvdWRlciIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMi4wMDAwMDAsIDQuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNi43MDQxLDIuMTIyMSBMNi43MDQxLDEwLjUzNjEgQzYuNzA0MSwxMC44ODUxIDYuNDIyMSwxMS4xNjcxIDYuMDc0MSwxMS4xNjcxIEw0Ljg5NzEsMTEuMTY3MSBDNC42MjUxLDExLjE2NzEgNC4zODMxLDEwLjk5MjEgNC4yOTgxLDEwLjczMjEgQzMuODE4MSw5LjI2ODEgMi40NTIxLDguMjc4MSAwLjkxMTEsOC4yNzgxIEwwLjYzMTEsOC4yNzgxIEMwLjI4NDEsOC4yNzgxIDAuMDAwMSw3Ljk5NDEgMC4wMDAxLDcuNjQ3MSBMMC4wMDAxLDUuMDExMSBDMC4wMDAxLDQuNjY0MSAwLjI4NDEsNC4zODAxIDAuNjMxMSw0LjM4MDEgTDAuOTExMSw0LjM4MDEgQzIuNDUyMSw0LjM4MDEgMy44MTgxLDMuMzkwMSA0LjI5ODEsMS45MjYxIEM0LjM4MzEsMS42NjYxIDQuNjI1MSwxLjQ5MTEgNC44OTcxLDEuNDkxMSBMNi4wNzQxLDEuNDkxMSBDNi40MjIxLDEuNDkxMSA2LjcwNDEsMS43NzMxIDYuNzA0MSwyLjEyMjEiIGlkPSJGaWxsLTEiIGZpbGw9IiNDRjYzQ0YiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik05LjExNzIsNS4yMTI5IEM5LjcyOTIsNS44MjU5IDkuNzI5Miw2LjgzMTkgOS4xMTcyLDcuNDQ0OSIgaWQ9IlN0cm9rZS0zIiBzdHJva2U9IiNDRjYzQ0YiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMS4zNDg2LDIuOTgxNSBDMTMuMTk2Niw0LjgyOTUgMTMuMTk2Niw3LjgyOTUgMTEuMzQ4Niw5LjY3NjUiIGlkPSJTdHJva2UtNSIgc3Ryb2tlPSIjQ0Y2M0NGIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTMuNTgsMC43NTAxIEMxNi42NjMsMy44MzIxIDE2LjY2Myw4LjgyNjEgMTMuNTgsMTEuOTA4MSIgaWQ9IlN0cm9rZS03IiBzdHJva2U9IiNDRjYzQ0YiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjwvcGF0aD4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjIwcHgiIGhlaWdodD0iMjBweCIgdmlld0JveD0iMCAwIDIwIDIwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCA0OC4yICg0NzMyNykgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CiAgICA8dGl0bGU+aWNvbi0tc29mdGVyPC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGRlZnM+PC9kZWZzPgogICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9InNvZnRlciI+CiAgICAgICAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDUuMDAwMDAwLCA0LjAwMDAwMCkiPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTcuNTQwMTEyNDYsMS4zODczNjI1IEw3LjU0MDExMjQ2LDEwLjg1MzExMjUgQzcuNTQwMTEyNDYsMTEuMjQ1NzM3NSA3LjIyMjk0NjU5LDExLjU2Mjk4NzUgNi44MzE1NTA0MSwxMS41NjI5ODc1IEw1LjUwNzc3NjU1LDExLjU2Mjk4NzUgQzUuMjAxODU3NywxMS41NjI5ODc1IDQuOTI5Njc5OSwxMS4zNjYxMTI1IDQuODM0MDgwMjYsMTEuMDczNjEyNSBDNC4yOTQyMjM0Niw5LjQyNjYxMjUgMi43NTc4ODA5OCw4LjMxMjg2MjUgMS4wMjQ3MTU3Miw4LjMxMjg2MjUgTDAuNzA5Nzk5MjUxLDguMzEyODYyNSBDMC4zMTk1Mjc3NzMsOC4zMTI4NjI1IDAuMDAwMTEyNSw3Ljk5MzM2MjUgMC4wMDAxMTI1LDcuNjAyOTg3NSBMMC4wMDAxMTI1LDQuNjM3NDg3NSBDMC4wMDAxMTI1LDQuMjQ3MTEyNSAwLjMxOTUyNzc3MywzLjkyNzYxMjUgMC43MDk3OTkyNTEsMy45Mjc2MTI1IEwxLjAyNDcxNTcyLDMuOTI3NjEyNSBDMi43NTc4ODA5OCwzLjkyNzYxMjUgNC4yOTQyMjM0NiwyLjgxMzg2MjUgNC44MzQwODAyNiwxLjE2Njg2MjUgQzQuOTI5Njc5OSwwLjg3NDM2MjUgNS4yMDE4NTc3LDAuNjc3NDg3NSA1LjUwNzc3NjU1LDAuNjc3NDg3NSBMNi44MzE1NTA0MSwwLjY3NzQ4NzUgQzcuMjIyOTQ2NTksMC42Nzc0ODc1IDcuNTQwMTEyNDYsMC45OTQ3Mzc1IDcuNTQwMTEyNDYsMS4zODczNjI1IiBpZD0iRmlsbC0xIiBmaWxsPSIjQ0Y2M0NGIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNOS4yNSw0Ljg2NDUxMjUgQzkuOTM4NSw1LjU1NDEzNzUgOS45Mzg1LDYuNjg1ODg3NSA5LjI1LDcuMzc1NTEyNSIgaWQ9IlN0cm9rZS0zIiBzdHJva2U9IiNDRjYzQ0YiIHN0cm9rZS13aWR0aD0iMS43NSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48L3BhdGg+CiAgICAgICAgICAgIDwvZz4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg==\"},function(e,t,n){e.exports=n.p+\"static/assets/b1f026ce265c0f666e2063ef94b06109.svg\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjIwcHgiIGhlaWdodD0iMjBweCIgdmlld0JveD0iMCAwIDIwIDIwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCA0OC4yICg0NzMyNykgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CiAgICA8dGl0bGU+aWNvbi0tZWNobzwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxkZWZzPjwvZGVmcz4KICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+CiAgICAgICAgPGcgaWQ9ImVjaG8iIHN0cm9rZT0iI0NGNjNDRiI+CiAgICAgICAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDMuMjUwMDAwLCAyLjAwMDAwMCkiPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTMuMzE4NzE4NzUsNi45OTE0NDg3NSBDMy45MDUzNDM3NSw3LjU3OTY5ODc1IDMuOTA1MzQzNzUsOC41MzE5NDg3NSAzLjMxODcxODc1LDkuMTIwMTk4NzUgQzIuNzMyMDkzNzUsOS43MDY4MjM3NSAxLjc3ODIxODc1LDkuNzA2ODIzNzUgMS4xODk5Njg3NSw5LjEyMDE5ODc1IEMwLjYwMzM0Mzc1LDguNTMxOTQ4NzUgMC42MDMzNDM3NSw3LjU3OTY5ODc1IDEuMTg5OTY4NzUsNi45OTE0NDg3NSBDMS43NzgyMTg3NSw2LjQwNDgyMzc1IDIuNzMyMDkzNzUsNi40MDQ4MjM3NSAzLjMxODcxODc1LDYuOTkxNDQ4NzUgWiIgaWQ9IlN0cm9rZS0xIiBzdHJva2Utd2lkdGg9IjEuNSIgZmlsbD0iI0NGNjNDRiI+PC9wYXRoPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTUuMjUsNC44NjY1OTg3NSBDNy4wMjEyNSw2LjYyMTU5ODc1IDcuMDIxMjUsOS40NjUzNDg3NSA1LjI1LDExLjIzNjU5ODgiIGlkPSJTdHJva2UtMyIgc3Ryb2tlLXdpZHRoPSIxLjc1Ij48L3BhdGg+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNy41LDIuNzM4NjYxMjUgQzEwLjQ0MTI1LDUuNjc5OTExMjUgMTAuNDQxMjUsMTAuNDIzMjg2MiA3LjUsMTMuMzY2MTYxMiIgaWQ9IlN0cm9rZS01IiBzdHJva2Utd2lkdGg9IjEuNzUiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik05Ljc1LDAuNjA4OTM2MjUgQzEzLjg2MTI1LDQuNzIwMTg2MjUgMTMuODYxMjUsMTEuMzY2NDM2MiA5Ljc1LDE1LjQ5MzkzNjIiIGlkPSJTdHJva2UtNyIgc3Ryb2tlLXdpZHRoPSIxLjc1Ij48L3BhdGg+CiAgICAgICAgICAgIDwvZz4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg==\"},function(e,t,n){e.exports=n.p+\"static/assets/85f62e9e77bed58778782e6cce58c1f4.svg\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDU2LjIgKDgxNjcyKSAtIGh0dHBzOi8vc2tldGNoLmNvbSAtLT4KICAgIDx0aXRsZT5Tb3VuZC9FZmZlY3RzL0ZhZGUtb3V0PC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGcgaWQ9IlNvdW5kL0VmZmVjdHMvRmFkZS1vdXQiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxwYXRoIGQ9Ik0xMywxMC4yNSBDMTIuNjQ2NzUxNSwxMC4yNSAxMi40MTcyOTkyLDEwLjQ5MTIzNTcgMTIuMDk1NjIwMiwxMS4xMTQ2Mzg5IEwxMS45NTM4Nzk4LDExLjM5MTc3MDggQzExLjY0NDE3NzYsMTEuOTg5Mjg3MyAxMS40MTI4MTg5LDEyLjI1IDExLDEyLjI1IEMxMC42MTIwNTczLDEyLjI1IDEwLjM1MjE2MzgsMTIuMTA0NzgyNCA5Ljk0MzI0MzIyLDExLjc1MjM3OTQgTDkuODcwMDQ1NywxMS42ODkwNjggQzkuNDg5NDc3MjQsMTEuMzU5ODM1IDkuMjk0MTQ3NDMsMTEuMjUgOSwxMS4yNSBDOC44MDAwMzU2MSwxMS4yNSA4LjU5NzQxNTA1LDExLjYwNjc4ODQgOC4yMzQ0MzcxOSwxMi41ODY4Mjg2IEM3Ljc2NDA4MTcxLDEzLjg1Njc4ODQgNy41NDA3NzYzNSwxNC4yNSA3LDE0LjI1IEM2LjU5NzkzODQ1LDE0LjI1IDYuMzY4NTI4MywxNC4xMTAyOTUxIDYuMDg2NjU4MTYsMTMuNzg4NTk1NSBDNi4wMzIwOTMyOSwxMy43MjU3MzY2IDYuMDAyNjI0MTYsMTMuNjkxNzUyIDUuOTc5ODE0MzQsMTMuNjY2MDkxIEM1LjcxNDc5NTM4LDEzLjM2Nzk0NDYgNS40ODc2NDI3NSwxMy4yNSA1LDEzLjI1IEM0LjYyMzQ1NjQyLDEzLjI1IDQuMzA3Mzk4MjQsMTMuODY4Mzc0NyAzLjczNzE3MDgyLDE1LjU3OTA1NjkgQzMuMDU3Mzk4MjQsMTcuNjE4Mzc0NyAyLjczNDU2NzUzLDE4LjI1IDIsMTguMjUgQzEuODYxOTI4ODEsMTguMjUgMS43NSwxOC4xMzgwNzEyIDEuNzUsMTggTDEuNzUsMiBDMS43NSwxLjg2MTkyODgxIDEuODYxOTI4ODEsMS43NSAyLDEuNzUgQzIuNzM0NTY3NTMsMS43NSAzLjA1NzM5ODI0LDIuMzgxNjI1MjkgMy43MzcxNzA4Miw0LjQyMDk0MzA2IEM0LjMwNzM5ODI0LDYuMTMxNjI1MjkgNC42MjM0NTY0Miw2Ljc1IDUsNi43NSBDNS40ODc2NDI3NSw2Ljc1IDUuNzE0Nzk1MzgsNi42MzIwNTUzNyA1Ljk3OTgxNDM0LDYuMzMzOTA5MDQgQzYuMDAyNjI0MTYsNi4zMDgyNDc5OSA2LjAzMjA5MzI5LDYuMjc0MjYzNDIgNi4wODY2NTgxNiw2LjIxMTQwNDUxIEM2LjM2ODUyODMsNS44ODk3MDQ5IDYuNTk3OTM4NDUsNS43NSA3LDUuNzUgQzcuNTQwNzc2MzUsNS43NSA3Ljc2NDA4MTcxLDYuMTQzMjExNjIgOC4yMzQ0MzcxOSw3LjQxMzE3MTQxIEM4LjU5NzQxNTA1LDguMzkzMjExNjIgOC44MDAwMzU2MSw4Ljc1IDksOC43NSBDOS4yOTQxNDc0Myw4Ljc1IDkuNDg5NDc3MjQsOC42NDAxNjQ5NyA5Ljg3MDA0NTcsOC4zMTA5MzE5OSBMOS45NDMyNDMyMiw4LjI0NzYyMDYxIEMxMC4zNTIxNjM4LDcuODk1MjE3NjQgMTAuNjEyMDU3Myw3Ljc1IDExLDcuNzUgQzExLjQxMjgxODksNy43NSAxMS42NDQxNzc2LDguMDEwNzEyNzMgMTEuOTUzODc5OCw4LjYwODIyOTIgTDEyLjA5NTYyMDIsOC44ODUzNjEwNyBDMTIuNDE3Mjk5Miw5LjUwODc2NDI4IDEyLjY0Njc1MTUsOS43NSAxMyw5Ljc1IEwxOCw5Ljc1IEMxOC4xMzgwNzEyLDkuNzUgMTguMjUsOS44NjE5Mjg4MSAxOC4yNSwxMCBDMTguMjUsMTAuMTM4MDcxMiAxOC4xMzgwNzEyLDEwLjI1IDE4LDEwLjI1IEwxMi45OTk5OTk4LDEwLjI1IEwxMywxMC4yNSBaIiBpZD0iUGF0aCIgZmlsbD0iI0NGNjNDRiIgZmlsbC1ydWxlPSJub256ZXJvIj48L3BhdGg+CiAgICA8L2c+Cjwvc3ZnPg==\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDU2LjIgKDgxNjcyKSAtIGh0dHBzOi8vc2tldGNoLmNvbSAtLT4KICAgIDx0aXRsZT5Tb3VuZC9FZmZlY3RzL0ZhZGUtaW48L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZyBpZD0iU291bmQvRWZmZWN0cy9GYWRlLWluIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8cGF0aCBkPSJNMiwxMC4yNSBDMS44NjE5Mjg4MSwxMC4yNSAxLjc1LDEwLjEzODA3MTIgMS43NSwxMCBDMS43NSw5Ljg2MTkyODgxIDEuODYxOTI4ODEsOS43NSAyLDkuNzUgTDcsOS43NSBDNy4zNTMyNDg1MSw5Ljc1IDcuNTgyNzAwNzcsOS41MDg3NjQyOCA3LjkwNDM3OTgxLDguODg1MzYxMDcgTDguMDQ2MTIwMjEsOC42MDgyMjkyIEM4LjM1NTgyMjM1LDguMDEwNzEyNzMgOC41ODcxODExMiw3Ljc1IDksNy43NSBDOS4zODc5NDI3LDcuNzUgOS42NDc4MzYxOCw3Ljg5NTIxNzY0IDEwLjA1Njc1NjgsOC4yNDc2MjA2MSBMMTAuMTI5OTU0Myw4LjMxMDkzMTk5IEMxMC41MTA1MjI4LDguNjQwMTY0OTcgMTAuNzA1ODUyNiw4Ljc1IDExLDguNzUgQzExLjE5OTk2NDQsOC43NSAxMS40MDI1ODUsOC4zOTMyMTE2MiAxMS43NjU1NjI4LDcuNDEzMTcxNDEgQzEyLjIzNTkxODMsNi4xNDMyMTE2MiAxMi40NTkyMjM3LDUuNzUgMTMsNS43NSBDMTMuNDAyMDYxNiw1Ljc1IDEzLjYzMTQ3MTcsNS44ODk3MDQ5IDEzLjkxMzM0MTgsNi4yMTE0MDQ1MSBDMTMuOTY3OTA2Nyw2LjI3NDI2MzQyIDEzLjk5NzM3NTgsNi4zMDgyNDc5OSAxNC4wMjAxODU3LDYuMzMzOTA5MDQgQzE0LjI4NTIwNDYsNi42MzIwNTUzNyAxNC41MTIzNTcyLDYuNzUgMTUsNi43NSBDMTUuMzc2NTQzNiw2Ljc1IDE1LjY5MjYwMTgsNi4xMzE2MjUyOSAxNi4yNjI4MjkyLDQuNDIwOTQzMDYgQzE2Ljk0MjYwMTgsMi4zODE2MjUyOSAxNy4yNjU0MzI1LDEuNzUgMTgsMS43NSBDMTguMTM4MDcxMiwxLjc1IDE4LjI1LDEuODYxOTI4ODEgMTguMjUsMiBMMTguMjUsMTggQzE4LjI1LDE4LjEzODA3MTIgMTguMTM4MDcxMiwxOC4yNSAxOCwxOC4yNSBDMTcuMjY1NDMyNSwxOC4yNSAxNi45NDI2MDE4LDE3LjYxODM3NDcgMTYuMjYyODI5MiwxNS41NzkwNTY5IEMxNS42OTI2MDE4LDEzLjg2ODM3NDcgMTUuMzc2NTQzNiwxMy4yNSAxNSwxMy4yNSBDMTQuNTEyMzU3MiwxMy4yNSAxNC4yODUyMDQ2LDEzLjM2Nzk0NDYgMTQuMDIwMTg1NywxMy42NjYwOTEgQzEzLjk5NzM3NTgsMTMuNjkxNzUyIDEzLjk2NzkwNjcsMTMuNzI1NzM2NiAxMy45MTMzNDE4LDEzLjc4ODU5NTUgQzEzLjYzMTQ3MTcsMTQuMTEwMjk1MSAxMy40MDIwNjE2LDE0LjI1IDEzLDE0LjI1IEMxMi40NTkyMjM3LDE0LjI1IDEyLjIzNTkxODMsMTMuODU2Nzg4NCAxMS43NjU1NjI4LDEyLjU4NjgyODYgQzExLjQwMjU4NSwxMS42MDY3ODg0IDExLjE5OTk2NDQsMTEuMjUgMTEsMTEuMjUgQzEwLjcwNTg1MjYsMTEuMjUgMTAuNTEwNTIyOCwxMS4zNTk4MzUgMTAuMTI5OTU0MywxMS42ODkwNjggTDEwLjA1Njc1NjgsMTEuNzUyMzc5NCBDOS42NDc4MzYxOCwxMi4xMDQ3ODI0IDkuMzg3OTQyNywxMi4yNSA5LDEyLjI1IEM4LjU4NzE4MTEyLDEyLjI1IDguMzU1ODIyMzUsMTEuOTg5Mjg3MyA4LjA0NjEyMDIxLDExLjM5MTc3MDggTDcuOTA0Mzc5ODEsMTEuMTE0NjM4OSBDNy41ODI3MDA3OCwxMC40OTEyMzU3IDcuMzUzMjQ4NTEsMTAuMjUgNy4wMDAwMDAwMSwxMC4yNSBMMiwxMC4yNSBaIiBpZD0iUGF0aCIgZmlsbD0iI0NGNjNDRiIgZmlsbC1ydWxlPSJub256ZXJvIj48L3BhdGg+CiAgICA8L2c+Cjwvc3ZnPg==\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDU1LjIgKDc4MTgxKSAtIGh0dHBzOi8vc2tldGNoYXBwLmNvbSAtLT4KICAgIDx0aXRsZT5Tb3VuZC9FZmZlY3RzL011dGU8L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZyBpZD0iU291bmQvRWZmZWN0cy9NdXRlIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8cGF0aCBmaWxsPSIjQ0Y2M0NGIiBkPSJNMTMuNDU0MTc0OSw1LjA0ODE1MjQzIEwxNS42MjgxMTY4LDIuODc0MjEwNTQgQzE1LjkyMTAxLDIuNTgxMzE3MzIgMTYuMzk1ODgzNywyLjU4MTMxNzMyIDE2LjY4ODc3NywyLjg3NDIxMDU0IEMxNi45ODE2NzAyLDMuMTY3MTAzNzYgMTYuOTgxNjcwMiwzLjY0MTk3NzQ5IDE2LjY4ODc3NywzLjkzNDg3MDcxIEw0LjUzMDMzMDA5LDE2LjA5MzMxNzYgQzQuMjM3NDM2ODcsMTYuMzg2MjEwOCAzLjc2MjU2MzEzLDE2LjM4NjIxMDggMy40Njk2Njk5MSwxNi4wOTMzMTc2IEMzLjE3Njc3NjcsMTUuODAwNDI0NCAzLjE3Njc3NjcsMTUuMzI1NTUwNiAzLjQ2OTY2OTkxLDE1LjAzMjY1NzQgTDYuMzEyMTQ5MzIsMTIuMTkwMTc4IEM2LjEyNDExOTEsMTIuMDYyMTM3OSA2LDExLjg0NjMzMzEgNiwxMS42MDI5ODc1IEw2LDguNjM3NDg3NSBDNiw4LjI0NzExMjUgNi4zMTk0MTUyNyw3LjkyNzYxMjUgNi43MDk2ODY3NSw3LjkyNzYxMjUgTDcuMDI0NjAzMjIsNy45Mjc2MTI1IEM4Ljc1Nzc2ODQ4LDcuOTI3NjEyNSAxMC4yOTQxMTEsNi44MTM4NjI1IDEwLjgzMzk2NzgsNS4xNjY4NjI1IEMxMC45Mjk1Njc0LDQuODc0MzYyNSAxMS4yMDE3NDUyLDQuNjc3NDg3NSAxMS41MDc2NjQxLDQuNjc3NDg3NSBMMTIuODMxNDM3OSw0LjY3NzQ4NzUgQzEzLjEwMDI4NDQsNC42Nzc0ODc1IDEzLjMzNDEwNzUsNC44MjcxNzIwOCAxMy40NTQxNzQ5LDUuMDQ4MTUyNDMgWiBNMTMuNTQsOS4wODM2NDc3MSBMMTMuNTQsMTQuODUzMTEyNSBDMTMuNTQsMTUuMjQ1NzM3NSAxMy4yMjI4MzQxLDE1LjU2Mjk4NzUgMTIuODMxNDM3OSwxNS41NjI5ODc1IEwxMS41MDc2NjQxLDE1LjU2Mjk4NzUgQzExLjIwMTc0NTIsMTUuNTYyOTg3NSAxMC45Mjk1Njc0LDE1LjM2NjExMjUgMTAuODMzOTY3OCwxNS4wNzM2MTI1IEMxMC41NzczNzg1LDE0LjI5MDgwNzcgMTAuMDk1NjgxMywxMy42Mjg0NjUgOS40NzQ3MzUzMSwxMy4xNDg5MTI0IEwxMy41NCw5LjA4MzY0NzcxIFoiIGlkPSJwYXRoLTEiPjwvcGF0aD4KICAgIDwvZz4KPC9zdmc+Cg==\"},function(e,t,n){e.exports=n.p+\"static/assets/32d903cafc72328bd30afce14bfa4c79.svg\"},function(e,t,n){e.exports=n.p+\"static/assets/c14c0c1e852949eff4e6c069772b0015.svg\"},function(e,t,n){var a=n(490);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t){e.exports=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjEuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCAxNCAxNCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMTQgMTQ7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5zdDB7ZmlsbDojRUM1OTU5O3N0cm9rZTojQjg0ODQ4O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9Cjwvc3R5bGU+Cjxwb2x5Z29uIGNsYXNzPSJzdDAiIHBvaW50cz0iNC4zLDAuNSA5LjcsMC41IDEzLjUsNC4zIDEzLjUsOS43IDkuNywxMy41IDQuMywxMy41IDAuNSw5LjcgMC41LDQuMyAiLz4KPC9zdmc+Cg==\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjE2cHgiIGhlaWdodD0iMTZweCIgdmlld0JveD0iMCAwIDE2IDE2IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCA0My4yICgzOTA2OSkgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CiAgICA8dGl0bGU+dHVyYm8tYm9sdC1pY29uPC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGRlZnM+PC9kZWZzPgogICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9InR1cmJvLWJvbHQtaWNvbiIgc3Ryb2tlPSIjRkY4QzFBIiBmaWxsPSIjRkY4QzFBIj4KICAgICAgICAgICAgPHBhdGggZD0iTTYuMTkxOTI2NSw5Ljk3MDQxMjY3IEM2LjM5ODE3NTc4LDEwLjQ4Mjc5OTMgNi44NDUxMjk2LDEwLjU1MTU0MTggNy4xOTQ1NjA0NCwxMC4xMTg1ODI1IEw3LjQ2MTQ0NDgsOS43ODc5MDE2NyBDNy44MDg5MzQ5Niw5LjM1NzM0Njk0IDguNDM0MjI1NjQsOS4yODU0NTUxNiA4Ljg3MzQ2NjYxLDkuNjM5NzQ1MjEgTDExLjY4NjU2LDExLjkwODc3NTQgQzEyLjExODkwOCwxMi4yNTc1MDU1IDEyLjMwMzA4NTgsMTIuMTI2NTkwMyAxMi4wOTYyNzA1LDExLjYxMjIzNDEgTDkuNzQ5MjE1NzUsNS43NzUwMzQ1MyBDOS41NDMxNDQ2Miw1LjI2MjUyOTEyIDkuMDk1ODQ0NzIsNS4xOTQwMTczOCA4Ljc0NTgwMTIsNS42MjczODUxNSBMOC40Nzg0NDg5LDUuOTU4Mzc3OSBDOC4xMzAzNDk0Nyw2LjM4OTMzODgxIDcuNTA0NTY0ODYsNi40NjE1NTk4NyA3LjA2NTMyMzg5LDYuMTA3MjY5ODIgTDQuMjUyMjMwNDgsMy44MzgyMzk2NyBDMy44MTk4ODI1MiwzLjQ4OTUwOTQ5IDMuNjM1ODQ4NTEsMy42MjAzMjg5MSAzLjg0Mjg0MjYxLDQuMTM0NTY1OTEgTDYuMTkxOTI2NSw5Ljk3MDQxMjY3IFoiIGlkPSJ0dXJiby1ib2x0IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg3Ljk2OTM5NSwgNy44NzM1MDgpIHJvdGF0ZSg2OS4wMDAwMDApIHRyYW5zbGF0ZSgtNy45NjkzOTUsIC03Ljg3MzUwOCkgIj48L3BhdGg+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4=\"},function(e,t,n){var a=n(495);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){e.exports=n.p+\"static/assets/61e99f0da6828d62aa9e3761c15ace9f.svg\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iNDgiIHdpZHRoPSI0OCI+PHBhdGggZD0iTTIxLjM1IDQyVjMwLjc1aDN2NC4xNUg0MnYzSDI0LjM1VjQyWk02IDM3Ljl2LTNoMTIuMzV2M1ptOS4zNS04LjN2LTQuMUg2di0zaDkuMzV2LTQuMmgzdjExLjNabTYtNC4xdi0zSDQydjNabTguMy04LjI1VjZoM3Y0LjFINDJ2M2gtOS4zNXY0LjE1Wk02IDEzLjF2LTNoMjAuNjV2M1oiLz48L3N2Zz4=\"},function(e,t,n){var a=n(497);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t){e.exports=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUxLjIgKDU3NTE5KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5HZW5lcmFsL0NoZWNrPC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGRlZnM+CiAgICAgICAgPHBhdGggZD0iTTcuODYxNDQwNTksMTUuNDAyODc3NiBDNy40MzUyNjg1OSwxNS40MDI4Nzc2IDcuMDA5MDk2NTgsMTUuMjM5NzMzNiA2LjY4NDQ3MzM4LDE0LjkxNTExMDQgTDMuNDg4MTgzMzYsMTEuNzE4ODIwNCBDMi44MzcyNzIyMSwxMS4wNjc5MDkzIDIuODM3MjcyMjEsMTAuMDE1Nzk3MSAzLjQ4ODE4MzM2LDkuMzY0ODg2IEM0LjEzOTA5NDUsOC43MTM5NzQ4NSA1LjE5MTIwNjY0LDguNzEzOTc0ODUgNS44NDIxMTc3OCw5LjM2NDg4NiBMNy44NjE0NDA1OSwxMS4zODQyMDg4IEwxNC4xNTkxMzA4LDUuMDg4MTgzMzYgQzE0LjgwODM3NzIsNC40MzcyNzIyMSAxNS44NjIxNTQsNC40MzcyNzIyMSAxNi41MTMwNjUyLDUuMDg4MTgzMzYgQzE3LjE2MjMxMTYsNS43Mzc0Mjk3NyAxNy4xNjIzMTE2LDYuNzkxMjA2NjQgMTYuNTEzMDY1Miw3LjQ0MjExNzc4IEw5LjAzODQwNzgsMTQuOTE1MTEwNCBDOC43MTM3ODQ2LDE1LjIzOTczMzYgOC4yODc2MTI1OSwxNS40MDI4Nzc2IDcuODYxNDQwNTksMTUuNDAyODc3NiIgaWQ9InBhdGgtMSI+PC9wYXRoPgogICAgPC9kZWZzPgogICAgPGcgaWQ9IkdlbmVyYWwvQ2hlY2siIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxtYXNrIGlkPSJtYXNrLTIiIGZpbGw9IndoaXRlIj4KICAgICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjcGF0aC0xIj48L3VzZT4KICAgICAgICA8L21hc2s+CiAgICAgICAgPHVzZSBpZD0iQ2hlY2siIGZpbGw9IiM1NzVFNzUiIHhsaW5rOmhyZWY9IiNwYXRoLTEiPjwvdXNlPgogICAgICAgIDxnIGlkPSJDb2xvci9XaGl0ZSIgbWFzaz0idXJsKCNtYXNrLTIpIiBmaWxsPSIjRkZGRkZGIj4KICAgICAgICAgICAgPHJlY3QgaWQ9IkNvbG9yIiB4PSIwIiB5PSIwIiB3aWR0aD0iMjAiIGhlaWdodD0iMjAiPjwvcmVjdD4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg==\"},function(e,t,n){var a=n(505);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){e.exports=n.p+\"static/assets/a72a652fdc84dc6983d3cc9596c36a26.svg\"},function(e,t,n){e.exports=n.p+\"static/assets/566d73a090e3d42d5bdfee3d92c79d25.svg\"},function(e,t,n){e.exports=n.p+\"static/assets/674db5c2e49df884273ac0f7d221865c.svg\"},function(e,t,n){e.exports=n.p+\"static/assets/7efe82fffae735cd083388badd51b3fa.svg\"},function(e,t,n){e.exports=n.p+\"static/assets/1900166faa9222d0d10c568a12c848a5.png\"},function(e,t,n){e.exports=n.p+\"static/assets/7c410b6c3cd2a9ee41505c5c6951bbf6.png\"},function(e,t,n){var a=n(516);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(517);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t){e.exports=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDQ4LjIgKDQ3MzI3KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5MYW5ndWFnZTwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxkZWZzPjwvZGVmcz4KICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+CiAgICAgICAgPGcgaWQ9Ikxhbmd1YWdlIiBzdHJva2U9IiNGRkZGRkYiIHN0cm9rZS13aWR0aD0iMS4yNSI+CiAgICAgICAgICAgIDxnIGlkPSJsYW5ndWFnZSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMi4wMDAwMDAsIDIuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTUuNjM1Miw4LjExMjk0MTE4IEMxNS42MzUyLDEyLjI2ODIzNTMgMTIuMjY2NzI5NCwxNS42MzU3NjQ3IDguMTEyMzc2NDcsMTUuNjM1NzY0NyBDMy45NTcwODIzNSwxNS42MzU3NjQ3IDAuNTg4NjExNzY1LDEyLjI2ODIzNTMgMC41ODg2MTE3NjUsOC4xMTI5NDExOCBDMC41ODg2MTE3NjUsMy45NTc2NDcwNiAzLjk1NzA4MjM1LDAuNTg5MTc2NDcxIDguMTEyMzc2NDcsMC41ODkxNzY0NzEgQzEyLjI2NjcyOTQsMC41ODkxNzY0NzEgMTUuNjM1MiwzLjk1NzY0NzA2IDE1LjYzNTIsOC4xMTI5NDExOCBaIiBpZD0iU3Ryb2tlLTEiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMS45ODA4LDguMTE2NjExNzYgQzExLjk4MDgsOS43NDk1NTI5NCAxMS43MTUzODgyLDExLjI2MDE0MTIgMTEuMjU0MjExOCwxMi40OTIxNDEyIEMxMC41NTU4NTg4LDE0LjM5MzMxNzYgOS40MDc2MjM1MywxNS42MzQ3Mjk0IDguMTEwNjgyMzUsMTUuNjM0NzI5NCBDNi44MTM3NDExOCwxNS42MzQ3Mjk0IDUuNjY5MjcwNTksMTQuMzkzMzE3NiA0Ljk2NzE1Mjk0LDEyLjQ5MjE0MTIgQzQuNTEwNjgyMzUsMTEuMjYwMTQxMiA0LjI0NDMyOTQxLDkuNzQ5NTUyOTQgNC4yNDQzMjk0MSw4LjExNjYxMTc2IEM0LjI0NDMyOTQxLDYuNDgyNzI5NDEgNC41MTA2ODIzNSw0Ljk3MzA4MjM1IDQuOTY3MTUyOTQsMy43NDEwODIzNSBDNS42NjkyNzA1OSwxLjgyOTU1Mjk0IDYuODEzNzQxMTgsMC41ODgxNDExNzYgOC4xMTA2ODIzNSwwLjU4ODE0MTE3NiBDOS40MDc2MjM1MywwLjU4ODE0MTE3NiAxMC41NTU4NTg4LDEuODI5NTUyOTQgMTEuMjU0MjExOCwzLjc0MTA4MjM1IEMxMS43MTUzODgyLDQuOTczMDgyMzUgMTEuOTgwOCw2LjQ4MjcyOTQxIDExLjk4MDgsOC4xMTY2MTE3NiBaIiBpZD0iU3Ryb2tlLTMiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0wLjk1NTAxMTc2NSwxMC4yODExMjk0IEwxNS4yNjg0MjM1LDEwLjI4MTEyOTQiIGlkPSJTdHJva2UtNSI+PC9wYXRoPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTAuOTU1MDExNzY1LDUuOTQ2NjM1MjkgTDE1LjI2ODQyMzUsNS45NDY2MzUyOSIgaWQ9IlN0cm9rZS03Ij48L3BhdGg+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNOC4xMTIxODgyNCwwLjU5MDAyMzUyOSBMOC4xMTIxODgyNCwxNS42Mzc1NTI5IiBpZD0iU3Ryb2tlLTkiPjwvcGF0aD4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+\"},function(e,t,n){e.exports=n.p+\"static/assets/82aa0eba517b9756a9db4e3a9144723e.svg\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0id2hpdGUiIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiPjxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz48cGF0aCBkPSJNMjAgMTUuMzFMMjMuMzEgMTIgMjAgOC42OVY0aC00LjY5TDEyIC42OSA4LjY5IDRINHY0LjY5TC42OSAxMiA0IDE1LjMxVjIwaDQuNjlMMTIgMjMuMzEgMTUuMzEgMjBIMjB2LTQuNjl6TTEyIDE4Yy0zLjMxIDAtNi0yLjY5LTYtNnMyLjY5LTYgNi02IDYgMi42OSA2IDYtMi42OSA2LTYgNnoiLz48L3N2Zz4=\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PCEtLSBodHRwczovL21hdGVyaWFsLmlvL3Jlc291cmNlcy9pY29ucy8/c2VhcmNoPWJyaWdodG5lc3NfMyZpY29uPWJyaWdodG5lc3NfMyZzdHlsZT1iYXNlbGluZSAtLT4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0id2hpdGUiIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiPjxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz48cGF0aCBkPSJNOSAyYy0xLjA1IDAtMi4wNS4xNi0zIC40NiA0LjA2IDEuMjcgNyA1LjA2IDcgOS41NCAwIDQuNDgtMi45NCA4LjI3LTcgOS41NC45NS4zIDEuOTUuNDYgMyAuNDYgNS41MiAwIDEwLTQuNDggMTAtMTBTMTQuNTIgMiA5IDJ6Ii8+PC9zdmc+\"},function(e,t,n){e.exports=n.p+\"static/assets/64e66a9dcf4b42a699f49e5973a4a62e.svg\"},function(e,t,n){e.exports=n.p+\"static/assets/e4dfc45f34b4606356c4c70ba14a96f0.svg\"},function(e,t,n){e.exports=n.p+\"static/assets/3c06b74c80d1e6b1d210ca86c87cd326.svg\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PCEtLSBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL21hdGVyaWFsLWRlc2lnbi1pY29ucyAtLT4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0id2hpdGUiIHdpZHRoPSIxOHB4IiBoZWlnaHQ9IjE4cHgiPjxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz48cGF0aCBkPSJNNyAxNGMtMS42NiAwLTMgMS4zNC0zIDMgMCAxLjMxLTEuMTYgMi0yIDIgLjkyIDEuMjIgMi40OSAyIDQgMiAyLjIxIDAgNC0xLjc5IDQtNCAwLTEuNjYtMS4zNC0zLTMtM3ptMTMuNzEtOS4zN2wtMS4zNC0xLjM0Yy0uMzktLjM5LTEuMDItLjM5LTEuNDEgMEw5IDEyLjI1IDExLjc1IDE1bDguOTYtOC45NmMuMzktLjM5LjM5LTEuMDIgMC0xLjQxeiIvPjwvc3ZnPg==\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzMiIHZpZXdCb3g9IjAgMCAzMiAzMyIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0yNy43NTYyIDMuNzI4NTJIMTkuMzM1NEMxOC41MzM0IDMuNzI4NTIgMTguMTY0OCA0LjY4MzE5IDE4LjcyIDUuMjM4NDFMMjAuNzcxMyA3LjI4OTY0TDE3LjA2OTggMTMuNDg5NkMxNi44MzY5IDEzLjg3NjcgMTYuODIxNSAxNC4zODU3IDE3LjA4NTIgMTQuODAwNUMxNy40NCAxNS40MDIgMTguMjI1IDE1LjYwNDEgMTguODI4IDE1LjI0NzhMMjUuMDI4IDExLjU0NjNMMjcuMTI1NSAxMy42NDM4QzI3LjY4MDcgMTQuMTk5IDI4LjYzNTMgMTMuODMwNCAyOC42MzUzIDEzLjAyODVWNC42MDc2MkMyOC42MzY5IDQuMTEyNTUgMjguMjUxMyAzLjcyNjk4IDI3Ljc1NjIgMy43Mjg1MlpNMTcuNiA2LjQ4NTg0QzE3LjYgNS42MDIxOSAxNi44ODM3IDQuODg1ODQgMTYgNC44ODU4NEg5LjYwMDA1TDkuMzE4MDEgNC44OTM5OUM2Ljc5ODMyIDUuMDM5OTggNC44MDAwNSA3LjEyOTU1IDQuODAwMDUgOS42ODU4NFYyMi40ODU4TDQuODA4MiAyMi43Njc5QzQuOTU0MTkgMjUuMjg3NiA3LjA0Mzc2IDI3LjI4NTggOS42MDAwNSAyNy4yODU4SDIyLjQwMDFMMjIuNjgyMSAyNy4yNzc3QzI1LjIwMTggMjcuMTMxNyAyNy4yMDAxIDI1LjA0MjEgMjcuMjAwMSAyMi40ODU4VjE2LjA4NThMMjcuMTg5MyAxNS44OTkyQzI3LjA5NjkgMTUuMTAzNSAyNi40MjA2IDE0LjQ4NTggMjUuNiAxNC40ODU4QzI0LjcxNjQgMTQuNDg1OCAyNCAxNS4yMDIyIDI0IDE2LjA4NThWMjIuNDg1OEwyMy45ODkzIDIyLjY3MjRDMjMuODk2OSAyMy40NjgyIDIzLjIyMDYgMjQuMDg1OCAyMi40MDAxIDI0LjA4NThIOS42MDAwNUw5LjQxMzQ2IDI0LjA3NTFDOC42MTc3MSAyMy45ODI3IDguMDAwMDUgMjMuMzA2NCA4LjAwMDA1IDIyLjQ4NThWOS42ODU4NEw4LjAxMDgxIDkuNDk5MjVDOC4xMDMyNCA4LjcwMzUxIDguNzc5NTEgOC4wODU4NCA5LjYwMDA1IDguMDg1ODRIMTZMMTYuMTg2NiA4LjA3NTA4QzE2Ljk4MjQgNy45ODI2NSAxNy42IDcuMzA2MzggMTcuNiA2LjQ4NTg0WiIgZmlsbD0iI0ZGRkZGRiIvPgo8L3N2Zz4K\"},function(e,t,n){e.exports=n.p+\"static/assets/e04d8c93cf14ec09031b47d619c04f74.svg\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgMCAyMCAyMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik04LjI3MjA2IDIuNjgzNzdDOC40MDgxOCAyLjI3NTQzIDguNzkwMzIgMiA5LjIyMDc1IDJIMTAuNzc5MkMxMS4yMDk3IDIgMTEuNTkxOCAyLjI3NTQzIDExLjcyNzkgMi42ODM3N0wxMi4zMjE5IDQuNDY1OEMxMi43OTE0IDQuNjYzIDEzLjIzMDQgNC45MTgxOCAxMy42MzAyIDUuMjIyMzhMMTUuNDcyMSA0Ljg0NTQ3QzE1Ljg5MzggNC43NTkxNyAxNi4zMjM0IDQuOTUyNCAxNi41Mzg2IDUuMzI1MTZMMTcuMzE3OCA2LjY3NDg1QzE3LjUzMyA3LjA0NzYxIDE3LjQ4NTYgNy41MTYyNyAxNy4yIDcuODM4MzJMMTUuOTUyOSA5LjI0NDY4QzE1Ljk4NCA5LjQ5MjA4IDE2IDkuNzQ0MTcgMTYgMTBDMTYgMTAuMjU1OCAxNS45ODQgMTAuNTA3OSAxNS45NTI5IDEwLjc1NTNMMTcuMiAxMi4xNjE3QzE3LjQ4NTYgMTIuNDgzNyAxNy41MzMgMTIuOTUyNCAxNy4zMTc4IDEzLjMyNTJMMTYuNTM4NiAxNC42NzQ4QzE2LjMyMzQgMTUuMDQ3NiAxNS44OTM4IDE1LjI0MDggMTUuNDcyMSAxNS4xNTQ1TDEzLjYzMDIgMTQuNzc3NkMxMy4yMzA0IDE1LjA4MTggMTIuNzkxNCAxNS4zMzcgMTIuMzIxOSAxNS41MzQyTDExLjcyNzkgMTcuMzE2MkMxMS41OTE4IDE3LjcyNDYgMTEuMjA5NyAxOCAxMC43NzkyIDE4SDkuMjIwNzVDOC43OTAzMiAxOCA4LjQwODE4IDE3LjcyNDYgOC4yNzIwNiAxNy4zMTYyTDcuNjc4MDUgMTUuNTM0MkM3LjIwODYyIDE1LjMzNyA2Ljc2OTU1IDE1LjA4MTggNi4zNjk4MiAxNC43Nzc2TDQuNTI3OTIgMTUuMTU0NUM0LjEwNjIzIDE1LjI0MDggMy42NzY2MyAxNS4wNDc2IDMuNDYxNDEgMTQuNjc0OEwyLjY4MjE3IDEzLjMyNTJDMi40NjY5NiAxMi45NTI0IDIuNTE0NDIgMTIuNDgzNyAyLjggMTIuMTYxN0w0LjA0NzA4IDEwLjc1NTNDNC4wMTYgMTAuNTA3OSAzLjk5OTk5IDEwLjI1NTggMy45OTk5OSAxMEMzLjk5OTk5IDkuNzQ0MTYgNC4wMTYgOS40OTIwNyA0LjA0NzA3IDkuMjQ0NjZMMi44IDcuODM4MzJDMi41MTQ0MiA3LjUxNjI3IDIuNDY2OTYgNy4wNDc2MSAyLjY4MjE3IDYuNjc0ODVMMy40NjE0MSA1LjMyNTE2QzMuNjc2NjMgNC45NTI0IDQuMTA2MjMgNC43NTkxNyA0LjUyNzkyIDQuODQ1NDdMNi4zNjk4IDUuMjIyMzhDNi43Njk1NCA0LjkxODE4IDcuMjA4NjEgNC42NjMgNy42NzgwNSA0LjQ2NThMOC4yNzIwNiAyLjY4Mzc3Wk05Ljk5OTk5IDhDOC44OTU0MiA4IDcuOTk5OTkgOC44OTU0MyA3Ljk5OTk5IDEwQzcuOTk5OTkgMTEuMTA0NiA4Ljg5NTQyIDEyIDkuOTk5OTkgMTJDMTEuMTA0NiAxMiAxMiAxMS4xMDQ2IDEyIDEwQzEyIDguODk1NDMgMTEuMTA0NiA4IDkuOTk5OTkgOFoiIGZpbGw9IndoaXRlIi8+Cjwvc3ZnPgo=\"},function(e,t,n){e.exports=n.p+\"static/assets/7c67e2601425784a243cd7e0f15c50a3.svg\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgMCAyMCAyMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00Ljk4MTE2IDFIMTUuMDE5NkMxNi40MDQyIDEgMTcuNjE1OCAyLjIxMTU0IDE3LjYxNTggMy41OTYxNVYxMC44NjU0SDEzLjYzNUMxMS4zODUgMTAuODY1NCA5LjY1NDI0IDEyLjc2OTIgOS42NTQyNCAxNC44NDYyVjE4LjgyNjlINC45ODExNkMzLjU5NjU1IDE4LjgyNjkgMi4zODUwMSAxNy42MTU0IDIuMzg1MDEgMTYuMjMwOFYzLjU5NjE1QzIuMzg1MDEgMi4yMTE1NCAzLjU5NjU1IDEgNC45ODExNiAxWk02LjAxOTYzIDkuODI2OTJIOC43ODg4NkM5LjQ4MTE2IDkuODI2OTIgMTAuMDAwNCA5LjQ4MDc3IDEwLjAwMDQgOC43ODg0NkMxMC4wMDA0IDguMDk2MTUgOS40ODExNiA3Ljc1IDguOTYxOTMgNy43NUg2LjAxOTYzQzUuNTAwMzkgNy43NSA0Ljk4MTE2IDguMjY5MjMgNC45ODExNiA4Ljc4ODQ2QzQuOTgxMTYgOS4zMDc2OSA1LjUwMDM5IDkuODI2OTIgNi4wMTk2MyA5LjgyNjkyWk0xNC4xNTQyIDUuODQ2MTVINi4wMTk2M0M1LjMyNzMyIDUuODQ2MTUgNC45ODExNiA1LjMyNjkyIDQuOTgxMTYgNC44MDc2OUM0Ljk4MTE2IDQuMjg4NDYgNS41MDAzOSAzLjc2OTIzIDYuMDE5NjMgMy43NjkyM0gxNC4xNTQyQzE0LjY3MzUgMy43NjkyMyAxNS4xOTI3IDQuMjg4NDYgMTUuMTkyNyA0LjgwNzY5QzE1LjAxOTYgNS4zMjY5MiAxNC42NzM1IDUuODQ2MTUgMTQuMTU0MiA1Ljg0NjE1Wk0xNy40NDI3IDEyLjI1SDEzLjQ2MTlDMTIuMDc3MyAxMi4yNSAxMC44NjU4IDEzLjQ2MTUgMTAuODY1OCAxNS4wMTkyVjE5TDE3LjQ0MjcgMTIuMjVaIiBmaWxsPSJ3aGl0ZSIvPgo8L3N2Zz4K\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgMCAyMSAyMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik05LjY0NDY5IDE0LjUwN0M5LjU1ODYxIDE0LjU5MzEgOS40NjE0NSAxNC42NDg0IDkuMzQ1MjUgMTQuNzAwOEw3LjM3ODczIDE1LjUyNjZDNy4zMDcyOCAxNS4yODMgNy4xMzAzNCAxNC45NzM0IDYuODAzMjkgMTQuNjQ2M0M2LjQ4NzIxIDE0LjMzMDIgNi4xODg1MyAxNC4xNjQzIDUuOTUzNzggMTQuMDgxOUw2Ljc2OTc1IDEyLjEyNTNDNi44MTIxNyAxMS45OTkxIDYuODg4MjggMTEuOTAzMSA2Ljk3MzQ3IDExLjgxNzlDNi45OTMzIDExLjgxOCA3LjAxMjEzIDExLjc5OTIgNy4wMjIgMTEuNzg5M0w3LjA0OTc5IDExLjc2MTVDNy4xODI1MSAxMS42Mjg4IDcuMzY4OTYgMTEuNTQ4IDcuNTg3NDMgMTEuNTE5QzguMTQyNzggMTEuNDUwMiA4Ljc4NjU2IDExLjcxMzggOS4yNzIxNSAxMi4xOTk0QzkuNzU3NzMgMTIuNjg1IDEwLjAyMTMgMTMuMzI4OCA5Ljk0MTU4IDEzLjg3MzFDOS45MDk1NSAxNC4wNTI3IDkuODUwNDEgMTQuMjM3NSA5Ljc1NzU3IDE0LjM3NDJDOS43Mjk4OCAxNC40MjE5IDkuNjkyMjIgMTQuNDU5NSA5LjY1MzY2IDE0LjQ5ODFMOS42NDQ2OSAxNC41MDdaTTEyLjg2ODYgNS45NDI3NEMxMy4xNzUyIDUuNjM2MDYgMTMuNjQ1OCA1LjU3MDM2IDE0LjEyNzQgNS43MTQ4NkMxNC40MDY2IDUuNzk4NTkgMTQuNTIzMiA2LjE0NDcgMTQuMzMyMiA2LjMzNTdMOS43NTE3OSAxMC45MTYxQzkuNjQyMzkgMTEuMDI1NSA5LjQ2NDg4IDExLjA0MzUgOS4zMjEyMiAxMC45NTE4QzkuMTcyNzcgMTAuODU5IDkuMDE5MzQgMTAuNzc5MSA4Ljg2NDczIDEwLjcxMjNDOC42MTI1MiAxMC42MDM2IDguNTI0ODkgMTAuMjg2NCA4LjcwMTU0IDEwLjEwOThMMTIuODY4NiA1Ljk0Mjc0Wk0xNS41Mjg4IDguNjAyOTlMMTEuMzYyNyAxMi43NjkxQzExLjE4OTYgMTIuOTQyMiAxMC44NzEyIDEyLjg2NzcgMTAuNzY1NyAxMi42MjIzQzEwLjY5NzYgMTIuNDU5MSAxMC42MTI3IDEyLjMwMDcgMTAuNTE0OCAxMi4xNDcyQzEwLjQxODEgMTEuOTk2NyAxMC40NDIyIDExLjgwOTEgMTAuNTU2IDExLjY5NTJMMTUuMTI1NyA3LjEyNTZDMTUuMzE0OSA2LjkzNjM5IDE1LjY2MDkgNy4wNTEwNCAxNS43NDY1IDcuMzMwMzZDMTUuODk2IDcuODE3MDEgMTUuODM3MyA4LjI5NDUyIDE1LjUyODggOC42MDI5OVpNMTcuMzQ5NyA0LjEyMTgyQzE2LjE3ODEgMi45NTAyMyAxNC40ODgxIDIuNzM5NzkgMTMuNTc2MiAzLjY1MTc0TDYuMjIwNDQgMTEuMDA3NUM2LjA0MDIgMTEuMTg3NyA1Ljg4MDkgMTEuMzg4OSA1Ljc4NDQxIDExLjYzNDlMNC4yMzMxMiAxNS4zNTk5QzQuMDM4MDQgMTUuODMwMiA0LjE4OTA2IDE2LjQxNyA0LjYyMTggMTYuODQ5N0M1LjA1NDU0IDE3LjI4MjUgNS42NDEzNyAxNy40MzM1IDYuMTExNjUgMTcuMjM4NEw5LjgzNjYxIDE1LjY4NzFDMTAuMDgxNyAxNS41ODk2IDEwLjI4MjggMTUuNDMwMyAxMC40NjMxIDE1LjI1MDFMMTcuODE4OCA3Ljg5NDM4QzE4LjczMDggNi45ODI0MyAxOC41MjEzIDUuMjkzNDEgMTcuMzQ5NyA0LjEyMTgyWiIgZmlsbD0id2hpdGUiLz4KPC9zdmc+Cg==\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PCEtLSBodHRwczovL2ZvbnRzLmdvb2dsZS5jb20vaWNvbnM/c2VsZWN0ZWQ9TWF0ZXJpYWwrU3ltYm9scytPdXRsaW5lZDpleHRlbnNpb246RklMTEAxO3dnaHRANDAwO0dSQURAMDtvcHN6QDI0Jmljb24ucXVlcnk9ZXh0ZW5zaW9uIC0tPgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgaGVpZ2h0PSIyMCIgdmlld0JveD0iMCAtOTYwIDk2MCA5NjAiIHdpZHRoPSIyMCI+PHBhdGggZmlsbD0iI2ZmZmZmZiIgZD0iTTM1Mi0xMjBIMjAwcS0zMyAwLTU2LjUtMjMuNVQxMjAtMjAwdi0xNTJxNDggMCA4NC0zMC41dDM2LTc3LjVxMC00Ny0zNi03Ny41VDEyMC01Njh2LTE1MnEwLTMzIDIzLjUtNTYuNVQyMDAtODAwaDE2MHEwLTQyIDI5LTcxdDcxLTI5cTQyIDAgNzEgMjl0MjkgNzFoMTYwcTMzIDAgNTYuNSAyMy41VDgwMC03MjB2MTYwcTQyIDAgNzEgMjl0MjkgNzFxMCA0Mi0yOSA3MXQtNzEgMjl2MTYwcTAgMzMtMjMuNSA1Ni41VDcyMC0xMjBINTY4cTAtNTAtMzEuNS04NVQ0NjAtMjQwcS00NSAwLTc2LjUgMzVUMzUyLTEyMFoiLz48L3N2Zz4=\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PCEtLSBGcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvbWF0ZXJpYWwtZGVzaWduLWljb25zIC0tPg0KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0id2hpdGUiIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiPjxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz48cGF0aCBkPSJNMSAyMWgyMkwxMiAyIDEgMjF6bTEyLTNoLTJ2LTJoMnYyem0wLTRoLTJ2LTRoMnY0eiIvPjwvc3ZnPg==\"},function(e,t,n){e.exports=n.p+\"static/assets/e04d8c93cf14ec09031b47d619c04f74.svg\"},function(e,t,n){e.exports=n.p+\"static/assets/945297ca77c041c98377f204e1af772e.svg\"},function(e,t,n){e.exports=n.p+\"static/assets/82072226e8cf716289165650c31eeda2.svg\"},function(e,t,n){e.exports=n.p+\"static/assets/98bfc66ce081a3750f3b59ab67d0ac75.svg\"},function(e,t,n){e.exports=n.p+\"static/assets/306ffbcffad0d931fb1d158dd812f3fe.svg\"},function(e,t,n){var a=n(524);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){e.exports=n.p+\"static/assets/3a296d85c85a5f222663dad932737c86.svg\"},function(e,t,n){e.exports=n.p+\"static/assets/65715c37a18debd4b44a80c478a3abd7.svg\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUzLjIgKDcyNjQzKSAtIGh0dHBzOi8vc2tldGNoYXBwLmNvbSAtLT4KICAgIDx0aXRsZT5UdXRvcmlhbHMvRXhwYW5kPC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGRlZnM+CiAgICAgICAgPHBhdGggZD0iTTQuNSwyIEwxNS41LDIgQzE2Ljg4MDcxMTksMiAxOCwzLjExOTI4ODEzIDE4LDQuNSBMMTgsNS41IEMxOCw1Ljc3NjE0MjM3IDE3Ljc3NjE0MjQsNiAxNy41LDYgTDIuNSw2IEMyLjIyMzg1NzYzLDYgMiw1Ljc3NjE0MjM3IDIsNS41IEwyLDQuNSBDMiwzLjExOTI4ODEzIDMuMTE5Mjg4MTMsMiA0LjUsMiBaIE0yLjUsNyBMMTcuNSw3IEMxNy43NzYxNDI0LDcgMTgsNy4yMjM4NTc2MyAxOCw3LjUgTDE4LDE1LjUgQzE4LDE2Ljg4MDcxMTkgMTYuODgwNzExOSwxOCAxNS41LDE4IEw0LjUsMTggQzMuMTE5Mjg4MTMsMTggMiwxNi44ODA3MTE5IDIsMTUuNSBMMiw3LjUgQzIsNy4yMjM4NTc2MyAyLjIyMzg1NzYzLDcgMi41LDcgWiBNOS42NTUwOTQ2NiwxNS4xNjM2MTQ2IEM5Ljc0NTQxNiwxNS4yNTMzNTY5IDkuODY3MDAyNDEsMTUuMzAzMTQ5NSA5Ljk5NzI3MzU3LDE1LjMwMzE0OTUgQzEwLjEyNzU0NDcsMTUuMzAzMTQ5NSAxMC4yNDkxMzExLDE1LjI1MzM1NjkgMTAuMzM5NDUyNSwxNS4xNjM2MTQ2IEwxMi4xNTc0NTg4LDEzLjM0NTYwODIgQzEyLjMwMDQ2NzYsMTMuMjAyNTk5NCAxMi4zNDE1NzU0LDEyLjk5OTM3NjQgMTIuMjY1NzI4NiwxMi44MTU4Mzg4IEMxMi4xODk4ODE5LDEyLjYzMzQ1OTIgMTIuMDEwOTc2MiwxMi41MTUzNDY3IDExLjgxMDA2OTEsMTIuNTE1MzQ2NyBMMTEuMTUwNjA3NSwxMi41MTUzNDY3IEwxMC43ODk5MDEyLDkuOTg4MDg2MjUgQzEwLjc0NjQ3NzUsOS42NDQ3NDkzOCAxMC40NzAzMDI2LDkuMzY1Njc5NjEgMTAuMTEyNDkxMiw5LjMwOTUxODI3IEMxMC4wNzgzMzEyLDkuMzA1NDY1MzkgMTAuMDQzNTkyMiw5LjMwMzE0OTQ2IDEwLjAwOTQzMjIsOS4zMDMxNDk0NiBDOS42MTI4Mjg5MSw5LjMwMzE0OTQ2IDkuMjc1ODYwODUsOS41OTc4NTE3NiA5LjIyNTQ4OTMzLDkuOTg1MTkxMzQgTDguODc0MDQ2NywxMi41MTUzNDY3IEw4LjE4NDQ3ODA0LDEyLjUxNTM0NjcgQzcuOTg1ODg2OSwxMi41MTUzNDY3IDcuODE0NTA3OTYsMTIuNjI2NTExNCA3LjczNjkyNDI1LDEyLjgwNjU3NTEgQzcuNjU4NzYxNTUsMTIuOTg2NjM4OCA3LjY5NjM5NTQ0LDEzLjE5NjIzMDYgNy44MzcwODgyOSwxMy4zNDU2MDgyIEw5LjY1NTA5NDY2LDE1LjE2MzYxNDYgWiIgaWQ9InBhdGgtMSI+PC9wYXRoPgogICAgPC9kZWZzPgogICAgPGcgaWQ9IlR1dG9yaWFscy9FeHBhbmQiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxtYXNrIGlkPSJtYXNrLTIiIGZpbGw9IndoaXRlIj4KICAgICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjcGF0aC0xIj48L3VzZT4KICAgICAgICA8L21hc2s+CiAgICAgICAgPGcgaWQ9IkNvbWJpbmVkLVNoYXBlIiBmaWxsLXJ1bGU9Im5vbnplcm8iPjwvZz4KICAgICAgICA8ZyBpZD0iV2hpdGUiIG1hc2s9InVybCgjbWFzay0yKSIgZmlsbD0iI0ZGRkZGRiI+CiAgICAgICAgICAgIDxyZWN0IGlkPSJDb2xvciIgeD0iMCIgeT0iMCIgd2lkdGg9IjIwIiBoZWlnaHQ9IjIwIj48L3JlY3Q+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4=\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUzLjIgKDcyNjQzKSAtIGh0dHBzOi8vc2tldGNoYXBwLmNvbSAtLT4KICAgIDx0aXRsZT5FeHRlbnNpb25zL0Nvbm5lY3Rpb24vQ2xvc2U8L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZGVmcz4KICAgICAgICA8cGF0aCBkPSJNMTUuNDY0OTM1LDE1LjQ2NzI5NyBDMTQuNzY0NDA1OSwxNi4xNzc3NzA1IDEzLjYxODU4NzcsMTYuMTc3NzcwNSAxMi45MDgxMTQyLDE1LjQ2NzI5NyBMOS45OTg4MTg5OSwxMi41NTgwMDE4IEw3LjA4ODQxODg1LDE1LjQ2NzI5NyBDNi4zODIzNjUwNiwxNi4xNzMzNTA4IDUuMjM3NjUxODcsMTYuMTczMzUwOCA0LjUzMTU5ODA3LDE1LjQ2NzI5NyBDNC4xNzkxMjM2NCwxNS4xMTQ4MjI2IDQuMDAwMTI0MDksMTQuNjQ4NTM5OCA0LjAwMDEyNDA5LDE0LjE4ODg4NjYgQzQuMDAwMTI0MDksMTMuNzI4MTI4NSA0LjE3OTEyMzY0LDEzLjI2Mjk1MDYgNC41MzE1OTgwNywxMi45MTA0NzYyIEw3LjQ0MDg5MzI4LDEwLjAwMTE4MSBMNC41MjcxNzgzMyw3LjA4NjM2MTEyIEM0LjE3MzU5ODk3LDYuNzMyNzgxNzYgMy45OTQ1OTk0MSw2LjI2NzYwMzkxIDQuMDAwMTI0MDksNS44MDI0MjYwNiBDNC4wMDAxMjQwOSw1LjM0MTY2Nzk1IDQuMTczNTk4OTcsNC44ODIwMTQ3NyA0LjUyNzE3ODMzLDQuNTI5NTQwMzQgQzUuMjMyMTI3MTksMy44MjM0ODY1NSA2LjM3Njg0MDM4LDMuODIzNDg2NTUgNy4wODM5OTkxMSw0LjUyOTU0MDM0IEw5Ljk5ODgxODk5LDcuNDQzMjU1MjkgTDEyLjkxMjUzMzksNC41Mjk1NDAzNCBDMTMuNjE4NTg3NywzLjgyMzQ4NjU1IDE0Ljc2NDQwNTksMy44MjM0ODY1NSAxNS40NzA0NTk3LDQuNTI5NTQwMzQgQzE2LjE3NjUxMzQsNS4yMzQ0ODkyIDE2LjE3NjUxMzQsNi4zODAzMDczMyAxNS40NzA0NTk3LDcuMDg2MzYxMTIgTDEyLjU1NDUzNDgsMTAuMDAxMTgxIEwxNS40NzA0NTk3LDEyLjkxNDg5NiBDMTYuMTc2NTEzNCwxMy42MjA5NDk3IDE2LjE3NjUxMzQsMTQuNzU1NzE4NSAxNS40NjQ5MzUsMTUuNDY3Mjk3IiBpZD0icGF0aC0xIj48L3BhdGg+CiAgICA8L2RlZnM+CiAgICA8ZyBpZD0iRXh0ZW5zaW9ucy9Db25uZWN0aW9uL0Nsb3NlIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8bWFzayBpZD0ibWFzay0yIiBmaWxsPSJ3aGl0ZSI+CiAgICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI3BhdGgtMSI+PC91c2U+CiAgICAgICAgPC9tYXNrPgogICAgICAgIDx1c2UgaWQ9ImNsb3NlIiBmaWxsPSIjRkZGRkZGIiB4bGluazpocmVmPSIjcGF0aC0xIj48L3VzZT4KICAgICAgICA8ZyBpZD0iV2hpdGUiIG1hc2s9InVybCgjbWFzay0yKSIgZmlsbD0iI0ZGRkZGRiI+CiAgICAgICAgICAgIDxyZWN0IGlkPSJDb2xvciIgeD0iMCIgeT0iMCIgd2lkdGg9IjIwIiBoZWlnaHQ9IjIwIj48L3JlY3Q+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4=\"},function(e,t,n){var a=n(529);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){e.exports=n.p+\"static/assets/223d68e7b8769bac1f33291514ce5bac.svg\"},function(e,t,n){e.exports=n.p+\"static/assets/7ad5cc6ed3d0a5fd6a273078fe3999f0.svg\"},function(e,t,n){e.exports=n.p+\"static/assets/cd200d8b59d5c3d4ff3a69a774f5fac3.svg\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIHZpZXdCb3g9Ii0yIC0yIDQ4IDQ4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxjaXJjbGUgY3g9IjIyIiBjeT0iMjIiIHI9IjIzLjUiIGZpbGw9IiM4NTVjZDYiIG9wYWNpdHk9Ii4yNSIvPjxjaXJjbGUgY3g9IjIyIiBjeT0iMjIiIHI9IjE4IiBmaWxsPSIjODU1Y2Q2Ii8+PHBhdGggZD0iTTI1LjQwNCAyMC4xMTFhMy42NiAzLjY2IDAgMCAxIC44OTcgMy4wNjljLS4xOTMgMS4zMDUtMS4xNTggMi41NTEtMi41MDUgMy4wNjhoLS4wMDhhLjkwMS45MDEgMCAwIDAtLjU2IDEuMDUxLjkwOS45MDkgMCAwIDAgMS4wODQuNjc4YzIuMDE1LS40NjYgMy43NzUtMi4wOTMgNC40MS00LjE5NmE2LjQ5NSA2LjQ5NSAwIDAgMCAuMTI4LTMuMjcyIDYuNTE4IDYuNTE4IDAgMCAwLTEuMjM2LTIuNjFsLjg0Ni0uODQ4QS42MTguNjE4IDAgMCAwIDI4LjAyIDE2aC00LjAzN2MtLjM0IDAtLjYxOS4yOC0uNjE5LjYxOXY0LjA0M2MwIC41NTEuNjYxLjgyMiAxLjA1LjQ0em0tNi44MDggMy43NzhhMy42NjIgMy42NjIgMCAwIDEtLjg5Ny0zLjA2OWMuMTk0LTEuMzA1IDEuMTU5LTIuNTUyIDIuNTA1LTMuMDY4aC4wMDhhLjkwMi45MDIgMCAwIDAgLjU1OS0xLjA1MS45MDguOTA4IDAgMCAwLTEuMDgzLS42NzhjLTIuMDE1LjQ2Ni0zLjc3NSAyLjA5My00LjQxIDQuMTk2YTYuNDggNi40OCAwIDAgMC0uMTI3IDMuMjcgNi41MSA2LjUxIDAgMCAwIDEuMjM2IDIuNjExbC0uODQ3Ljg0OGMtLjM4LjM5LS4xMSAxLjA1Mi40NCAxLjA1Mmg0LjAzOGMuMzM4IDAgLjYxOC0uMjguNjE4LS42MnYtNC4wNDJhLjYxNy42MTcgMCAwIDAtMS4wNS0uNDR6IiBmaWxsPSIjZmZmIi8+PC9zdmc+Cg==\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMC40MDQgNC4xMTFhMy42NiAzLjY2IDAgMCAxIC44OTcgMy4wNjljLS4xOTQgMS4zMDUtMS4xNTggMi41NTEtMi41MDUgMy4wNjhoLS4wMDhhLjkwMS45MDEgMCAwIDAtLjU2IDEuMDUxYy4xMTEuNDgzLjYwMi43ODkgMS4wODQuNjc4IDIuMDE1LS40NjYgMy43NzUtMi4wOTMgNC40MS00LjE5NmE2LjQ5NSA2LjQ5NSAwIDAgMCAuMTI4LTMuMjcyIDYuNTE3IDYuNTE3IDAgMCAwLTEuMjM2LTIuNjFsLjg0Ni0uODQ4QS42MTguNjE4IDAgMCAwIDEzLjAyIDBIOC45ODNjLS4zNCAwLS42MTkuMjgtLjYxOS42MTl2NC4wNDNjMCAuNTUxLjY2MS44MjIgMS4wNS40NGwuOTktLjk5ek0zLjU5NiA3Ljg5YTMuNjYzIDMuNjYzIDAgMCAxLS44OTgtMy4wNjljLjE5NS0xLjMwNSAxLjE2LTIuNTUyIDIuNTA2LTMuMDY4aC4wMDhBLjkwMi45MDIgMCAwIDAgNS43NzEuNy45MDguOTA4IDAgMCAwIDQuNjg4LjAyM0MyLjY3My40ODkuOTEzIDIuMTE2LjI3OCA0LjIxOWE2LjQ4MSA2LjQ4MSAwIDAgMC0uMTI3IDMuMjdjLjIwMy45NDIuNjM1IDEuODQgMS4yMzYgMi42MTFsLS44NDcuODQ4Qy4xNiAxMS4zMzguNDMgMTIgLjk4IDEyaDQuMDM4Yy4zMzggMCAuNjE3LS4yOC42MTctLjYyVjcuMzM4YS42MTcuNjE3IDAgMCAwLTEuMDQ5LS40NGwtLjk5Ljk5eiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==\"},function(e,t,n){e.exports=n(533)},function(e,t){e.exports=\"data:image/svg+xml;base64,PCEtLSBodHRwczovL21hdGVyaWFsLmlvL3Jlc291cmNlcy9pY29ucy8/c2VhcmNoPWhlbHAmaWNvbj1oZWxwJnN0eWxlPWJhc2VsaW5lIC0tPgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjQiPjxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMSAxN2gtMnYtMmgydjJ6bTIuMDctNy43NWwtLjkuOTJDMTMuNDUgMTIuOSAxMyAxMy41IDEzIDE1aC0ydi0uNWMwLTEuMS40NS0yLjEgMS4xNy0yLjgzbDEuMjQtMS4yNmMuMzctLjM2LjU5LS44Ni41OS0xLjQxIDAtMS4xLS45LTItMi0ycy0yIC45LTIgMkg4YzAtMi4yMSAxLjc5LTQgNC00czQgMS43OSA0IDRjMCAuODgtLjM2IDEuNjgtLjkzIDIuMjV6Ii8+PC9zdmc+\"},function(e,t,n){var a=n(539);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(540);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t,n){var a=n(543);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},function(e,t){e.exports=\"data:image/svg+xml;base64,PCEtLSBodHRwczovL2ZvbnRzLmdvb2dsZS5jb20vaWNvbnM/c2VsZWN0ZWQ9TWF0ZXJpYWwrU3ltYm9scytPdXRsaW5lZDpkb3dubG9hZDpGSUxMQDA7d2dodEA0MDA7R1JBREAwO29wc3pANDggLS0+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHZpZXdCb3g9IjAgLTk2MCA5NjAgOTYwIj48cGF0aCBkPSJNNDgwLTI5NC4yMTIgMjY1LjI4Ny01MDguOTI1bDQ3LjgzOC00Ny44MzcgMTMzLjUgMTMzLjVWLTgzNmg2Ni43NXY0MTIuNzM4bDEzMy41LTEzMy41IDQ3LjgzNyA0Ny44Mzd6TTE5MC43NS0xMjRjLTE3LjggMC0zMy4zNzUtNi42NzUtNDYuNzI1LTIwLjAyNUMxMzAuNjc1LTE1Ny4zNzUgMTI0LTE3Mi45NSAxMjQtMTkwLjc1di0xNTkuMDg4aDY2Ljc1djE1OS4wODhoNTc4LjV2LTE1OS4wODdIODM2djE1OS4wODdjMCAxNy44LTYuNjc1IDMzLjM3NS0yMC4wMjUgNDYuNzI1QzgwMi42MjUtMTMwLjY3NSA3ODcuMDUtMTI0IDc2OS4yNS0xMjR6IiBzdHlsZT0iZmlsbDojNTc1ZTc1O2ZpbGwtb3BhY2l0eToxO3N0cm9rZS13aWR0aDoxLjExMjUiLz48L3N2Zz4=\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDQuMjMzIDQuMjMzIj48cmVjdCB3aWR0aD0iLjU3IiBoZWlnaHQ9IjMuNyIgeD0iLTMuMjc4IiB5PSItMS44NSIgcnk9Ii4yODUiIHN0eWxlPSJmaWxsOiM1NzVlNzU7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOi4yMTAzODYiIHRyYW5zZm9ybT0icm90YXRlKC0xMzUpIi8+PHJlY3Qgd2lkdGg9Ii41NyIgaGVpZ2h0PSIzLjciIHg9Ii0uMjg1IiB5PSItNC44NDMiIHJ5PSIuMjg1IiBzdHlsZT0iZmlsbDojNTc1ZTc1O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDouMjEwMzg2IiB0cmFuc2Zvcm09InJvdGF0ZSgxMzUpIi8+PC9zdmc+\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDQuMjMzIDQuMjMzIj48cmVjdCB3aWR0aD0iLjMxNyIgaGVpZ2h0PSIzLjkyIiB4PSItLjE1OCIgeT0iMS4wMzMiIHJ5PSIuMjMiIHN0eWxlPSJmaWxsOiMxYTFhMWE7c3Ryb2tlLXdpZHRoOi4yOTEzNTUiIHRyYW5zZm9ybT0icm90YXRlKC00NSkiLz48cmVjdCB3aWR0aD0iLjMxNyIgaGVpZ2h0PSIzLjkyIiB4PSItMy4xNTIiIHk9Ii0xLjk2IiByeT0iLjIzIiBzdHlsZT0iZmlsbDojMWExYTFhO3N0cm9rZS13aWR0aDouMjkxMzU1IiB0cmFuc2Zvcm09InNjYWxlKC0xIDEpIHJvdGF0ZSgtNDUpIi8+PC9zdmc+\"},function(e,t){e.exports=\"data:image/svg+xml;base64,PCEtLSBodHRwczovL2ZvbnRzLmdvb2dsZS5jb20vaWNvbnM/c2VsZWN0ZWQ9TWF0ZXJpYWwrU3ltYm9scytPdXRsaW5lZDpkb3dubG9hZDpGSUxMQDA7d2dodEA0MDA7R1JBREAwO29wc3pANDggLS0+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBoZWlnaHQ9IjQ4IiB2aWV3Qm94PSIwIC05NjAgOTYwIDk2MCIgd2lkdGg9IjQ4Ij48cGF0aCBkPSJNNDgwLTMxMyAyODctNTA2bDQzLTQzIDEyMCAxMjB2LTM3MWg2MHYzNzFsMTIwLTEyMCA0MyA0My0xOTMgMTkzWk0yMjAtMTYwcS0yNCAwLTQyLTE4dC0xOC00MnYtMTQzaDYwdjE0M2g1MjB2LTE0M2g2MHYxNDNxMCAyNC0xOCA0MnQtNDIgMThIMjIwWiIvPjwvc3ZnPg==\"},function(e,t,n){e.exports=n.p+\"static/assets/d259fcbecaa9d2a22d19848daff9d4c6.svg\"},function(e,t,n){\"use strict\";t.a=()=>{Promise.all([n.e(1),n.e(83)]).then(n.bind(null,658))}},function(e,t,n){\"use strict\";var a=n(1),o=n.n(a),r=n(0),i=n.n(r),s=n(44),l=n(7),c=n(96),d=n.n(c),u=n(13),p=n.n(u),m=n(2),g=n(61),h=n(12),b=n(28),w=n(14),f=n(62),M=n.n(f),v=n(157),y=n(257);var k=n(174);const j=[\"locale\",\"onSetLanguage\"];var I=function(e){class t extends o.a.Component{componentDidUpdate(e){e.locale!==this.props.locale&&this.props.onSetLanguage(this.props.locale)}render(){const t=this.props,{locale:n,onSetLanguage:a}=t,r=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a{}};return Object(l.b)((e=>({locale:e.locales.locale})),(()=>({})))(t)},S=n(210),x=n(4),E=n.n(x),C=n(55),N=n(11),_=n(25),D=n(209);const T=[\"assetHost\",\"intl\",\"isLoadingProject\",\"loadingState\",\"onActivateTab\",\"onError\",\"onFetchedProjectData\",\"onProjectUnchanged\",\"projectHost\",\"projectId\",\"reduxProjectId\",\"setProjectId\",\"isFetchingWithId\"];function O(){return O=Object.assign?Object.assign.bind():function(e){for(var t=1;t{F()(a,((a,r)=>{if(a)return n(a);if(200!==r.statusCode)return n(r.statusCode);let i;try{i=JSON.parse(r.body)}catch(e){return n(e)}i.id=e,o&&(i.id=i[\"content-name\"]),t(i)}))}))},W=n(20),H=n(158);const Q=[\"autoSaveTimeoutId\",\"autoSaveIntervalSecs\",\"isCreatingCopy\",\"isCreatingNew\",\"projectChanged\",\"isAnyCreatingNewState\",\"isLoading\",\"isManualUpdating\",\"isRemixing\",\"isShowingSaveable\",\"isShowingWithId\",\"isShowingWithoutId\",\"isUpdating\",\"loadingState\",\"onAutoUpdateProject\",\"onCreatedProject\",\"onCreateProject\",\"onProjectError\",\"onRemixing\",\"onSetProjectUnchanged\",\"onSetProjectThumbnailer\",\"onSetProjectSaver\",\"onShowAlert\",\"onShowCopySuccessAlert\",\"onShowRemixSuccessAlert\",\"onShowCreatingCopyAlert\",\"onShowCreatingRemixAlert\",\"onShowSaveSuccessAlert\",\"onShowSavingAlert\",\"onUpdatedProject\",\"onUpdateProjectData\",\"onUpdateProjectThumbnail\",\"reduxProjectId\",\"reduxProjectTitle\",\"setAutoSaveTimeoutId\"];function Y(){return Y=Object.assign?Object.assign.bind():function(e){for(var t=1;t{e.gui={getBlockly:()=>ne.a.blockly?Promise.resolve(ne.a.blockly):new Promise((e=>{ne.a.blocklyCallbacks.push((()=>e(ne.a.blockly)))})),getBlocklyEagerly:()=>te.a.load()}};const oe=[\"attachKeyboardEvents\",\"isEditorObscured\",\"isEditorUsable\",\"projectChanged\",\"shouldUpdateTargets\",\"shouldUpdateProjectChanged\",\"onBlockDragUpdate\",\"onGreenFlag\",\"onKeyDown\",\"onKeyUp\",\"onMicListeningUpdate\",\"onMonitorsUpdate\",\"onTargetsUpdate\",\"onProjectChanged\",\"onProjectRunStart\",\"onProjectRunStop\",\"onProjectSaved\",\"onRuntimeStarted\",\"onRuntimeStopped\",\"onTurboModeOff\",\"onTurboModeOn\",\"hasCloudVariables\",\"onHasCloudVariablesChanged\",\"onFramerateChanged\",\"onInterpolationChanged\",\"onCompilerOptionsChanged\",\"onPlatformMismatch\",\"onRuntimeOptionsChanged\",\"onStageSizeChanged\",\"onCompileError\",\"onClearCompileErrors\",\"onShowExtensionAlert\"];let re=0;var ie=function(e){class t extends o.a.Component{constructor(e){super(e),E()(this,[\"handleKeyDown\",\"handleKeyUp\",\"handleProjectChanged\",\"handleTargetsUpdate\",\"handleCloudDataUpdate\",\"handleCompileError\"]),this.props.vm.on(\"targetsUpdate\",this.handleTargetsUpdate),this.props.vm.on(\"MONITORS_UPDATE\",this.props.onMonitorsUpdate),this.props.vm.on(\"BLOCK_DRAG_UPDATE\",this.props.onBlockDragUpdate),this.props.vm.on(\"TURBO_MODE_ON\",this.props.onTurboModeOn),this.props.vm.on(\"TURBO_MODE_OFF\",this.props.onTurboModeOff),this.props.vm.on(\"PROJECT_RUN_START\",this.props.onProjectRunStart),this.props.vm.on(\"PROJECT_RUN_STOP\",this.props.onProjectRunStop),this.props.vm.on(\"PROJECT_CHANGED\",this.handleProjectChanged),this.props.vm.on(\"RUNTIME_STARTED\",this.props.onRuntimeStarted),this.props.vm.on(\"RUNTIME_STOPPED\",this.props.onRuntimeStopped),this.props.vm.on(\"PROJECT_START\",this.props.onGreenFlag),this.props.vm.on(\"PERIPHERAL_CONNECTION_LOST_ERROR\",this.props.onShowExtensionAlert),this.props.vm.on(\"MIC_LISTENING\",this.props.onMicListeningUpdate),this.props.vm.on(\"MIC_LISTENING\",this.props.onMicListeningUpdate),this.props.vm.on(\"HAS_CLOUD_DATA_UPDATE\",this.handleCloudDataUpdate),this.props.vm.on(\"COMPILER_OPTIONS_CHANGED\",this.props.onCompilerOptionsChanged),this.props.vm.on(\"RUNTIME_OPTIONS_CHANGED\",this.props.onRuntimeOptionsChanged),this.props.vm.on(\"FRAMERATE_CHANGED\",this.props.onFramerateChanged),this.props.vm.on(\"INTERPOLATION_CHANGED\",this.props.onInterpolationChanged),this.props.vm.on(\"COMPILE_ERROR\",this.handleCompileError),this.props.vm.on(\"RUNTIME_STARTED\",this.props.onClearCompileErrors),this.props.vm.on(\"STAGE_SIZE_CHANGED\",this.props.onStageSizeChanged),this.props.vm.on(\"CREATE_UNSANDBOXED_EXTENSION_API\",ae),this.props.vm.runtime.on(\"PLATFORM_MISMATCH\",this.props.onPlatformMismatch)}componentDidMount(){this.props.attachKeyboardEvents&&(document.addEventListener(\"keydown\",this.handleKeyDown),document.addEventListener(\"keyup\",this.handleKeyUp)),this.props.vm.postIOData(\"userData\",{username:this.props.username})}componentDidUpdate(e){e.username!==this.props.username&&this.props.vm.postIOData(\"userData\",{username:this.props.username}),this.props.shouldUpdateTargets&&!e.shouldUpdateTargets&&this.props.vm.emitTargetsUpdate(!1)}componentWillUnmount(){this.props.attachKeyboardEvents&&(document.removeEventListener(\"keydown\",this.handleKeyDown),document.removeEventListener(\"keyup\",this.handleKeyUp)),this.props.vm.off(\"targetsUpdate\",this.handleTargetsUpdate),this.props.vm.off(\"MONITORS_UPDATE\",this.props.onMonitorsUpdate),this.props.vm.off(\"BLOCK_DRAG_UPDATE\",this.props.onBlockDragUpdate),this.props.vm.off(\"TURBO_MODE_ON\",this.props.onTurboModeOn),this.props.vm.off(\"TURBO_MODE_OFF\",this.props.onTurboModeOff),this.props.vm.off(\"PROJECT_RUN_START\",this.props.onProjectRunStart),this.props.vm.off(\"PROJECT_RUN_STOP\",this.props.onProjectRunStop),this.props.vm.off(\"PROJECT_CHANGED\",this.handleProjectChanged),this.props.vm.off(\"RUNTIME_STARTED\",this.props.onRuntimeStarted),this.props.vm.off(\"RUNTIME_STOPPED\",this.props.onRuntimeStopped),this.props.vm.off(\"PROJECT_START\",this.props.onGreenFlag),this.props.vm.off(\"PERIPHERAL_CONNECTION_LOST_ERROR\",this.props.onShowExtensionAlert),this.props.vm.off(\"MIC_LISTENING\",this.props.onMicListeningUpdate),this.props.vm.off(\"MIC_LISTENING\",this.props.onMicListeningUpdate),this.props.vm.off(\"HAS_CLOUD_DATA_UPDATE\",this.handleCloudDataUpdate),this.props.vm.off(\"COMPILER_OPTIONS_CHANGED\",this.props.onCompilerOptionsChanged),this.props.vm.off(\"RUNTIME_OPTIONS_CHANGED\",this.props.onRuntimeOptionsChanged),this.props.vm.off(\"FRAMERATE_CHANGED\",this.props.onFramerateChanged),this.props.vm.off(\"INTERPOLATION_CHANGED\",this.props.onInterpolationChanged),this.props.vm.off(\"COMPILE_ERROR\",this.handleCompileError),this.props.vm.off(\"RUNTIME_STARTED\",this.props.onClearCompileErrors),this.props.vm.off(\"STAGE_SIZE_CHANGED\",this.props.onStageSizeChanged),this.props.vm.off(\"CREATE_UNSANDBOXED_EXTENSION_API\",ae),this.props.vm.runtime.off(\"PLATFORM_MISMATCH\",this.props.onPlatformMismatch)}handleCloudDataUpdate(e){this.props.hasCloudVariables!==e&&this.props.onHasCloudVariablesChanged(e)}handleCompileError(e,t){const n=\"\".concat(t);n.includes(\"Script explicitly disables compilation\")||this.props.onCompileError({sprite:e.getName(),error:n,id:re++})}handleProjectChanged(){this.props.shouldUpdateProjectChanged&&!this.props.projectChanged&&this.props.onProjectChanged()}handleTargetsUpdate(e){this.props.shouldUpdateTargets&&this.props.onTargetsUpdate(e)}handleKeyDown(e){if(e.target!==document&&e.target!==document.body)return;const t=e.key&&\"Dead\"!==e.key?e.key:e.keyCode;this.props.vm.postIOData(\"keyboard\",{key:t,keyCode:e.keyCode,isDown:!0}),(32===e.keyCode||e.keyCode>=37&&e.keyCode<=40)&&e.preventDefault(),8===e.keyCode&&e.preventDefault();const n=e=>this.props.isEditorObscured||this.props.isEditorUsable&&this.props.vm.runtime.ioDevices.keyboard.hasUsedKey(e);(8===e.keyCode&&n(\"backspace\")||46===e.keyCode&&n(\"delete\"))&&(e.stopPropagation(),e.stopImmediatePropagation()),222!==e.keyCode&&191!==e.keyCode||e.preventDefault()}handleKeyUp(e){const t=e.key&&\"Dead\"!==e.key?e.key:e.keyCode;this.props.vm.postIOData(\"keyboard\",{key:t,keyCode:e.keyCode,isDown:!1}),e.target!==document&&e.target!==document.body&&e.preventDefault()}render(){const t=this.props,{attachKeyboardEvents:n,isEditorObscured:a,isEditorUsable:r,projectChanged:i,shouldUpdateTargets:s,shouldUpdateProjectChanged:l,onBlockDragUpdate:c,onGreenFlag:d,onKeyDown:u,onKeyUp:p,onMicListeningUpdate:m,onMonitorsUpdate:g,onTargetsUpdate:h,onProjectChanged:b,onProjectRunStart:w,onProjectRunStop:f,onProjectSaved:M,onRuntimeStarted:v,onRuntimeStopped:y,onTurboModeOff:k,onTurboModeOn:j,hasCloudVariables:I,onHasCloudVariablesChanged:S,onFramerateChanged:x,onInterpolationChanged:E,onCompilerOptionsChanged:C,onPlatformMismatch:N,onRuntimeOptionsChanged:_,onStageSizeChanged:D,onCompileError:T,onClearCompileErrors:O,onShowExtensionAlert:A}=t,P=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a({})};return Object(l.b)((e=>({hasCloudVariables:e.scratchGui.tw.hasCloudVariables,isEditorObscured:!e.scratchGui.mode.isPlayerOnly&&e.scratchGui.mode.isFullScreen,isEditorUsable:!e.scratchGui.mode.isPlayerOnly&&!e.scratchGui.mode.isFullScreen&&e.scratchGui.editorTab.activeTabIndex===b.a,projectChanged:e.scratchGui.projectChanged,shouldUpdateTargets:!e.scratchGui.mode.isFullScreen&&!e.scratchGui.mode.isPlayerOnly&&!e.scratchGui.modals.soundRecorder,shouldUpdateProjectChanged:!e.scratchGui.mode.isFullScreen&&!e.scratchGui.mode.isPlayerOnly,vm:e.scratchGui.vm,username:e.session&&e.session.session&&e.session.session.user?e.session.session.user.username:e.scratchGui.tw?e.scratchGui.tw.username:\"\"})),(e=>({onTargetsUpdate:t=>{e(Object(V.d)(t.targetList,t.editingTarget))},onMonitorsUpdate:t=>{e(Object(J.c)(t))},onBlockDragUpdate:t=>{e(Object(q.c)(t))},onProjectRunStart:()=>e(Object(X.b)(!0)),onProjectRunStop:()=>e(Object(X.b)(!1)),onProjectChanged:()=>e(Object(C.c)()),onProjectSaved:()=>e(Object(C.d)()),onRuntimeStarted:()=>e(Object(X.c)(!0)),onRuntimeStopped:()=>e(Object(X.c)(!1)),onTurboModeOn:()=>e(Object(X.d)(!0)),onTurboModeOff:()=>e(Object(X.d)(!1)),onHasCloudVariablesChanged:t=>e(Object($.l)(t)),onFramerateChanged:t=>e(Object($.k)(t)),onInterpolationChanged:t=>e(Object($.n)(t)),onCompilerOptionsChanged:t=>e(Object($.g)(t)),onPlatformMismatch:(t,n)=>{e(Object($.p)(t,n)),e(Object(w.H)())},onRuntimeOptionsChanged:t=>e(Object($.r)(t)),onStageSizeChanged:(t,n)=>e(Object(ee.d)(t,n)),onCompileError:t=>e(Object($.a)(t)),onClearCompileErrors:()=>e(Object($.b)()),onShowExtensionAlert:t=>{e(Object(W.h)(t))},onMicListeningUpdate:t=>{e(Object(K.c)(t))}})))(t)},se=n(217),le=n.n(se);const ce=[\"fontsLoaded\",\"loadingState\",\"locale\",\"messages\",\"isStarted\",\"onError\",\"onLoadedProject\",\"onSetProjectUnchanged\",\"projectData\",\"isLoadingWithId\",\"vm\"];function de(){return de=Object.assign?Object.assign.bind():function(e){for(var t=1;t{this.props.onLoadedProject(this.props.loadingState,this.props.canSave),setTimeout((()=>this.props.onSetProjectUnchanged())),this.props.isStarted||setTimeout((()=>this.props.vm.renderer.draw()))})).catch((e=>{this.props.onError(e)}))}render(){const t=this.props,{fontsLoaded:n,loadingState:a,locale:r,messages:i,isStarted:s,onError:l,onLoadedProject:c,onSetProjectUnchanged:d,projectData:u,isLoadingWithId:p,vm:m}=t,g=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a{const t=e.scratchGui.projectState.loadingState;return{fontsLoaded:e.scratchGui.fontsLoaded,isLoadingWithId:Object(h.o)(t),locale:e.locales.locale,messages:e.locales.messages,projectData:e.scratchGui.projectState.projectData,projectId:e.scratchGui.projectState.projectId,loadingState:t,isPlayerOnly:e.scratchGui.mode.isPlayerOnly,isStarted:e.scratchGui.vmStatus.started}}),(e=>({onError:t=>e(Object(h.y)(t)),onLoadedProject:(t,n)=>e(Object(h.x)(t,n,!0)),onSetProjectUnchanged:()=>e(Object(C.d)())})),((e,t,n)=>Object.assign({},e,t,n)))(t)},me=n(412),ge=n.n(me);var he=class{constructor(e,t,n,a){this.vm=t,this.username=(e=>/^player\\d{2,7}$/i.test(e)?\"player\":e)(n),this.projectId=a,this.cloudHost=e,this.connectionAttempts=0,this.queuedData=[],this.openConnection(),this.sendCloudData=ge()(this._sendCloudData,50)}openConnection(){this.connectionAttempts+=1;try{this.cloudHost&&(this.cloudHost.includes(\"ws://\")||this.cloudHost.includes(\"wss://\"))||(this.cloudHost=(\"http:\"===location.protocol?\"ws://\":\"wss://\")+this.cloudHost),this.connection=new WebSocket(this.cloudHost)}catch(e){return N.default.warn(\"Websocket support is not available in this browser\",e),void(this.connection=null)}this.connection.onerror=this.onError.bind(this),this.connection.onmessage=this.onMessage.bind(this),this.connection.onopen=this.onOpen.bind(this),this.connection.onclose=this.onClose.bind(this)}onError(e){N.default.error(\"Websocket connection error: \".concat(JSON.stringify(e)))}onMessage(e){e.data.split(\"\\n\").forEach((e=>{if(e){const t=this.parseMessage(JSON.parse(e));this.vm.postIOData(\"cloud\",t)}}))}onOpen(){this.connectionAttempts=1,this.writeToServer(\"handshake\"),N.default.info(\"Successfully connected to clouddata server.\"),this.queuedData.forEach((e=>{this.sendCloudData(e)})),this.queuedData=[]}onClose(e){if(e&&4002===e.code)return N.default.info(\"Cloud username is invalid. Not reconnecting.\"),void this.onInvalidUsername();if(e&&4003===e.code)return void N.default.info(\"The server is full. Not reconnecting.\");if(e&&4004===e.code)return void N.default.info(\"Cloud variables are disabled for this project. Not reconnecting.\");N.default.info(\"WebSocket connection closed with code \".concat(e&&e.code));const t=this.randomizeDuration(this.exponentialTimeout());this.setTimeout(this.openConnection.bind(this),t)}onInvalidUsername(){}exponentialTimeout(){return 1e3*(Math.pow(2,Math.min(this.connectionAttempts,5))-1)}randomizeDuration(e){return Math.random()*e}setTimeout(e,t){N.default.info(\"Reconnecting in \".concat((t/1e3).toFixed(1),\"s, attempt \").concat(this.connectionAttempts)),this._connectionTimeout=window.setTimeout(e,t)}parseMessage(e){const t={};if(\"set\"===e.method)t.varUpdate={name:e.name,value:e.value};return t}writeToServer(e,t,n,a){const o={};o.method=e,o.user=this.username,o.project_id=this.projectId,t&&(o.name=t),a&&(o.new_name=a),null!=n&&(o.value=n);const r=JSON.stringify(o);this.connection&&this.connection.readyState===WebSocket.OPEN?this.sendCloudData(r):\"create\"!==o.method&&\"delete\"!==o.method&&\"rename\"!==o.method||this.queuedData.push(r)}_sendCloudData(e){this.connection.send(\"\".concat(e,\"\\n\"))}createVariable(e,t){this.writeToServer(\"create\",e,t)}updateVariable(e,t){this.writeToServer(\"set\",e,t)}renameVariable(e,t){this.writeToServer(\"rename\",e,null,t)}deleteVariable(e){this.writeToServer(\"delete\",e)}requestCloseConnection(){this.connection&&this.connection.readyState!==WebSocket.CLOSING&&this.connection.readyState!==WebSocket.CLOSED&&(N.default.info(\"Request close cloud connection without reconnecting\"),this.connection.onclose=()=>{},this.connection.onerror=()=>{},this.connection.close()),this.clear()}clear(){this.connection=null,this.vm=null,this.username=null,this.projectId=null,this._connectionTimeout&&(clearTimeout(this._connectionTimeout),this._connectionTimeout=null),this.connectionAttempts=0}};const be=[\"canModifyCloudData\",\"cloudHost\",\"reduxCloudHost\",\"cloudVariablesDisabledByUser\",\"onSetReduxCloudHost\",\"projectId\",\"username\",\"hasCloudPermission\",\"isShowingWithId\",\"onShowCloudInfo\",\"onInvalidUsername\",\"vm\"];function we(){return we=Object.assign?Object.assign.bind():function(e){for(var t=1;t{},username:null};return Object(l.b)(((e,t)=>{const n=e.scratchGui.projectState.loadingState;return{reduxCloudHost:e.scratchGui.tw.cloudHost,cloudVariablesDisabledByUser:!e.scratchGui.tw.cloud,isShowingWithId:Object(h.s)(n),projectId:e.scratchGui.projectState.projectId,canModifyCloudData:(!e.scratchGui.mode.hasEverEnteredEditor||t.canSave)&&!0}}),(e=>({onSetReduxCloudHost:t=>e(Object($.f)(t)),onShowCloudInfo:()=>Object(W.g)(e,\"cloudInfo\"),onInvalidUsername:()=>{e(Object($.t)(!0)),e(Object(w.I)())}})),((e,t,n)=>Object.assign({},e,t,n)))(t)},ve=n(3),ye=n.n(ve),ke=n(253),je=n.n(ke),Ie=n(102),Se=n(150),xe=n.n(Se),Ee=n(413),Ce=n.n(Ee),Ne=n(143),_e=n.n(Ne),De=n(180),Te=function(e){const t=te.a.get(),n=function(e,n,a,o){return{message0:\"%1\",args0:[{type:\"field_dropdown\",name:e,options:function(){return o.concat(n())}}],inputsInline:!0,output:\"String\",colour:a.secondary,colourSecondary:a.secondary,colourTertiary:a.tertiary,colourQuaternary:a.quaternary,outputShape:t.OUTPUT_SHAPE_ROUND}},a=function(){let n=[[\"\",\"\"]];return e.editingTarget&&e.editingTarget.sprite.sounds.length>0&&(n=e.editingTarget.sprite.sounds.map((e=>[e.name,e.name]))),n.push([t.ScratchMsgs.translate(\"SOUND_RECORD\",\"record...\"),t.recordSoundCallback]),n},o=function(){return e.editingTarget&&e.editingTarget.getCostumes().length>0?e.editingTarget.getCostumes().map((e=>[e.name,e.name])):[[\"\",\"\"]]},r=function(){const n=t.ScratchMsgs.translate(\"LOOKS_NEXTBACKDROP\",\"next backdrop\"),a=t.ScratchMsgs.translate(\"LOOKS_PREVIOUSBACKDROP\",\"previous backdrop\"),o=t.ScratchMsgs.translate(\"LOOKS_RANDOMBACKDROP\",\"random backdrop\");return e.runtime.targets[0]&&e.runtime.targets[0].getCostumes().length>0?e.runtime.targets[0].getCostumes().map((e=>[e.name,e.name])).concat([[n,\"next backdrop\"],[a,\"previous backdrop\"],[o,\"random backdrop\"]]):[[\"\",\"\"]]},i=function(){const t=e.runtime.getTargetForStage();return t&&t.getCostumes().length>0?t.getCostumes().map((e=>[e.name,e.name])):[[\"\",\"\"]]},s=function(){const t=[];for(const n in e.runtime.targets)if(Object.prototype.hasOwnProperty.call(e.runtime.targets,n)&&e.runtime.targets[n].isOriginal&&!e.runtime.targets[n].isStage){if(e.runtime.targets[n]===e.editingTarget)continue;t.push([e.runtime.targets[n].sprite.name,e.runtime.targets[n].sprite.name])}return t},l=function(){if(e.editingTarget&&e.editingTarget.isStage){const e=s();return 0===e.length?[[\"\",\"\"]]:e}return[[t.ScratchMsgs.translate(\"CONTROL_CREATECLONEOF_MYSELF\",\"myself\"),\"_myself_\"]].concat(s())},c=t.Colours.sounds,d=t.Colours.looks,u=t.Colours.motion,p=t.Colours.sensing,m=t.Colours.control,g=t.Colours.event;t.Blocks.sound_sounds_menu.init=function(){const e=n(\"SOUND_MENU\",a,c,[]);this.jsonInit(e)},t.Blocks.looks_costume.init=function(){const e=n(\"COSTUME\",o,d,[]);this.jsonInit(e)},t.Blocks.looks_backdrops.init=function(){const e=n(\"BACKDROP\",r,d,[]);this.jsonInit(e)},t.Blocks.event_whenbackdropswitchesto.init=function(){const e=(n=t.Msg.EVENT_WHENBACKDROPSWITCHESTO,a=i,r=[],{message0:n,args0:[{type:\"field_dropdown\",name:\"BACKDROP\",options:function(){return r.concat(a())}}],colour:(o=g).primary,colourSecondary:o.secondary,colourTertiary:o.tertiary,colourQuaternary:o.quaternary,extensions:[\"shape_hat\"]});var n,a,o,r;this.jsonInit(e)},t.Blocks.motion_pointtowards_menu.init=function(){const e=t.ScratchMsgs.translate(\"MOTION_POINTTOWARDS_RANDOM\",\"random direction\"),a=t.ScratchMsgs.translate(\"MOTION_POINTTOWARDS_POINTER\",\"mouse-pointer\"),o=n(\"TOWARDS\",s,u,[[a,\"_mouse_\"],[e,\"_random_\"]]);this.jsonInit(o)},t.Blocks.motion_goto_menu.init=function(){const e=t.ScratchMsgs.translate(\"MOTION_GOTO_RANDOM\",\"random position\"),a=t.ScratchMsgs.translate(\"MOTION_GOTO_POINTER\",\"mouse-pointer\"),o=n(\"TO\",s,u,[[e,\"_random_\"],[a,\"_mouse_\"]]);this.jsonInit(o)},t.Blocks.motion_glideto_menu.init=function(){const e=t.ScratchMsgs.translate(\"MOTION_GLIDETO_RANDOM\",\"random position\"),a=t.ScratchMsgs.translate(\"MOTION_GLIDETO_POINTER\",\"mouse-pointer\"),o=n(\"TO\",s,u,[[e,\"_random_\"],[a,\"_mouse_\"]]);this.jsonInit(o)},t.Blocks.sensing_of_object_menu.init=function(){const e=t.ScratchMsgs.translate(\"SENSING_OF_STAGE\",\"Stage\"),a=n(\"OBJECT\",s,p,[[e,\"_stage_\"]]);this.jsonInit(a)},t.Blocks.sensing_of.init=function(){const n=this.id,a=this.type;let o;const r=e.runtime.flyoutBlocks._blocks;Object.keys(r).forEach((e=>{const t=r[e];(e===a||t&&t.opcode===a)&&(o=t)}));const i=(s=function(){const a=[[t.Msg.SENSING_OF_BACKDROPNUMBER,\"backdrop #\"],[t.Msg.SENSING_OF_BACKDROPNAME,\"backdrop name\"],[t.Msg.SENSING_OF_VOLUME,\"volume\"]],r=[[t.Msg.SENSING_OF_XPOSITION,\"x position\"],[t.Msg.SENSING_OF_YPOSITION,\"y position\"],[t.Msg.SENSING_OF_DIRECTION,\"direction\"],[t.Msg.SENSING_OF_COSTUMENUMBER,\"costume #\"],[t.Msg.SENSING_OF_COSTUMENAME,\"costume name\"],[t.Msg.SENSING_OF_SIZE,\"size\"],[t.Msg.SENSING_OF_VOLUME,\"volume\"]];if(e.editingTarget){let i=e.editingTarget.blocks,s=i.getBlock(n);if(!s){if(s=e.runtime.flyoutBlocks.getBlock(n)||o,!s)return[[\"\",\"\"]];i=e.runtime.flyoutBlocks}const l=function(e){e.sort(t.scratchBlocksUtils.compareStrings)},c=e.runtime.getTargetForStage().getAllVariableNamesInScopeByType(\"\");l(c);const d=c.map((e=>[e,e]));if(s.inputs.OBJECT.shadow!==s.inputs.OBJECT.block)return a.concat(d);const u=i.getBlock(s.inputs.OBJECT.shadow).fields.OBJECT.value;if(\"_stage_\"===u)return a.concat(d);const p=e.runtime.getSpriteTargetByName(u);let m=[];p&&(m=p.getAllVariableNamesInScopeByType(\"\",!0),l(m));const g=m.map((e=>[e,e]));return r.concat(g)}return[[\"\",\"\"]]},{message0:t.Msg.SENSING_OF,args0:[{type:\"field_dropdown\",name:\"PROPERTY\",options:function(){return s()}},{type:\"input_value\",name:\"OBJECT\"}],output:!0,colour:t.Colours.sensing.primary,colourSecondary:t.Colours.sensing.secondary,colourTertiary:t.Colours.sensing.tertiary,colourQuaternary:t.Colours.sensing.quaternary,outputShape:t.OUTPUT_SHAPE_ROUND});var s;this.jsonInit(i)},t.Blocks.sensing_distancetomenu.init=function(){const e=t.ScratchMsgs.translate(\"SENSING_DISTANCETO_POINTER\",\"mouse-pointer\"),a=n(\"DISTANCETOMENU\",s,p,[[e,\"_mouse_\"]]);this.jsonInit(a)},t.Blocks.sensing_touchingobjectmenu.init=function(){const e=t.ScratchMsgs.translate(\"SENSING_TOUCHINGOBJECT_POINTER\",\"mouse-pointer\"),a=t.ScratchMsgs.translate(\"SENSING_TOUCHINGOBJECT_EDGE\",\"edge\"),o=n(\"TOUCHINGOBJECTMENU\",s,p,[[e,\"_mouse_\"],[a,\"_edge_\"]]);this.jsonInit(o)},t.Blocks.control_create_clone_of_menu.init=function(){const e=n(\"CLONE_OPTION\",l,m,[]);this.jsonInit(e)},t.VerticalFlyout.getCheckboxState=function(t){const n=e.runtime.monitorBlocks._blocks[t];return!!n&&n.isMonitored},t.FlyoutExtensionCategoryHeader.getExtensionState=function(n){return e.getPeripheralIsConnected(n)?t.StatusButtonState.READY:t.StatusButtonState.NOT_READY},t.FieldNote.playNote_=function(t,n){e.runtime.emit(\"PLAY_NOTE\",t,n)};const h=new Intl.Collator([],{sensitivity:\"base\",numeric:!0});return t.scratchBlocksUtils.compareStrings=function(e,t){return h.compare(e,t)},t.utils.is3dSupported=function(){return!0},t},Oe=n(5),Ae=n(36),Pe=n(92),ze=n(184),Le=n.n(ze),Re=n(302),Ue=n.n(Re),Be=n(58),Ge=n.n(Be);const Fe=e=>o.a.createElement(d.a,{isOpen:!0,className:ye()(Ge.a.modalContent,e.className,{[Ge.a.fullScreen]:e.fullScreen}),contentLabel:e.contentLabel,overlayClassName:Ge.a.modalOverlay,onRequestClose:e.onRequestClose},o.a.createElement(Oe.a,{dir:e.isRtl?\"rtl\":\"ltr\",direction:\"column\",grow:1},o.a.createElement(\"div\",{className:ye()(Ge.a.header,e.headerClassName)},e.onHelp?o.a.createElement(\"div\",{className:ye()(Ge.a.headerItem,Ge.a.headerItemHelp)},o.a.createElement(Ae.a,{className:Ge.a.helpButton,iconSrc:Ue.a,onClick:e.onHelp},o.a.createElement(m.b,{defaultMessage:\"Help\",id:\"gui.modal.help\"}))):null,o.a.createElement(\"div\",{className:ye()(Ge.a.headerItem,Ge.a.headerItemTitle)},e.headerImage?o.a.createElement(\"img\",{className:Ge.a.headerImage,src:e.headerImage,draggable:!1}):null,e.contentLabel),o.a.createElement(\"div\",{className:ye()(Ge.a.headerItem,Ge.a.headerItemClose)},e.fullScreen?o.a.createElement(Ae.a,{className:Ge.a.backButton,iconSrc:Le.a,onClick:e.onRequestClose},o.a.createElement(m.b,{defaultMessage:\"Back\",id:\"gui.modal.back\"})):o.a.createElement(Pe.a,{size:Pe.a.SIZE_LARGE,onClick:e.onRequestClose}))),e.children));Fe.propTypes={children:i.a.node,className:i.a.string,contentLabel:i.a.oneOfType([i.a.string,i.a.object]).isRequired,fullScreen:i.a.bool,headerClassName:i.a.string,headerImage:i.a.string,isRtl:i.a.bool,onHelp:i.a.func,onRequestClose:i.a.func};var Ze=Fe;class We extends o.a.Component{constructor(e){super(e),E()(this,[\"addEventListeners\",\"removeEventListeners\",\"handlePopState\",\"pushHistory\"]),this.addEventListeners()}componentDidMount(){this.pushHistory(this.id,null===history.state||history.state!==this.id)}componentWillUnmount(){this.removeEventListeners()}addEventListeners(){window.addEventListener(\"popstate\",this.handlePopState)}removeEventListeners(){window.removeEventListener(\"popstate\",this.handlePopState)}handlePopState(){this.props.onRequestClose()}get id(){return\"modal-\".concat(this.props.id)}pushHistory(e,t){if(t)return history.pushState(e,this.id,null);history.replaceState(e,this.id,null)}render(){return o.a.createElement(Ze,this.props)}}We.propTypes={id:i.a.string.isRequired,isRtl:i.a.bool,onRequestClose:i.a.func,onRequestOpen:i.a.func};var He=Object(l.b)((e=>({isRtl:e.locales.isRtl})))(We),Qe=n(51),Ye=n.n(Qe),Ve=n(131),qe=n(37);const Je=Object(m.g)({forAllSpritesMessage:{id:\"gui.gui.variableScopeOptionAllSprites\",defaultMessage:\"For all sprites\"},forThisSpriteMessage:{id:\"gui.gui.variableScopeOptionSpriteOnly\",defaultMessage:\"For this sprite only\"},cloudVarOptionMessage:{id:\"gui.gui.cloudVariableOption\",defaultMessage:\"Cloud variable (stored on server)\"},availableToAllSpritesMessage:{id:\"gui.gui.variablePromptAllSpritesMessage\",defaultMessage:\"This variable will be available to all sprites.\"},listAvailableToAllSpritesMessage:{id:\"gui.gui.listPromptAllSpritesMessage\",defaultMessage:\"This list will be available to all sprites.\"}}),Xe=()=>o.a.createElement(\"a\",{href:\"https://packager.turbowarp.org\",target:\"_blank\",rel:\"noopener noreferrer\"},\"TurboWarp Packager\"),Ke=e=>o.a.createElement(He,{className:Ye.a.modalContent,contentLabel:e.title,onRequestClose:e.onCancel,id:\"promptModal\"},o.a.createElement(Oe.a,{className:Ye.a.body},o.a.createElement(Oe.a,{className:Ye.a.label},e.label),o.a.createElement(Oe.a,null,o.a.createElement(\"input\",{autoFocus:!0,className:Ye.a.variableNameTextInput,defaultValue:e.defaultValue,name:e.label,onChange:e.onChange,onFocus:e.onFocus,onKeyPress:e.onKeyPress})),e.showVariableOptions?o.a.createElement(\"div\",null,e.isStage?o.a.createElement(\"div\",{className:Ye.a.infoMessage},e.showListMessage?o.a.createElement(m.b,Je.listAvailableToAllSpritesMessage):o.a.createElement(m.b,Je.availableToAllSpritesMessage)):o.a.createElement(Oe.a,{className:Ye.a.optionsRow},o.a.createElement(\"label\",null,o.a.createElement(\"input\",{checked:e.globalSelected,name:\"variableScopeOption\",type:\"radio\",value:\"global\",onChange:e.onScopeOptionSelection}),o.a.createElement(m.b,Je.forAllSpritesMessage)),o.a.createElement(\"label\",{className:ye()({[Ye.a.disabledLabel]:e.cloudSelected})},o.a.createElement(\"input\",{checked:!e.globalSelected,disabled:e.cloudSelected,name:\"variableScopeOption\",type:\"radio\",value:\"local\",onChange:e.onScopeOptionSelection}),o.a.createElement(m.b,Je.forThisSpriteMessage))),e.showCloudOption?o.a.createElement(Oe.a,{className:ye()(Ye.a.cloudOption)},o.a.createElement(\"label\",{className:ye()({[Ye.a.disabledLabel]:!e.canAddCloudVariable})},o.a.createElement(\"input\",{checked:e.cloudSelected&&e.canAddCloudVariable,disabled:!e.canAddCloudVariable,type:\"checkbox\",onChange:e.onCloudVarOptionChange}),o.a.createElement(m.b,Je.cloudVarOptionMessage))):null):null,e.cloudSelected&&!e.isAddingCloudVariableScratchSafe&&o.a.createElement(Oe.a,{className:Ye.a.infoMessage},o.a.createElement(m.b,{defaultMessage:\"If you make this cloud variable, the project will exceed Scratch's limit of {number} variables, and some variables will not function if you upload the project to Scratch.\",id:\"tw.scratchUnsafeCloud\",values:{number:Ve.b}})),e.cloudSelected&&e.canAddCloudVariable&&o.a.createElement(Oe.a,{className:Ye.a.infoMessage},Object(qe.a)()?o.a.createElement(m.b,{defaultMessage:\"In the desktop app, cloud variables sync between all desktop app windows on this computer. Upload the project to Scratch or use a tool like the {packager} for them to sync globally.\",values:{packager:o.a.createElement(Xe,null)},id:\"tw.desktopCloud\"}):o.a.createElement(m.b,{defaultMessage:\"Although you can create cloud variables, they won't work unless this project is uploaded to Scratch or converted using a tool like the {packager}.\",values:{packager:o.a.createElement(Xe,null)},id:\"tw.cantUseCloud\"})),o.a.createElement(Oe.a,{className:Ye.a.buttonRow},o.a.createElement(\"button\",{className:Ye.a.cancelButton,onClick:e.onCancel},o.a.createElement(m.b,{defaultMessage:\"Cancel\",id:\"gui.prompt.cancel\"})),o.a.createElement(\"button\",{className:Ye.a.okButton,onClick:e.onOk},o.a.createElement(m.b,{defaultMessage:\"OK\",id:\"gui.prompt.ok\"})))));Ke.propTypes={isAddingCloudVariableScratchSafe:i.a.bool.isRequired,canAddCloudVariable:i.a.bool.isRequired,cloudSelected:i.a.bool.isRequired,defaultValue:i.a.string,globalSelected:i.a.bool.isRequired,isStage:i.a.bool.isRequired,showListMessage:i.a.bool.isRequired,label:i.a.string.isRequired,onCancel:i.a.func.isRequired,onChange:i.a.func.isRequired,onCloudVarOptionChange:i.a.func,onFocus:i.a.func.isRequired,onKeyPress:i.a.func.isRequired,onOk:i.a.func.isRequired,onScopeOptionSelection:i.a.func.isRequired,showCloudOption:i.a.bool.isRequired,showVariableOptions:i.a.bool.isRequired,title:i.a.string.isRequired};var $e=Ke;class et extends o.a.Component{constructor(e){super(e),E()(this,[\"handleOk\",\"handleScopeOptionSelection\",\"handleCancel\",\"handleChange\",\"handleKeyPress\",\"handleCloudVariableOptionChange\"]),this.state={isAddingCloudVariableScratchSafe:e.vm&&e.vm.runtime.getNumberOfCloudVariables(){const{containerRef:t,dragOver:n}=e,a=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a{let{className:t,intl:n,isPlaying:a,onClick:r,onMouseDown:i,onMouseEnter:s,onMouseLeave:l,setButtonRef:c}=e,d=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a0&&o.a.createElement(\"div\",{className:St.a.extensionLinks},o.a.createElement(\"div\",null,o.a.createElement(m.b,{defaultMessage:\"Created by:\",id:\"tw.createdBy\"}),\" \",this.props.credits.map(((e,t)=>o.a.createElement(o.a.Fragment,{key:t},e,t!==this.props.credits.length-1&&\", \"))))),this.props.bluetoothRequired||this.props.internetConnectionRequired||this.props.collaborator?o.a.createElement(\"div\",{className:St.a.featuredExtensionMetadata},o.a.createElement(\"div\",{className:St.a.featuredExtensionRequirement},this.props.bluetoothRequired||this.props.internetConnectionRequired?o.a.createElement(\"div\",null,o.a.createElement(\"div\",null,o.a.createElement(m.b,{defaultMessage:\"Requires\",id:\"gui.extensionLibrary.requires\"})),o.a.createElement(\"div\",{className:St.a.featuredExtensionMetadataDetail},this.props.bluetoothRequired?o.a.createElement(\"img\",{src:Et.a,draggable:!1}):null,this.props.internetConnectionRequired?o.a.createElement(\"img\",{src:Nt.a,draggable:!1}):null)):null),o.a.createElement(\"div\",{className:St.a.featuredExtensionCollaboration},this.props.collaborator?o.a.createElement(\"div\",null,o.a.createElement(\"div\",null,o.a.createElement(m.b,{defaultMessage:\"Collaboration with\",id:\"gui.extensionLibrary.collaboration\"})),o.a.createElement(\"div\",{className:St.a.featuredExtensionMetadataDetail},this.props.collaborator)):null)):null,t):o.a.createElement(Oe.a,{className:ye()(St.a.libraryItem,{[St.a.hidden]:this.props.hidden}),role:\"button\",tabIndex:\"0\",onBlur:this.props.onBlur,onClick:this.props.onClick,onFocus:this.props.onFocus,onKeyPress:this.props.onKeyPress,onMouseEnter:this.props.showPlayButton?null:this.props.onMouseEnter,onMouseLeave:this.props.showPlayButton?null:this.props.onMouseLeave},o.a.createElement(Oe.a,{className:St.a.libraryItemImageContainerWrapper},o.a.createElement(Oe.a,{className:St.a.libraryItemImageContainer,onMouseEnter:this.props.showPlayButton?this.props.onMouseEnter:null,onMouseLeave:this.props.showPlayButton?this.props.onMouseLeave:null},o.a.createElement(\"img\",{className:St.a.libraryItemImage,loading:\"lazy\",src:this.props.iconURL,draggable:!1}))),o.a.createElement(\"span\",{className:St.a.libraryItemName},this.props.name),this.props.showPlayButton?o.a.createElement(jt,{isPlaying:this.props.isPlaying,onPlay:this.props.onPlay,onStop:this.props.onStop}):null,t)}}Pt.propTypes={intl:m.i,bluetoothRequired:i.a.bool,collaborator:i.a.string,description:i.a.oneOfType([i.a.string,i.a.node]),disabled:i.a.bool,extensionId:i.a.string,featured:i.a.bool,hidden:i.a.bool,iconURL:i.a.string,insetIconURL:i.a.string,internetConnectionRequired:i.a.bool,isPlaying:i.a.bool,name:i.a.oneOfType([i.a.string,i.a.node]),credits:i.a.arrayOf(i.a.oneOfType([i.a.string,i.a.node])),docsURI:i.a.string,samples:i.a.arrayOf(i.a.shape({href:i.a.string,text:i.a.string})),favorite:i.a.bool,onFavorite:i.a.func,onBlur:i.a.func.isRequired,onClick:i.a.func.isRequired,onFocus:i.a.func.isRequired,onKeyPress:i.a.func.isRequired,onMouseEnter:i.a.func.isRequired,onMouseLeave:i.a.func.isRequired,onPlay:i.a.func.isRequired,onStop:i.a.func.isRequired,showPlayButton:i.a.bool},Pt.defaultProps={disabled:!1,showPlayButton:!1};var zt=Pt;const Lt=Object(m.g)({incompatible:{id:\"tw.confirmIncompatibleExtension\",defaultMessage:\"This extension is incompatible with Scratch. Projects made with it cannot be uploaded to the Scratch website. Are you sure you want to enable it?\"}});class Rt extends o.a.PureComponent{constructor(e){super(e),E()(this,[\"handleBlur\",\"handleClick\",\"handleFavorite\",\"handleFocus\",\"handleKeyPress\",\"handleMouseEnter\",\"handleMouseLeave\",\"handlePlay\",\"handleStop\",\"rotateIcon\",\"startRotatingIcons\",\"stopRotatingIcons\"]),this.state={iconIndex:0,isRotatingIcon:!1}}componentWillUnmount(){clearInterval(this.intervalId)}handleBlur(e){this.handleMouseLeave(e)}handleClick(e){e.target.closest(\"a\")||(this.props.favorite||!this.props.incompatibleWithScratch||e.shiftKey||confirm(this.props.intl.formatMessage(Lt.incompatible)))&&(this.props.disabled||(this.props.href?window.open(this.props.href):this.props.onSelect(this.props.id)),e.preventDefault())}handleFavorite(e){e.stopPropagation(),this.props.onFavorite(this.props.id)}handleFocus(e){this.props.showPlayButton||this.handleMouseEnter(e)}handleKeyPress(e){\" \"!==e.key&&\"Enter\"!==e.key||(e.preventDefault(),this.props.onSelect(this.props.id))}handleMouseEnter(){this.props.showPlayButton||(this.props.onMouseEnter(this.props.id),this.props.icons&&this.props.icons.length&&(this.stopRotatingIcons(),this.setState({isRotatingIcon:!0},this.startRotatingIcons)))}handleMouseLeave(){this.props.showPlayButton||(this.props.onMouseLeave(this.props.id),this.props.icons&&this.props.icons.length&&this.setState({isRotatingIcon:!1},this.stopRotatingIcons))}handlePlay(){this.props.onMouseEnter(this.props.id)}handleStop(){this.props.onMouseLeave(this.props.id)}startRotatingIcons(){this.rotateIcon(),this.intervalId=setInterval(this.rotateIcon,300)}stopRotatingIcons(){this.intervalId&&(this.intervalId=clearInterval(this.intervalId))}rotateIcon(){const e=(this.state.iconIndex+1)%this.props.icons.length;this.setState({iconIndex:e})}curIconMd5(){const e=this.props.iconMd5;if(this.props.icons&&this.state.isRotatingIcon&&this.state.iconIndex{let{src:t}=e,n=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a({theme:e.scratchGui.theme.theme})),(()=>({})))(Zt);const Ht='\\n \\n\\n';var Qt=()=>{const e=\"object\"==typeof Recolor?Ht.replace(/#855cd6/gi,Recolor.primary):Ht;return\"data:image/svg+xml;,\"+encodeURIComponent(e)};const Yt='\\n \\n\\n';var Vt=()=>{const e=\"object\"==typeof Recolor?Yt.replace(/#855cd6/gi,Recolor.primary):Yt;return\"data:image/svg+xml;,\"+encodeURIComponent(e)},qt=n(123),Jt=n.n(qt);const Xt=e=>{const{className:t,onChange:n,onClear:a,placeholderText:r,filterQuery:i,inputClassName:s}=e;return o.a.createElement(\"div\",{className:ye()(t,Jt.a.filter,{[Jt.a.isActive]:i.length>0})},o.a.createElement(Wt,{className:Jt.a.filterIcon,src:Qt}),o.a.createElement(\"input\",{className:ye()(Jt.a.filterInput,s),placeholder:r,type:\"text\",value:i,onChange:n}),o.a.createElement(\"div\",{className:Jt.a.xIconWrapper,onClick:a},o.a.createElement(Wt,{className:Jt.a.xIcon,src:Vt})))};Xt.propTypes={className:i.a.string,filterQuery:i.a.string,inputClassName:i.a.string,onChange:i.a.func,onClear:i.a.func,placeholderText:i.a.string},Xt.defaultProps={placeholderText:\"Search\"};var Kt=Xt,$t=n(197),en=n.n($t);const tn=[\"active\",\"iconClassName\",\"className\",\"tag\",\"intlLabel\"];function nn(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function an(e){for(var t=1;t{let{active:t,iconClassName:n,className:a,tag:r,intlLabel:i}=e,s=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;ao.a.createElement(\"hr\",{className:wn.a.separator}),Mn=n(311),vn=n.n(Mn);var yn=()=>o.a.createElement(\"div\",{className:vn.a.removedTrademarks},o.a.createElement(m.b,{defaultMessage:\"Some items that contained Scratch trademarks are no longer listed here.\",id:\"tw.removedTrademarks\"})),kn=n(65),jn=n.n(kn);function In(){return In=Object.assign?Object.assign.bind():function(e){for(var t=1;t{this.setState({canDisplay:!0})})),this.props.setStopHandler&&this.props.setStopHandler(this.handlePlayingEnd)}componentDidUpdate(e,t){if(t.filterQuery===this.state.filterQuery&&t.selectedTag===this.state.selectedTag||this.scrollToTop(),this.state.favorites!==t.favorites)try{localStorage.setItem(this.getFavoriteStorageKey(),JSON.stringify(this.state.favorites))}catch(e){}}handleSelect(e){this.handleClose(),this.props.onItemSelected(this.getFilteredData()[e])}readFavoritesFromStorage(){let e;try{e=JSON.parse(localStorage.getItem(this.getFavoriteStorageKey()))}catch(e){}return Array.isArray(e)||(e=[]),e}getFavoriteStorageKey(){return\"tw:library-favorites:\".concat(this.props.id)}handleFavorite(e){const t=this.getFilteredData()[e][this.props.persistableKey];this.setState((e=>({favorites:e.favorites.includes(t)?e.favorites.filter((e=>e!==t)):[...e.favorites,t]})))}handleClose(){this.props.onRequestClose()}handleTagClick(e){null===this.state.playingItem?this.setState({filterQuery:\"\",selectedTag:e.toLowerCase()}):(this.props.onItemMouseLeave(this.getFilteredData()[[this.state.playingItem]]),this.setState({filterQuery:\"\",playingItem:null,selectedTag:e.toLowerCase()}))}handleMouseEnter(e){this.props.onItemMouseEnter&&this.state.playingItem!==e&&(this.props.onItemMouseEnter(this.getFilteredData()[e]),this.setState({playingItem:e}))}handleMouseLeave(e){this.props.onItemMouseLeave&&(this.props.onItemMouseLeave(this.getFilteredData()[e]),this.setState({playingItem:null}))}handlePlayingEnd(){null!==this.state.playingItem&&this.setState({playingItem:null})}handleFilterChange(e){null===this.state.playingItem?this.setState({filterQuery:e.target.value,selectedTag:Nn.tag}):(this.props.onItemMouseLeave(this.getFilteredData()[[this.state.playingItem]]),this.setState({filterQuery:e.target.value,playingItem:null,selectedTag:Nn.tag}))}handleFilterClear(){this.setState({filterQuery:\"\"})}getFilteredData(){if(\"all\"===this.state.selectedTag&&!this.state.filterQuery){const e=this.props.data.filter((e=>this.state.initialFavorites.includes(e[this.props.persistableKey]))).map((e=>xn(xn({},e),{},{key:\"favorite-\".concat(e[this.props.persistableKey])})));return e.length&&e.push(\"---\"),[...e,...this.props.data]}const e=[],t=[];for(const n of this.props.data)\"---\"===n||(this.state.initialFavorites.includes(n[this.props.persistableKey])?e.push(n):t.push(n));let n=e.concat(t);return\"all\"!==this.state.selectedTag&&(n=n.filter((e=>e.tags&&e.tags.map((e=>e.toLowerCase())).includes(this.state.selectedTag)))),this.state.filterQuery&&(n=n.filter((e=>{const t=[...e.tags];return e.name&&(\"string\"==typeof e.name?t.push(e.name):t.push(this.props.intl.formatMessage(e.name.props,{APP_NAME:ct.APP_NAME}))),e.description&&(\"string\"==typeof e.description?t.push(e.description):t.push(this.props.intl.formatMessage(e.description.props,{APP_NAME:ct.APP_NAME}))),t.join(\"\\n\").toLowerCase().includes(this.state.filterQuery.toLowerCase())}))),n}scrollToTop(){this.filteredDataRef.scrollTop=0}setFilteredDataRef(e){this.filteredDataRef=e}render(){const e=this.state.canDisplay&&this.props.data&&this.getFilteredData();return o.a.createElement(He,{fullScreen:!0,contentLabel:this.props.title,id:this.props.id,onRequestClose:this.handleClose},(this.props.filterable||this.props.tags)&&o.a.createElement(\"div\",{className:jn.a.filterBar},this.props.filterable&&o.a.createElement(Kt,{className:ye()(jn.a.filterBarItem,jn.a.filter),filterQuery:this.state.filterQuery,inputClassName:jn.a.filterInput,placeholderText:this.props.intl.formatMessage(Cn.filterPlaceholder),onChange:this.handleFilterChange,onClear:this.handleFilterClear}),this.props.filterable&&this.props.tags&&o.a.createElement(Bt.a,{className:ye()(jn.a.filterBarItem,jn.a.divider)}),this.props.tags&&o.a.createElement(\"div\",{className:jn.a.tagWrapper},_n.concat(this.props.tags).map(((e,t)=>o.a.createElement(gn,In({active:this.state.selectedTag===e.tag.toLowerCase(),className:ye()(jn.a.filterBarItem,jn.a.tagButton,e.className),key:\"tag-button-\".concat(t),onClick:this.handleTagClick},e)))))),o.a.createElement(\"div\",{className:ye()(jn.a.libraryScrollGrid,{[jn.a.withFilterBar]:this.props.filterable||this.props.tags}),ref:this.setFilteredDataRef},e&&this.getFilteredData().map(((e,t)=>\"---\"===e?o.a.createElement(fn,{key:t}):o.a.createElement(Ut,{bluetoothRequired:e.bluetoothRequired,collaborator:e.collaborator,description:e.description,disabled:e.disabled,extensionId:e.extensionId,href:e.href,featured:e.featured,hidden:e.hidden,iconMd5:e.costumes?e.costumes[0].md5ext:e.md5ext,iconRawURL:e.rawURL,icons:e.costumes,id:t,incompatibleWithScratch:e.incompatibleWithScratch,favorite:this.state.favorites.includes(e[this.props.persistableKey]),onFavorite:this.handleFavorite,insetIconURL:e.insetIconURL,internetConnectionRequired:e.internetConnectionRequired,isPlaying:this.state.playingItem===t,key:e.key||(\"string\"==typeof e.name?e.name:e.rawURL),name:e.name,credits:e.credits,samples:e.samples,docsURI:e.docsURI,showPlayButton:this.props.showPlayButton,onMouseEnter:this.handleMouseEnter,onMouseLeave:this.handleMouseLeave,onSelect:this.handleSelect}))),e&&this.props.removedTrademarks&&o.a.createElement(o.a.Fragment,null,e.length>0&&o.a.createElement(fn,null),o.a.createElement(yn,null)),!e&&o.a.createElement(\"div\",{className:jn.a.spinnerWrapper},o.a.createElement(hn.a,{large:!0,level:\"primary\"}))))}}Dn.propTypes={data:i.a.oneOfType([i.a.arrayOf(i.a.oneOfType([i.a.shape({md5:i.a.string,name:i.a.oneOfType([i.a.string,i.a.node]),rawURL:i.a.string}),i.a.string])),i.a.instanceOf(Promise)]),filterable:i.a.bool,id:i.a.string.isRequired,persistableKey:i.a.string,intl:m.i.isRequired,onItemMouseEnter:i.a.func,onItemMouseLeave:i.a.func,onItemSelected:i.a.func,onRequestClose:i.a.func,setStopHandler:i.a.func,showPlayButton:i.a.bool,tags:i.a.arrayOf(i.a.shape(gn.propTypes)),title:i.a.string.isRequired,removedTrademarks:i.a.bool},Dn.defaultProps={filterable:!0,persistableKey:\"name\",showPlayButton:!1};var Tn=Object(m.h)(Dn),On=n(186),An=n.n(On);function Pn(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function zn(e){for(var t=1;t\"object\"==typeof e?zn({rawURL:e.iconURL||An.a},e):e;let Bn=null;class Gn extends o.a.PureComponent{constructor(e){super(e),E()(this,[\"handleItemSelect\"]),this.state={gallery:Bn,galleryError:null,galleryTimedOut:!1}}componentDidMount(){if(!this.state.gallery){const e=setTimeout((()=>{this.setState({galleryTimedOut:!0})}),750);(async()=>{const e=await fetch(\"https://extensions.turbowarp.org/generated-metadata/extensions-v0.json\");if(!e.ok)throw new Error(\"HTTP status \".concat(e.status));return(await e.json()).extensions.map((e=>({name:e.name,nameTranslations:e.nameTranslations||{},description:e.description,descriptionTranslations:e.descriptionTranslations||{},extensionId:e.id,extensionURL:\"https://extensions.turbowarp.org/\".concat(e.slug,\".js\"),iconURL:\"https://extensions.turbowarp.org/\".concat(e.image||\"images/unknown.svg\"),tags:[\"tw\"],credits:[...e.original||[],...e.by||[]].map((e=>e.link?o.a.createElement(\"a\",{href:e.link,target:\"_blank\",rel:\"noreferrer\",key:e.name},e.name):e.name)),docsURI:e.docs?\"https://extensions.turbowarp.org/\".concat(e.slug):null,samples:e.samples?e.samples.map((e=>({href:\"\".concat(\"\",\"editor?project_url=https://extensions.turbowarp.org/samples/\").concat(encodeURIComponent(e),\".sb3\"),text:e}))):null,incompatibleWithScratch:!e.scratchCompatible,featured:!0})))})().then((t=>{Bn=t,this.setState({gallery:t}),clearTimeout(e)})).catch((t=>{N.default.error(t),this.setState({galleryError:t}),clearTimeout(e)}))}}handleItemSelect(e){if(e.href)return;const t=e.extensionId;if(\"custom_extension\"===t)return void this.props.onOpenCustomExtensionModal();if(\"procedures_enable_return\"===t)return this.props.onEnableProcedureReturns(),void this.props.onCategorySelected(\"myBlocks\");const n=e.extensionURL?e.extensionURL:t;e.disabled||(this.props.vm.extensionManager.isExtensionLoaded(t)?this.props.onCategorySelected(t):this.props.vm.extensionManager.loadExtensionURL(n).then((()=>{this.props.onCategorySelected(t)})).catch((e=>{N.default.error(e),alert(e)})))}render(){let e=null;if(this.state.gallery||this.state.galleryError||this.state.galleryTimedOut)if(e=lt.a.map(Un),e.push(\"---\"),this.state.gallery){e.push(Un(lt.d));const t=this.props.intl.locale;e.push(...this.state.gallery.filter((e=>\"faceSensing\"!==e.extensionId)).map((e=>((e,t)=>zn(zn({},e),{},{name:e.nameTranslations[t]||e.name,description:e.descriptionTranslations[t]||e.description}))(e,t))).map(Un))}else this.state.galleryError?e.push(Un(lt.b)):e.push(Un(lt.c));return o.a.createElement(Tn,{data:e,filterable:!0,persistableKey:\"extensionId\",id:\"extensionLibrary\",tags:dt,title:this.props.intl.formatMessage(Rn.extensionTitle),visible:this.props.visible,onItemSelected:this.handleItemSelect,onRequestClose:this.props.onRequestClose})}}Gn.propTypes={intl:m.i.isRequired,onCategorySelected:i.a.func,onEnableProcedureReturns:i.a.func,onOpenCustomExtensionModal:i.a.func,onRequestClose:i.a.func,visible:i.a.bool,vm:i.a.instanceOf(p.a).isRequired};var Fn=Object(m.h)(Gn),Zn=n(312),Wn=n.n(Zn),Hn=n(313),Qn=n.n(Hn),Yn=n(314),Vn=n.n(Yn),qn=n(38),Jn=n.n(qn);const Xn=Object(m.g)({myblockModalTitle:{id:\"gui.customProcedures.myblockModalTitle\",defaultMessage:\"Make a Block\"}}),Kn=e=>o.a.createElement(He,{className:Jn.a.modalContent,contentLabel:e.intl.formatMessage(Xn.myblockModalTitle),onRequestClose:e.onCancel,id:\"customProceduresModal\"},o.a.createElement(Oe.a,{className:Jn.a.workspace,componentRef:e.componentRef}),o.a.createElement(Oe.a,{className:Jn.a.body},o.a.createElement(\"div\",{className:Jn.a.optionsRow},o.a.createElement(\"div\",{className:Jn.a.optionCard,role:\"button\",tabIndex:\"0\",onClick:e.onAddTextNumber},o.a.createElement(\"img\",{className:Jn.a.optionIcon,src:Qn.a,draggable:!1}),o.a.createElement(\"div\",{className:Jn.a.optionTitle},o.a.createElement(m.b,{defaultMessage:\"Add an input\",id:\"gui.customProcedures.addAnInputNumberText\"})),o.a.createElement(\"div\",{className:Jn.a.optionDescription},o.a.createElement(m.b,{defaultMessage:\"number or text\",id:\"gui.customProcedures.numberTextType\"}))),o.a.createElement(\"div\",{className:Jn.a.optionCard,role:\"button\",tabIndex:\"0\",onClick:e.onAddBoolean},o.a.createElement(\"img\",{className:Jn.a.optionIcon,src:Wn.a,draggable:!1}),o.a.createElement(\"div\",{className:Jn.a.optionTitle},o.a.createElement(m.b,{defaultMessage:\"Add an input\",id:\"gui.customProcedures.addAnInputBoolean\"})),o.a.createElement(\"div\",{className:Jn.a.optionDescription},o.a.createElement(m.b,{defaultMessage:\"boolean\",id:\"gui.customProcedures.booleanType\"}))),o.a.createElement(\"div\",{className:Jn.a.optionCard,role:\"button\",tabIndex:\"0\",onClick:e.onAddLabel},o.a.createElement(\"img\",{className:Jn.a.optionIcon,src:Vn.a,draggable:!1}),o.a.createElement(\"div\",{className:Jn.a.optionTitle},o.a.createElement(m.b,{defaultMessage:\"Add a label\",id:\"gui.customProcedures.addALabel\"})))),o.a.createElement(\"div\",{className:Jn.a.checkboxRow},o.a.createElement(\"label\",null,o.a.createElement(\"input\",{checked:e.warp,type:\"checkbox\",onChange:e.onToggleWarp}),o.a.createElement(m.b,{defaultMessage:\"Run without screen refresh\",id:\"gui.customProcedures.runWithoutScreenRefresh\"}))),o.a.createElement(Oe.a,{className:Jn.a.buttonRow},o.a.createElement(\"button\",{className:Jn.a.cancelButton,onClick:e.onCancel},o.a.createElement(m.b,{defaultMessage:\"Cancel\",id:\"gui.customProcedures.cancel\"})),o.a.createElement(\"button\",{className:Jn.a.okButton,onClick:e.onOk},o.a.createElement(m.b,{defaultMessage:\"OK\",id:\"gui.customProcedures.ok\"})))));Kn.propTypes={componentRef:i.a.func.isRequired,intl:m.i,onAddBoolean:i.a.func.isRequired,onAddLabel:i.a.func.isRequired,onAddTextNumber:i.a.func.isRequired,onCancel:i.a.func.isRequired,onOk:i.a.func.isRequired,onToggleWarp:i.a.func.isRequired,warp:i.a.bool.isRequired};var $n=Object(m.h)(Kn);class ea extends o.a.Component{constructor(e){super(e),E()(this,[\"handleAddLabel\",\"handleAddBoolean\",\"handleAddTextNumber\",\"handleToggleWarp\",\"handleCancel\",\"handleOk\",\"setBlocks\"]),this.state={rtlOffset:0,warp:!1}}componentWillUnmount(){this.workspace&&this.workspace.dispose()}setBlocks(e){if(!e)return;this.blocks=e;const t=_e()({},ea.defaultOptions,this.props.options,{rtl:this.props.isRtl}),n=te.a.get(),a=n.Blocks.defaultToolbox;n.Blocks.defaultToolbox=null,this.workspace=n.inject(this.blocks,t),n.Blocks.defaultToolbox=a,this.mutationRoot=this.workspace.newBlock(\"procedures_declaration\"),this.mutationRoot.setMovable(!1),this.mutationRoot.setDeletable(!1),this.mutationRoot.contextMenu=!1,this.workspace.addChangeListener((()=>{this.mutationRoot.onChangeFn();const e=this.workspace.getMetrics(),{x:t,y:n}=this.mutationRoot.getRelativeToSurfaceXY(),a=e.viewHeight/2-this.mutationRoot.height/2-n;let o;if(this.props.isRtl){const n=e.viewWidth/2-this.mutationRoot.width/2+25,r=t-2*(t-this.state.rtlOffset);if(r===n)return;o=r-n;const i=e.viewWidth/2;if(0===t)return o=this.mutationRoot.widthe.viewWidth&&(o=o+this.mutationRoot.width-e.viewWidth)}else o=e.viewWidth/2-this.mutationRoot.width/2-t,this.mutationRoot.width>e.viewWidth&&(o=e.viewWidth-this.mutationRoot.width-t);this.mutationRoot.moveBy(o,a)})),this.mutationRoot.domToMutation(this.props.mutator),this.mutationRoot.initSvg(),this.mutationRoot.render(),this.setState({warp:this.mutationRoot.getWarp()}),setTimeout((()=>{this.mutationRoot.focusLastEditor_()}))}handleCancel(){this.props.onRequestClose()}handleOk(){const e=this.mutationRoot?this.mutationRoot.mutationToDom(!0):null;this.props.onRequestClose(e)}handleAddLabel(){this.mutationRoot&&this.mutationRoot.addLabelExternal()}handleAddBoolean(){this.mutationRoot&&this.mutationRoot.addBooleanExternal()}handleAddTextNumber(){this.mutationRoot&&this.mutationRoot.addStringNumberExternal()}handleToggleWarp(){if(this.mutationRoot){const e=!this.mutationRoot.getWarp();this.mutationRoot.setWarp(e),this.setState({warp:e})}}render(){return o.a.createElement($n,{componentRef:this.setBlocks,warp:this.state.warp,onAddBoolean:this.handleAddBoolean,onAddLabel:this.handleAddLabel,onAddTextNumber:this.handleAddTextNumber,onCancel:this.handleCancel,onOk:this.handleOk,onToggleWarp:this.handleToggleWarp})}}ea.propTypes={isRtl:i.a.bool,mutator:i.a.instanceOf(Element),onRequestClose:i.a.func.isRequired,options:i.a.shape({media:i.a.string,zoom:i.a.shape({controls:i.a.bool,wheel:i.a.bool,startScale:i.a.number}),comments:i.a.bool,collapse:i.a.bool})},ea.defaultOptions={zoom:{controls:!1,wheel:!1,startScale:.9},comments:!1,collapse:!1,scrollbars:!0},ea.defaultProps={options:ea.defaultOptions};var ta=Object(l.b)((e=>({isRtl:e.locales.isRtl,mutator:e.scratchGui.customProcedures.mutator})))(ea),na=n(16);function aa(){return aa=Object.assign?Object.assign.bind():function(e){for(var t=1;ti&&ea&&n({dragInfo:e.scratchGui.assetDrag})),(()=>({})))(n)}},ra={SOUND:\"SOUND\",COSTUME:\"COSTUME\",SPRITE:\"SPRITE\",CODE:\"CODE\",BACKPACK_SOUND:\"BACKPACK_SOUND\",BACKPACK_COSTUME:\"BACKPACK_COSTUME\",BACKPACK_SPRITE:\"BACKPACK_SPRITE\",BACKPACK_CODE:\"BACKPACK_CODE\"},ia=n(129),sa=n.n(ia),la=n(70),ca=n.n(la),da=n(15);function ua(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function pa(e){for(var t=1;te.getBlockColors().pen,ha=(e,t)=>{var n;if(t.blocks===da.j)return e;if(null===(n=e.extensions)||void 0===n||!n.includes(\"default_extension_colors\")){const n=t.getCustomExtensionColors();return pa(pa({},e),{},{colour:n.primary(e.colour),colourSecondary:n.secondary(e.colour),colourTertiary:n.tertiary(e.colour),colourQuaternary:n.quaternary(e.colour)})}const a=ga(t);return pa(pa({},((e,t)=>{if(!e.args0||e.args0.length<1||\"field_image\"!==e.args0[0].type)return e;const n=(a=t.getExtensions()[e.type.substring(0,e.type.indexOf(\"_\"))],a?a.blockIconURI||a.menuIconURI:null);var a;return n?pa(pa({},e),{},{args0:e.args0.map(((e,t)=>0!==t?e:pa(pa({},e),{},{src:n})))}):e})(e,t)),{},{colour:a.primary,colourSecondary:a.secondary,colourTertiary:a.tertiary,colourQuaternary:a.quaternary})};var ba=(e,t,n,a,o)=>({init:function(){const e=ha(n.json,o),r={type:a,inputsInline:!0,category:t.name,colour:e.colour,colourSecondary:e.colourSecondary,colourTertiary:e.colourTertiary,colourQuaternary:e.colourQuaternary};(n.blockIconURI||t.blockIconURI)&&(r.extensions=[\"scratch_extension\"]),this.jsonInit(r),this.blockInfoText=\"{}\",this.needsBlockInfoUpdate=!0},mutationToDom:function(){const e=document.createElement(\"mutation\");return e.setAttribute(\"blockInfo\",this.blockInfoText),e},domToMutation:function(t){const n=t.getAttribute(\"blockInfo\");if(!n)return;if(!this.needsBlockInfoUpdate)throw new Error(\"Attempted to update block info twice\");delete this.needsBlockInfoUpdate,this.blockInfoText=n;const a=JSON.parse(n);switch(a.blockType){case ca.a.COMMAND:case ca.a.CONDITIONAL:case ca.a.LOOP:this.setOutputShape(e.OUTPUT_SHAPE_SQUARE),this.setPreviousStatement(!0),this.setNextStatement(!a.isTerminal);break;case ca.a.REPORTER:this.setOutput(!0),this.setOutputShape(e.OUTPUT_SHAPE_ROUND),a.disableMonitor||this.setCheckboxInFlyout(!0);break;case ca.a.BOOLEAN:this.setOutput(!0),this.setOutputShape(e.OUTPUT_SHAPE_HEXAGONAL);break;case ca.a.HAT:case ca.a.EVENT:this.setOutputShape(e.OUTPUT_SHAPE_SQUARE),this.setNextStatement(!0)}(a.color1||a.color2||a.color3)&&this.setColour(a.color1,a.color2,a.color3);const o=a.text,r=[];let i=0;const s=o.replace(/\\[(.+?)]/g,((e,t)=>{switch(a.arguments[t].type){case sa.a.STRING:r.push({type:\"input_value\",name:t});break;case sa.a.BOOLEAN:r.push({type:\"input_value\",name:t,check:\"Boolean\"})}return\"%\".concat(++i)}));this.interpolate_(s,r)}}),wa=n(159),fa=n(109),Ma=n(136),va=n(118),ya=n(160),ka=n(72),ja=n(231),Ia=n.n(ja);var Sa=()=>o.a.createElement(\"div\",{className:Ia.a.container},o.a.createElement(\"div\",{className:Ia.a.spinner})),xa=n(181);var Ea=function(e){class t extends o.a.Component{constructor(e){super(e),this.state={loaded:te.a.isLoaded(),error:null},this.state.loaded||te.a.load().then((()=>{this.setState({loaded:!0})})).catch((e=>{N.default.error(e),this.setState({error:e})}))}handleReload(){location.reload()}render(){return null!==this.state.error?o.a.createElement(xa.a,{errorMessage:\"lazy scratch-blocks: \".concat(this.state.error),onReload:this.handleReload}):this.state.loaded?o.a.createElement(e,this.props):o.a.createElement(Sa,null)}}return t},Ca=n(429),Na=n.n(Ca);var _a=e=>new Promise(((t,n)=>{const a=new Image;a.onload=()=>{const e=document.createElement(\"canvas\"),n=e.getContext(\"2d\");a.height<1||a.width<1?e.width=e.height=96:(a.height>a.width?(e.height=96,e.width=96/a.height*a.width):(e.width=96,e.height=96/a.width*a.height),n.drawImage(a,0,0,e.width,e.height));const o=e.toDataURL(\"image/png\").replace(\"data:image/png;base64,\",\"\");t(o)},a.onerror=e=>{n(e)},a.src=e})),Da=n(430);const Ta=e=>{let{blockObjects:t,topBlockId:n}=e;const a={type:\"script\",name:\"code\",mime:\"application/json\",body:Da.Base64.encode(JSON.stringify(t))};return function(e){const t=te.a.get().getMainWorkspace().getBlockById(e).getSvgRoot().cloneNode(!0);return new Promise((e=>{setTimeout((()=>{t.style.display=\"\",t.innerHTML=t.innerHTML.replace(/ /g,\" \");const n=document.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\");n.appendChild(t),document.body.appendChild(n);const a=10+(\"hat\"===t.getAttribute(\"data-shapes\")?16:0);t.setAttribute(\"transform\",\"translate(\".concat(10,\" \").concat(a,\")\"));const o=t.getBoundingClientRect();n.setAttribute(\"width\",o.width+20),n.setAttribute(\"height\",o.height+20),Na()(n,{recursive:!0,properties:[\"fill\",\"font-family\",\"font-size\",\"font-weight\"]});const r=(new XMLSerializer).serializeToString(n);n.parentNode.removeChild(n),e(\"data:image/svg+xml;utf-8,\".concat(encodeURIComponent(r)))}),10)}))}(n).then(_a).then((e=>(a.thumbnail=e,a)))},Oa=e=>(e.extensionURLs?e.blocks:e).find((e=>e.topLevel)),Aa=(e,t,n)=>{const a=Oa(e);if(a){const{scrollX:e,scrollY:o,scale:r}=t||{scrollX:0,scrollY:0,scale:na.a},i=30-o;let s;s=n?e+30:30-e,a.x=s/r,a.y=i/r}return e},Pa=()=>{navigator.storage&&navigator.storage.persist&&navigator.storage.persist()},za=[\"anyModalVisible\",\"canUseCloud\",\"customStageSize\",\"customProceduresVisible\",\"extensionLibraryVisible\",\"options\",\"stageSize\",\"vm\",\"isRtl\",\"isVisible\",\"onActivateColorPicker\",\"onOpenConnectionModal\",\"onOpenSoundRecorder\",\"onOpenCustomExtensionModal\",\"reduxOnOpenCustomExtensionModal\",\"updateToolboxState\",\"onActivateCustomProcedures\",\"onRequestCloseExtensionLibrary\",\"onRequestCloseCustomProcedures\",\"toolboxXML\",\"updateMetrics\",\"useCatBlocks\",\"workspaceMetrics\"];function La(){return La=Object.assign?Object.assign.bind():function(e){for(var t=1;t{const a=e[t];e[t]=function(){for(var e=arguments.length,t=new Array(e),o=0;oe())),ne.a.blocklyCallbacks.length=[],E()(this,[\"attachVM\",\"detachVM\",\"getToolboxXML\",\"handleCategorySelected\",\"handleConnectionModalStart\",\"handleDrop\",\"handleStatusButtonUpdate\",\"handleOpenSoundRecorder\",\"handlePromptStart\",\"handlePromptCallback\",\"handlePromptClose\",\"handleCustomProceduresClose\",\"onScriptGlowOn\",\"onScriptGlowOff\",\"onBlockGlowOn\",\"onBlockGlowOff\",\"handleMonitorsUpdate\",\"handleExtensionAdded\",\"handleBlocksInfoUpdate\",\"onTargetsUpdate\",\"onVisualReport\",\"onWorkspaceUpdate\",\"onWorkspaceMetricsChange\",\"setBlocks\",\"setLocale\",\"handleEnableProcedureReturns\"]),this.ScratchBlocks.prompt=this.handlePromptStart,this.ScratchBlocks.statusButtonCallback=this.handleConnectionModalStart,this.ScratchBlocks.recordSoundCallback=this.handleOpenSoundRecorder,this.state={prompt:null},this.onTargetsUpdate=Ce()(this.onTargetsUpdate,100),this.toolboxUpdateQueue=[]}componentDidMount(){this.ScratchBlocks=Te(this.props.vm,this.props.useCatBlocks),this.ScratchBlocks.prompt=this.handlePromptStart,this.ScratchBlocks.statusButtonCallback=this.handleConnectionModalStart,this.ScratchBlocks.recordSoundCallback=this.handleOpenSoundRecorder,this.ScratchBlocks.FieldColourSlider.activateEyedropper_=this.props.onActivateColorPicker,this.ScratchBlocks.Procedures.externalProcedureDefCallback=this.props.onActivateCustomProcedures,this.ScratchBlocks.ScratchMsgs.setLocale(this.props.locale);const e=this.ScratchBlocks.Msg;e.PROCEDURES_RETURN=this.props.intl.formatMessage(Ra.PROCEDURES_RETURN,{v:\"%1\"}),e.PROCEDURES_TO_REPORTER=this.props.intl.formatMessage(Ra.PROCEDURES_TO_REPORTER),e.PROCEDURES_TO_STATEMENT=this.props.intl.formatMessage(Ra.PROCEDURES_TO_STATEMENT),e.PROCEDURES_DOCS=this.props.intl.formatMessage(Ra.PROCEDURES_DOCS);const t=_e()({},this.props.options,{rtl:this.props.isRtl,toolbox:this.props.toolboxXML,colours:this.props.theme.getBlockColors(),grid:{colour:this.props.theme.getBlockColors().gridColor}},Ga.defaultOptions);this.workspace=this.ScratchBlocks.inject(this.blocks,t),ne.a.blocklyWorkspace=this.workspace;const n=this.workspace.getFlyout().getWorkspace(),a=e=>()=>this.ScratchBlocks.Variables.createVariable(this.workspace,null,e);n.registerButtonCallback(\"MAKE_A_VARIABLE\",a(\"\")),n.registerButtonCallback(\"MAKE_A_LIST\",a(\"list\")),n.registerButtonCallback(\"MAKE_A_PROCEDURE\",(()=>{this.ScratchBlocks.Procedures.createProcedureDefCallback_(this.workspace)})),n.registerButtonCallback(\"EXTENSION_CALLBACK\",(e=>{this.props.vm.handleExtensionButtonPress(e.callbackData_)})),n.registerButtonCallback(\"OPEN_EXTENSION_DOCS\",(e=>{const t=e.callbackData_,n=new URL(t);\"http:\"!==n.protocol&&\"https:\"!==n.protocol||window.open(t,\"_blank\")})),n.registerButtonCallback(\"OPEN_RETURN_DOCS\",(()=>{window.open(\"https://docs.turbowarp.org/return\",\"_blank\")})),this._renderedToolboxXML=this.props.toolboxXML,this.setToolboxRefreshEnabled=this.workspace.setToolboxRefreshEnabled.bind(this.workspace),this.workspace.setToolboxRefreshEnabled=()=>{this.setToolboxRefreshEnabled(!1)},Ua(this.workspace,\"translate\",this.onWorkspaceMetricsChange),Ua(this.workspace,\"zoom\",this.onWorkspaceMetricsChange),this.props.vm.setCompilerOptions({warpTimer:!0}),this.attachVM(),this.props.isVisible&&this.setLocale();for(const e of this.props.vm.runtime._blockInfo)this.handleExtensionAdded(e);navigator.userAgent.includes(\"Firefox\")||Pa()}shouldComponentUpdate(e,t){return this.state.prompt!==t.prompt||this.props.isVisible!==e.isVisible||this._renderedToolboxXML!==e.toolboxXML||this.props.extensionLibraryVisible!==e.extensionLibraryVisible||this.props.customProceduresVisible!==e.customProceduresVisible||this.props.locale!==e.locale||this.props.anyModalVisible!==e.anyModalVisible||this.props.stageSize!==e.stageSize||this.props.customStageSize!==e.customStageSize}componentDidUpdate(e){this.props.anyModalVisible&&!e.anyModalVisible&&this.ScratchBlocks.hideChaff(),this.props.isVisible&&this.props.toolboxXML!==this._renderedToolboxXML&&this.requestToolboxUpdate(),this.props.isVisible!==e.isVisible?this.props.isVisible?(this.workspace.setVisible(!0),e.locale!==this.props.locale||this.props.locale!==this.props.vm.getLocale()?this.setLocale():(this.props.vm.refreshWorkspace(),this.requestToolboxUpdate()),window.dispatchEvent(new Event(\"resize\"))):this.workspace.setVisible(!1):this.props.stageSize===e.stageSize&&this.props.customStageSize===e.customStageSize||window.dispatchEvent(new Event(\"resize\"))}componentWillUnmount(){this.detachVM(),this.unmounted=!0,this.workspace.dispose(),clearTimeout(this.toolboxUpdateTimeout),this.props.vm.clearFlyoutBlocks(),ne.a.blocklyWorkspace=null}requestToolboxUpdate(){clearTimeout(this.toolboxUpdateTimeout),this.toolboxUpdateTimeout=setTimeout((()=>{this.updateToolbox()}),0)}setLocale(){this.ScratchBlocks.ScratchMsgs.setLocale(this.props.locale),this.props.vm.setLocale(this.props.locale,this.props.messages).then((()=>{this.unmounted||(this.workspace.getFlyout().setRecyclingEnabled(!1),this.props.vm.refreshWorkspace(),this.requestToolboxUpdate(),this.withToolboxUpdates((()=>{this.workspace.getFlyout().setRecyclingEnabled(!0)})))}))}updateToolbox(){this.toolboxUpdateTimeout=!1;const e=this.workspace.toolbox_.getSelectedCategoryId(),t=this.workspace.toolbox_.getCategoryScrollOffset();this.workspace.updateToolbox(this.props.toolboxXML),this._renderedToolboxXML=this.props.toolboxXML,this.workspace.toolboxRefreshEnabled_=!0;const n=this.workspace.toolbox_.getCategoryPositionById(e);te()))}withToolboxUpdates(e){this.toolboxUpdateTimeout?this.toolboxUpdateQueue.push(e):e()}attachVM(){this.workspace.addChangeListener(this.props.vm.blockListener),this.flyoutWorkspace=this.workspace.getFlyout().getWorkspace(),this.flyoutWorkspace.addChangeListener(this.props.vm.flyoutBlockListener),this.flyoutWorkspace.addChangeListener(this.props.vm.monitorBlockListener),this.props.vm.addListener(\"SCRIPT_GLOW_ON\",this.onScriptGlowOn),this.props.vm.addListener(\"SCRIPT_GLOW_OFF\",this.onScriptGlowOff),this.props.vm.addListener(\"BLOCK_GLOW_ON\",this.onBlockGlowOn),this.props.vm.addListener(\"BLOCK_GLOW_OFF\",this.onBlockGlowOff),this.props.vm.addListener(\"VISUAL_REPORT\",this.onVisualReport),this.props.vm.addListener(\"workspaceUpdate\",this.onWorkspaceUpdate),this.props.vm.addListener(\"targetsUpdate\",this.onTargetsUpdate),this.props.vm.addListener(\"MONITORS_UPDATE\",this.handleMonitorsUpdate),this.props.vm.addListener(\"EXTENSION_ADDED\",this.handleExtensionAdded),this.props.vm.addListener(\"BLOCKSINFO_UPDATE\",this.handleBlocksInfoUpdate),this.props.vm.addListener(\"PERIPHERAL_CONNECTED\",this.handleStatusButtonUpdate),this.props.vm.addListener(\"PERIPHERAL_DISCONNECTED\",this.handleStatusButtonUpdate)}detachVM(){this.props.vm.removeListener(\"SCRIPT_GLOW_ON\",this.onScriptGlowOn),this.props.vm.removeListener(\"SCRIPT_GLOW_OFF\",this.onScriptGlowOff),this.props.vm.removeListener(\"BLOCK_GLOW_ON\",this.onBlockGlowOn),this.props.vm.removeListener(\"BLOCK_GLOW_OFF\",this.onBlockGlowOff),this.props.vm.removeListener(\"VISUAL_REPORT\",this.onVisualReport),this.props.vm.removeListener(\"workspaceUpdate\",this.onWorkspaceUpdate),this.props.vm.removeListener(\"targetsUpdate\",this.onTargetsUpdate),this.props.vm.removeListener(\"MONITORS_UPDATE\",this.handleMonitorsUpdate),this.props.vm.removeListener(\"EXTENSION_ADDED\",this.handleExtensionAdded),this.props.vm.removeListener(\"BLOCKSINFO_UPDATE\",this.handleBlocksInfoUpdate),this.props.vm.removeListener(\"PERIPHERAL_CONNECTED\",this.handleStatusButtonUpdate),this.props.vm.removeListener(\"PERIPHERAL_DISCONNECTED\",this.handleStatusButtonUpdate)}updateToolboxBlockValue(e,t){this.withToolboxUpdates((()=>{const n=this.workspace.getFlyout().getWorkspace().getBlockById(e);n&&n.inputList[0].fieldRow[0].setValue(t)}))}onTargetsUpdate(){this.props.vm.editingTarget&&this.workspace.getFlyout()&&[\"glide\",\"move\",\"set\"].forEach((e=>{this.updateToolboxBlockValue(\"\".concat(e,\"x\"),Math.round(this.props.vm.editingTarget.x).toString()),this.updateToolboxBlockValue(\"\".concat(e,\"y\"),Math.round(this.props.vm.editingTarget.y).toString())}))}onWorkspaceMetricsChange(){const e=this.props.vm.editingTarget;e&&e.id&&setTimeout((()=>{this.props.updateMetrics({targetID:e.id,scrollX:this.workspace.scrollX,scrollY:this.workspace.scrollY,scale:this.workspace.scale})}),0)}onScriptGlowOn(e){this.workspace.glowStack(e.id,!0)}onScriptGlowOff(e){this.workspace.glowStack(e.id,!1)}onBlockGlowOn(e){this.workspace.glowBlock(e.id,!0)}onBlockGlowOff(e){this.workspace.glowBlock(e.id,!1)}onVisualReport(e){this.workspace.reportValue(e.id,e.value)}getToolboxXML(){try{let{editingTarget:e,runtime:t}=this.props.vm;const n=t.getTargetForStage();e||(e=n);const a=n.getCostumes(),o=e.getCostumes(),r=e.getSounds(),i=((e,t)=>{if(t.blocks===da.j)return e;const n=ga(t),a=t.getExtensions(),o=new DOMParser,r=new XMLSerializer;return e.map((e=>{const i=o.parseFromString(e.xml,\"text/xml\"),s=i.documentElement.getAttribute(\"colour\");if(\"#0fbd8c\"!==s.toLowerCase()){const e=t.getCustomExtensionColors();i.documentElement.setAttribute(\"colour\",e.categoryIconBackground(s)),i.documentElement.setAttribute(\"secondaryColour\",e.categoryIconBorder(s))}else i.documentElement.setAttribute(\"colour\",n.primary),i.documentElement.setAttribute(\"secondaryColour\",n.tertiary);const l=(e=>e?e.menuIconURI||e.blockIconURI:null)(a[e.id]);return l&&i.documentElement.setAttribute(\"iconURI\",l),pa(pa({},e),{},{xml:r.serializeToString(i)})}))})(this.props.vm.runtime.getBlocksXML(e),this.props.theme);return Object(De.a)(!1,e.isStage,e.id,i,o[o.length-1].name,a[a.length-1].name,r.length>0?r[r.length-1].name:\"\",this.props.theme.getBlockColors())}catch(e){return null}}onWorkspaceUpdate(e){const t=this.getToolboxXML();t&&this.props.updateToolboxState(t),this.props.vm.editingTarget&&!this.props.workspaceMetrics.targets[this.props.vm.editingTarget.id]&&this.onWorkspaceMetricsChange(),this.workspace.removeChangeListener(this.props.vm.blockListener);const n=this.ScratchBlocks.Xml.textToDom(e.xml);try{this.ScratchBlocks.Xml.clearWorkspaceAndLoadFromXml(n,this.workspace)}catch(e){e.message&&(e.message=\"Workspace Update Error: \".concat(e.message)),N.default.error(e)}if(this.workspace.addChangeListener(this.props.vm.blockListener),this.props.vm.editingTarget&&this.props.workspaceMetrics.targets[this.props.vm.editingTarget.id]){const{scrollX:e,scrollY:t,scale:n}=this.props.workspaceMetrics.targets[this.props.vm.editingTarget.id];this.workspace.scrollX=e,this.workspace.scrollY=t,this.workspace.scale=n,this.workspace.resize()}this.workspace.clearUndo()}handleMonitorsUpdate(e){const t=this.workspace.getFlyout();for(const n of e.values()){const e=n.get(\"id\"),a=n.get(\"visible\");t.setCheckboxState(e,a);const o=this.props.vm.runtime.monitorBlocks.getBlock(e);o&&(o.isMonitored=a)}}handleExtensionAdded(e){const t=t=>{if(t&&t.length>0){const n=[],a=[];t.forEach((e=>{e.info&&e.info.isDynamic?a.push(e):e.json&&n.push(ha(e.json,this.props.theme))})),this.ScratchBlocks.defineBlocksWithJsonArray(n),a.forEach((t=>{const n=\"\".concat(e.id,\"_\").concat(t.info.opcode),a=ba(this.ScratchBlocks,e,t,n,this.props.theme);this.ScratchBlocks.Blocks[n]=a}))}};t(Object.getOwnPropertyNames(e.customFieldTypes).map((t=>e.customFieldTypes[t].scratchBlocksDefinition))),t(e.menus),t(e.blocks);const n=this.getToolboxXML();n&&this.props.updateToolboxState(n)}handleBlocksInfoUpdate(e){this.handleExtensionAdded(e)}handleCategorySelected(e){const t=lt.a.find((t=>t.extensionId===e));t&&t.launchPeripheralConnectionFlow&&this.handleConnectionModalStart(e),this.withToolboxUpdates((()=>{this.workspace.toolbox_.setSelectedCategoryById(e)}))}setBlocks(e){this.blocks=e}handlePromptStart(e,t,n,a,o){const r={prompt:{callback:n,message:e,defaultValue:t}};r.prompt.title=a||this.ScratchBlocks.Msg.VARIABLE_MODAL_TITLE,r.prompt.varType=\"string\"==typeof o?o:this.ScratchBlocks.SCALAR_VARIABLE_TYPE,r.prompt.showVariableOptions=o!==this.ScratchBlocks.BROADCAST_MESSAGE_VARIABLE_TYPE&&r.prompt.title!==this.ScratchBlocks.Msg.RENAME_VARIABLE_MODAL_TITLE&&r.prompt.title!==this.ScratchBlocks.Msg.RENAME_LIST_MODAL_TITLE,r.prompt.showCloudOption=o===this.ScratchBlocks.SCALAR_VARIABLE_TYPE&&this.props.canUseCloud,this.setState(r)}handleConnectionModalStart(e){this.props.onOpenConnectionModal(e)}handleStatusButtonUpdate(){this.ScratchBlocks.refreshStatusButtons(this.workspace)}handleOpenSoundRecorder(){this.props.onOpenSoundRecorder()}handlePromptCallback(e,t){this.state.prompt.callback(e,this.props.vm.runtime.getAllVarNamesOfType(this.state.prompt.varType),t),this.handlePromptClose()}handlePromptClose(){this.setState({prompt:null})}handleCustomProceduresClose(e){this.props.onRequestCloseCustomProcedures(e);const t=this.workspace;t.refreshToolboxSelection_(),t.toolbox_.scrollToCategoryById(\"myBlocks\")}handleDrop(e){fetch(e.payload.bodyUrl).then((e=>e.json())).then((t=>{const n=Oa(t);if(n){const t=this.props.workspaceMetrics.targets[this.props.vm.editingTarget.id];if(t){const{x:a,y:o}=e.currentOffset,{left:r,right:i}=this.workspace.scrollbar.hScroll.outerSvg_.getBoundingClientRect(),{top:s}=this.workspace.scrollbar.vScroll.outerSvg_.getBoundingClientRect();n.x=(this.props.isRtl?t.scrollX-a+i:-t.scrollX+a-r)/t.scale,n.y=(-t.scrollY-s+o)/t.scale}}return this.props.vm.shareBlocksToTarget(t,this.props.vm.editingTarget.id)})).then((()=>{this.props.vm.refreshWorkspace(),this.updateToolbox()}))}handleEnableProcedureReturns(){this.workspace.enableProcedureReturns(),this.requestToolboxUpdate()}render(){const e=this.props,{anyModalVisible:t,canUseCloud:n,customStageSize:a,customProceduresVisible:r,extensionLibraryVisible:i,options:s,stageSize:l,vm:c,isRtl:d,isVisible:u,onActivateColorPicker:p,onOpenConnectionModal:m,onOpenSoundRecorder:g,onOpenCustomExtensionModal:h,reduxOnOpenCustomExtensionModal:b,updateToolboxState:w,onActivateCustomProcedures:f,onRequestCloseExtensionLibrary:M,onRequestCloseCustomProcedures:v,toolboxXML:y,updateMetrics:k,useCatBlocks:j,workspaceMetrics:I}=e,S=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a({anyModalVisible:Object.keys(e.scratchGui.modals).some((t=>e.scratchGui.modals[t]))||e.scratchGui.mode.isFullScreen,customStageSize:e.scratchGui.customStageSize,extensionLibraryVisible:e.scratchGui.modals.extensionLibrary,isRtl:e.locales.isRtl,locale:e.locales.locale,messages:e.locales.messages,toolboxXML:e.scratchGui.toolbox.toolboxXML,customProceduresVisible:e.scratchGui.customProcedures.active,workspaceMetrics:e.scratchGui.workspaceMetrics,useCatBlocks:Object(ka.d)(e)})),(e=>({onActivateColorPicker:t=>e(Object(fa.a)(t)),onActivateCustomProcedures:(t,n)=>e(Object(Ma.a)(t,n)),onOpenConnectionModal:t=>{e(Object(va.c)(t)),e(Object(w.u)())},onOpenSoundRecorder:()=>{e(Object(b.d)(b.c)),e(Object(w.E)())},reduxOnOpenCustomExtensionModal:()=>e(Object(w.w)()),onRequestCloseExtensionLibrary:()=>{e(Object(w.e)())},onRequestCloseCustomProcedures:t=>{e(Object(Ma.c)(t))},updateToolboxState:t=>{e(Object(wa.c)(t))},updateMetrics:t=>{e(Object(ya.b)(t))}})))(Ea(Ga)))),Za=n(98),Wa=n(153),Ha=n(81);const Qa=function(){let e,t;return function(n){if(e===n.assetId)return t;if(e=n.assetId,n.assetType===_.a.AssetType.ImageVector){const e=n.decodeText();if(e.match('font-family(?!=\"none\")')){const n=Object(Ha.inlineSvgFonts)(e);t=\"data:image/svg+xml;utf8,\".concat(encodeURIComponent(n))}else t=n.encodeDataURI()}else t=n.encodeDataURI();return t}}(),Ya=e=>e.touches&&e.touches[0]?{x:e.touches[0].clientX,y:e.touches[0].clientY}:e.changedTouches&&e.changedTouches[0]?{x:e.changedTouches[0].clientX,y:e.changedTouches[0].clientY}:{x:e.clientX,y:e.clientY};class Va{static get STATE_UNIDENTIFIED(){return\"unidentified\"}static get STATE_SCROLL(){return\"scroll\"}static get STATE_DRAG(){return\"drag\"}constructor(e){let{onDrag:t=()=>{},onDragEnd:n=()=>{},touchDragAngle:a=70,distanceThreshold:o=3}=e;this._onDrag=t,this._onDragEnd=n,this._touchDragAngle=a,this._distanceThreshold=o,this._initialOffset=null,this._gestureState=Va.STATE_UNIDENTIFIED,E()(this,[\"start\",\"gestureInProgress\",\"reset\",\"_handleMove\",\"_handleEnd\"])}start(e){\"number\"==typeof e.button&&0!==e.button||(this._initialOffset=Ya(e),this._bindListeners())}gestureInProgress(){return this._gestureState!==Va.STATE_UNIDENTIFIED}reset(){this._unbindListeners(),this._initialOffset=null,this._gestureState=Va.STATE_UNIDENTIFIED}_bindListeners(){window.addEventListener(\"mouseup\",this._handleEnd),window.addEventListener(\"mousemove\",this._handleMove),window.addEventListener(\"touchend\",this._handleEnd),window.addEventListener(\"touchmove\",this._handleMove,{passive:!1})}_unbindListeners(){window.removeEventListener(\"mouseup\",this._handleEnd),window.removeEventListener(\"mousemove\",this._handleMove),window.removeEventListener(\"touchend\",this._handleEnd),window.removeEventListener(\"touchmove\",this._handleMove,{passive:!1})}_handleMove(e){if(this._isScroll())return;const t=Ya(e);if(!this.gestureInProgress()){const n=t.x-this._initialOffset.x,a=t.y-this._initialOffset.y;if(Math.sqrt(n*n+a*a)90&&(e=180-e),e>this._touchDragAngle?this._gestureState=Va.STATE_SCROLL:this._gestureState=Va.STATE_DRAG}else this._gestureState=Va.STATE_DRAG}this._isDrag()&&(this._onDrag(t,this._initialOffset),e.preventDefault())}_handleEnd(){this.reset(),this._onDragEnd()}_isDrag(){return this._gestureState===Va.STATE_DRAG}_isScroll(){return this._gestureState===Va.STATE_SCROLL}}var qa=Va,Ja=n(198),Xa=n.n(Ja),Ka=n(315),$a=n.n(Ka);const eo=e=>o.a.createElement(\"div\",{\"aria-label\":\"Delete\",className:ye()(Xa.a.deleteButton,e.className),role:\"button\",tabIndex:e.tabIndex,onClick:e.onClick},o.a.createElement(\"div\",{className:Xa.a.deleteButtonVisible},o.a.createElement(\"img\",{className:Xa.a.deleteIcon,src:$a.a,draggable:!1})));eo.propTypes={className:i.a.string,onClick:i.a.func.isRequired,tabIndex:i.a.number},eo.defaultProps={tabIndex:0};var to=eo,no=n(86),ao=n.n(no),oo=n(101),ro=n(112),io=n.n(ro);function so(){return so=Object.assign?Object.assign.bind():function(e){for(var t=1;to.a.createElement(oo.a,so({},e,{className:io.a.contextMenu})),co=e=>o.a.createElement(oo.c,so({},e,{attributes:{className:io.a.menuItem}})),uo=e=>o.a.createElement(oo.c,so({},e,{attributes:{className:ye()(io.a.menuItem,io.a.menuItemBordered)}})),po=e=>o.a.createElement(oo.c,so({},e,{attributes:{className:ye()(io.a.menuItem,io.a.menuItemBordered,io.a.menuItemDanger)}}));let mo=0;const go=e=>o.a.createElement(oo.b,{attributes:{className:ye()(e.className,ao.a.spriteSelectorItem,{[ao.a.isSelected]:e.selected}),onClick:e.onClick,onMouseEnter:e.onMouseEnter,onMouseLeave:e.onMouseLeave,onMouseDown:e.onMouseDown,onTouchStart:e.onMouseDown},disable:e.preventContextMenu,id:\"\".concat(e.name,\"-\").concat(mo),ref:e.componentRef},void 0===e.number?null:o.a.createElement(\"div\",{className:ao.a.number},e.number),e.costumeURL?o.a.createElement(\"div\",{className:ao.a.spriteImageOuter},o.a.createElement(\"div\",{className:ao.a.spriteImageInner},o.a.createElement(\"img\",{className:ao.a.spriteImage,draggable:!1,loading:\"lazy\",src:e.costumeURL}))):null,o.a.createElement(\"div\",{className:ao.a.spriteInfo},o.a.createElement(\"div\",{className:ao.a.spriteName},e.name),e.details?o.a.createElement(\"div\",{className:ao.a.spriteDetails},e.details):null),e.selected&&e.onDeleteButtonClick?o.a.createElement(to,{className:ao.a.deleteButton,onClick:e.onDeleteButtonClick}):null,e.onDuplicateButtonClick||e.onDeleteButtonClick||e.onExportButtonClick?o.a.createElement(lo,{id:\"\".concat(e.name,\"-\").concat(mo++)},e.onDuplicateButtonClick?o.a.createElement(co,{onClick:e.onDuplicateButtonClick},o.a.createElement(m.b,{defaultMessage:\"duplicate\",id:\"gui.spriteSelectorItem.contextMenuDuplicate\"})):null,e.onExportButtonClick?o.a.createElement(co,{onClick:e.onExportButtonClick},o.a.createElement(m.b,{defaultMessage:\"export\",id:\"gui.spriteSelectorItem.contextMenuExport\"})):null,e.onRenameButtonClick?o.a.createElement(co,{onClick:e.onRenameButtonClick},o.a.createElement(m.b,{defaultMessage:\"rename\",id:\"tw.spriteSelectorItem.rename\"})):null,e.onDeleteButtonClick?o.a.createElement(po,{onClick:e.onDeleteButtonClick},o.a.createElement(m.b,{defaultMessage:\"delete\",id:\"gui.spriteSelectorItem.contextMenuDelete\"})):null):null);go.propTypes={className:i.a.string,componentRef:i.a.func,costumeURL:i.a.string,details:i.a.string,name:i.a.any,number:i.a.number,onClick:i.a.func,onDeleteButtonClick:i.a.func,onDuplicateButtonClick:i.a.func,onExportButtonClick:i.a.func,onRenameButtonClick:i.a.func,onMouseDown:i.a.func,onMouseEnter:i.a.func,onMouseLeave:i.a.func,preventContextMenu:i.a.bool,selected:i.a.bool.isRequired};var ho=go;const bo=[\"asset\",\"id\",\"index\",\"onClick\",\"onDeleteButtonClick\",\"onDuplicateButtonClick\",\"onExportButtonClick\",\"onRenameButtonClick\",\"dragPayload\",\"receivedBlocks\",\"costumeURL\",\"vm\"];function wo(){return wo=Object.assign?Object.assign.bind():function(e){for(var t=1;t{this.noClick=!1}))}handleDrag(e){this.props.onDrag({img:this.getCostumeData(),currentOffset:e,dragging:!0,dragType:this.props.dragType,index:this.props.index,payload:this.props.dragPayload}),this.noClick=!0}handleTouchEnd(e){const{x:t,y:n}=Ya(e),{top:a,left:o,bottom:r,right:i}=this.ref.getBoundingClientRect();t>=o&&t<=i&&n>=a&&n<=r&&this.handleMouseEnter()}handleMouseDown(e){this.dragRecognizer.start(e)}handleClick(e){e.preventDefault(),this.noClick||this.props.onClick(this.props.id)}handleDelete(e){e.stopPropagation(),this.props.onDeleteButtonClick(this.props.id)}handleDuplicate(e){e.stopPropagation(),this.props.onDuplicateButtonClick(this.props.id)}handleExport(e){e.stopPropagation(),this.props.onExportButtonClick(this.props.id)}handleRename(e){e.stopPropagation(),this.props.onRenameButtonClick(this.props.id)}handleMouseLeave(){this.props.dispatchSetHoveredSprite(null)}handleMouseEnter(){this.props.dispatchSetHoveredSprite(this.props.id)}setRef(e){this.ref=e&&e.elem}render(){const e=this.props,{asset:t,id:n,index:a,onClick:r,onDeleteButtonClick:i,onDuplicateButtonClick:s,onExportButtonClick:l,onRenameButtonClick:c,dragPayload:d,receivedBlocks:u,costumeURL:p,vm:m}=e,g=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a{let{id:n}=t;return{dragging:e.scratchGui.assetDrag.dragging,receivedBlocks:e.scratchGui.hoveredTarget.receivedBlocks&&e.scratchGui.hoveredTarget.sprite===n,vm:e.scratchGui.vm}}),(e=>({dispatchSetHoveredSprite:t=>{e(Object(Za.c)(t))},onDrag:t=>e(Object(Wa.c)(t))})))(fo),vo=n(97),yo=n.n(vo),ko=n(43),jo=n.n(ko);class Io extends o.a.Component{constructor(e){super(e),E()(this,[\"clickDelayer\",\"handleClosePopover\",\"handleToggleOpenState\",\"handleTouchStart\",\"handleTouchOutside\",\"setButtonRef\",\"setContainerRef\"]),this.state={isOpen:!1,forceHide:!1},this.mainTooltipId=\"tooltip-\".concat(Math.random())}componentDidMount(){this.buttonRef.addEventListener(\"touchstart\",this.handleTouchStart),document.addEventListener(\"touchstart\",this.handleTouchOutside)}shouldComponentUpdate(e,t){return t.isOpen!==this.state.isOpen||t.forceHide!==this.state.forceHide||e.title!==this.props.title}componentWillUnmount(){this.buttonRef.removeEventListener(\"touchstart\",this.handleTouchStart),document.removeEventListener(\"touchstart\",this.handleTouchOutside)}handleClosePopover(){this.closeTimeoutId=setTimeout((()=>{this.setState({isOpen:!1}),this.closeTimeoutId=null}),300)}handleToggleOpenState(){this.closeTimeoutId?(clearTimeout(this.closeTimeoutId),this.closeTimeoutId=null):this.state.isOpen||this.setState({isOpen:!0,forceHide:!1})}handleTouchOutside(e){this.state.isOpen&&!this.containerRef.contains(e.target)&&(this.setState({isOpen:!1}),yo.a.hide())}clickDelayer(e){return t=>{yo.a.hide(),e&&e(t),this.buttonRef.blur(),this.setState({forceHide:!0,isOpen:!1},(()=>{setTimeout((()=>this.setState({forceHide:!1})))}))}}handleTouchStart(e){this.state.isOpen||(e.preventDefault(),this.handleToggleOpenState())}setButtonRef(e){this.buttonRef=e}setContainerRef(e){this.containerRef=e}render(){const{className:e,img:t,title:n,moreButtons:a,tooltipPlace:r,onClick:i}=this.props;return o.a.createElement(\"div\",{className:ye()(jo.a.menuContainer,e,{[jo.a.expanded]:this.state.isOpen,[jo.a.forceHidden]:this.state.forceHide}),ref:this.setContainerRef,onMouseEnter:this.handleToggleOpenState,onMouseLeave:this.handleClosePopover},o.a.createElement(\"button\",{\"aria-label\":n,className:ye()(jo.a.button,jo.a.mainButton),\"data-for\":this.mainTooltipId,\"data-tip\":n,ref:this.setButtonRef,onClick:this.clickDelayer(i)},o.a.createElement(\"img\",{className:jo.a.mainIcon,draggable:!1,src:t})),o.a.createElement(yo.a,{className:jo.a.tooltip,effect:\"solid\",id:this.mainTooltipId,place:r||\"left\"}),o.a.createElement(\"div\",{className:jo.a.moreButtonsOuter},o.a.createElement(\"div\",{className:jo.a.moreButtons},(a||[]).map(((e,t)=>{let{img:n,title:a,onClick:i,fileAccept:s,fileChange:l,fileInput:c,fileMultiple:d}=e;const u=!i,p=c,m=\"\".concat(this.mainTooltipId,\"-\").concat(a);return o.a.createElement(\"div\",{key:\"\".concat(m,\"-\").concat(t)},o.a.createElement(\"button\",{\"aria-label\":a,className:ye()(jo.a.button,jo.a.moreButton,{[jo.a.comingSoon]:u}),\"data-for\":m,\"data-tip\":a,onClick:p?i:this.clickDelayer(i)},o.a.createElement(\"img\",{className:jo.a.moreIcon,draggable:!1,src:n}),p?o.a.createElement(\"input\",{accept:s,className:jo.a.fileInput,multiple:d,ref:c,type:\"file\",onChange:l}):null),o.a.createElement(yo.a,{className:ye()(jo.a.tooltip,{[jo.a.comingSoonTooltip]:u}),effect:\"solid\",id:m,place:r||\"left\"}))})))))}}Io.propTypes={className:i.a.string,img:i.a.string,moreButtons:i.a.arrayOf(i.a.shape({img:i.a.string,title:i.a.node.isRequired,onClick:i.a.func,fileAccept:i.a.string,fileChange:i.a.func,fileInput:i.a.func,fileMultiple:i.a.bool})),onClick:i.a.func.isRequired,title:i.a.node.isRequired,tooltipPlace:i.a.string};var So=Io;class xo extends o.a.Component{constructor(e){super(e),E()(this,[\"setRef\"])}componentDidMount(){this.props.onAddSortable(this.ref)}componentWillUnmount(){this.props.onRemoveSortable(this.ref)}setRef(e){this.ref=e}render(){return o.a.createElement(\"div\",{className:this.props.className,ref:this.setRef,style:{order:this.props.index}},this.props.children)}}xo.propTypes={children:i.a.node.isRequired,className:i.a.string,index:i.a.number.isRequired,onAddSortable:i.a.func.isRequired,onRemoveSortable:i.a.func.isRequired};var Eo=xo;function Co(){return Co=Object.assign?Object.assign.bind():function(e){for(var t=1;te&&e.getBoundingClientRect())),this.boxes.sort(((e,t)=>e.top===t.top?(e.left-t.left)*(this.props.isRtl?-1:1):e.top-t.top)),!this.ref)throw new Error(\"The containerRef must be assigned to the sortable area\");this.containerBox=this.ref.getBoundingClientRect()}else if(!e.dragInfo.dragging&&this.props.dragInfo.dragging){const e=this.getMouseOverIndex();null!==e&&this.props.onDrop(Object.assign({},this.props.dragInfo,{newIndex:e}))}}handleAddSortable(e){this.sortableRefs.push(e)}handleRemoveSortable(e){const t=this.sortableRefs.indexOf(e);this.sortableRefs=this.sortableRefs.slice(0,t).concat(this.sortableRefs.slice(t+1))}getOrdering(e,t,n){let a=Array(this.props.items.length).fill(0).map(((e,t)=>t));const o=e=>\"number\"==typeof e&&!isNaN(e);return o(t)&&o(n)&&(a=a.slice(0,t).concat(a.slice(t+1)),a.splice(n,0,t)),a}getMouseOverIndex(){let e=null;if(this.props.dragInfo.currentOffset){const{x:t,y:n}=this.props.dragInfo.currentOffset,{top:a,left:o,bottom:r,right:i}=this.containerBox;t>=o&&t<=i&&n>=a&&n<=r&&(e=0===this.boxes.length?0:((e,t,n)=>{let{x:a,y:o}=e;if(0===t.length)return null;let r=null;const i=Math.min.apply(null,t.map((e=>e.left))),s=Math.max.apply(null,t.map((e=>e.right))),l=Math.min.apply(null,t.map((e=>e.top))),c=Math.max.apply(null,t.map((e=>e.bottom)));for(let e=0;e=u&&a<=p&&o>=m&&o<=g){r=e;break}}return r})(this.props.dragInfo.currentOffset,this.boxes,this.props.isRtl))}return e}setRef(e){this.ref=e}render(){const{dragInfo:{index:t,dragType:n},items:a}=this.props,r=this.getMouseOverIndex(),i=this.getOrdering(a,t,r);return o.a.createElement(e,Co({containerRef:this.setRef,draggingIndex:t,draggingType:n,mouseOverIndex:r,ordering:i,onAddSortable:this.handleAddSortable,onRemoveSortable:this.handleRemoveSortable},this.props))}}t.propTypes={dragInfo:i.a.shape({currentOffset:i.a.shape({x:i.a.number,y:i.a.number}),dragType:i.a.string,dragging:i.a.bool,index:i.a.number}),items:i.a.arrayOf(i.a.shape({url:i.a.string,name:i.a.string.isRequired})),onClose:i.a.func,onDrop:i.a.func,isRtl:i.a.bool};return Object(l.b)((e=>({dragInfo:e.scratchGui.assetDrag,isRtl:e.locales.isRtl})),(()=>({})))(t)},_o=n(137),Do=n.n(_o);const To=e=>{const{buttons:t,containerRef:n,dragType:a,isRtl:r,items:i,selectedItemIndex:s,draggingIndex:l,draggingType:c,ordering:d,onAddSortable:u,onRemoveSortable:p,onDeleteClick:m,onDuplicateClick:g,onExportClick:h,onItemClick:b}=e,w=c===a;let f=null;if(t.length>0){const{img:e,title:n,onClick:a}=t[0],i=t.slice(1);f=o.a.createElement(Oe.a,{className:Do.a.newButtons},o.a.createElement(So,{img:e,moreButtons:i,title:n,tooltipPlace:r?\"left\":\"right\",onClick:a}))}return o.a.createElement(Oe.a,{className:Do.a.wrapper,componentRef:n},o.a.createElement(Oe.a,{className:Do.a.listArea},i.map(((e,t)=>o.a.createElement(Eo,{id:e.name,index:w?d.indexOf(t):t,key:e.name,onAddSortable:u,onRemoveSortable:p},o.a.createElement(Mo,{asset:e.asset,className:ye()(Do.a.listItem,{[Do.a.placeholder]:w&&t===l}),costumeURL:e.url,details:e.details,dragPayload:e.dragPayload,dragType:a,id:t,index:t,name:e.name,number:t+1,selected:t===s,onClick:b,onDeleteButtonClick:m,onDuplicateButtonClick:g,onExportButtonClick:h}))))),f)};To.propTypes={buttons:i.a.arrayOf(i.a.shape({title:i.a.string.isRequired,img:i.a.string.isRequired,onClick:i.a.func})),containerRef:i.a.func,dragType:i.a.oneOf(Object.keys(ra)),draggingIndex:i.a.number,draggingType:i.a.oneOf(Object.keys(ra)),isRtl:i.a.bool,items:i.a.arrayOf(i.a.shape({url:i.a.string,name:i.a.any})),onAddSortable:i.a.func,onDeleteClick:i.a.func,onDuplicateClick:i.a.func,onExportClick:i.a.func,onItemClick:i.a.func.isRequired,onRemoveSortable:i.a.func,ordering:i.a.arrayOf(i.a.number),selectedItemIndex:i.a.number.isRequired};var Oo=No(To),Ao=n(199),Po=n.n(Ao);function zo(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function Lo(e,t,n){return(t=function(e){var t=function(e,t){if(\"object\"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var a=n.call(e,t||\"default\");if(\"object\"!=typeof a)return a;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return(\"string\"===t?String:Number)(e)}(e,\"string\");return\"symbol\"==typeof t?t:t+\"\"}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function Ro(){return Ro=Object.assign?Object.assign.bind():function(e){for(var t=1;to.a.createElement(Oe.a,{className:Po.a.wrapper},o.a.createElement(Oo,Ro({className:Po.a.selector},e)),o.a.createElement(Oe.a,{className:Po.a.detailArea},e.children));Uo.propTypes=function(e){for(var t=1;t{let{selectedCostumeIndex:n}=t;const a=e.scratchGui.vm.editingTarget.id,o=e.scratchGui.vm.editingTarget.sprite,r=n({onManageFonts:()=>e(Object(w.y)())})))(Wo));var Qo=e=>{e.x=Math.floor(200*Math.random()-100),e.y=Math.floor(100*Math.random()-50)},Yo=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:\"image/bmp\";return new Promise((n=>{const a=e instanceof String?e:window.URL.createObjectURL(new Blob([e],{type:t})),o=document.createElement(\"canvas\"),r=o.getContext(\"2d\"),i=document.createElement(\"img\");i.addEventListener(\"load\",(()=>{o.width=i.naturalWidth,o.height=i.naturalHeight,r.drawImage(i,0,0);const e=o.toDataURL(\"image/png\");window.URL.revokeObjectURL(a),n(e)})),i.setAttribute(\"src\",a)}))},Vo=n(431),qo=n(414),Jo=n.n(qo),Xo=n(218);let Ko;if(!n.n(Xo).a.msie){const e=void 0===document.ontouchstart?\"mousedown\":\"touchstart\",t=()=>{document.removeEventListener(e,t);try{Ko=new(window.AudioContext||window.webkitAudioContext),Jo()(Ko)}catch(e){N.default.error(\"could not create shared audio context; sound-related features will not be available\",e)}};document.addEventListener(e,t)}var $o=function(){return Ko},er=n(149),tr=n.n(er);var nr=e=>(new $o).decodeAudioData(e).then((e=>{const t=[];for(let n=0;n{if(o===r.length)return void(e.value=null);const i=r[o],s=new FileReader;s.onload=()=>{const e=i.type,n=i.name.split(\".\",1)[0];t(s.result,e,n,o,r.length),a(o+1,r)},s.onerror=n,s.readAsArrayBuffer(i)};a(0,e.files)},or=function(e,t,n,a){const o=e.createAsset(t,n,a,null,!0);return{name:null,dataFormat:n,asset:o,md5:\"\".concat(o.assetId,\".\").concat(n),assetId:o.assetId}},rr=function(e,t,n,a){let o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:()=>{};const r=n.runtime.storage;let i=null,s=null;switch(t){case\"image/svg+xml\":try{e=Object(Ha.fixForVanilla)(e)}catch(e){N.default.error(\"fixForVanilla error\",e)}e=Ha.sanitizeSvg.sanitizeByteStream(e),i=r.DataFormat.SVG,s=r.AssetType.ImageVector;break;case\"image/jpeg\":i=r.DataFormat.JPG,s=r.AssetType.ImageBitmap;break;case\"image/bmp\":return void Yo(e).then((e=>{rr(e,\"image/png\",n,a)}));case\"image/png\":i=r.DataFormat.PNG,s=r.AssetType.ImageBitmap;break;case\"image/webp\":return void Yo(e,\"image/webp\").then((e=>{rr(e,\"image/png\",n,a)}));case\"image/gif\":{let t=[];return void((e,t)=>{const n=document.createElement(\"canvas\"),a=n.getContext(\"2d\"),o=new Vo.GifReader(new Uint8Array(e)),r=o.numFrames();n.width=o.width,n.height=o.height;let i=a.createImageData(n.width,n.height),s=a.createImageData(n.width,n.height);const l=e=>{const c=[];o.decodeAndBlitFrameRGBA(e,c);const{x:d,y:u,width:p,height:m,disposal:g}=o.frameInfo(e);for(let e=0;e{l(e+1)}))};l(0)})(e,((e,r,i)=>{rr(r,\"image/png\",n,(n=>{t=t.concat(n),e===i-1&&a(t)}),o)}))}default:return void o(\"Encountered unexpected file type: \".concat(t))}const l=new Ha.BitmapAdapter;if(l.setStageSize){const e=n.runtime.stageWidth,t=n.runtime.stageHeight;l.setStageSize(e,t)}const c=function(e){const t=or(r,s,i,e);a([t])};i===r.DataFormat.SVG?c(new Uint8Array(e)):l.importBitmap(e,t).then(c).catch(o)},ir=function(e,t,n,a,o){let r;switch(t){case\"audio/mp3\":case\"audio/mpeg\":r=n.DataFormat.MP3;break;case\"audio/wav\":case\"audio/wave\":case\"audio/x-wav\":case\"audio/x-pn-wav\":r=n.DataFormat.WAV;break;default:return void nr(e).then((e=>{ir(e,\"audio/wav\",n,a,o)})).catch(o)}const i=or(n,n.AssetType.Sound,r,new Uint8Array(e));a(i)},sr=e=>({name:e,md5:\"cd21514d0531fdffb22204e0ec5ed84a.svg\",rotationCenterX:0,rotationCenterY:0,bitmapResolution:1,skinId:null});var lr=n(49),cr=n(60),dr=n(79),ur=n(316),pr=n.n(ur),mr=n(317),gr=n.n(mr),hr=n(103),br=n.n(hr),wr=n(133),fr=n.n(wr),Mr=n(104),vr=n.n(Mr),yr=n(105),kr=n.n(yr);const jr=e=>{let t=null;return()=>t||e().then((e=>t=e.default))},Ir=jr((()=>n.e(89).then(n.t.bind(null,1593,3)))),Sr=jr((()=>n.e(90).then(n.t.bind(null,1594,3)))),xr=jr((()=>n.e(91).then(n.t.bind(null,1595,3)))),Er=jr((()=>n.e(92).then(n.t.bind(null,1596,3))));function Cr(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function Nr(e){for(var t=1;tt?this.props.vm.addCostumeFromLibrary(e.md5,e):this.props.vm.addCostume(e.md5,e,n))))}handleNewBlankCostume(){const e=this.props.vm.editingTarget.isStage?this.props.intl.formatMessage(Dr.backdrop,{index:1}):this.props.intl.formatMessage(Dr.costume,{index:1});this.handleNewCostume(sr(e))}async handleSurpriseCostume(){const e=await Sr(),t=e[Math.floor(Math.random()*e.length)],n={name:t.name,md5:t.md5ext,rotationCenterX:t.rotationCenterX,rotationCenterY:t.rotationCenterY,bitmapResolution:t.bitmapResolution,skinId:null};this.handleNewCostume(n,!0)}async handleSurpriseBackdrop(){const e=await Ir(),t=e[Math.floor(Math.random()*e.length)],n={name:t.name,md5:t.md5ext,rotationCenterX:t.rotationCenterX,rotationCenterY:t.rotationCenterY,bitmapResolution:t.bitmapResolution,skinId:null};this.handleNewCostume(n)}handleCostumeUpload(e){const t=this.props.vm,n=this.props.vm.editingTarget.id;this.props.onShowImporting(),ar(e.target,((e,a,o,r,i)=>{rr(e,a,t,(e=>{e.forEach(((e,t)=>{e.name=\"\".concat(o).concat(t?t+1:\"\")})),this.handleNewCostume(e,!1,n).then((()=>{r===i-1&&this.props.onCloseImporting()}))}),this.props.onCloseImporting)}),this.props.onCloseImporting)}handleFileUploadClick(){this.fileInput.click()}handleDrop(e){if(e.dragType===ra.COSTUME){const t=this.props.vm.editingTarget.sprite,n=t.costumes[this.state.selectedCostumeIndex];this.props.vm.reorderCostume(this.props.vm.editingTarget.id,e.index,e.newIndex),this.setState({selectedCostumeIndex:t.costumes.indexOf(n)})}else e.dragType===ra.BACKPACK_COSTUME?this.props.vm.addCostume(e.payload.body,{name:e.payload.name}):e.dragType===ra.BACKPACK_SOUND&&(this.props.onActivateSoundsTab(),this.props.vm.addSound({md5:e.payload.body,name:e.payload.name}))}setFileInput(e){this.fileInput=e}formatCostumeDetails(e,t){const n=t||1;return\"\".concat(Math.ceil(e[0]/n),\" x \").concat(Math.ceil(e[1]/n))}render(){const{dispatchUpdateRestore:e,intl:t,isRtl:n,onNewLibraryBackdropClick:a,onNewLibraryCostumeClick:r,vm:i}=this.props;if(!i.editingTarget)return null;const s=i.editingTarget.isStage,l=i.editingTarget.sprite,c=s?Dr.addLibraryBackdropMsg:Dr.addLibraryCostumeMsg,d=s?Dr.addFileBackdropMsg:Dr.addFileCostumeMsg,u=s?this.handleSurpriseBackdrop:this.handleSurpriseCostume,p=s?a:r,m=s?pr.a:gr.a,g=l.costumes?l.costumes.map((e=>({name:e.name,asset:e.asset,details:e.size?this.formatCostumeDetails(e.size,e.bitmapResolution):null,dragPayload:e}))):[];return o.a.createElement(Bo,{buttons:[{title:t.formatMessage(c),img:m,onClick:p},{title:t.formatMessage(d),img:br.a,onClick:this.handleFileUploadClick,fileAccept:\".svg, .png, .bmp, .jpg, .jpeg, .jfif, .webp, .gif\",fileChange:this.handleCostumeUpload,fileInput:this.setFileInput,fileMultiple:!0},{title:t.formatMessage(Dr.addSurpriseCostumeMsg),img:vr.a,onClick:u},{title:t.formatMessage(Dr.addBlankCostumeMsg),img:fr.a,onClick:this.handleNewBlankCostume},{title:t.formatMessage(c),img:kr.a,onClick:p}],dragType:ra.COSTUME,isRtl:n,items:g,selectedItemIndex:this.state.selectedCostumeIndex,onDeleteClick:l&&l.costumes&&l.costumes.length>1?this.handleDeleteCostume:null,onDrop:this.handleDrop,onDuplicateClick:this.handleDuplicateCostume,onExportClick:this.handleExportCostume,onItemClick:this.handleSelectCostume},l.costumes?o.a.createElement(Ho,{selectedCostumeIndex:this.state.selectedCostumeIndex}):null)}}Tr.propTypes={dispatchUpdateRestore:i.a.func,editingTarget:i.a.string,intl:m.i,isRtl:i.a.bool,onActivateSoundsTab:i.a.func.isRequired,onCloseImporting:i.a.func.isRequired,onNewLibraryBackdropClick:i.a.func.isRequired,onNewLibraryCostumeClick:i.a.func.isRequired,onShowImporting:i.a.func.isRequired,sprites:i.a.shape({id:i.a.shape({costumes:i.a.arrayOf(i.a.shape({url:i.a.string,name:i.a.string.isRequired,skinId:i.a.number}))})}),stage:i.a.shape({sounds:i.a.arrayOf(i.a.shape({name:i.a.string.isRequired}))}),vm:i.a.instanceOf(p.a)};var Or=Object(g.a)(\"Costume Tab\")(Object(m.h)(Object(l.b)((e=>({editingTarget:e.scratchGui.targets.editingTarget,isRtl:e.locales.isRtl,sprites:e.scratchGui.targets.sprites,stage:e.scratchGui.targets.stage,dragging:e.scratchGui.assetDrag.dragging})),(e=>({onActivateSoundsTab:()=>e(Object(b.d)(b.c)),onNewLibraryBackdropClick:t=>{t.preventDefault(),e(Object(w.t)())},onNewLibraryCostumeClick:t=>{t.preventDefault(),e(Object(w.v)())},dispatchUpdateRestore:t=>{e(Object(dr.c)(t))},onCloseImporting:()=>e(Object(W.c)(\"importingAsset\")),onShowImporting:()=>e(Object(W.i)(\"importingAsset\"))})))(Tr))),Ar=Object(m.g)({all:{id:\"gui.libraryTags.all\",defaultMessage:\"All\"},animals:{id:\"gui.libraryTags.animals\",defaultMessage:\"Animals\"},dance:{id:\"gui.libraryTags.dance\",defaultMessage:\"Dance\"},effects:{id:\"gui.libraryTags.effects\",defaultMessage:\"Effects\"},fantasy:{id:\"gui.libraryTags.fantasy\",defaultMessage:\"Fantasy\"},fashion:{id:\"gui.libraryTags.fashion\",defaultMessage:\"Fashion\"},food:{id:\"gui.libraryTags.food\",defaultMessage:\"Food\"},indoors:{id:\"gui.libraryTags.indoors\",defaultMessage:\"Indoors\"},loops:{id:\"gui.libraryTags.loops\",defaultMessage:\"Loops\"},music:{id:\"gui.libraryTags.music\",defaultMessage:\"Music\"},notes:{id:\"gui.libraryTags.notes\",defaultMessage:\"Notes\"},outdoors:{id:\"gui.libraryTags.outdoors\",defaultMessage:\"Outdoors\"},patterns:{id:\"gui.libraryTags.patterns\",defaultMessage:\"Patterns\"},people:{id:\"gui.libraryTags.people\",defaultMessage:\"People\"},percussion:{id:\"gui.libraryTags.percussion\",defaultMessage:\"Percussion\"},space:{id:\"gui.libraryTags.space\",defaultMessage:\"Space\"},sports:{id:\"gui.libraryTags.sports\",defaultMessage:\"Sports\"},underwater:{id:\"gui.libraryTags.underwater\",defaultMessage:\"Underwater\"},voice:{id:\"gui.libraryTags.voice\",defaultMessage:\"Voice\"},wacky:{id:\"gui.libraryTags.wacky\",defaultMessage:\"Wacky\"},animation:{id:\"gui.libraryTags.animation\",defaultMessage:\"Animation\"},art:{id:\"gui.libraryTags.art\",defaultMessage:\"Art\"},games:{id:\"gui.libraryTags.games\",defaultMessage:\"Games\"},stories:{id:\"gui.libraryTags.stories\",defaultMessage:\"Stories\"},letters:{id:\"gui.libraryTags.letters\",defaultMessage:\"Letters\"}}),Pr=[{tag:\"animals\",intlLabel:Ar.animals},{tag:\"people\",intlLabel:Ar.people},{tag:\"fantasy\",intlLabel:Ar.fantasy},{tag:\"dance\",intlLabel:Ar.dance},{tag:\"music\",intlLabel:Ar.music},{tag:\"sports\",intlLabel:Ar.sports},{tag:\"food\",intlLabel:Ar.food},{tag:\"fashion\",intlLabel:Ar.fashion},{tag:\"letters\",intlLabel:Ar.letters}];const zr=Object(m.g)({libraryTitle:{id:\"gui.spriteLibrary.chooseASprite\",defaultMessage:\"Choose a Sprite\"}});class Lr extends o.a.PureComponent{constructor(e){super(e),E()(this,[\"handleItemSelect\"]),this.state={data:Er()}}componentDidMount(){this.state.data.then&&this.state.data.then((e=>this.setState({data:e})))}handleItemSelect(e){Qo(e),this.props.vm.addSprite(JSON.stringify(e)).then((()=>{this.props.onActivateBlocksTab()}))}render(){return o.a.createElement(Tn,{data:this.state.data.then?null:this.state.data,id:\"spriteLibrary\",tags:Pr,title:this.props.intl.formatMessage(zr.libraryTitle),removedTrademarks:!0,onItemSelected:this.handleItemSelect,onRequestClose:this.props.onRequestClose})}}Lr.propTypes={intl:m.i.isRequired,onActivateBlocksTab:i.a.func.isRequired,onRequestClose:i.a.func,vm:i.a.instanceOf(p.a).isRequired};var Rr=Object(m.h)(Lr),Ur=n(164),Br=n.n(Ur);const Gr=e=>o.a.createElement(\"label\",{className:e.above?Br.a.inputGroupColumn:Br.a.inputGroup},o.a.createElement(\"span\",{className:e.secondary?Br.a.inputLabelSecondary:Br.a.inputLabel},e.text),e.children);Gr.propTypes={above:i.a.bool,children:i.a.node,secondary:i.a.bool,text:i.a.oneOfType([i.a.string,i.a.node]).isRequired},Gr.defaultProps={above:!1,secondary:!1};var Fr=Gr,Zr=n(69),Wr=n(91),Hr=n(259),Qr=n.n(Hr),Yr=n(200),Vr=n.n(Yr);const qr=e=>{let{buttons:t,className:n,disabled:a}=e;return o.a.createElement(\"div\",{className:ye()(n,Vr.a.row,{[Vr.a.disabled]:a})},t.map(((e,t)=>o.a.createElement(\"button\",{key:\"toggle-\".concat(t),className:Vr.a.button,title:e.title,\"aria-label\":e.title,\"aria-pressed\":e.isSelected,onClick:e.handleClick,disabled:a},o.a.createElement(Wt,{src:e.icon,\"aria-hidden\":\"true\",className:e.iconClassName,draggable:!1})))))};qr.propTypes={buttons:i.a.arrayOf(i.a.shape({title:i.a.string.isRequired,handleClick:i.a.func.isRequired,icon:i.a.oneOfType([i.a.string,i.a.func]),iconClassName:i.a.string,isSelected:i.a.bool})),className:i.a.string,disabled:i.a.bool},qr.defaultProps={disabled:!1};var Jr=qr,Xr=n(124),Kr=n.n(Xr);const $r='';var ei=()=>{const e=\"object\"==typeof Recolor?$r.replace(/#855cd6/gi,Recolor.primary):$r;return\"data:image/svg+xml;,\"+encodeURIComponent(e)};const ti='01_Dial Elements\\n';var ni=()=>{const e=\"object\"==typeof Recolor?ti.replace(/#855cd6/gi,Recolor.primary):ti;return\"data:image/svg+xml;,\"+encodeURIComponent(e)};class ai extends o.a.Component{constructor(e){super(e),E()(this,[\"handleMouseDown\",\"handleMouseMove\",\"containerRef\",\"handleRef\",\"unbindMouseEvents\"])}componentDidMount(){this.handleElement.addEventListener(\"mousedown\",this.handleMouseDown),this.handleElement.addEventListener(\"touchstart\",this.handleMouseDown)}componentWillUnmount(){this.unbindMouseEvents(),this.handleElement.removeEventListener(\"mousedown\",this.handleMouseDown),this.handleElement.removeEventListener(\"touchstart\",this.handleMouseDown)}directionToMouseEvent(e){const{x:t,y:n}=Ya(e),a=this.containerElement.getBoundingClientRect(),o=a.top+a.height/2,r=a.left+a.width/2;return Math.atan2(n-o,t-r)*(180/Math.PI)+90}gaugePath(e,t){const n=t*(Math.PI/180),a=[];return a.push(\"M \".concat(e,\" 0\")),a.push(\"L \".concat(e,\" \").concat(e)),a.push(\"L \".concat(e+e*Math.sin(n),\" \").concat(e-e*Math.cos(n))),a.push(\"A \".concat(e,\" \").concat(e,\" 0 0 \").concat(t<0?1:0,\" \").concat(e,\" 0\")),a.push(\"Z\"),a.join(\" \")}handleMouseMove(e){this.props.onChange(this.directionToMouseEvent(e)+this.directionOffset),e.preventDefault()}unbindMouseEvents(){window.removeEventListener(\"mousemove\",this.handleMouseMove),window.removeEventListener(\"mouseup\",this.unbindMouseEvents),window.removeEventListener(\"touchmove\",this.handleMouseMove),window.removeEventListener(\"touchend\",this.unbindMouseEvents)}handleMouseDown(e){this.directionOffset=this.props.direction-this.directionToMouseEvent(e),window.addEventListener(\"mousemove\",this.handleMouseMove),window.addEventListener(\"mouseup\",this.unbindMouseEvents),window.addEventListener(\"touchmove\",this.handleMouseMove),window.addEventListener(\"touchend\",this.unbindMouseEvents),e.preventDefault()}containerRef(e){this.containerElement=e}handleRef(e){this.handleElement=e}render(){const{direction:e,radius:t}=this.props;return o.a.createElement(\"div\",{className:Kr.a.container},o.a.createElement(\"div\",{className:Kr.a.dialContainer,ref:this.containerRef,style:{width:\"\".concat(2*t,\"px\"),height:\"\".concat(2*t,\"px\")}},o.a.createElement(\"img\",{className:Kr.a.dialFace,draggable:!1,src:ei()}),o.a.createElement(\"svg\",{className:Kr.a.gauge,height:2*t,width:2*t},o.a.createElement(\"path\",{className:Kr.a.gaugePath,d:this.gaugePath(t,e)})),o.a.createElement(\"img\",{className:Kr.a.dialHandle,draggable:!1,ref:this.handleRef,src:ni(),style:{top:\"\".concat(t-t*Math.cos(e*(Math.PI/180)),\"px\"),left:\"\".concat(t+t*Math.sin(e*(Math.PI/180)),\"px\"),transform:\"rotate(\".concat(e,\"deg)\")}})))}}ai.propTypes={direction:i.a.number,onChange:i.a.func.isRequired,radius:i.a.number},ai.defaultProps={direction:90,radius:56};var oi=ai,ri=n(318),ii=n.n(ri);const si='\\n\\n \\x3c!-- Generator: Sketch 51.1 (57501) - http://www.bohemiancoding.com/sketch --\\x3e\\n all-around-active\\n Created with Sketch.\\n \\n \\n \\n \\n\\n';var li=()=>{const e=\"object\"==typeof Recolor?si.replace(/#855cd6/gi,Recolor.primary):si;return\"data:image/svg+xml;,\"+encodeURIComponent(e)};const ci='\\n\\n \\x3c!-- Generator: Sketch 51.1 (57501) - http://www.bohemiancoding.com/sketch --\\x3e\\n left-right-active\\n Created with Sketch.\\n \\n \\n \\n \\n \\n \\n\\n';var di=()=>{const e=\"object\"==typeof Recolor?ci.replace(/#855cd6/gi,Recolor.primary):ci;return\"data:image/svg+xml;,\"+encodeURIComponent(e)};const ui='\\n\\n \\x3c!-- Generator: Sketch 51.1 (57501) - http://www.bohemiancoding.com/sketch --\\x3e\\n dont-rotate-active\\n Created with Sketch.\\n \\n \\n \\n \\n\\n';var pi=()=>{const e=\"object\"==typeof Recolor?ui.replace(/#855cd6/gi,Recolor.primary):ui;return\"data:image/svg+xml;,\"+encodeURIComponent(e)};const mi=Object(Wr.a)(Zr.a),gi=o.a.createElement(m.b,{defaultMessage:\"Direction\",id:\"gui.SpriteInfo.direction\"}),hi=\"all around\",bi=\"left-right\",wi=\"don't rotate\",fi=Object(m.g)({allAround:{id:\"gui.directionPicker.rotationStyles.allAround\",defaultMessage:\"All Around\"},leftRight:{id:\"gui.directionPicker.rotationStyles.leftRight\",defaultMessage:\"Left/Right\"},dontRotate:{id:\"gui.directionPicker.rotationStyles.dontRotate\",defaultMessage:\"Do not rotate\"}}),Mi=e=>o.a.createElement(Fr,{secondary:!0,above:e.labelAbove,text:gi},o.a.createElement(Qr.a,{body:o.a.createElement(\"div\",null,o.a.createElement(oi,{direction:e.direction,onChange:e.onChangeDirection}),o.a.createElement(Jr,{className:ii.a.buttonRow,buttons:[{handleClick:e.onClickAllAround,icon:li,isSelected:e.rotationStyle===hi,title:e.intl.formatMessage(fi.allAround)},{handleClick:e.onClickLeftRight,icon:di,isSelected:e.rotationStyle===bi,title:e.intl.formatMessage(fi.leftRight)},{handleClick:e.onClickDontRotate,icon:pi,isSelected:e.rotationStyle===wi,title:e.intl.formatMessage(fi.dontRotate)}]})),isOpen:e.popoverOpen,preferPlace:\"above\",onOuterAction:e.onClosePopover},o.a.createElement(mi,{small:!0,disabled:e.disabled,label:gi,tabIndex:\"0\",type:\"number\",value:e.disabled?\"\":e.direction,onFocus:e.onOpenPopover,onSubmit:e.onChangeDirection})));Mi.propTypes={direction:i.a.number,disabled:i.a.bool.isRequired,intl:m.i,labelAbove:i.a.bool,onChangeDirection:i.a.func.isRequired,onClickAllAround:i.a.func.isRequired,onClickDontRotate:i.a.func.isRequired,onClickLeftRight:i.a.func.isRequired,onClosePopover:i.a.func.isRequired,onOpenPopover:i.a.func.isRequired,popoverOpen:i.a.bool.isRequired,rotationStyle:i.a.string},Mi.defaultProps={labelAbove:!1};const vi=Object(m.h)(Mi);class yi extends o.a.Component{constructor(e){super(e),E()(this,[\"handleOpenPopover\",\"handleClosePopover\",\"handleClickLeftRight\",\"handleClickDontRotate\",\"handleClickAllAround\"]),this.state={popoverOpen:!1}}handleOpenPopover(){this.setState({popoverOpen:!0})}handleClosePopover(){this.setState({popoverOpen:!1})}handleClickAllAround(){this.props.onChangeRotationStyle(hi)}handleClickLeftRight(){this.props.onChangeRotationStyle(bi)}handleClickDontRotate(){this.props.onChangeRotationStyle(wi)}render(){return o.a.createElement(vi,{direction:this.props.direction,disabled:this.props.disabled,labelAbove:this.props.labelAbove,popoverOpen:this.state.popoverOpen&&!this.props.disabled,rotationStyle:this.props.rotationStyle,onChangeDirection:this.props.onChangeDirection,onClickAllAround:this.handleClickAllAround,onClickDontRotate:this.handleClickDontRotate,onClickLeftRight:this.handleClickLeftRight,onClosePopover:this.handleClosePopover,onOpenPopover:this.handleOpenPopover})}}yi.propTypes={direction:i.a.number,disabled:i.a.bool,labelAbove:i.a.bool,onChangeDirection:i.a.func,onChangeRotationStyle:i.a.func,rotationStyle:i.a.string};var ki=yi;const ji=[\"ab\",\"ca\",\"de\",\"el\",\"it\",\"ja\",\"ja-Hira\",\"ko\",\"hu\",\"ru\",\"vi\"];var Ii=n(31),Si=n.n(Ii),xi=n(319),Ei=n.n(xi),Ci=n(320),Ni=n.n(Ci);const _i='\\n\\n \\x3c!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch --\\x3e\\n show-icon-active\\n Created with Sketch.\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n\\n';var Di=()=>{const e=\"object\"==typeof Recolor?_i.replace(/#855cd6/gi,Recolor.primary):_i;return\"data:image/svg+xml;,\"+encodeURIComponent(e)};const Ti='\\n\\n \\x3c!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch --\\x3e\\n hide-icon-active\\n Created with Sketch.\\n \\n \\n \\n \\n \\n \\n \\n \\n\\n';var Oi=()=>{const e=\"object\"==typeof Recolor?Ti.replace(/#855cd6/gi,Recolor.primary):Ti;return\"data:image/svg+xml;,\"+encodeURIComponent(e)};const Ai=Object(Wr.a)(Zr.a),Pi=Object(m.g)({spritePlaceholder:{id:\"gui.SpriteInfo.spritePlaceholder\",defaultMessage:\"Name\"},showSpriteAction:{id:\"gui.SpriteInfo.showSpriteAction\",defaultMessage:\"Show sprite\"},hideSpriteAction:{id:\"gui.SpriteInfo.hideSpriteAction\",defaultMessage:\"Hide sprite\"}});class zi extends o.a.Component{shouldComponentUpdate(e){return this.props.rotationStyle!==e.rotationStyle||this.props.disabled!==e.disabled||this.props.name!==e.name||this.props.stageSize!==e.stageSize||this.props.visible!==e.visible||Math.round(this.props.direction)!==Math.round(e.direction)||Math.round(this.props.size)!==Math.round(e.size)||Math.round(this.props.x)!==Math.round(e.x)||Math.round(this.props.y)!==Math.round(e.y)}render(){const{stageSize:e}=this.props,t=o.a.createElement(m.b,{defaultMessage:\"Sprite\",id:\"gui.SpriteInfo.sprite\"}),n=o.a.createElement(m.b,{defaultMessage:\"Show\",id:\"gui.SpriteInfo.show\"}),a=o.a.createElement(m.b,{defaultMessage:\"Size\",id:\"gui.SpriteInfo.size\"}),r=(i=this.props.intl.locale,-1!==ji.indexOf(i));var i;const s=o.a.createElement(Ai,{className:ye()(Si.a.spriteInput,{[Si.a.columnInput]:r}),disabled:this.props.disabled,placeholder:this.props.intl.formatMessage(Pi.spritePlaceholder),tabIndex:\"0\",type:\"text\",value:this.props.disabled?\"\":this.props.name,onSubmit:this.props.onChangeName}),l=o.a.createElement(\"div\",{className:Si.a.group},e===na.d.full||e===na.d.large?o.a.createElement(\"div\",{className:Si.a.iconWrapper},o.a.createElement(\"img\",{\"aria-hidden\":\"true\",className:ye()(Si.a.xIcon,Si.a.icon),src:Ei.a,draggable:!1})):null,o.a.createElement(Fr,{text:\"x\"},o.a.createElement(Ai,{small:!0,disabled:this.props.disabled,placeholder:\"x\",tabIndex:\"0\",type:\"number\",value:this.props.disabled?\"\":Math.round(this.props.x),onSubmit:this.props.onChangeX}))),c=o.a.createElement(\"div\",{className:Si.a.group},e===na.d.full||e===na.d.large?o.a.createElement(\"div\",{className:Si.a.iconWrapper},o.a.createElement(\"img\",{\"aria-hidden\":\"true\",className:ye()(Si.a.yIcon,Si.a.icon),src:Ni.a,draggable:!1})):null,o.a.createElement(Fr,{text:\"y\"},o.a.createElement(Ai,{small:!0,disabled:this.props.disabled,placeholder:\"y\",tabIndex:\"0\",type:\"number\",value:this.props.disabled?\"\":Math.round(this.props.y),onSubmit:this.props.onChangeY})));return e===na.d.small?o.a.createElement(Oe.a,{className:Si.a.spriteInfo},o.a.createElement(\"div\",{className:ye()(Si.a.row,Si.a.rowPrimary)},o.a.createElement(\"div\",{className:Si.a.group},s)),o.a.createElement(\"div\",{className:ye()(Si.a.row,Si.a.rowSecondary)},l,c)):o.a.createElement(Oe.a,{className:Si.a.spriteInfo},o.a.createElement(\"div\",{className:ye()(Si.a.row,Si.a.rowPrimary)},o.a.createElement(\"div\",{className:Si.a.group},o.a.createElement(Fr,{above:r,text:t},s)),l,c),o.a.createElement(\"div\",{className:ye()(Si.a.row,Si.a.rowSecondary)},o.a.createElement(\"div\",{className:r?Si.a.column:Si.a.group},e===na.d.full||e===na.d.large?o.a.createElement(Fr,{secondary:!0,text:n}):null,o.a.createElement(Jr,{buttons:[{handleClick:this.props.onClickVisible,icon:Di,isSelected:this.props.visible&&!this.props.disabled,title:this.props.intl.formatMessage(Pi.showSpriteAction)},{handleClick:this.props.onClickNotVisible,icon:Oi,isSelected:!this.props.visible&&!this.props.disabled,title:this.props.intl.formatMessage(Pi.hideSpriteAction)}],disabled:this.props.disabled})),o.a.createElement(\"div\",{className:ye()(Si.a.group,Si.a.largerInput)},o.a.createElement(Fr,{secondary:!0,above:r,text:a},o.a.createElement(Ai,{small:!0,disabled:this.props.disabled,label:a,tabIndex:\"0\",type:\"number\",value:this.props.disabled?\"\":Math.round(this.props.size),onSubmit:this.props.onChangeSize}))),o.a.createElement(\"div\",{className:ye()(Si.a.group,Si.a.largerInput)},o.a.createElement(ki,{direction:Math.round(this.props.direction),disabled:this.props.disabled,labelAbove:r,rotationStyle:this.props.rotationStyle,onChangeDirection:this.props.onChangeDirection,onChangeRotationStyle:this.props.onChangeRotationStyle}))))}}zi.propTypes={direction:i.a.oneOfType([i.a.string,i.a.number]),disabled:i.a.bool,intl:m.i,name:i.a.string,onChangeDirection:i.a.func,onChangeName:i.a.func,onChangeRotationStyle:i.a.func,onChangeSize:i.a.func,onChangeX:i.a.func,onChangeY:i.a.func,onClickNotVisible:i.a.func,onClickVisible:i.a.func,rotationStyle:i.a.string,size:i.a.oneOfType([i.a.string,i.a.number]),stageSize:i.a.oneOf(Object.keys(na.d)).isRequired,visible:i.a.bool,x:i.a.oneOfType([i.a.string,i.a.number]),y:i.a.oneOfType([i.a.string,i.a.number])};var Li=Object(m.h)(zi);function Ri(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function Ui(e){for(var t=1;tt}render(){return this._lastRenderTime=Date.now(),this._lastRenderedValue=this.props[e],o.a.createElement(n,this.props)}}return a}},Hi=n(74),Qi=n.n(Hi);const Yi=Wi(\"asset\",500)(Mo),Vi=function(e){const{containerRef:t,editingTarget:n,draggingIndex:a,draggingType:r,hoveredTarget:i,onDeleteSprite:s,onDuplicateSprite:l,onExportSprite:c,onSelectSprite:d,onAddSortable:u,onRemoveSortable:p,ordering:m,raised:g,selectedId:h,items:b}=e,w=r===ra.SPRITE;return o.a.createElement(Oe.a,{className:ye()(Qi.a.scrollWrapper,{[Qi.a.scrollWrapperDragging]:r===ra.BACKPACK_SPRITE}),componentRef:t},o.a.createElement(Oe.a,{className:Qi.a.itemsWrapper},b.map(((e,t)=>{const b=i.sprite===e.id&&e.id!==n&&i.receivedBlocks;let f=!b&&g&&e.id!==n;return f=f||[ra.COSTUME,ra.SOUND,ra.BACKPACK_COSTUME,ra.BACKPACK_SOUND,ra.BACKPACK_CODE].includes(r),o.a.createElement(Eo,{className:ye()(Qi.a.spriteWrapper,{[Qi.a.placeholder]:w&&t===a}),index:w?m.indexOf(t):t,key:e.name,onAddSortable:u,onRemoveSortable:p},o.a.createElement(Yi,{asset:e.costume&&e.costume.asset,className:ye()(Qi.a.sprite,{[Qi.a.raised]:f,[Qi.a.receivedBlocks]:b}),dragPayload:e.id,dragType:ra.SPRITE,id:e.id,index:t,key:e.id,name:e.name,selected:e.id===h,onClick:d,onDeleteButtonClick:s,onDuplicateButtonClick:l,onExportButtonClick:c}))}))))};Vi.propTypes={containerRef:i.a.func,draggingIndex:i.a.number,draggingType:i.a.oneOf(Object.keys(ra)),editingTarget:i.a.string,hoveredTarget:i.a.shape({hoveredSprite:i.a.string,receivedBlocks:i.a.bool,sprite:i.a.string}),items:i.a.arrayOf(i.a.shape({costume:i.a.shape({url:i.a.string,name:i.a.string.isRequired,bitmapResolution:i.a.number.isRequired,rotationCenterX:i.a.number.isRequired,rotationCenterY:i.a.number.isRequired}),name:i.a.any,order:i.a.number.isRequired})),onAddSortable:i.a.func,onDeleteSprite:i.a.func,onDuplicateSprite:i.a.func,onExportSprite:i.a.func,onRemoveSortable:i.a.func,onSelectSprite:i.a.func,ordering:i.a.arrayOf(i.a.number),raised:i.a.bool,selectedId:i.a.string};var qi=No(Vi),Ji=n(67);const Xi=[\"editingTarget\",\"hoveredTarget\",\"intl\",\"onChangeSpriteDirection\",\"onChangeSpriteName\",\"onChangeSpriteRotationStyle\",\"onChangeSpriteSize\",\"onChangeSpriteVisibility\",\"onChangeSpriteX\",\"onChangeSpriteY\",\"onDrop\",\"onDeleteSprite\",\"onDuplicateSprite\",\"onExportSprite\",\"onFileUploadClick\",\"onNewSpriteClick\",\"onPaintSpriteClick\",\"onSelectSprite\",\"onSpriteUpload\",\"onSurpriseSpriteClick\",\"raised\",\"selectedId\",\"spriteFileInput\",\"sprites\",\"stageSize\"];function Ki(){return Ki=Object.assign?Object.assign.bind():function(e){for(var t=1;tS[e])),raised:k,selectedId:j,onDeleteSprite:m,onDrop:p,onDuplicateSprite:g,onExportSprite:h,onSelectSprite:M}),o.a.createElement(So,{className:Qi.a.addButton,img:An.a,moreButtons:[{title:a.formatMessage($i.addSpriteFromFile),img:br.a,onClick:b,fileAccept:\".svg, .png, .bmp, .jpg, .jpeg, .jfif, .webp, .sprite2, .sprite3, .gif\",fileChange:v,fileInput:I,fileMultiple:!0},{title:a.formatMessage($i.addSpriteFromSurprise),img:vr.a,onClick:y},{title:a.formatMessage($i.addSpriteFromPaint),img:fr.a,onClick:f},{title:a.formatMessage($i.addSpriteFromLibrary),img:kr.a,onClick:w}],title:a.formatMessage($i.addSpriteFromLibrary),tooltipPlace:Object(Ji.b)(a.locale)?\"right\":\"left\",onClick:w}))};es.propTypes={editingTarget:i.a.string,hoveredTarget:i.a.shape({hoveredSprite:i.a.string,receivedBlocks:i.a.bool}),intl:m.i.isRequired,onChangeSpriteDirection:i.a.func,onChangeSpriteName:i.a.func,onChangeSpriteRotationStyle:i.a.func,onChangeSpriteSize:i.a.func,onChangeSpriteVisibility:i.a.func,onChangeSpriteX:i.a.func,onChangeSpriteY:i.a.func,onDeleteSprite:i.a.func,onDrop:i.a.func,onDuplicateSprite:i.a.func,onExportSprite:i.a.func,onFileUploadClick:i.a.func,onNewSpriteClick:i.a.func,onPaintSpriteClick:i.a.func,onSelectSprite:i.a.func,onSpriteUpload:i.a.func,onSurpriseSpriteClick:i.a.func,raised:i.a.bool,selectedId:i.a.string,spriteFileInput:i.a.func,sprites:i.a.shape({id:i.a.shape({costume:i.a.shape({url:i.a.string,name:i.a.string.isRequired,bitmapResolution:i.a.number.isRequired,rotationCenterX:i.a.number.isRequired,rotationCenterY:i.a.number.isRequired}),name:i.a.string.isRequired,order:i.a.number.isRequired})}),stageSize:i.a.oneOf(Object.keys(na.d)).isRequired};var ts=Object(m.h)(es);var ns=(e,t)=>{const n=t.getExportedCostumeBase64(e),a=e.dataFormat,o={type:\"costume\",name:e.name,mime:\"\",body:\"\",thumbnail:\"\"};switch(a){case\"svg\":o.mime=\"image/svg+xml\",o.body=n;break;case\"png\":o.mime=\"image/png\",o.body=n;break;case\"jpg\":o.mime=\"image/jpeg\",o.body=n;break;default:alert(\"Cannot serialize for format: \".concat(a))}const r=Qa(e.asset);return _a(r).then((e=>(o.thumbnail=e,o)))},as=n(226),os=n.n(as);const rs=e=>{const t=e.asset.encodeDataURI(),n=e.dataFormat,a={type:\"sound\",name:e.name,thumbnail:os.a,mime:\"\",body:\"\"};switch(n){case\"wav\":a.mime=\"audio/x-wav\",a.body=t.replace(\"data:audio/x-wav;base64,\",\"\");break;case\"mp3\":a.mime=\"audio/mp3\",a.body=t.replace(\"data:audio/x-wav;base64,\",\"\");break;default:alert(\"Cannot serialize for format: \".concat(n))}return new Promise((e=>e(a)))};var is=(e,t)=>{const n=t.runtime.getTargetById(e);return n?t.exportSprite(e,\"base64\").then((e=>{const t={type:\"sprite\",name:n.sprite.name,mime:\"application/zip\",body:e,thumbnail:\"\"},a=n.sprite.costumes[n.currentCostume].asset.encodeDataURI();return _a(a).then((e=>(t.thumbnail=e,t)))})):null},ss=n(258),ls=n.n(ss);const cs=e=>{const t=atob(e),n=t.length,a=new Uint8Array(n);for(let e=0;e{let t=\"\";const n=new Uint8Array(e),a=n.byteLength;for(let e=0;e{let t;if(e.id=\"\".concat(e.id),\"sound\"===e.type?e.thumbnailUrl=\"data:;base64,\".concat(os.a):e.thumbnailUrl=\"data:;base64,\".concat(ds(e.thumbnailData)),\"script\"===e.type?e.bodyUrl=\"data:application/json;base64,\".concat(ds(e.bodyData)):\"sprite\"===e.type?e.bodyUrl=\"data:application/zip;base64,\".concat(ds(e.bodyData)):\"costume\"===e.type?\"image/svg+xml\"===e.mime?t=_.a.AssetType.ImageVector:\"image/png\"!==e.mime&&\"image/jpeg\"!==e.mime||(t=_.a.AssetType.ImageBitmap):\"sound\"===e.type&&(t=_.a.AssetType.Sound),t){const n=t.runtimeFormat,a=e.bodyMD5,o=\"\".concat(a,\".\").concat(n);e.body=o,_.a.builtinHelper._store(t,n,new Uint8Array(e.bodyData),a)}return e};let bs;const ws=()=>new Promise(((e,t)=>{if(bs)return void e(bs);if(!window.indexedDB)return void t(new Error(\"indexedDB is not supported\"));const n=indexedDB.open(\"TW_Backpack\",1);n.onupgradeneeded=e=>{e.target.result.createObjectStore(gs,{keyPath:\"id\",autoIncrement:!0})},n.onsuccess=t=>{bs=t.target.result,e(bs)},n.onerror=e=>{t(new Error(\"DB error: \".concat(e.target.error)))}}));var fs=async e=>{let{limit:t,offset:n}=e;const a=await ws();return new Promise(((e,o)=>{const r=a.transaction(gs,\"readonly\");r.onerror=e=>{o(new Error(\"Getting contents: \".concat(e.target.error)))};const i=r.objectStore(gs),s=[],l=i.openCursor(null,\"prev\");let c=!0;l.onsuccess=a=>{const o=a.target.result;c&&(c=!1,o&&0!==n)?o.advance(n):o&&s.length{let{type:t,mime:n,name:a,body:o,thumbnail:r}=e;Pa();const i=await ws();return new Promise(((e,s)=>{const l=i.transaction(gs,\"readwrite\");l.onerror=e=>{s(new Error(\"Sving object: \".concat(e.target.error)))};const c=l.objectStore(gs),d=cs(o),u=ls()(d),p={type:t,mime:n,name:a,bodyData:d,bodyMD5:u,thumbnailData:cs(r)},m=c.put(p);m.onsuccess=()=>{p.id=m.result,e(hs(p))}}))},vs=async e=>{let{id:t}=e;t=+t;const n=await ws();return new Promise(((e,a)=>{const o=n.transaction(gs,\"readwrite\");o.onerror=e=>{a(new Error(\"Deleting object: \".concat(e.target.error)))};o.objectStore(gs).delete(t).onsuccess=()=>{e()}}))},ys=async e=>{let{id:t,name:n}=e;t=+t;const a=await ws();return new Promise(((e,o)=>{const r=a.transaction(gs,\"readwrite\");r.onerror=e=>{o(new Error(\"Updating object: \".concat(e.target.error)))};const i=r.objectStore(gs),s=i.get(t);s.onsuccess=()=>{const t=ps(ps({},s.result),{},{name:n});i.put(t).onsuccess=()=>{e(hs(t))}}}))};const ks=\"_local_\",js=(e,t)=>Object.assign({},e,{thumbnailUrl:\"\".concat(t,\"/\").concat(e.thumbnail),bodyUrl:\"\".concat(t,\"/\").concat(e.body)}),Is=(e,t)=>new Promise(((n,a)=>{F()({uri:t,responseType:e},((e,t)=>e||200!==t.statusCode?a(new Error(t.status)):n(t.body)))})),Ss=Is.bind(null,\"json\"),xs=Is.bind(null,\"arraybuffer\");var Es=n(87),Cs=n.n(Es),Ns=n(321),_s=n.n(Ns);const Ds=[\"backdropCount\",\"containerRef\",\"dragOver\",\"fileInputRef\",\"intl\",\"selected\",\"raised\",\"receivedBlocks\",\"url\",\"onBackdropFileUploadClick\",\"onBackdropFileUpload\",\"onClick\",\"onMouseEnter\",\"onMouseLeave\",\"onNewBackdropClick\",\"onSurpriseBackdropClick\",\"onEmptyBackdropClick\"];function Ts(){return Ts=Object.assign?Object.assign.bind():function(e){for(var t=1;t{const{backdropCount:t,containerRef:n,dragOver:a,fileInputRef:r,intl:i,selected:s,raised:l,receivedBlocks:c,url:d,onBackdropFileUploadClick:u,onBackdropFileUpload:p,onClick:g,onMouseEnter:h,onMouseLeave:b,onNewBackdropClick:w,onSurpriseBackdropClick:f,onEmptyBackdropClick:M}=e,v=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=o&&t<=i&&n>=a&&n<=r&&this.handleMouseEnter()}addBackdropFromLibraryItem(e){let t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];const n={name:e.name,md5:e.md5ext,rotationCenterX:e.rotationCenterX,rotationCenterY:e.rotationCenterY,bitmapResolution:e.bitmapResolution,skinId:null};this.handleNewBackdrop(n,t)}handleClick(){this.props.onSelect(this.props.id)}handleNewBackdrop(e){let t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];const n=Array.isArray(e)?e:[e];return Promise.all(n.map((e=>this.props.vm.addBackdrop(e.md5,e)))).then((()=>{if(t)return this.props.onActivateTab(b.b)}))}async handleSurpriseBackdrop(e){e.stopPropagation();const t=await Ir(),n=t[Math.floor(Math.random()*t.length)];this.addBackdropFromLibraryItem(n,!1)}handleEmptyBackdrop(e){e.stopPropagation(),this.props.vm.setEditingTarget(this.props.id),this.handleNewBackdrop(sr(this.props.intl.formatMessage(lr.a.backdrop,{index:1})))}handleBackdropUpload(e){const t=this.props.vm;this.props.onShowImporting(),ar(e.target,((e,n,a,o,r)=>{rr(e,n,t,(e=>{this.props.vm.setEditingTarget(this.props.id),e.forEach(((e,t)=>{e.name=\"\".concat(a).concat(t?t+1:\"\")})),this.handleNewBackdrop(e).then((()=>{o===r-1&&this.props.onCloseImporting()}))}),this.props.onCloseImporting)}),this.props.onCloseImporting)}handleFileUploadClick(e){e.stopPropagation(),this.fileInput.click()}handleMouseEnter(){this.props.dispatchSetHoveredSprite(this.props.id)}handleMouseLeave(){this.props.dispatchSetHoveredSprite(null)}handleDrop(e){e.dragType===ra.COSTUME?this.props.vm.shareCostumeToTarget(e.index,this.props.id):e.dragType===ra.SOUND?this.props.vm.shareSoundToTarget(e.index,this.props.id):e.dragType===ra.BACKPACK_COSTUME?this.props.vm.addCostume(e.payload.body,{name:e.payload.name},this.props.id):e.dragType===ra.BACKPACK_SOUND?this.props.vm.addSound({md5:e.payload.body,name:e.payload.name},this.props.id):e.dragType===ra.BACKPACK_CODE&&Ss(e.payload.bodyUrl).then((e=>{const t=Aa(e,this.props.workspaceMetrics.targets[this.props.id],this.props.isRtl);this.props.vm.shareBlocksToTarget(t,this.props.id),this.props.vm.refreshWorkspace()}))}setFileInput(e){this.fileInput=e}setRef(e){this.ref=e}render(){const e=M()(this.props,[\"asset\",\"dispatchSetHoveredSprite\",\"id\",\"intl\",\"onActivateTab\",\"onSelect\",\"onShowImporting\",\"onCloseImporting\",\"isRtl\",\"workspaceMetrics\"]);return o.a.createElement(Bs,Us({componentRef:this.setRef,fileInputRef:this.setFileInput,onBackdropFileUpload:this.handleBackdropUpload,onBackdropFileUploadClick:this.handleFileUploadClick,onClick:this.handleClick,onDrop:this.handleDrop,onEmptyBackdropClick:this.handleEmptyBackdrop,onMouseEnter:this.handleMouseEnter,onMouseLeave:this.handleMouseLeave,onSurpriseBackdropClick:this.handleSurpriseBackdrop},e))}}Gs.propTypes=Ls(Ls({},Ps.propTypes),{},{id:i.a.string,intl:m.i.isRequired,isRtl:i.a.bool,onCloseImporting:i.a.func,onSelect:i.a.func,onShowImporting:i.a.func,workspaceMetrics:i.a.shape({targets:i.a.object})});var Fs=Object(m.h)(Object(l.b)(((e,t)=>{let{asset:n,id:a}=t;return{isRtl:e.locales.isRtl,url:n&&n.encodeDataURI(),vm:e.scratchGui.vm,receivedBlocks:e.scratchGui.hoveredTarget.receivedBlocks&&e.scratchGui.hoveredTarget.sprite===a,raised:e.scratchGui.blockDrag,workspaceMetrics:e.scratchGui.workspaceMetrics}}),(e=>({onNewBackdropClick:t=>{t.stopPropagation(),e(Object(w.t)())},onActivateTab:t=>{e(Object(b.d)(t))},dispatchSetHoveredSprite:t=>{e(Object(Za.c)(t))},onCloseImporting:()=>e(Object(W.c)(\"importingAsset\")),onShowImporting:()=>e(Object(W.i)(\"importingAsset\"))})))(Gs)),Zs=n(233),Ws=n.n(Zs);const Hs=[\"editingTarget\",\"fileInputRef\",\"hoveredTarget\",\"spriteLibraryVisible\",\"onActivateBlocksTab\",\"onChangeSpriteDirection\",\"onChangeSpriteName\",\"onChangeSpriteRotationStyle\",\"onChangeSpriteSize\",\"onChangeSpriteVisibility\",\"onChangeSpriteX\",\"onChangeSpriteY\",\"onDeleteSprite\",\"onDrop\",\"onDuplicateSprite\",\"onExportSprite\",\"onFileUploadClick\",\"onNewSpriteClick\",\"onPaintSpriteClick\",\"onRequestCloseSpriteLibrary\",\"onSelectSprite\",\"onSpriteUpload\",\"onSurpriseSpriteClick\",\"raiseSprites\",\"stage\",\"stageSize\",\"sprites\",\"vm\"];function Qs(){return Qs=Object.assign?Object.assign.bind():function(e){for(var t=1;t{let{editingTarget:t,fileInputRef:n,hoveredTarget:a,spriteLibraryVisible:r,onActivateBlocksTab:i,onChangeSpriteDirection:s,onChangeSpriteName:l,onChangeSpriteRotationStyle:c,onChangeSpriteSize:d,onChangeSpriteVisibility:u,onChangeSpriteX:p,onChangeSpriteY:m,onDeleteSprite:g,onDrop:h,onDuplicateSprite:b,onExportSprite:w,onFileUploadClick:f,onNewSpriteClick:M,onPaintSpriteClick:v,onRequestCloseSpriteLibrary:y,onSelectSprite:k,onSpriteUpload:j,onSurpriseSpriteClick:I,raiseSprites:S,stage:x,stageSize:E,sprites:C,vm:N}=e,_=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;at().then(this.handleActivateBlocksTab),deletedItem:\"Sprite\"})}handleDuplicateSprite(e){this.props.vm.duplicateSprite(e)}handleExportSprite(e){const t=this.props.vm.runtime.getTargetById(e).getName(),n=document.createElement(\"a\");document.body.appendChild(n),this.props.vm.exportSprite(e).then((e=>{Object(cr.a)(\"\".concat(t,\".sprite3\"),e)}))}handleSelectSprite(e){this.props.vm.setEditingTarget(e),this.props.stage&&e!==this.props.stage.id&&this.props.onHighlightTarget(e)}async handleSurpriseSpriteClick(){const e=(await Er()).filter((e=>-1===e.tags.indexOf(\"letters\")&&-1===e.tags.indexOf(\"numbers\"))),t=e[Math.floor(Math.random()*e.length)];Qo(t),this.props.vm.addSprite(JSON.stringify(t)).then(this.handleActivateBlocksTab)}handlePaintSpriteClick(){const e=this.props.intl.formatMessage,t=(n=e(lr.a.sprite,{index:1}),e(lr.a.pop),a=e(lr.a.costume,{index:1}),{objName:n,sounds:[],costumes:[{costumeName:a,baseLayerID:-1,baseLayerMD5:\"cd21514d0531fdffb22204e0ec5ed84a.svg\",bitmapResolution:1,rotationCenterX:0,rotationCenterY:0}],currentCostumeIndex:0,scratchX:36,scratchY:28,scale:1,direction:90,rotationStyle:\"normal\",isDraggable:!1,visible:!0,spriteInfo:{}});var n,a;this.props.vm.addSprite(JSON.stringify(t)).then((()=>{setTimeout((()=>{this.props.onActivateTab(b.b)}))}))}handleActivateBlocksTab(){this.props.onActivateTab(b.a)}handleNewSprite(e){return this.props.vm.addSprite(e).then(this.handleActivateBlocksTab).catch((e=>{N.default.error(e)}))}handleFileUploadClick(){this.fileInput.click()}handleSpriteUpload(e){const t=this.props.vm;this.props.onShowImporting(),ar(e.target,((e,n,a,o,r)=>{!function(e,t,n,a,o){let r=arguments.length>5&&void 0!==arguments[5]?arguments[5]:()=>{};switch(t){case\"\":case\"application/x-scratch2-sprite\":case\"application/x-scratch3-sprite\":case\"application/x.scratch2.sprite\":case\"application/x.scratch3.sprite\":case\"application/zip\":return void o(new Uint8Array(e));case\"image/svg+xml\":case\"image/png\":case\"image/bmp\":case\"image/jpeg\":case\"image/webp\":case\"image/gif\":return void rr(e,t,a,(e=>{e.forEach(((e,t)=>{e.name=\"\".concat(n).concat(t?t+1:\"\")}));const t={name:n,isStage:!1,x:0,y:0,visible:!0,size:100,rotationStyle:\"all around\",direction:90,draggable:!1,currentCostume:0,blocks:{},variables:{},costumes:e,sounds:[]};Qo(t),o(JSON.stringify(t))}),r);default:r(\"Encountered unexpected file type: \".concat(t))}}(e,n,a,t,(e=>{this.handleNewSprite(e).then((()=>{o===r-1&&this.props.onCloseImporting()})).catch(this.props.onCloseImporting)}),this.props.onCloseImporting)}),this.props.onCloseImporting)}setFileInput(e){this.fileInput=e}handleBlockDragEnd(e){this.props.hoveredTarget.sprite&&this.props.hoveredTarget.sprite!==this.props.editingTarget&&(this.shareBlocks(e,this.props.hoveredTarget.sprite,this.props.editingTarget),this.props.onReceivedBlocks(!0))}shareBlocks(e,t,n){const a=Aa(e,this.props.workspaceMetrics.targets[t],this.props.isRtl);return this.props.vm.shareBlocksToTarget(a,t,n)}handleDrop(e){const{sprite:t}=this.props.hoveredTarget;e.dragType===ra.SPRITE?this.props.vm.reorderTarget(e.index+1,e.newIndex+1):e.dragType===ra.BACKPACK_SPRITE?xs(e.payload.bodyUrl).then((e=>this.props.vm.addSprite(e))):t&&(e.dragType===ra.COSTUME?this.props.vm.shareCostumeToTarget(e.index,t):t&&e.dragType===ra.SOUND?this.props.vm.shareSoundToTarget(e.index,t):e.dragType===ra.BACKPACK_COSTUME?this.props.vm.addCostume(e.payload.body,{name:e.payload.name},t):e.dragType===ra.BACKPACK_SOUND?this.props.vm.addSound({md5:e.payload.body,name:e.payload.name},t):e.dragType===ra.BACKPACK_CODE&&Ss(e.payload.bodyUrl).then((e=>this.shareBlocks(e,t))).then((()=>this.props.vm.refreshWorkspace())))}render(){const e=this.props,{dispatchUpdateRestore:t,isRtl:n,onActivateTab:a,onCloseImporting:r,onHighlightTarget:i,onReceivedBlocks:s,onShowImporting:l,workspaceMetrics:c}=e,d=el(e,Js);return o.a.createElement(qs,$s({},d,{fileInputRef:this.setFileInput,onActivateBlocksTab:this.handleActivateBlocksTab,onChangeSpriteDirection:this.handleChangeSpriteDirection,onChangeSpriteName:this.handleChangeSpriteName,onChangeSpriteRotationStyle:this.handleChangeSpriteRotationStyle,onChangeSpriteSize:this.handleChangeSpriteSize,onChangeSpriteVisibility:this.handleChangeSpriteVisibility,onChangeSpriteX:this.handleChangeSpriteX,onChangeSpriteY:this.handleChangeSpriteY,onDeleteSprite:this.handleDeleteSprite,onDrop:this.handleDrop,onDuplicateSprite:this.handleDuplicateSprite,onExportSprite:this.handleExportSprite,onFileUploadClick:this.handleFileUploadClick,onPaintSpriteClick:this.handlePaintSpriteClick,onSelectSprite:this.handleSelectSprite,onSpriteUpload:this.handleSpriteUpload,onSurpriseSpriteClick:this.handleSurpriseSpriteClick}))}}const nl=qs.propTypes,{onSelectSprite:al,onActivateBlocksTab:ol}=nl,rl=el(nl,[\"onSelectSprite\",\"onActivateBlocksTab\"]);tl.propTypes=function(e){for(var t=1;t({editingTarget:e.scratchGui.targets.editingTarget,hoveredTarget:e.scratchGui.hoveredTarget,isRtl:e.locales.isRtl,spriteLibraryVisible:e.scratchGui.modals.spriteLibrary,sprites:e.scratchGui.targets.sprites,stage:e.scratchGui.targets.stage,raiseSprites:e.scratchGui.blockDrag,workspaceMetrics:e.scratchGui.workspaceMetrics})),(e=>({onNewSpriteClick:t=>{t.preventDefault(),e(Object(w.F)())},onRequestCloseSpriteLibrary:()=>{e(Object(w.m)())},onActivateTab:t=>{e(Object(b.d)(t))},onReceivedBlocks:t=>{e(Object(Za.d)(t))},dispatchUpdateRestore:t=>{e(Object(dr.c)(t))},onHighlightTarget:t=>{e(Object(V.b)(t))},onCloseImporting:()=>e(Object(W.c)(\"importingAsset\")),onShowImporting:()=>e(Object(W.i)(\"importingAsset\"))})))(tl)),sl=n(322),ll=n.n(sl),cl=n(323),dl=n.n(cl),ul=n(324),pl=n.n(ul),ml=n(325),gl=n.n(ml);const hl=1e7,bl=function(e,t,n){let a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:.55;const o=n-t;if(0===o)return 0;let r=0;for(let a=t;a1&&void 0!==arguments[1]?arguments[1]:1024;const n=e.length,a=[];for(let o=0;o{const i={format:\"\",dataFormat:\"wav\",rate:n,sampleCount:t.length},s=e.runtime.storage;i.asset=s.createAsset(s.AssetType.Sound,s.DataFormat.WAV,new Uint8Array(r),null,!0),i.assetId=i.asset.assetId,i.md5=\"\".concat(i.assetId,\".\").concat(i.dataFormat),i.name=a,e.addSound(i).then((()=>{o&&o()}))}))};var Ml=n(125),vl=n.n(Ml);const yl=e=>{const{level:t,width:n,height:a}=e,r=2.5,i=(a-50)/19,s=((19-Math.floor(19*t))*(i+r)+1.25)/a;return o.a.createElement(\"div\",{className:vl.a.maskContainer,style:{height:\"\".concat(a,\"px\")}},o.a.createElement(\"svg\",{className:vl.a.container,height:a,width:n},Array(19).fill(0).map(((e,t)=>o.a.createElement(\"rect\",{className:t<11?vl.a.green:t<16?vl.a.yellow:vl.a.red,height:i,key:t,rx:3,ry:3,width:n-2,x:1,y:a-(r+i)*(t+1)})))),o.a.createElement(\"div\",{className:vl.a.mask,style:{transform:\"scaleY(\".concat(s,\")\")}}))};yl.propTypes={height:i.a.number,level:i.a.number,width:i.a.number};var kl=yl,jl=n(234),Il=n.n(jl);class Sl extends o.a.PureComponent{render(){const{width:e,height:t,data:n}=this.props,a=Math.ceil(n.length/e),r=1===a?n.slice(0):n.filter(((e,t)=>t%a===0));1===r.length&&r.push(r[0]);const i=r.length-1,s=[...r.map(((n,a)=>[e*(a/i),t*n/2])),...r.reverse().map(((n,a)=>[e*(1-a/i),-t*n/2]))],l=s.map(((e,t)=>{let[n,a]=e;const[o,r]=s[to.a.createElement(Oe.a,null,o.a.createElement(Oe.a,{className:Cl.a.visualizationContainer},o.a.createElement(Oe.a,{className:Cl.a.meterContainer},o.a.createElement(kl,{height:172,level:e.level,width:20})),o.a.createElement(Oe.a,{className:Cl.a.waveformContainer},e.levels?o.a.createElement(xl,{data:e.levels,height:150,level:0,width:440}):o.a.createElement(\"span\",{className:Cl.a.helpText},e.listening?e.intl.formatMessage(Dl.beginRecord):e.intl.formatMessage(Dl.permission,{arrow:e.isRtl?\"↗️  \":\"↖️  \"})))),o.a.createElement(Oe.a,{className:Cl.a.mainButtonRow},o.a.createElement(\"button\",{className:Cl.a.mainButton,disabled:!e.listening,onClick:e.recording?e.onStopRecording:e.onRecord},e.recording?o.a.createElement(\"img\",{draggable:!1,src:_l.a}):o.a.createElement(\"svg\",{className:Cl.a.recordButton,height:\"52\",width:\"52\"},o.a.createElement(\"circle\",{className:Cl.a.recordButtonCircle,cx:\"26\",cy:\"26\",r:\"25\"}),o.a.createElement(\"circle\",{className:Cl.a.recordButtonCircleOutline,cx:\"26\",cy:\"26\",r:27+5*e.level})),o.a.createElement(\"div\",{className:Cl.a.helpText},o.a.createElement(\"span\",{className:Cl.a.recordingText},e.recording?e.intl.formatMessage(Dl.stop):e.intl.formatMessage(Dl.record))))));Tl.propTypes={intl:m.i.isRequired,isRtl:i.a.bool,level:i.a.number,levels:i.a.arrayOf(i.a.number),listening:i.a.bool,onRecord:i.a.func.isRequired,onStopRecording:i.a.func.isRequired,recording:i.a.bool};var Ol=Object(m.h)(Tl),Al=(n(631),n(219)),Pl=n.n(Al);var zl=class{constructor(){this.audioContext=new $o,this.bufferLength=8192,this.userMediaStream=null,this.mediaStreamSource=null,this.sourceNode=null,this.scriptProcessorNode=null,this.recordedSamples=0,this.recording=!1,this.started=!1,this.buffers=[],this.disposed=!1}startListening(e,t,n){try{Pl()({audio:!0}).then((n=>{this.disposed||(this.started=!0,e(),this.attachUserMediaStream(n,t))})).catch((e=>{this.disposed||n(e)}))}catch(e){this.disposed||n(e)}}startRecording(){this.recording=!0}attachUserMediaStream(e,t){this.userMediaStream=e,this.mediaStreamSource=this.audioContext.createMediaStreamSource(e),this.sourceNode=this.audioContext.createGain(),this.scriptProcessorNode=this.audioContext.createScriptProcessor(this.bufferLength,1,1),this.scriptProcessorNode.onaudioprocess=e=>{this.recording&&!this.disposed&&this.buffers.push(new Float32Array(e.inputBuffer.getChannelData(0)))},this.analyserNode=this.audioContext.createAnalyser(),this.analyserNode.fftSize=2048;const n=this.analyserNode.frequencyBinCount,a=new Float32Array(n),o=()=>{var e,n;this.disposed||(this.analyserNode.getFloatTimeDomainData(a),t(bl(e=a,0,e.length,n)),requestAnimationFrame(o))};requestAnimationFrame(o),this.mediaStreamSource.connect(this.sourceNode),this.sourceNode.connect(this.analyserNode),this.analyserNode.connect(this.scriptProcessorNode),this.scriptProcessorNode.connect(this.audioContext.destination)}stop(){const e=new Float32Array(this.buffers.length*this.bufferLength);let t=0;for(let n=0;na&&(null===o&&(o=e+1),r=e+1);let i=Math.max(2,o-2)/this.buffers.length,s=Math.min(this.buffers.length-2,r+2)/this.buffers.length;return i>=s&&(i=0,s=1),{levels:n,samples:e,sampleRate:this.audioContext.sampleRate,trimStart:i,trimEnd:s}}dispose(){this.started&&(this.scriptProcessorNode.onaudioprocess=null,this.scriptProcessorNode.disconnect(),this.analyserNode.disconnect(),this.sourceNode.disconnect(),this.mediaStreamSource.disconnect(),this.userMediaStream.getAudioTracks()[0].stop()),this.disposed=!0}};const Ll=[\"onRecord\",\"onStopRecording\"];function Rl(){return Rl=Object.assign?Object.assign.bind():function(e){for(var t=1;t{const e=\"object\"==typeof Recolor?Wl.replace(/#855cd6/gi,Recolor.primary):Wl;return\"data:image/svg+xml;,\"+encodeURIComponent(e)};const Ql=e=>o.a.createElement(Oe.a,{className:ye()(Zl.a.trimLine,e.handleStyle),onMouseDown:e.onMouseDown,onTouchStart:e.onMouseDown},o.a.createElement(Oe.a,{className:ye()(Zl.a.trimHandle,Zl.a.topTrimHandle)},o.a.createElement(Wt,{src:Hl,draggable:!1})),o.a.createElement(Oe.a,{className:ye()(Zl.a.trimHandle,Zl.a.bottomTrimHandle)},o.a.createElement(Wt,{src:Hl,draggable:!1})));Ql.propTypes={handleStyle:i.a.string,onMouseDown:i.a.func};var Yl=Ql;const Vl=e=>o.a.createElement(\"div\",{className:Zl.a.playheadContainer},o.a.createElement(\"div\",{className:ye()(Zl.a.playhead),style:{transform:\"translateX(\".concat(100*e.playbackPosition,\"%)\")}}));Vl.propTypes={playbackPosition:i.a.number};var ql=Vl;const Jl=e=>o.a.createElement(\"div\",{className:ye()(Zl.a.absolute,Zl.a.trimmer),ref:e.containerRef},null===e.trimStart?null:o.a.createElement(Oe.a,{className:ye()(Zl.a.absolute,Zl.a.trimBackground,Zl.a.startTrimBackground),style:{width:\"\".concat(100*e.trimStart,\"%\")},onMouseDown:e.onTrimStartMouseDown,onTouchStart:e.onTrimStartMouseDown},o.a.createElement(Oe.a,{className:ye()(Zl.a.absolute,Zl.a.trimBackgroundMask)}),o.a.createElement(Yl,{handleStyle:Zl.a.leftHandle})),e.playhead?o.a.createElement(ql,{playbackPosition:e.playhead}):null,null===e.trimEnd?null:o.a.createElement(Oe.a,{className:ye()(Zl.a.absolute,Zl.a.trimBackground,Zl.a.endTrimBackground),style:{left:\"\".concat(100*e.trimEnd,\"%\"),width:\"\".concat(100-100*e.trimEnd,\"%\")},onMouseDown:e.onTrimEndMouseDown,onTouchStart:e.onTrimEndMouseDown},o.a.createElement(Oe.a,{className:ye()(Zl.a.absolute,Zl.a.trimBackgroundMask)}),o.a.createElement(Yl,{handleStyle:Zl.a.rightHandle})));Jl.propTypes={containerRef:i.a.func,onTrimEndMouseDown:i.a.func.isRequired,onTrimStartMouseDown:i.a.func.isRequired,playhead:i.a.number,trimEnd:i.a.number,trimStart:i.a.number};var Xl=Jl;class Kl extends o.a.Component{constructor(e){super(e),E()(this,[\"handleTrimStartMouseDown\",\"handleTrimEndMouseDown\",\"handleTrimStartMouseMove\",\"handleTrimEndMouseMove\",\"storeRef\"]),this.trimStartDragRecognizer=new qa({onDrag:this.handleTrimStartMouseMove,touchDragAngle:90,distanceThreshold:0}),this.trimEndDragRecognizer=new qa({onDrag:this.handleTrimEndMouseMove,touchDragAngle:90,distanceThreshold:0})}handleTrimStartMouseMove(e,t){const n=(e.x-t.x)/this.containerSize,a=Math.max(0,Math.min(this.props.trimEnd-.01,this.initialTrim+n));this.props.onSetTrimStart(a)}handleTrimEndMouseMove(e,t){const n=(e.x-t.x)/this.containerSize,a=Math.min(1,Math.max(this.props.trimStart+.01,this.initialTrim+n));this.props.onSetTrimEnd(a)}handleTrimStartMouseDown(e){this.containerSize=this.containerElement.getBoundingClientRect().width,this.trimStartDragRecognizer.start(e),this.initialTrim=this.props.trimStart}handleTrimEndMouseDown(e){this.containerSize=this.containerElement.getBoundingClientRect().width,this.trimEndDragRecognizer.start(e),this.initialTrim=this.props.trimEnd}storeRef(e){this.containerElement=e}render(){return o.a.createElement(Xl,{containerRef:this.storeRef,playhead:this.props.playhead,trimEnd:this.props.trimEnd,trimStart:this.props.trimStart,onTrimEndMouseDown:this.handleTrimEndMouseDown,onTrimStartMouseDown:this.handleTrimStartMouseDown})}}Kl.propTypes={onSetTrimEnd:i.a.func,onSetTrimStart:i.a.func,playhead:i.a.number,trimEnd:i.a.number,trimStart:i.a.number};var $l=Kl;const ec='\\n\\n \\x3c!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch --\\x3e\\n re-record\\n Created with Sketch.\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n\\n';var tc=()=>{const e=\"object\"==typeof Recolor?ec.replace(/#855cd6/gi,Recolor.primary):ec;return\"data:image/svg+xml;,\"+encodeURIComponent(e)};const nc='\\n\\n \\x3c!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch --\\x3e\\n stop-playback\\n Created with Sketch.\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n\\n';var ac=()=>{const e=\"object\"==typeof Recolor?nc.replace(/#855cd6/gi,Recolor.primary):nc;return\"data:image/svg+xml;,\"+encodeURIComponent(e)};const oc='\\n\\n \\x3c!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch --\\x3e\\n play\\n Created with Sketch.\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n\\n';var rc=()=>{const e=\"object\"==typeof Recolor?oc.replace(/#855cd6/gi,Recolor.primary):oc;return\"data:image/svg+xml;,\"+encodeURIComponent(e)};const ic=Object(m.g)({stopMsg:{id:\"gui.playbackStep.stopMsg\",defaultMessage:\"Stop\"},playMsg:{id:\"gui.playbackStep.playMsg\",defaultMessage:\"Play\"},loadingMsg:{id:\"gui.playbackStep.loadingMsg\",defaultMessage:\"Loading...\"},saveMsg:{id:\"gui.playbackStep.saveMsg\",defaultMessage:\"Save\"},reRecordMsg:{id:\"gui.playbackStep.reRecordMsg\",defaultMessage:\"Re-record\"}}),sc=e=>o.a.createElement(Oe.a,null,o.a.createElement(Oe.a,{className:Cl.a.visualizationContainer},o.a.createElement(Oe.a,{className:Cl.a.meterContainer},o.a.createElement(kl,{height:172,level:0,width:20})),o.a.createElement(Oe.a,{className:Cl.a.waveformContainer},o.a.createElement(xl,{data:e.levels,height:150,level:0,width:480}),o.a.createElement($l,{playhead:e.playhead,trimEnd:e.trimEnd,trimStart:e.trimStart,onSetTrimEnd:e.onSetTrimEnd,onSetTrimStart:e.onSetTrimStart}))),o.a.createElement(Oe.a,{className:Cl.a.mainButtonRow},o.a.createElement(\"button\",{className:Cl.a.mainButton,onClick:e.playing?e.onStopPlaying:e.onPlay},o.a.createElement(Wt,{draggable:!1,src:e.playing?ac:rc}),o.a.createElement(\"div\",{className:Cl.a.helpText},o.a.createElement(\"span\",{className:Cl.a.playingText},e.playing?e.intl.formatMessage(ic.stopMsg):e.intl.formatMessage(ic.playMsg))))),o.a.createElement(Oe.a,{className:Cl.a.buttonRow},o.a.createElement(\"button\",{className:Cl.a.rerecordButton,onClick:e.onBack},o.a.createElement(Wt,{draggable:!1,src:tc}),e.intl.formatMessage(ic.reRecordMsg)),o.a.createElement(\"button\",{className:Cl.a.okButton,disabled:e.encoding,onClick:e.onSubmit},e.encoding?e.intl.formatMessage(ic.loadingMsg):e.intl.formatMessage(ic.saveMsg))));sc.propTypes={encoding:i.a.bool.isRequired,intl:m.i.isRequired,levels:i.a.arrayOf(i.a.number).isRequired,onBack:i.a.func.isRequired,onPlay:i.a.func.isRequired,onSetTrimEnd:i.a.func.isRequired,onSetTrimStart:i.a.func.isRequired,onStopPlaying:i.a.func.isRequired,onSubmit:i.a.func.isRequired,playhead:i.a.number,playing:i.a.bool.isRequired,trimEnd:i.a.number.isRequired,trimStart:i.a.number.isRequired};var lc=Object(m.h)(sc);var cc=class{constructor(e,t){this.audioContext=new $o,this.buffer=this.audioContext.createBuffer(1,e.length,t),this.buffer.getChannelData(0).set(e),this.source=null,this.startTime=null,this.updateCallback=null,this.trimStart=null,this.trimEnd=null}play(e,t,n,a){this.updateCallback=n,this.trimStart=e,this.trimEnd=t,this.startTime=Date.now();const o=this.buffer.duration*e,r=this.buffer.duration*t-o;this.source=this.audioContext.createBufferSource(),this.source.onended=a,this.source.buffer=this.buffer,this.source.connect(this.audioContext.destination),this.source.start(0,o,r),this.update()}update(){const e=(Date.now()-this.startTime)/1e3/this.buffer.duration;e+this.trimStarto.a.createElement(He,{className:Cl.a.modalContent,contentLabel:e.intl.formatMessage(bc.title),onRequestClose:e.onCancel},o.a.createElement(Oe.a,{className:Cl.a.body},e.samples?o.a.createElement(hc,{encoding:e.encoding,levels:e.levels,playhead:e.playhead,playing:e.playing,sampleRate:e.sampleRate,samples:e.samples,trimEnd:e.trimEnd,trimStart:e.trimStart,onBack:e.onBack,onPlay:e.onPlay,onSetPlayhead:e.onSetPlayhead,onSetTrimEnd:e.onSetTrimEnd,onSetTrimStart:e.onSetTrimStart,onStopPlaying:e.onStopPlaying,onSubmit:e.onSubmit}):o.a.createElement(Gl,{recording:e.recording,onRecord:e.onRecord,onStopRecording:e.onStopRecording})));wc.propTypes={encoding:i.a.bool.isRequired,intl:m.i.isRequired,levels:i.a.arrayOf(i.a.number),onBack:i.a.func.isRequired,onCancel:i.a.func.isRequired,onPlay:i.a.func.isRequired,onRecord:i.a.func.isRequired,onSetPlayhead:i.a.func.isRequired,onSetTrimEnd:i.a.func.isRequired,onSetTrimStart:i.a.func.isRequired,onStopPlaying:i.a.func.isRequired,onStopRecording:i.a.func.isRequired,onSubmit:i.a.func.isRequired,playhead:i.a.number,playing:i.a.bool,recording:i.a.bool,sampleRate:i.a.number,samples:i.a.instanceOf(Float32Array),trimEnd:i.a.number.isRequired,trimStart:i.a.number.isRequired};var fc=Object(m.h)(wc);class Mc extends o.a.Component{constructor(e){super(e),E()(this,[\"handleRecord\",\"handleStopRecording\",\"handlePlay\",\"handleStopPlaying\",\"handleBack\",\"handleSubmit\",\"handleCancel\",\"handleSetPlayhead\",\"handleSetTrimStart\",\"handleSetTrimEnd\"]),this.state={samples:null,encoding:!1,levels:null,playhead:null,playing:!1,recording:!1,sampleRate:null,trimStart:0,trimEnd:1}}handleRecord(){this.setState({recording:!0})}handleStopRecording(e,t,n,a,o){e.length>0&&this.setState({samples:e,sampleRate:t,levels:n,trimStart:a,trimEnd:o,recording:!1})}handlePlay(){this.setState({playing:!0})}handleStopPlaying(){this.setState({playing:!1,playhead:null})}handleBack(){this.setState({playing:!1,samples:null})}handleSetTrimEnd(e){this.setState({trimEnd:e})}handleSetTrimStart(e){this.setState({trimStart:e})}handleSetPlayhead(e){this.setState({playhead:e})}handleSubmit(){this.setState({encoding:!0},(()=>{const e=this.state.samples.length,t=Math.floor(this.state.trimStart*e),n=Math.floor(this.state.trimEnd*e),a=this.state.samples.slice(t,n);fl(this.props.vm,a,this.state.sampleRate,\"recording1\",(()=>{this.props.onClose(),this.props.onNewSound()}))}))}handleCancel(){this.props.onClose()}render(){return o.a.createElement(fc,{encoding:this.state.encoding,levels:this.state.levels,playhead:this.state.playhead,playing:this.state.playing,recording:this.state.recording,sampleRate:this.state.sampleRate,samples:this.state.samples,trimEnd:this.state.trimEnd,trimStart:this.state.trimStart,onBack:this.handleBack,onCancel:this.handleCancel,onPlay:this.handlePlay,onRecord:this.handleRecord,onSetPlayhead:this.handleSetPlayhead,onSetTrimEnd:this.handleSetTrimEnd,onSetTrimStart:this.handleSetTrimStart,onStopPlaying:this.handleStopPlaying,onStopRecording:this.handleStopRecording,onSubmit:this.handleSubmit})}}Mc.propTypes={onClose:i.a.func,onNewSound:i.a.func,vm:i.a.instanceOf(p.a)};var vc=Object(l.b)((e=>({vm:e.scratchGui.vm})),(e=>({onClose:()=>{e(Object(w.l)())}})))(Mc);class yc{static get DELAY_TIME(){return.25}static get TAIL_SECONDS(){return.75}constructor(e,t,n){this.audioContext=e,this.input=this.audioContext.createGain(),this.output=this.audioContext.createGain(),this.effectInput=this.audioContext.createGain(),this.effectInput.gain.value=0,this.effectInput.gain.setValueAtTime(.75,t),this.effectInput.gain.setValueAtTime(0,n),this.delay=this.audioContext.createDelay(1),this.delay.delayTime.value=yc.DELAY_TIME,this.decay=this.audioContext.createGain(),this.decay.gain.value=.3,this.compressor=this.audioContext.createDynamicsCompressor(),this.compressor.threshold.value=-5,this.compressor.knee.value=15,this.compressor.ratio.value=12,this.compressor.attack.value=0,this.compressor.release.value=.25,this.input.connect(this.effectInput),this.effectInput.connect(this.delay),this.delay.connect(this.compressor),this.input.connect(this.compressor),this.delay.connect(this.decay),this.decay.connect(this.delay),this.compressor.connect(this.output)}}var kc=yc;var jc=class{constructor(e,t,n){this.audioContext=e,this.input=this.audioContext.createGain(),this.output=this.audioContext.createGain(),this.passthrough=this.audioContext.createGain(),this.effectInput=this.audioContext.createGain(),this.passthrough.gain.value=1,this.effectInput.gain.value=0,this.passthrough.gain.setValueAtTime(0,t),this.passthrough.gain.setValueAtTime(1,n),this.effectInput.gain.setValueAtTime(1,t),this.effectInput.gain.setValueAtTime(0,n);const a=()=>{const e=this.audioContext.createWaveShaper(),t=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:.2,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:.4,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:.65;return e<=t?0:e<=n?a*(Math.pow(e-t,2)/(2*n-2*t)):a*e-a*n+a*(Math.pow(e-t,2)/(2*n-2*t))},n=1024,a=new Float32Array(n);for(let e=0;e=r&&e{let{renderedBuffer:n}=t;e(n,this.adjustedTrimStart,this.adjustedTrimEnd)}}};const Nc=e=>o.a.createElement(\"div\",{className:ye()(Zl.a.absolute,Zl.a.selector),ref:e.containerRef,onMouseDown:e.onNewSelectionMouseDown,onTouchStart:e.onNewSelectionMouseDown},null===e.trimStart?null:o.a.createElement(Oe.a,{className:ye()(Zl.a.absolute),style:{left:\"\".concat(100*e.trimStart,\"%\"),width:\"\".concat(100*(e.trimEnd-e.trimStart),\"%\")}},o.a.createElement(Oe.a,{className:ye()(Zl.a.absolute,Zl.a.selectionBackground)}),o.a.createElement(Yl,{handleStyle:Zl.a.leftHandle,onMouseDown:e.onTrimStartMouseDown}),o.a.createElement(Yl,{handleStyle:Zl.a.rightHandle,onMouseDown:e.onTrimEndMouseDown})),e.playhead?o.a.createElement(ql,{playbackPosition:e.playhead}):null);Nc.propTypes={containerRef:i.a.func,onNewSelectionMouseDown:i.a.func.isRequired,onTrimEndMouseDown:i.a.func.isRequired,onTrimStartMouseDown:i.a.func.isRequired,playhead:i.a.number,trimEnd:i.a.number,trimStart:i.a.number};var _c=Nc;class Dc extends o.a.Component{constructor(e){super(e),E()(this,[\"handleNewSelectionMouseDown\",\"handleTrimStartMouseDown\",\"handleTrimEndMouseDown\",\"handleTrimStartMouseMove\",\"handleTrimEndMouseMove\",\"handleTrimStartMouseUp\",\"handleTrimEndMouseUp\",\"storeRef\"]),this.state={trimStart:e.trimStart,trimEnd:e.trimEnd},this.clickStartTime=0,this.trimStartDragRecognizer=new qa({onDrag:this.handleTrimStartMouseMove,onDragEnd:this.handleTrimStartMouseUp,touchDragAngle:90,distanceThreshold:0}),this.trimEndDragRecognizer=new qa({onDrag:this.handleTrimEndMouseMove,onDragEnd:this.handleTrimEndMouseUp,touchDragAngle:90,distanceThreshold:0})}componentWillReceiveProps(e){const{trimStart:t,trimEnd:n}=this.props;e.trimStart===t&&e.trimEnd===n||this.setState({trimStart:e.trimStart,trimEnd:e.trimEnd})}clearSelection(){this.props.onSetTrim(null,null)}handleNewSelectionMouseDown(e){const{width:t,left:n}=this.containerElement.getBoundingClientRect();this.initialTrimEnd=(Ya(e).x-n)/t,this.initialTrimStart=this.initialTrimEnd,this.props.onSetTrim(this.initialTrimStart,this.initialTrimEnd),this.clickStartTime=Date.now(),this.containerSize=t,this.trimEndDragRecognizer.start(e),e.preventDefault()}handleTrimStartMouseMove(e,t){const n=(e.x-t.x)/this.containerSize,a=Math.max(0,Math.min(1,this.initialTrimStart+n));a>this.initialTrimEnd?this.setState({trimStart:this.initialTrimEnd,trimEnd:a}):this.setState({trimStart:a,trimEnd:this.initialTrimEnd})}handleTrimEndMouseMove(e,t){const n=(e.x-t.x)/this.containerSize,a=Math.min(1,Math.max(0,this.initialTrimEnd+n));a{let{img:t,disabled:n,className:a,title:r,onClick:i}=e;return o.a.createElement(\"div\",{className:ye()(Ac.a.container,a,n?Ac.a.disabled:null),role:\"button\",onClick:n?null:i},o.a.createElement(Wt,{className:Ac.a.icon,draggable:!1,src:t}),o.a.createElement(\"div\",{className:Ac.a.title},r))};Pc.propTypes={className:i.a.string,disabled:i.a.bool,img:i.a.oneOfType([i.a.func,i.a.string]),onClick:i.a.func.isRequired,title:i.a.node.isRequired};var zc=Pc,Lc=n(19),Rc=n.n(Lc),Uc=n(327),Bc=n.n(Uc),Gc=n(328),Fc=n.n(Gc);const Zc='\\n\\n \\x3c!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch --\\x3e\\n redo\\n Created with Sketch.\\n \\n \\n \\n \\n \\n \\n\\n';var Wc=()=>{const e=\"object\"==typeof Recolor?Zc.replace(/#855cd6/gi,Recolor.primary):Zc;return\"data:image/svg+xml;,\"+encodeURIComponent(e)};const Hc='\\n\\n \\x3c!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch --\\x3e\\n undo\\n Created with Sketch.\\n \\n \\n \\n \\n \\n \\n\\n';var Qc=()=>{const e=\"object\"==typeof Recolor?Hc.replace(/#855cd6/gi,Recolor.primary):Hc;return\"data:image/svg+xml;,\"+encodeURIComponent(e)},Yc=n(329),Vc=n.n(Yc),qc=n(330),Jc=n.n(qc),Xc=n(331),Kc=n.n(Xc),$c=n(332),ed=n.n($c),td=n(333),nd=n.n(td),ad=n(334),od=n.n(ad),rd=n(335),id=n.n(rd),sd=n(336),ld=n.n(sd),cd=n(337),dd=n.n(cd),ud=n(338),pd=n.n(ud);const md='\\n\\n \\x3c!-- Generator: Sketch 55.2 (78181) - https://sketchapp.com --\\x3e\\n Sound/General/Trim\\n Created with Sketch.\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n\\n';var gd=()=>{const e=\"object\"==typeof Recolor?md.replace(/#855cd6/gi,Recolor.primary):md;return\"data:image/svg+xml;,\"+encodeURIComponent(e)};const hd='\\n\\n \\x3c!-- Generator: Sketch 56.1 (81669) - https://sketch.com --\\x3e\\n Sound/General/Copy\\n Created with Sketch.\\n \\n \\n \\n \\n \\n \\n \\n \\n\\n';var bd=()=>{const e=\"object\"==typeof Recolor?hd.replace(/#855cd6/gi,Recolor.primary):hd;return\"data:image/svg+xml;,\"+encodeURIComponent(e)};const wd='\\n\\n \\x3c!-- Generator: Sketch 56.1 (81669) - https://sketch.com --\\x3e\\n Sound/General/Paste\\n Created with Sketch.\\n \\n \\n \\n\\n';var fd=()=>{const e=\"object\"==typeof Recolor?wd.replace(/#855cd6/gi,Recolor.primary):wd;return\"data:image/svg+xml;,\"+encodeURIComponent(e)};const Md='\\n\\n \\x3c!-- Generator: Sketch 56.1 (81669) - https://sketch.com --\\x3e\\n Sound/General/Copy to New\\n Created with Sketch.\\n \\n \\n \\n\\n';var vd=()=>{const e=\"object\"==typeof Recolor?Md.replace(/#855cd6/gi,Recolor.primary):Md;return\"data:image/svg+xml;,\"+encodeURIComponent(e)};const yd=Object(Wr.a)(Zr.a),kd=Object(m.g)({sound:{id:\"gui.soundEditor.sound\",defaultMessage:\"Sound\"},play:{id:\"gui.soundEditor.play\",defaultMessage:\"Play\"},stop:{id:\"gui.soundEditor.stop\",defaultMessage:\"Stop\"},copy:{id:\"gui.soundEditor.copy\",defaultMessage:\"Copy\"},paste:{id:\"gui.soundEditor.paste\",defaultMessage:\"Paste\"},copyToNew:{id:\"gui.soundEditor.copyToNew\",defaultMessage:\"Copy to New\"},delete:{id:\"gui.soundEditor.delete\",defaultMessage:\"Delete\"},save:{id:\"gui.soundEditor.save\",defaultMessage:\"Save\"},undo:{id:\"gui.soundEditor.undo\",defaultMessage:\"Undo\"},redo:{id:\"gui.soundEditor.redo\",defaultMessage:\"Redo\"},faster:{id:\"gui.soundEditor.faster\",defaultMessage:\"Faster\"},slower:{id:\"gui.soundEditor.slower\",defaultMessage:\"Slower\"},echo:{id:\"gui.soundEditor.echo\",defaultMessage:\"Echo\"},robot:{id:\"gui.soundEditor.robot\",defaultMessage:\"Robot\"},louder:{id:\"gui.soundEditor.louder\",defaultMessage:\"Louder\"},softer:{id:\"gui.soundEditor.softer\",defaultMessage:\"Softer\"},reverse:{id:\"gui.soundEditor.reverse\",defaultMessage:\"Reverse\"},fadeOut:{id:\"gui.soundEditor.fadeOut\",defaultMessage:\"Fade out\"},fadeIn:{id:\"gui.soundEditor.fadeIn\",defaultMessage:\"Fade in\"},mute:{id:\"gui.soundEditor.mute\",defaultMessage:\"Mute\"}}),jd=e=>{const t=Math.floor(e/60).toString().padStart(2,\"0\"),n=(e%60).toFixed(2).padStart(5,\"0\");return\"\".concat(t,\":\").concat(n)},Id=e=>{return o.a.createElement(\"div\",{className:Rc.a.editorContainer,ref:e.setRef,onMouseDown:e.onContainerClick},o.a.createElement(\"div\",{className:Rc.a.row},o.a.createElement(\"div\",{className:Rc.a.inputGroup},o.a.createElement(Fr,{text:e.intl.formatMessage(kd.sound)},o.a.createElement(yd,{tabIndex:\"1\",type:\"text\",value:e.name,onSubmit:e.onChangeName,className:Rc.a.nameInput})),o.a.createElement(\"div\",{className:Rc.a.buttonGroup},o.a.createElement(\"button\",{className:Rc.a.button,disabled:!e.canUndo,title:e.intl.formatMessage(kd.undo),onClick:e.onUndo},o.a.createElement(Wt,{className:Rc.a.undoIcon,draggable:!1,src:Qc})),o.a.createElement(\"button\",{className:Rc.a.button,disabled:!e.canRedo,title:e.intl.formatMessage(kd.redo),onClick:e.onRedo},o.a.createElement(Wt,{className:Rc.a.redoIcon,draggable:!1,src:Wc})))),o.a.createElement(\"div\",{className:Rc.a.inputGroup},o.a.createElement(zc,{className:Rc.a.toolButton,img:bd,title:e.intl.formatMessage(kd.copy),onClick:e.onCopy}),o.a.createElement(zc,{className:Rc.a.toolButton,disabled:!1===e.canPaste,img:fd,title:e.intl.formatMessage(kd.paste),onClick:e.onPaste}),o.a.createElement(zc,{className:ye()(Rc.a.toolButton,Rc.a.flipInRtl),img:vd,title:e.intl.formatMessage(kd.copyToNew),onClick:e.onCopyToNew})),o.a.createElement(zc,{className:Rc.a.toolButton,disabled:null===e.trimStart,img:gd,title:e.intl.formatMessage(kd.delete),onClick:e.onDelete})),o.a.createElement(\"div\",{className:Rc.a.row},o.a.createElement(\"div\",{className:Rc.a.waveformContainer},o.a.createElement(xl,{data:e.chunkLevels,height:160,width:600}),o.a.createElement(Tc,{playhead:e.playhead,trimEnd:e.trimEnd,trimStart:e.trimStart,onPlay:e.onPlay,onSetTrim:e.onSetTrim,onStop:e.onStop}))),o.a.createElement(\"div\",{className:ye()(Rc.a.row,Rc.a.rowReverse)},o.a.createElement(\"div\",{className:ye()(Rc.a.roundButtonOuter,Rc.a.inputGroup)},e.playhead?o.a.createElement(\"button\",{className:ye()(Rc.a.roundButton,Rc.a.stopButtonn),title:e.intl.formatMessage(kd.stop),onClick:e.onStop},o.a.createElement(\"img\",{draggable:!1,src:Fc.a})):o.a.createElement(\"button\",{className:ye()(Rc.a.roundButton,Rc.a.playButton),title:e.intl.formatMessage(kd.play),onClick:e.onPlay},o.a.createElement(\"img\",{draggable:!1,src:Bc.a}))),o.a.createElement(\"div\",{className:Rc.a.effects},o.a.createElement(zc,{className:Rc.a.effectButton,img:Vc.a,title:o.a.createElement(m.b,kd.faster),onClick:e.onFaster}),o.a.createElement(zc,{className:Rc.a.effectButton,img:Jc.a,title:o.a.createElement(m.b,kd.slower),onClick:e.onSlower}),o.a.createElement(zc,{disabled:e.tooLoud,className:ye()(Rc.a.effectButton,Rc.a.flipInRtl),img:Kc.a,title:o.a.createElement(m.b,kd.louder),onClick:e.onLouder}),o.a.createElement(zc,{className:ye()(Rc.a.effectButton,Rc.a.flipInRtl),img:ed.a,title:o.a.createElement(m.b,kd.softer),onClick:e.onSofter}),o.a.createElement(zc,{className:ye()(Rc.a.effectButton,Rc.a.flipInRtl),img:pd.a,title:o.a.createElement(m.b,kd.mute),onClick:e.onMute}),o.a.createElement(zc,{className:Rc.a.effectButton,img:dd.a,title:o.a.createElement(m.b,kd.fadeIn),onClick:e.onFadeIn}),o.a.createElement(zc,{className:Rc.a.effectButton,img:ld.a,title:o.a.createElement(m.b,kd.fadeOut),onClick:e.onFadeOut}),o.a.createElement(zc,{className:Rc.a.effectButton,img:id.a,title:o.a.createElement(m.b,kd.reverse),onClick:e.onReverse}),o.a.createElement(zc,{className:Rc.a.effectButton,img:nd.a,title:o.a.createElement(m.b,kd.robot),onClick:e.onRobot}),o.a.createElement(zc,{className:Rc.a.effectButton,img:od.a,title:o.a.createElement(m.b,kd.echo),onClick:e.onEcho}))),o.a.createElement(\"div\",{className:Rc.a.infoRow},o.a.createElement(\"div\",{className:Rc.a.duration},((e,t,n,a)=>{const o=(n=null===n?1:n)-(t=null===t?0:t)||1,r=o*a;return\"\".concat(jd(((e=null===e?t:e)-t)/o*r),\" / \").concat(jd(r))})(e.playhead,e.trimStart,e.trimEnd,e.duration)),o.a.createElement(\"div\",{className:Rc.a.advancedInfo},e.isStereo?o.a.createElement(m.b,{defaultMessage:\"Stereo\",id:\"tw.stereo\"}):o.a.createElement(m.b,{defaultMessage:\"Mono\",id:\"tw.mono\"}),\" (\".concat((t=e.size)>1e6?\"\".concat((t/1e3/1e3).toFixed(2),\"MB\"):\"\".concat((t/1e3).toFixed(2),\"KB\"),\")\"))),e.size>=hl&&o.a.createElement(\"div\",{className:ye()(Rc.a.alert,Rc.a.tooLarge)},o.a.createElement(m.b,{defaultMessage:\"This sound may be too large to upload to Scratch.\",id:\"tw.tooLarge\"})),e.isStereo&&o.a.createElement(\"div\",{className:ye()(Rc.a.alert,Rc.a.stereo)},o.a.createElement(m.b,{defaultMessage:\"Editing this stereo sound will irreversibly convert it to mono.\",id:\"tw.stereoAlert\"})));var t};Id.propTypes={isStereo:i.a.bool.isRequired,duration:i.a.number.isRequired,size:i.a.number.isRequired,canPaste:i.a.bool.isRequired,canRedo:i.a.bool.isRequired,canUndo:i.a.bool.isRequired,chunkLevels:i.a.arrayOf(i.a.number).isRequired,intl:m.i,name:i.a.string.isRequired,onChangeName:i.a.func.isRequired,onContainerClick:i.a.func.isRequired,onCopy:i.a.func.isRequired,onCopyToNew:i.a.func.isRequired,onDelete:i.a.func,onEcho:i.a.func.isRequired,onFadeIn:i.a.func.isRequired,onFadeOut:i.a.func.isRequired,onFaster:i.a.func.isRequired,onLouder:i.a.func.isRequired,onMute:i.a.func.isRequired,onPaste:i.a.func.isRequired,onPlay:i.a.func.isRequired,onRedo:i.a.func.isRequired,onReverse:i.a.func.isRequired,onRobot:i.a.func.isRequired,onSetTrim:i.a.func,onSlower:i.a.func.isRequired,onSofter:i.a.func.isRequired,onStop:i.a.func.isRequired,onUndo:i.a.func.isRequired,playhead:i.a.number,setRef:i.a.func,tooLoud:i.a.bool.isRequired,trimEnd:i.a.number,trimStart:i.a.number};var Sd=Object(m.h)(Id);function xd(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function Ed(e){for(var t=1;t0&&this.handleRedo()):\"z\"===e.key?this.undoStack.length>0&&(e.preventDefault(),this.handleUndo()):\"c\"===e.key?(e.preventDefault(),this.handleCopy()):\"v\"===e.key?(e.preventDefault(),this.handlePaste()):\"a\"===e.key&&(e.preventDefault(),this.handleUpdateTrim(0,1))))}resetState(e,t){this.audioBufferPlayer.stop(),this.audioBufferPlayer=new cc(e,t),this.setState({chunkLevels:wl(e),playhead:null})}submitNewSamples(e,t,n){return((e,t)=>{const{samples:n,sampleRate:a}=e;return 2*n.length{let{samples:t,sampleRate:a}=e;return tr.a.encode({sampleRate:a,channelData:[t]}).then((e=>(n||(this.redoStack=[],this.undoStack.length>=99&&this.undoStack.shift(),this.undoStack.push(this.getUndoItem())),this.resetState(t,a),this.props.vm.updateSoundBuffer(this.props.soundIndex,this.audioBufferPlayer.buffer,new Uint8Array(e)),!0)))})).catch((e=>(N.default.error(\"Encountered error while trying to encode sound update: \".concat(e.message)),!1)))}handlePlay(){this.audioBufferPlayer.stop(),this.audioBufferPlayer.play(this.state.trimStart||0,this.state.trimEnd||1,this.handleUpdatePlayhead,this.handleStoppedPlaying)}handleStopPlaying(){this.audioBufferPlayer.stop(),this.handleStoppedPlaying()}handleStoppedPlaying(){this.setState({playhead:null})}handleUpdatePlayhead(e){this.setState({playhead:e})}handleChangeName(e){this.props.vm.renameSound(this.props.soundIndex,e)}handleDelete(){const{samples:e,sampleRate:t}=this.copyCurrentBuffer(),n=e.length,a=Math.floor(this.state.trimStart*n),o=Math.floor(this.state.trimEnd*n),r=e.slice(0,a),i=e.slice(o,n),s=r.length+i.length;let l;0===s?l=new Float32Array(1):(l=new Float32Array(s),l.set(r,0),l.set(i,r.length)),this.submitNewSamples(l,t).then((()=>{this.setState({trimStart:null,trimEnd:null})}))}handleDeleteInverse(){const{samples:e,sampleRate:t}=this.copyCurrentBuffer(),n=e.length,a=Math.floor(this.state.trimStart*n),o=Math.floor(this.state.trimEnd*n);let r=e.slice(a,o);0===r.length&&(r=new Float32Array(1)),this.submitNewSamples(r,t).then((e=>{e&&this.setState({trimStart:null,trimEnd:null})}))}handleUpdateTrim(e,t){this.setState({trimStart:e,trimEnd:t}),this.handleStopPlaying()}effectFactory(e){return()=>this.handleEffect(e)}copyCurrentBuffer(){return{samples:this.audioBufferPlayer.buffer.getChannelData(0),sampleRate:this.audioBufferPlayer.buffer.sampleRate}}handleEffect(e){const t=null===this.state.trimStart?0:this.state.trimStart,n=null===this.state.trimEnd?1:this.state.trimEnd;if(this.audioBufferPlayer.buffer.length<2)return;new Cc(this.audioBufferPlayer.buffer,e,t,n).process(((e,t,n)=>{const a=e.getChannelData(0),o=e.sampleRate;this.submitNewSamples(a,o).then((e=>{e&&(null===this.state.trimStart?this.handlePlay():this.setState({trimStart:t,trimEnd:n},this.handlePlay))}))}))}tooLoud(){const e=this.state.chunkLevels.length,t=null===this.state.trimStart?0:Math.floor(this.state.trimStart*e),n=null===this.state.trimEnd?e-1:Math.ceil(this.state.trimEnd*e),a=this.state.chunkLevels.slice(t,n);let o=0;for(const e of a)e>o&&(o=e);return o>1.2}getUndoItem(){return Ed(Ed({},this.copyCurrentBuffer()),{},{trimStart:this.state.trimStart,trimEnd:this.state.trimEnd})}handleUndo(){this.redoStack.push(this.getUndoItem());const{samples:e,sampleRate:t,trimStart:n,trimEnd:a}=this.undoStack.pop();if(e)return this.submitNewSamples(e,t,!0).then((e=>{e&&this.setState({trimStart:n,trimEnd:a},this.handlePlay)}))}handleRedo(){const{samples:e,sampleRate:t,trimStart:n,trimEnd:a}=this.redoStack.pop();if(e)return this.undoStack.push(this.getUndoItem()),this.submitNewSamples(e,t,!0).then((e=>{e&&this.setState({trimStart:n,trimEnd:a},this.handlePlay)}))}handleCopy(){this.copy()}copy(e){const t=null===this.state.trimStart?0:this.state.trimStart,n=null===this.state.trimEnd?1:this.state.trimEnd,a=this.copyCurrentBuffer(),o=t*a.samples.length,r=n*a.samples.length;a.samples=a.samples.slice(o,r),this.setState({copyBuffer:a},e)}handleCopyToNew(){this.copy((()=>{fl(this.props.vm,this.state.copyBuffer.samples,this.state.copyBuffer.sampleRate,this.props.name)}))}resampleBufferToRate(e,t){return new Promise(((n,a)=>{const o=t/e.sampleRate*e.samples.length;let r;try{window.OfflineAudioContext?r=new window.OfflineAudioContext(1,o,t):window.webkitOfflineAudioContext&&(r=new window.webkitOfflineAudioContext(1,o,t))}catch(o){return t===e.sampleRate/2?n((e=>{const t=Math.floor(e.samples.length/2),n=new Float32Array(t);for(let a=0;a{let{renderedBuffer:a}=e;n({samples:a.getChannelData(0),sampleRate:t})}}))}paste(){const{samples:e}=this.copyCurrentBuffer();if(null===this.state.trimStart){const t=e.length+this.state.copyBuffer.samples.length,n=new Float32Array(t);n.set(e,0),n.set(this.state.copyBuffer.samples,e.length),this.submitNewSamples(n,this.props.sampleRate,!1).then((e=>{e&&this.handlePlay()}))}else{const t=this.state.trimStart*e.length,n=this.state.trimEnd*e.length,a=e.slice(0,t),o=e.slice(n),r=a.length+this.state.copyBuffer.samples.length+o.length,i=new Float32Array(r);i.set(a,0),i.set(this.state.copyBuffer.samples,a.length),i.set(o,a.length+this.state.copyBuffer.samples.length);const s=t/this.props.sampleRate,l=s+this.state.copyBuffer.samples.length/this.state.copyBuffer.sampleRate,c=i.length/this.state.copyBuffer.sampleRate,d=s/c,u=l/c;this.submitNewSamples(i,this.props.sampleRate,!1).then((e=>{e&&this.setState({trimStart:d,trimEnd:u},this.handlePlay)}))}}handlePaste(){this.state.copyBuffer&&(this.state.copyBuffer.sampleRate===this.props.sampleRate?this.paste():this.resampleBufferToRate(this.state.copyBuffer,this.props.sampleRate).then((e=>{this.setState({copyBuffer:e},this.paste)})))}setRef(e){this.ref=e}handleContainerClick(e){e.target===this.ref&&null!==this.state.trimStart&&this.handleUpdateTrim(null,null)}render(){const{effectTypes:e}=Cc;return o.a.createElement(Sd,{isStereo:this.props.isStereo,duration:this.props.duration,size:this.props.size,canPaste:null!==this.state.copyBuffer,canRedo:this.redoStack.length>0,canUndo:this.undoStack.length>0,chunkLevels:this.state.chunkLevels,name:this.props.name,playhead:this.state.playhead,setRef:this.setRef,tooLoud:this.tooLoud(),trimEnd:this.state.trimEnd,trimStart:this.state.trimStart,onChangeName:this.handleChangeName,onContainerClick:this.handleContainerClick,onCopy:this.handleCopy,onCopyToNew:this.handleCopyToNew,onDelete:this.handleDelete,onEcho:this.effectFactory(e.ECHO),onFadeIn:this.effectFactory(e.FADEIN),onFadeOut:this.effectFactory(e.FADEOUT),onFaster:this.effectFactory(e.FASTER),onLouder:this.effectFactory(e.LOUDER),onMute:this.effectFactory(e.MUTE),onPaste:this.handlePaste,onPlay:this.handlePlay,onRedo:this.handleRedo,onReverse:this.effectFactory(e.REVERSE),onRobot:this.effectFactory(e.ROBOT),onSetTrim:this.handleUpdateTrim,onSlower:this.effectFactory(e.SLOWER),onSofter:this.effectFactory(e.SOFTER),onStop:this.handleStopPlaying,onUndo:this.handleUndo})}}Nd.propTypes={isStereo:i.a.bool,duration:i.a.number,size:i.a.number,isFullScreen:i.a.bool,name:i.a.string.isRequired,sampleRate:i.a.number,samples:i.a.instanceOf(Float32Array),soundId:i.a.string,soundIndex:i.a.number,vm:i.a.instanceOf(p.a).isRequired};var _d=Object(l.b)(((e,t)=>{let{soundIndex:n}=t;const a=e.scratchGui.vm.editingTarget.sprite,o=ne.map((e=>{const{md5ext:n}=e,a=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;athis.setState({data:Bd(e,this.props.isRtl)}))):this.setState({data:Bd(e,this.props.isRtl)}),this.audioEngine=new le.a(new $o),this.playingSoundPromise=null}componentWillUnmount(){this.stopPlayingSound()}onStop(){null!==this.playingSoundPromise&&(this.playingSoundPromise.then((e=>e&&e.removeListener(\"stop\",this.onStop))),this.handleStop&&this.handleStop())}setStopHandler(e){this.handleStop=e}stopPlayingSound(){null!==this.playingSoundPromise&&(this.playingSoundPromise.then((e=>e&&e.removeListener(\"stop\",this.onStop))),this.playingSoundPromise.isPlaying?this.playingSoundPromise.then((e=>{e.stop()})):this.playingSoundPromise.then((e=>{e&&e.stopImmediately()})),this.playingSoundPromise=null)}handleItemMouseEnter(e){const t=e._md5,n=t.split(\".\")[0],a=this.props.vm;this.stopPlayingSound(),this.playingSoundPromise=a.runtime.storage.load(a.runtime.storage.AssetType.Sound,n).then((n=>{if(n){const a={md5:t,name:e.name,format:e.format,data:n.data};return this.audioEngine.decodeSoundPlayer(a).then((e=>(e.connect(this.audioEngine),e.play(),e.addListener(\"stop\",this.onStop),null!==this.playingSoundPromise&&(this.playingSoundPromise.isPlaying=!0),e)))}}))}handleItemMouseLeave(){this.stopPlayingSound()}handleItemSelected(e){const t={format:e.format,md5:e._md5,rate:e.rate,sampleCount:e.sampleCount,name:e.name};this.props.vm.addSound(t).then((()=>{this.props.onNewSound()}))}render(){return o.a.createElement(Tn,{showPlayButton:!0,data:this.state.data,id:\"soundLibrary\",setStopHandler:this.setStopHandler,tags:Pd,title:this.props.intl.formatMessage(Ud.libraryTitle),onItemMouseEnter:this.handleItemMouseEnter,onItemMouseLeave:this.handleItemMouseLeave,onItemSelected:this.handleItemSelected,onRequestClose:this.props.onRequestClose})}}Gd.propTypes={intl:m.i.isRequired,isRtl:i.a.bool,onNewSound:i.a.func.isRequired,onRequestClose:i.a.func,vm:i.a.instanceOf(p.a).isRequired};var Fd=Object(m.h)(Object(l.b)((e=>({isRtl:e.locales.isRtl})),(()=>({})))(Gd)),Zd=n(341),Wd=n.n(Zd);var Hd=()=>o.a.createElement(\"div\",{className:Wd.a.container},o.a.createElement(m.b,{defaultMessage:\"Sound editor is not supported in this browser.\",id:\"tw.soundEditorNotSupported\"}));class Qd extends o.a.Component{constructor(e){super(e),E()(this,[\"handleSelectSound\",\"handleDeleteSound\",\"handleDuplicateSound\",\"handleExportSound\",\"handleNewSound\",\"handleSurpriseSound\",\"handleFileUploadClick\",\"handleSoundUpload\",\"handleDrop\",\"setFileInput\"]),this.state={selectedSoundIndex:0}}componentWillReceiveProps(e){const{editingTarget:t,sprites:n,stage:a}=e,o=t&&n[t]?n[t]:a;o&&o.sounds&&(this.props.editingTarget!==t?this.setState({selectedSoundIndex:0}):this.state.selectedSoundIndex>o.sounds.length-1&&this.setState({selectedSoundIndex:Math.max(o.sounds.length-1,0)}))}handleSelectSound(e){this.setState({selectedSoundIndex:e})}handleDeleteSound(e){const t=this.props.vm.deleteSound(e);e>=this.state.selectedSoundIndex&&this.setState({selectedSoundIndex:Math.max(0,e-1)}),this.props.dispatchUpdateRestore({restoreFun:t,deletedItem:\"Sound\"})}handleExportSound(e){const t=this.props.vm.editingTarget.sprite.sounds[e],n=new Blob([t.asset.data],{type:t.asset.assetType.contentType});Object(cr.a)(\"\".concat(t.name,\".\").concat(t.asset.dataFormat),n)}handleDuplicateSound(e){this.props.vm.duplicateSound(e).then((()=>{this.setState({selectedSoundIndex:e+1})}))}handleNewSound(){if(!this.props.vm.editingTarget)return null;const e=this.props.vm.editingTarget.sprite,t=e.sounds?e.sounds:[];this.setState({selectedSoundIndex:Math.max(t.length-1,0)})}async handleSurpriseSound(){const e=await xr(),t=e[Math.floor(Math.random()*e.length)],n={format:t.dataFormat,md5:t.md5ext,rate:t.rate,sampleCount:t.sampleCount,name:t.name};this.props.vm.addSound(n).then((()=>{this.handleNewSound()}))}handleFileUploadClick(){this.fileInput.click()}handleSoundUpload(e){const t=this.props.vm.runtime.storage,n=this.props.vm.editingTarget.id;this.props.onShowImporting(),ar(e.target,((e,a,o,r,i)=>{ir(e,a,t,(e=>{e.name=o,this.props.vm.addSound(e,n).then((()=>{this.handleNewSound(),r===i-1&&this.props.onCloseImporting()}))}),this.props.onCloseImporting)}),this.props.onCloseImporting)}handleDrop(e){if(e.dragType===ra.SOUND){const t=this.props.vm.editingTarget.sprite,n=t.sounds[this.state.selectedSoundIndex];this.props.vm.reorderSound(this.props.vm.editingTarget.id,e.index,e.newIndex),this.setState({selectedSoundIndex:t.sounds.indexOf(n)})}else e.dragType===ra.BACKPACK_COSTUME?(this.props.onActivateCostumesTab(),this.props.vm.addCostume(e.payload.body,{name:e.payload.name})):e.dragType===ra.BACKPACK_SOUND&&this.props.vm.addSound({md5:e.payload.body,name:e.payload.name}).then(this.handleNewSound)}setFileInput(e){this.fileInput=e}render(){const{dispatchUpdateRestore:e,intl:t,isRtl:n,vm:a,onNewSoundFromLibraryClick:r,onNewSoundFromRecordingClick:i}=this.props;if(!a.editingTarget)return null;const s=!(!a.runtime.audioEngine||!new $o),l=a.editingTarget.sprite,c=l.sounds?l.sounds.map((e=>({url:n?dl.a:ll.a,name:e.name,details:(e.sampleCount/e.rate).toFixed(2),dragPayload:e}))):[],d=Object(m.g)({fileUploadSound:{id:\"gui.soundTab.fileUploadSound\",defaultMessage:\"Upload Sound\"},surpriseSound:{id:\"gui.soundTab.surpriseSound\",defaultMessage:\"Surprise\"},recordSound:{id:\"gui.soundTab.recordSound\",defaultMessage:\"Record\"},addSound:{id:\"gui.soundTab.addSoundFromLibrary\",defaultMessage:\"Choose a Sound\"}});return o.a.createElement(Bo,{buttons:s?[{title:t.formatMessage(d.addSound),img:pl.a,onClick:r},{title:t.formatMessage(d.fileUploadSound),img:br.a,onClick:this.handleFileUploadClick,fileAccept:\".wav, .mp3, .ogg, .flac, .aac, .m4a\",fileChange:this.handleSoundUpload,fileInput:this.setFileInput,fileMultiple:!0},{title:t.formatMessage(d.surpriseSound),img:vr.a,onClick:this.handleSurpriseSound},{title:t.formatMessage(d.recordSound),img:gl.a,onClick:i},{title:t.formatMessage(d.addSound),img:kr.a,onClick:r}]:[],dragType:ra.SOUND,isRtl:n,items:c,selectedItemIndex:this.state.selectedSoundIndex,onDeleteClick:this.handleDeleteSound,onDrop:this.handleDrop,onDuplicateClick:this.handleDuplicateSound,onExportClick:this.handleExportSound,onItemClick:this.handleSelectSound},l.sounds&&l.sounds[this.state.selectedSoundIndex]?s?o.a.createElement(_d,{soundIndex:this.state.selectedSoundIndex}):o.a.createElement(Hd,null):null,this.props.soundRecorderVisible?o.a.createElement(vc,{onNewSound:this.handleNewSound}):null,this.props.soundLibraryVisible?o.a.createElement(Fd,{vm:this.props.vm,onNewSound:this.handleNewSound,onRequestClose:this.props.onRequestCloseSoundLibrary}):null)}}Qd.propTypes={dispatchUpdateRestore:i.a.func,editingTarget:i.a.string,intl:m.i,isRtl:i.a.bool,onActivateCostumesTab:i.a.func.isRequired,onCloseImporting:i.a.func.isRequired,onNewSoundFromLibraryClick:i.a.func.isRequired,onNewSoundFromRecordingClick:i.a.func.isRequired,onRequestCloseSoundLibrary:i.a.func.isRequired,onShowImporting:i.a.func.isRequired,soundLibraryVisible:i.a.bool,soundRecorderVisible:i.a.bool,sprites:i.a.shape({id:i.a.shape({sounds:i.a.arrayOf(i.a.shape({name:i.a.string.isRequired}))})}),stage:i.a.shape({sounds:i.a.arrayOf(i.a.shape({name:i.a.string.isRequired}))}),vm:i.a.instanceOf(p.a).isRequired};var Yd=Object(g.a)(\"Sound Tab\")(Object(m.h)(Object(l.b)((e=>({editingTarget:e.scratchGui.targets.editingTarget,isRtl:e.locales.isRtl,sprites:e.scratchGui.targets.sprites,stage:e.scratchGui.targets.stage,soundLibraryVisible:e.scratchGui.modals.soundLibrary,soundRecorderVisible:e.scratchGui.modals.soundRecorder})),(e=>({onActivateCostumesTab:()=>e(Object(b.d)(b.b)),onNewSoundFromLibraryClick:t=>{t.preventDefault(),e(Object(w.D)())},onNewSoundFromRecordingClick:()=>{e(Object(w.E)())},onRequestCloseSoundLibrary:()=>{e(Object(w.k)())},dispatchUpdateRestore:t=>{e(Object(dr.c)(t))},onCloseImporting:()=>e(Object(W.c)(\"importingAsset\")),onShowImporting:()=>e(Object(W.i)(\"importingAsset\"))})))(Qd))),Vd=n(120),qd=n(47),Jd=n(187),Xd=n.n(Jd),Kd=n(235),$d=n.n(Kd);const eu=[\"active\",\"className\",\"onClick\",\"title\"];function tu(){return tu=Object.assign?Object.assign.bind():function(e){for(var t=1;t{let{isSmall:t}=e;return o.a.createElement(\"div\",{className:hu.a.turboContainer},o.a.createElement(\"img\",{className:hu.a.turboIcon,src:mu.a,draggable:!1,width:16,height:16}),!t&&o.a.createElement(\"div\",{className:hu.a.turboLabel},o.a.createElement(m.b,{defaultMessage:\"Turbo Mode\",id:\"gui.turboMode.active\"})))};bu.propTypes={isSmall:i.a.bool},bu.defaultProps={isSmall:!1};var wu=bu,fu=n(166),Mu=n.n(fu);const vu=e=>{let{framerate:t,interpolation:n}=e;return o.a.createElement(o.a.Fragment,null,30!==t&&0!==t&&o.a.createElement(\"div\",{className:Mu.a.framerateContainer},o.a.createElement(\"div\",{className:Mu.a.framerateLabel},o.a.createElement(m.b,{defaultMessage:\"{framerate} FPS\",id:\"tw.fps\",values:{framerate:t}}))),n&&o.a.createElement(\"div\",{className:Mu.a.framerateContainer},o.a.createElement(\"div\",{className:Mu.a.framerateLabel},o.a.createElement(m.b,{defaultMessage:\"Interpolation\",id:\"tw.interpolationEnabled\"}))))};vu.propTypes={framerate:i.a.number,interpolation:i.a.bool};var yu=vu,ku=n(344),ju=n.n(ku);const Iu=[\"active\",\"className\",\"intl\",\"onGreenFlagClick\",\"onStopAllClick\",\"turbo\",\"framerate\",\"interpolation\",\"isSmall\"];function Su(){return Su=Object.assign?Object.assign.bind():function(e){for(var t=1;t({isStarted:e.scratchGui.vmStatus.started,projectRunning:e.scratchGui.vmStatus.running,framerate:e.scratchGui.tw.framerate,interpolation:e.scratchGui.tw.interpolation,turbo:e.scratchGui.vmStatus.turbo})),(()=>({})))(Du);const Ou=\"undefined\"!=typeof URLSearchParams&&new URLSearchParams(location.search).get(\"scale\"),Au=8,Pu=44,zu=(e,t,n)=>{const a={heightDefault:t.height,widthDefault:t.width,height:0,width:0,scale:0};if(n){a.height=window.innerHeight-Pu-Au,a.width=a.height*(t.width/t.height);const e=Ou?Math.min(window.innerWidth,Ou*t.width):window.innerWidth;a.width>e&&(a.width=e,a.height=a.width*(t.height/t.width)),a.scale=a.width/a.widthDefault}else{const t=na.c[e];t.width?(a.width=t.width,a.scale=a.width/a.widthDefault,a.height=a.scale*a.heightDefault):(a.scale=t.scale,a.height=a.scale*a.heightDefault,a.width=a.scale*a.widthDefault)}return a.height=Math.round(a.height),a.width=Math.round(a.width),a},Lu=e=>{let{width:t,height:n,widthDefault:a,heightDefault:o}=e;const r=t/a,i=n/o;if(1!==r||1!==i)return{transform:\"scale(\".concat(r,\",\").concat(i,\")\")}};var Ru=n(237),Uu=n.n(Ru),Bu=n(345),Gu=n.n(Bu);const Fu='\\n\\n \\x3c!-- Generator: Sketch 47.1 (45422) - http://www.bohemiancoding.com/sketch --\\x3e\\n Large Stage (active)\\n Created with Sketch.\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n\\n';var Zu=()=>{const e=\"object\"==typeof Recolor?Fu.replace(/#855cd6/gi,Recolor.primary):Fu;return\"data:image/svg+xml;,\"+encodeURIComponent(e)};const Wu='\\n\\n \\x3c!-- Generator: Sketch 47.1 (45422) - http://www.bohemiancoding.com/sketch --\\x3e\\n Small Stage (inactive)\\n Created with Sketch.\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n\\n';var Hu=()=>{const e=\"object\"==typeof Recolor?Wu.replace(/#855cd6/gi,Recolor.primary):Wu;return\"data:image/svg+xml;,\"+encodeURIComponent(e)};const Qu='';var Yu=()=>{const e=\"object\"==typeof Recolor?Qu.replace(/#855cd6/gi,Recolor.primary):Qu;return\"data:image/svg+xml;,\"+encodeURIComponent(e)},Vu=n(346),qu=n.n(Vu),Ju=n(33),Xu=n.n(Ju),Ku=n(213);const $u=Object(m.g)({largeStageSizeMessage:{id:\"gui.stageHeader.stageSizeLarge\",defaultMessage:\"Switch to large stage\"},smallStageSizeMessage:{id:\"gui.stageHeader.stageSizeSmall\",defaultMessage:\"Switch to small stage\"},fullStageSizeMessage:{id:\"tw.stageHeader.full\",defaultMessage:\"Switch to full stage\"},fullScreenMessage:{id:\"gui.stageHeader.stageSizeFull\",defaultMessage:\"Enter full screen mode\"},unFullScreenMessage:{id:\"gui.stageHeader.stageSizeUnFull\",defaultMessage:\"Exit full screen mode\"},fullscreenControl:{id:\"gui.stageHeader.fullscreenControl\",defaultMessage:\"Full Screen Control\"},openSettingsMessage:{id:\"tw.openAdvanced\",defaultMessage:\"Open advanced settings\"}}),ep=new URLSearchParams(location.search).has(\"settings-button\"),tp=function(e){const{customStageSize:t,showFixedLargeSize:n,isFullScreen:a,isPlayerOnly:r,onKeyPress:i,onSetStageFullScreen:s,onSetStageUnFullScreen:l,onSetStageLarge:c,onSetStageSmall:d,onSetStageFull:u,onOpenSettings:p,isEmbedded:m,stageSize:g,stageSizeMode:h,vm:b}=e;let w=null;const f=zu(g,t,a||m);if(a||m){const t=m&&ep?o.a.createElement(\"div\",{className:ye()(Xu.a.settingsButton,Xu.a.unselectWrapper)},o.a.createElement(Ae.a,{className:Xu.a.stageButton,onClick:p},o.a.createElement(\"img\",{alt:e.intl.formatMessage($u.openSettingsMessage),className:Xu.a.stageButtonIcon,draggable:!1,src:qu.a,title:e.intl.formatMessage($u.openSettingsMessage)}))):null,n=a?o.a.createElement(\"div\",{className:Xu.a.unselectWrapper},o.a.createElement(Ae.a,{className:Xu.a.stageButton,onClick:l,onKeyPress:i},o.a.createElement(\"img\",{alt:e.intl.formatMessage($u.unFullScreenMessage),className:Xu.a.stageButtonIcon,draggable:!1,src:Gu.a,title:e.intl.formatMessage($u.fullscreenControl)}))):Ku.a.available()?o.a.createElement(\"div\",{className:Xu.a.unselectWrapper},o.a.createElement(Ae.a,{className:Xu.a.stageButton,onClick:s},o.a.createElement(\"img\",{alt:e.intl.formatMessage($u.fullScreenMessage),className:Xu.a.stageButtonIcon,draggable:!1,src:Uu.a,title:e.intl.formatMessage($u.fullscreenControl)}))):null;w=o.a.createElement(Oe.a,{className:ye()(Xu.a.stageHeaderWrapperOverlay,{[Xu.a.embedded]:m})},o.a.createElement(Oe.a,{className:Xu.a.stageMenuWrapper,style:{width:f.width}},o.a.createElement(Tu,{vm:b}),o.a.createElement(\"div\",{className:Xu.a.fullscreenButtonsRow,key:\"fullscreen\"},t,n)))}else{const t=r?[]:o.a.createElement(\"div\",{className:Xu.a.stageSizeToggleGroup},o.a.createElement(Jr,{buttons:[{handleClick:d,icon:Hu,iconClassName:Xu.a.stageButtonIcon,isSelected:h===na.e.small,title:e.intl.formatMessage($u.smallStageSizeMessage)},...n?[{handleClick:c,icon:Zu,iconClassName:Xu.a.stageButtonIcon,isSelected:h===na.e.large,title:e.intl.formatMessage($u.largeStageSizeMessage)}]:[],{handleClick:u,icon:n?Yu:Zu,iconClassName:Xu.a.stageButtonIcon,isSelected:h===na.e.full,title:e.intl.formatMessage($u.fullStageSizeMessage)}]}));w=o.a.createElement(Oe.a,{className:Xu.a.stageHeaderWrapper,style:{minWidth:\"\".concat(f.width+2,\"px\")}},o.a.createElement(Oe.a,{className:Xu.a.stageMenuWrapper},o.a.createElement(Tu,{vm:b,isSmall:h===na.e.small}),o.a.createElement(\"div\",{className:Xu.a.stageSizeRow,key:\"editor\"},t,o.a.createElement(\"div\",null,o.a.createElement(Ae.a,{className:Xu.a.stageButton,onClick:s},o.a.createElement(\"img\",{alt:e.intl.formatMessage($u.fullStageSizeMessage),className:Xu.a.stageButtonIcon,draggable:!1,src:Uu.a,title:e.intl.formatMessage($u.fullscreenControl)}))))))}return w};tp.propTypes={intl:m.i,customStageSize:i.a.shape({width:i.a.number,height:i.a.number}),showFixedLargeSize:i.a.bool,isFullScreen:i.a.bool.isRequired,isPlayerOnly:i.a.bool.isRequired,onKeyPress:i.a.func.isRequired,onSetStageFullScreen:i.a.func.isRequired,onSetStageUnFullScreen:i.a.func.isRequired,onSetStageLarge:i.a.func.isRequired,onSetStageSmall:i.a.func.isRequired,onSetStageFull:i.a.func.isRequired,onOpenSettings:i.a.func.isRequired,isEmbedded:i.a.bool.isRequired,stageSize:i.a.oneOf(Object.keys(na.d)),stageSizeMode:i.a.oneOf(Object.keys(na.e)),vm:i.a.instanceOf(p.a).isRequired},tp.defaultProps={stageSizeMode:na.e.large};var np=Object(m.h)(Object(l.b)((e=>({stageSizeMode:e.scratchGui.stageSize.stageSize})))(tp));function ap(){return ap=Object.assign?Object.assign.bind():function(e){for(var t=1;tna.c[na.d.large].width}render(){const e=ap({},this.props);return o.a.createElement(np,ap({},e,{onKeyPress:this.handleKeyPress,showFixedLargeSize:this.showFixedLargeSize()}))}}op.propTypes={isFullScreen:i.a.bool.isRequired,isWindowFullScreen:i.a.bool.isRequired,customStageSize:i.a.shape({width:i.a.number.isRequired,height:i.a.number.isRequired}).isRequired,dimensions:i.a.arrayOf(i.a.number),isPlayerOnly:i.a.bool,onSetStageUnFullScreen:i.a.func.isRequired,onSetStageFull:i.a.func.isRequired,onOpenSettings:i.a.func.isRequired,isEmbedded:i.a.bool.isRequired,stageSizeMode:i.a.oneOf(Object.keys(na.e)).isRequired,vm:i.a.instanceOf(p.a).isRequired};var rp=Object(l.b)((e=>({customStageSize:e.scratchGui.customStageSize,stageSizeMode:e.scratchGui.stageSize.stageSize,isEmbedded:e.scratchGui.mode.isEmbedded,isFullScreen:e.scratchGui.mode.isFullScreen,isWindowFullScreen:e.scratchGui.tw.isWindowFullScreen,dimensions:e.scratchGui.tw.dimensions,isPlayerOnly:e.scratchGui.mode.isPlayerOnly})),(e=>({onSetStageLarge:()=>e(Object(Vd.b)(na.e.large)),onSetStageSmall:()=>e(Object(Vd.b)(na.e.small)),onSetStageFull:()=>e(Object(Vd.b)(na.e.full)),onSetStageFullScreen:()=>e(Object(qd.c)(!0)),onSetStageUnFullScreen:()=>e(Object(qd.c)(!1)),onOpenSettings:()=>e(Object(w.C)())})))(op),ip=n(220),sp=n.n(ip);const lp=[];class cp{constructor(){this.mirror=!0,this._frameCacheTimeout=16,this._video=null,this._track=null,this._workspace=[]}static get FORMAT_IMAGE_DATA(){return\"image-data\"}static get FORMAT_CANVAS(){return\"canvas\"}static get DIMENSIONS(){return[480,360]}static get ORDER(){return 1}get video(){return this._video}enableVideo(){return this.enabled=!0,this._setupVideo()}disableVideo(){this.enabled=!1,this._singleSetup&&this._singleSetup.then(this._teardown.bind(this)).catch((e=>this.onError(e)))}_teardown(){if(!1===this.enabled){const e=(lp.pop(),!(lp.length>0));this._singleSetup=null,this._video=null,this._track&&e&&this._track.stop(),this._track=null}}getFrame(e){let{dimensions:t=cp.DIMENSIONS,mirror:n=this.mirror,format:a=cp.FORMAT_IMAGE_DATA,cacheTimeout:o=this._frameCacheTimeout}=e;if(!this.videoReady)return null;const[r,i]=t,s=this._getWorkspace({dimensions:t,mirror:Boolean(n)}),{videoWidth:l,videoHeight:c}=this._video,{canvas:d,context:u,lastUpdate:p,cacheData:m}=s,g=Date.now();p+o{let t;return 0===lp.length?(t=Pl()({audio:!1,video:e}),lp.push(t)):lp.length>0&&(t=lp[0],lp.push(!0)),t})({width:{min:480,ideal:640},height:{min:360,ideal:480}}).then((e=>{this._video=document.createElement(\"video\");try{this._video.srcObject=e}catch(t){this._video.src=window.URL.createObjectURL(e)}return this._video.play(),this._track=e.getTracks()[0],this})).catch((e=>{this._singleSetup=null,this.onError(e)}))),this._singleSetup}get videoReady(){if(!this.enabled)return!1;if(!this._video)return!1;if(!this._track)return!1;const{videoWidth:e,videoHeight:t}=this._video;return\"number\"==typeof e&&\"number\"==typeof t&&(0!==e&&0!==t)}_getWorkspace(e){let{dimensions:t,mirror:n}=e,a=this._workspace.find((e=>e.dimensions.join(\"-\")===t.join(\"-\")&&e.mirror===n));return a||(a={dimensions:t,mirror:n,canvas:document.createElement(\"canvas\"),lastUpdate:0,cacheData:{}},a.canvas.width=t[0],a.canvas.height=t[1],a.context=a.canvas.getContext(\"2d\"),this._workspace.push(a)),a}}var dp=cp,up=n(432),pp=n.n(up),mp=n(206),gp=n.n(mp);class hp extends o.a.Component{constructor(e){super(e),this.setContainer=this.setContainer.bind(this)}componentDidMount(){this.container.appendChild(this.props.domElement)}componentWillUnmount(){this.container.removeChild(this.props.domElement)}setContainer(e){this.container=e}render(){return Object.assign(this.props.domElement,M()(this.props,[\"domElement\",\"children\",\"style\"])),this.props.style&&(this.props.domElement.style.cssText=pp.a.string(this.props.style)),o.a.createElement(\"div\",{ref:this.setContainer})}}hp.propTypes={domElement:i.a.instanceOf(Element).isRequired,style:gp.a};var bp=hp,wp=n(347),fp=n.n(wp);const Mp=[\"colorInfo\"];function vp(){return vp=Object.assign?Object.assign.bind():function(e){for(var t=1;te.defaultMessage,this._opcodeMap={motion_direction:{category:\"motion\"},motion_xposition:{category:\"motion\"},motion_yposition:{category:\"motion\"},looks_size:{category:\"looks\"},looks_costumenumbername:{category:\"looks\"},looks_backdropnumbername:{category:\"looks\"},looks_backdropname:{category:\"looks\"},data_variable:{category:\"data\"},data_listcontents:{category:\"list\"},sound_volume:{category:\"sound\"},sound_tempo:{category:\"sound\"},sensing_answer:{category:\"sensing\"},sensing_mousedown:{category:\"sensing\"},sensing_mousex:{category:\"sensing\"},sensing_mousey:{category:\"sensing\"},sensing_loudness:{category:\"sensing\"},sensing_username:{category:\"sensing\"},sensing_current:{category:\"sensing\"},sensing_timer:{category:\"sensing\"},sensing_dayssince2000:{category:\"sensing\"},sensing_online:{category:\"sensing\"}},this._refreshOpcodeMap()}setTranslatorFunction(e){this._translator=e,this._refreshOpcodeMap()}_refreshOpcodeMap(){this._opcodeMap.motion_direction.labelFn=()=>this._translator(Ip.motion_direction),this._opcodeMap.motion_xposition.labelFn=()=>this._translator(Ip.motion_xposition),this._opcodeMap.motion_yposition.labelFn=()=>this._translator(Ip.motion_yposition),this._opcodeMap.looks_size.labelFn=()=>this._translator(Ip.looks_size),this._opcodeMap.looks_costumenumbername.labelFn=e=>\"number\"===e.NUMBER_NAME?this._translator(Ip.looks_costumenumber):this._translator(Ip.looks_costumename),this._opcodeMap.looks_backdropnumbername.labelFn=e=>\"number\"===e.NUMBER_NAME?this._translator(Ip.looks_backdropnumber):this._translator(Ip.looks_backdropname),this._opcodeMap.looks_backdropname.labelFn=()=>this._translator(Ip.looks_backdropname),this._opcodeMap.data_variable.labelFn=e=>e.VARIABLE,this._opcodeMap.data_listcontents.labelFn=e=>e.LIST,this._opcodeMap.sound_volume.labelFn=()=>this._translator(Ip.sound_volume),this._opcodeMap.sound_tempo.labelFn=()=>this._translator(Ip.sound_tempo),this._opcodeMap.sensing_answer.labelFn=()=>this._translator(Ip.sensing_answer),this._opcodeMap.sensing_mousedown.labelFn=()=>this._translator(Ip.sensing_mousedown),this._opcodeMap.sensing_mousex.labelFn=()=>this._translator(Ip.sensing_mousex),this._opcodeMap.sensing_mousey.labelFn=()=>this._translator(Ip.sensing_mousey),this._opcodeMap.sensing_loudness.labelFn=()=>this._translator(Ip.sensing_loudness),this._opcodeMap.sensing_username.labelFn=()=>this._translator(Ip.sensing_username),this._opcodeMap.sensing_current.labelFn=e=>{switch(e.CURRENTMENU.toLowerCase()){case\"year\":return this._translator(Ip.sensing_current_year);case\"month\":return this._translator(Ip.sensing_current_month);case\"date\":return this._translator(Ip.sensing_current_date);case\"dayofweek\":return this._translator(Ip.sensing_current_dayofweek);case\"hour\":return this._translator(Ip.sensing_current_hour);case\"minute\":return this._translator(Ip.sensing_current_minute);case\"second\":return this._translator(Ip.sensing_current_second)}},this._opcodeMap.sensing_timer.labelFn=()=>this._translator(Ip.sensing_timer),this._opcodeMap.sensing_dayssince2000.labelFn=()=>this._translator(Ip.sensing_dayssince2000),this._opcodeMap.sensing_online.labelFn=()=>this._translator(Ip.sensing_online)}getLabel(e){return e in this._opcodeMap?this._opcodeMap[e]:{category:\"extension\",label:e}}};const xp=e=>\"object\"==typeof e&&null!==e?JSON.stringify(e,(()=>{const e=new WeakSet;return(t,n)=>{if(\"object\"==typeof n&&null!==n){if(e.has(n))return Array.isArray(n)?\"[...]\":\"{...}\";e.add(n)}return n}})()):Object.is(e,-0)?\"-0\":\"\".concat(e);var Ep=n(126),Cp=n.n(Ep),Np=n(221),_p=n.n(Np),Dp=n(26),Tp=n.n(Dp);const Op=e=>{let{categoryColor:t,label:n,value:a}=e;return o.a.createElement(\"div\",{className:Tp.a.defaultMonitor},o.a.createElement(\"div\",{className:Tp.a.row},o.a.createElement(\"div\",{className:Tp.a.label},n),o.a.createElement(\"div\",{className:Tp.a.value,style:{background:t.background,color:t.text}},a)))};Op.propTypes={categoryColor:i.a.shape({background:i.a.string.isRequired,text:i.a.string.isRequired}).isRequired,label:i.a.string.isRequired,value:i.a.oneOfType([i.a.string,i.a.number])};var Ap=Op;const Pp=e=>{let{categoryColor:t,value:n}=e;return o.a.createElement(\"div\",{className:Tp.a.largeMonitor},o.a.createElement(\"div\",{className:Tp.a.largeValue,style:{background:t.background,color:t.text}},n))};Pp.propTypes={categoryColor:i.a.shape({background:i.a.string.isRequired,text:i.a.string.isRequired}).isRequired,value:i.a.oneOfType([i.a.string,i.a.number])};var zp=Pp;const Lp=(e,t,n)=>(t?e.runtime.getTargetById(t):e.runtime.getTargetForStage()).variables[n],Rp=(e,t,n)=>{const a=Lp(e,t,n);return a.value instanceof Array?a.value.slice():a.value},Up=(e,t,n,a)=>{const o=Lp(e,t,n);o.value=a,o.isCloud&&e.runtime.ioDevices.cloud.requestUpdateVariable(o.name,o.value)},Bp=e=>{let{categoryColor:t,isDiscrete:n,label:a,min:r,max:i,value:s,onSliderUpdate:l}=e;return o.a.createElement(\"div\",{className:Tp.a.defaultMonitor},o.a.createElement(\"div\",{className:Tp.a.row},o.a.createElement(\"div\",{className:Tp.a.label},a),o.a.createElement(\"div\",{className:Tp.a.value,style:{background:t.background,color:t.text}},s)),o.a.createElement(\"div\",{className:Tp.a.row},o.a.createElement(\"input\",{className:ye()(Tp.a.slider,\"no-drag\"),max:i,min:r,step:n?1:.01,type:\"range\",value:s,onChange:l})))};Bp.propTypes={categoryColor:i.a.shape({background:i.a.string.isRequired,text:i.a.string.isRequired}).isRequired,isDiscrete:i.a.bool,label:i.a.string.isRequired,max:i.a.number,min:i.a.number,onSliderUpdate:i.a.func.isRequired,value:i.a.oneOfType([i.a.string,i.a.number])},Bp.defaultProps={isDiscrete:!0,min:0,max:100};var Gp=Bp;const Fp=[\"vm\",\"value\"];function Zp(){return Zp=Object.assign?Object.assign.bind():function(e){for(var t=1;t({vm:e.scratchGui.vm})))(Wp),Qp=n(435);class Yp extends o.a.Component{constructor(e){super(e),E()(this,[\"rowRenderer\",\"noRowsRenderer\",\"handleEventFactory\"])}handleEventFactory(e){return()=>this.props.onActivate(e)}noRowsRenderer(){return o.a.createElement(\"div\",{className:ye()(Tp.a.listRow,Tp.a.listEmpty)},o.a.createElement(m.b,{defaultMessage:\"(empty)\",id:\"gui.monitor.listMonitor.empty\"}))}rowRenderer(e){let{index:t,key:n,style:a}=e;return o.a.createElement(\"div\",{className:Tp.a.listRow,key:n,style:a},o.a.createElement(\"div\",{className:Tp.a.listIndex},t+1),o.a.createElement(\"div\",{className:Tp.a.listValue,dataIndex:t,style:{background:this.props.categoryColor.background,color:this.props.categoryColor.text},onClick:this.props.draggable?this.handleEventFactory(t):null},this.props.draggable&&this.props.activeIndex===t?o.a.createElement(\"div\",{className:Tp.a.inputWrapper},o.a.createElement(\"input\",{autoFocus:!0,autoComplete:!1,className:ye()(Tp.a.listInput,\"no-drag\"),spellCheck:!1,style:{color:this.props.categoryColor.text},type:\"text\",value:this.props.activeValue,onBlur:this.props.onDeactivate,onChange:this.props.onInput,onFocus:this.props.onFocus,onKeyDown:this.props.onKeyPress}),o.a.createElement(\"div\",{className:Tp.a.removeButton,onMouseDown:this.props.onRemove},\"✖︎\")):o.a.createElement(\"div\",{className:Tp.a.valueInner},xp(this.props.values[t]))))}render(){const{height:e,values:t,width:n,activeIndex:a,activeValue:r}=this.props,i=null===a?void 0:a;return o.a.createElement(Qp.a,{activeIndex:a,activeValue:r,height:e-42,noRowsRenderer:this.noRowsRenderer,rowCount:t.length,rowHeight:24,rowRenderer:this.rowRenderer,scrollToIndex:i,values:t,width:n})}}Yp.propTypes={activeIndex:i.a.number,activeValue:i.a.string,categoryColor:i.a.shape({background:i.a.string.isRequired,text:i.a.string.isRequired}).isRequired,draggable:i.a.bool,height:i.a.number,onActivate:i.a.func,onDeactivate:i.a.func,onFocus:i.a.func,onInput:i.a.func,onKeyPress:i.a.func,onRemove:i.a.func,values:i.a.arrayOf(i.a.oneOfType([i.a.string,i.a.number])),width:i.a.number};var Vp=Yp;const qp=[\"draggable\",\"label\",\"width\",\"height\",\"value\",\"onResizeMouseDown\",\"onAdd\"];function Jp(){return Jp=Object.assign?Object.assign.bind():function(e){for(var t=1;t{let{draggable:t,label:n,width:a,height:r,value:i,onResizeMouseDown:s,onAdd:l}=e,c=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a{const t=Ya(e),n=t.x-this.initialPosition.x,a=t.y-this.initialPosition.y;this.setState({width:Math.max(Math.min(this.initialWidth+n,this.props.customStageSize.width),100),height:Math.max(Math.min(this.initialHeight+a,this.props.customStageSize.height),60)})},n=e=>{t(e),window.removeEventListener(\"mousemove\",t),window.removeEventListener(\"mouseup\",n),this.props.vm.runtime.requestUpdateMonitor({id:this.props.id,height:this.state.height,width:this.state.width})};window.addEventListener(\"mousemove\",t),window.addEventListener(\"mouseup\",n)}wrapListIndex(e,t){return(e+t)%t}render(){const e=this.props,{vm:t}=e,n=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a({customStageSize:e.scratchGui.customStageSize,vm:e.scratchGui.vm})))(tm);function am(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function om(e,t,n){return(t=function(e){var t=function(e,t){if(\"object\"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var a=n.call(e,t||\"default\");if(\"object\"!=typeof a)return a;throw new TypeError(\"@@toPrimitive must return a primitive value.\")}return(\"string\"===t?String:Number)(e)}(e,\"string\");return\"symbol\"==typeof t?t:t+\"\"}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}const rm={data:\"data\",sensing:\"sensing\",sound:\"sounds\",looks:\"looks\",motion:\"motion\",list:\"data_lists\",extension:\"pen\"},im={default:Ap,large:zp,slider:Hp,list:nm},sm=(e,t)=>{const n=e.getStageBlockColors();return{background:n[rm[t]].primary,text:n.text}},lm=e=>o.a.createElement(oo.b,{disable:!e.draggable&&!e.onExport,holdToDisplay:\"slider\"===e.mode?-1:1e3,id:\"monitor-\".concat(e.id)},o.a.createElement(_p.a,{bounds:\".monitor-overlay\",cancel:\".no-drag\",defaultClassNameDragging:Tp.a.dragging,disabled:!e.draggable,onStop:e.onDragEnd,enableUserSelectHack:!1},o.a.createElement(Oe.a,{className:Tp.a.monitorContainer,componentRef:e.componentRef,onDoubleClick:\"list\"!==e.mode&&e.draggable?e.onNextMode:null,\"data-id\":e.id,\"data-opcode\":e.opcode},o.a.createElement(im[e.mode],function(e){for(var t=1;to.a.createElement(He,{className:mm.a.modalContent,contentLabel:e.intl.formatMessage(gm.title),id:\"sliderPrompt\",onRequestClose:e.onCancel},o.a.createElement(Oe.a,{className:mm.a.body},o.a.createElement(Oe.a,{className:mm.a.label},e.intl.formatMessage(gm.minValue)),o.a.createElement(Oe.a,null,o.a.createElement(\"input\",{className:mm.a.minInput,name:e.intl.formatMessage(gm.minValue),pattern:\"-?[0-9]*(\\\\.[0-9]+)?\",type:\"text\",value:e.minValue,onChange:e.onChangeMin,onKeyPress:e.onKeyPress})),o.a.createElement(Oe.a,{className:mm.a.label},e.intl.formatMessage(gm.maxValue)),o.a.createElement(Oe.a,null,o.a.createElement(\"input\",{className:mm.a.maxInput,name:e.intl.formatMessage(gm.maxValue),pattern:\"-?[0-9]*(\\\\.[0-9]+)?\",type:\"text\",value:e.maxValue,onChange:e.onChangeMax,onKeyPress:e.onKeyPress})),o.a.createElement(Oe.a,{className:mm.a.buttonRow},o.a.createElement(\"button\",{className:mm.a.cancelButton,onClick:e.onCancel},o.a.createElement(m.b,{defaultMessage:\"Cancel\",id:\"gui.sliderPrompt.cancel\"})),o.a.createElement(\"button\",{className:mm.a.okButton,onClick:e.onOk},o.a.createElement(m.b,{defaultMessage:\"OK\",id:\"gui.sliderPrompt.ok\"})))));hm.propTypes={intl:m.i,maxValue:i.a.string,minValue:i.a.string,onCancel:i.a.func.isRequired,onChangeMax:i.a.func.isRequired,onChangeMin:i.a.func.isRequired,onKeyPress:i.a.func.isRequired,onOk:i.a.func.isRequired};var bm=Object(m.h)(hm);class wm extends o.a.Component{constructor(e){super(e),E()(this,[\"handleOk\",\"handleCancel\",\"handleChangeMin\",\"handleChangeMax\",\"handleKeyPress\",\"validates\",\"shouldBeDiscrete\"]);const{isDiscrete:t,minValue:n,maxValue:a}=this.props;this.state={minValue:t?n.toFixed(0):n.toFixed(2),maxValue:t?a.toFixed(0):a.toFixed(2)}}handleKeyPress(e){\"Enter\"===e.key&&this.handleOk()}handleOk(){const{minValue:e,maxValue:t}=this.state;this.validates(e,t)?this.props.onOk(parseFloat(e),parseFloat(t),this.shouldBeDiscrete(e,t)):this.props.onCancel()}handleCancel(){this.props.onCancel()}handleChangeMin(e){this.setState({minValue:e.target.value})}handleChangeMax(e){this.setState({maxValue:e.target.value})}shouldBeDiscrete(e,t){return e.indexOf(\".\")+t.indexOf(\".\")===-2}validates(e,t){return isFinite(e)&&isFinite(t)}render(){return o.a.createElement(bm,{maxValue:this.state.maxValue,minValue:this.state.minValue,onCancel:this.handleCancel,onChangeMax:this.handleChangeMax,onChangeMin:this.handleChangeMin,onKeyPress:this.handleKeyPress,onOk:this.handleOk})}}wm.propTypes={isDiscrete:i.a.bool,maxValue:i.a.number,minValue:i.a.number,onCancel:i.a.func.isRequired,onOk:i.a.func.isRequired},wm.defaultProps={maxValue:100,minValue:0,isDiscrete:!0};var fm=wm;function Mm(){return Mm=Object.assign?Object.assign.bind():function(e){for(var t=1;tcm.filter((t=>\"data_variable\"===e?\"list\"!==t:\"data_listcontents\"===e?\"list\"===t:\"slider\"!==t&&\"list\"!==t)),ym=Object(m.g)({columnPrompt:{id:\"gui.monitors.importListColumnPrompt\",defaultMessage:\"Which column should be used (1-{numberOfColumns})?\"}});class km extends o.a.Component{constructor(e){super(e),E()(this,[\"handleDragEnd\",\"handleHide\",\"handleNextMode\",\"handleSetModeToDefault\",\"handleSetModeToLarge\",\"handleSetModeToSlider\",\"handleSliderPromptClose\",\"handleSliderPromptOk\",\"handleSliderPromptOpen\",\"handleImport\",\"handleExport\",\"setElement\"]),this.state={sliderPrompt:!1}}componentDidMount(){let e;const t=e=>\"number\"==typeof e&&!isNaN(e);t(this.props.x)&&t(this.props.y)&&!this.props.monitorLayout.savedMonitorPositions[this.props.id]?(e={upperStart:{x:this.props.x,y:this.props.y},lowerEnd:{x:this.props.x+this.element.offsetWidth,y:this.props.y+this.element.offsetHeight}},this.props.addMonitorRect(this.props.id,e,!0)):(e=Object(jp.c)(this.props.monitorLayout,this.props.id,this.element.offsetWidth,this.element.offsetHeight),this.props.addMonitorRect(this.props.id,e),this.props.vm.runtime.requestUpdateMonitor({id:this.props.id,x:e.upperStart.x,y:e.upperStart.y})),this.element.style.top=\"\".concat(e.upperStart.y,\"px\"),this.element.style.left=\"\".concat(e.upperStart.x,\"px\")}shouldComponentUpdate(e,t){if(t!==this.state)return!0;for(const t of Object.getOwnPropertyNames(e))if(\"monitorLayout\"!==t&&!Object.is(e[t],this.props[t]))return!0;return!1}componentDidUpdate(){this.props.draggable&&this.props.resizeMonitorRect(this.props.id,this.element.offsetWidth,this.element.offsetHeight)}componentWillUnmount(){this.props.removeMonitorRect(this.props.id)}handleDragEnd(e,t){let{x:n,y:a}=t;const o=parseInt(this.element.style.left,10)+n,r=parseInt(this.element.style.top,10)+a;this.props.onDragEnd(this.props.id,o,r),this.props.vm.runtime.requestUpdateMonitor({id:this.props.id,x:o,y:r})}handleHide(){this.props.vm.runtime.requestUpdateMonitor({id:this.props.id,visible:!1})}handleNextMode(){const e=vm(this.props.opcode),t=e.indexOf(this.props.mode),n=e[(t+1)%e.length];this.props.vm.runtime.requestUpdateMonitor({id:this.props.id,mode:n})}handleSetModeToDefault(){this.props.vm.runtime.requestUpdateMonitor({id:this.props.id,mode:\"default\"})}handleSetModeToLarge(){this.props.vm.runtime.requestUpdateMonitor({id:this.props.id,mode:\"large\"})}handleSetModeToSlider(){this.props.vm.runtime.requestUpdateMonitor({id:this.props.id,mode:\"slider\"})}handleSliderPromptClose(){this.setState({sliderPrompt:!1})}handleSliderPromptOpen(){this.setState({sliderPrompt:!0})}handleSliderPromptOk(e,t,n){const a=Math.min(e,t),o=Math.max(e,t);this.props.vm.runtime.requestUpdateMonitor({id:this.props.id,sliderMin:a,sliderMax:o,isDiscrete:n}),this.handleSliderPromptClose()}setElement(e){this.element=e}handleImport(){new Promise(((e,t)=>{const n=document.createElement(\"input\");n.setAttribute(\"type\",\"file\"),n.setAttribute(\"accept\",\".csv, .tsv, .txt\"),n.onchange=a=>{const o=a.target.files[0],r=new FileReader;r.onload=()=>{document.body.removeChild(n);const a=r.result;um.a.parse(a,{header:!1,complete:t=>{e({rows:t.data,text:a})},error:e=>{t(e)}})},r.onerror=()=>{document.body.removeChild(n),t(new Error(\"Cannot read file\"))},r.readAsText(o)},document.body.appendChild(n),n.click()})).then((async e=>{let{rows:t,text:n}=e;const a=t[0].length;let o,r=1;if(a>1){const e=this.props.intl.formatMessage(ym.columnPrompt,{numberOfColumns:a});r=parseInt(await prompt(e),10)}o=isNaN(r)||1===a?n.replace(/\\r/g,\"\").split(\"\\n\"):t.map((e=>e[r-1])).filter((e=>\"string\"==typeof e));const{vm:i,targetId:s,id:l}=this.props;Up(i,s,l,o)}))}handleExport(){const{vm:e,targetId:t,id:n}=this.props,a=Lp(e,t,n),o=a.value.join(\"\\r\\n\"),r=new Blob([o],{type:\"text/plain;charset=utf-8\"});Object(cr.a)(\"\".concat(a.name,\".txt\"),r)}render(){const e=function(e){let{id:t,mode:n,spriteName:a,opcode:o,params:r,value:i,vm:s}=e,{label:l,category:c,labelFn:d}=s&&s.runtime.getLabelForOpcode(o)||Sp.getLabel(o);return void 0!==d&&(l=d(r)),a&&(l=\"\".concat(a,\": \").concat(l)),\"number\"!=typeof i||Object.is(i,-0)||(i=Number(i.toFixed(6))),\"list\"!==n&&(i=xp(i)),{id:t,label:l,category:c,value:i}}(this.props),t=-1!==vm(this.props.opcode).indexOf(\"slider\"),n=\"list\"===this.props.mode;return o.a.createElement(o.a.Fragment,null,this.state.sliderPrompt&&o.a.createElement(fm,{isDiscrete:this.props.isDiscrete,maxValue:parseFloat(this.props.max),minValue:parseFloat(this.props.min),onCancel:this.handleSliderPromptClose,onOk:this.handleSliderPromptOk}),o.a.createElement(lm,Mm({componentRef:this.setElement},e,{opcode:this.props.opcode,draggable:this.props.draggable,height:this.props.height,isDiscrete:this.props.isDiscrete,max:this.props.max,min:this.props.min,mode:this.props.mode,targetId:this.props.targetId,theme:this.props.theme,width:this.props.width,onDragEnd:this.handleDragEnd,onExport:n?this.handleExport:null,onImport:n?this.handleImport:null,onHide:this.handleHide,onNextMode:this.handleNextMode,onSetModeToDefault:n?null:this.handleSetModeToDefault,onSetModeToLarge:n?null:this.handleSetModeToLarge,onSetModeToSlider:t?this.handleSetModeToSlider:null,onSliderPromptOpen:this.handleSliderPromptOpen})))}}km.propTypes={addMonitorRect:i.a.func.isRequired,draggable:i.a.bool,height:i.a.number,id:i.a.string.isRequired,intl:m.i,isDiscrete:i.a.bool,max:i.a.number,min:i.a.number,mode:i.a.oneOf([\"default\",\"slider\",\"large\",\"list\"]),monitorLayout:i.a.shape({monitors:i.a.object,savedMonitorPositions:i.a.object}).isRequired,onDragEnd:i.a.func.isRequired,opcode:i.a.string.isRequired,params:i.a.object,removeMonitorRect:i.a.func.isRequired,resizeMonitorRect:i.a.func.isRequired,spriteName:i.a.string,targetId:i.a.string,theme:i.a.instanceOf(da.m),toolboxXML:i.a.string,value:i.a.oneOfType([i.a.string,i.a.number,i.a.arrayOf(i.a.oneOfType([i.a.string,i.a.number]))]),vm:i.a.instanceOf(p.a),width:i.a.number,x:i.a.number,y:i.a.number},km.defaultProps={theme:da.m.light};var jm=Object(m.h)(Object(l.b)((e=>({monitorLayout:e.scratchGui.monitorLayout,theme:e.scratchGui.theme.theme,toolboxXML:e.scratchGui.toolbox.toolboxXML,vm:e.scratchGui.vm})),(e=>({addMonitorRect:(t,n,a)=>e(Object(jp.a)(t,n.upperStart,n.lowerEnd,a)),resizeMonitorRect:(t,n,a)=>e(Object(jp.h)(t,n,a)),removeMonitorRect:t=>e(Object(jp.f)(t))})))(km)),Im=n(238),Sm=n.n(Im);const xm=e=>o.a.createElement(Oe.a,{className:ye()(Sm.a.monitorList,\"monitor-overlay\"),style:{width:e.stageSize.width,height:e.stageSize.height}},o.a.createElement(Oe.a,{className:Sm.a.monitorListScaler,style:Lu(e.stageSize)},e.monitors&&e.monitors.valueSeq().filter((e=>e.visible)).map((t=>o.a.createElement(jm,{draggable:e.draggable,height:t.height,id:t.id,isDiscrete:t.isDiscrete,key:t.id,max:t.sliderMax,min:t.sliderMin,mode:t.mode,opcode:t.opcode,params:t.params,spriteName:t.spriteName,targetId:t.targetId,value:t.value,width:t.width,x:t.x,y:t.y,onDragEnd:e.onMonitorChange})))));xm.propTypes={draggable:i.a.bool.isRequired,monitors:i.a.shape({valueSeq:i.a.func}),onMonitorChange:i.a.func.isRequired,stageSize:i.a.shape({width:i.a.number,height:i.a.number,widthDefault:i.a.number,heightDefault:i.a.number}).isRequired};var Em=xm;function Cm(){return Cm=Object.assign?Object.assign.bind():function(e){for(var t=1;t({customStageSize:e.scratchGui.customStageSize,monitors:e.scratchGui.monitors,monitorLayout:e.scratchGui.monitorLayout})),(e=>({moveMonitorRect:(t,n,a)=>e(Object(jp.e)(t,n,a)),resetMonitorLayout:()=>e(Object(jp.g)())})))(Nm)));class Dm extends o.a.Component{constructor(e){super(e),E()(this,[\"getPageCoords\"])}getPageCoords(e,t){const{stageWidth:n,stageHeight:a,vm:o}=this.props,r=o.renderer.getNativeSize();return[n/r[0]*e+n/2,-a/r[1]*t+a/2]}render(){const{className:e,highlightedTargetId:t,highlightedTargetTime:n,vm:a}=this.props;if(!(t&&a&&a.renderer&&a.runtime.getTargetById(t)))return null;const r=a.runtime.getTargetById(t),i=a.renderer.getBounds(r.drawableID),[s,l]=this.getPageCoords(i.left,i.top),[c,d]=this.getPageCoords(i.right,i.bottom);return o.a.createElement(\"div\",{className:e,key:n,style:{position:\"absolute\",top:\"\".concat(l-2,\"px\"),left:\"\".concat(s-2,\"px\"),width:\"\".concat(c-s+4,\"px\"),height:\"\".concat(d-l+4,\"px\")}})}}Dm.propTypes={className:i.a.string,highlightedTargetId:i.a.string,highlightedTargetTime:i.a.number,stageHeight:i.a.number,stageWidth:i.a.number,vm:i.a.instanceOf(p.a)};var Tm=Object(l.b)((e=>({highlightedTargetTime:e.scratchGui.targets.highlightedTargetTime,highlightedTargetId:e.scratchGui.targets.highlightedTargetId,vm:e.scratchGui.vm})),(()=>({})))(Dm);class Om extends o.a.Component{constructor(e){super(e),E()(this,[\"handleClick\"])}handleClick(){this.props.vm.start(),this.props.vm.greenFlag(),this.props.onStarted()}render(){return o.a.createElement(Oe.a,{className:this.props.wrapperClass,onClick:this.handleClick},o.a.createElement(\"div\",{className:this.props.className},o.a.createElement(\"img\",{draggable:!1,src:Xd.a})))}}Om.propTypes={className:i.a.string,vm:i.a.instanceOf(p.a),wrapperClass:i.a.string,onStarted:i.a.func};var Am=Object(l.b)((e=>({vm:e.scratchGui.vm})),(e=>({onStarted:()=>e(Object(X.c)(!0))})))(Om),Pm=n(138),zm=n.n(Pm),Lm=n(348),Rm=n.n(Lm);const Um=e=>{const{answer:t,className:n,question:a,onChange:r,onClick:i,onKeyPress:s}=e;return o.a.createElement(\"div\",{className:n},o.a.createElement(\"div\",{className:zm.a.questionContainer},a?o.a.createElement(\"div\",{className:zm.a.questionLabel},a):null,o.a.createElement(\"div\",{className:zm.a.questionInput},o.a.createElement(Zr.a,{autoFocus:!0,value:t,onChange:r,onKeyPress:s}),o.a.createElement(\"button\",{className:zm.a.questionSubmitButton,onClick:i},o.a.createElement(\"img\",{className:zm.a.questionSubmitButtonIcon,draggable:!1,src:Rm.a})))))};Um.propTypes={answer:i.a.string,className:i.a.string,onChange:i.a.func.isRequired,onClick:i.a.func.isRequired,onKeyPress:i.a.func.isRequired,question:i.a.string};var Bm=Um;class Gm extends o.a.Component{constructor(e){super(e),E()(this,[\"handleChange\",\"handleKeyPress\",\"handleSubmit\"]),this.state={answer:\"\"}}handleChange(e){this.setState({answer:e.target.value})}handleKeyPress(e){\"Enter\"===e.key&&this.handleSubmit()}handleSubmit(){this.props.onQuestionAnswered(this.state.answer)}render(){return o.a.createElement(Bm,{answer:this.state.answer,question:this.props.question,onChange:this.handleChange,onClick:this.handleSubmit,onKeyPress:this.handleKeyPress})}}Gm.propTypes={onQuestionAnswered:i.a.func.isRequired,question:i.a.string};var Fm=Gm,Zm=n(349),Wm=n.n(Zm),Hm=n(350),Qm=n.n(Hm);const Ym=e=>o.a.createElement(\"div\",{className:e.className,style:Lu(e.stageSize)},o.a.createElement(\"img\",{className:Wm.a.micImg,src:Qm.a,draggable:!1}));Ym.propTypes={className:i.a.string,stageSize:i.a.shape({width:i.a.number,height:i.a.number,widthDefault:i.a.number,heightDefault:i.a.number}).isRequired};var Vm=Ym,qm=n(41),Jm=n.n(qm);const Xm=[\"canvas\",\"customStageSize\",\"dragRef\",\"isColorPicking\",\"isFullScreen\",\"isPlayerOnly\",\"isStarted\",\"isRtl\",\"colorInfo\",\"micIndicator\",\"question\",\"stageSize\",\"useEditorDragStyle\",\"onDeactivateColorPicker\",\"onDoubleClick\",\"onQuestionAnswered\"];function Km(){return Km=Object.assign?Object.assign.bind():function(e){for(var t=1;t{const{canvas:t,customStageSize:n,dragRef:a,isColorPicking:r,isFullScreen:i,isPlayerOnly:s,isStarted:l,isRtl:c,colorInfo:d,micIndicator:u,question:p,stageSize:m,useEditorDragStyle:g,onDeactivateColorPicker:h,onDoubleClick:b,onQuestionAnswered:w}=e,f=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a{const t=na.c[e];return t.width?t.width:na.b*t.scale})(m),y=M.width{}};var ag=ng;const og=[\"vm\",\"onActivateColorPicker\",\"disableEditingTargetChange\"];function rg(){return rg=Object.assign?Object.assign.bind():function(e){for(var t=1;t{this.props.vm.runtime.emit(\"ANSWER\",e)}))}startColorPickingLoop(){const e=()=>{this.animationFrameId=requestAnimationFrame(e),\"number\"==typeof this.pickX&&this.setState({colorInfo:this.getColorInfo(this.pickX,this.pickY)})};this.animationFrameId=requestAnimationFrame(e)}stopColorPickingLoop(){cancelAnimationFrame(this.animationFrameId)}attachMouseEvents(e){document.addEventListener(\"mousemove\",this.onMouseMove),document.addEventListener(\"mouseup\",this.onMouseUp),document.addEventListener(\"touchmove\",this.onMouseMove),document.addEventListener(\"touchend\",this.onMouseUp),e.addEventListener(\"mousedown\",this.onMouseDown),e.addEventListener(\"touchstart\",this.onMouseDown),e.addEventListener(\"wheel\",this.onWheel),e.addEventListener(\"contextmenu\",this.onContextMenu)}detachMouseEvents(e){document.removeEventListener(\"mousemove\",this.onMouseMove),document.removeEventListener(\"mouseup\",this.onMouseUp),document.removeEventListener(\"touchmove\",this.onMouseMove),document.removeEventListener(\"touchend\",this.onMouseUp),e.removeEventListener(\"mousedown\",this.onMouseDown),e.removeEventListener(\"touchstart\",this.onMouseDown),e.removeEventListener(\"wheel\",this.onWheel),e.removeEventListener(\"contextmenu\",this.onContextMenu)}attachRectEvents(){window.addEventListener(\"resize\",this.updateRect),window.addEventListener(\"scroll\",this.updateRect)}detachRectEvents(){window.removeEventListener(\"resize\",this.updateRect),window.removeEventListener(\"scroll\",this.updateRect)}updateRect(){this.rect=this.canvas.getBoundingClientRect()}getScratchCoords(e,t){const n=this.renderer.getNativeSize();return[n[0]/this.rect.width*(e-this.rect.width/2),n[1]/this.rect.height*(t-this.rect.height/2)]}getColorInfo(e,t){return function(e){for(var t=1;t3&&(this.cancelMouseDownTimeout(),this.onStartDrag(...this.state.mouseDownPosition))}if(this.state.mouseDown&&this.state.isDragging)if(this.props.useEditorDragStyle)this.positionDragCanvas(a[0],a[1]);else{const e=this.getScratchCoords(a[0],a[1]);this.props.vm.postSpriteInfo({x:e[0]+this.state.dragOffset[0],y:-(e[1]+this.state.dragOffset[1]),force:!0})}const o={x:a[0],y:a[1],canvasWidth:this.rect.width,canvasHeight:this.rect.height};this.props.vm.postIOData(\"mouse\",o)}onMouseUp(e){const{x:t,y:n}=Ya(e),a=[t-this.rect.left,n-this.rect.top];this.cancelMouseDownTimeout(),this.setState({mouseDown:!1,mouseDownPosition:null});const o={isDown:!1,button:e.button,x:t-this.rect.left,y:n-this.rect.top,canvasWidth:this.rect.width,canvasHeight:this.rect.height,wasDragged:this.state.isDragging};if(this.state.isDragging&&this.onStopDrag(a[0],a[1]),this.props.vm.postIOData(\"mouse\",o),this.props.isColorPicking&&a[0]>0&&a[0]0&&a[1]{const t=e.toString(16);return 1===t.length?\"0\".concat(t):t},o=\"#\".concat(a(e)).concat(a(t)).concat(a(n));this.props.onDeactivateColorPicker(o),this.setState({colorInfo:null}),this.pickX=null,this.pickY=null}}onMouseDown(e){this.updateRect();const{x:t,y:n}=Ya(e),a=[t-this.rect.left,n-this.rect.top];if(this.props.isColorPicking)this.pickX=a[0],this.pickY=a[1],this.setState({colorInfo:this.getColorInfo(this.pickX,this.pickY)});else{const t=window.TouchEvent&&e instanceof TouchEvent;(0===e.button||t)&&this.setState({mouseDown:!0,mouseDownPosition:a,mouseDownTimeoutId:setTimeout(this.onStartDrag.bind(this,a[0],a[1]),400)});const n={isDown:!0,button:e.button,x:a[0],y:a[1],canvasWidth:this.rect.width,canvasHeight:this.rect.height};this.props.vm.postIOData(\"mouse\",n),t&&e.preventDefault&&(e.preventDefault(),document.activeElement&&document.activeElement.blur&&document.activeElement.blur())}}onWheel(e){const t={deltaX:e.deltaX,deltaY:e.deltaY};this.props.vm.postIOData(\"mouseWheel\",t)}onContextMenu(e){this.props.vm.runtime.ioDevices.mouse.usesRightClickDown&&e.preventDefault()}cancelMouseDownTimeout(){null!==this.state.mouseDownTimeoutId&&clearTimeout(this.state.mouseDownTimeoutId),this.setState({mouseDownTimeoutId:null})}drawDragCanvas(e,t,n){const{imageData:a,x:o,y:r,width:i,height:s}=e;this.dragCanvas.width=a.width,this.dragCanvas.height=a.height,this.dragCanvas.style.width=\"\".concat(i,\"px\"),this.dragCanvas.style.height=\"\".concat(s,\"px\"),this.dragCanvas.getContext(\"2d\").putImageData(a,0,0),this.dragCanvas.style.left=\"\".concat(o-t,\"px\"),this.dragCanvas.style.top=\"\".concat(r-n,\"px\"),this.dragCanvas.style.display=\"block\"}clearDragCanvas(){this.dragCanvas.width=this.dragCanvas.height=0,this.dragCanvas.style.display=\"none\"}positionDragCanvas(e,t){this.dragCanvas.style.transform=\"translate(\".concat(e,\"px, \").concat(t,\"px)\")}onStartDrag(e,t){if(this.state.dragId)return;const n=this.renderer.pick(e,t);if(-1===n)return;const a=this.props.vm.getTargetIdForDrawableId(n);if(null===a)return;const o=this.props.vm.runtime.getTargetById(a);if(!this.props.useEditorDragStyle&&!o.draggable)return;o.goToFront();const[r,i]=this.getScratchCoords(e,t),s=o.x-r,l=-(o.y+i);if(this.props.vm.startDrag(a),this.setState({isDragging:!0,dragId:a,dragOffset:[s,l]}),this.props.useEditorDragStyle){const a=this.renderer.extractDrawableScreenSpace(n);this.drawDragCanvas(a,e,t),this.positionDragCanvas(e,t),this.props.vm.postSpriteInfo({visible:!1}),this.props.vm.renderer.draw()}}onStopDrag(e,t){const n=this.state.dragId,a=()=>{this.props.vm.stopDrag(n),this.setState({isDragging:!1,dragOffset:null,dragId:null})};if(this.props.useEditorDragStyle){const n={visible:!0};if(e>0&&e0&&t({highQualityPen:e.scratchGui.tw.highQualityPen,customStageSize:e.scratchGui.customStageSize,disableEditingTargetChange:e.scratchGui.mode.isFullScreen||e.scratchGui.mode.isEmbedded||e.scratchGui.mode.isPlayerOnly,isColorPicking:e.scratchGui.colorPicker.active,isFullScreen:e.scratchGui.mode.isFullScreen||e.scratchGui.mode.isEmbedded,isPlayerOnly:e.scratchGui.mode.isPlayerOnly,isRtl:e.locales.isRtl,isWindowFullScreen:e.scratchGui.tw.isWindowFullScreen,dimensions:e.scratchGui.tw.dimensions,isStarted:e.scratchGui.vmStatus.started,micIndicator:e.scratchGui.micIndicator,useEditorDragStyle:!(e.scratchGui.mode.isFullScreen||e.scratchGui.mode.isPlayerOnly)})),(e=>({onHighQualityPenChanged:t=>e(Object($.m)(t)),onActivateColorPicker:()=>e(Object(fa.a)()),onDeactivateColorPicker:t=>e(Object(fa.c)(t))})))(lg),dg=n(75),ug=n.n(dg),pg=n(351),mg=n.n(pg),gg=n(352),hg=n.n(gg),bg=n(353),wg=n.n(bg);const fg={\"gui.loader.headline\":o.a.createElement(m.b,{defaultMessage:\"Loading Project\",id:\"gui.loader.headline\"}),\"gui.loader.creating\":o.a.createElement(m.b,{defaultMessage:\"Creating Project\",id:\"gui.loader.creating\"})},Mg=Object(m.g)({projectData:{id:\"tw.loader.projectData\",defaultMessage:\"Loading project …\"},downloadingAssets:{id:\"tw.loader.downloadingAssets\",defaultMessage:\"Downloading assets ({complete}/{total}) …\"},loadingAssets:{id:\"tw.loader.loadingAssets\",defaultMessage:\"Loading assets ({complete}/{total}) …\"}});class vg extends o.a.Component{constructor(e){super(e),E()(this,[\"handleAssetProgress\",\"handleProjectLoaded\",\"barInnerRef\",\"messageRef\"]),this.barInnerEl=null,this.messageEl=null,this.ignoreProgress=!1}componentDidMount(){this.handleAssetProgress(this.props.vm.runtime.finishedAssetRequests,this.props.vm.runtime.totalAssetRequests),this.props.vm.on(\"ASSET_PROGRESS\",this.handleAssetProgress),this.props.vm.runtime.on(\"PROJECT_LOADED\",this.handleProjectLoaded)}componentWillUnmount(){this.props.vm.off(\"ASSET_PROGRESS\",this.handleAssetProgress),this.props.vm.runtime.off(\"PROJECT_LOADED\",this.handleProjectLoaded)}handleAssetProgress(e,t){if(!this.ignoreProgress&&this.barInnerEl&&this.messageEl)if(0===t)this.barInnerEl.style.width=\"0\",this.messageEl.textContent=this.props.intl.formatMessage(Mg.projectData);else{this.barInnerEl.style.width=\"\".concat(e/t*100,\"%\");const n=this.props.isRemote?Mg.downloadingAssets:Mg.loadingAssets;this.messageEl.textContent=this.props.intl.formatMessage(n,{complete:e,total:t})}}handleProjectLoaded(){!this.ignoreProgress&&this.barInnerEl&&this.messageEl&&(this.ignoreProgress=!0,this.props.vm.runtime.resetProgress())}barInnerRef(e){this.barInnerEl=e}messageRef(e){this.messageEl=e}render(){return o.a.createElement(\"div\",{className:ye()(ug.a.background,{[ug.a.fullscreen]:this.props.isFullScreen})},o.a.createElement(\"div\",{className:ug.a.container},o.a.createElement(\"div\",{className:ug.a.blockAnimation},o.a.createElement(\"img\",{className:ug.a.topBlock,src:mg.a,draggable:!1}),o.a.createElement(\"img\",{className:ug.a.middleBlock,src:hg.a,draggable:!1}),o.a.createElement(\"img\",{className:ug.a.bottomBlock,src:wg.a,draggable:!1})),o.a.createElement(\"div\",{className:ug.a.title},fg[this.props.messageId]),o.a.createElement(\"div\",{className:ug.a.message,ref:this.messageRef}),o.a.createElement(\"div\",{className:ug.a.barOuter},o.a.createElement(\"div\",{className:ug.a.barInner,ref:this.barInnerRef}))))}}vg.propTypes={intl:m.i,isFullScreen:i.a.bool,isRemote:i.a.bool,messageId:i.a.string,vm:i.a.shape({on:i.a.func,off:i.a.func,runtime:i.a.shape({totalAssetRequests:i.a.number,finishedAssetRequests:i.a.number,resetProgress:i.a.func,on:i.a.func,off:i.a.func})})},vg.defaultProps={isFullScreen:!1,messageId:\"gui.loader.headline\"};var yg=Object(l.b)((e=>({isRemote:Object(h.o)(e.scratchGui.projectState.loadingState),vm:e.scratchGui.vm})),(()=>({})))(Object(m.h)(vg)),kg=n(113),jg=n.n(kg);const Ig=function(e){const{isEmbedded:t,isFullScreen:n,isRtl:a,isRendererSupported:r,loading:i,stageSize:s,vm:l}=e;return o.a.createElement(Oe.a,{className:ye()(jg.a.stageWrapper,{[jg.a.embedded]:t,[jg.a.fullScreen]:n,[jg.a.loading]:i,[jg.a.offsetControls]:!(t||n)}),dir:a?\"rtl\":\"ltr\"},o.a.createElement(Oe.a,{className:jg.a.stageMenuWrapper},o.a.createElement(rp,{stageSize:s,vm:l})),o.a.createElement(Oe.a,{className:jg.a.stageCanvasWrapper},r?o.a.createElement(cg,{stageSize:s,vm:l}):null),i?o.a.createElement(yg,{isFullScreen:n}):null)};Ig.propTypes={isEmbedded:i.a.bool,isFullScreen:i.a.bool,isRendererSupported:i.a.bool.isRequired,isRtl:i.a.bool.isRequired,loading:i.a.bool,stageSize:i.a.oneOf(Object.keys(na.d)).isRequired,vm:i.a.instanceOf(p.a).isRequired};var Sg=Ig;const xg=e=>o.a.createElement(Sg,e);xg.propTypes={isRendererSupported:i.a.bool.isRequired,stageSize:i.a.oneOf(Object.keys(na.d)).isRequired,vm:i.a.instanceOf(p.a).isRequired};var Eg=xg,Cg=n(212);const Ng=Object(m.g)({libraryTitle:{id:\"gui.costumeLibrary.chooseACostume\",defaultMessage:\"Choose a Costume\"}});class _g extends o.a.PureComponent{constructor(e){super(e),E()(this,[\"handleItemSelected\"]),this.state={data:Sr()}}componentDidMount(){this.state.data.then&&this.state.data.then((e=>this.setState({data:e})))}handleItemSelected(e){const t={name:e.name,rotationCenterX:e.rotationCenterX,rotationCenterY:e.rotationCenterY,bitmapResolution:e.bitmapResolution,skinId:null};this.props.vm.addCostumeFromLibrary(e.md5ext,t)}render(){return o.a.createElement(Tn,{data:this.state.data.then?null:this.state.data,id:\"costumeLibrary\",tags:Pr,title:this.props.intl.formatMessage(Ng.libraryTitle),removedTrademarks:!0,onItemSelected:this.handleItemSelected,onRequestClose:this.props.onRequestClose})}}_g.propTypes={intl:m.i.isRequired,onRequestClose:i.a.func,vm:i.a.instanceOf(p.a).isRequired};var Dg=Object(m.h)(_g),Tg=[{tag:\"fantasy\",intlLabel:Ar.fantasy},{tag:\"music\",intlLabel:Ar.music},{tag:\"sports\",intlLabel:Ar.sports},{tag:\"outdoors\",intlLabel:Ar.outdoors},{tag:\"indoors\",intlLabel:Ar.indoors},{tag:\"space\",intlLabel:Ar.space},{tag:\"underwater\",intlLabel:Ar.underwater},{tag:\"patterns\",intlLabel:Ar.patterns}];const Og=Object(m.g)({libraryTitle:{id:\"gui.costumeLibrary.chooseABackdrop\",defaultMessage:\"Choose a Backdrop\"}});class Ag extends o.a.Component{constructor(e){super(e),E()(this,[\"handleItemSelect\"]),this.state={data:Ir()}}componentDidMount(){this.state.data.then&&this.state.data.then((e=>this.setState({data:e})))}handleItemSelect(e){const t={name:e.name,rotationCenterX:e.rotationCenterX,rotationCenterY:e.rotationCenterY,bitmapResolution:e.bitmapResolution,skinId:null};this.props.vm.addBackdrop(e.md5ext,t)}render(){return o.a.createElement(Tn,{data:this.state.data.then?null:this.state.data,id:\"backdropLibrary\",tags:Tg,title:this.props.intl.formatMessage(Og.libraryTitle),onItemSelected:this.handleItemSelect,onRequestClose:this.props.onRequestClose})}}Ag.propTypes={intl:m.i.isRequired,onRequestClose:i.a.func,vm:i.a.instanceOf(p.a).isRequired};var Pg=Object(m.h)(Ag),zg=n(379),Lg=n.n(zg);const Rg=e=>o.a.createElement(\"img\",{className:Lg.a.spriteImage,loading:\"lazy\",src:e.costumeURL,draggable:!1});Rg.propTypes={costumeURL:i.a.string};var Ug=Rg;function Bg(){return Bg=Object.assign?Object.assign.bind():function(e){for(var t=1;t{const t=e.scratchGui.targets,n=t.editingTarget;let a;if(n)if(t.stage.id===n)a=t.stage.costume.asset;else if(Object.prototype.hasOwnProperty.call(t.sprites,n)){a=t.sprites[n].costume.asset}return{vm:e.scratchGui.vm,asset:a}}))(Wi(\"asset\",500)(Gg));var Zg=Fg,Wg=n(161),Hg=n(76),Qg=n.n(Hg);const Yg=()=>{},Vg={costume:ra.BACKPACK_COSTUME,sound:ra.BACKPACK_SOUND,script:ra.BACKPACK_CODE,sprite:ra.BACKPACK_SPRITE},qg=Object(m.g)({costume:{id:\"gui.backpack.costumeLabel\",defaultMessage:\"costume\"},sound:{id:\"gui.backpack.soundLabel\",defaultMessage:\"sound\"},script:{id:\"gui.backpack.scriptLabel\",defaultMessage:\"script\"},sprite:{id:\"gui.backpack.spriteLabel\",defaultMessage:\"sprite\"}}),Jg=e=>{let{blockDragOver:t,containerRef:n,contents:a,dragOver:r,error:i,expanded:s,intl:l,loading:c,showMore:d,onToggle:u,onDelete:p,onRename:g,onMouseEnter:h,onMouseLeave:b,onMore:w}=e;return o.a.createElement(\"div\",{className:Qg.a.backpackContainer},o.a.createElement(\"div\",{className:Qg.a.backpackHeader,onClick:u},u?o.a.createElement(m.b,{defaultMessage:\"Backpack\",id:\"gui.backpack.header\"}):o.a.createElement(Wg.a,{place:\"top\",tooltipId:\"backpack-tooltip\"},o.a.createElement(m.b,{defaultMessage:\"Backpack\",id:\"gui.backpack.header\"}))),s?o.a.createElement(\"div\",{className:ye()(Qg.a.backpackList,{[Qg.a.dragOver]:r||t}),ref:n,onMouseEnter:h,onMouseLeave:b},!1!==i?o.a.createElement(\"div\",{className:Qg.a.statusMessage},o.a.createElement(m.b,{defaultMessage:\"Error loading backpack\",id:\"gui.backpack.errorBackpack\"}),o.a.createElement(\"div\",{className:Qg.a.errorMessage},i)):c?o.a.createElement(\"div\",{className:Qg.a.statusMessage},o.a.createElement(m.b,{defaultMessage:\"Loading...\",id:\"gui.backpack.loadingBackpack\"})):a.length>0?o.a.createElement(\"div\",{className:Qg.a.backpackListInner},a.map((e=>o.a.createElement(Mo,{className:Qg.a.backpackItem,costumeURL:e.thumbnailUrl,details:e.name,dragPayload:e,dragType:Vg[e.type],id:e.id,key:e.id,name:l.formatMessage(qg[e.type]),selected:!1,onClick:Yg,onDeleteButtonClick:p,onRenameButtonClick:\"sprite\"===e.type?null:g}))),d&&o.a.createElement(\"button\",{className:Qg.a.more,onClick:w},o.a.createElement(m.b,{defaultMessage:\"More\",id:\"gui.backpack.more\"}))):o.a.createElement(\"div\",{className:Qg.a.statusMessage},o.a.createElement(m.b,{defaultMessage:\"Backpack is empty\",id:\"gui.backpack.emptyBackpack\"}))):null)};Jg.propTypes={blockDragOver:i.a.bool,containerRef:i.a.func,contents:i.a.arrayOf(i.a.shape({id:i.a.string,thumbnailUrl:i.a.string,type:i.a.string,name:i.a.string})),dragOver:i.a.bool,error:i.a.oneOfType([i.a.bool,i.a.string]),expanded:i.a.bool,intl:m.i,loading:i.a.bool,onDelete:i.a.func,onRename:i.a.func,onMore:i.a.func,onMouseEnter:i.a.func,onMouseLeave:i.a.func,onToggle:i.a.func,showMore:i.a.bool},Jg.defaultProps={blockDragOver:!1,contents:[],dragOver:!1,expanded:!1,loading:!1,showMore:!1,onMore:null,onToggle:null};var Xg=Object(m.h)(Jg);function Kg(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function $g(e){for(var t=1;t{window.dispatchEvent(new Event(\"resize\"))})),e&&this.getContents()}handleError(e){throw this.setState({error:\"\".concat(e),loading:!1}),e}handleDrop(e){let t=null,n=null;switch(e.dragType){case ra.COSTUME:t=ns,n=e.payload.asset;break;case ra.SOUND:t=rs,n=e.payload.asset;break;case ra.SPRITE:t=is;break;case ra.CODE:t=Ta}t&&this.setState({loading:!0},(()=>{t(e.payload,this.props.vm).then((e=>n&&!n.clean&&!this.props.host===ks?_.a.store(n.assetType,n.dataFormat,n.data,n.assetId).then((()=>e)):e)).then((e=>(e=>{let{host:t,username:n,token:a,type:o,mime:r,name:i,body:s,thumbnail:l}=e;return new Promise(((e,c)=>{if(t===ks)return e(Ms({type:o,mime:r,name:i,body:s,thumbnail:l}));F()({method:\"POST\",uri:\"\".concat(t,\"/\").concat(n),headers:{\"x-token\":a},json:{type:o,mime:r,name:i,body:s,thumbnail:l}},((n,a)=>n||200!==a.statusCode?c(new Error(a.status)):e(js(a.body,t))))}))})($g({host:this.props.host,token:this.props.token,username:this.props.username},e)))).then((e=>{this.setState({loading:!1,contents:[e].concat(this.state.contents)})})).catch((e=>{this.handleError(e)}))}))}handleDelete(e){this.setState({loading:!0},(()=>{(e=>{let{host:t,username:n,token:a,id:o}=e;return new Promise(((e,r)=>{if(t===ks)return e(vs({id:o}));F()({method:\"DELETE\",uri:\"\".concat(t,\"/\").concat(n,\"/\").concat(o),headers:{\"x-token\":a}},((t,n)=>t||200!==n.statusCode?r(new Error(n.status)):e(n.body)))}))})({host:this.props.host,token:this.props.token,username:this.props.username,id:e}).then((()=>{this.setState({loading:!1,contents:this.state.contents.filter((t=>t.id!==e))})})).catch((e=>{this.handleError(e)}))}))}findItemById(e){return this.state.contents.find((t=>t.id===e))}async handleRename(e){const t=this.findItemById(e),n=await prompt(this.props.intl.formatMessage(nh.rename),t.name);n&&this.setState({loading:!0},(()=>{(e=>{let{host:t,id:n,name:a}=e;return new Promise(((e,o)=>{if(t===ks)return e(ys({id:n,name:a}));o(new Error(\"updateBackpackObject not supported\"))}))})($g($g({host:this.props.host},t),{},{name:n})).then((e=>{this.setState({loading:!1,contents:this.state.contents.map((n=>n===t?e:n))})})).catch((e=>{this.handleError(e)}))}))}getContents(){(this.props.token&&this.props.username||this.props.host===ks)&&this.setState({loading:!0,error:!1},(()=>{(e=>{let{host:t,username:n,token:a,limit:o,offset:r}=e;return new Promise(((e,i)=>{if(t===ks)return e(fs({limit:o,offset:r}));F()({method:\"GET\",uri:\"\".concat(t,\"/\").concat(n,\"?limit=\").concat(o,\"&offset=\").concat(r),headers:{\"x-token\":a},json:!0},((n,a)=>n||200!==a.statusCode?i(new Error(a.status)):e(a.body.map((e=>js(e,t))))))}))})({host:this.props.host,token:this.props.token,username:this.props.username,offset:this.state.contents.length,limit:this.state.itemsPerPage}).then((e=>{this.setState({contents:this.state.contents.concat(e),moreToLoad:e.length===this.state.itemsPerPage,loading:!1})})).catch((e=>{this.handleError(e)}))}))}handleBlockDragUpdate(e){this.setState({blockDragOutsideWorkspace:e})}handleMouseEnter(){this.state.blockDragOutsideWorkspace&&this.setState({blockDragOverBackpack:!0})}handleMouseLeave(){this.setState({blockDragOverBackpack:!1})}handleBlockDragEnd(e,t){this.state.blockDragOverBackpack&&this.handleDrop({dragType:ra.CODE,payload:{blockObjects:this.props.vm.exportStandaloneBlocks(e),topBlockId:t}}),this.setState({blockDragOverBackpack:!1,blockDragOutsideWorkspace:!1})}handleMore(){this.getContents()}render(){return o.a.createElement(th,{blockDragOver:this.state.blockDragOverBackpack,contents:this.state.contents,error:this.state.error,expanded:this.state.expanded,loading:this.state.loading,showMore:this.state.moreToLoad,onDelete:this.handleDelete,onRename:this.handleRename,onDrop:this.handleDrop,onMore:this.handleMore,onMouseEnter:this.handleMouseEnter,onMouseLeave:this.handleMouseLeave,onToggle:this.props.host?this.handleToggle:null})}}ah.propTypes={intl:m.i,host:i.a.string,token:i.a.string,username:i.a.string,vm:i.a.instanceOf(p.a)};var oh=Object(m.h)(Object(l.b)((e=>Object.assign({dragInfo:e.scratchGui.assetDrag,vm:e.scratchGui.vm,blockDrag:e.scratchGui.blockDrag},(e=>{if(e.session&&e.session.session&&e.session.session.user)return{token:e.session.session.user.token,username:e.session.session.user.username};const t=window.location.href.match(/[?&]token=([^&]*)&?/),n=window.location.href.match(/[?&]username=([^&]*)&?/);return{token:t?t[1]:null,username:n?n[1]:null}})(e))),(()=>({})))(ah)),rh=n(211),ih=n(63),sh=[{tag:\"animation\",intlLabel:Ar.animation},{tag:\"art\",intlLabel:Ar.art},{tag:\"music\",intlLabel:Ar.music},{tag:\"games\",intlLabel:Ar.games},{tag:\"stories\",intlLabel:Ar.stories}],lh=n(84),ch=n(50);const dh=Object(m.g)({tipsLibraryTitle:{id:\"gui.tipsLibrary.tutorials\",defaultMessage:\"Choose a Tutorial\"}});class uh extends o.a.PureComponent{constructor(e){super(e),E()(this,[\"handleItemSelect\"])}handleItemSelect(e){if(lh.a.event({category:\"library\",action:\"Select How-to\",label:e.id}),e.requiredProjectId&&e.requiredProjectId!==this.props.projectId){const t=\"/projects/\".concat(e.requiredProjectId,\"/editor?tutorial=\").concat(e.urlId);return window.open(window.location.origin+t,\"_blank\")}this.props.onActivateDeck(e.id)}render(){const e=Object.keys(ih.a).filter((e=>{if(Object(qe.c)())return!0;const t=ih.a[e];return!Object.prototype.hasOwnProperty.call(t,\"requiredProjectId\")&&0!==t.steps.filter((e=>e.title)).length})).map((e=>({rawURL:ih.a[e].img,id:e,name:ih.a[e].name,featured:!0,tags:ih.a[e].tags,urlId:ih.a[e].urlId,requiredProjectId:ih.a[e].requiredProjectId,hidden:ih.a[e].hidden||!1})));return this.props.visible?o.a.createElement(Tn,{filterable:!0,data:e,id:\"tipsLibrary\",tags:sh,title:this.props.intl.formatMessage(dh.tipsLibraryTitle),visible:this.props.visible,onItemSelected:this.handleItemSelect,onRequestClose:this.props.onRequestClose}):null}}uh.propTypes={intl:m.i.isRequired,onActivateDeck:i.a.func.isRequired,onRequestClose:i.a.func,projectId:i.a.oneOfType([i.a.string,i.a.number]),visible:i.a.bool};var ph=Object(m.h)(Object(l.b)((e=>({visible:e.scratchGui.modals.tipsLibrary,projectId:e.scratchGui.projectState.projectId})),(e=>({onActivateDeck:t=>e(Object(ch.a)(t)),onRequestClose:()=>e(Object(w.o)())})))(uh)),mh=n(22),gh=n.n(mh),hh=n(381),bh=n.n(hh),wh=n(382),fh=n.n(wh),Mh=n(243),vh=n.n(Mh),yh=n(244),kh=n.n(yh),jh=n(227),Ih=n.n(jh),Sh=n(383),xh=n.n(Sh);const Eh={},Ch=(e,t)=>Object.prototype.hasOwnProperty.call(Eh,e)?Object.prototype.hasOwnProperty.call(Eh[e],t)?Eh[e][t]:Eh[e].en:e,Nh={};let _h={},Dh=\"\";const Th={},Oh=e=>{Object.prototype.hasOwnProperty.call(Th,e)&&Th[e]().then((t=>{_h=t,Dh=e}))},Ah=(e,t)=>t===Dh&&Object.prototype.hasOwnProperty.call(_h,e)?_h[e]:Nh[e],Ph=[\"activeDeckId\",\"content\",\"dragging\",\"isRtl\",\"locale\",\"onActivateDeckFactory\",\"onCloseCards\",\"onShrinkExpandCards\",\"onDrag\",\"onStartDrag\",\"onEndDrag\",\"onShowAll\",\"onNextStep\",\"onPrevStep\",\"showVideos\",\"step\",\"expanded\"];const zh=e=>{let{onCloseCards:t,onShrinkExpandCards:n,onShowAll:a,totalSteps:r,step:i,expanded:s}=e;return o.a.createElement(\"div\",{className:s?gh.a.headerButtons:ye()(gh.a.headerButtons,gh.a.headerButtonsHidden)},o.a.createElement(\"div\",{className:gh.a.allButton,onClick:a},o.a.createElement(\"img\",{className:gh.a.helpIcon,src:Ih.a}),o.a.createElement(m.b,{defaultMessage:\"Tutorials\",id:\"gui.cards.all-tutorials\"})),r>1?o.a.createElement(\"div\",{className:gh.a.stepsList},Array(r).fill(0).map(((e,t)=>o.a.createElement(\"div\",{className:t===i?gh.a.activeStepPip:gh.a.inactiveStepPip,key:\"pip-step-\".concat(t)})))):null,o.a.createElement(\"div\",{className:gh.a.headerButtonsRight},o.a.createElement(\"div\",{className:gh.a.shrinkExpandButton,onClick:n},o.a.createElement(\"img\",{draggable:!1,src:s?bh.a:fh.a}),s?o.a.createElement(m.b,{defaultMessage:\"Shrink\",id:\"gui.cards.shrink\"}):o.a.createElement(m.b,{defaultMessage:\"Expand\",id:\"gui.cards.expand\"})),o.a.createElement(\"div\",{className:gh.a.removeButton,onClick:t},o.a.createElement(\"img\",{className:gh.a.closeIcon,src:xh.a}),o.a.createElement(m.b,{defaultMessage:\"Close\",id:\"gui.cards.close\"}))))};class Lh extends o.a.Component{componentDidMount(){const e=document.createElement(\"script\");e.src=\"https://fast.wistia.com/embed/medias/\".concat(this.props.video,\".jsonp\"),e.async=!0,e.setAttribute(\"id\",\"wistia-video-content\"),document.body.appendChild(e);const t=document.createElement(\"script\");t.src=\"https://fast.wistia.com/assets/external/E-v1.js\",t.async=!0,t.setAttribute(\"id\",\"wistia-video-api\"),document.body.appendChild(t)}componentDidUpdate(e){if(!window.Wistia||!window.Wistia.api)return;const t=window.Wistia.api(e.video);e.video!==this.props.video&&t.replaceWith(this.props.video),this.props.expanded||t.pause()}componentWillUnmount(){const e=document.getElementById(\"wistia-video-content\");e.parentNode.removeChild(e);const t=document.getElementById(\"wistia-video-api\");t.parentNode.removeChild(t)}render(){return o.a.createElement(\"div\",{className:gh.a.stepVideo},o.a.createElement(\"div\",{className:\"wistia_embed wistia_async_\".concat(this.props.video),id:\"video-div\",style:{height:\"257px\",width:\"466px\"}},\" \"))}}Lh.propTypes={expanded:i.a.bool.isRequired,video:i.a.string.isRequired};const Rh=e=>{let{title:t,image:n}=e;return o.a.createElement(a.Fragment,null,o.a.createElement(\"div\",{className:gh.a.stepTitle},t),o.a.createElement(\"div\",{className:gh.a.stepImageContainer},o.a.createElement(\"img\",{className:gh.a.stepImage,draggable:!1,key:n,src:n})))};Rh.propTypes={image:i.a.string.isRequired,title:i.a.node.isRequired};const Uh=e=>{let{isRtl:t,onNextStep:n,onPrevStep:r,expanded:i}=e;return o.a.createElement(a.Fragment,null,n?o.a.createElement(\"div\",null,o.a.createElement(\"div\",{className:i?t?gh.a.leftCard:gh.a.rightCard:gh.a.hidden}),o.a.createElement(\"div\",{className:i?t?gh.a.leftButton:gh.a.rightButton:gh.a.hidden,onClick:n},o.a.createElement(\"img\",{draggable:!1,src:t?kh.a:vh.a}))):null,r?o.a.createElement(\"div\",null,o.a.createElement(\"div\",{className:i?t?gh.a.rightCard:gh.a.leftCard:gh.a.hidden}),o.a.createElement(\"div\",{className:i?t?gh.a.rightButton:gh.a.leftButton:gh.a.hidden,onClick:r},o.a.createElement(\"img\",{draggable:!1,src:t?vh.a:kh.a}))):null)};Uh.propTypes={expanded:i.a.bool.isRequired,isRtl:i.a.bool,onNextStep:i.a.func,onPrevStep:i.a.func},zh.propTypes={expanded:i.a.bool.isRequired,onCloseCards:i.a.func.isRequired,onShowAll:i.a.func.isRequired,onShrinkExpandCards:i.a.func.isRequired,step:i.a.number,totalSteps:i.a.number};const Bh=e=>{let{deckIds:t,content:n,onActivateDeckFactory:r,onShowAll:i}=e;return o.a.createElement(a.Fragment,null,o.a.createElement(\"div\",{className:gh.a.stepTitle},o.a.createElement(m.b,{defaultMessage:\"More things to try!\",id:\"gui.cards.more-things-to-try\"})),o.a.createElement(\"div\",{className:gh.a.decks},t.slice(0,2).map((e=>o.a.createElement(\"div\",{className:gh.a.deck,key:\"deck-preview-\".concat(e),onClick:r(e)},o.a.createElement(\"img\",{className:gh.a.deckImage,draggable:!1,src:n[e].img}),o.a.createElement(\"div\",{className:gh.a.deckName},n[e].name))))),o.a.createElement(\"div\",{className:gh.a.seeAll},o.a.createElement(\"div\",{className:gh.a.seeAllButton,onClick:i},o.a.createElement(m.b,{defaultMessage:\"See more\",id:\"gui.cards.see-more\"}))))};Bh.propTypes={content:i.a.shape({id:i.a.shape({name:i.a.node.isRequired,img:i.a.string.isRequired,steps:i.a.arrayOf(i.a.shape({title:i.a.node,image:i.a.string,video:i.a.string,deckIds:i.a.arrayOf(i.a.string)}))})}).isRequired,deckIds:i.a.arrayOf(i.a.string).isRequired,onActivateDeckFactory:i.a.func.isRequired,onShowAll:i.a.func.isRequired};const Gh=e=>{const{activeDeckId:t,content:n,dragging:a,isRtl:r,locale:i,onActivateDeckFactory:s,onCloseCards:l,onShrinkExpandCards:c,onDrag:d,onStartDrag:u,onEndDrag:p,onShowAll:m,onNextStep:g,onPrevStep:h,showVideos:b,step:w,expanded:f}=e,M=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a0?h:null})))))};Gh.propTypes={activeDeckId:i.a.string.isRequired,content:i.a.shape({id:i.a.shape({name:i.a.node.isRequired,img:i.a.string.isRequired,steps:i.a.arrayOf(i.a.shape({title:i.a.node,image:i.a.string,video:i.a.string,deckIds:i.a.arrayOf(i.a.string)}))})}),dragging:i.a.bool.isRequired,expanded:i.a.bool.isRequired,isRtl:i.a.bool.isRequired,locale:i.a.string.isRequired,onActivateDeckFactory:i.a.func.isRequired,onCloseCards:i.a.func.isRequired,onDrag:i.a.func,onEndDrag:i.a.func,onNextStep:i.a.func.isRequired,onPrevStep:i.a.func.isRequired,onShowAll:i.a.func,onShrinkExpandCards:i.a.func.isRequired,onStartDrag:i.a.func,showVideos:i.a.bool,step:i.a.number.isRequired,x:i.a.number,y:i.a.number},Gh.defaultProps={showVideos:!0};class Fh extends o.a.Component{componentDidMount(){\"en\"!==this.props.locale&&Oh(this.props.locale)}componentDidUpdate(e){this.props.locale!==e.locale&&Oh(this.props.locale)}render(){return o.a.createElement(Gh,this.props)}}Fh.propTypes={locale:i.a.string.isRequired};var Zh=Object(l.b)((e=>({visible:e.scratchGui.cards.visible,content:e.scratchGui.cards.content,activeDeckId:e.scratchGui.cards.activeDeckId,step:e.scratchGui.cards.step,expanded:e.scratchGui.cards.expanded,x:e.scratchGui.cards.x,y:e.scratchGui.cards.y,isRtl:e.locales.isRtl,locale:e.locales.locale,dragging:e.scratchGui.cards.dragging,showVideos:Object(qe.c)()})),(e=>({onActivateDeckFactory:t=>()=>e(Object(ch.a)(t)),onShowAll:()=>{e(Object(w.G)()),e(Object(ch.c)())},onCloseCards:()=>e(Object(ch.c)()),onShrinkExpandCards:()=>e(Object(ch.i)()),onNextStep:()=>e(Object(ch.g)()),onPrevStep:()=>e(Object(ch.h)()),onDrag:(t,n)=>e(Object(ch.e)(n.x,n.y)),onStartDrag:()=>e(Object(ch.j)()),onEndDrag:()=>e(Object(ch.f)())})))(Fh),Wh=n(106),Hh=n(45),Qh=n(66),Yh=n.n(Qh);const Vh={[Hh.a.SUCCESS]:Pe.a.COLOR_GREEN,[Hh.a.WARN]:Pe.a.COLOR_ORANGE},qh=e=>{let{content:t,closeButton:n,extensionName:a,iconSpinner:r,iconURL:i,level:s,showDownload:l,showSaveNow:c,onCloseAlert:d,onDownload:u,onSaveNow:p,onReconnect:g,showReconnect:h}=e;return o.a.createElement(Oe.a,{className:ye()(Yh.a.alert,Yh.a[s])},(r||i)&&o.a.createElement(\"div\",{className:Yh.a.iconSection},r&&o.a.createElement(hn.a,{className:Yh.a.alertSpinner,level:s}),i&&o.a.createElement(\"img\",{className:Yh.a.alertIcon,src:i,draggable:!1})),o.a.createElement(\"div\",{className:Yh.a.alertMessage},a?o.a.createElement(m.b,{defaultMessage:\"Lost connection to {extensionName}.\",id:\"tw.alerts.lostPeripheralConnection\",values:{extensionName:\"\".concat(a)}}):t),o.a.createElement(\"div\",{className:Yh.a.alertButtons},c&&o.a.createElement(\"button\",{className:Yh.a.alertConnectionButton,onClick:p},o.a.createElement(m.b,{defaultMessage:\"Try Again\",id:\"gui.alerts.tryAgain\"})),l&&o.a.createElement(\"button\",{className:Yh.a.alertConnectionButton,onClick:u},o.a.createElement(m.b,{defaultMessage:\"Download\",id:\"gui.alerts.download\"})),h&&o.a.createElement(\"button\",{className:Yh.a.alertConnectionButton,onClick:g},o.a.createElement(m.b,{defaultMessage:\"Reconnect\",id:\"gui.connection.reconnect\"})),n&&o.a.createElement(Oe.a,{className:Yh.a.alertCloseButtonContainer},o.a.createElement(Pe.a,{className:ye()(Yh.a.alertCloseButton),color:Vh[s],size:Pe.a.SIZE_LARGE,onClick:d}))))};qh.propTypes={closeButton:i.a.bool,content:i.a.oneOfType([i.a.element,i.a.string]),extensionName:i.a.string,iconSpinner:i.a.bool,iconURL:i.a.string,level:i.a.string,onCloseAlert:i.a.func.isRequired,onDownload:i.a.func,onReconnect:i.a.func,onSaveNow:i.a.func,showDownload:i.a.bool,showReconnect:i.a.bool,showSaveNow:i.a.bool},qh.defaultProps={level:Hh.a.WARN};var Jh=qh;class Xh extends o.a.Component{constructor(e){super(e),E()(this,[\"handleOnCloseAlert\",\"handleOnReconnect\"])}handleOnCloseAlert(){this.props.onCloseAlert(this.props.index)}handleOnReconnect(){this.props.onOpenConnectionModal(this.props.extensionId),this.handleOnCloseAlert()}render(){const{closeButton:e,content:t,extensionName:n,index:a,level:r,iconSpinner:i,iconURL:s,message:l,onSaveNow:c,showDownload:d,showReconnect:u,showSaveNow:p}=this.props;return o.a.createElement(Wh.a,null,((a,m)=>o.a.createElement(Jh,{closeButton:e,content:t,extensionName:n,iconSpinner:i,iconURL:s,level:r,message:l,showDownload:d,showReconnect:u,showSaveNow:p,onCloseAlert:this.handleOnCloseAlert,onDownload:m,onReconnect:this.handleOnReconnect,onSaveNow:c})))}}Xh.propTypes={closeButton:i.a.bool,content:i.a.element,extensionId:i.a.string,extensionName:i.a.string,iconSpinner:i.a.bool,iconURL:i.a.string,index:i.a.number,level:i.a.string.isRequired,message:i.a.string,onCloseAlert:i.a.func.isRequired,onOpenConnectionModal:i.a.func,onSaveNow:i.a.func,showDownload:i.a.bool,showReconnect:i.a.bool,showSaveNow:i.a.bool};var Kh=Object(l.b)((()=>({})),(e=>({onOpenConnectionModal:t=>{e(Object(va.c)(t)),e(Object(w.u)())},onSaveNow:()=>{e(Object(h.v)())}})))(Xh),$h=n(384),eb=n.n($h);const tb=e=>{let{alertsList:t,className:n,onCloseAlert:a}=e;return o.a.createElement(Oe.a,{bounds:\"parent\",className:n},o.a.createElement(Oe.a,{className:eb.a.alertsInnerContainer},t.map(((e,t)=>o.a.createElement(Kh,{closeButton:e.closeButton,content:e.content,extensionId:e.extensionId,extensionName:e.extensionName,iconSpinner:e.iconSpinner,iconURL:e.iconURL,index:t,key:t,level:e.level,message:e.message,showDownload:e.showDownload,showReconnect:e.showReconnect,showSaveNow:e.showSaveNow,onCloseAlert:a})))))};tb.propTypes={alertsList:i.a.arrayOf(i.a.object),className:i.a.string,onCloseAlert:i.a.func};var nb=tb;const ab=e=>{let{alertsList:t,className:n,onCloseAlert:a}=e;return o.a.createElement(nb,{alertsList:Object(W.f)(t),className:n,onCloseAlert:a})};ab.propTypes={alertsList:i.a.arrayOf(i.a.object),className:i.a.string,onCloseAlert:i.a.func};var ob=Object(l.b)((e=>({alertsList:e.scratchGui.alerts.alertsList})),(e=>({onCloseAlert:t=>e(Object(W.b)(t))})))(ab),rb=n(204),ib=n.n(rb);const sb=e=>{let{dragging:t,img:n,currentOffset:a}=e;return t?o.a.createElement(\"div\",{className:ib.a.dragLayer},o.a.createElement(\"div\",{className:ib.a.imageWrapper,style:{transform:\"translate(\".concat(a.x,\"px, \").concat(a.y,\"px)\")}},o.a.createElement(\"img\",{className:ib.a.image,src:n,draggable:!1}))):null};sb.propTypes={currentOffset:i.a.shape({x:i.a.number.isRequired,y:i.a.number.isRequired}),dragging:i.a.bool.isRequired,img:i.a.string};var lb=sb;var cb=Object(l.b)((e=>({dragging:e.scratchGui.assetDrag.dragging,currentOffset:e.scratchGui.assetDrag.currentOffset,img:e.scratchGui.assetDrag.img})))(lb),db=n(42),ub=n.n(db),pb=n(434),mb=n.n(pb);const gb=[\"children\",\"resize\",\"style\"];function hb(){return hb=Object.assign?Object.assign.bind():function(e){for(var t=1;tthis.balanceText()),0)}render(){let e=this.props,{children:t,resize:n,style:a}=e,r=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a{this.container=e}},t))}}bb.propTypes={children:i.a.node,resize:i.a.bool,style:i.a.object},bb.defaultProps={resize:!0};var wb=bb;const fb=[\"className\",\"resize\",\"style\"];function Mb(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function vb(e){for(var t=1;t{const{className:t,resize:n,style:a}=e,r=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a-80})}),o.a.createElement(\"div\",{className:ye()(Sb.a.signalBar,{[Sb.a.greenBar]:this.props.rssi>-60})}),o.a.createElement(\"div\",{className:ye()(Sb.a.signalBar,{[Sb.a.greenBar]:this.props.rssi>-40})}),o.a.createElement(\"div\",{className:ye()(Sb.a.signalBar,{[Sb.a.greenBar]:this.props.rssi>-20})})),o.a.createElement(\"button\",{onClick:this.handleConnecting},o.a.createElement(m.b,{defaultMessage:\"Connect\",id:\"gui.connection.connect\"}))))}}xb.propTypes={connectionSmallIconURL:i.a.string,name:i.a.string,onConnecting:i.a.func,peripheralId:i.a.string,rssi:i.a.number};var Eb=xb;const Cb=e=>o.a.createElement(Oe.a,{className:ye()(e.className,Sb.a.dotsRow)},o.a.createElement(\"div\",{className:ye()(Sb.a.dotsHolder,{[Sb.a.dotsHolderError]:e.error,[Sb.a.dotsHolderSuccess]:e.success})},Array(e.total).fill(0).map(((t,n)=>{let a=\"inactive\";return e.counter===n&&(a=\"active\"),e.success&&(a=\"success\"),e.error&&(a=\"error\"),o.a.createElement(Nb,{key:\"dot-\".concat(n),type:a})}))));Cb.propTypes={className:i.a.string,counter:i.a.number,error:i.a.bool,success:i.a.bool,total:i.a.number};const Nb=e=>o.a.createElement(\"div\",{className:ye()(Sb.a.dot,{[Sb.a.inactiveStepDot]:\"inactive\"===e.type,[Sb.a.activeStepDot]:\"active\"===e.type,[Sb.a.successDot]:\"success\"===e.type,[Sb.a.errorDot]:\"error\"===e.type})});Nb.propTypes={type:i.a.string};var _b=Cb,Db=n(190),Tb=n.n(Db),Ob=n(162),Ab=n.n(Ob),Pb=n(385),zb=n.n(Pb),Lb=n(191),Rb=n.n(Lb);const Ub=e=>{const t=!(!e.onUpdatePeripheral||e.scanning);return o.a.createElement(Oe.a,{className:Sb.a.body},o.a.createElement(Oe.a,{className:Sb.a.activityArea},e.scanning?0===e.peripheralList.length?o.a.createElement(\"div\",{className:Sb.a.activityAreaInfo},o.a.createElement(\"div\",{className:Sb.a.centeredRow},o.a.createElement(\"img\",{className:ye()(Sb.a.radarSmall,Sb.a.radarSpin),src:Ab.a,draggable:!1}),o.a.createElement(m.b,{defaultMessage:\"Looking for devices\",id:\"gui.connection.scanning.lookingforperipherals\"}))):o.a.createElement(\"div\",{className:Sb.a.peripheralTilePane},e.peripheralList.map((t=>o.a.createElement(Eb,{connectionSmallIconURL:e.connectionSmallIconURL,key:t.peripheralId,name:t.name,peripheralId:t.peripheralId,rssi:t.rssi,onConnecting:e.onConnecting})))):o.a.createElement(Oe.a,{className:Sb.a.centeredRow},o.a.createElement(\"img\",{className:Sb.a.helpStepImage,src:Rb.a,draggable:!1}),o.a.createElement(m.b,{className:Sb.a.helpStepText,defaultMessage:\"No devices found\",id:\"gui.connection.scanning.noPeripheralsFound\"}))),o.a.createElement(Oe.a,{className:Sb.a.bottomArea},o.a.createElement(Oe.a,{className:ye()(Sb.a.bottomAreaItem,Sb.a.instructions)},(e.scanning||e.peripheralList.length>0)&&o.a.createElement(m.b,{defaultMessage:\"Select your device in the list above.\",id:\"gui.connection.scanning.instructions\"}),t&&o.a.createElement(jb,{defaultMessage:\"If you don't see your device, you may need to update it to work with Scratch.\",description:\"Prompt for updating a peripheral device\",id:\"gui.connection.scanning.updatePeripheralPrompt\"})),o.a.createElement(_b,{className:Sb.a.bottomAreaItem,counter:0,total:3}),o.a.createElement(Oe.a,{className:ye()(Sb.a.bottomAreaItem,Sb.a.buttonRow)},o.a.createElement(\"button\",{className:Sb.a.connectionButton,onClick:e.onRefresh},o.a.createElement(m.b,{defaultMessage:\"Refresh\",id:\"gui.connection.search\"}),o.a.createElement(\"img\",{className:Sb.a.buttonIconRight,src:zb.a,draggable:!1})),t&&o.a.createElement(\"button\",{className:Sb.a.connectionButton,onClick:e.onUpdatePeripheral},o.a.createElement(m.b,{defaultMessage:\"Update my Device\",id:\"gui.connection.scanning.updatePeripheralButton\"}),o.a.createElement(\"img\",{className:Sb.a.buttonIconRight,src:Tb.a,draggable:!1})))))};Ub.propTypes={connectionSmallIconURL:i.a.string,onConnecting:i.a.func,onRefresh:i.a.func,onUpdatePeripheral:i.a.func,peripheralList:i.a.arrayOf(i.a.shape({name:i.a.string,rssi:i.a.number,peripheralId:i.a.string})),scanning:i.a.bool.isRequired},Ub.defaultProps={peripheralList:[],scanning:!0};var Bb=Ub;class Gb extends o.a.Component{constructor(e){super(e),E()(this,[\"handlePeripheralListUpdate\",\"handlePeripheralScanTimeout\",\"handleRefresh\"]),this.state={scanning:!0,peripheralList:[]}}componentDidMount(){this.props.vm.scanForPeripheral(this.props.extensionId),this.props.vm.on(\"PERIPHERAL_LIST_UPDATE\",this.handlePeripheralListUpdate),this.props.vm.on(\"PERIPHERAL_SCAN_TIMEOUT\",this.handlePeripheralScanTimeout)}componentWillUnmount(){this.props.vm.removeListener(\"PERIPHERAL_LIST_UPDATE\",this.handlePeripheralListUpdate),this.props.vm.removeListener(\"PERIPHERAL_SCAN_TIMEOUT\",this.handlePeripheralScanTimeout)}handlePeripheralScanTimeout(){this.setState({scanning:!1,peripheralList:[]})}handlePeripheralListUpdate(e){const t=Object.keys(e).map((t=>e[t]));this.setState({peripheralList:t})}handleRefresh(){this.props.vm.scanForPeripheral(this.props.extensionId),this.setState({scanning:!0,peripheralList:[]})}render(){return o.a.createElement(Bb,{connectionSmallIconURL:this.props.connectionSmallIconURL,peripheralList:this.state.peripheralList,phase:this.state.phase,scanning:this.state.scanning,title:this.props.extensionId,onConnected:this.props.onConnected,onConnecting:this.props.onConnecting,onRefresh:this.handleRefresh,onUpdatePeripheral:this.props.onUpdatePeripheral})}}Gb.propTypes={connectionSmallIconURL:i.a.string,extensionId:i.a.string.isRequired,onConnected:i.a.func.isRequired,onConnecting:i.a.func.isRequired,onUpdatePeripheral:i.a.func,vm:i.a.instanceOf(p.a).isRequired};var Fb=Gb,Zb=n(108),Wb=n.n(Zb),Hb=n(107),Qb=n.n(Hb),Yb=n(135),Vb=n.n(Yb);const qb=ub()({prescan:null,pressbutton:null,notfound:null}),Jb=e=>{const t=!(!e.onUpdatePeripheral||e.phase!==qb.pressbutton&&e.phase!==qb.notfound);return o.a.createElement(Oe.a,{className:Sb.a.body},o.a.createElement(Oe.a,{className:Sb.a.activityArea},o.a.createElement(\"div\",{className:Sb.a.activityAreaInfo},o.a.createElement(\"div\",{className:Sb.a.centeredRow},e.phase===qb.prescan&&o.a.createElement(o.a.Fragment,null,o.a.createElement(\"img\",{className:Sb.a.radarBig,src:Ab.a,draggable:!1}),o.a.createElement(\"img\",{className:Sb.a.bluetoothCenteredIcon,src:Vb.a,draggable:!1})),e.phase===qb.pressbutton&&o.a.createElement(o.a.Fragment,null,o.a.createElement(\"img\",{className:ye()(Sb.a.radarBig,Sb.a.radarSpin),src:Ab.a,draggable:!1}),o.a.createElement(\"img\",{className:Sb.a.connectionTipIcon,src:e.connectionTipIconURL,draggable:!1})),e.phase===qb.notfound&&o.a.createElement(o.a.Fragment,null,o.a.createElement(\"img\",{className:Sb.a.helpStepImage,src:Rb.a,draggable:!1}),o.a.createElement(m.b,{className:Sb.a.helpStepText,defaultMessage:\"No devices found\",id:\"gui.connection.auto-scanning.noPeripheralsFound\"}))))),o.a.createElement(Oe.a,{className:Sb.a.bottomArea},o.a.createElement(Oe.a,{className:ye()(Sb.a.bottomAreaItem,Sb.a.instructions)},e.phase===qb.prescan&&o.a.createElement(m.b,{defaultMessage:\"Have your device nearby, then begin searching.\",id:\"gui.connection.auto-scanning.prescan\"}),e.phase===qb.pressbutton&&o.a.createElement(m.b,{defaultMessage:\"Press the button on your device.\",id:\"gui.connection.auto-scanning.pressbutton\"})),t&&o.a.createElement(Oe.a,{className:ye()(Sb.a.bottomAreaItem,Sb.a.instructions)},o.a.createElement(jb,{defaultMessage:\"If you don't see your device, you may need to update it to work with Scratch.\",description:\"Prompt for updating a peripheral device\",id:\"gui.connection.auto-scanning.updatePeripheralPrompt\"})),o.a.createElement(_b,{className:Sb.a.bottomAreaItem,counter:0,total:3}),o.a.createElement(Oe.a,{className:ye()(Sb.a.bottomAreaItem,Sb.a.buttonRow)},e.phase===qb.prescan&&o.a.createElement(\"button\",{className:Sb.a.connectionButton,onClick:e.onStartScan},o.a.createElement(m.b,{defaultMessage:\"Start Searching\",id:\"gui.connection.auto-scanning.start-search\"})),e.phase===qb.pressbutton&&o.a.createElement(\"div\",{className:Sb.a.segmentedButton},o.a.createElement(\"button\",{disabled:!0,className:Sb.a.connectionButton},o.a.createElement(m.b,{defaultMessage:\"Searching...\",id:\"gui.connection.connecting-searchbutton\"})),o.a.createElement(\"button\",{className:Sb.a.connectionButton,onClick:e.onRefresh},o.a.createElement(\"img\",{className:Sb.a.abortConnectingIcon,src:Wb.a,draggable:!1}))),e.phase===qb.notfound&&o.a.createElement(\"button\",{className:Sb.a.connectionButton,onClick:e.onRefresh},o.a.createElement(\"img\",{className:Sb.a.buttonIconLeft,src:Qb.a,draggable:!1}),o.a.createElement(m.b,{defaultMessage:\"Try again\",id:\"gui.connection.auto-scanning.try-again\"})),t&&o.a.createElement(\"button\",{className:ye()(Sb.a.bottomAreaItem,Sb.a.connectionButton),onClick:e.onUpdatePeripheral},o.a.createElement(m.b,{defaultMessage:\"Update my Device\",id:\"gui.connection.auto-scanning.updatePeripheralButton\"}),o.a.createElement(\"img\",{className:Sb.a.buttonIconRight,src:Tb.a,draggable:!1})))))};Jb.propTypes={connectionTipIconURL:i.a.string,onRefresh:i.a.func,onStartScan:i.a.func,onUpdatePeripheral:i.a.func,phase:i.a.oneOf(Object.keys(qb))},Jb.defaultProps={phase:qb.prescan};class Xb extends o.a.Component{constructor(e){super(e),E()(this,[\"handlePeripheralListUpdate\",\"handlePeripheralScanTimeout\",\"handleStartScan\",\"handleRefresh\"]),this.state={phase:qb.prescan}}componentWillUnmount(){this.unbindPeripheralUpdates()}handlePeripheralScanTimeout(){this.setState({phase:qb.notfound}),this.unbindPeripheralUpdates()}handlePeripheralListUpdate(e){const t=Object.keys(e).map((t=>e[t]));t.length>0&&this.props.onConnecting(t[0].peripheralId)}bindPeripheralUpdates(){this.props.vm.on(\"PERIPHERAL_LIST_UPDATE\",this.handlePeripheralListUpdate),this.props.vm.on(\"PERIPHERAL_SCAN_TIMEOUT\",this.handlePeripheralScanTimeout)}unbindPeripheralUpdates(){this.props.vm.removeListener(\"PERIPHERAL_LIST_UPDATE\",this.handlePeripheralListUpdate),this.props.vm.removeListener(\"PERIPHERAL_SCAN_TIMEOUT\",this.handlePeripheralScanTimeout)}handleRefresh(){this.setState({phase:qb.prescan}),this.unbindPeripheralUpdates()}handleStartScan(){this.bindPeripheralUpdates(),this.props.vm.scanForPeripheral(this.props.extensionId),this.setState({phase:qb.pressbutton})}render(){return o.a.createElement(Jb,{connectionTipIconURL:this.props.connectionTipIconURL,phase:this.state.phase,title:this.props.extensionId,onRefresh:this.handleRefresh,onStartScan:this.handleStartScan,onUpdatePeripheral:this.props.onUpdatePeripheral})}}Xb.propTypes={connectionTipIconURL:i.a.string,extensionId:i.a.string.isRequired,onConnecting:i.a.func.isRequired,onUpdatePeripheral:i.a.func,vm:i.a.instanceOf(p.a).isRequired};var Kb=Xb;const $b=e=>o.a.createElement(Oe.a,{className:Sb.a.body},o.a.createElement(Oe.a,{className:Sb.a.activityArea},o.a.createElement(Oe.a,{className:Sb.a.centeredRow},o.a.createElement(\"div\",{className:Sb.a.peripheralActivity},o.a.createElement(\"img\",{className:Sb.a.peripheralActivityIcon,src:e.connectionIconURL,draggable:!1}),o.a.createElement(\"img\",{className:Sb.a.bluetoothConnectingIcon,src:Vb.a,draggable:!1})))),o.a.createElement(Oe.a,{className:Sb.a.bottomArea},o.a.createElement(Oe.a,{className:ye()(Sb.a.bottomAreaItem,Sb.a.instructions)},e.connectingMessage),o.a.createElement(_b,{className:Sb.a.bottomAreaItem,counter:1,total:3}),o.a.createElement(\"div\",{className:ye()(Sb.a.bottomAreaItem,Sb.a.segmentedButton)},o.a.createElement(\"button\",{disabled:!0,className:Sb.a.connectionButton},o.a.createElement(m.b,{defaultMessage:\"Connecting...\",id:\"gui.connection.connecting-cancelbutton\"})),o.a.createElement(\"button\",{className:Sb.a.connectionButton,onClick:e.onDisconnect},o.a.createElement(\"img\",{className:Sb.a.abortConnectingIcon,src:Wb.a,draggable:!1})))));$b.propTypes={connectingMessage:i.a.node.isRequired,connectionIconURL:i.a.string.isRequired,onDisconnect:i.a.func};var ew=$b;const tw=e=>o.a.createElement(Oe.a,{className:Sb.a.body},o.a.createElement(Oe.a,{className:Sb.a.activityArea},o.a.createElement(Oe.a,{className:Sb.a.centeredRow},o.a.createElement(\"div\",{className:Sb.a.peripheralActivity},o.a.createElement(\"img\",{className:Sb.a.peripheralActivityIcon,src:e.connectionIconURL,draggable:!1}),o.a.createElement(\"img\",{className:Sb.a.bluetoothConnectedIcon,src:Vb.a,draggable:!1})))),o.a.createElement(Oe.a,{className:Sb.a.bottomArea},o.a.createElement(Oe.a,{className:ye()(Sb.a.bottomAreaItem,Sb.a.instructions)},o.a.createElement(m.b,{defaultMessage:\"Connected\",id:\"gui.connection.connected\"})),o.a.createElement(_b,{success:!0,className:Sb.a.bottomAreaItem,total:3}),o.a.createElement(\"div\",{className:ye()(Sb.a.bottomAreaItem,Sb.a.cornerButtons)},o.a.createElement(\"button\",{className:ye()(Sb.a.redButton,Sb.a.connectionButton),onClick:e.onDisconnect},o.a.createElement(m.b,{defaultMessage:\"Disconnect\",id:\"gui.connection.disconnect\"})),o.a.createElement(\"button\",{className:Sb.a.connectionButton,onClick:e.onCancel},o.a.createElement(m.b,{defaultMessage:\"Go to Editor\",id:\"gui.connection.go-to-editor\"})))));tw.propTypes={connectionIconURL:i.a.string.isRequired,onCancel:i.a.func,onDisconnect:i.a.func};var nw=tw,aw=n(192),ow=n.n(aw);const rw=e=>o.a.createElement(Oe.a,{className:Sb.a.body},o.a.createElement(Oe.a,{className:Sb.a.activityArea},o.a.createElement(Oe.a,{className:Sb.a.centeredRow},o.a.createElement(\"div\",{className:Sb.a.peripheralActivity},o.a.createElement(\"img\",{className:Sb.a.peripheralActivityIcon,src:e.connectionIconURL,draggable:!1})))),o.a.createElement(Oe.a,{className:Sb.a.bottomArea},o.a.createElement(\"div\",{className:ye()(Sb.a.bottomAreaItem,Sb.a.instructions)},o.a.createElement(m.b,{defaultMessage:\"Oops, looks like something went wrong.\",id:\"gui.connection.error.errorMessage\"})),o.a.createElement(_b,{error:!0,className:Sb.a.bottomAreaItem,total:3}),o.a.createElement(Oe.a,{className:ye()(Sb.a.bottomAreaItem,Sb.a.buttonRow)},o.a.createElement(\"button\",{className:Sb.a.connectionButton,onClick:e.onScanning},o.a.createElement(\"img\",{className:ye()(Sb.a.buttonIconLeft,Sb.a.buttonIconBack),src:Qb.a,draggable:!1}),o.a.createElement(m.b,{defaultMessage:\"Try again\",id:\"gui.connection.error.tryagainbutton\"})),o.a.createElement(\"button\",{className:Sb.a.connectionButton,onClick:e.onHelp},o.a.createElement(\"img\",{className:Sb.a.buttonIconLeft,src:ow.a,draggable:!1}),o.a.createElement(m.b,{defaultMessage:\"Help\",id:\"gui.connection.error.helpbutton\"})))));rw.propTypes={connectionIconURL:i.a.string.isRequired,onHelp:i.a.func,onScanning:i.a.func};var iw=rw,sw=n(386),lw=n.n(sw),cw=n(387),dw=n.n(cw);const uw=e=>o.a.createElement(Oe.a,{className:Sb.a.body},o.a.createElement(Oe.a,{className:Sb.a.activityArea},o.a.createElement(\"div\",{className:Sb.a.scratchLinkHelp},o.a.createElement(\"div\",{className:Sb.a.scratchLinkHelpStep},o.a.createElement(\"div\",{className:Sb.a.helpStepNumber},\"1\"),o.a.createElement(\"div\",{className:Sb.a.helpStepImage},o.a.createElement(\"img\",{className:Sb.a.scratchLinkIcon,src:dw.a,draggable:!1})),o.a.createElement(\"div\",{className:Sb.a.helpStepText},o.a.createElement(m.b,{defaultMessage:\"Make sure you have Scratch Link installed and running\",id:\"gui.connection.unavailable.installscratchlink\"}))),o.a.createElement(\"div\",{className:Sb.a.scratchLinkHelpStep},o.a.createElement(\"div\",{className:Sb.a.helpStepNumber},\"2\"),o.a.createElement(\"div\",{className:Sb.a.helpStepImage},o.a.createElement(\"img\",{className:Sb.a.scratchLinkIcon,src:lw.a,draggable:!1})),o.a.createElement(\"div\",{className:Sb.a.helpStepText},o.a.createElement(m.b,{defaultMessage:\"Check that Bluetooth is enabled\",id:\"gui.connection.unavailable.enablebluetooth\"}))))),o.a.createElement(Oe.a,{className:Sb.a.bottomArea},o.a.createElement(_b,{error:!0,className:Sb.a.bottomAreaItem,total:3}),o.a.createElement(Oe.a,{className:ye()(Sb.a.bottomAreaItem,Sb.a.buttonRow)},o.a.createElement(\"button\",{className:Sb.a.connectionButton,onClick:e.onScanning},o.a.createElement(\"img\",{className:ye()(Sb.a.buttonIconLeft,Sb.a.buttonIconBack),src:Qb.a,draggable:!1}),o.a.createElement(m.b,{defaultMessage:\"Try again\",id:\"gui.connection.unavailable.tryagainbutton\"})),o.a.createElement(\"button\",{className:Sb.a.connectionButton,onClick:e.onHelp},o.a.createElement(\"img\",{className:Sb.a.buttonIconLeft,src:ow.a,draggable:!1}),o.a.createElement(m.b,{defaultMessage:\"Help\",id:\"gui.connection.unavailable.helpbutton\"})))));uw.propTypes={onHelp:i.a.func,onScanning:i.a.func};var pw=uw,mw=(n(641),n(167)),gw=n.n(mw);const hw=[\"className\",\"max\",\"sizePx\",\"strokeWidthPx\",\"value\"];function bw(){return bw=Object.assign?Object.assign.bind():function(e){for(var t=1;t{let{className:t,max:n=1,sizePx:a,strokeWidthPx:r,value:i}=e,s=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a{this.setState({progressPercentage:Math.floor(200*e)/2})}));this.setState({activity:jw.results,res:e})}catch(e){this.setState({activity:jw.results,err:e})}}renderGetReady(){return o.a.createElement(Oe.a,{className:Sb.a.activityArea},o.a.createElement(Oe.a,{className:Sb.a.scratchLinkHelp},o.a.createElement(Oe.a,{className:Sb.a.scratchLinkHelpStep},o.a.createElement(Oe.a,{className:Sb.a.helpStepNumber},\"1\"),o.a.createElement(\"img\",{className:Sb.a.helpStepImage,src:this.props.connectionSmallIconURL,draggable:!1}),o.a.createElement(m.b,{className:Sb.a.helpStepText,defaultMessage:\"Connect your {extensionName} to this device using a USB cable.\",id:\"gui.connection.updatePeripheral.microBitConnect\",values:{extensionName:this.props.name}})),o.a.createElement(Oe.a,{className:Sb.a.scratchLinkHelpStep},o.a.createElement(Oe.a,{className:Sb.a.helpStepNumber},\"2\"),o.a.createElement(\"img\",{className:Sb.a.helpStepImage,src:vw.a,draggable:!1}),o.a.createElement(m.b,{defaultMessage:'Press \"Do Update\" and allow the update to complete.',id:\"gui.connection.updatePeripheral.pressUpdate\"}))))}renderSendUpdate(){return o.a.createElement(Oe.a,{className:Sb.a.activityArea},o.a.createElement(fw,{sizePx:36,value:this.state.progressPercentage,max:100}),o.a.createElement(m.b,{defaultMessage:\"Updating {progressPercentage}%\",id:\"gui.connection.updatePeripheral.progress\",values:{progressPercentage:Math.floor(this.state.progressPercentage)}}))}renderResults(){let e;return e=null===this.state.err?o.a.createElement(m.b,{defaultMessage:\"Update successful!\",id:\"gui.connection.updatePeripheral.updateSuccessful\"}):\"No valid interfaces found.\"===this.state.err.message?o.a.createElement(jb,{defaultMessage:\"Please visit this link to update your micro:bit firmware: {microBitFirmwareLink}\",description:\"Message to indicate that the special micro:bit interface firmware needs to be updated\",id:\"gui.connection.updatePeripheral.updateMicroBitFirmware\",values:{microBitFirmwareLink:o.a.createElement(\"a\",{rel:\"noopener noreferrer\",target:\"_blank\",href:Iw},Iw)}}):o.a.createElement(Oe.a,{className:Sb.a.scratchLinkError},o.a.createElement(m.b,{className:Sb.a.centeredRow,defaultMessage:\"Update failed.\",id:\"gui.connection.updatePeripheral.updateFailed\"}),o.a.createElement(\"textarea\",{className:Sb.a.scratchLinkErrorDetails,readOnly:!0},this.state.err.message)),o.a.createElement(Oe.a,{className:Sb.a.activityArea},e)}render(){const e=this.state.activity===jw.getReady,t=this.state.activity===jw.sendUpdate,n=this.state.activity===jw.results,a=n&&!!this.state.err;return o.a.createElement(Oe.a,{className:Sb.a.body},e&&this.renderGetReady(),t&&this.renderSendUpdate(),n&&this.renderResults(),o.a.createElement(Oe.a,{className:Sb.a.bottomArea},!n&&o.a.createElement(jb,{className:Sb.a.bottomAreaItem,defaultMessage:\"Do not leave or reload Scratch or disconnect your {extensionName} until the update is complete.\",description:\"Notice to not disrupt the peripheral update process\",id:\"gui.connection.updatePeripheral.doNotDisconnect\",values:{extensionName:this.props.name}}),!t&&o.a.createElement(Oe.a,{className:ye()(Sb.a.bottomAreaItem,Sb.a.buttonRow)},o.a.createElement(\"button\",{className:Sb.a.connectionButton,onClick:this.props.onScanning},o.a.createElement(\"img\",{className:ye()(Sb.a.buttonIconLeft,Sb.a.buttonIconBack),src:Qb.a,draggable:!1}),o.a.createElement(m.b,{defaultMessage:\"Go Back\",id:\"gui.connection.updatePeripheral.goBackButton\"})),(e||a)&&o.a.createElement(\"button\",{className:Sb.a.connectionButton,onClick:this.handleSendUpdate},e&&o.a.createElement(m.b,{defaultMessage:\"Do Update\",id:\"gui.connection.updatePeripheral.updateNowButton\"}),a&&o.a.createElement(m.b,{defaultMessage:\"Try Again\",id:\"gui.connection.updatePeripheral.updateAgainButton\"}),o.a.createElement(\"img\",{className:Sb.a.buttonIconRight,src:kw.a,draggable:!1})))))}}Sw.propTypes={connectionSmallIconURL:i.a.string,name:i.a.string.isRequired,onScanning:i.a.func.isRequired,onSendPeripheralUpdate:i.a.func.isRequired};var xw=Sw;const Ew=ub()({scanning:null,connecting:null,connected:null,error:null,unavailable:null,updatePeripheral:null}),Cw=e=>o.a.createElement(He,{className:Sb.a.modalContent,contentLabel:e.name,headerClassName:Sb.a.header,headerImage:e.connectionSmallIconURL,id:\"connectionModal\",onHelp:e.onHelp,onRequestClose:e.onCancel},o.a.createElement(Oe.a,{className:Sb.a.body},e.phase===Ew.scanning&&!e.useAutoScan&&o.a.createElement(Fb,e),e.phase===Ew.scanning&&e.useAutoScan&&o.a.createElement(Kb,e),e.phase===Ew.connecting&&o.a.createElement(ew,e),e.phase===Ew.connected&&o.a.createElement(nw,e),e.phase===Ew.error&&o.a.createElement(iw,e),e.phase===Ew.unavailable&&o.a.createElement(pw,e),e.phase===Ew.updatePeripheral&&o.a.createElement(xw,e)));Cw.propTypes={connectingMessage:i.a.node.isRequired,connectionSmallIconURL:i.a.string,connectionTipIconURL:i.a.string,name:i.a.node,onCancel:i.a.func.isRequired,onHelp:i.a.func.isRequired,phase:i.a.oneOf(Object.keys(Ew)).isRequired,title:i.a.string.isRequired,useAutoScan:i.a.bool.isRequired},Cw.defaultProps={connectingMessage:\"Connecting\"};var Nw=n(1378),_w=n(223),Dw=n(390),Tw=n.n(Dw);const Ow=ub()({V1:null,V2:null}),Aw=e=>{switch(e.boardId){case 39168:case 39169:return Ow.V1;case 39171:case 39172:case 39173:case 39174:return Ow.V2}throw new Error(\"Could not identify hex version\")},Pw=async(e,t)=>{N.default.info(\"Connecting to micro:bit\");const n=new _w.b(e),a=new _w.a(n);t&&a.on(_w.a.EVENT_PROGRESS,t),N.default.info(\"Checking micro:bit version\");const o=(e=>{var t,n;switch(null!==(t=null==e||null===(n=e.serialNumber)||void 0===n?void 0:n.substring(0,4))&&void 0!==t?t:\"\"){case\"9900\":case\"9901\":return Ow.V1;case\"9903\":case\"9904\":case\"9905\":case\"9906\":return Ow.V2}throw new Error(\"Could not identify micro:bit board version\")})(e);N.default.info(\"Collecting hex file\");const r=await(async()=>{const e=await fetch(Tw.a),t=await e.text();if(!Object(Nw.a)(t))throw new Error(\"Hex file must be in universal format\");const n=new Map;for(const e of Object(Nw.b)(t)){const a=Aw(e),o=(new TextEncoder).encode(t);n.set(a,o)}return n})(),i=r.get(o);if(!i)throw new Error(\"Could not find hex file for micro:bit \".concat(o));N.default.info(\"Connecting to micro:bit \".concat(o)),await a.connect(),N.default.info(\"Sending hex file...\");try{await a.flash(i)}finally{N.default.info(\"Disconnecting\"),a.connected?await a.disconnect():N.default.info(\"Already disconnected\")}};class zw extends o.a.Component{constructor(e){super(e),E()(this,[\"handleScanning\",\"handleCancel\",\"handleConnected\",\"handleConnecting\",\"handleDisconnect\",\"handleError\",\"handleHelp\",\"handleSendUpdate\",\"handleUpdatePeripheral\"]),this.state={extension:lt.a.find((t=>t.extensionId===e.extensionId)),phase:e.vm.getPeripheralIsConnected(e.extensionId)?Ew.connected:Ew.scanning}}componentDidMount(){this.props.vm.on(\"PERIPHERAL_CONNECTED\",this.handleConnected),this.props.vm.on(\"PERIPHERAL_REQUEST_ERROR\",this.handleError)}componentWillUnmount(){this.props.vm.removeListener(\"PERIPHERAL_CONNECTED\",this.handleConnected),this.props.vm.removeListener(\"PERIPHERAL_REQUEST_ERROR\",this.handleError)}handleScanning(){this.setState({phase:Ew.scanning})}handleConnecting(e){this.props.vm.connectPeripheral(this.props.extensionId,e),this.setState({phase:Ew.connecting}),lh.a.event({category:\"extensions\",action:\"connecting\",label:this.props.extensionId})}handleDisconnect(){try{this.props.vm.disconnectPeripheral(this.props.extensionId)}finally{this.props.onCancel()}}handleCancel(){try{this.props.vm.getPeripheralIsConnected(this.props.extensionId)||this.props.vm.disconnectPeripheral(this.props.extensionId)}finally{this.props.onCancel()}}handleError(){this.state.phase===Ew.scanning||this.state.phase===Ew.unavailable?this.setState({phase:Ew.unavailable}):(this.setState({phase:Ew.error}),lh.a.event({category:\"extensions\",action:\"connecting error\",label:this.props.extensionId}))}handleConnected(){this.setState({phase:Ew.connected}),lh.a.event({category:\"extensions\",action:\"connected\",label:this.props.extensionId})}handleHelp(){window.open(this.state.extension.helpLink,\"_blank\"),lh.a.event({category:\"extensions\",action:\"help\",label:this.props.extensionId})}handleUpdatePeripheral(){this.setState({phase:Ew.updatePeripheral}),lh.a.event({category:\"extensions\",action:\"enter peripheral update flow\",label:this.props.extensionId})}handleSendUpdate(e){return lh.a.event({category:\"extensions\",action:\"send update to peripheral\",label:this.props.extensionId}),(async e=>{N.default.info(\"Selecting micro:bit\");const t=await navigator.usb.requestDevice({filters:[{vendorId:3368,productId:516}]});if(t)return Pw(t,e);N.default.info(\"No device selected\")})(e)}render(){const e=\"microbit\"===this.props.extensionId&&!(!navigator.usb||!navigator.usb.requestDevice);return o.a.createElement(Cw,{connectingMessage:this.state.extension&&this.state.extension.connectingMessage,connectionIconURL:this.state.extension&&this.state.extension.connectionIconURL,connectionSmallIconURL:this.state.extension&&this.state.extension.connectionSmallIconURL,connectionTipIconURL:this.state.extension&&this.state.extension.connectionTipIconURL,extensionId:this.props.extensionId,name:this.state.extension&&this.state.extension.name,phase:this.state.phase,title:this.props.extensionId,useAutoScan:this.state.extension&&this.state.extension.useAutoScan,vm:this.props.vm,onCancel:this.handleCancel,onConnected:this.handleConnected,onConnecting:this.handleConnecting,onDisconnect:this.handleDisconnect,onHelp:this.handleHelp,onScanning:this.handleScanning,onSendPeripheralUpdate:e?this.handleSendUpdate:null,onUpdatePeripheral:e?this.handleUpdatePeripheral:null})}}zw.propTypes={extensionId:i.a.string.isRequired,onCancel:i.a.func.isRequired,vm:i.a.instanceOf(p.a).isRequired};var Lw=Object(l.b)((e=>({extensionId:e.scratchGui.connectionModal.extensionId})),(e=>({onCancel:()=>{e(Object(w.b)())}})))(zw),Rw=n(77),Uw=n.n(Rw);function Bw(){return Bw=Object.assign?Object.assign.bind():function(e){for(var t=1;tthis.handleSettingWasUpdatedTimeout(e)),3e3);this.setState({settingWasUpdatedTimer:e})}handleSettingWasUpdatedTimeout(e){e===this.state.settingWasUpdatedTimer&&this.setState({settingWasUpdatedTimer:null})}render(){const e=\"boolean\"!=typeof this.props.isTelemetryEnabled,t=!1===this.props.isTelemetryEnabled,n=!0===this.props.isTelemetryEnabled,a=this.state.settingWasUpdatedTimer&&o.a.createElement(m.b,Gw.settingWasUpdated);return o.a.createElement(d.a,{isOpen:!0,className:Uw.a.modalContent,contentLabel:this.props.intl.formatMessage(Gw.label),overlayClassName:Uw.a.modalOverlay,onRequestClose:this.handleCancel},o.a.createElement(\"div\",{dir:this.props.isRtl?\"rtl\":\"ltr\"},o.a.createElement(Oe.a,{className:Uw.a.illustration}),o.a.createElement(Oe.a,{className:Uw.a.body},o.a.createElement(\"p\",null,o.a.createElement(m.b,Gw.bodyText1)),o.a.createElement(\"p\",null,o.a.createElement(m.b,Bw({},Gw.bodyText2,{values:{privacyPolicyLink:o.a.createElement(\"a\",{className:Uw.a.privacyPolicyLink,href:\"https://scratch.mit.edu/privacy_policy/\",onClick:this.props.onShowPrivacyPolicy,target:\"_blank\",rel:\"noopener noreferrer\"},o.a.createElement(m.b,Gw.privacyPolicyLink))}}))),o.a.createElement(Oe.a,{className:Uw.a.radioButtons},o.a.createElement(\"label\",{className:n?Uw.a.labelSelected:null},o.a.createElement(\"input\",{name:\"optInOut\",type:\"radio\",value:\"true\",title:this.props.intl.formatMessage(Gw.optInTooltip),checked:!0===this.props.isTelemetryEnabled,onChange:this.handleOptInOutChanged}),o.a.createElement(m.b,Gw.optInText)),o.a.createElement(\"label\",{className:t?Uw.a.labelSelected:null},o.a.createElement(\"input\",{name:\"optInOut\",type:\"radio\",value:\"false\",title:this.props.intl.formatMessage(Gw.optOutTooltip),checked:!1===this.props.isTelemetryEnabled,onChange:this.handleOptInOutChanged}),o.a.createElement(m.b,Gw.optOutText))),o.a.createElement(Oe.a,{className:Uw.a.buttonRow},o.a.createElement(\"span\",{className:Uw.a.settingWasUpdated,key:this.state.settingWasUpdatedTimer},a),o.a.createElement(\"button\",{className:Uw.a.optIn,onClick:this.props.onRequestClose,disabled:e},o.a.createElement(m.b,Gw.closeButton))))))}}Fw.propTypes={intl:m.i.isRequired,isRtl:i.a.bool,isTelemetryEnabled:i.a.bool,onCancel:i.a.func,onOptIn:i.a.func.isRequired,onOptOut:i.a.func.isRequired,onRequestClose:i.a.func,onShowPrivacyPolicy:i.a.func};var Zw=Object(m.h)(Fw),Ww=n(59),Hw=n.n(Ww);const Qw=Object(m.g)({title:{id:\"tw.usernameModal.title\",defaultMessage:\"Change Username\"}}),Yw=e=>o.a.createElement(He,{className:Hw.a.modalContent,onRequestClose:e.onCancel,contentLabel:e.intl.formatMessage(Qw.title),id:\"usernameModal\"},o.a.createElement(Oe.a,{className:Hw.a.body},e.mustChangeUsername&&o.a.createElement(o.a.Fragment,null,o.a.createElement(\"p\",{className:ye()(Hw.a.helpText,Hw.a.mustChange)},o.a.createElement(m.b,{defaultMessage:\"Sorry, the cloud variable server thinks your username may be unsafe. Please change it to something else or {resetIt}.\",id:\"tw.usernameModal.mustChange\",values:{resetIt:o.a.createElement(\"a\",{className:Hw.a.resetLink,onClick:e.onReset},o.a.createElement(m.b,{defaultMessage:\"reset it (recommended)\",id:\"tw.usernameModal.mustChange.resetIt\"}))}}))),Object(qe.a)()?o.a.createElement(\"p\",{className:Hw.a.helpText},o.a.createElement(m.b,{defaultMessage:\"New username:\",id:\"tw.usernameModal.new\"})):null,o.a.createElement(Oe.a,null,o.a.createElement(\"input\",{autoFocus:!0,className:Hw.a.textInput,value:e.value,onChange:e.onChange,onFocus:e.onFocus,onKeyPress:e.onKeyPress,pattern:\"[a-zA-Z0-9_\\\\-]*\",maxLength:\"20\",spellCheck:\"false\"})),Object(qe.a)()?null:o.a.createElement(o.a.Fragment,null,o.a.createElement(\"p\",{className:Hw.a.helpText},o.a.createElement(m.b,{defaultMessage:\"This value will be stored in your browser's storage. It may be logged when you interact with projects that contain cloud variables.\",id:\"tw.usernameModal.help\"})),o.a.createElement(\"p\",{className:Hw.a.helpText},o.a.createElement(m.b,{defaultMessage:\"Values that do not correspond to a valid Scratch account will typically be rejected by the cloud variable server. We recommend leaving it as-is or changing it to your Scratch username.\",id:\"tw.usernameModal.help2\"}))),o.a.createElement(Oe.a,{className:Hw.a.buttonRow},o.a.createElement(\"button\",{className:Hw.a.cancelButton,onClick:e.onReset},o.a.createElement(m.b,{defaultMessage:\"Reset\",id:\"tw.usernameModal.reset\"})),o.a.createElement(\"button\",{className:Hw.a.cancelButton,onClick:e.onCancel},o.a.createElement(m.b,{defaultMessage:\"Cancel\",id:\"gui.prompt.cancel\"})),o.a.createElement(\"button\",{className:Hw.a.okButton,onClick:e.onOk,disabled:!e.valueValid},o.a.createElement(m.b,{defaultMessage:\"OK\",id:\"gui.prompt.ok\"})))));Yw.propTypes={intl:m.i,mustChangeUsername:i.a.bool.isRequired,value:i.a.string.isRequired,valueValid:i.a.bool.isRequired,onCancel:i.a.func.isRequired,onChange:i.a.func.isRequired,onFocus:i.a.func.isRequired,onKeyPress:i.a.func.isRequired,onOk:i.a.func.isRequired,onReset:i.a.func.isRequired};var Vw=Object(m.h)(Yw),qw=n(182);class Jw extends o.a.Component{constructor(e){super(e),E()(this,[\"handleKeyPress\",\"handleFocus\",\"handleOk\",\"handleCancel\",\"handleChange\",\"handleReset\"]),this.state={value:this.props.username,valueValid:!this.props.usernameInvalid}}handleKeyPress(e){\"Enter\"===e.key&&this.state.valueValid&&this.handleOk()}handleFocus(e){e.target.select()}handleOk(){this.props.onSetUsername(this.state.value),this.props.onCloseUsernameModal()}handleCancel(){this.props.onCloseUsernameModal()}handleChange(e){this.setState({value:e.target.value,valueValid:e.target.checkValidity()})}handleReset(){const e=Object(qe.a)()?\"player\":Object(qw.a)();this.props.onCloseUsernameModal(),this.props.onSetUsername(e)}render(){return o.a.createElement(Vw,{mustChangeUsername:this.props.usernameInvalid,value:this.state.value,valueValid:this.state.valueValid,onKeyPress:this.handleKeyPress,onFocus:this.handleFocus,onOk:this.handleOk,onCancel:this.handleCancel,onChange:this.handleChange,onReset:this.handleReset})}}Jw.propTypes={onCloseUsernameModal:i.a.func,onSetUsername:i.a.func,username:i.a.string,usernameInvalid:i.a.bool};var Xw=Object(l.b)((e=>({username:e.scratchGui.tw.username,usernameInvalid:e.scratchGui.tw.usernameInvalid})),(e=>({onCloseUsernameModal:()=>e(Object(w.q)()),onSetUsername:t=>{e(Object($.s)(t)),e(Object($.t)(!1))}})))(Jw),Kw=n(142);const $w=e=>{let{slug:t,children:n}=e;return o.a.createElement(\"a\",{href:\"https://docs.turbowarp.org/\".concat(t),target:\"_blank\",rel:\"noopener noreferrer\"},n)};$w.propTypes={slug:i.a.string,children:i.a.node};var ef=$w,tf=n(39),nf=n.n(tf),af=n(391),of=n.n(af);const rf=[\"value\",\"onChange\",\"label\"];function sf(){return sf=Object.assign?Object.assign.bind():function(e){for(var t=1;to.a.createElement(o.a.Fragment,null,\" \",o.a.createElement(ef,e,o.a.createElement(m.b,{defaultMessage:\"Learn more.\",id:\"gui.alerts.cloudInfoLearnMore\"})));class uf extends o.a.Component{constructor(e){super(e),E()(this,[\"handleClickHelp\"]),this.state={helpVisible:!1}}componentDidUpdate(e){this.props.active&&!e.active&&this.setState({helpVisible:!0})}handleClickHelp(){this.setState((e=>({helpVisible:!e.helpVisible})))}render(){return o.a.createElement(\"div\",{className:ye()(nf.a.setting,{[nf.a.active]:this.props.active})},o.a.createElement(\"div\",{className:nf.a.label},this.props.primary,o.a.createElement(\"button\",{className:nf.a.helpIcon,onClick:this.handleClickHelp,title:this.props.intl.formatMessage(cf.help)},o.a.createElement(\"img\",{src:of.a,draggable:!1}))),this.state.helpVisible&&o.a.createElement(\"div\",{className:nf.a.detail},this.props.help,this.props.slug&&o.a.createElement(df,{slug:this.props.slug})),this.props.secondary)}}uf.propTypes={intl:m.i,active:i.a.bool,help:i.a.node,primary:i.a.node,secondary:i.a.node,slug:i.a.string};const pf=Object(m.h)(uf),mf=e=>{let{value:t,onChange:n,label:a}=e,r=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;ao.a.createElement(mf,sf({},e,{label:o.a.createElement(m.b,{defaultMessage:\"High Quality Pen\",id:\"tw.settingsModal.highQualityPen\"}),help:o.a.createElement(m.b,{defaultMessage:\"Allows pen projects to render at higher resolutions and disables some coordinate rounding in the editor. Not all projects benefit from this setting and it may impact performance.\",id:\"tw.settingsModal.highQualityPenHelp\"}),slug:\"high-quality-pen\"})),hf=e=>o.a.createElement(mf,{value:30!==e.framerate,onChange:e.onChange,label:o.a.createElement(m.b,{defaultMessage:\"60 FPS (Custom FPS)\",id:\"tw.settingsModal.fps\"}),help:o.a.createElement(m.b,{defaultMessage:\"Runs scripts 60 times per second instead of 30. Most projects will not work properly with this enabled. You should try Interpolation with 60 FPS mode disabled if that is the case. {customFramerate}.\",id:\"tw.settingsModal.fpsHelp\",values:{customFramerate:o.a.createElement(\"a\",{onClick:e.onCustomizeFramerate,tabIndex:\"0\"},o.a.createElement(m.b,{defaultMessage:\"Click to use a framerate other than 30 or 60\",id:\"tw.settingsModal.fpsHelp.customFramerate\"}))}}),slug:\"custom-fps\"});hf.propTypes={framerate:i.a.number,onChange:i.a.func,onCustomizeFramerate:i.a.func};const bf=e=>o.a.createElement(mf,sf({},e,{label:o.a.createElement(m.b,{defaultMessage:\"Interpolation\",id:\"tw.settingsModal.interpolation\"}),help:o.a.createElement(m.b,{defaultMessage:\"Makes projects appear smoother by interpolating sprite motion. Interpolation should not be used on 3D projects, raytracers, pen projects, and laggy projects as interpolation will make them run slower without making them appear smoother.\",id:\"tw.settingsModal.interpolationHelp\"}),slug:\"interpolation\"})),wf=e=>o.a.createElement(mf,sf({},e,{label:o.a.createElement(m.b,{defaultMessage:\"Infinite Clones\",id:\"tw.settingsModal.infiniteClones\"}),help:o.a.createElement(m.b,{defaultMessage:\"Disables Scratch's 300 clone limit.\",id:\"tw.settingsModal.infiniteClonesHelp\"}),slug:\"infinite-clones\"})),ff=e=>o.a.createElement(mf,sf({},e,{label:o.a.createElement(m.b,{defaultMessage:\"Remove Fencing\",id:\"tw.settingsModal.removeFencing\"}),help:o.a.createElement(m.b,{defaultMessage:\"Allows sprites to move offscreen, become as large or as small as they want, and makes touching blocks work offscreen.\",id:\"tw.settingsModal.removeFencingHelp\"}),slug:\"remove-fencing\"})),Mf=e=>o.a.createElement(mf,sf({},e,{label:o.a.createElement(m.b,{defaultMessage:\"Remove Miscellaneous Limits\",id:\"tw.settingsModal.removeMiscLimits\"}),help:o.a.createElement(m.b,{defaultMessage:\"Removes sound effect limits and pen size limits.\",id:\"tw.settingsModal.removeMiscLimitsHelp\"}),slug:\"remove-misc-limits\"})),vf=e=>o.a.createElement(mf,sf({},e,{label:o.a.createElement(m.b,{defaultMessage:\"Warp Timer\",id:\"tw.settingsModal.warpTimer\"}),help:o.a.createElement(m.b,{defaultMessage:\"Makes scripts check if they are stuck in a long or infinite loop and run at a low framerate instead of getting stuck until the loop finishes. This fixes most crashes but has a significant performance impact, so it's only enabled by default in the editor.\",id:\"tw.settingsModal.warpTimerHelp\"}),slug:\"warp-timer\"})),yf=e=>o.a.createElement(mf,sf({},e,{label:o.a.createElement(m.b,{defaultMessage:\"Disable Compiler\",id:\"tw.settingsModal.disableCompiler\"}),help:o.a.createElement(m.b,{defaultMessage:\"Disables the {APP_NAME} compiler. You may want to enable this while editing projects so that scripts update immediately. Otherwise, you should never enable this.\",id:\"tw.settingsModal.disableCompilerHelp\",values:{APP_NAME:ct.APP_NAME}}),slug:\"disable-compiler\"})),kf=e=>{let{customStageSizeEnabled:t,stageWidth:n,onStageWidthChange:a,stageHeight:r,onStageHeightChange:i}=e;return o.a.createElement(pf,{active:t,primary:o.a.createElement(\"div\",{className:ye()(nf.a.label,nf.a.customStageSize)},o.a.createElement(m.b,{defaultMessage:\"Custom Stage Size:\",id:\"tw.settingsModal.customStageSize\"}),o.a.createElement(lf,{value:n,onSubmit:a,className:nf.a.customStageSizeInput,type:\"number\",min:\"0\",max:\"1024\",step:\"1\"}),o.a.createElement(\"span\",null,\"×\"),o.a.createElement(lf,{value:r,onSubmit:i,className:nf.a.customStageSizeInput,type:\"number\",min:\"0\",max:\"1024\",step:\"1\"})),secondary:(n>=1e3||r>=1e3)&&o.a.createElement(\"div\",{className:nf.a.warning},o.a.createElement(m.b,{defaultMessage:\"Using a custom stage size this large is not recommended! Instead, use a lower size with the same aspect ratio and let fullscreen mode upscale it to match the user's display.\",id:\"tw.settingsModal.largeStageWarning\"}),o.a.createElement(df,{slug:\"custom-stage-size\"})),help:o.a.createElement(m.b,{defaultMessage:\"Changes the size of the Scratch stage from 480x360 to something else. Try 640x360 to make the stage widescreen. Very few projects will handle this properly.\",id:\"tw.settingsModal.customStageSizeHelp\"}),slug:\"custom-stage-size\"})};kf.propTypes={customStageSizeEnabled:i.a.bool,stageWidth:i.a.number,onStageWidthChange:i.a.func,stageHeight:i.a.number,onStageHeightChange:i.a.func};const jf=e=>{let{onStoreProjectOptions:t}=e;return o.a.createElement(\"div\",{className:nf.a.setting},o.a.createElement(\"div\",null,o.a.createElement(\"button\",{onClick:t,className:nf.a.button},o.a.createElement(m.b,{defaultMessage:\"Store settings in project\",id:\"tw.settingsModal.storeProjectOptions\"})),o.a.createElement(\"p\",null,o.a.createElement(m.b,{defaultMessage:\"Stores the selected settings in the project so they will be automatically applied when TurboWarp loads this project. Warp timer and disable compiler will not be saved.\",id:\"tw.settingsModal.storeProjectOptionsHelp\"}))))};jf.propTypes={onStoreProjectOptions:i.a.func};const If=e=>o.a.createElement(\"div\",{className:nf.a.header},e.children,o.a.createElement(\"div\",{className:nf.a.divider}));If.propTypes={children:i.a.node};const Sf=e=>o.a.createElement(He,{className:nf.a.modalContent,onRequestClose:e.onClose,contentLabel:e.intl.formatMessage(cf.title),id:\"settingsModal\"},o.a.createElement(Oe.a,{className:nf.a.body},o.a.createElement(If,null,o.a.createElement(m.b,{defaultMessage:\"Featured\",id:\"tw.settingsModal.featured\"})),o.a.createElement(hf,{framerate:e.framerate,onChange:e.onFramerateChange,onCustomizeFramerate:e.onCustomizeFramerate}),o.a.createElement(bf,{value:e.interpolation,onChange:e.onInterpolationChange}),o.a.createElement(gf,{value:e.highQualityPen,onChange:e.onHighQualityPenChange}),o.a.createElement(vf,{value:e.warpTimer,onChange:e.onWarpTimerChange}),o.a.createElement(If,null,o.a.createElement(m.b,{defaultMessage:\"Remove Limits\",id:\"tw.settingsModal.removeLimits\"})),o.a.createElement(wf,{value:e.infiniteClones,onChange:e.onInfiniteClonesChange}),o.a.createElement(ff,{value:e.removeFencing,onChange:e.onRemoveFencingChange}),o.a.createElement(Mf,{value:e.removeLimits,onChange:e.onRemoveLimitsChange}),o.a.createElement(If,null,o.a.createElement(m.b,{defaultMessage:\"Danger Zone\",id:\"tw.settingsModal.dangerZone\"})),!e.isEmbedded&&o.a.createElement(kf,e),o.a.createElement(yf,{value:e.disableCompiler,onChange:e.onDisableCompilerChange}),!e.isEmbedded&&o.a.createElement(jf,e)));Sf.propTypes={intl:m.i,onClose:i.a.func,isEmbedded:i.a.bool,framerate:i.a.number,onFramerateChange:i.a.func,onCustomizeFramerate:i.a.func,highQualityPen:i.a.bool,onHighQualityPenChange:i.a.func,interpolation:i.a.bool,onInterpolationChange:i.a.func,infiniteClones:i.a.bool,onInfiniteClonesChange:i.a.func,removeFencing:i.a.bool,onRemoveFencingChange:i.a.func,removeLimits:i.a.bool,onRemoveLimitsChange:i.a.func,warpTimer:i.a.bool,onWarpTimerChange:i.a.func,disableCompiler:i.a.bool,onDisableCompilerChange:i.a.func};var xf=Object(m.h)(Sf);const Ef=[\"onClose\",\"vm\"];function Cf(){return Cf=Object.assign?Object.assign.bind():function(e){for(var t=1;t({vm:e.scratchGui.vm,isEmbedded:e.scratchGui.mode.isEmbedded,framerate:e.scratchGui.tw.framerate,highQualityPen:e.scratchGui.tw.highQualityPen,interpolation:e.scratchGui.tw.interpolation,infiniteClones:e.scratchGui.tw.runtimeOptions.maxClones===1/0,removeFencing:!e.scratchGui.tw.runtimeOptions.fencing,removeLimits:!e.scratchGui.tw.runtimeOptions.miscLimits,warpTimer:e.scratchGui.tw.compilerOptions.warpTimer,customStageSize:e.scratchGui.customStageSize,disableCompiler:!e.scratchGui.tw.compilerOptions.enabled})),(e=>({onClose:()=>e(Object(w.j)())})))(_f));var Tf={LoadExtension:\"LoadExtension\",Fetch:\"Fetch\",OpenWindow:\"OpenWindow\",Redirect:\"Redirect\",RecordAudio:\"RecordAudio\",RecordVideo:\"RecordVideo\",ReadClipboard:\"ReadClipboard\",Notify:\"Notify\",Geolocate:\"Geolocate\",Embed:\"Embed\",Download:\"Download\"},Of=n(168),Af=n.n(Of),Pf=n(392),zf=n.n(Pf);const Lf=e=>{let{url:t}=e;return o.a.createElement(\"p\",{className:zf.a.url},(e=>e.length>100?\"\".concat(e.substring(0,100),\"...\"):e)(t))};Lf.propTypes={url:i.a.string.isRequired};var Rf=Lf,Uf=n(393),Bf=n.n(Uf);const Gf=e=>{const t=e.indexOf(\",\");if(-1===t)return e;const n=e.substring(0,t),a=e.substring(t+1);if(n.endsWith(\";base64\"))try{return atob(a)}catch(t){return e}try{return decodeURIComponent(a)}catch(t){return e}},Ff=e=>o.a.createElement(\"textarea\",{className:Bf.a.code,value:Gf(e.url),readOnly:!0,spellCheck:!1,autoComplete:\"off\"});Ff.propTypes={url:i.a.string.isRequired};var Zf=Ff;const Wf=e=>o.a.createElement(\"div\",null,e.url.startsWith(\"data:\")?o.a.createElement(o.a.Fragment,null,o.a.createElement(m.b,{defaultMessage:\"The project wants to load a custom extension with the code:\",id:\"tw.loadExtension.embedded\"}),o.a.createElement(Zf,{url:e.url})):o.a.createElement(o.a.Fragment,null,o.a.createElement(m.b,{defaultMessage:\"The project wants to load a custom extension from the URL:\",id:\"tw.loadExtension.url\"}),o.a.createElement(Rf,{url:e.url})),e.onChangeUnsandboxed&&o.a.createElement(o.a.Fragment,null,o.a.createElement(\"label\",{className:Af.a.unsandboxedContainer},o.a.createElement(Kw.a,{className:Af.a.unsandboxedCheckbox,checked:e.unsandboxed,onChange:e.onChangeUnsandboxed}),o.a.createElement(m.b,{defaultMessage:\"Run without sandbox\",id:\"tw.loadExtension.unsandboxed\"})),e.unsandboxed&&o.a.createElement(\"div\",{className:Af.a.unsandboxedWarning},o.a.createElement(m.b,{defaultMessage:\"Loading extensions without the sandbox is dangerous. It will be able to corrupt your project, delete your settings, phish for passwords, and other bad things. The {APP_NAME} developers are not responsible for any resulting issues.\",id:\"tw.loadExtension.unsandboxedWarning\",values:{APP_NAME:ct.APP_NAME}}))),!e.unsandboxed&&o.a.createElement(\"div\",{className:Af.a.sandboxed},o.a.createElement(m.b,{defaultMessage:\"While the code will be sandboxed, it will still have access to information about your device such as your IP and general location. Make sure you trust the author of this extension before continuing.\",id:\"tw.loadExtension.sandboxed\"})));Wf.propTypes={url:i.a.string.isRequired,unsandboxed:i.a.bool.isRequired,onChangeUnsandboxed:i.a.func};var Hf=Wf;const Qf=e=>o.a.createElement(\"div\",null,o.a.createElement(m.b,{defaultMessage:\"The project wants to connect to the website:\",id:\"tw.fetch.title\"}),o.a.createElement(Rf,{url:e.url}),o.a.createElement(\"p\",null,o.a.createElement(m.b,{defaultMessage:\"This could be used to download images or sounds, implement multiplayer, access an API, or for malicious purposes. This will share your IP address, general location, and possibly other data with the website.\",id:\"tw.securityManager.why\"})),o.a.createElement(\"p\",null,o.a.createElement(m.b,{defaultMessage:\"If allowed, further requests to the same website will be automatically allowed.\",id:\"tw.securityManager.trust\"})));Qf.propTypes={url:i.a.string.isRequired};var Yf=Qf;const Vf=e=>o.a.createElement(\"div\",null,o.a.createElement(m.b,{defaultMessage:\"The project wants to open a new window or tab with the URL:\",id:\"tw.openWindow.title\"}),o.a.createElement(Rf,{url:e.url}),o.a.createElement(\"p\",null,o.a.createElement(m.b,{defaultMessage:\"This website has not been reviewed by the {APP_NAME} developers. It may contain dangerous or malicious code.\",id:\"tw.openWindow.dangerous\",values:{APP_NAME:ct.APP_NAME}})));Vf.propTypes={url:i.a.string.isRequired};var qf=Vf;const Jf=e=>o.a.createElement(\"div\",null,o.a.createElement(m.b,{defaultMessage:\"The project wants to navigate this tab to the URL:\",id:\"tw.redirect.title\"}),o.a.createElement(Rf,{url:e.url}),o.a.createElement(\"p\",null,o.a.createElement(m.b,{defaultMessage:\"This website has not been reviewed by the {APP_NAME} developers. It may contain dangerous or malicious code.\",id:\"tw.redirect.dangerous\",values:{APP_NAME:ct.APP_NAME}})));Jf.propTypes={url:i.a.string.isRequired};var Xf=Jf;var Kf=()=>o.a.createElement(\"div\",null,o.a.createElement(\"p\",null,o.a.createElement(m.b,{defaultMessage:\"The project wants to record audio from your microphone. This could include a text transcript or raw audio data. The project may be able to share audio with other users or servers.\",id:\"tw.recordAudio.title\"})),o.a.createElement(\"p\",null,o.a.createElement(m.b,{defaultMessage:\"If allowed, you may be prompted to enable microphone access by your browser, and further microphone access will be automatically allowed.\",id:\"tw.recordAudio.permission\"})));var $f=()=>o.a.createElement(\"div\",null,o.a.createElement(\"p\",null,o.a.createElement(m.b,{defaultMessage:\"The project wants to record video from your camera. The project may be able to share images with other users or servers.\",id:\"tw.recordVideo.title\"})),o.a.createElement(\"p\",null,o.a.createElement(m.b,{defaultMessage:\"If allowed, you may be prompted to enable camera access by your browser, and further camera access will be automatically allowed.\",id:\"tw.recordVideo.permission\"})));var eM=()=>o.a.createElement(\"div\",null,o.a.createElement(\"p\",null,o.a.createElement(m.b,{defaultMessage:\"The project wants to read data from your clipboard.\",id:\"tw.clipboard.title\"})),o.a.createElement(\"p\",null,o.a.createElement(m.b,{defaultMessage:\"If your clipboard contains things like passwords, the project may be able to share those with other users or servers.\",id:\"tw.clipboard.danger\"})),o.a.createElement(\"p\",null,o.a.createElement(m.b,{defaultMessage:\"Clipboard access may not work in some browsers. If allowed, further clipboard reads will be automatically allowed.\",id:\"tw.clipboard.permission\"})));var tM=()=>o.a.createElement(\"div\",null,o.a.createElement(\"p\",null,o.a.createElement(m.b,{defaultMessage:\"The project wants to display notifications.\",id:\"tw.notify.title\"})),o.a.createElement(\"p\",null,o.a.createElement(m.b,{defaultMessage:\"If allowed, you may be prompted to enable notifications by your browser, and further notifications will be automatically allowed.\",id:\"tw.notify.permission\"})));var nM=()=>o.a.createElement(\"div\",null,o.a.createElement(\"p\",null,o.a.createElement(m.b,{defaultMessage:\"The project wants to know your location.\",id:\"tw.geolocate.title\"})),o.a.createElement(\"p\",null,o.a.createElement(m.b,{defaultMessage:\"If allowed, you may be prompted to allow location access by your browser.\",id:\"tw.geolocate.permission\"})));const aM=e=>o.a.createElement(\"div\",null,e.url.startsWith(\"data:\")?o.a.createElement(o.a.Fragment,null,o.a.createElement(\"p\",null,o.a.createElement(m.b,{defaultMessage:\"The project wants to embed HTML content over the stage:\",id:\"tw.embed.title1\"})),o.a.createElement(Zf,{url:e.url})):o.a.createElement(o.a.Fragment,null,o.a.createElement(\"p\",null,o.a.createElement(m.b,{defaultMessage:\"The project wants to embed remote content over the stage:\",id:\"tw.embed.title2\"})),o.a.createElement(Rf,{url:e.url})),o.a.createElement(\"p\",null,o.a.createElement(m.b,{defaultMessage:\"While the embed will be sandboxed, it will still have access to information about your device such as your IP and general location.\",id:\"tw.embed.risks\"})),!e.url.startsWith(\"data:\")&&o.a.createElement(\"p\",null,o.a.createElement(m.b,{defaultMessage:\"If allowed, further embeds to the same site will be automatically allowed.\",id:\"tw.embed.persistent\"})));aM.propTypes={url:i.a.string.isRequired};var oM=aM,rM=n(139),iM=n.n(rM);const sM=[\"exe\",\"msi\",\"msix\",\"msixbundle\",\"com\",\"scf\",\"scr\",\"sct\",\"dll\",\"appx\",\"appxbundle\",\"reg\",\"iso\",\"drv\",\"sys\",\"app\",\"dmg\",\"pkg\",\"so\",\"a\",\"run\",\"appimage\",\"deb\",\"rpm\",\"snap\",\"flatpakref\",\"jar\",\"crx\",\"xpi\",\"url\",\"webloc\",\"inetloc\",\"lnk\",\"shortcut\",\"bat\",\"cmd\",\"ps1\",\"psm1\",\"asp\",\"vbs\",\"vbe\",\"ws\",\"wsf\",\"wsc\",\"ahk\",\"docm\",\"dotm\",\"xlm\",\"xlsm\",\"xltm\",\"xla\",\"xlam\",\"pptm\",\"potm\",\"ppsm\",\"sldm\",\"sh\",\"js\",\"py\"],lM=e=>{const t=e.name.split(\".\");let n=t.length>1?t.pop():null,a=t.join(\".\");return a.length>80&&(a=\"\".concat(a.substring(0,80),\"[...]\")),n&&n.length>30&&(n=\"[...]\".concat(n.substring(n.length-30))),null===n?o.a.createElement(\"span\",{className:iM.a.fileName},e.name):o.a.createElement(\"span\",{className:iM.a.fileName},o.a.createElement(\"span\",{className:iM.a.name},a),o.a.createElement(\"span\",{className:iM.a.dot},\".\"),o.a.createElement(\"span\",{className:iM.a.extension},n))};lM.propTypes={name:i.a.string.isRequired};const cM=e=>o.a.createElement(\"div\",null,o.a.createElement(\"p\",null,o.a.createElement(m.b,{defaultMessage:\"The project wants to download a file to your computer. It will be saved as {name} in your downloads folder.\",id:\"tw.download.file\",values:{name:o.a.createElement(lM,{name:e.name})}})),o.a.createElement(\"p\",null,o.a.createElement(m.b,{defaultMessage:\"This file has not been reviewed by the {APP_NAME} developers.\",id:\"tw.download.danger\",values:{APP_NAME:ct.APP_NAME}})),(e=>{const t=e.split(\".\"),n=t.length>1?t.pop().toLowerCase():null;return null!==n&&sM.includes(n)})(e.name)&&o.a.createElement(\"p\",null,o.a.createElement(m.b,{defaultMessage:\"This is an executable file format that may contain malicious code if you run it.\",id:\"tw.download.executable\",values:{APP_NAME:ct.APP_NAME}})));cM.propTypes={name:i.a.string.isRequired};var dM=cM;function uM(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function pM(e){for(var t=1;t{this.setState({done:!0})}),t)}componentWillUnmount(){clearTimeout(this.timeout)}render(){return o.a.createElement(e,this.state.done?pM(pM({},this.props),n):this.props)}}return a},hM=n(140),bM=n.n(hM);const wM=Object(m.g)({title:{id:\"tw.securityManager.title\",defaultMessage:\"Extension Security\"}}),fM=()=>{},MM=e=>o.a.createElement(He,{className:bM.a.modalContent,onRequestClose:e.enableButtons?e.onDenied:fM,contentLabel:e.intl.formatMessage(wM.title),id:\"securitymanagermodal\"},o.a.createElement(Oe.a,{className:bM.a.body},e.type===Tf.LoadExtension?o.a.createElement(Hf,e.data):e.type===Tf.Fetch?o.a.createElement(Yf,e.data):e.type===Tf.OpenWindow?o.a.createElement(qf,e.data):e.type===Tf.Redirect?o.a.createElement(Xf,e.data):e.type===Tf.RecordAudio?o.a.createElement(Kf,e.data):e.type===Tf.RecordVideo?o.a.createElement($f,e.data):e.type===Tf.ReadClipboard?o.a.createElement(eM,e.data):e.type===Tf.Notify?o.a.createElement(tM,e.data):e.type===Tf.Geolocate?o.a.createElement(nM,e.data):e.type===Tf.Embed?o.a.createElement(oM,e.data):e.type===Tf.Download?o.a.createElement(dM,e.data):null,o.a.createElement(Oe.a,{className:bM.a.buttons},o.a.createElement(\"button\",{className:bM.a.denyButton,onClick:e.onDenied,disabled:!e.enableButtons},o.a.createElement(m.b,{defaultMessage:\"Deny\",id:\"tw.securityManager.deny\"})),o.a.createElement(\"button\",{className:bM.a.allowButton,onClick:e.onAllowed,disabled:!e.enableButtons},o.a.createElement(m.b,{defaultMessage:\"Allow\",id:\"tw.securityManager.allow\"})))));MM.propTypes={intl:m.i,type:i.a.oneOf(Object.values(Tf)),enableButtons:i.a.bool,data:i.a.object.isRequired,onAllowed:i.a.func.isRequired,onDenied:i.a.func.isRequired};var vM=gM(Object(m.h)(MM),750,{enableButtons:!0});const yM=\"tw:persisted_unsandboxed\",kM=()=>{try{return\"true\"===localStorage.getItem(yM)}catch(e){return!1}},jM=e=>{try{localStorage.setItem(yM,!0===e)}catch(e){}};function IM(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function SM(e){for(var t=1;t{EM.add(e)},NM=e=>e.startsWith(\"https://extensions.turbowarp.org/\")||e.startsWith(\"http://localhost:8000/\")||EM.has(e),_M=new Set,DM=new Set,TM=[\"http:\",\"https:\",\"data:\",\"blob:\",\"ws:\",\"wss:\"],OM=[\"http:\",\"https:\",\"data:\",\"blob:\",\"mailto:\",\"steam:\",\"calculator:\"],AM=(e,t)=>{let n;try{n=new URL(e)}catch(e){return null}return t.includes(n.protocol)?n:null};let PM=!1,zM=!1,LM=!1,RM=!1,UM=!1;const BM=[\"getSandboxMode\",\"canLoadExtensionFromProject\",\"canFetch\",\"canOpenWindow\",\"canRedirect\",\"canRecordAudio\",\"canRecordVideo\",\"canReadClipboard\",\"canNotify\",\"canGeolocate\",\"canEmbed\",\"canDownload\"];class GM extends o.a.Component{constructor(e){super(e),E()(this,[\"handleAllowed\",\"handleDenied\"]),E()(this,BM),this.nextModalCallbacks=[],this.modalLocked=!1,this.state={type:null,data:null,callback:null,modalCount:0}}componentDidMount(){const e=this.props.vm.extensionManager.securityManager,t=this.props.securityManager;for(const n of BM)e[n]=t[n]||this[n]}async acquireModalLock(){this.modalLocked?await new Promise((e=>{this.nextModalCallbacks.push(e)})):this.modalLocked=!0;const e=()=>{if(this.nextModalCallbacks.length){this.nextModalCallbacks.shift()()}else this.modalLocked=!1,this.setState({type:null})};return{showModal:async(t,n)=>{const a=await new Promise((e=>{this.setState((a=>({type:t,data:n,callback:e,modalCount:a.modalCount+1})))}));return e(),a},releaseLock:e}}handleAllowed(){this.state.callback(!0)}handleDenied(){this.state.callback(!1)}getSandboxMode(e){return NM(e)?(N.default.info(\"Loading extension \".concat(e,\" unsandboxed\")),\"unsandboxed\"):\"iframe\"}handleChangeUnsandboxed(e){const t=e.target.checked;this.setState((e=>({data:SM(SM({},e.data),{},{unsandboxed:t})})))}async canLoadExtensionFromProject(e){if(NM(e))return N.default.info(\"Loading extension \".concat(e,\" automatically\")),!0;const{showModal:t}=await this.acquireModalLock();if(e.startsWith(\"data:\")){const n=await t(Tf.LoadExtension,{url:e,unsandboxed:kM(),onChangeUnsandboxed:this.handleChangeUnsandboxed.bind(this)});return n&&jM(this.state.data.unsandboxed),n&&this.state.data.unsandboxed&&CM(e),n}return t(Tf.LoadExtension,{url:e,unsandboxed:!1})}async canFetch(e){const t=AM(e,TM);if(!t)return!1;if((e=>NM(e.href)||\"https://turbowarp.org\"===e.origin||e.origin.endsWith(\".turbowarp.org\")||e.origin.endsWith(\".turbowarp.xyz\")||\"https://raw.githubusercontent.com\"===e.origin||\"https://gist.githubusercontent.com\"===e.origin||\"https://api.github.com\"===e.origin||\"https://gitlab.com\"===e.origin||e.origin.endsWith(\".srht.site\")||e.origin.endsWith(\".itch.io\")||\"https://api.gamejolt.com\"===e.origin||\"https://httpbin.org\"===e.origin||\"https://scratchdb.lefty.one\"===e.origin)(t))return!0;const{showModal:n,releaseLock:a}=await this.acquireModalLock(),o=\"http:\"===t.protocol||\"https:\"===t.protocol||\"ws:\"===t.protocol||\"wss:\"===t.protocol?t.host:null;if(o&&_M.has(o))return a(),!0;const r=await n(Tf.Fetch,{url:e});return o&&r&&_M.add(o),r}async canOpenWindow(e){if(!AM(e,OM))return!1;const{showModal:t}=await this.acquireModalLock();return t(Tf.OpenWindow,{url:e})}async canRedirect(e){if(!AM(e,OM))return!1;const{showModal:t}=await this.acquireModalLock();return t(Tf.Redirect,{url:e})}async canRecordAudio(){if(!PM){const{showModal:e}=await this.acquireModalLock();PM=await e(Tf.RecordAudio)}return PM}async canRecordVideo(){if(!zM){const{showModal:e}=await this.acquireModalLock();zM=await e(Tf.RecordVideo)}return zM}async canReadClipboard(){if(!LM){const{showModal:e}=await this.acquireModalLock();LM=await e(Tf.ReadClipboard)}return LM}async canNotify(){if(!RM){const{showModal:e}=await this.acquireModalLock();RM=await e(Tf.Notify)}return RM}async canGeolocate(){if(!UM){const{showModal:e}=await this.acquireModalLock();UM=await e(Tf.Geolocate)}return UM}async canEmbed(e){const t=AM(e,TM);if(!t)return!1;const n=\"http:\"===t.protocol||\"https:\"===t.protocol?t.host:null,{showModal:a,releaseLock:o}=await this.acquireModalLock();if(n&&DM.has(n))return o(),!0;const r=await a(Tf.Embed,{url:e});return n&&r&&DM.add(n),r}async canDownload(e,t){if(!AM(e,TM))return!1;const{showModal:n}=await this.acquireModalLock();return n(Tf.Download,{url:e,name:t})}render(){return this.state.type?o.a.createElement(vM,{type:this.state.type,data:this.state.data,onAllowed:this.handleAllowed,onDenied:this.handleDenied,key:this.state.modalCount}):null}}GM.propTypes={vm:i.a.shape({extensionManager:i.a.shape({securityManager:i.a.shape(BM.reduce(((e,t)=>(e[t]=i.a.func.isRequired,e)),{})).isRequired}).isRequired}).isRequired,securityManager:i.a.shape(Object.fromEntries(BM.map((e=>[e,i.a.func]))))},GM.defaultProps={securityManager:{}};const FM=Object(l.b)((e=>({vm:e.scratchGui.vm})),(()=>({})))(GM);var ZM=n(394),WM=n.n(ZM);class HM extends o.a.Component{constructor(e){super(e),E()(this,[\"handleChange\",\"handleClick\"]),this.state={files:e.files}}handleChange(e){e.target.files.length?this.props.onChange(e.target.files):this.props.onChange(null)}handleClick(){const e=document.createElement(\"input\");e.type=\"file\",e.accept=this.props.accept,e.multiple=!0,e.addEventListener(\"change\",this.handleChange),document.body.appendChild(e),e.click(),e.remove()}render(){return o.a.createElement(\"button\",{className:WM.a.container,onClick:this.handleClick},this.props.files?o.a.createElement(m.b,{defaultMessage:\"Selected: {names}\",id:\"tw.fileInput.selected\",values:{names:Array.from(this.props.files).map((e=>e.name)).join(\", \")}}):o.a.createElement(m.b,{defaultMessage:\"No files selected.\",id:\"tw.fileInput.none\"}))}}HM.propTypes={files:i.a.instanceOf(FileList),accept:i.a.string,onChange:i.a.func};var QM=HM,YM=n(52),VM=n.n(YM);const qM=Object(m.g)({title:{id:\"tw.customExtensionModal.title\",defaultMessage:\"Load Custom Extension\"}}),JM=e=>o.a.createElement(He,{className:VM.a.modalContent,onRequestClose:e.onClose,contentLabel:e.intl.formatMessage(qM.title),id:\"customExtensionModal\"},o.a.createElement(Oe.a,{className:VM.a.body,onDragOver:e.onDragOver,onDragLeave:e.onDragLeave,onDrop:e.onDrop},o.a.createElement(\"div\",{className:VM.a.typeSelectorContainer},o.a.createElement(\"div\",{className:VM.a.typeSelectorButton,\"data-active\":\"url\"===e.type,onClick:e.onSwitchToURL,tabIndex:0},o.a.createElement(m.b,{defaultMessage:\"URL\",id:\"tw.customExtensionModal.url\"})),o.a.createElement(\"div\",{className:VM.a.typeSelectorButton,\"data-active\":\"file\"===e.type,onClick:e.onSwitchToFile,tabIndex:0},o.a.createElement(m.b,{defaultMessage:\"Files\",id:\"tw.customExtensionModal.file\"})),o.a.createElement(\"div\",{className:VM.a.typeSelectorButton,\"data-active\":\"text\"===e.type,onClick:e.onSwitchToText,tabIndex:0},o.a.createElement(m.b,{defaultMessage:\"Text\",id:\"tw.customExtensionModal.text\"}))),\"url\"===e.type?o.a.createElement(o.a.Fragment,{key:e.type},o.a.createElement(\"p\",null,o.a.createElement(m.b,{defaultMessage:\"Enter the extension's URL:\",id:\"tw.customExtensionModal.promptURL\"})),o.a.createElement(\"input\",{type:\"text\",className:VM.a.urlInput,value:e.url,onChange:e.onChangeURL,onKeyDown:e.onKeyDown,placeholder:\"https://extensions.turbowarp.org/...\",autoFocus:!0})):\"file\"===e.type?o.a.createElement(o.a.Fragment,{key:e.type},o.a.createElement(\"p\",null,o.a.createElement(m.b,{defaultMessage:\"Select or drop extension JavaScript files:\",id:\"tw.customExtensionModal.promptFile\"})),o.a.createElement(QM,{accept:\".js\",onChange:e.onChangeFiles,files:e.files})):o.a.createElement(o.a.Fragment,{key:e.type},o.a.createElement(\"p\",null,o.a.createElement(m.b,{defaultMessage:\"Paste the extension's JavaScript source code:\",id:\"tw.customExtensionModal.promptText\"})),o.a.createElement(\"textarea\",{className:VM.a.textCodeInput,placeholder:\"class Extension {\\n // ...\\n}\\nScratch.extensions.register(new Extension());\",value:e.text,onChange:e.onChangeText,autoFocus:!0,spellCheck:!1})),e.onChangeUnsandboxed?o.a.createElement(o.a.Fragment,null,o.a.createElement(\"label\",{className:VM.a.unsandboxedContainer},o.a.createElement(Kw.a,{className:VM.a.unsandboxedCheckbox,checked:e.unsandboxed,onChange:e.onChangeUnsandboxed}),o.a.createElement(m.b,{defaultMessage:\"Run without sandbox\",id:\"tw.customExtensionModal.unsandboxed\"})),e.unsandboxed&&o.a.createElement(\"p\",{className:VM.a.unsandboxedWarning},o.a.createElement(m.b,{defaultMessage:\"Loading extensions without the sandbox is dangerous and should not be enabled if you don't know what you're doing.\",id:\"tw.customExtensionModal.unsandboxedWarning1\"}),o.a.createElement(m.b,{defaultMessage:\"Unsandboxed extensions can corrupt your project, delete your settings, phish for passwords, and other bad things. The {APP_NAME} developers are not responsible for any resulting issues.\",id:\"tw.customExtensionModal.unsandboxedWarning2\",values:{APP_NAME:ct.APP_NAME}}))):e.unsandboxed?o.a.createElement(\"p\",{className:VM.a.trustedExtension},o.a.createElement(m.b,{defaultMessage:\"This extension will be loaded without the sandbox because it is from a trusted source.\",id:\"tw.customExtensionModal.trusted\"})):o.a.createElement(\"p\",null,o.a.createElement(m.b,{defaultMessage:\"Extensions from untrusted URLs will always be loaded with the sandbox for security.\",id:\"tw.customExtensionModal.untrusted\"})),o.a.createElement(\"div\",{className:VM.a.buttonRow},o.a.createElement(\"button\",{className:VM.a.loadButton,onClick:e.onLoadExtension,disabled:!e.canLoadExtension},o.a.createElement(m.b,{defaultMessage:\"Load\",id:\"tw.customExtensionModal.load\"})))));JM.propTypes={intl:m.i,canLoadExtension:i.a.bool.isRequired,type:i.a.oneOf([\"url\",\"file\",\"text\"]).isRequired,onSwitchToFile:i.a.func.isRequired,onSwitchToURL:i.a.func.isRequired,onSwitchToText:i.a.func.isRequired,files:i.a.instanceOf(FileList),onChangeFiles:i.a.func.isRequired,onDragOver:i.a.func.isRequired,onDragLeave:i.a.func.isRequired,onDrop:i.a.func.isRequired,url:i.a.string.isRequired,onChangeURL:i.a.func.isRequired,onKeyDown:i.a.func.isRequired,text:i.a.string.isRequired,onChangeText:i.a.func.isRequired,unsandboxed:i.a.bool.isRequired,onChangeUnsandboxed:i.a.func,onLoadExtension:i.a.func.isRequired,onClose:i.a.func.isRequired};var XM=Object(m.h)(JM);const KM=e=>new Promise(((t,n)=>{const a=new FileReader;a.onload=()=>t(a.result),a.onerror=()=>n(new Error(\"Could not read extension as data URL: \".concat(a.error))),a.readAsDataURL(e)}));class $M extends o.a.Component{constructor(e){super(e),E()(this,[\"handleChangeFiles\",\"handleChangeURL\",\"handleClose\",\"handleKeyDown\",\"handleLoadExtension\",\"handleSwitchToFile\",\"handleSwitchToURL\",\"handleSwitchToText\",\"handleChangeText\",\"handleDragOver\",\"handleDragLeave\",\"handleDrop\",\"handleChangeUnsandboxed\"]),this.state={type:\"url\",url:\"\",files:null,text:\"\",unsandboxed:kM()}}getExtensionURLs(){if(\"url\"===this.state.type)return Promise.resolve([this.state.url]);if(\"file\"===this.state.type){const e=Array.from(this.state.files);return Promise.all(e.map(KM))}return\"text\"===this.state.type?Promise.resolve([\"data:application/javascript,\".concat(encodeURIComponent(this.state.text))]):Promise.reject(new Error(\"Unknown type\"))}hasValidInput(){if(\"url\"===this.state.type)try{const e=new URL(this.state.url);return\"https:\"===e.protocol||\"http:\"===e.protocol||\"data:\"===e.protocol}catch(e){return!1}return\"file\"===this.state.type?!!this.state.files:\"text\"===this.state.type&&!!this.state.text}handleChangeFiles(e){this.setState({files:e})}handleChangeURL(e){this.setState({url:e.target.value})}handleClose(){this.props.onClose()}handleKeyDown(e){\"Enter\"===e.key&&this.hasValidInput()&&(e.preventDefault(),this.handleLoadExtension())}async handleLoadExtension(){this.handleClose();try{const e=await this.getExtensionURLs();if(\"url\"!==this.state.type&&(jM(this.state.unsandboxed),this.state.unsandboxed))for(const t of e)CM(t);for(const t of e)await this.props.vm.extensionManager.loadExtensionURL(t)}catch(e){N.default.error(e),alert(e)}}handleSwitchToFile(){this.setState({type:\"file\"})}handleSwitchToURL(){this.setState({type:\"url\"})}handleSwitchToText(){this.setState({type:\"text\"})}handleChangeText(e){this.setState({text:e.target.value})}handleDragOver(e){e.dataTransfer.types.includes(\"Files\")&&(e.preventDefault(),e.dataTransfer.dropEffect=\"copy\")}handleDragLeave(){}handleDrop(e){const t=e.dataTransfer.files;t.length&&(e.preventDefault(),this.setState({type:\"file\",files:t}))}isUnsandboxed(){return\"url\"===this.state.type?NM(this.state.url):this.state.unsandboxed}canChangeUnsandboxed(){return\"url\"!==this.state.type}handleChangeUnsandboxed(e){this.setState({unsandboxed:e.target.checked})}render(){return o.a.createElement(XM,{canLoadExtension:this.hasValidInput(),type:this.state.type,onSwitchToFile:this.handleSwitchToFile,onSwitchToURL:this.handleSwitchToURL,onSwitchToText:this.handleSwitchToText,files:this.state.files,onChangeFiles:this.handleChangeFiles,onDragOver:this.handleDragOver,onDragLeave:this.handleDragLeave,onDrop:this.handleDrop,url:this.state.url,onChangeURL:this.handleChangeURL,onKeyDown:this.handleKeyDown,text:this.state.text,onChangeText:this.handleChangeText,unsandboxed:this.isUnsandboxed(),onChangeUnsandboxed:this.canChangeUnsandboxed()?this.handleChangeUnsandboxed:null,onLoadExtension:this.handleLoadExtension,onClose:this.handleClose})}}$M.propTypes={onClose:i.a.func,vm:i.a.shape({extensionManager:i.a.shape({loadExtensionURL:i.a.func})})};var ev=Object(l.b)((e=>({vm:e.scratchGui.vm})),(e=>({onClose:()=>e(Object(w.d)())})))($M),tv=n(34),nv=n.n(tv);const av=e=>e<1e6?\"\".concat((e/1e3).toFixed(2),\"KB\"):\"\".concat((e/1e3/1e3).toFixed(2),\"MB\");var ov=n(256),rv=n.n(ov);const iv=0,sv=1,lv=\"meta\",cv=\"projects\",dv=\"assets\",uv=\"thumbnails\",pv=[lv,cv,dv,uv];let mv=null;const gv=()=>mv?Promise.resolve(mv):\"undefined\"==typeof indexedDB?Promise.resolve(null):new Promise(((e,t)=>{const n=indexedDB.open(\"TW_RestorePoints\",2);n.onupgradeneeded=()=>{const e=n.result;e.createObjectStore(lv,{autoIncrement:!0}),e.createObjectStore(cv),e.createObjectStore(dv),e.createObjectStore(uv)},n.onsuccess=()=>{mv=n.result,e(n.result)},n.onerror=()=>{t(new Error(\"Could not open database: \".concat(n.error)))}})),hv=e=>{e&&\"object\"==typeof e||(e={}),e.title=\"string\"==typeof e.title?e.title:\"?\",e.created=\"number\"==typeof e.created?e.created:0,e.type=[iv,sv].includes(e.type)?e.type:sv,e.thumbnailSize=\"number\"==typeof e.thumbnailSize?e.thumbnailSize:0,e.projectSize=\"number\"==typeof e.projectSize?e.projectSize:0,e.thumbnailWidth=\"number\"==typeof e.thumbnailWidth?e.thumbnailWidth:480,e.thumbnailHeight=\"number\"==typeof e.thumbnailHeight?e.thumbnailHeight:360,e.assets=e.assets&&\"object\"==typeof e.assets?e.assets:{};for(const[t,n]of Object.entries(e.assets))\"number\"!=typeof n&&delete e.assets[t];return e},bv=(e,t)=>new Promise((n=>{const a=e.getAllKeys();a.onsuccess=async()=>{const o=a.result;for(const n of o)t.has(n)||await new Promise((t=>{e.delete(n).onsuccess=()=>{t()}}));n()}})),wv=e=>new Promise((t=>{const n=e.objectStore(lv),a=e.objectStore(cv),o=e.objectStore(dv),r=e.objectStore(uv),i=new Set,s=new Set,l=n.openCursor();l.onsuccess=()=>{const e=l.result;if(e){i.add(e.key);const t=hv(e.value);for(const e of Object.keys(t.assets))s.add(e);e.continue()}else bv(a,i).then((()=>bv(o,s))).then((()=>bv(r,i))).then((()=>t()))}})),fv=\"tw:restore-point-interval\";var Mv={TYPE_AUTOMATIC:iv,TYPE_MANUAL:sv,getAllRestorePoints:()=>gv().then((e=>new Promise(((t,n)=>{const a=e.transaction([lv],\"readonly\");a.onerror=e=>{n(new Error(\"Getting all restore points: \".concat(e.target.error)))};const o=[],r=new Set;let i=0;const s=a.objectStore(lv).openCursor(null,\"prev\");s.onsuccess=()=>{const e=s.result;if(e){const t=hv(e.value);t.id=e.key,o.push(t),i+=t.projectSize,i+=t.thumbnailSize;for(const[e,n]of Object.entries(t.assets))r.has(e)||(r.add(e),i+=n);e.continue()}else t({totalSize:i,restorePoints:o})}})))),createRestorePoint:(e,t,n)=>gv().then((a=>new Promise(((o,r)=>{const i=e.saveProjectSb3DontZip(),s=i[\"project.json\"],l=Object.keys(i).filter((e=>\"project.json\"!==e));if(0===l.length)throw new Error(\"There are no assets in this project\");(e=>new Promise((t=>{const n=setTimeout((()=>{e.renderer.draw()}),100);e.renderer.requestSnapshot((e=>{clearTimeout(n);const a=e.indexOf(\",\"),o=e.substring(a+1),r=cs(o);t({type:\"image/png\",data:r})}))})))(e).then((c=>{const d=a.transaction(pv,\"readwrite\");d.onerror=e=>{r(new Error(\"Creating restore point: \".concat(e.target.error)))};let u=null;const p=async e=>{const t=d.objectStore(dv);for(const n of e)await new Promise((e=>{const a=i[n];t.add(a,n).onsuccess=()=>{e()}}));d.objectStore(uv).add(c,u).onsuccess=()=>{o()}},m=()=>{d.objectStore(cv).add(s,u).onsuccess=()=>{(()=>{const e=d.objectStore(dv).getAllKeys();e.onsuccess=()=>{const t=e.result,n=l.filter((e=>!t.includes(e)));p(n)}})()}};(()=>{const a={};for(const e of l){const t=i[e];a[e]=t.byteLength}const o={title:t,created:Math.round(Date.now()/1e3),type:n,projectSize:s.byteLength,thumbnailSize:c.data.byteLength,thumbnailWidth:e.runtime.stageWidth,thumbnailHeight:e.runtime.stageHeight,assets:a},r=d.objectStore(lv).add(o);r.onsuccess=()=>{u=r.result,m()}})()}))})))),removeExtraneousRestorePoints:()=>gv().then((e=>new Promise(((t,n)=>{const a=e.transaction(pv,\"readwrite\");a.onerror=e=>{n(new Error(\"Removing extraneous: \".concat(e.target.error)))};const o=new Map;let r=0;const i=e=>{if(e.type!==iv)return!1;if(r>=24)return!0;o.has(e.title)||o.set(e.title,{total:0,subgroups:new Map});const t=o.get(e.title);if(t.total>=12)return!0;const n=(a=e.created,Math.floor(a/3600));var a;t.subgroups.has(n)||t.subgroups.set(n,{total:0,index:t.subgroups.size});const i=t.subgroups.get(n),s=Math.max(1,4-i.index);return i.total>=s||(r++,t.total++,i.total++,!1)},s=a.objectStore(lv).openCursor(null,\"prev\");s.onsuccess=()=>{const e=s.result;if(e){const t=hv(e.value);i(t)&&e.delete(),e.continue()}else wv(a).then((()=>t()))}})))),deleteRestorePoint:e=>gv().then((t=>new Promise(((n,a)=>{const o=t.transaction(pv,\"readwrite\");o.onerror=e=>{a(new Error(\"Deleting restore point: \".concat(e.target.error)))};o.objectStore(lv).delete(e).onsuccess=()=>{wv(o).then((()=>n()))}})))),deleteAllRestorePoints:()=>gv().then((e=>new Promise(((t,n)=>{const a=e.transaction(pv,\"readwrite\");a.onerror=e=>{n(new Error(\"Deleting all restore points: \".concat(e.target.error)))};(async()=>{for(const e of pv)await new Promise((t=>{a.objectStore(e).clear().onsuccess=()=>{t()}}));t()})()})))),getThumbnail:e=>gv().then((t=>new Promise(((n,a)=>{const o=t.transaction([uv],\"readonly\");o.onerror=e=>{a(new Error(\"Getting thumbnail: \".concat(e.target.error)))};const r=o.objectStore(uv).get(e);r.onsuccess=()=>{const e=r.result;if(!e)return void a(new Error(\"No thumbnail found\"));const t=new Blob([e.data],{type:e.type}),o=URL.createObjectURL(t);n(o)}})))),exportRestorePoint:async e=>{const t=await gv(),n=await new Promise(((n,a)=>{const o=t.transaction([lv],\"readonly\");o.onerror=e=>{a(new Error(\"Getting restore point metadata: \".concat(e.target.error)))};const r=o.objectStore(lv).get(e);r.onsuccess=()=>{r.result?n(r.result):a(new Error(\"Restore point metadata \".concat(e,\" does not exist\")))}})),a=await new Promise(((n,a)=>{const o=t.transaction([cv],\"readonly\");o.onerror=e=>{a(new Error(\"Getting restore point project: \".concat(e.target.error)))};const r=o.objectStore(cv).get(e);r.onsuccess=()=>{r.result?n(r.result):a(new Error(\"Restore point project \".concat(e,\" does not exist\")))}})),o=await(r=Object.keys(n.assets),new Promise(((e,n)=>{const a=t.transaction([dv],\"readonly\");a.onerror=e=>{n(new Error(\"Getting asset: \".concat(e.target.error)))};const o=a.objectStore(dv),i=[];for(const e of r)i.push(new Promise((t=>{const n=o.get(e);n.onsuccess=()=>{n.result?t({md5ext:e,data:n.result}):t(null)}})));Promise.all(i).then((t=>{e(t.filter((e=>null!==e)))})).catch((e=>{n(e)}))})));var r;const i=new rv.a;i.file(\"project.json\",a);for(const e of o)i.file(e.md5ext,e.data);const s=await i.generateAsync({type:\"blob\",compression:\"DEFLATE\"});return{title:n.title,blob:s}},loadRestorePoint:(e,t)=>gv().then((n=>new Promise(((a,o)=>{const r=e.runtime.storage,i={load:(e,t,a)=>new Promise(((o,i)=>{const s=n.transaction([dv],\"readonly\");s.onerror=e=>{i(new Error(\"Loading restore point asset: \".concat(e.target.error)))};const l=\"\".concat(t,\".\").concat(a),c=s.objectStore(dv).get(l);c.onsuccess=()=>{if(c.result){const n=r.createAsset(e,a,c.result,t,!1);o(n)}else i(new Error(\"Restore point asset \".concat(l,\" does not exist\")))}}))};r.addHelper(i,50);const s=()=>{r._helpers=r._helpers.filter((e=>e.helper!==i))};e.quit(),(()=>{const r=n.transaction([cv],\"readonly\");r.onerror=e=>{o(new Error(\"Loading restore point JSON: \".concat(e.target.error)))};const i=r.objectStore(cv).get(t);i.onsuccess=()=>{i.result?e.loadProject(i.result).then((()=>{s(),a()})).catch((e=>{s(),o(e)})):(s(),o(new Error(\"Restore point project \".concat(t,\" does not exist\"))))}})()})))),deleteLegacyRestorePoint:()=>{try{if(\"undefined\"!=typeof indexedDB){indexedDB.deleteDatabase(\"TW_AutoSave\")}}catch(e){}},readInterval:()=>{try{const e=localStorage.getItem(fv);if(e){const t=+e;if(Number.isFinite(t))return t}const t=localStorage.getItem(\"tw:addons\");if(t){const e=JSON.parse(t)[\"tw-disable-restore-points\"];if(e&&e.enabled)return-1}}catch(e){}return 3e5},setInterval:e=>{try{localStorage.setItem(fv,e)}catch(e){}}},vv=n(395),yv=n.n(vv),kv=n(396),jv=n.n(kv);const Iv=()=>\"undefined\"!=typeof Intl&&void 0!==Intl.RelativeTimeFormat;class Sv extends o.a.Component{constructor(e){super(e),E()(this,[\"handleClickDelete\",\"handleClickExport\",\"handleClickLoad\"]),this.state={thumbnail:null,error:!1},this.unmounted=!1,this.totalSize=this.getTotalSize()}componentDidMount(){Mv.getThumbnail(this.props.id).then((e=>{this.unmounted?URL.revokeObjectURL(e):this.setState({thumbnail:e})})).catch((e=>{N.default.error(e),this.unmounted||this.setState({error:!0})}))}componentWillUnmount(){this.state.thumbnail&&URL.revokeObjectURL(this.state.thumbnail),this.unmounted=!0}getTotalSize(){let e=this.props.projectSize+this.props.thumbnailSize;for(const t of Object.values(this.props.assets))e+=t;return e}handleClickDelete(e){e.stopPropagation(),this.props.onClickDelete(this.props.id)}handleClickExport(e){e.stopPropagation(),this.props.onClickExport(this.props.id)}handleClickLoad(){this.props.onClickLoad(this.props.id)}render(){const e=new Date(1e3*this.props.created);return o.a.createElement(\"div\",{tabIndex:0,role:\"button\",className:nv.a.restorePoint,onClick:this.handleClickLoad},o.a.createElement(\"div\",{className:nv.a.thumbnailContainer},this.state.error?o.a.createElement(\"span\",{className:nv.a.thumbnailPlaceholder},\"?\"):this.state.thumbnail?o.a.createElement(\"img\",{className:nv.a.thumbnailImage,src:this.state.thumbnail,draggable:!1}):null),o.a.createElement(\"div\",null,o.a.createElement(\"div\",{className:nv.a.restorePointTitle},this.props.title),o.a.createElement(\"div\",null,Iv()&&o.a.createElement(\"span\",null,o.a.createElement(m.c,{value:e}),\" (\"),o.a.createElement(m.a,{value:e}),\", \",o.a.createElement(m.d,{value:e}),Iv()&&\")\"),o.a.createElement(\"div\",null,av(this.totalSize),\", \",o.a.createElement(m.b,{defaultMessage:\"{n} assets\",id:\"tw.restorePoints.assets\",values:{n:Object.keys(this.props.assets).length}}))),o.a.createElement(\"div\",{className:nv.a.restorePointButtons},o.a.createElement(\"button\",{className:nv.a.restorePointButton,onClick:this.handleClickExport,disabled:this.props.isExporting},o.a.createElement(\"img\",{src:yv.a,alt:\"Export\",draggable:!1})),o.a.createElement(\"button\",{className:nv.a.restorePointButton,onClick:this.handleClickDelete,disabled:this.props.isExporting},o.a.createElement(\"img\",{src:jv.a,alt:\"Delete\",draggable:!1}))))}}Sv.propTypes={id:i.a.number.isRequired,title:i.a.string.isRequired,created:i.a.number.isRequired,projectSize:i.a.number.isRequired,thumbnailSize:i.a.number.isRequired,assets:i.a.shape({}).isRequired,isExporting:i.a.bool.isRequired,onClickDelete:i.a.func.isRequired,onClickExport:i.a.func.isRequired,onClickLoad:i.a.func.isRequired};var xv=Sv;function Ev(){return Ev=Object.assign?Object.assign.bind():function(e){for(var t=1;to.a.createElement(\"select\",{value:e.value,onChange:e.onChange},_v.map((t=>o.a.createElement(\"option\",{key:t,value:t},t<0?e.intl.formatMessage(Cv.never):t===Nv?e.intl.formatMessage(Cv.oneMinute):e.intl.formatMessage(Cv.minutes,{n:Math.round(t/Nv)})))),!_v.includes(e.value)&&o.a.createElement(\"option\",{value:e.value},\"every \".concat(e.value,\"ms\")));Dv.propTypes={intl:m.i,value:i.a.number.isRequired,onChange:i.a.func.isRequired};const Tv=e=>o.a.createElement(He,{className:nv.a.modalContent,onRequestClose:e.onClose,contentLabel:e.intl.formatMessage(Cv.title),id:\"restorePointModal\"},o.a.createElement(\"div\",{className:nv.a.body},o.a.createElement(\"p\",null,o.a.createElement(m.b,{defaultMessage:\"{APP_NAME} periodically saves restore points on your computer to help recover your project if you forget to save. This is intended as a last resort for recovery. Your computer may silently delete these restore points at any time. DO NOT rely on this feature.\",id:\"tw.restorePoints.description\",values:{APP_NAME:ct.APP_NAME}})),o.a.createElement(\"p\",null,o.a.createElement(m.b,{defaultMessage:\"Restore points are created {time}.\",id:\"tw.restorePoints.intervalOption\",values:{time:o.a.createElement(Dv,{intl:e.intl,value:e.interval,onChange:e.onChangeInterval})}})),e.interval<0&&o.a.createElement(\"p\",{className:nv.a.disabled},o.a.createElement(m.b,{defaultMessage:\"Disabling restore points is dangerous.\",id:\"tw.restorePoints.off\"})),e.error?o.a.createElement(\"div\",{className:nv.a.error},o.a.createElement(\"p\",null,o.a.createElement(m.b,{defaultMessage:\"Restore points are not available due to an error:\",id:\"tw.restorePoints.error\",values:{error:e.error}})),o.a.createElement(\"p\",{className:nv.a.errorMessage},e.error)):e.isLoading?o.a.createElement(\"div\",{className:nv.a.loading},o.a.createElement(m.b,{defaultMessage:\"Loading...\",id:\"tw.restorePoints.loading\"})):0===e.restorePoints.length?o.a.createElement(\"div\",{className:nv.a.empty},o.a.createElement(m.b,{defaultMessage:\"No restore points found.\",id:\"tw.restorePoints.empty\"})):o.a.createElement(o.a.Fragment,null,o.a.createElement(\"div\",{className:nv.a.restorePointContainer},e.restorePoints.map((t=>o.a.createElement(xv,Ev({key:t.id,onClickDelete:e.onClickDelete,onClickExport:e.onClickExport,onClickLoad:e.onClickLoad,isExporting:e.isExporting(t.id)},t))))),o.a.createElement(\"div\",{className:nv.a.extraContainer},o.a.createElement(\"div\",{className:nv.a.totalSize},o.a.createElement(\"div\",null,o.a.createElement(m.b,{defaultMessage:\"Estimated storage used: {size}\",id:\"tw.restorePoints.size\",values:{size:av(e.totalSize)}})),o.a.createElement(\"div\",{className:nv.a.totalSizeDescription},o.a.createElement(m.b,{defaultMessage:\"Costumes or sounds used by multiple restore points are only stored once.\",id:\"tw.restorePoints.size2\"}))),o.a.createElement(\"button\",{onClick:e.onClickDeleteAll,className:ye()(nv.a.button,nv.a.deleteAllButton),disabled:e.isLoading},o.a.createElement(m.b,{defaultMessage:\"Delete All\",id:\"tw.restorePoints.deleteAll\"}))))));Tv.propTypes={intl:m.i,interval:i.a.number.isRequired,onChangeInterval:i.a.func.isRequired,onClose:i.a.func.isRequired,onClickCreate:i.a.func.isRequired,onClickDelete:i.a.func.isRequired,onClickDeleteAll:i.a.func.isRequired,onClickExport:i.a.func.isRequired,onClickLoad:i.a.func.isRequired,isExporting:i.a.func.isRequired,isLoading:i.a.bool.isRequired,totalSize:i.a.number.isRequired,restorePoints:i.a.arrayOf(i.a.shape({})),error:i.a.string};var Ov=Object(m.h)(Tv);const Av=e=>new Promise((t=>setTimeout(t,e))),Pv=Object(m.g)({confirmLoad:{id:\"tw.restorePoints.confirmLoad\",defaultMessage:\"You have unsaved changes. Replace existing project?\"},confirmDelete:{id:\"tw.restorePoints.confirmDelete\",defaultMessage:'Are you sure you want to delete \"{projectTitle}\"? This cannot be undone.'},confirmDeleteAll:{id:\"tw.restorePoints.confirmDeleteAll\",defaultMessage:\"Are you sure you want to delete ALL restore points? This cannot be undone.\"},loadError:{id:\"tw.restorePoints.error\",defaultMessage:\"Error loading restore point: {error}\"},exportError:{id:\"tw.restorePoints.exportError\",defaultMessage:\"Error exporting restore point: {error}\"}});class zv extends o.a.Component{constructor(e){super(e),E()(this,[\"handleProjectChanged\",\"handleClickCreate\",\"handleClickDelete\",\"handleClickDeleteAll\",\"handleChangeInterval\",\"handleClickExport\",\"handleClickLoad\",\"isExportingRestorePoint\"]),this.state={loading:!0,totalSize:0,restorePoints:[],error:null,interval:Mv.readInterval(),exportingRestorePoints:[]},this.timeout=null}componentDidMount(){this.props.projectChanged&&this.props.hasEverEnteredEditor&&this.queueRestorePoint(),Mv.deleteLegacyRestorePoint(),this.props.vm.on(\"PROJECT_CHANGED\",this.handleProjectChanged)}componentWillReceiveProps(e){e.isModalVisible&&!this.props.isModalVisible?this.refreshState():!e.isModalVisible&&this.props.isModalVisible&&this.setState({restorePoints:[]})}componentWillUnmount(){this.cancelQueuedRestorePoint(),this.props.vm.off(\"PROJECT_CHANGED\",this.handleProjectChanged)}handleProjectChanged(){this.props.hasEverEnteredEditor&&!this.timeout&&this.queueRestorePoint()}handleClickCreate(){this.createRestorePoint(Mv.TYPE_MANUAL).catch((e=>{this.handleModalError(e)}))}handleClickDelete(e){const t=this.state.restorePoints.find((t=>t.id===e)).title;confirm(this.props.intl.formatMessage(Pv.confirmDelete,{projectTitle:t}))&&(this.setState({loading:!0}),Mv.deleteRestorePoint(e).then((()=>{this.refreshState()})).catch((e=>{this.handleModalError(e)})))}handleClickDeleteAll(){confirm(this.props.intl.formatMessage(Pv.confirmDeleteAll))&&(this.setState({loading:!0}),Mv.deleteAllRestorePoints().then((()=>{this.refreshState()})).catch((e=>{this.handleModalError(e)})))}canLoadProject(){return!!this.props.isShowingProject&&!(this.props.projectChanged&&!confirm(this.props.intl.formatMessage(Pv.confirmLoad)))}handleClickExport(e){if(this.isExportingRestorePoint(e))return;this.setState((t=>({exportingRestorePoints:[...t.exportingRestorePoints,e]})));const t=()=>{this.setState((t=>({exportingRestorePoints:t.exportingRestorePoints.filter((t=>t!==e))})))};Mv.exportRestorePoint(e).then((e=>{Object(cr.a)(\"\".concat(e.title,\".sb3\"),e.blob),t()})).catch((e=>{N.default.error(e),alert(this.props.intl.formatMessage(Pv.exportError,{error:e})),t()}))}isExportingRestorePoint(e){return this.state.exportingRestorePoints.includes(e)}handleClickLoad(e){this.canLoadProject()&&(this.props.onCloseModal(),this.props.onStartLoadingRestorePoint(this.props.loadingState),Mv.loadRestorePoint(this.props.vm,e).then((()=>{this.props.onFinishLoadingRestorePoint(!0,this.props.loadingState),setTimeout((()=>{this.props.vm.renderer.draw()}))})).catch((e=>{N.default.error(e),alert(this.props.intl.formatMessage(Pv.loadError,{error:e})),this.props.onFinishLoadingRestorePoint(!1,this.props.loadingState)})))}handleChangeInterval(e){const t=+e.target.value;Mv.setInterval(t),this.setState({interval:t},(()=>{this.timeout&&(this.cancelQueuedRestorePoint(),this.queueRestorePoint())}))}queueRestorePoint(){this.timeout||this.state.interval<0||(this.timeout=setTimeout((()=>{this.createRestorePoint(Mv.TYPE_AUTOMATIC).then((()=>{this.timeout=null}))}),this.state.interval))}cancelQueuedRestorePoint(){this.timeout&&(clearTimeout(this.timeout),this.timeout=null)}createRestorePoint(e){return this.props.isModalVisible&&this.setState({loading:!0}),this.props.onStartCreatingRestorePoint(),Promise.all([Av(250).then((()=>Mv.createRestorePoint(this.props.vm,this.props.projectTitle,e))).then((()=>Mv.removeExtraneousRestorePoints())),Av(1e3)]).then((()=>{this.props.onFinishCreatingRestorePoint(),this.props.isModalVisible&&this.refreshState()})).catch((e=>{N.default.error(e),this.props.onErrorCreatingRestorePoint(),this.props.isModalVisible&&this.refreshState()}))}refreshState(){this.setState({loading:!0,error:null,restorePoints:[]}),Mv.getAllRestorePoints().then((e=>{this.setState({loading:!1,totalSize:e.totalSize,restorePoints:e.restorePoints})})).catch((e=>{this.handleModalError(e)}))}handleModalError(e){N.default.error(\"Restore point error\",e),this.setState({error:\"\".concat(e),loading:!1})}render(){return this.props.isModalVisible?o.a.createElement(Ov,{onClose:this.props.onCloseModal,onClickCreate:this.handleClickCreate,onClickDelete:this.handleClickDelete,onClickDeleteAll:this.handleClickDeleteAll,onClickExport:this.handleClickExport,onClickLoad:this.handleClickLoad,interval:this.state.interval,onChangeInterval:this.handleChangeInterval,isExporting:this.isExportingRestorePoint,isLoading:this.state.loading,totalSize:this.state.totalSize,restorePoints:this.state.restorePoints,error:this.state.error}):null}}zv.propTypes={intl:m.i,projectChanged:i.a.bool.isRequired,projectTitle:i.a.string.isRequired,onStartCreatingRestorePoint:i.a.func.isRequired,onFinishCreatingRestorePoint:i.a.func.isRequired,onErrorCreatingRestorePoint:i.a.func.isRequired,onStartLoadingRestorePoint:i.a.func.isRequired,onFinishLoadingRestorePoint:i.a.func.isRequired,onCloseModal:i.a.func.isRequired,loadingState:i.a.oneOf(h.a).isRequired,isShowingProject:i.a.bool.isRequired,isModalVisible:i.a.bool.isRequired,hasEverEnteredEditor:i.a.bool.isRequired,vm:i.a.shape({on:i.a.func.isRequired,off:i.a.func.isRequired,loadProject:i.a.func.isRequired,stop:i.a.func.isRequired,renderer:i.a.shape({draw:i.a.func.isRequired})}).isRequired};var Lv=Object(m.h)(Object(l.b)((e=>({projectChanged:e.scratchGui.projectChanged,projectTitle:e.scratchGui.projectTitle,loadingState:e.scratchGui.projectState.loadingState,isShowingProject:Object(h.r)(e.scratchGui.projectState.loadingState),isModalVisible:e.scratchGui.modals.restorePointModal,hasEverEnteredEditor:e.scratchGui.mode.hasEverEnteredEditor,vm:e.scratchGui.vm})),(e=>({onStartCreatingRestorePoint:()=>e(Object(W.i)(\"twCreatingRestorePoint\")),onFinishCreatingRestorePoint:()=>Object(W.g)(e,\"twRestorePointSuccess\"),onErrorCreatingRestorePoint:()=>Object(W.g)(e,\"twRestorePointError\"),onStartLoadingRestorePoint:t=>{e(Object(w.A)()),e(Object(h.C)(t))},onFinishLoadingRestorePoint:(t,n)=>{e(Object(h.x)(n,!1,t)),e(Object(w.h)()),e(Object($.j)(null))},onCloseModal:()=>e(Object(w.i)())})))(zv)),Rv=n(21),Uv=n.n(Rv),Bv=n(397),Gv=n.n(Bv),Fv=n(398),Zv=n.n(Fv);const Wv=Object(m.g)({delete:{id:\"tw.fonts.delete\",defaultMessage:'Are you sure you want to delete \"{font}\"? Any vector costumes will use the fallback font instead.'}});class Hv extends o.a.Component{constructor(e){super(e),E()(this,[\"handleExport\",\"handleDelete\"])}handleExport(){const e=new Blob([this.props.data],{contentType:\"font/\".concat(this.props.format)});Object(cr.a)(\"\".concat(this.props.name,\".\").concat(this.props.format),e)}handleDelete(){confirm(this.props.intl.formatMessage(Wv.delete,{font:this.props.name}))&&this.props.fontManager.deleteFont(this.props.index)}render(){return o.a.createElement(\"div\",{className:Uv.a.manageFont},o.a.createElement(\"div\",null,o.a.createElement(\"div\",{className:Uv.a.manageFontName,title:this.props.family,style:{fontFamily:this.props.family}},this.props.name),o.a.createElement(\"div\",{className:Uv.a.manageFontDetails},this.props.system?o.a.createElement(m.b,{defaultMessage:\"System font\",id:\"tw.fonts.system\"}):av(this.props.data.byteLength))),o.a.createElement(\"div\",{className:Uv.a.manageFontButtons},!this.props.system&&o.a.createElement(\"button\",{className:Uv.a.manageFontButton,onClick:this.handleExport},o.a.createElement(\"img\",{src:Zv.a,alt:\"Export\",draggable:!1})),o.a.createElement(\"button\",{className:Uv.a.manageFontButton,onClick:this.handleDelete},o.a.createElement(\"img\",{src:Gv.a,alt:\"Delete\",draggable:!1}))))}}Hv.propTypes={intl:m.i,system:i.a.bool.isRequired,name:i.a.string.isRequired,family:i.a.string.isRequired,data:i.a.instanceOf(Uint8Array),format:i.a.string,index:i.a.number.isRequired,fontManager:i.a.shape({deleteFont:i.a.func.isRequired}).isRequired};var Qv=Object(m.h)(Hv);class Yv extends o.a.Component{constructor(e){super(e),E()(this,[\"handleSelect\"])}handleSelect(){this.props.onSelect(this.props.family)}render(){return o.a.createElement(\"div\",{className:Uv.a.fontDropdownItem,title:this.props.family,style:{fontFamily:this.props.family},onMouseDown:this.handleSelect},this.props.family)}}Yv.propTypes={family:i.a.string.isRequired,onSelect:i.a.func.isRequired};var Vv=Yv;const qv=[\"name\",\"onChange\",\"fontManager\",\"isCustom\"];function Jv(){return Jv=Object.assign?Object.assign.bind():function(e){for(var t=1;t{const t=[...new Set(e.map((e=>e.family)))];this.setState({localFonts:t})}))}componentWillUnmount(){window.removeEventListener(\"resize\",this.handleResize)}setInputRef(e){this.input=e,e&&e.focus()}handleChange(e){this.props.onChange(e.target.value)}handleFocus(){this.setState({focused:!0,rect:this.input.getBoundingClientRect()})}handleBlur(){const e=this.props.isCustom?this.props.fontManager.getUnusedCustomFont(this.props.name):this.props.fontManager.getUnusedSystemFont(this.props.name);this.props.onChange(e),this.setState({focused:!1})}handleResize(){this.state.focused&&this.setState({rect:this.input.getBoundingClientRect()})}handleSelectFont(e){this.props.onChange(e)}handleKeyDown(e){\"Enter\"===e.key&&(this.handleBlur(),e.target.blur())}getFilteredOptions(){if(this.props.isCustom||!this.state.focused)return[];const e=this.props.name.toLowerCase(),t=this.state.localFonts.filter((t=>t.toLowerCase().includes(e)));return 1===t.length&&t[0]===this.props.name?[]:t}render(){const e=this.props,{name:t,onChange:n,fontManager:a,isCustom:r}=e,i=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a0&&Cp.a.createPortal(o.a.createElement(\"div\",{className:Uv.a.fontDropdownOuter,style:{left:\"\".concat(this.state.rect.left-4,\"px\"),top:\"\".concat(this.state.rect.top+this.state.rect.height+4,\"px\"),width:\"\".concat(this.state.rect.width+8,\"px\")}},this.getFilteredOptions().map((e=>o.a.createElement(Vv,{key:e,family:e,onSelect:this.handleSelectFont})))),document.body))}}Xv.propTypes={name:i.a.string.isRequired,onChange:i.a.func.isRequired,fontManager:i.a.shape({getUnusedSystemFont:i.a.func.isRequired,getUnusedCustomFont:i.a.func.isRequired}).isRequired,isCustom:i.a.bool.isRequired};var Kv=Xv;const $v=\"The quick brown fox jumps over the lazy dog.\";class ey extends o.a.Component{constructor(e){super(e),E()(this,[\"handleChange\"]),this.state={value:$v}}handleChange(e){this.setState({value:e.target.value})}render(){return o.a.createElement(\"textarea\",{className:Uv.a.fontPlayground,value:this.state.value,onChange:this.handleChange,placeholder:$v,style:{fontFamily:this.props.family}})}}ey.propTypes={family:i.a.string.isRequired};var ty=ey,ny=n(64);class ay extends o.a.Component{constructor(e){super(e),E()(this,[\"handleClick\"])}handleClick(){this.props.onClick(this.props.family)}formatName(){switch(this.props.family){case ny.a.CHINESE:return\"中文\";case ny.a.KOREAN:return\"한국어\";case ny.a.JAPANESE:return\"日本語\";case ny.a.MOPED_LIKE:return\"Mopeds\"}return this.props.family}render(){return o.a.createElement(\"button\",{className:ye()(Uv.a.fallbackButton,{[Uv.a.fallbackButtonSelected]:this.props.selected}),onClick:this.handleClick,style:{fontFamily:this.props.family}},this.formatName())}}ay.propTypes={family:i.a.string.isRequired,onClick:i.a.func.isRequired,selected:i.a.bool.isRequired};const oy=e=>o.a.createElement(\"div\",{className:Uv.a.fallbackContainer},o.a.createElement(\"div\",{className:Uv.a.fallbackLabel},o.a.createElement(m.b,{defaultMessage:\"Choose a fallback font to use if the font fails to load or is deleted:\",id:\"tw.fonts.fallback\"})),o.a.createElement(\"div\",{className:Uv.a.fallbackList},Object.values(ny.a).map((t=>o.a.createElement(ay,{key:t,family:t,onClick:e.onChange,selected:e.fallback===t})))));oy.DEFAULT=\"Sans Serif\",oy.propTypes={fallback:i.a.string.isRequired,onChange:i.a.func.isRequired};var ry=oy;const iy=e=>o.a.createElement(\"button\",{onClick:e.onClick,disabled:e.disabled,className:Uv.a.button},o.a.createElement(m.b,{defaultMessage:\"Add\",id:\"tw.fonts.add\"}));iy.propTypes={onClick:i.a.func.isRequired,disabled:i.a.bool};var sy=iy;class ly extends o.a.Component{constructor(e){super(e),E()(this,[\"handleChangeName\",\"handleChangeFallback\",\"handleFinish\"]),this.state={name:\"\",fallback:ry.DEFAULT}}handleChangeName(e){this.setState({name:e})}handleChangeFallback(e){this.setState({fallback:e})}handleFinish(){this.props.fontManager.addSystemFont(this.state.name,this.state.fallback),this.props.onClose()}render(){return o.a.createElement(o.a.Fragment,null,o.a.createElement(\"p\",null,o.a.createElement(m.b,{defaultMessage:\"Type in the name of any font built in to your computer. The font may not appear correctly for everyone.\",id:\"tw.fonts.system.name\"})),o.a.createElement(Kv,{name:this.state.name,onChange:this.handleChangeName,fontManager:this.props.fontManager,placeholder:\"Wingdings\",isCustom:!1}),this.state.name&&o.a.createElement(o.a.Fragment,null,o.a.createElement(ty,{family:\"\".concat(this.state.name,\", \").concat(this.state.fallback)}),o.a.createElement(ry,{fallback:this.state.fallback,onChange:this.handleChangeFallback})),o.a.createElement(sy,{onClick:this.handleFinish,disabled:!this.state.name}))}}ly.propTypes={fontManager:i.a.shape({addSystemFont:i.a.func.isRequired,hasFont:i.a.func.isRequired}).isRequired,onClose:i.a.func.isRequired};var cy=ly;let dy=0;class uy extends o.a.Component{constructor(e){super(e),this.id=++dy}componentDidMount(){this.style=document.createElement(\"style\"),this.style.className=\"gui-temp-font\",document.head.appendChild(this.style),this.updateStyle()}componentDidUpdate(e){this.props.url!==e.url&&this.updateStyle()}componentWillUnmount(){this.style.remove()}updateStyle(){this.style.textContent='@font-face { font-family: \"'.concat(this.getFamily(),'\"; src: url(\"').concat(this.props.url,'\"); }')}getFamily(){return\"GUITempFont\".concat(this.id)}render(){return this.props.children(this.getFamily())}}uy.propTypes={url:i.a.string.isRequired,children:i.a.func.isRequired};var py=uy;const my=Object(m.g)({error:{id:\"tw.fonts.readError\",defaultMessage:\"Failed to read font file: {error}\"}}),gy=[\"ttf\",\"otf\",\"woff\",\"woff2\"],hy=e=>{const t=e.indexOf(\".\");return-1!==t&&(e=e.substring(0,t)),e},by=e=>{const t=e.split(\".\"),n=t[t.length-1];return gy.includes(n)?n:\"ttf\"};class wy extends o.a.Component{constructor(e){super(e),E()(this,[\"handleChangeFile\",\"handleChangeName\",\"handleChangeFallback\",\"handleFinish\"]),this.state={file:null,url:null,name:\"\",format:\"\",fallback:ry.DEFAULT,loading:!1}}componentWillUnmount(){URL.revokeObjectURL(this.state.url)}handleChangeFile(e){const t=e.target.files[0]||null;t?this.setState({file:t,name:hy(t.name),format:by(t.name),url:URL.createObjectURL(t)}):(URL.revokeObjectURL(this.state.url),this.setState({file:t,name:null,url:null}))}handleChangeName(e){this.setState({name:e})}handleChangeFallback(e){this.setState({fallback:e})}handleFinish(){this.setState({loading:!0});const e=new FileReader;e.onload=()=>{const t=new Uint8Array(e.result),n=this.props.fontManager.runtime.storage,a=n.createAsset(n.AssetType.Font,this.state.format,t,null,!0);this.props.fontManager.addCustomFont(this.state.name,this.state.fallback,a),this.props.onClose()},e.onerror=()=>{alert(this.props.intl.formatMessage(my.error),{error:e.error}),this.setState({loading:!1})},e.readAsArrayBuffer(this.state.file)}render(){return o.a.createElement(o.a.Fragment,null,o.a.createElement(\"p\",null,o.a.createElement(m.b,{defaultMessage:\"Select a font file from your computer:\",id:\"tw.fonts.custom.file\"})),o.a.createElement(\"input\",{type:\"file\",onChange:this.handleChangeFile,className:Uv.a.fileInput,accept:gy.map((e=>\".\".concat(e))).join(\",\"),readOnly:this.state.loading}),this.state.file&&o.a.createElement(o.a.Fragment,null,o.a.createElement(\"p\",null,o.a.createElement(m.b,{defaultMessage:\"Give the font a name:\",id:\"tw.fonts.custom.name\"})),o.a.createElement(Kv,{name:this.state.name,onChange:this.handleChangeName,fontManager:this.props.fontManager,isCustom:!0}),o.a.createElement(py,{url:this.state.url},(e=>o.a.createElement(ty,{family:\"\".concat(e,\", \").concat(this.state.fallback)}))),o.a.createElement(ry,{fallback:this.state.fallback,onChange:this.handleChangeFallback})),o.a.createElement(sy,{onClick:this.handleFinish,disabled:!this.state.file||!this.state.name||this.state.loading}))}}wy.propTypes={intl:m.i,fontManager:i.a.shape({addCustomFont:i.a.func,runtime:i.a.shape({storage:i.a.any})}),onClose:i.a.func.isRequired};var fy=Object(m.h)(wy);const My=Object(m.g)({title:{id:\"tw.fonts.title\",defaultMessage:\"Fonts\"}}),vy=e=>o.a.createElement(He,{className:Uv.a.modalContent,onRequestClose:e.onClose,contentLabel:e.intl.formatMessage(My.title),id:\"fontModal\"},o.a.createElement(\"div\",{className:Uv.a.body},\"\"===e.screen?o.a.createElement(\"div\",{className:Uv.a.openButtons},o.a.createElement(\"button\",{className:Uv.a.openButton,onClick:e.onOpenSystemFonts},o.a.createElement(\"img\",{className:ye()(Uv.a.openButtonImage,Uv.a.systemImage),draggable:!1}),o.a.createElement(\"div\",{className:Uv.a.openButtonText},o.a.createElement(\"div\",{className:Uv.a.openButtonTextMain},o.a.createElement(m.b,{defaultMessage:\"Add a system font\",id:\"tw.fonts.system1\"})),o.a.createElement(\"div\",{className:Uv.a.openButtonTextSub},o.a.createElement(m.b,{defaultMessage:\"May work in Scratch, but will not appear correctly for everyone.\",id:\"tw.fonts.system2\"})))),o.a.createElement(\"button\",{className:Uv.a.openButton,onClick:e.onOpenCustomFonts},o.a.createElement(\"img\",{className:ye()(Uv.a.openButtonImage,Uv.a.customImage),draggable:!1}),o.a.createElement(\"div\",{className:Uv.a.openButtonText},o.a.createElement(\"div\",{className:Uv.a.openButtonTextMain},o.a.createElement(m.b,{defaultMessage:\"Add font from a file\",id:\"tw.fonts.custom1\"})),o.a.createElement(\"div\",{className:Uv.a.openButtonTextSub},o.a.createElement(m.b,{defaultMessage:\"Usually will not work in Scratch. Supported formats: {formats}.\",id:\"tw.fonts.custom2\",values:{formats:Object.values(gy).map((e=>\".\".concat(e))).join(\", \")}}))))):\"system\"===e.screen?o.a.createElement(cy,{fontManager:e.fontManager,onClose:e.onClose}):\"custom\"===e.screen?o.a.createElement(fy,{fontManager:e.fontManager,onClose:e.onClose}):null,\"\"===e.screen&&o.a.createElement(\"div\",{className:Uv.a.fontsOuter},o.a.createElement(\"p\",null,e.fonts.length?o.a.createElement(m.b,{defaultMessage:\"Installed fonts:\",id:\"tw.fonts.list\"}):o.a.createElement(m.b,{defaultMessage:\"No fonts added yet.\",id:\"tw.fonts.none\"})),e.fonts.length>0&&o.a.createElement(\"div\",{className:Uv.a.fonts},e.fonts.map(((t,n)=>o.a.createElement(Qv,{key:n,system:t.system,name:t.name,family:t.family,data:t.data,format:t.format,index:n,fontManager:e.fontManager})))))));vy.propTypes={intl:m.i,onClose:i.a.func.isRequired,fonts:i.a.arrayOf(i.a.shape({system:i.a.bool.isRequired,name:i.a.string.isRequired,family:i.a.string.isRequired,data:i.a.instanceOf(Uint8Array),format:i.a.string}).isRequired).isRequired,fontManager:i.a.shape({}),screen:i.a.oneOf([\"\",\"system\",\"custom\"]),onOpenSystemFonts:i.a.func.isRequired,onOpenCustomFonts:i.a.func.isRequired};var yy=Object(m.h)(vy);class ky extends o.a.Component{constructor(e){super(e),E()(this,[\"handleClose\",\"handleCustomFontsChanged\",\"handleCancelAddFont\",\"handleOpenSystemFonts\",\"handleOpenLibaryFonts\",\"handleOpenCustomFonts\"]),this.state={fonts:this.props.vm.runtime.fontManager.getFonts(),screen:\"\"}}componentDidMount(){this.props.vm.runtime.fontManager.on(\"change\",this.handleCustomFontsChanged)}componentWillUnmount(){this.props.vm.runtime.fontManager.off(\"change\",this.handleCustomFontsChanged)}handleClose(){this.state.screen?this.setState({screen:\"\"}):this.props.onClose()}handleCustomFontsChanged(){this.setState({fonts:this.props.vm.runtime.fontManager.getFonts()})}handleCancelAddFont(){this.setState({screen:\"\"})}handleOpenSystemFonts(){this.setState({screen:\"system\"})}handleOpenLibaryFonts(){this.setState({screen:\"library\"})}handleOpenCustomFonts(){this.setState({screen:\"custom\"})}render(){return o.a.createElement(yy,{onClose:this.handleClose,screen:this.state.screen,fonts:this.state.fonts,fontManager:this.props.vm.runtime.fontManager,onCancelAddFont:this.handleCancelAddFont,onOpenSystemFonts:this.handleOpenSystemFonts,onOpenLibraryFonts:this.handleOpenLibaryFonts,onOpenCustomFonts:this.handleOpenCustomFonts})}}ky.propTypes={onClose:i.a.func.isRequired,vm:i.a.shape({runtime:i.a.shape({fontManager:i.a.shape({getFonts:i.a.func,addSystemFont:i.a.func,on:i.a.func,off:i.a.func})})})};var jy=Object(l.b)((e=>({vm:e.scratchGui.vm})),(e=>({onClose:()=>e(Object(w.f)())})))(ky),Iy=n(169),Sy=n.n(Iy);const xy=Object(m.g)({title:{id:\"tw.unknownPlatform.title\",defaultMessage:\"Unknown Platform\"}}),Ey=e=>{return o.a.createElement(He,{className:Sy.a.modalContent,onRequestClose:e.onClose,contentLabel:e.intl.formatMessage(xy.title),id:\"unknownPlatformModal\"},o.a.createElement(\"div\",{className:Sy.a.body},o.a.createElement(\"p\",null,o.a.createElement(m.b,{defaultMessage:\"The project was made for a different platform:\",id:\"tw.unknownPlatform.1\"})),o.a.createElement(\"p\",{className:Sy.a.details},(t=e.platform)?t.name&&t.url?\"\".concat(t.name,\" (\").concat(t.url,\")\"):t.name?\"\".concat(t.name):t.url?\"\".concat(t.url):\"(?)\":\"(?)\"),o.a.createElement(\"p\",null,o.a.createElement(m.b,{defaultMessage:\"Compatibility with {APP_NAME} is not guaranteed. You can continue at your own risk, but we may not be able to help if you encounter any problems.\",id:\"tw.unknownPlatform.2\",values:{APP_NAME:ct.APP_NAME}})),o.a.createElement(\"button\",{className:Sy.a.button,onClick:e.onClose,disabled:!e.canClose},o.a.createElement(m.b,{defaultMessage:\"I understand\",id:\"tw.unknownPlatform.continue\"}))));var t};Ey.propTypes={intl:m.i,onClose:i.a.func.isRequired,canClose:i.a.bool,platform:i.a.shape({name:i.a.string,url:i.a.string})};var Cy=Object(m.h)(Ey);class Ny extends o.a.Component{constructor(e){super(e),E()(this,[\"handleClose\"]),this.state={canClose:!1}}componentDidMount(){setTimeout((()=>{this.setState({canClose:!0})}),1e3)}handleClose(){this.state.canClose&&(this.props.callback(),this.props.onClose())}render(){return o.a.createElement(Cy,{onClose:this.handleClose,platform:this.props.platform,canClose:this.state.canClose})}}Ny.propTypes={onClose:i.a.func.isRequired,platform:i.a.shape({name:i.a.string,url:i.a.string}),callback:i.a.func};var _y=Object(l.b)((e=>({vm:e.scratchGui.vm,callback:e.scratchGui.tw.platformMismatchDetails.callback,platform:e.scratchGui.tw.platformMismatchDetails.platform})),(e=>({onClose:()=>e(Object(w.p)())})))(Ny),Dy=n(170),Ty=n.n(Dy);const Oy=Object(m.g)({title:{id:\"tw.invalidProject.title\",defaultMessage:\"Error\"}}),Ay=e=>{let t;return t=e&&e.stack?\"\".concat(e,\"\\n\\nStack:\\n\").concat(e.stack):\"\".concat(e),\"\".concat(t,\"\\n\\n---\\n\\nURL: \").concat(location.href,\"\\nUser-Agent: \").concat(navigator.userAgent)},Py=(e,t)=>t.test(\"\".concat(e)),zy=e=>{return o.a.createElement(He,{className:Ty.a.modalContent,onRequestClose:e.onClose,contentLabel:e.intl.formatMessage(Oy.title),id:\"invalidProjectModal\"},o.a.createElement(\"div\",{className:Ty.a.body},o.a.createElement(\"p\",null,o.a.createElement(m.b,{defaultMessage:\"Could not load project:\",id:\"tw.invalidProject.error\"})),o.a.createElement(\"textarea\",{className:Ty.a.error,readOnly:!0,autoComplete:\"off\",spellCheck:!1,value:Ay(e.error)}),(t=e.error,Py(t,/Corrupted zip|uncompressed data size mismatch/)?o.a.createElement(\"p\",null,o.a.createElement(m.b,{defaultMessage:\"This error often means that the file was corrupted, possibly due to a faulty storage device, power outage, or unplugging a USB drive without ejecting. Try {usingSb3fix} as it can fix this type of error.\",id:\"tw.invalidProject.zipCorruption\",values:{usingSb3fix:o.a.createElement(\"a\",{href:\"https://turbowarp.github.io/sb3fix/?platform=turbowarp\",target:\"_blank\",rel:\"noreferrer\"},o.a.createElement(m.b,{defaultMessage:\"using sb3fix to recover your project\",id:\"tw.invalidProject.sb3fix\"}))}})):(e=>Py(e,/validationError/))(e.error)?o.a.createElement(\"p\",null,o.a.createElement(m.b,{defaultMessage:\"This error often means that a small part of the project has been corrupted, but that it is otherwise valid. This can be easy to fix, so please {reportIt}.\",id:\"tw.invalidProject.validationError\",values:{reportIt:o.a.createElement(\"a\",{href:\"https://github.com/TurboWarp/sb3fix/issues\",target:\"_blank\",rel:\"noreferrer\"},o.a.createElement(m.b,{defaultMessage:\"report it\",id:\"tw.invalidProject.reportIt\"}))}})):null),o.a.createElement(\"p\",null,o.a.createElement(m.b,{defaultMessage:\"You may be able to recover an older version of the project from automatic restore points or other backups.\",id:\"tw.invalidProject.options\"})),o.a.createElement(\"button\",{className:Ty.a.button,onClick:e.onClickRestorePoints},o.a.createElement(m.b,{defaultMessage:\"View Restore Points\",id:\"tw.invalidProject.restorePoints\"}))));var t};zy.propTypes={intl:m.i,onClose:i.a.func,onClickRestorePoints:i.a.func,error:i.a.any};var Ly=Object(m.h)(zy);const Ry=e=>o.a.createElement(Ly,e);Ry.propTypes={onClickRestorePoints:i.a.func,onClose:i.a.func,error:i.a.any};var Uy=Object(l.b)((e=>({error:e.scratchGui.tw.projectError})),(e=>({onClickRestorePoints:()=>{e(Object(w.g)()),e(Object(w.B)())},onClose:()=>e(Object(w.g)())})))(Ry);new Set;class By extends o.a.Component{componentDidUpdate(e){this.props.isStarted&&!e.isStarted&&\"0\"!==this.props.projectId&&this.submit()}submit(){}render(){return null}}By.propTypes={isEmbedded:i.a.bool.isRequired,isStarted:i.a.bool.isRequired,projectId:i.a.string.isRequired};var Gy=Object(l.b)((e=>({isStarted:e.scratchGui.vmStatus.running,projectId:e.scratchGui.projectState.projectId})),(()=>({})))(By),Fy=n(95),Zy=n(35),Wy=n.n(Zy),Hy=n(399),Qy=n.n(Hy);const Yy='';var Vy=()=>{const e=\"object\"==typeof Recolor?Yy.replace(/#855cd6/gi,Recolor.primary):Yy;return\"data:image/svg+xml;,\"+encodeURIComponent(e)};const qy='\\n\\n \\x3c!-- Generator: Sketch 49.2 (51160) - http://www.bohemiancoding.com/sketch --\\x3e\\n Paint Editor V1\\n Created with Sketch.\\n \\n \\n \\n \\n\\n';var Jy=()=>{const e=\"object\"==typeof Recolor?qy.replace(/#855cd6/gi,Recolor.primary):qy;return\"data:image/svg+xml;,\"+encodeURIComponent(e)};const Xy='';var Ky=()=>{const e=\"object\"==typeof Recolor?Xy.replace(/#855cd6/gi,Recolor.primary):Xy;return\"data:image/svg+xml;,\"+encodeURIComponent(e)};const $y=[\"accountNavOpen\",\"activeTabIndex\",\"alertsVisible\",\"authorId\",\"authorThumbnailUrl\",\"authorUsername\",\"basePath\",\"backdropLibraryVisible\",\"backpackHost\",\"backpackVisible\",\"blocksId\",\"blocksTabVisible\",\"cardsVisible\",\"canChangeLanguage\",\"canChangeTheme\",\"canCreateNew\",\"canEditTitle\",\"canManageFiles\",\"canRemix\",\"canSave\",\"canCreateCopy\",\"canShare\",\"canUseCloud\",\"children\",\"connectionModalVisible\",\"costumeLibraryVisible\",\"costumesTabVisible\",\"customStageSize\",\"enableCommunity\",\"intl\",\"isCreating\",\"isEmbedded\",\"isFullScreen\",\"isPlayerOnly\",\"isRtl\",\"isShared\",\"isWindowFullScreen\",\"isTelemetryEnabled\",\"isTotallyNormal\",\"loading\",\"logo\",\"renderLogin\",\"onClickAbout\",\"onClickAccountNav\",\"onCloseAccountNav\",\"onClickAddonSettings\",\"onClickDesktopSettings\",\"onClickNewWindow\",\"onClickPackager\",\"onLogOut\",\"onOpenRegistration\",\"onToggleLoginOpen\",\"onActivateCostumesTab\",\"onActivateSoundsTab\",\"onActivateTab\",\"onClickLogo\",\"onExtensionButtonClick\",\"onOpenCustomExtensionModal\",\"onProjectTelemetryEvent\",\"onRequestCloseBackdropLibrary\",\"onRequestCloseCostumeLibrary\",\"onRequestCloseTelemetryModal\",\"onSeeCommunity\",\"onShare\",\"onShowPrivacyPolicy\",\"onStartSelectingFileUpload\",\"onTelemetryModalCancel\",\"onTelemetryModalOptIn\",\"onTelemetryModalOptOut\",\"securityManager\",\"showComingSoon\",\"showOpenFilePicker\",\"showSaveFilePicker\",\"soundsTabVisible\",\"stageSizeMode\",\"targetIsStage\",\"telemetryModalVisible\",\"theme\",\"tipsLibraryVisible\",\"usernameModalVisible\",\"settingsModalVisible\",\"customExtensionModalVisible\",\"fontsModalVisible\",\"unknownPlatformModalVisible\",\"invalidProjectModalVisible\",\"vm\"];function ek(){return ek=Object.assign?Object.assign.bind():function(e){for(var t=1;t{const e=new URLSearchParams(location.search);return e.has(\"fullscreen-background\")?e.get(\"fullscreen-background\"):window.matchMedia(\"(prefers-color-scheme: dark)\").matches?\"#111\":\"white\"})(),ak=e=>{const t=M()(e,\"dispatch\"),{accountNavOpen:n,activeTabIndex:a,alertsVisible:r,authorId:i,authorThumbnailUrl:s,authorUsername:l,basePath:c,backdropLibraryVisible:d,backpackHost:u,backpackVisible:p,blocksId:g,blocksTabVisible:h,cardsVisible:b,canChangeLanguage:w,canChangeTheme:f,canCreateNew:v,canEditTitle:y,canManageFiles:k,canRemix:j,canSave:I,canCreateCopy:S,canShare:x,canUseCloud:E,children:C,connectionModalVisible:N,costumeLibraryVisible:_,costumesTabVisible:D,customStageSize:T,enableCommunity:O,intl:A,isCreating:P,isEmbedded:z,isFullScreen:L,isPlayerOnly:R,isRtl:U,isShared:B,isWindowFullScreen:G,isTelemetryEnabled:F,isTotallyNormal:Z,loading:W,logo:H,renderLogin:Q,onClickAbout:Y,onClickAccountNav:V,onCloseAccountNav:q,onClickAddonSettings:J,onClickDesktopSettings:X,onClickNewWindow:K,onClickPackager:$,onLogOut:ee,onOpenRegistration:te,onToggleLoginOpen:ne,onActivateCostumesTab:ae,onActivateSoundsTab:oe,onActivateTab:re,onClickLogo:ie,onExtensionButtonClick:se,onOpenCustomExtensionModal:le,onProjectTelemetryEvent:ce,onRequestCloseBackdropLibrary:de,onRequestCloseCostumeLibrary:ue,onRequestCloseTelemetryModal:pe,onSeeCommunity:me,onShare:ge,onShowPrivacyPolicy:he,onStartSelectingFileUpload:be,onTelemetryModalCancel:we,onTelemetryModalOptIn:fe,onTelemetryModalOptOut:Me,securityManager:ve,showComingSoon:ke,showOpenFilePicker:Se,showSaveFilePicker:Ee,soundsTabVisible:Ce,stageSizeMode:Ne,targetIsStage:_e,telemetryModalVisible:De,theme:Te,tipsLibraryVisible:Ae,usernameModalVisible:Pe,settingsModalVisible:ze,customExtensionModalVisible:Le,fontsModalVisible:Re,unknownPlatformModalVisible:Ue,invalidProjectModalVisible:Be,vm:Ge}=t,Fe=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a{const t=((e,t)=>e!==na.e.full||t?e:na.d.constrained)(Ne,e),M=o.a.createElement(o.a.Fragment,null,o.a.createElement(FM,{securityManager:ve}),o.a.createElement(Lv,null),o.a.createElement(Gy,{isEmbedded:z}),Pe&&o.a.createElement(Xw,null),ze&&o.a.createElement(Df,null),Le&&o.a.createElement(ev,null),Re&&o.a.createElement(jy,null),Ue&&o.a.createElement(_y,null),Be&&o.a.createElement(Uy,null));return R?o.a.createElement(o.a.Fragment,null,G?o.a.createElement(\"div\",{className:Wy.a.fullscreenBackground,style:{backgroundColor:nk}}):null,o.a.createElement(Eg,{isFullScreen:L,isEmbedded:z,isRendererSupported:Object(Fy.d)(),isRtl:U,loading:W,stageSize:na.e.full,vm:Ge},r?o.a.createElement(ob,{className:Wy.a.alertsContainer}):null),M):o.a.createElement(Oe.a,ek({className:Wy.a.pageWrapper,dir:U?\"rtl\":\"ltr\",style:{minWidth:1024+Math.max(0,T.width-480),minHeight:640+Math.max(0,T.height-360)}},Fe),M,De?o.a.createElement(Zw,{isRtl:U,isTelemetryEnabled:F,onCancel:we,onOptIn:fe,onOptOut:Me,onRequestClose:pe,onShowPrivacyPolicy:he}):null,W?o.a.createElement(yg,{isFullScreen:!0}):null,P?o.a.createElement(yg,{isFullScreen:!0,messageId:\"gui.loader.creating\"}):null,Object(Fy.b)()?null:o.a.createElement(rh.a,{isRtl:U,onClickDesktopSettings:X}),Ae?o.a.createElement(ph,null):null,b?o.a.createElement(Zh,null):null,r?o.a.createElement(ob,{className:Wy.a.alertsContainer}):null,N?o.a.createElement(Lw,{vm:Ge}):null,_?o.a.createElement(Dg,{vm:Ge,onRequestClose:ue}):null,d?o.a.createElement(Pg,{vm:Ge,onRequestClose:de}):null,o.a.createElement(Cg.a,{accountNavOpen:n,authorId:i,authorThumbnailUrl:s,authorUsername:l,canChangeLanguage:w,canChangeTheme:f,canCreateCopy:S,canCreateNew:v,canEditTitle:y,canManageFiles:k,canRemix:j,canSave:I,canShare:x,className:Wy.a.menuBarPosition,enableCommunity:O,isShared:B,isTotallyNormal:Z,logo:H,renderLogin:Q,showComingSoon:ke,showOpenFilePicker:Se,showSaveFilePicker:Ee,onClickAbout:Y,onClickAccountNav:V,onClickAddonSettings:J,onClickDesktopSettings:X,onClickNewWindow:K,onClickPackager:$,onClickLogo:ie,onCloseAccountNav:q,onLogOut:ee,onOpenRegistration:te,onProjectTelemetryEvent:ce,onSeeCommunity:me,onShare:ge,onStartSelectingFileUpload:be,onToggleLoginOpen:ne}),o.a.createElement(Oe.a,{className:Wy.a.bodyWrapper},o.a.createElement(Oe.a,{className:Wy.a.flexWrapper},o.a.createElement(Oe.a,{className:Wy.a.editorWrapper},o.a.createElement(Ie.d,{forceRenderTabPanel:!0,className:Ze.tabs,selectedIndex:a,selectedTabClassName:Ze.tabSelected,selectedTabPanelClassName:Ze.tabPanelSelected,onSelect:re},o.a.createElement(Ie.b,{className:Ze.tabList},o.a.createElement(Ie.a,{className:Ze.tab},o.a.createElement(\"img\",{draggable:!1,src:Vy()}),o.a.createElement(m.b,{defaultMessage:\"Code\",id:\"gui.gui.codeTab\"})),o.a.createElement(Ie.a,{className:Ze.tab,onClick:ae},o.a.createElement(\"img\",{draggable:!1,src:Jy()}),_e?o.a.createElement(m.b,{defaultMessage:\"Backdrops\",id:\"gui.gui.backdropsTab\"}):o.a.createElement(m.b,{defaultMessage:\"Costumes\",id:\"gui.gui.costumesTab\"})),o.a.createElement(Ie.a,{className:Ze.tab,onClick:oe},o.a.createElement(\"img\",{draggable:!1,src:Ky()}),o.a.createElement(m.b,{defaultMessage:\"Sounds\",id:\"gui.gui.soundsTab\"}))),o.a.createElement(Ie.c,{className:Ze.tabPanel},o.a.createElement(Oe.a,{className:Wy.a.blocksWrapper},o.a.createElement(Fa,{key:\"\".concat(g,\"/\").concat(Te.id),canUseCloud:E,grow:1,isVisible:h,options:{media:\"\".concat(c,\"static/\").concat(Te.getBlocksMediaFolder(),\"/\")},stageSize:t,onOpenCustomExtensionModal:le,theme:Te,vm:Ge})),o.a.createElement(Oe.a,{className:Wy.a.extensionButtonContainer},o.a.createElement(\"button\",{className:Wy.a.extensionButton,title:A.formatMessage(tk.addExtension),onClick:se},o.a.createElement(\"img\",{className:Wy.a.extensionButtonIcon,draggable:!1,src:Qy.a}))),o.a.createElement(Oe.a,{className:Wy.a.watermark},o.a.createElement(Zg,null))),o.a.createElement(Ie.c,{className:Ze.tabPanel},D?o.a.createElement(Or,{vm:Ge}):null),o.a.createElement(Ie.c,{className:Ze.tabPanel},Ce?o.a.createElement(Yd,{vm:Ge}):null)),p?o.a.createElement(oh,{host:u}):null),o.a.createElement(Oe.a,{className:ye()(Wy.a.stageAndTargetWrapper,Wy.a[t])},o.a.createElement(Eg,{isFullScreen:L,isRendererSupported:Object(Fy.d)(),isRtl:U,stageSize:t,vm:Ge}),o.a.createElement(Oe.a,{className:Wy.a.targetWrapper},o.a.createElement(il,{stageSize:t,vm:Ge}))))),o.a.createElement(cb,null))}))};ak.propTypes={accountNavOpen:i.a.bool,activeTabIndex:i.a.number,authorId:i.a.oneOfType([i.a.string,i.a.bool]),authorThumbnailUrl:i.a.string,authorUsername:i.a.oneOfType([i.a.string,i.a.bool]),backdropLibraryVisible:i.a.bool,backpackHost:i.a.string,backpackVisible:i.a.bool,basePath:i.a.string,blocksTabVisible:i.a.bool,blocksId:i.a.string,canChangeLanguage:i.a.bool,canChangeTheme:i.a.bool,canCreateCopy:i.a.bool,canCreateNew:i.a.bool,canEditTitle:i.a.bool,canManageFiles:i.a.bool,canRemix:i.a.bool,canSave:i.a.bool,canShare:i.a.bool,canUseCloud:i.a.bool,cardsVisible:i.a.bool,children:i.a.node,costumeLibraryVisible:i.a.bool,costumesTabVisible:i.a.bool,customStageSize:i.a.shape({width:i.a.number,height:i.a.number}),enableCommunity:i.a.bool,intl:m.i.isRequired,isCreating:i.a.bool,isEmbedded:i.a.bool,isFullScreen:i.a.bool,isPlayerOnly:i.a.bool,isRtl:i.a.bool,isShared:i.a.bool,isWindowFullScreen:i.a.bool,isTotallyNormal:i.a.bool,loading:i.a.bool,logo:i.a.string,onActivateCostumesTab:i.a.func,onActivateSoundsTab:i.a.func,onActivateTab:i.a.func,onClickAccountNav:i.a.func,onClickAddonSettings:i.a.func,onClickDesktopSettings:i.a.func,onClickNewWindow:i.a.func,onClickPackager:i.a.func,onClickLogo:i.a.func,onCloseAccountNav:i.a.func,onExtensionButtonClick:i.a.func,onOpenCustomExtensionModal:i.a.func,onLogOut:i.a.func,onOpenRegistration:i.a.func,onRequestCloseBackdropLibrary:i.a.func,onRequestCloseCostumeLibrary:i.a.func,onRequestCloseTelemetryModal:i.a.func,onSeeCommunity:i.a.func,onShare:i.a.func,onShowPrivacyPolicy:i.a.func,onStartSelectingFileUpload:i.a.func,onTabSelect:i.a.func,onTelemetryModalCancel:i.a.func,onTelemetryModalOptIn:i.a.func,onTelemetryModalOptOut:i.a.func,onToggleLoginOpen:i.a.func,renderLogin:i.a.func,securityManager:i.a.shape({}),showComingSoon:i.a.bool,showOpenFilePicker:i.a.func,showSaveFilePicker:i.a.func,soundsTabVisible:i.a.bool,stageSizeMode:i.a.oneOf(Object.keys(na.e)),targetIsStage:i.a.bool,telemetryModalVisible:i.a.bool,theme:i.a.instanceOf(da.m),tipsLibraryVisible:i.a.bool,usernameModalVisible:i.a.bool,settingsModalVisible:i.a.bool,customExtensionModalVisible:i.a.bool,fontsModalVisible:i.a.bool,unknownPlatformModalVisible:i.a.bool,invalidProjectModalVisible:i.a.bool,vm:i.a.instanceOf(p.a).isRequired},ak.defaultProps={backpackHost:null,backpackVisible:!1,basePath:\"./\",blocksId:\"original\",canChangeLanguage:!0,canChangeTheme:!0,canCreateNew:!1,canEditTitle:!1,canManageFiles:!0,canRemix:!1,canSave:!1,canCreateCopy:!1,canShare:!1,canUseCloud:!1,enableCommunity:!1,isCreating:!1,isShared:!1,isTotallyNormal:!1,loading:!1,showComingSoon:!1,stageSizeMode:na.e.large};var ok=Object(m.h)(Object(l.b)((e=>({customStageSize:e.scratchGui.customStageSize,isWindowFullScreen:e.scratchGui.tw.isWindowFullScreen,blocksId:e.scratchGui.timeTravel.year.toString(),stageSizeMode:e.scratchGui.stageSize.stageSize,theme:e.scratchGui.theme.theme})))(ak));const rk=[\"onSetDimensions\",\"isFullScreen\"];var ik=n(214),sk=n(78),lk=n(80);const ck=[\"reduxTheme\",\"onChangeTheme\"];var dk=function(e){class t extends o.a.Component{constructor(e){super(e),E()(this,[\"handleSystemThemeChange\"]),Object(ik.a)(e.reduxTheme)}componentDidMount(){this.removeListeners=Object(sk.b)(this.handleSystemThemeChange)}componentDidUpdate(e){e.reduxTheme!==this.props.reduxTheme&&Object(ik.a)(this.props.reduxTheme)}componentWillUnmount(){this.removeListeners()}handleSystemThemeChange(){let e=Object(sk.a)();this.props.reduxTheme.blocks===da.f&&(e=e.set(\"blocks\",da.f)),this.props.onChangeTheme(e)}render(){const t=this.props,{reduxTheme:n,onChangeTheme:a}=t,r=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a({reduxTheme:t.theme||e.scratchGui.theme.theme})),(e=>({onChangeTheme:t=>e(Object(lk.b)(t))})))(t)};const uk=[\"assetHost\",\"cloudHost\",\"error\",\"isError\",\"isScratchDesktop\",\"isShowingProject\",\"onProjectLoaded\",\"onStorageInit\",\"onUpdateProjectId\",\"onVmInit\",\"projectHost\",\"projectId\",\"children\",\"fetchingProject\",\"isLoading\",\"loadingStateVisible\"];function pk(){return pk=Object.assign?Object.assign.bind():function(e){for(var t=1;t{e&&\"0\"!==e?gk(mk.ProjectId,e):hk(mk.ProjectId)};class wk extends o.a.Component{componentDidMount(){Object(qe.d)(this.props.isScratchDesktop),this.props.onStorageInit(_.a),this.props.onVmInit(this.props.vm),bk(this.props.projectId)}componentDidUpdate(e){this.props.projectId!==e.projectId&&(null!==this.props.projectId&&this.props.onUpdateProjectId(this.props.projectId),bk(this.props.projectId)),this.props.isShowingProject&&!e.isShowingProject&&this.props.onProjectLoaded()}render(){if(this.props.isError)throw this.props.error;const e=this.props,{assetHost:t,cloudHost:n,error:a,isError:r,isScratchDesktop:i,isShowingProject:s,onProjectLoaded:l,onStorageInit:c,onUpdateProjectId:d,onVmInit:u,projectHost:p,projectId:m,children:g,fetchingProject:h,isLoading:b,loadingStateVisible:w}=e,f=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;ae.addOfficialScratchWebStores(),onProjectLoaded:()=>{},onUpdateProjectId:()=>{},onVmInit:()=>{}};const fk=Object(m.h)(Object(l.b)((e=>{const t=e.scratchGui.projectState.loadingState;return{activeTabIndex:e.scratchGui.editorTab.activeTabIndex,alertsVisible:e.scratchGui.alerts.visible,backdropLibraryVisible:e.scratchGui.modals.backdropLibrary,blocksTabVisible:e.scratchGui.editorTab.activeTabIndex===b.a,cardsVisible:e.scratchGui.cards.visible,connectionModalVisible:e.scratchGui.modals.connectionModal,costumeLibraryVisible:e.scratchGui.modals.costumeLibrary,costumesTabVisible:e.scratchGui.editorTab.activeTabIndex===b.b,error:e.scratchGui.projectState.error,isError:Object(h.k)(t),isEmbedded:e.scratchGui.mode.isEmbedded,isFullScreen:e.scratchGui.mode.isFullScreen||e.scratchGui.mode.isEmbedded,isPlayerOnly:e.scratchGui.mode.isPlayerOnly,isRtl:e.locales.isRtl,isShowingProject:Object(h.r)(t),loadingStateVisible:e.scratchGui.modals.loadingProject,projectId:e.scratchGui.projectState.projectId,soundsTabVisible:e.scratchGui.editorTab.activeTabIndex===b.c,targetIsStage:e.scratchGui.targets.stage&&e.scratchGui.targets.stage.id===e.scratchGui.targets.editingTarget,telemetryModalVisible:e.scratchGui.modals.telemetryModal,tipsLibraryVisible:e.scratchGui.modals.tipsLibrary,usernameModalVisible:e.scratchGui.modals.usernameModal,settingsModalVisible:e.scratchGui.modals.settingsModal,customExtensionModalVisible:e.scratchGui.modals.customExtensionModal,fontsModalVisible:e.scratchGui.modals.fontsModal,unknownPlatformModalVisible:e.scratchGui.modals.unknownPlatformModal,invalidProjectModalVisible:e.scratchGui.modals.invalidProjectModal,vm:e.scratchGui.vm}}),(e=>({onExtensionButtonClick:()=>e(Object(w.x)()),onActivateTab:t=>e(Object(b.d)(t)),onActivateCostumesTab:()=>e(Object(b.d)(b.b)),onActivateSoundsTab:()=>e(Object(b.d)(b.c)),onRequestCloseBackdropLibrary:()=>e(Object(w.a)()),onRequestCloseCostumeLibrary:()=>e(Object(w.c)()),onRequestCloseTelemetryModal:()=>e(Object(w.n)())})))(wk)),Mk=Object(s.d)(I,Object(g.a)(\"Top Level App\"),dk,(function(e){class t extends o.a.Component{constructor(e){super(e),E()(this,[\"handleResize\"])}componentDidMount(){window.addEventListener(\"resize\",this.handleResize)}componentWillUnmount(){window.removeEventListener(\"resize\",this.handleResize)}handleResize(){this.props.isFullScreen&&this.props.onSetDimensions([window.innerWidth,window.innerHeight])}render(){const t=this.props,{onSetDimensions:n,isFullScreen:a}=t,r=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a({isFullScreen:e.scratchGui.mode.isFullScreen||e.scratchGui.mode.isEmbedded})),(e=>({onSetDimensions:t=>e(Object($.i)(t))})))(t)}),(function(e){class t extends o.a.Component{componentDidMount(){this.props.fontsLoaded||Object(y.loadFonts)().then((()=>this.props.onSetFontsLoaded()))}render(){const t=M()(this.props,[\"onSetFontsLoaded\"]);return o.a.createElement(e,t)}}t.propTypes={fontsLoaded:i.a.bool.isRequired,onSetFontsLoaded:i.a.func.isRequired};return Object(l.b)((e=>({fontsLoaded:e.scratchGui.fontsLoaded})),(e=>({onSetFontsLoaded:()=>e(Object(v.c)())})))(t)}),(function(e){class t extends o.a.Component{constructor(e){super(e),E()(this,[\"fetchProject\"]),_.a.setProjectHost(e.projectHost),_.a.setProjectToken(e.projectToken),_.a.setAssetHost(e.assetHost),_.a.setTranslatorFunction(e.intl.formatMessage),\"\"!==e.projectId&&null!==e.projectId&&void 0!==e.projectId&&this.props.setProjectId(e.projectId.toString())}componentDidUpdate(e){e.projectHost!==this.props.projectHost&&_.a.setProjectHost(this.props.projectHost),e.projectToken!==this.props.projectToken&&_.a.setProjectToken(this.props.projectToken),e.assetHost!==this.props.assetHost&&_.a.setAssetHost(this.props.assetHost),this.props.isFetchingWithId&&!e.isFetchingWithId&&this.fetchProject(this.props.reduxProjectId,this.props.loadingState),this.props.isShowingProject&&!e.isShowingProject&&this.props.onProjectUnchanged(),this.props.isShowingProject&&(e.isLoadingProject||e.isCreatingNew)&&this.props.onActivateTab(b.a)}fetchProject(e,t){let n;this.props.vm.clear(),this.props.vm.quit();let a=\"undefined\"==typeof URLSearchParams?null:new URLSearchParams(location.search).get(\"project_url\");return a?(a.startsWith(\"http:\")||a.startsWith(\"https:\")||a.startsWith(\"data:\")||(a=\"https://\".concat(a)),n=fetch(a).then((e=>{if(!e.ok)throw new Error(\"Request returned status \".concat(e.status));return e.arrayBuffer()})).then((e=>({data:e})))):n=(async e=>{if(\"0\"===e)return null;const t=new URLSearchParams(location.search);if(t.has(\"token\"))return t.get(\"token\");const n=new URLSearchParams(location.hash.split(\"?\")[1]);if(n.has(\"token\"))return n.get(\"token\");try{return(await Object(D.b)(e)).project_token}catch(e){throw N.default.error(e),new Error(\"Cannot access project token. Project is probably unshared. See https://docs.turbowarp.org/unshared-projects\")}})(e).then((t=>(_.a.setProjectToken(t),_.a.load(_.a.AssetType.Project,e,_.a.DataFormat.JSON)))),n.then((e=>{if(!e)throw new Error(\"Could not find project\");this.props.onFetchedProjectData(e.data,t)})).catch((e=>{this.props.onError(e),N.default.error(e)}))}render(){const t=this.props,{assetHost:n,intl:a,isLoadingProject:r,loadingState:i,onActivateTab:s,onError:l,onFetchedProjectData:c,onProjectUnchanged:d,projectHost:u,projectId:p,reduxProjectId:m,setProjectId:g,isFetchingWithId:h}=t,b=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a({isCreatingNew:Object(h.j)(e.scratchGui.projectState.loadingState),isFetchingWithId:Object(h.l)(e.scratchGui.projectState.loadingState),isLoadingProject:Object(h.m)(e.scratchGui.projectState.loadingState),isShowingProject:Object(h.r)(e.scratchGui.projectState.loadingState),loadingState:e.scratchGui.projectState.loadingState,reduxProjectId:e.scratchGui.projectState.projectId,vm:e.scratchGui.vm})),(e=>({onActivateTab:t=>e(Object(b.d)(t)),onError:t=>e(Object(h.y)(t)),onFetchedProjectData:(t,n)=>e(Object(h.w)(t,n)),setProjectId:t=>e(Object(h.E)(t)),onProjectUnchanged:()=>e(Object(C.d)())})),((e,t,n)=>Object.assign({},e,t,n)))(t))}),(function(e){class t extends o.a.Component{componentDidMount(){this.handleReceivedProjectTitle(this.props.projectTitle)}componentDidUpdate(e){if(this.props.projectTitle!==e.projectTitle&&this.handleReceivedProjectTitle(this.props.projectTitle),this.props.isShowingWithoutId&&e.isAnyCreatingNewState){const e=this.handleReceivedProjectTitle();this.props.onUpdateProjectTitle(e,!0)}if(this.props.reduxProjectTitle!==e.reduxProjectTitle&&this.props.reduxProjectTitle!==this.props.projectTitle){const e=this.props.intl.formatMessage(z.defaultProjectTitle);this.props.onUpdateProjectTitle(this.props.reduxProjectTitle,this.props.reduxProjectTitle===e)}}handleReceivedProjectTitle(e){let t=e,n=!1;return null==t&&(t=this.props.intl.formatMessage(z.defaultProjectTitle),n=!0),this.props.onChangedProjectTitle(t,n),t}render(){const t=this.props,{intl:n,isAnyCreatingNewState:a,isShowingWithoutId:r,onChangedProjectTitle:i,onUpdateProjectTitle:s,projectTitle:l,reduxProjectTitle:c}=t,d=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a{}};return Object(m.h)(Object(l.b)((e=>{const t=e.scratchGui.projectState.loadingState;return{isAnyCreatingNewState:Object(h.h)(t),isShowingWithoutId:Object(h.t)(t),reduxProjectTitle:e.scratchGui.projectTitle}}),(e=>({onChangedProjectTitle:t=>e(Object(A.c)(t))})))(t))}),(function(e){class t extends o.a.Component{constructor(e){super(e),E()(this,[\"getProjectThumbnail\",\"leavePageConfirm\",\"tryToAutoSave\"])}componentWillMount(){\"object\"==typeof window&&(window.onbeforeunload=e=>this.leavePageConfirm(e)),this.props.onSetProjectThumbnailer(this.getProjectThumbnail),this.props.onSetProjectSaver(this.tryToAutoSave)}componentDidUpdate(e){if(!this.props.isAnyCreatingNewState&&e.isAnyCreatingNewState&&this.reportTelemetryEvent(\"projectWasCreated\"),!this.props.isLoading&&e.isLoading&&this.reportTelemetryEvent(\"projectDidLoad\"),this.props.projectChanged&&!e.projectChanged&&this.scheduleAutoSave(),this.props.isUpdating&&!e.isUpdating&&this.updateProjectToStorage(),this.props.isCreatingNew&&!e.isCreatingNew&&this.createNewProjectToStorage(),this.props.isCreatingCopy&&!e.isCreatingCopy&&this.createCopyToStorage(),this.props.isRemixing&&!e.isRemixing?(this.props.onRemixing(!0),this.createRemixToStorage()):!this.props.isRemixing&&e.isRemixing&&this.props.onRemixing(!1),e.isCreatingNew)return;if(this.isShowingCreatable(this.props)&&!this.isShowingCreatable(e)&&this.props.onCreateProject(),e.isUpdating)return;const t=this.props.canSave&&!e.canSave,n=this.props.isShared&&!e.isShared;this.props.isShowingSaveable&&(t||n)&&this.props.onAutoUpdateProject()}componentWillUnmount(){this.clearAutoSaveTimeout(),this.props.onSetProjectThumbnailer(null),this.props.onSetProjectSaver(null)}leavePageConfirm(e){if(this.props.projectChanged)return(e||window.event).returnValue=!0,!0}clearAutoSaveTimeout(){null!==this.props.autoSaveTimeoutId&&(clearTimeout(this.props.autoSaveTimeoutId),this.props.setAutoSaveTimeoutId(null))}scheduleAutoSave(){if(this.props.isShowingSaveable&&null===this.props.autoSaveTimeoutId){const e=setTimeout(this.tryToAutoSave,1e3*this.props.autoSaveIntervalSecs);this.props.setAutoSaveTimeoutId(e)}}tryToAutoSave(){this.props.projectChanged&&this.props.isShowingSaveable&&this.props.onAutoUpdateProject()}isShowingCreatable(e){return e.canCreateNew&&e.isShowingWithoutId}updateProjectToStorage(){return this.props.onShowSavingAlert(),this.storeProject(this.props.reduxProjectId).then((()=>{this.props.onUpdatedProject(this.props.loadingState),this.props.onShowSaveSuccessAlert()})).catch((e=>{this.props.onShowAlert(\"savingError\"),this.props.onProjectError(e)}))}createNewProjectToStorage(){return this.storeProject(null).then((e=>{this.props.onCreatedProject(e.id.toString(),this.props.loadingState)})).catch((e=>{this.props.onShowAlert(\"creatingError\"),this.props.onProjectError(e)}))}createCopyToStorage(){return this.props.onShowCreatingCopyAlert(),this.storeProject(null,{originalId:this.props.reduxProjectId,isCopy:1,title:this.props.reduxProjectTitle}).then((e=>{this.props.onCreatedProject(e.id.toString(),this.props.loadingState),this.props.onShowCopySuccessAlert()})).catch((e=>{this.props.onShowAlert(\"creatingError\"),this.props.onProjectError(e)}))}createRemixToStorage(){return this.props.onShowCreatingRemixAlert(),this.storeProject(null,{originalId:this.props.reduxProjectId,isRemix:1,title:this.props.reduxProjectTitle}).then((e=>{this.props.onCreatedProject(e.id.toString(),this.props.loadingState),this.props.onShowRemixSuccessAlert()})).catch((e=>{this.props.onShowAlert(\"creatingError\"),this.props.onProjectError(e)}))}storeProject(e,t){t=t||{},this.clearAutoSaveTimeout();const n=this.props.vm.toJSON();return Promise.all(this.props.vm.assets.filter((e=>!e.clean)).map((e=>_.a.store(e.assetType,e.dataFormat,e.data,e.assetId).then((t=>{if(\"ok\"!==t.status)return Promise.reject(t.code);e.clean=!0}))))).then((()=>this.props.onUpdateProjectData(e,n,t))).then((e=>{this.props.onSetProjectUnchanged();const t=e.id.toString();return t&&this.props.onUpdateProjectThumbnail&&this.storeProjectThumbnail(t),this.reportTelemetryEvent(\"projectDidSave\"),e})).catch((e=>{throw N.default.error(e),e}))}storeProjectThumbnail(e){try{this.getProjectThumbnail((t=>{this.props.onUpdateProjectThumbnail(e,Object(R.a)(t))}))}catch(e){N.default.error(\"Project thumbnail save error\",e)}}getProjectThumbnail(e){this.props.vm.postIOData(\"video\",{forceTransparentPreview:!0}),this.props.vm.renderer.requestSnapshot((t=>{this.props.vm.postIOData(\"video\",{forceTransparentPreview:!1}),e(t)})),this.props.vm.renderer.draw()}reportTelemetryEvent(e){try{if(this.props.onProjectTelemetryEvent){const t=Object(L.a)(this.props.vm,this.props.reduxProjectTitle,this.props.locale);this.props.onProjectTelemetryEvent(e,t)}}catch(t){N.default.error(\"Telemetry error\",e,t)}}render(){const t=this.props,{autoSaveTimeoutId:n,autoSaveIntervalSecs:a,isCreatingCopy:r,isCreatingNew:i,projectChanged:s,isAnyCreatingNewState:l,isLoading:c,isManualUpdating:d,isRemixing:u,isShowingSaveable:p,isShowingWithId:m,isShowingWithoutId:g,isUpdating:h,loadingState:b,onAutoUpdateProject:w,onCreatedProject:f,onCreateProject:M,onProjectError:v,onRemixing:y,onSetProjectUnchanged:k,onSetProjectThumbnailer:j,onSetProjectSaver:I,onShowAlert:S,onShowCopySuccessAlert:x,onShowRemixSuccessAlert:E,onShowCreatingCopyAlert:C,onShowCreatingRemixAlert:N,onShowSaveSuccessAlert:_,onShowSavingAlert:D,onUpdatedProject:T,onUpdateProjectData:O,onUpdateProjectThumbnail:A,reduxProjectId:P,reduxProjectTitle:z,setAutoSaveTimeoutId:L}=t,R=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a{},onSetProjectThumbnailer:()=>{},onSetProjectSaver:()=>{},onUpdateProjectData:Z};return Object(l.b)(((e,t)=>{const n=e.scratchGui.projectState.loadingState,a=Object(h.s)(n);return{autoSaveTimeoutId:e.scratchGui.timeout.autoSaveTimeoutId,isAnyCreatingNewState:Object(h.h)(n),isLoading:Object(h.m)(n),isCreatingCopy:Object(h.i)(n),isCreatingNew:Object(h.j)(n),isRemixing:Object(h.q)(n),isShowingSaveable:t.canSave&&a,isShowingWithId:a,isShowingWithoutId:Object(h.t)(n),isUpdating:Object(h.u)(n),isManualUpdating:Object(h.p)(n),loadingState:n,locale:e.locales.locale,projectChanged:e.scratchGui.projectChanged,reduxProjectId:e.scratchGui.projectState.projectId,reduxProjectTitle:e.scratchGui.projectTitle,vm:e.scratchGui.vm}}),(e=>({onAutoUpdateProject:()=>e(Object(h.b)()),onCreatedProject:(t,n)=>e(Object(h.f)(t,n)),onCreateProject:()=>e(Object(h.c)()),onProjectError:t=>e(Object(h.y)(t)),onSetProjectUnchanged:()=>e(Object(C.d)()),onShowAlert:t=>e(Object(W.i)(t)),onShowCopySuccessAlert:()=>Object(W.g)(e,\"createCopySuccess\"),onShowRemixSuccessAlert:()=>Object(W.g)(e,\"createRemixSuccess\"),onShowCreatingCopyAlert:()=>Object(W.g)(e,\"creatingCopy\"),onShowCreatingRemixAlert:()=>Object(W.g)(e,\"creatingRemix\"),onShowSaveSuccessAlert:()=>Object(W.g)(e,\"saveSuccess\"),onShowSavingAlert:()=>Object(W.g)(e,\"saving\"),onUpdatedProject:t=>e(Object(h.g)(t)),setAutoSaveTimeoutId:t=>e(Object(H.b)(t))})),((e,t,n)=>Object.assign({},e,t,n)))(t)}),ie,pe,S.a,Me)(fk);Mk.setAppElement=d.a.setAppElement;var vk=Mk;function yk(){return yk=Object.assign?Object.assign.bind():function(e){for(var t=1;to.a.createElement(vk,yk({cloudHost:kk,canUseCloud:!0,hasCloudPermission:!0,canSave:!1,basePath:\"\",canEditTitle:!0,enableCommunity:!0},e))},,,function(e,t,n){var a=n(577);\"string\"==typeof a&&(a=[[e.i,a,\"\"]]);var o={hmr:!0,transform:undefined,insertInto:void 0};n(10)(a,o);a.locals&&(e.exports=a.locals)},,,,,,,,,,,,,,,,,,,,function(e,t,n){(function(t){var n=\"object\"==typeof t&&t&&t.Object===Object&&t;e.exports=n}).call(this,n(151))},function(e,t){e.exports=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgd2lkdGg9IjQwcHgiIGhlaWdodD0iNDBweCIgdmlld0JveD0iMCAwIDQwIDQwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KICAgIDwhLS0gR2VuZXJhdG9yOiBTa2V0Y2ggNTIuNSAoNjc0NjkpIC0gaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoIC0tPg0KICAgIDx0aXRsZT5FeHRlbnNpb25zL1NvZnR3YXJlL0Nsb3VkLURhdGEtQmxvY2s8L3RpdGxlPg0KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPg0KICAgIDxnIGlkPSJFeHRlbnNpb25zL1NvZnR3YXJlL0Nsb3VkLURhdGEtQmxvY2siIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZS1vcGFjaXR5PSIwLjE1Ij4NCiAgICAgICAgPHBhdGggZD0iTTguNzkzMTg2MTYsMjguMTE1MTYzOCBMMzEuNjg3Njk4OSwyOC4xMTUxNjM4IEMzMy43ODcyNjI4LDI4LjExNTE2MzggMzUuNSwyNi4zNjc4MTIgMzUuNSwyNC4yMDU3NjcgQzM1LjUsMjIuMDQ1NzY1NiAzMy43ODYxMjA1LDIwLjI5NjM3MDIgMzEuNjg3Njk4OSwyMC4yOTYzNzAyIEMzMS4wOTQ5MTUxLDIwLjI5NjM3MDIgMzAuNTI4OTI3NSwyMC40MzQ0Njg1IDMwLjAwOTU3NTMsMjAuNjk4NTQwNSBMMjkuMTQ5MDI4LDIxLjEzNjA5OCBMMjkuMjg4MTc2NiwyMC4xODA3NzgzIEMyOS4yOTQ2MDc1LDIwLjEzNjYyNzIgMjkuMjk4ODQxLDIwLjA5MDUxMzQgMjkuMzAxMzkwMSwyMC4wMzgzODI3IEMyOS4zMDQyNzksMTkuOTc5MzA0NCAyOS4zMDQ4ODUyLDE5LjkyOTA5MzEgMjkuMzA0ODg1MiwxOS44MDc1ODE5IEMyOS4zMDQ4ODUyLDE1LjIxNDI1NjMgMjUuNjczMzMwMSwxMS41IDIxLjE5MTI0NzcsMTEuNSBDMTguNzMzNjgxMSwxMS41IDE2LjQ1NDAxODYsMTIuNjI3NjEzIDE0LjkxOTE5OCwxNC41Mzg4MzY0IEwxNC42Mzk1NDc3LDE0Ljg4NzA2ODggTDE0LjI2MjA4NDMsMTQuNjQ4MzQgQzEzLjc1NzcwNDYsMTQuMzI5MzQyMyAxMy4xODQ2NDY5LDE0LjE2MTk3NTEgMTIuNTc3NjEwMywxNC4xNjE5NzUxIEMxMC43Njk2MTk2LDE0LjE2MTk3NTEgOS4yOTMxODYxNiwxNS42NzIwODMyIDkuMjkzMTg2MTYsMTcuNTMzMjEwOSBDOS4yOTMxODYxNiwxNy45Mjg3NDY3IDkuMzU0NjU2MjcsMTguMjkxMTAyNyA5LjQ3OTM2ODYxLDE4LjYyNTM0MDMgTDkuNzg5NzgwOTEsMTkuNDU3MjY2NCBMOC45MTc0NzM4OCwxOS4yOTEzMjI2IEM4LjkxMjk3MzQxLDE5LjI5MDQ2NjUgOC44OTg3NTIwNSwxOS4yODkxMTYgOC44NzcwODgxNCwxOS4yODgyOTQ0IEM4Ljg1NjI3Mzg4LDE5LjI4NzUwNSA4LjgzOTkzNDc1LDE5LjI4NzM0NyA4Ljc5MzE4NjE2LDE5LjI4NzMxODMgQzYuNDI1NjQ5MzEsMTkuMjg3MzE4MyA0LjUsMjEuMjYzODgzMiA0LjUsMjMuNzAyODQyNyBDNC41LDI2LjE0NzIzNiA2LjQyMTU1NjY1LDI4LjExNTE2MzggOC43OTMxODYxNiwyOC4xMTUxNjM4IFoiIGlkPSJGaWxsLTEiIHN0cm9rZT0iIzAwMDAwMCIgZmlsbD0iIzRENEQ0RCIvPg0KICAgIDwvZz4NCjwvc3ZnPg==\"},function(e,t,n){\"use strict\";var a=n(3),o=n.n(a),r=n(0),i=n.n(r),s=n(1),l=n.n(s),c=n(7),d=n(44),u=n(2),p=n(12),m=n(266),g=n(61),h=n(209),b=n(300),w=n(210),f=n(11);const M=[\"canOpenPackager\"];function v(){return v=Object.assign?Object.assign.bind():function(e){for(var t=1;t{const n=\"\".concat(this.props.reduxProjectTitle,\".sb3\");e.source.postMessage({p4:{type:\"finish-import\",data:t,name:n}},e.origin,[t])})).catch((t=>{f.default.error(t),e.source.postMessage({p4:{type:\"cancel-import\"}},e.origin)})))}render(){const t=this.props,{canOpenPackager:n}=t,a=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a({canOpenPackager:Object(p.r)(e.scratchGui.projectState.loadingState),reduxProjectTitle:e.scratchGui.projectTitle,vm:e.scratchGui.vm})),(()=>({})))(t)};var I=n(146);const S=history.replaceState;history.replaceState=function(){try{for(var e=arguments.length,t=new Array(e),n=0;n({projectId:e.scratchGui.projectState.projectId})),(e=>({setProjectId:t=>Object(P.a)(e,t)})))(L)),U=n(90),B=n.n(U),G=function(e){this.studioId=e,this.offset=0,this.ended=!1,this.loadingPage=!1,this.unusedPlaceholders=[],this.root=document.createElement(\"div\"),this.root.className=B.a.studioviewRoot,this.projectList=document.createElement(\"div\"),this.projectList.className=B.a.studioviewList,this.root.appendChild(this.projectList),\"IntersectionObserver\"in window?(this.intersectionObserver=new IntersectionObserver(this.handleIntersection.bind(this),{root:this.projectList}),this.loadNextPageObserver=new IntersectionObserver(this.handleLoadNextPageIntersection.bind(this),{root:this.projectList})):(this.intersectionObserver=null,this.loadNextPageObserver=null),this.messages={AUTHOR_ATTRIBUTION:\"\",PROJECT_HOVER_TEXT:\"\",LOAD_ERROR:\"\"}};G.prototype.addProject=function(e){var t;this.unusedPlaceholders.length?t=this.unusedPlaceholders.shift():(t=this.createPlaceholder(),this.projectList.appendChild(t)),this.placeholderToProject(t,e.id,e.title,e.author)},G.prototype.createLazyImage=function(e){var t=document.createElement(\"img\");return this.intersectionObserver?(this.intersectionObserver.observe(t),t.dataset.src=e):t.src=e,t},G.prototype.createPlaceholder=function(){var e=document.createElement(\"a\");e.className=o()(B.a.studioviewProject,B.a.studioviewPlaceholder);var t=document.createElement(\"div\");t.className=B.a.studioviewThumbnail;var n=document.createElement(\"div\");n.className=B.a.studioviewTitle;var a=document.createElement(\"div\");return a.className=B.a.studioviewAuthor,e.thumbnailEl=t,e.titleEl=n,e.authorEl=a,e.appendChild(t),e.appendChild(n),e.appendChild(a),e},G.prototype.placeholderToProject=function(e,t,n,a){e.className=o()(B.a.studioviewProject,B.a.studioviewLoaded),e.dataset.id=t,e.dataset.title=n,e.dataset.author=a,e.title=this.messages.PROJECT_HOVER_TEXT.replace(\"$author\",a).replace(\"$title\",n),e.href=G.PROJECT_PAGE.replace(\"$id\",t);var r=G.THUMBNAIL_SRC.replace(\"$id\",t),i=this.createLazyImage(r);return e.thumbnailEl.appendChild(i),e.titleEl.innerText=n,e.authorEl.innerText=this.messages.AUTHOR_ATTRIBUTION.replace(\"$author\",a),e.addEventListener(\"click\",this.handleClick.bind(this),!0),e.addEventListener(\"keydown\",this.handleKeyDown.bind(this),!0),e},G.prototype.addErrorElement=function(){var e=document.createElement(\"div\");e.innerText=this.messages.LOAD_ERROR,e.className=B.a.studioviewError,this.projectList.appendChild(e)},G.prototype.handleLoadNextPageIntersection=function(e){for(var t=0;t({projectId:e.scratchGui.projectState.projectId})),(e=>({setProjectId:t=>Object(P.a)(e,t)})))(V),J=n(172),X=n.n(J),K=n(250),$=n.n(K);const ee=e=>{e=$()(e,/@([\\w-]+)/,((e,t)=>l.a.createElement(\"a\",{href:\"https://scratch.mit.edu/users/\".concat(e,\"/\"),rel:\"noreferrer\",key:e+t},\"@\".concat(e))));return e=$()(e,/(https?:\\/\\/[\\w\\d_\\-.]{1,256}(?:\\/(?:\\S*[\\w:/#[\\]@$&'()*+=])?)?(?![^?!,:;\\w\\s]\\S))/g,((e,t)=>l.a.createElement(\"a\",{href:e,rel:\"noreferrer\",key:e+t},e))),e=$()(e,/#([\\w-]+)/g,((e,t)=>l.a.createElement(\"a\",{href:\"https://scratch.mit.edu/search/projects?q=\".concat(e),key:e+t},\"#\".concat(e))))},te=e=>{let{instructions:t,credits:n,projectId:a}=e;return\"unshared\"!==t&&\"unshared\"!==n&&l.a.createElement(\"div\",{className:X.a.description},l.a.createElement(\"div\",{className:X.a.projectLink},l.a.createElement(\"a\",{href:\"https://scratch.mit.edu/projects/\".concat(a,\"/\"),target:\"_blank\",rel:\"noreferrer\"},l.a.createElement(u.b,{defaultMessage:\"View project on Scratch\",id:\"tw.viewOnScratch\"}))),t?l.a.createElement(\"div\",null,l.a.createElement(\"h2\",{className:X.a.header},l.a.createElement(u.b,{defaultMessage:\"Instructions\",id:\"tw.home.instructions\"})),ee(t)):null,t&&n?l.a.createElement(\"div\",{className:X.a.divider}):null,n&&l.a.createElement(\"div\",null,l.a.createElement(\"h2\",{className:X.a.header},l.a.createElement(u.b,{defaultMessage:\"Notes and Credits\",id:\"tw.home.credit\"})),ee(n)))};te.propTypes={instructions:i.a.string,credits:i.a.string,projectId:i.a.string};var ne=te,ae=n(211),oe=n(23),re=n(425),ie=n.n(re),se=n(144),le=n.n(se);class ce extends l.a.Component{constructor(e){super(e),_()(this,[\"handleClick\"])}handleClick(){this.props.onClick(this.props.cloudHost)}render(){return l.a.createElement(\"button\",{className:o()(le.a.server,{[le.a.selected]:this.props.selected}),onClick:this.handleClick,title:this.props.cloudHost},this.props.name)}}ce.propTypes={cloudHost:i.a.string,name:i.a.string,selected:i.a.bool,onClick:i.a.func};var de=ce,ue=n(24);const pe=[{name:\"US East\",cloudHost:\"wss://clouddata.turbowarp.org\"}],me=e=>{const t=pe.find((t=>t.cloudHost===e.cloudHost));return l.a.createElement(\"div\",{className:le.a.badge},l.a.createElement(\"div\",{className:le.a.title},l.a.createElement(\"img\",{className:le.a.cloudIcon,src:ie.a,alt:\"\",width:32,height:32,draggable:!1}),l.a.createElement(u.b,{defaultMessage:\"This project uses cloud variables.\",id:\"tw.usesCloudVariables\"})),l.a.createElement(u.b,{defaultMessage:\"{APP_NAME}'s cloud variables are not connected to Scratch's. Anyone can {changeTheirUsername} to anything, so beware of impersonation.\",id:\"tw.usesCloudVariables2\",values:{APP_NAME:ue.APP_NAME,changeTheirUsername:l.a.createElement(\"a\",{onClick:e.onOpenChangeUsername},l.a.createElement(u.b,{defaultMessage:\"change their username\",id:\"tw.usesCloudVariables2.change\"}))}}),t&&pe.length>1?l.a.createElement(\"div\",{className:le.a.servers},l.a.createElement(u.b,{defaultMessage:\"Pick a server near you:\",id:\"tw.cloudServers\"}),pe.map((t=>l.a.createElement(de,{key:t.ws,name:t.name,cloudHost:t.cloudHost,selected:e.cloudHost===t.cloudHost,onClick:e.onSetCloudHost})))):t?null:l.a.createElement(u.b,{defaultMessage:\"Using a custom cloud variable server: {server}\",id:\"tw.customCloudServer\",values:{server:e.cloudHost}}),t&&t.provider&&l.a.createElement(u.b,{defaultMessage:\"Server provided by {name}.\",id:\"tw.cloudProvider\",values:{name:l.a.createElement(\"a\",{href:t.provider.href,target:\"_blank\",rel:\"noreferrer\"},t.provider.name)}}),l.a.createElement(\"a\",{target:\"_blank\",rel:\"noreferrer\",href:\"https://docs.turbowarp.org/cloud-variables\"},l.a.createElement(u.b,{defaultMessage:\"Learn more about cloud variables.\",id:\"tw.moreCloud\"})))};me.propTypes={cloudHost:i.a.string,onSetCloudHost:i.a.func,onOpenChangeUsername:i.a.func};var ge=me,he=n(14);class be extends l.a.Component{constructor(e){super(e),_()(this,[\"handleChangeCloudHost\"])}handleChangeCloudHost(e){this.props.onSetCloudHost(e)}render(){return l.a.createElement(ge,{cloudHost:this.props.cloudHost,onSetCloudHost:this.handleChangeCloudHost,onOpenChangeUsername:this.props.onOpenChangeUsername})}}be.propTypes={cloudHost:i.a.string,onSetCloudHost:i.a.func,onOpenChangeUsername:i.a.func};var we=Object(c.b)((e=>({cloudHost:e.scratchGui.tw.cloudHost})),(e=>({onSetCloudHost:t=>e(Object(oe.f)(t)),onOpenChangeUsername:()=>e(Object(he.I)())})))(be),fe=n(95),Me=n(148);n.p;var ve=n(400),ye=n(251),ke=n.n(ye);var je=()=>l.a.createElement(\"div\",{className:ke.a.container},l.a.createElement(\"h1\",null,\"Invalid \".concat(ue.APP_NAME,\" Embed :(\")),l.a.createElement(\"p\",null,\"See \",l.a.createElement(\"a\",{href:\"https://docs.turbowarp.org/embedding\",target:\"_blank\",rel:\"noreferrer\"},\"docs.turbowarp.org/embedding\"),\" for more information. You need to replace the iframe src with the embed page:\"),l.a.createElement(\"p\",{className:ke.a.code},\"https://turbowarp.org//embed\"),l.a.createElement(\"p\",null,\"Here's an example of a full iframe to embed a project:\"),l.a.createElement(\"p\",{className:ke.a.code},''),l.a.createElement(\"p\",null,\"If you are seeing this page even though you aren't embedding anything, let us know on \",l.a.createElement(\"a\",{href:\"https://scratch.mit.edu/users/GarboMuffin/#comments\",target:\"_blank\",rel:\"noreferrer\"},\"scratch.mit.edu/users/GarboMuffin\"),\".\")),Ie=n(48),Se=n.n(Ie);const xe=[\"intl\",\"hasCloudVariables\",\"description\",\"isFullScreen\",\"isLoading\",\"isPlayerOnly\",\"isRtl\",\"projectId\"];function Ee(){return Ee=Object.assign?Object.assign.bind():function(e){for(var t=1;t{const t=\"\".concat(\"\").concat(\"addons.html\").concat(\"string\"==typeof e?\"#\".concat(e):\"\");window.open(t)},_e=Object(u.g)({defaultTitle:{id:\"tw.guiDefaultTitle\",defaultMessage:\"Run Scratch projects faster\"}}),De=Object(d.d)(w.a,j)(C.a);Me.a.reloadChannel&&Me.a.reloadChannel.addEventListener(\"message\",(()=>{location.reload()})),Me.a.changeChannel&&Me.a.changeChannel.addEventListener(\"message\",(e=>{I.a.setStoreWithVersionCheck(e.data)})),Object(ve.a)();const Te=()=>l.a.createElement(\"footer\",{className:Se.a.footer},l.a.createElement(\"div\",{className:Se.a.footerContent},l.a.createElement(\"div\",{className:Se.a.footerText},l.a.createElement(u.b,{defaultMessage:\"{APP_NAME} is not affiliated with Scratch, the Scratch Team, or the Scratch Foundation.\",id:\"tw.footer.disclaimer\",values:{APP_NAME:ue.APP_NAME}})),l.a.createElement(\"div\",{className:Se.a.footerText},l.a.createElement(u.b,{defaultMessage:\"Scratch is a project of the Scratch Foundation. It is available for free at {scratchDotOrg}.\",id:\"tw.footer.scratchDisclaimer\",values:{scratchDotOrg:l.a.createElement(\"a\",{href:\"https://scratch.org/\",target:\"_blank\",rel:\"noreferrer\"},\"https://scratch.org/\")}})),l.a.createElement(\"div\",{className:Se.a.footerColumns},l.a.createElement(\"div\",{className:Se.a.footerSection},l.a.createElement(\"a\",{href:\"credits.html\"},l.a.createElement(u.b,{defaultMessage:\"Credits\",id:\"tw.footer.credits\"}))),l.a.createElement(\"div\",{className:Se.a.footerSection},l.a.createElement(\"a\",{href:\"https://desktop.turbowarp.org/\"},\"TurboWarp Desktop\"),l.a.createElement(\"a\",{href:\"https://packager.turbowarp.org/\"},\"TurboWarp Packager\"),l.a.createElement(\"a\",{href:\"https://docs.turbowarp.org/embedding\"},l.a.createElement(u.b,{defaultMessage:\"Embedding\",id:\"tw.footer.embed\"})),l.a.createElement(\"a\",{href:\"https://docs.turbowarp.org/url-parameters\"},l.a.createElement(u.b,{defaultMessage:\"URL Parameters\",id:\"tw.footer.parameters\"})),l.a.createElement(\"a\",{href:\"https://docs.turbowarp.org/\"},l.a.createElement(u.b,{defaultMessage:\"Documentation\",id:\"tw.footer.documentation\"}))),l.a.createElement(\"div\",{className:Se.a.footerSection},l.a.createElement(\"a\",{href:\"https://scratch.mit.edu/users/GarboMuffin/#comments\"},l.a.createElement(u.b,{defaultMessage:\"Feedback & Bugs\",id:\"tw.feedback\"})),l.a.createElement(\"a\",{href:\"https://github.com/TurboWarp/\"},l.a.createElement(u.b,{defaultMessage:\"Source Code\",id:\"tw.code\"})),l.a.createElement(\"a\",{href:\"privacy.html\"},l.a.createElement(u.b,{defaultMessage:\"Privacy Policy\",id:\"tw.privacy\"}))))));class Oe extends l.a.Component{constructor(e){super(e),this.handleUpdateProjectTitle=this.handleUpdateProjectTitle.bind(this)}componentDidUpdate(e){e.isLoading&&this.props.isLoading}handleUpdateProjectTitle(e,t){document.title=t||!e?\"\".concat(ue.APP_NAME,\" - \").concat(this.props.intl.formatMessage(_e.defaultTitle)):\"\".concat(e,\" - \").concat(ue.APP_NAME)}render(){if(Ce)return l.a.createElement(je,null);const e=this.props,{intl:t,hasCloudVariables:n,description:a,isFullScreen:r,isLoading:i,isPlayerOnly:s,isRtl:c,projectId:d}=e,p=function(e,t){if(null==e)return{};var n,a,o=function(e,t){if(null==e)return{};var n={};for(var a in e)if({}.hasOwnProperty.call(e,a)){if(-1!==t.indexOf(a))continue;n[a]=e[a]}return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a({hasCloudVariables:e.scratchGui.tw.hasCloudVariables,customStageSize:e.scratchGui.customStageSize,description:e.scratchGui.tw.description,isFullScreen:e.scratchGui.mode.isFullScreen,isLoading:Object(p.m)(e.scratchGui.projectState.loadingState),isPlayerOnly:e.scratchGui.mode.isPlayerOnly,isRtl:e.locales.isRtl,projectId:e.scratchGui.projectState.projectId})),(()=>({})))(Oe)),Pe=Object(d.d)(m.a,Object(g.a)(\"TW Interface\"),h.a,b.a,j)(Ae);t.a=Pe},,,,,,,,,,,,function(e,t,n){\"use strict\";n(439),n(440),n(566)},function(e,t,n){0},function(e,t){Blob.prototype.text||(Blob.prototype.text=function(){return new Promise(((e,t)=>{const n=new FileReader;n.onload=()=>e(n.result),n.onerror=()=>t(new Error(\"Cannot read blob as text\")),n.readAsText(this)}))}),Array.prototype.flat||(Array.prototype.flat=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1;const t=[];for(const n of this)if(Array.isArray(n))if(e<1)t.push(n);else for(const a of n.flat(e-1))t.push(a);else t.push(n);return t}),Array.prototype.flatMap||(Array.prototype.flatMap=function(){return this.map(...arguments).flat()}),\"function\"!=typeof queueMicrotask&&(window.queueMicrotask=e=>{Promise.resolve().then(e)}),Object.fromEntries||(Object.fromEntries=function(e){const t={};for(const n of e)t[n[0]]=n[1];return t})},,,,function(e,t,n){e.exports=n.p+\"static/assets/cb3ac3b4a8540f50937a86af7eb4663c.woff2\"},function(e,t,n){e.exports=n.p+\"static/assets/5796214a21c5c1727ed7b08096ee7cff.woff2\"},function(e,t,n){e.exports=n.p+\"static/assets/6cd3397308e11e6d925446470b906f2a.woff2\"},function(e,t,n){e.exports=n.p+\"static/assets/2e6994cc7c70b524c649f60346bdcb3a.woff2\"},function(e,t,n){e.exports=n.p+\"static/assets/208e2134a0e95cbdd211a82d2863d88d.woff2\"},function(e,t,n){e.exports=n.p+\"static/assets/f108ac9d733ce5d45cdea3b7828e8658.woff2\"},function(e,t,n){e.exports=n.p+\"static/assets/75f5f189fdc419824a8134db6eb63881.woff2\"},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\".box_box_tWy-0 {\\n}\\n\",\"\"]),t.locals={box:\"box_box_tWy-0\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* overridden by src/lib/themes/guiHelpers.js */\\n\\n/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\nbody {\\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\\n}\\n\\nh2 {\\n font-size: 1.5rem;\\n font-weight: bold;\\n}\\n\\np {\\n font-size: 1rem;\\n line-height: 1.5em;\\n}\\n\\n.crash-message_crash-wrapper_15SLi {\\n background-color: var(--menu-bar-background);\\n width: 100%;\\n height: 100%;\\n display: flex;\\n justify-content: center;\\n align-items: center;\\n}\\n\\n.crash-message_body_3OO__ {\\n width: 50%;\\n color: white;\\n text-align: center;\\n}\\n\\n/* scratch-www was overriding the colors */\\n\\n.crash-message_body_3OO__ p, .crash-message_body_3OO__ h2 {\\n color: inherit;\\n}\\n\\n.crash-message_reloadButton_35TdL {\\n border: 1px solid var(--motion-primary);\\n border-radius: 0.25rem;\\n padding: 0.5rem 2rem;\\n background: white;\\n color: var(--motion-primary);\\n font-weight: bold;\\n font-size: 0.875rem;\\n cursor: pointer;\\n}\\n\\n.crash-message_header_CnM8i {\\n font-size: 1.5em;\\n font-weight: bold;\\n}\\n\\n.crash-message_error-message_2oNef {\\n white-space: pre-wrap;\\n font-family: monospace;\\n}\\n',\"\"]),t.locals={\"crash-wrapper\":\"crash-message_crash-wrapper_15SLi\",crashWrapper:\"crash-message_crash-wrapper_15SLi\",body:\"crash-message_body_3OO__\",reloadButton:\"crash-message_reloadButton_35TdL\",header:\"crash-message_header_CnM8i\",\"error-message\":\"crash-message_error-message_2oNef\",errorMessage:\"crash-message_error-message_2oNef\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n.button_outlined-button_2f510 {\\n cursor: pointer;\\n border-radius: calc(0.5rem / 2);\\n font-weight: bold;\\n display: flex;\\n flex-direction: row;\\n align-items: center;\\n padding-left: .75rem;\\n padding-right: .75rem;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n\\n.button_icon_JhCuM {\\n height: 1.5rem;\\n}\\n\\n[dir=\"ltr\"] .button_icon_JhCuM {\\n margin-right: .5rem;\\n}\\n\\n[dir=\"rtl\"] .button_icon_JhCuM {\\n margin-left: .5rem;\\n}\\n\\n.button_content_3y79K {\\n white-space: nowrap;\\n}\\n',\"\"]),t.locals={\"outlined-button\":\"button_outlined-button_2f510\",outlinedButton:\"button_outlined-button_2f510\",icon:\"button_icon_JhCuM\",content:\"button_content_3y79K\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* overridden by src/lib/themes/guiHelpers.js */\\n\\n/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n.close-button_close-button_t5jqt {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n\\n overflow: hidden; /* Mask the icon animation */\\n background-color: var(--ui-black-transparent);\\n border-radius: 50%;\\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n cursor: pointer;\\n transition: all 0.15s ease-out;\\n}\\n\\n.close-button_close-button_t5jqt.close-button_large_2cCrv:hover {\\n transform: scale(1.1, 1.1);\\n box-shadow: 0 0 0 4px var(--ui-black-transparent);\\n}\\n\\n.close-button_close-button_t5jqt.close-button_large_2cCrv.close-button_orange_1V-p9:hover {\\n transform: scale(1.1, 1.1);\\n box-shadow: 0px 0px 0px 4px hsla(29, 100%, 54%, 0.2);\\n}\\n\\n.close-button_small_1L9aM {\\n width: 0.825rem;\\n height: 0.825rem;\\n background-color: var(--looks-secondary);\\n color: var(--ui-white);\\n}\\n\\n.close-button_large_2cCrv {\\n width: 1.75rem;\\n height: 1.75rem;\\n box-shadow: 0 0 0 2px var(--ui-black-transparent);\\n}\\n\\n.close-button_large_2cCrv.close-button_orange_1V-p9 {\\n background-color: hsla(29, 100%, 54%, 0.2);\\n box-shadow: 0px 0px 0px 2px hsla(29, 100%, 54%, 0.2);\\n}\\n\\n.close-button_close-icon_ywCI5 {\\n position: relative;\\n margin: 0.25rem;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n transform-origin: 50%;\\n transform: rotate(45deg);\\n}\\n\\n.close-button_close-icon_ywCI5.close-button_orange_1V-p9 {\\n transform: rotate(45deg);\\n transform: scale(1.4);\\n}\\n\\n.close-button_small_1L9aM .close-button_close-icon_ywCI5 {\\n width: 50%;\\n}\\n\\n.close-button_large_2cCrv .close-button_close-icon_ywCI5 {\\n width: 0.75rem;\\n height: 0.75rem;\\n}\\n\\n.close-button_back-icon_1J1uF {\\n position: relative;\\n margin: 0.25rem;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n\\n.close-button_small_1L9aM .close-button_back-icon_1J1uF {\\n width: 50%;\\n}\\n\\n.close-button_large_2cCrv .close-button_back-icon_1J1uF {\\n width: 2rem;\\n height: 2rem;\\n}\\n',\"\"]),t.locals={\"close-button\":\"close-button_close-button_t5jqt\",closeButton:\"close-button_close-button_t5jqt\",large:\"close-button_large_2cCrv\",orange:\"close-button_orange_1V-p9\",small:\"close-button_small_1L9aM\",\"close-icon\":\"close-button_close-icon_ywCI5\",closeIcon:\"close-button_close-icon_ywCI5\",\"back-icon\":\"close-button_back-icon_1J1uF\",backIcon:\"close-button_back-icon_1J1uF\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* overridden by src/lib/themes/guiHelpers.js */\\n\\n/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n/*\\n Contains constants for the z-index values of elements that are part of the global stack context.\\n In other words, z-index values that are \"inside\" a component are not added here.\\n This prevents conflicts between identical z-index values in different components.\\n*/\\n\\n/* Toolbox z-index: 40; set in scratch-blocks */\\n\\n/* tooltips should go over add buttons if they overlap */\\n\\n/* monitors go over add buttons */\\n\\n/* \"ask\" block text input goes above monitors */\\n\\n/* menu-bar should go over monitors, alerts and tutorials */\\n\\n/* behind menu-bar */\\n\\n/* Block drag z-index: 1000; default 50 is overriden in blocks.css */\\n\\n/* so it is draggable into other panes */\\n\\n/* behind modals */\\n\\n/* behind modals */\\n\\n/* in most interfaces, the context menu is always on top */\\n\\n.modal_modal-overlay_2_Dgx {\\n position: fixed;\\n top: 0;\\n left: 0;\\n right: 0;\\n bottom: 0;\\n z-index: 510;\\n background-color: var(--ui-modal-overlay);\\n color: var(--ui-modal-foreground);\\n}\\n\\n.modal_modal-content_3brCX * {\\n box-sizing: border-box;\\n}\\n\\n.modal_modal-content_3brCX {\\n margin: 100px auto;\\n outline: none;\\n border: 4px solid var(--ui-white-transparent);\\n padding: 0;\\n border-radius: 0.5rem;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n\\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\\n overflow: hidden;\\n}\\n\\n.modal_modal-content_3brCX.modal_full-screen_3yXCG {\\n position: absolute;\\n\\n display: flex;\\n height: 100%;\\n width: 100%;\\n\\n overflow-y: auto;\\n -webkit-overflow-scrolling: \\'touch\\';\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n\\n background-color: var(--ui-secondary);\\n\\n /* Default modal resets */\\n margin: 0;\\n border: none;\\n border-radius: 0;\\n}\\n\\n/*\\n Modal header has 3 items:\\n |filter title x|\\n\\n Use the same width for both side item containers,\\n so that title remains centered\\n*/\\n\\n.modal_header_1dNxf {\\n display: flex;\\n flex-direction: row;\\n flex-wrap: nowrap;\\n justify-content: flex-start;\\n height: 3.125rem;\\n\\n box-sizing: border-box;\\n width: 100%;\\n background-color: var(--ui-modal-header-background);\\n color: var(--ui-modal-header-foreground);\\n\\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\\n font-size: 1rem;\\n font-weight: normal;\\n}\\n\\n.modal_header-item_1WbOm {\\n display: flex;\\n align-items: center;\\n padding: 1rem;\\n text-decoration: none;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n\\n[dir=\"ltr\"] .modal_header-image_2c-LK {\\n margin-right: 0.5rem;\\n}\\n\\n[dir=\"rtl\"] .modal_header-image_2c-LK {\\n margin-left: 0.5rem;\\n}\\n\\n.modal_header-item-filter_slKwM {\\n display: flex;\\n flex-basis: 20rem;\\n justify-content: flex-start;\\n}\\n\\n.modal_header-item-title_1N2BE {\\n flex-grow: 1;\\n flex-shrink: 0;\\n justify-content: center;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n letter-spacing: 0.4px;\\n cursor: default;\\n}\\n\\n[dir=\"ltr\"] .modal_header-item-title_1N2BE {\\n margin: 0 -20rem 0 0;\\n}\\n\\n[dir=\"rtl\"] .modal_header-item-title_1N2BE {\\n margin: 0 0 0 -20rem;\\n}\\n\\n.modal_full-screen_3yXCG [dir=\"ltr\"] .modal_header-item-title_1N2BE {\\n margin: 0 0 0 -20rem;\\n}\\n\\n.modal_full-screen_3yXCG [dir=\"rtl\"] .modal_header-item-title_1N2BE {\\n margin: 0 -20rem 0 0;\\n}\\n\\n.modal_header-item-close_4akWi {\\n flex-basis: 20rem;\\n justify-content: flex-end;\\n z-index: 1;\\n}\\n\\n.modal_full-screen_3yXCG .modal_header-item-close_4akWi {\\n order: -1;\\n justify-content: flex-start;\\n}\\n\\n.modal_back-button_3HvWm {\\n font-weight: normal;\\n padding-right: 0;\\n padding-left: 0;\\n}\\n\\n[dir=\"rtl\"] .modal_back-button_3HvWm img {\\n transform: scaleX(-1);\\n}\\n\\n.modal_header-item-help_2F4to {\\n padding: 0;\\n z-index: 1;\\n}\\n\\n[dir=\"ltr\"] .modal_header-item-help_2F4to {\\n margin-right: -4.75rem;\\n}\\n\\n[dir=\"rtl\"] .modal_header-item-help_2F4to {\\n margin-left: -4.75rem;\\n}\\n\\n.modal_help-button_1F4rs {\\n font-weight: normal;\\n font-size: 0.75rem;\\n}\\n\\n[dir=\"ltr\"] .modal_help-button_1F4rs {\\n padding-right: 0;\\n}\\n\\n[dir=\"rtl\"] .modal_help-button_1F4rs {\\n padding-left: 0;\\n}\\n',\"\"]),t.locals={\"modal-overlay\":\"modal_modal-overlay_2_Dgx\",modalOverlay:\"modal_modal-overlay_2_Dgx\",\"modal-content\":\"modal_modal-content_3brCX\",modalContent:\"modal_modal-content_3brCX\",\"full-screen\":\"modal_full-screen_3yXCG\",fullScreen:\"modal_full-screen_3yXCG\",header:\"modal_header_1dNxf\",\"header-item\":\"modal_header-item_1WbOm\",headerItem:\"modal_header-item_1WbOm\",\"header-image\":\"modal_header-image_2c-LK\",headerImage:\"modal_header-image_2c-LK\",\"header-item-filter\":\"modal_header-item-filter_slKwM\",headerItemFilter:\"modal_header-item-filter_slKwM\",\"header-item-title\":\"modal_header-item-title_1N2BE\",headerItemTitle:\"modal_header-item-title_1N2BE\",\"header-item-close\":\"modal_header-item-close_4akWi\",headerItemClose:\"modal_header-item-close_4akWi\",\"back-button\":\"modal_back-button_3HvWm\",backButton:\"modal_back-button_3HvWm\",\"header-item-help\":\"modal_header-item-help_2F4to\",headerItemHelp:\"modal_header-item-help_2F4to\",\"help-button\":\"modal_help-button_1F4rs\",helpButton:\"modal_help-button_1F4rs\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* overridden by src/lib/themes/guiHelpers.js */\\n\\n/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n.prompt_modal-content_35gRS {\\n width: 360px;\\n}\\n\\n.prompt_body_Vgt8G {\\n background: var(--ui-modal-background);\\n padding: 1.5rem 2.25rem;\\n}\\n\\n.prompt_body_Vgt8G input[type=\"checkbox\"],\\n.prompt_body_Vgt8G input[type=\"radio\"] {\\n margin: 3px;\\n}\\n\\n.prompt_label_3jR00 {\\n font-weight: 500;\\n margin: 0 0 0.75rem;\\n}\\n\\n.prompt_disabled-label_fduJB {\\n opacity: 0.5;\\n}\\n\\n.prompt_variable-name-text-input_36E65 {\\n margin-bottom: 1.5rem;\\n width: 100%;\\n border: 1px solid var(--ui-black-transparent);\\n border-radius: 5px;\\n padding: 0 1rem;\\n height: 3rem;\\n color: var(--ui-text-primary-transparent);\\n background-color: var(--input-background);\\n font-size: .875rem;\\n}\\n\\n.prompt_info-message_370zD {\\n font-weight: normal;\\n font-size: .875rem;\\n margin-bottom: 1.5rem;\\n text-align: center;\\n}\\n\\n.prompt_options-row_33OgT {\\n display: flex;\\n font-weight: normal;\\n justify-content: space-between;\\n margin-bottom: 1.5rem;\\n}\\n\\n.prompt_button-row_34Zss {\\n font-weight: bolder;\\n text-align: right;\\n}\\n\\n.prompt_button-row_34Zss button {\\n padding: 0.75rem 1rem;\\n border-radius: 0.25rem;\\n background: white;\\n color: black;\\n border: 1px solid var(--ui-black-transparent);\\n font-weight: 600;\\n font-size: 0.85rem;\\n}\\n\\n.prompt_button-row_34Zss button.prompt_ok-button_1xjNu {\\n background: var(--looks-secondary);\\n border: var(--looks-secondary);\\n color: white;\\n}\\n\\n[dir=\"ltr\"] .prompt_button-row_34Zss button + button {\\n margin-left: 0.5rem;\\n}\\n\\n[dir=\"rtl\"] .prompt_button-row_34Zss button + button {\\n margin-right: 0.5rem;\\n}\\n\\n.prompt_cloud-option_1Fo4I {\\n display:flex;\\n border-top: 1px dashed var(--ui-black-transparent);\\n overflow: visible;\\n padding: 1rem 0;\\n text-align: center;\\n width: 100%;\\n margin: 0 auto;\\n}\\n\\n.prompt_cloud-option-text_2I5zG {\\n opacity: .5;\\n}\\n',\"\"]),t.locals={\"modal-content\":\"prompt_modal-content_35gRS\",modalContent:\"prompt_modal-content_35gRS\",body:\"prompt_body_Vgt8G\",label:\"prompt_label_3jR00\",\"disabled-label\":\"prompt_disabled-label_fduJB\",disabledLabel:\"prompt_disabled-label_fduJB\",\"variable-name-text-input\":\"prompt_variable-name-text-input_36E65\",variableNameTextInput:\"prompt_variable-name-text-input_36E65\",\"info-message\":\"prompt_info-message_370zD\",infoMessage:\"prompt_info-message_370zD\",\"options-row\":\"prompt_options-row_33OgT\",optionsRow:\"prompt_options-row_33OgT\",\"button-row\":\"prompt_button-row_34Zss\",buttonRow:\"prompt_button-row_34Zss\",\"ok-button\":\"prompt_ok-button_1xjNu\",okButton:\"prompt_ok-button_1xjNu\",\"cloud-option\":\"prompt_cloud-option_1Fo4I\",cloudOption:\"prompt_cloud-option_1Fo4I\",\"cloud-option-text\":\"prompt_cloud-option-text_2I5zG\",cloudOptionText:\"prompt_cloud-option-text_2I5zG\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n/* overridden by src/lib/themes/guiHelpers.js */\\n\\n/*\\n Contains constants for the z-index values of elements that are part of the global stack context.\\n In other words, z-index values that are \"inside\" a component are not added here.\\n This prevents conflicts between identical z-index values in different components.\\n*/\\n\\n/* Toolbox z-index: 40; set in scratch-blocks */\\n\\n/* tooltips should go over add buttons if they overlap */\\n\\n/* monitors go over add buttons */\\n\\n/* \"ask\" block text input goes above monitors */\\n\\n/* menu-bar should go over monitors, alerts and tutorials */\\n\\n/* behind menu-bar */\\n\\n/* Block drag z-index: 1000; default 50 is overriden in blocks.css */\\n\\n/* so it is draggable into other panes */\\n\\n/* behind modals */\\n\\n/* behind modals */\\n\\n/* in most interfaces, the context menu is always on top */\\n\\n.blocks_blocks_2LOZ2 {\\n height: 100%;\\n}\\n\\n.blocks_drag-over_QI1Mw:after {\\n content: \\'\\';\\n position: absolute;\\n top: 0;\\n left: 0;\\n width: 100%;\\n height: 100%;\\n opacity: 0.75;\\n background-color: var(--drop-highlight);\\n transition: all 0.25s ease;\\n}\\n\\n.blocks_blocks_2LOZ2 .injectionDiv{\\n position: absolute;\\n top: 0;\\n right: 0;\\n bottom: 0;\\n left: 0;\\n border: 1px solid var(--ui-black-transparent);\\n border-top-right-radius: 0.5rem;\\n border-bottom-right-radius: 0.5rem;\\n}\\n\\n[dir=\"rtl\"] .blocks_blocks_2LOZ2 .injectionDiv {\\n border-top-right-radius: 0;\\n border-bottom-right-radius: 0;\\n border-top-left-radius: 0.5rem;\\n border-bottom-left-radius: 0.5rem;\\n}\\n\\n.blocks_blocks_2LOZ2 .blocklyMainBackground {\\n stroke: none;\\n}\\n\\n.blocks_blocks_2LOZ2 .blocklyToolboxDiv {\\n border-right: 1px solid var(--ui-black-transparent);\\n border-bottom: 1px solid var(--ui-black-transparent);\\n box-sizing: content-box;\\n height: calc(100% - 3.25rem) !important;\\n\\n /*\\n For now, the layout cannot support scrollbars in the category menu.\\n The line below works for Edge, the `::-webkit-scrollbar` line\\n below that is for webkit browsers. It isn\\'t possible to do the\\n same for Firefox, so a different solution may be needed for them.\\n */\\n -ms-overflow-style: none;\\n}\\n\\n[dir=\"rtl\"] .blocks_blocks_2LOZ2 .blocklyToolboxDiv {\\n border-right: none;\\n border-left: 1px solid var(--ui-black-transparent);\\n}\\n\\n.blocks_blocks_2LOZ2 .blocklyToolboxDiv::-webkit-scrollbar {\\n display: none;\\n}\\n\\n.blocks_blocks_2LOZ2 .blocklyFlyout {\\n border-right: 1px solid var(--ui-black-transparent);\\n box-sizing: content-box;\\n}\\n\\n[dir=\"rtl\"] .blocks_blocks_2LOZ2 .blocklyFlyout {\\n border-right: none;\\n border-left: 1px solid var(--ui-black-transparent);\\n}\\n\\n.blocks_blocks_2LOZ2 .blocklyBlockDragSurface {\\n /*\\n Fix an issue where the drag surface was preventing hover events for sharing blocks.\\n This does not prevent user interaction on the blocks themselves.\\n */\\n pointer-events: none;\\n z-index: 1000; /* make blocks match gui drag layer */\\n}\\n\\n/*\\n Shrink category font to fit \"My Blocks\" for now.\\n Probably will need different solutions for language support later, so\\n make the change here instead of in scratch-blocks.\\n*/\\n\\n.blocks_blocks_2LOZ2 .scratchCategoryMenuItemLabel {\\n font-size: 0.65rem;\\n}\\n\\n.blocks_blocks_2LOZ2 .blocklyMinimalBody {\\n min-width: auto;\\n min-height: auto;\\n}\\n',\"\"]),t.locals={blocks:\"blocks_blocks_2LOZ2\",\"drag-over\":\"blocks_drag-over_QI1Mw\",dragOver:\"blocks_drag-over_QI1Mw\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* overridden by src/lib/themes/guiHelpers.js */\\n\\n/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n.play-button_play-button_cXELI {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n\\n overflow: hidden; /* Mask the icon animation */\\n width: 2.5rem;\\n height: 2.5rem;\\n background-color: var(--sound-primary);\\n color: var(--ui-white);\\n border-radius: 50%;\\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n cursor: pointer;\\n transition: all 0.15s ease-out;\\n}\\n\\n.play-button_play-button_cXELI {\\n position: absolute;\\n top: .5rem;\\n z-index: auto;\\n}\\n\\n.play-button_play-button_cXELI:focus {\\n outline: none;\\n}\\n\\n.play-button_play-icon_33XpJ {\\n width: 50%;\\n}\\n\\n[dir=\"ltr\"] .play-button_play-button_cXELI {\\n right: .5rem;\\n}\\n\\n[dir=\"rtl\"] .play-button_play-button_cXELI {\\n left: .5rem;\\n}\\n',\"\"]),t.locals={\"play-button\":\"play-button_play-button_cXELI\",playButton:\"play-button_play-button_cXELI\",\"play-icon\":\"play-button_play-icon_33XpJ\",playIcon:\"play-button_play-icon_33XpJ\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* overridden by src/lib/themes/guiHelpers.js */\\n\\n/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n.library-item_library-item_1nZBu {\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n justify-content: flex-start;\\n flex-basis: 160px;\\n position: relative;\\n height: 160px;\\n max-width: 160px;\\n margin: 0.5rem;\\n padding: 1rem 1rem 0 1rem;\\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\\n color: var(--text-primary);\\n background: var(--ui-white);\\n border-width: 2px;\\n border-style: solid;\\n border-color: var(--ui-black-transparent);\\n border-radius: 0.5rem;\\n text-align: center;\\n cursor: pointer;\\n}\\n\\n.library-item_library-item-extension_wHgEE {\\n align-self: stretch;\\n}\\n\\n.library-item_library-item_1nZBu:hover {\\n border-width: 2px;\\n border-color: var(--looks-secondary);\\n}\\n\\n.library-item_hidden_qWfvV {\\n display: none;\\n}\\n\\n.library-item_disabled_udvIX {\\n opacity: .5;\\n cursor: auto;\\n}\\n\\n.library-item_disabled_udvIX:hover {\\n border-color: var(--ui-black-transparent);\\n}\\n\\n.library-item_library-item-image-container-wrapper_3TFcU {\\n height: 100px;\\n width: 100%;\\n position: relative;\\n}\\n\\n.library-item_library-item-image-container_1VgKJ {\\n position: absolute;\\n height: 100px;\\n width: 100%;\\n}\\n\\n.library-item_library-item-inset-image-container_2oGku {\\n position: relative;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n margin-top: -2.5rem;\\n align-self: flex-start;\\n background-color: var(--pen-primary);\\n width: 3.5rem;\\n height: 3.5rem;\\n border-radius: 0.5rem;\\n border: 0.25rem solid var(--ui-white);\\n}\\n\\n[dir=\"ltr\"] .library-item_library-item-inset-image-container_2oGku {\\n margin-left: 1rem;\\n}\\n\\n[dir=\"rtl\"] .library-item_library-item-inset-image-container_2oGku {\\n margin-right: 1rem;\\n}\\n\\n.library-item_library-item-image_3G7nd {\\n max-width: 100%;\\n max-height: 100%;\\n}\\n\\n.library-item_library-item-inset-image_qk3QS {\\n width: 2.5rem;\\n}\\n\\n.library-item_library-item-name_35ftf {\\n width: 80%;\\n margin: 0.25rem 0;\\n text-align: center;\\n\\n /*\\n For truncating overflowing text gracefully\\n Min-width is for a bug: https://css-tricks.com/flexbox-truncated-text\\n */\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n min-width: 0;\\n}\\n\\n.library-item_featured-item_3dHDW {\\n flex-basis: 300px;\\n max-width: 300px;\\n height: auto;\\n overflow: hidden;\\n padding: 0;\\n}\\n\\n.library-item_featured-image-container_2x7jE {\\n position: relative;\\n width: 100%;\\n}\\n\\n.library-item_featured-image_1rsDU {\\n width: 100%;\\n aspect-ratio: 2;\\n}\\n\\n.library-item_featured-text_xD5Ve {\\n font-weight: bold;\\n padding: 10px;\\n /* height: 140px; */\\n width: 300px;\\n}\\n\\n[dir=\"ltr\"] .library-item_featured-extension-text_2sSn4 {\\n text-align: left;\\n padding-left: 1.25rem;\\n}\\n\\n[dir=\"rtl\"] .library-item_featured-extension-text_2sSn4 {\\n text-align: right;\\n padding-right: 1.25rem;\\n}\\n\\n.library-item_featured-description_1hGaH {\\n display: block;\\n font-weight: normal;\\n line-height: 1.375rem;\\n padding-top: .3125rem;\\n padding-bottom: .25rem;\\n}\\n\\n.library-item_featured-extension-metadata_24DYi {\\n width: 100%;\\n padding: 0 1.25rem 1rem 1.25rem;\\n display: flex;\\n flex-direction: row;\\n align-items: flex-start;\\n font-size: 12px;\\n color: var(--text-primary);\\n opacity: 0.75;\\n}\\n\\n[dir=\"ltr\"] .library-item_featured-extension-metadata_24DYi {\\n text-align: left;\\n}\\n\\n[dir=\"rtl\"] .library-item_featured-extension-metadata_24DYi {\\n text-align: right;\\n}\\n\\n.library-item_featured-extension-requirement_30Ghz {\\n width: 100%;\\n display: flex;\\n flex-direction: column;\\n}\\n\\n.library-item_featured-extension-collaboration_13t7u {\\n width: 100%;\\n display: flex;\\n flex-direction: column;\\n}\\n\\n.library-item_featured-extension-metadata-detail_2kvJn {\\n height: 100%;\\n padding-top: 0.4rem;\\n font-weight: bold;\\n}\\n\\n.library-item_featured-extension-metadata-detail_2kvJn img {\\n margin-right: 0.25rem;\\n width: 20px;\\n height: 20px;\\n}\\n\\n.library-item_extension-links_ndWNb {\\n width: 300px;\\n padding: 0 1.25rem 1rem 1.25rem;\\n display: flex;\\n flex-direction: row;\\n justify-content: space-between;\\n opacity: 0.75;\\n text-align: left;\\n}\\n\\n.library-item_extension-links_ndWNb a {\\n color: inherit !important;\\n text-decoration: underline;\\n}\\n\\n.library-item_coming-soon-text_ZcFGD {\\n position: absolute;\\n background-color: var(--data-primary);\\n border-radius: 1rem;\\n box-shadow: 0 0 .5rem hsla(0, 0%, 0%, .25);\\n padding: .5rem 1rem;\\n font-size: .875rem;\\n font-weight: bold;\\n color: var(--ui-white);\\n}\\n\\n[dir=\"ltr\"] .library-item_coming-soon-text_ZcFGD {\\n transform: translate(calc(2 * 0.5rem), calc(2 * 0.5rem));\\n}\\n\\n[dir=\"rtl\"] .library-item_coming-soon-text_ZcFGD {\\n transform: translate(calc(-2 * 0.5rem), calc(2 * 0.5rem));\\n}\\n\\n.library-item_favorite-container_3ebO5 {\\n display: none;\\n background: none;\\n border: none;\\n padding: 0;\\n margin: 0;\\n position: absolute;\\n top: 0.5rem;\\n left: 0.5rem;\\n}\\n\\n.library-item_favorite-icon_20B_7 {\\n width: 32px;\\n height: 32px;\\n}\\n\\n.library-item_favorite-container_3ebO5.library-item_active_3pQCM,\\n.library-item_library-item_1nZBu:hover .library-item_favorite-container_3ebO5 {\\n display: block;\\n}\\n',\"\"]),t.locals={\"library-item\":\"library-item_library-item_1nZBu\",libraryItem:\"library-item_library-item_1nZBu\",\"library-item-extension\":\"library-item_library-item-extension_wHgEE\",libraryItemExtension:\"library-item_library-item-extension_wHgEE\",hidden:\"library-item_hidden_qWfvV\",disabled:\"library-item_disabled_udvIX\",\"library-item-image-container-wrapper\":\"library-item_library-item-image-container-wrapper_3TFcU\",libraryItemImageContainerWrapper:\"library-item_library-item-image-container-wrapper_3TFcU\",\"library-item-image-container\":\"library-item_library-item-image-container_1VgKJ\",libraryItemImageContainer:\"library-item_library-item-image-container_1VgKJ\",\"library-item-inset-image-container\":\"library-item_library-item-inset-image-container_2oGku\",libraryItemInsetImageContainer:\"library-item_library-item-inset-image-container_2oGku\",\"library-item-image\":\"library-item_library-item-image_3G7nd\",libraryItemImage:\"library-item_library-item-image_3G7nd\",\"library-item-inset-image\":\"library-item_library-item-inset-image_qk3QS\",libraryItemInsetImage:\"library-item_library-item-inset-image_qk3QS\",\"library-item-name\":\"library-item_library-item-name_35ftf\",libraryItemName:\"library-item_library-item-name_35ftf\",\"featured-item\":\"library-item_featured-item_3dHDW\",featuredItem:\"library-item_featured-item_3dHDW\",\"featured-image-container\":\"library-item_featured-image-container_2x7jE\",featuredImageContainer:\"library-item_featured-image-container_2x7jE\",\"featured-image\":\"library-item_featured-image_1rsDU\",featuredImage:\"library-item_featured-image_1rsDU\",\"featured-text\":\"library-item_featured-text_xD5Ve\",featuredText:\"library-item_featured-text_xD5Ve\",\"featured-extension-text\":\"library-item_featured-extension-text_2sSn4\",featuredExtensionText:\"library-item_featured-extension-text_2sSn4\",\"featured-description\":\"library-item_featured-description_1hGaH\",featuredDescription:\"library-item_featured-description_1hGaH\",\"featured-extension-metadata\":\"library-item_featured-extension-metadata_24DYi\",featuredExtensionMetadata:\"library-item_featured-extension-metadata_24DYi\",\"featured-extension-requirement\":\"library-item_featured-extension-requirement_30Ghz\",featuredExtensionRequirement:\"library-item_featured-extension-requirement_30Ghz\",\"featured-extension-collaboration\":\"library-item_featured-extension-collaboration_13t7u\",featuredExtensionCollaboration:\"library-item_featured-extension-collaboration_13t7u\",\"featured-extension-metadata-detail\":\"library-item_featured-extension-metadata-detail_2kvJn\",featuredExtensionMetadataDetail:\"library-item_featured-extension-metadata-detail_2kvJn\",\"extension-links\":\"library-item_extension-links_ndWNb\",extensionLinks:\"library-item_extension-links_ndWNb\",\"coming-soon-text\":\"library-item_coming-soon-text_ZcFGD\",comingSoonText:\"library-item_coming-soon-text_ZcFGD\",\"favorite-container\":\"library-item_favorite-container_3ebO5\",favoriteContainer:\"library-item_favorite-container_3ebO5\",\"favorite-icon\":\"library-item_favorite-icon_20B_7\",favoriteIcon:\"library-item_favorite-icon_20B_7\",active:\"library-item_active_3pQCM\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\"/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.divider_divider_2uUWW {\\n border-right: 1px dashed var(--ui-black-transparent);\\n}\\n\",\"\"]),t.locals={divider:\"divider_divider_2uUWW\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.filter_filter_3ERdM {\\n display: flex;\\n flex-direction: row;\\n align-items: center;\\n flex-grow: 1;\\n\\n background: var(--ui-white);\\n border-radius: 10rem;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n height: 2.5rem;\\n\\n position: relative;\\n}\\n\\n.filter_filter-icon_2b5SH {\\n position: absolute;\\n top: 0;\\n\\n height: 1rem;\\n width: 1rem;\\n}\\n\\n[dir=\"ltr\"] .filter_filter-icon_2b5SH {\\n left: 0;\\n margin: 0.75rem 0.75rem 0.75rem 1rem;\\n}\\n\\n[dir=\"rtl\"] .filter_filter-icon_2b5SH {\\n right: 0;\\n margin: 0.75rem 1rem 0.75rem 0.75rem;\\n transform: scaleX(-1);\\n}\\n\\n.filter_filter_3ERdM:focus-within {\\n box-shadow: 0 0 0 .25rem var(--looks-transparent);\\n}\\n\\n/*\\n Hidden state\\n*/\\n\\n.filter_x-icon-wrapper_3u3wB {\\n opacity: 0;\\n position: absolute;\\n top: 0;\\n\\n display: flex;\\n justify-content: center;\\n align-items: center;\\n\\n overflow: hidden; /* Mask the icon animation */\\n height: 1.25rem;\\n width: 1.25rem;\\n margin: 0.625rem;\\n\\n border-radius: 50%;\\n pointer-events: none;\\n cursor: default;\\n transition: opacity 0.05s linear;\\n}\\n\\n[dir=\"ltr\"] .filter_x-icon-wrapper_3u3wB {\\n right: 0;\\n}\\n\\n[dir=\"rtl\"] .filter_x-icon-wrapper_3u3wB {\\n left: 0;\\n}\\n\\n/*\\n Shown state\\n*/\\n\\n.filter_filter_3ERdM.filter_is-active_2vZjc .filter_x-icon-wrapper_3u3wB {\\n pointer-events: auto;\\n cursor: pointer;\\n opacity: 1;\\n transition: opacity 0.05s linear;\\n}\\n\\n.filter_filter_3ERdM.filter_is-active_2vZjc .filter_x-icon-wrapper_3u3wB:hover {\\n transform: scale(1.2, 1.2);\\n}\\n\\n/*\\n Hidden state\\n*/\\n\\n.filter_x-icon_P0M2o {\\n position: relative;\\n margin: 0.25rem;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n transform: translateX(0.5rem);\\n transition: transform 0.085s cubic-bezier(0.78, 1, 1, 1);\\n}\\n\\n/*\\n Shown state\\n*/\\n\\n.filter_filter_3ERdM.filter_is-active_2vZjc .filter_x-icon-wrapper_3u3wB .filter_x-icon_P0M2o {\\n transform: translateX(0);\\n}\\n\\n.filter_filter-input_3aL2D {\\n flex-grow: 1;\\n height: 2.5rem;\\n background-color: transparent;\\n -webkit-appearance: none;\\n outline: none;\\n border: 0;\\n color: var(--text-primary);\\n font-size: 0.75rem;\\n letter-spacing: 0.15px;\\n cursor: text;\\n}\\n\\n[dir=\"ltr\"] .filter_filter-input_3aL2D {\\n padding: .625rem 2rem .625rem 3rem;\\n}\\n\\n[dir=\"rtl\"] .filter_filter-input_3aL2D {\\n padding: .625rem 3rem .625rem 2rem;\\n}\\n\\n.filter_filter-input_3aL2D::-ms-input-placeholder {\\n opacity: .5;\\n color: var(--text-primary);\\n font-size: 0.875rem;\\n letter-spacing: 0.15px;\\n}\\n\\n.filter_filter-input_3aL2D::placeholder {\\n opacity: .5;\\n color: var(--text-primary);\\n font-size: 0.875rem;\\n letter-spacing: 0.15px;\\n}\\n\\n[dir=\"ltr\"] .filter_filter-input_3aL2D::-ms-input-placeholder {\\n padding: 0 0 0 0.25rem;\\n}\\n\\n[dir=\"ltr\"] .filter_filter-input_3aL2D::placeholder {\\n padding: 0 0 0 0.25rem;\\n}\\n\\n[dir=\"rtl\"] .filter_filter-input_3aL2D::-ms-input-placeholder {\\n padding: 0 0.25rem 0 0;\\n}\\n\\n[dir=\"rtl\"] .filter_filter-input_3aL2D::placeholder {\\n padding: 0 0.25rem 0 0;\\n}\\n',\"\"]),t.locals={filter:\"filter_filter_3ERdM\",\"filter-icon\":\"filter_filter-icon_2b5SH\",filterIcon:\"filter_filter-icon_2b5SH\",\"x-icon-wrapper\":\"filter_x-icon-wrapper_3u3wB\",xIconWrapper:\"filter_x-icon-wrapper_3u3wB\",\"is-active\":\"filter_is-active_2vZjc\",isActive:\"filter_is-active_2vZjc\",\"x-icon\":\"filter_x-icon_P0M2o\",xIcon:\"filter_x-icon_P0M2o\",\"filter-input\":\"filter_filter-input_3aL2D\",filterInput:\"filter_filter-input_3aL2D\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\"/* overridden by src/lib/themes/guiHelpers.js */\\n\\n/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n.tag-button_tag-button_3MxU5 {\\n padding: .625rem 1rem;\\n background: var(--looks-secondary);\\n border-radius: 1.375rem;\\n color: white;\\n height: 2.5rem;\\n}\\n\\n.tag-button_tag-button-icon_3VB4Q {\\n max-width: 1rem;\\n max-height: 1rem;\\n}\\n\\n.tag-button_active_1IIH9 {\\n background: var(--data-primary);\\n}\\n\",\"\"]),t.locals={\"tag-button\":\"tag-button_tag-button_3MxU5\",tagButton:\"tag-button_tag-button_3MxU5\",\"tag-button-icon\":\"tag-button_tag-button-icon_3VB4Q\",tagButtonIcon:\"tag-button_tag-button-icon_3VB4Q\",active:\"tag-button_active_1IIH9\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\"/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.spinner_spinner_2cI8K {\\n width: 1.25rem;\\n height: 1.25rem;\\n display: inline-block;\\n position: relative;\\n border-radius: 50%;\\n border-width: .1875rem;\\n border-style: solid;\\n border-color: var(--ui-white-transparent-default);\\n box-sizing: content-box;\\n}\\n\\n.spinner_spinner_2cI8K::before, .spinner_spinner_2cI8K::after {\\n width: 1.25rem;\\n height: 1.25rem;\\n content: '';\\n border-radius: 50%;\\n display: block;\\n}\\n\\n.spinner_spinner_2cI8K::after {\\n position: absolute;\\n top: -.1875rem;\\n left: -.1875rem;\\n border: .1875rem solid transparent;\\n border-top-color: var(--ui-white-default);\\n animation: spinner_spin_23oBt 1.5s cubic-bezier(0.4, 0.1, 0.4, 1) infinite;\\n}\\n\\n.spinner_small_3zDcs {\\n width: .5rem;\\n height: .5rem;\\n}\\n\\n.spinner_small_3zDcs::before, .spinner_small_3zDcs::after {\\n width: .5rem;\\n height: .5rem;\\n}\\n\\n.spinner_large_HL-hN {\\n width: 2.5rem;\\n height: 2.5rem;\\n}\\n\\n.spinner_large_HL-hN::before, .spinner_large_HL-hN::after {\\n width: 2.5rem;\\n height: 2.5rem;\\n}\\n\\n@keyframes spinner_spin_23oBt {\\n 0% {\\n transform: rotate(0deg);\\n }\\n\\n 100% {\\n transform: rotate(360deg);\\n }\\n}\\n\\n.spinner_spinner_2cI8K.spinner_success_OfY7K {\\n border-color: var(--extensions-transparent);\\n}\\n\\n.spinner_spinner_2cI8K.spinner_success_OfY7K::after {\\n border-top-color: var(--extensions-primary);\\n}\\n\\n.spinner_spinner_2cI8K.spinner_warn_6cVNT {\\n border-color: var(--error-transparent);\\n}\\n\\n.spinner_spinner_2cI8K.spinner_warn_6cVNT::after {\\n border-top-color: var(--error-primary);\\n}\\n\\n.spinner_spinner_2cI8K.spinner_info_2Oc6P {\\n border-color: var(--ui-white-transparent-default);\\n}\\n\\n.spinner_spinner_2cI8K.spinner_info_2Oc6P::after {\\n border-top-color: var(--ui-white-default);\\n}\\n\\n.spinner_spinner_2cI8K.spinner_primary_2zFm4 {\\n border-color: var(--looks-transparent);\\n}\\n\\n.spinner_spinner_2cI8K.spinner_primary_2zFm4::after {\\n border-top-color: var(--looks-secondary);\\n}\\n\",\"\"]),t.locals={spinner:\"spinner_spinner_2cI8K\",spin:\"spinner_spin_23oBt\",small:\"spinner_small_3zDcs\",large:\"spinner_large_HL-hN\",success:\"spinner_success_OfY7K\",warn:\"spinner_warn_6cVNT\",info:\"spinner_info_2Oc6P\",primary:\"spinner_primary_2zFm4\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\"/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.separator_separator_1jjpt {\\n width: 100%;\\n border: none;\\n border-top: 2px solid var(--ui-black-transparent);\\n margin: 0.5rem 0;\\n}\\n\",\"\"]),t.locals={separator:\"separator_separator_1jjpt\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\".removed-trademarks_removed-trademarks_3XRwc {\\n opacity: 0.75;\\n}\\n\",\"\"]),t.locals={\"removed-trademarks\":\"removed-trademarks_removed-trademarks_3XRwc\",removedTrademarks:\"removed-trademarks_removed-trademarks_3XRwc\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.library_library-scroll-grid_7xk1I {\\n display: flex;\\n justify-content: flex-start;\\n align-content: flex-start;\\n align-items: flex-start;\\n background: var(--ui-secondary);\\n flex-grow: 1;\\n flex-wrap: wrap;\\n overflow-y: auto;\\n height: auto;\\n padding: 0.5rem;\\n height: calc(100% - 3.125rem);\\n}\\n\\n.library_library-scroll-grid_7xk1I.library_withFilterBar_G4Jc2 {\\n height: calc(100% - 3.125rem - 2.5rem - 2rem);\\n}\\n\\n.library_filter-bar_8xrjd {\\n display: flex;\\n flex-direction: row;\\n justify-content: flex-start;\\n align-items: center;\\n height: calc(2.5rem + 2rem); /* padding */\\n background-color: var(--looks-transparent);\\n padding: 0 1rem;\\n font-size: .875rem;\\n}\\n\\n.library_filter-bar-item_1eoVo {\\n margin-right: .75rem;\\n}\\n\\n.library_filter_1E2FK {\\n flex-grow: 0;\\n}\\n\\n.library_filter-input_3U79K {\\n width: 11.5rem;\\n transition: .2s;\\n}\\n\\n.library_filter-input_3U79K:focus,\\n.library_filter-input_3U79K:not([value=\"\"]) {\\n width: 18.75rem;\\n}\\n\\n.library_divider_3gNN2 {\\n transform: scaleY(1.39);\\n height: 2.5rem;\\n}\\n\\n.library_tag-wrapper_3hrLl {\\n display: flex;\\n flex-direction: row;\\n flex-wrap: wrap;\\n height: 2.5rem;\\n overflow: hidden;\\n}\\n\\n.library_spinner-wrapper_zSF8e {\\n width: 100%;\\n height: 100%;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n}\\n',\"\"]),t.locals={\"library-scroll-grid\":\"library_library-scroll-grid_7xk1I\",libraryScrollGrid:\"library_library-scroll-grid_7xk1I\",withFilterBar:\"library_withFilterBar_G4Jc2\",\"filter-bar\":\"library_filter-bar_8xrjd\",filterBar:\"library_filter-bar_8xrjd\",\"filter-bar-item\":\"library_filter-bar-item_1eoVo\",filterBarItem:\"library_filter-bar-item_1eoVo\",filter:\"library_filter_1E2FK\",\"filter-input\":\"library_filter-input_3U79K\",filterInput:\"library_filter-input_3U79K\",divider:\"library_divider_3gNN2\",\"tag-wrapper\":\"library_tag-wrapper_3hrLl\",tagWrapper:\"library_tag-wrapper_3hrLl\",\"spinner-wrapper\":\"library_spinner-wrapper_zSF8e\",spinnerWrapper:\"library_spinner-wrapper_zSF8e\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* overridden by src/lib/themes/guiHelpers.js */\\n\\n/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n.custom-procedures_modal-content_1wJuI {\\n width: 700px;\\n margin: 50px auto; /* This modal is taller than most, reduce top margin */\\n}\\n\\n.custom-procedures_body_1H7Iq {\\n background: var(--ui-modal-background);\\n padding: 1.5rem 2.25rem;\\n}\\n\\n.custom-procedures_body_1H7Iq input[type=\"checkbox\"],\\n.custom-procedures_body_1H7Iq input[type=\"radio\"] {\\n margin: 3px;\\n}\\n\\n/* Blocks workspace for custom procedure declaration editor */\\n\\n.custom-procedures_workspace_2fBw7 {\\n min-height: 200px;\\n position: relative;\\n}\\n\\n.custom-procedures_workspace_2fBw7 .injectionDiv{\\n position: absolute;\\n top: 0;\\n right: 0;\\n bottom: 0;\\n left: 0;\\n}\\n\\n.custom-procedures_workspace_2fBw7 .blocklySvg {\\n background-color: var(--ui-primary);\\n}\\n\\n/* Row of \"card\" buttons for modifying custom procedures */\\n\\n.custom-procedures_options-row_2qj-y {\\n display: flex;\\n justify-content: space-between;\\n}\\n\\n.custom-procedures_option-card_1Gtvt {\\n background: var(--ui-white);\\n border: 2px solid var(--ui-black-transparent);\\n border-radius: 0.5rem;\\n padding: calc(0.5rem * 2);\\n text-align: center;\\n flex-grow: 1;\\n cursor: pointer;\\n transition: all 0.2s;\\n flex-basis: 100px;\\n}\\n\\n.custom-procedures_option-card_1Gtvt:hover {\\n border: 2px solid var(--looks-secondary);\\n box-shadow: 0px 0px 0px 4px var(--looks-transparent);\\n}\\n\\n.custom-procedures_option-card_1Gtvt + .custom-procedures_option-card_1Gtvt {\\n margin-left: 1rem;\\n}\\n\\n.custom-procedures_option-icon_1q0dQ {\\n max-height: 48px;\\n margin-bottom: 0.5rem;\\n}\\n\\n.custom-procedures_option-title_21_2M {\\n font-weight: bold;\\n}\\n\\n/* \"Run without screen refresh\" row */\\n\\n.custom-procedures_checkbox-row_x0PwF {\\n margin-top: 1rem;\\n}\\n\\n/* Confirmation buttons at the bottom of the modal */\\n\\n.custom-procedures_button-row_3EJDk {\\n margin-top: 1rem;\\n font-weight: bolder;\\n text-align: right;\\n}\\n\\n.custom-procedures_button-row_3EJDk button {\\n border: 1px solid var(--ui-black-transparent);\\n border-radius: 0.25rem;\\n padding: 0.75rem 1rem;\\n background: white;\\n color: black;\\n font-weight: bold;\\n font-size: 0.85rem;\\n}\\n\\n.custom-procedures_button-row_3EJDk button.custom-procedures_ok-button_3XcwO {\\n background: var(--looks-secondary);\\n border: var(--looks-secondary);\\n color: white;\\n}\\n\\n[dir=\"ltr\"] .custom-procedures_button-row_3EJDk button + button {\\n margin-left: 0.5rem;\\n}\\n\\n[dir=\"rtl\"] .custom-procedures_button-row_3EJDk button + button {\\n margin-right: 0.5rem;\\n}\\n',\"\"]),t.locals={\"modal-content\":\"custom-procedures_modal-content_1wJuI\",modalContent:\"custom-procedures_modal-content_1wJuI\",body:\"custom-procedures_body_1H7Iq\",workspace:\"custom-procedures_workspace_2fBw7\",\"options-row\":\"custom-procedures_options-row_2qj-y\",optionsRow:\"custom-procedures_options-row_2qj-y\",\"option-card\":\"custom-procedures_option-card_1Gtvt\",optionCard:\"custom-procedures_option-card_1Gtvt\",\"option-icon\":\"custom-procedures_option-icon_1q0dQ\",optionIcon:\"custom-procedures_option-icon_1q0dQ\",\"option-title\":\"custom-procedures_option-title_21_2M\",optionTitle:\"custom-procedures_option-title_21_2M\",\"checkbox-row\":\"custom-procedures_checkbox-row_x0PwF\",checkboxRow:\"custom-procedures_checkbox-row_x0PwF\",\"button-row\":\"custom-procedures_button-row_3EJDk\",buttonRow:\"custom-procedures_button-row_3EJDk\",\"ok-button\":\"custom-procedures_ok-button_3XcwO\",okButton:\"custom-procedures_ok-button_3XcwO\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\"/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.spinner_container_-o2Vc {\\n display: flex;\\n width: 100%;\\n height: 100%;\\n align-items: center;\\n justify-content: center;\\n}\\n\\n.spinner_spinner_2EFkd {\\n width: 64px;\\n height: 64px;\\n border-radius: 50%;\\n border: 6px solid;\\n border-color: var(--looks-secondary) transparent var(--looks-secondary) transparent;\\n animation: spinner_spinner_2EFkd 1.2s linear infinite;\\n}\\n\\n@keyframes spinner_spinner_2EFkd {\\n 0% {\\n transform: rotate(0deg);\\n }\\n 100% {\\n transform: rotate(360deg);\\n }\\n}\\n\",\"\"]),t.locals={container:\"spinner_container_-o2Vc\",spinner:\"spinner_spinner_2EFkd\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* overridden by src/lib/themes/guiHelpers.js */\\n\\n/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n/* wrapper to allow for touch slop if we decide to add it */\\n\\n.delete-button_delete-button_JjOIx {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n cursor: pointer;\\n transition: all 0.15s ease-out;\\n}\\n\\n.delete-button_delete-button-visible_mAZdj {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n overflow: hidden; /* Mask the icon animation */\\n width: 1.75rem;\\n height: 1.75rem;\\n box-shadow: 0px 0px 0px 2px var(--looks-transparent);\\n background-color: var(--looks-secondary);\\n color: var(--ui-white);\\n border-radius: 50%;\\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n cursor: pointer;\\n transition: all 0.15s ease-out;\\n}\\n\\n.delete-button_delete-icon_2tDWR {\\n position: relative;\\n margin: 0.25rem;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n transform-origin: 50%;\\n}\\n',\"\"]),t.locals={\"delete-button\":\"delete-button_delete-button_JjOIx\",deleteButton:\"delete-button_delete-button_JjOIx\",\"delete-button-visible\":\"delete-button_delete-button-visible_mAZdj\",deleteButtonVisible:\"delete-button_delete-button-visible_mAZdj\",\"delete-icon\":\"delete-button_delete-icon_2tDWR\",deleteIcon:\"delete-button_delete-icon_2tDWR\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n/* overridden by src/lib/themes/guiHelpers.js */\\n\\n/* @todo: refactor this class name, and component: `sprite-selector` to `sprite` */\\n\\n.sprite-selector-item_sprite-selector-item_3c9Kl {\\n display: flex;\\n flex-direction: column;\\n justify-content: flex-start;\\n position: relative;\\n\\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\\n font-size: 0.8rem;\\n color: var(--text-primary);\\n border-width: 2px;\\n border-style: solid;\\n border-color: var(--ui-black-transparent);\\n border-radius: 0.5rem;\\n\\n text-align: center;\\n cursor: pointer;\\n\\n -webkit-user-select: none;\\n\\n -moz-user-select: none;\\n\\n -ms-user-select: none;\\n\\n user-select: none;\\n}\\n\\n.sprite-selector-item_sprite-selector-item_3c9Kl.sprite-selector-item_is-selected_EE4jo {\\n box-shadow: 0px 0px 0px 4px var(--looks-transparent);\\n border: 2px solid var(--looks-secondary);\\n background: var(--ui-white);\\n}\\n\\n.sprite-selector-item_sprite-selector-item_3c9Kl:hover {\\n border: 2px solid var(--looks-secondary);\\n background: var(--ui-white);\\n}\\n\\n.sprite-selector-item_sprite-selector-item_3c9Kl:hover .sprite-selector-item_sprite-image_1uVIo, .sprite-selector-item_is-selected_EE4jo .sprite-selector-item_sprite-image_1uVIo {\\n filter: drop-shadow(0px 0px 2px var(--ui-black-transparent));\\n}\\n\\n/* Outer/Inner chicanery is to prevent layouts when sprite image changes */\\n\\n.sprite-selector-item_sprite-image-outer_1P6nT {\\n position: relative;\\n width: 100%;\\n height: 100%;\\n transform: translateZ(0);\\n}\\n\\n.sprite-selector-item_sprite-image-inner_x0FPK {\\n position: absolute;\\n width: 100%;\\n height: 100%;\\n display: flex;\\n justify-content: center;\\n align-items: center;\\n}\\n\\n.sprite-selector-item_sprite-image_1uVIo {\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n pointer-events: none;\\n max-width: 32px;\\n max-height: 32px;\\n}\\n\\n.sprite-selector-item_sprite-info_RsbR2 {\\n padding: 0.25rem;\\n border-bottom-left-radius: 0.25rem;\\n border-bottom-right-radius: 0.25rem;\\n\\n font-size: 0.625rem;\\n color: var(--text-primary);\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n\\n.sprite-selector-item_sprite-name_3gG3r, .sprite-selector-item_sprite-details_XPpRw {\\n /*\\n For truncating overflowing text gracefully\\n Min-width is for a bug: https://css-tricks.com/flexbox-truncated-text\\n */\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n min-width: 0;\\n}\\n\\n.sprite-selector-item_sprite-details_XPpRw {\\n margin-top: 0.125rem;\\n font-size: 0.5rem;\\n}\\n\\n.sprite-selector-item_is-selected_EE4jo .sprite-selector-item_sprite-info_RsbR2 {\\n background: var(--looks-secondary);\\n color: #ffffff;\\n}\\n\\n.sprite-selector-item_delete-button_1V2xC {\\n position: absolute;\\n top: -.625rem;\\n z-index: auto;\\n}\\n\\n[dir=\"ltr\"] .sprite-selector-item_delete-button_1V2xC {\\n right: -.625rem;\\n}\\n\\n[dir=\"rtl\"] .sprite-selector-item_delete-button_1V2xC {\\n left: -.625rem;\\n}\\n\\n.sprite-selector-item_number_PKBcU {\\n position: absolute;\\n top: 0.15rem;\\n font-size: 0.625rem;\\n font-weight: bold;\\n z-index: 2;\\n}\\n\\n[dir=\"ltr\"] .sprite-selector-item_number_PKBcU {\\n left: 0.15rem;\\n}\\n\\n[dir=\"rtl\"] .sprite-selector-item_number_PKBcU {\\n right: 0.15rem;\\n}\\n',\"\"]),t.locals={\"sprite-selector-item\":\"sprite-selector-item_sprite-selector-item_3c9Kl\",spriteSelectorItem:\"sprite-selector-item_sprite-selector-item_3c9Kl\",\"is-selected\":\"sprite-selector-item_is-selected_EE4jo\",isSelected:\"sprite-selector-item_is-selected_EE4jo\",\"sprite-image\":\"sprite-selector-item_sprite-image_1uVIo\",spriteImage:\"sprite-selector-item_sprite-image_1uVIo\",\"sprite-image-outer\":\"sprite-selector-item_sprite-image-outer_1P6nT\",spriteImageOuter:\"sprite-selector-item_sprite-image-outer_1P6nT\",\"sprite-image-inner\":\"sprite-selector-item_sprite-image-inner_x0FPK\",spriteImageInner:\"sprite-selector-item_sprite-image-inner_x0FPK\",\"sprite-info\":\"sprite-selector-item_sprite-info_RsbR2\",spriteInfo:\"sprite-selector-item_sprite-info_RsbR2\",\"sprite-name\":\"sprite-selector-item_sprite-name_3gG3r\",spriteName:\"sprite-selector-item_sprite-name_3gG3r\",\"sprite-details\":\"sprite-selector-item_sprite-details_XPpRw\",spriteDetails:\"sprite-selector-item_sprite-details_XPpRw\",\"delete-button\":\"sprite-selector-item_delete-button_1V2xC\",deleteButton:\"sprite-selector-item_delete-button_1V2xC\",number:\"sprite-selector-item_number_PKBcU\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* overridden by src/lib/themes/guiHelpers.js */\\n\\n/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n/*\\n Contains constants for the z-index values of elements that are part of the global stack context.\\n In other words, z-index values that are \"inside\" a component are not added here.\\n This prevents conflicts between identical z-index values in different components.\\n*/\\n\\n/* Toolbox z-index: 40; set in scratch-blocks */\\n\\n/* tooltips should go over add buttons if they overlap */\\n\\n/* monitors go over add buttons */\\n\\n/* \"ask\" block text input goes above monitors */\\n\\n/* menu-bar should go over monitors, alerts and tutorials */\\n\\n/* behind menu-bar */\\n\\n/* Block drag z-index: 1000; default 50 is overriden in blocks.css */\\n\\n/* so it is draggable into other panes */\\n\\n/* behind modals */\\n\\n/* behind modals */\\n\\n/* in most interfaces, the context menu is always on top */\\n\\n.context-menu_context-menu_3Ahoz {\\n min-width: 130px;\\n padding: 5px 0; /* The white strip at the top and bottom of the menu */\\n margin: 2px 0 0; /* To keep the menu below the cursor comfortably */\\n font-size: 0.85rem;\\n text-align: left;\\n background-color: var(--ui-white);\\n border: 1px solid var(--ui-black-transparent);\\n border-radius: calc(0.5rem / 2);\\n box-shadow: 0px 0px 5px 1px var(--shadow);\\n pointer-events: none;\\n transition: opacity 0.2s ease;\\n z-index: 10000;\\n}\\n\\n.context-menu_menu-item_2ReLI {\\n padding: 8px 12px;\\n white-space: nowrap;\\n cursor: pointer;\\n transition: 0.1s ease;\\n}\\n\\n.context-menu_menu-item_2ReLI:hover {\\n background: var(--looks-secondary);\\n color: white;\\n}\\n\\n.context-menu_menu-item-bordered_13kR6 {\\n border-top: 1px solid var(--ui-black-transparent);\\n}\\n\\n.context-menu_menu-item-danger_mMyy6:hover {\\n background: var(--error-primary);\\n}\\n',\"\"]),t.locals={\"context-menu\":\"context-menu_context-menu_3Ahoz\",contextMenu:\"context-menu_context-menu_3Ahoz\",\"menu-item\":\"context-menu_menu-item_2ReLI\",menuItem:\"context-menu_menu-item_2ReLI\",\"menu-item-bordered\":\"context-menu_menu-item-bordered_13kR6\",menuItemBordered:\"context-menu_menu-item-bordered_13kR6\",\"menu-item-danger\":\"context-menu_menu-item-danger_mMyy6\",menuItemDanger:\"context-menu_menu-item-danger_mMyy6\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* overridden by src/lib/themes/guiHelpers.js */\\n\\n/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n/*\\n Contains constants for the z-index values of elements that are part of the global stack context.\\n In other words, z-index values that are \"inside\" a component are not added here.\\n This prevents conflicts between identical z-index values in different components.\\n*/\\n\\n/* Toolbox z-index: 40; set in scratch-blocks */\\n\\n/* tooltips should go over add buttons if they overlap */\\n\\n/* monitors go over add buttons */\\n\\n/* \"ask\" block text input goes above monitors */\\n\\n/* menu-bar should go over monitors, alerts and tutorials */\\n\\n/* behind menu-bar */\\n\\n/* Block drag z-index: 1000; default 50 is overriden in blocks.css */\\n\\n/* so it is draggable into other panes */\\n\\n/* behind modals */\\n\\n/* behind modals */\\n\\n/* in most interfaces, the context menu is always on top */\\n\\n.action-menu_menu-container_2bnPG {\\n display: flex;\\n flex-direction: column-reverse;\\n transition: 0.2s;\\n position: relative;\\n}\\n\\n.action-menu_button_31je5 {\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n justify-content: center;\\n cursor: pointer;\\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\\n background: var(--looks-secondary);\\n outline: none;\\n border: none;\\n transition: background-color 0.2s;\\n}\\n\\nbutton::-moz-focus-inner {\\n border: 0;\\n}\\n\\n.action-menu_button_31je5:hover {\\n background: var(--extensions-primary);\\n}\\n\\n.action-menu_button_31je5:active {\\n padding: inherit;\\n}\\n\\n.action-menu_button_31je5.action-menu_coming-soon_ljJAN:hover {\\n background: var(--data-primary);\\n}\\n\\n.action-menu_main-button_2m3TE {\\n border-radius: 100%;\\n width: 2.75rem;\\n height: 2.75rem;\\n box-shadow: 0 0 0 4px var(--looks-transparent);\\n z-index: 46;\\n transition: transform, box-shadow 0.5s;\\n}\\n\\n.action-menu_main-button_2m3TE:hover {\\n transform: scale(1.1);\\n box-shadow: 0 0 0 6px var(--looks-transparent);\\n}\\n\\n.action-menu_main-icon_A7K5D {\\n width: calc(2.75rem - 1rem);\\n height: calc(2.75rem - 1rem);\\n}\\n\\n[dir=\"rtl\"] .action-menu_main-icon_A7K5D {\\n transform: scaleX(-1);\\n}\\n\\n.action-menu_more-buttons-outer_1tVn_ {\\n /*\\n Need to use two divs to set different overflow x/y\\n which is needed to get animation to look right while\\n allowing the tooltips to be visible.\\n */\\n overflow-y: hidden;\\n\\n background: var(--looks-secondary-dark);\\n border-top-left-radius: 2.25rem;\\n border-top-right-radius: 2.25rem;\\n width: 2.25rem;\\n margin-left: calc((2.75rem - 2.25rem) / 2);\\n margin-right: calc((2.75rem - 2.25rem) / 2);\\n\\n position: absolute;\\n bottom: calc(2.75rem);\\n\\n margin-bottom: calc(2.75rem / -2);\\n padding-bottom: calc(2.75rem / 2);\\n}\\n\\n.action-menu_more-buttons_39RLQ {\\n max-height: 0;\\n transition: max-height 1s;\\n overflow-x: visible;\\n display: flex;\\n flex-direction: column;\\n z-index: 10; /* @todo justify */\\n}\\n\\n.action-menu_file-input_rJdU0 {\\n display: none;\\n}\\n\\n.action-menu_expanded_SjWya .action-menu_more-buttons_39RLQ {\\n max-height: 1000px; /* Arbitrary, needs to be a value in order for animation to run */\\n}\\n\\n.action-menu_force-hidden_2bzzZ .action-menu_more-buttons_39RLQ {\\n display: none; /* This property does not animate */\\n}\\n\\n.action-menu_more-buttons_39RLQ:first-child { /* Round off top button */\\n border-top-right-radius: 2.25rem;\\n border-top-left-radius: 2.25rem;\\n}\\n\\n.action-menu_more-button_FdlvY {\\n width: 2.25rem;\\n height: 2.25rem;\\n background: var(--looks-secondary-dark);\\n}\\n\\n.action-menu_more-icon_3wj6o {\\n width: calc(2.25rem - 1rem);\\n height: calc(2.25rem - 1rem);\\n}\\n\\n.action-menu_coming-soon_ljJAN .action-menu_more-icon_3wj6o {\\n opacity: 0.5;\\n}\\n\\n/*\\n @todo needs to be refactored with coming soon tooltip overrides.\\n The \"!important\"s are for the same reason as with coming soon, the library\\n is not very easy to style.\\n*/\\n\\n.action-menu_tooltip_1YpkD {\\n background-color: var(--extensions-primary) !important;\\n opacity: 1 !important;\\n border: 1px solid hsla(0, 0%, 0%, .1) !important;\\n box-shadow: 0 0 .5rem hsla(0, 0%, 0%, .25) !important;\\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif !important;\\n}\\n\\n.action-menu_tooltip_1YpkD:after {\\n background-color: var(--extensions-primary);\\n}\\n\\n.action-menu_coming-soon-tooltip_1Hk4Q {\\n background-color: var(--data-primary) !important;\\n}\\n\\n.action-menu_coming-soon-tooltip_1Hk4Q:after {\\n background-color: var(--data-primary) !important;\\n}\\n\\n.action-menu_tooltip_1YpkD {\\n border: 1px solid hsla(0, 0%, 0%, .1) !important;\\n border-radius: calc(0.5rem / 2) !important;\\n box-shadow: 0 0 .5rem hsla(0, 0%, 0%, .25) !important;\\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif !important;\\n z-index: 47 !important;\\n}\\n\\n.action-menu_tooltip_1YpkD:after {\\n content: \"\";\\n border-top: 1px solid hsla(0, 0%, 0%, .1) !important;\\n border-left: 0 !important;\\n border-bottom: 0 !important;\\n border-right: 1px solid hsla(0, 0%, 0%, .1) !important;\\n border-radius: 0.125rem;\\n height: 0.5rem !important;\\n width: 0.5rem !important;\\n}\\n\\n.action-menu_tooltip_1YpkD.place-left:after {\\n margin-top: -0.25rem !important;\\n right: -0.25rem !important;\\n transform: rotate(45deg) !important;\\n}\\n\\n.action-menu_tooltip_1YpkD.place-right:after {\\n margin-top: -0.25rem !important;\\n left: -0.25rem !important;\\n transform: rotate(-135deg) !important;\\n}\\n\\n.action-menu_tooltip_1YpkD.place-top:after {\\n margin-right: -0.25rem !important;\\n bottom: -0.25rem !important;\\n transform: rotate(135deg) !important;\\n}\\n\\n.action-menu_tooltip_1YpkD.place-bottom:after {\\n margin-left: -0.25rem !important;\\n top: -0.25rem !important;\\n transform: rotate(-45deg) !important;\\n}\\n',\"\"]),t.locals={\"menu-container\":\"action-menu_menu-container_2bnPG\",menuContainer:\"action-menu_menu-container_2bnPG\",button:\"action-menu_button_31je5\",\"coming-soon\":\"action-menu_coming-soon_ljJAN\",comingSoon:\"action-menu_coming-soon_ljJAN\",\"main-button\":\"action-menu_main-button_2m3TE\",mainButton:\"action-menu_main-button_2m3TE\",\"main-icon\":\"action-menu_main-icon_A7K5D\",mainIcon:\"action-menu_main-icon_A7K5D\",\"more-buttons-outer\":\"action-menu_more-buttons-outer_1tVn_\",moreButtonsOuter:\"action-menu_more-buttons-outer_1tVn_\",\"more-buttons\":\"action-menu_more-buttons_39RLQ\",moreButtons:\"action-menu_more-buttons_39RLQ\",\"file-input\":\"action-menu_file-input_rJdU0\",fileInput:\"action-menu_file-input_rJdU0\",expanded:\"action-menu_expanded_SjWya\",\"force-hidden\":\"action-menu_force-hidden_2bzzZ\",forceHidden:\"action-menu_force-hidden_2bzzZ\",\"more-button\":\"action-menu_more-button_FdlvY\",moreButton:\"action-menu_more-button_FdlvY\",\"more-icon\":\"action-menu_more-icon_3wj6o\",moreIcon:\"action-menu_more-icon_3wj6o\",tooltip:\"action-menu_tooltip_1YpkD\",\"coming-soon-tooltip\":\"action-menu_coming-soon-tooltip_1Hk4Q\",comingSoonTooltip:\"action-menu_coming-soon-tooltip_1Hk4Q\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\"/* overridden by src/lib/themes/guiHelpers.js */\\n\\n/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n.selector_wrapper_1v6kq {\\n width: 150px;\\n position: relative;\\n display: flex;\\n flex-direction: column;\\n justify-content: space-between;\\n background: var(--ui-tertiary);\\n}\\n\\n.selector_new-buttons_2iXR0 {\\n position: absolute;\\n bottom: 0;\\n width: 100%;\\n\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n justify-content: space-around;\\n padding: 0.75rem 0;\\n color: var(--looks-secondary);\\n text-align: center;\\n background: none;\\n}\\n\\n.selector_new-buttons_2iXR0:before {\\n content: \\\"\\\";\\n position: absolute;\\n bottom: 0;\\n left: 0;\\n right:0;\\n width: 100%;\\n pointer-events: none;\\n}\\n\\n.selector_new-buttons_2iXR0 > button + button {\\n margin-top: 0.75rem;\\n}\\n\\n.selector_list-area_2Lh0T {\\n /* Must have some height (recalculated by flex-grow) in order to scroll */\\n height: 0;\\n flex-grow: 1;\\n overflow-y: auto;\\n overflow-x: hidden;\\n display: flex;\\n flex-direction: column;\\n}\\n\\n.selector_list-area_2Lh0T:after {\\n /* Make sure there is room to scroll beyond the last tile */\\n content: '';\\n display: block;\\n height: 70px;\\n width: 100%;\\n flex-shrink: 0;\\n order: 99999999;\\n}\\n\\n.selector_list-item_2s63_ {\\n width: 5rem;\\n height: 5rem;\\n margin: 0.5rem auto;\\n}\\n\\n@media only screen and (max-width: 1249px) {\\n .selector_wrapper_1v6kq {\\n width: 80px;\\n }\\n\\n .selector_list-item_2s63_ {\\n width: 4rem;\\n }\\n}\\n\\n.selector_list-item_2s63_.selector_placeholder_1MsBA {\\n background: white;\\n filter: opacity(15%) brightness(0%);\\n}\\n\",\"\"]),t.locals={wrapper:\"selector_wrapper_1v6kq\",\"new-buttons\":\"selector_new-buttons_2iXR0\",newButtons:\"selector_new-buttons_2iXR0\",\"list-area\":\"selector_list-area_2Lh0T\",listArea:\"selector_list-area_2Lh0T\",\"list-item\":\"selector_list-item_2s63_\",listItem:\"selector_list-item_2s63_\",placeholder:\"selector_placeholder_1MsBA\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.asset-panel_wrapper_26zMp {\\n display: flex;\\n flex-grow: 1;\\n border: 1px solid var(--ui-black-transparent);\\n background: var(--assets-background);\\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\\n font-size: 0.85rem;\\n}\\n\\n[dir=\"ltr\"] .asset-panel_wrapper_26zMp {\\n border-top-right-radius: 0.5rem;\\n border-bottom-right-radius: 0.5rem;\\n}\\n\\n[dir=\"rtl\"] .asset-panel_wrapper_26zMp {\\n border-top-left-radius: 0.5rem;\\n border-bottom-left-radius: 0.5rem;\\n}\\n\\n.asset-panel_detail-area_3eEbw {\\n display: flex;\\n flex-grow: 1;\\n flex-shrink: 1;\\n overflow: visible;\\n}\\n\\n[dir=\"ltr\"] .asset-panel_detail-area_3eEbw {\\n border-left: 1px solid var(--ui-black-transparent);\\n}\\n\\n[dir=\"rtl\"] .asset-panel_detail-area_3eEbw {\\n border-right: 1px solid var(--ui-black-transparent);\\n}\\n',\"\"]),t.locals={wrapper:\"asset-panel_wrapper_26zMp\",\"detail-area\":\"asset-panel_detail-area_3eEbw\",detailArea:\"asset-panel_detail-area_3eEbw\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.label_input-group_3U1bG {\\n display: inline-flex;\\n flex-direction: row;\\n align-items: center;\\n}\\n\\n.label_input-group-column_UfEsB {\\n display: inline-flex;\\n flex-direction: column;\\n align-items: flex-start;\\n}\\n\\n.label_input-group-column_UfEsB span {\\n margin-bottom: .25rem;\\n}\\n\\n.label_input-label_3WQec, .label_input-label-secondary_2TwJI {\\n font-size: 0.625rem;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n cursor: default;\\n\\n white-space: nowrap;\\n}\\n\\n[dir=\"ltr\"] .label_input-label_3WQec, [dir=\"ltr\"] .label_input-label-secondary_2TwJI {\\n margin-right: .5rem;\\n}\\n\\n[dir=\"rtl\"] .label_input-label_3WQec, [dir=\"rtl\"] .label_input-label-secondary_2TwJI {\\n margin-left: .5rem;\\n}\\n\\n.label_input-label_3WQec {\\n font-weight: bold;\\n}\\n',\"\"]),t.locals={\"input-group\":\"label_input-group_3U1bG\",inputGroup:\"label_input-group_3U1bG\",\"input-group-column\":\"label_input-group-column_UfEsB\",inputGroupColumn:\"label_input-group-column_UfEsB\",\"input-label\":\"label_input-label_3WQec\",inputLabel:\"label_input-label_3WQec\",\"input-label-secondary\":\"label_input-label-secondary_2TwJI\",inputLabelSecondary:\"label_input-label-secondary_2TwJI\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.input_input-form_2EIqD {\\n height: 2rem;\\n padding: 0 0.75rem;\\n\\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\\n font-size: 0.625rem;\\n font-weight: bold;\\n color: var(--text-primary);\\n background-color: var(--input-background);\\n\\n border-width: 1px;\\n border-style: solid;\\n border-color: var(--ui-black-transparent);\\n border-radius: 2rem;\\n\\n outline: none;\\n cursor: text;\\n transition: 0.25s ease-out; /* @todo: standardize with var */\\n box-shadow: none;\\n\\n /*\\n For truncating overflowing text gracefully\\n Min-width is for a bug: https://css-tricks.com/flexbox-truncated-text\\n @todo: move this out into a mixin or a helper component\\n */\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n min-width: 0;\\n}\\n\\n.input_input-form_2EIqD:hover {\\n border-color: var(--looks-secondary);\\n}\\n\\n.input_input-form_2EIqD:focus {\\n border-color: var(--looks-secondary);\\n box-shadow: 0 0 0 0.25rem var(--looks-transparent);\\n}\\n\\n.input_input-small_1bkbs {\\n width: 3rem;\\n padding: 0 0.5rem;\\n text-overflow: clip;\\n text-align: center;\\n}\\n\\n/* Chrome, Safari, Edge, Opera */\\n\\n.input_input-form_2EIqD::-webkit-outer-spin-button,\\n.input_input-form_2EIqD::-webkit-inner-spin-button {\\n -webkit-appearance: none;\\n margin: 0;\\n}\\n\\n/* Firefox */\\n\\n.input_input-form_2EIqD[type=number] {\\n -moz-appearance: textfield;\\n}\\n',\"\"]),t.locals={\"input-form\":\"input_input-form_2EIqD\",inputForm:\"input_input-form_2EIqD\",\"input-small\":\"input_input-small_1bkbs\",inputSmall:\"input_input-small_1bkbs\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.toggle-buttons_row_27DUF {\\n display: flex;\\n flex-direction: row;\\n}\\n\\n.toggle-buttons_button_uta83 {\\n margin: 0;\\n padding: 0.25rem;\\n border: 1px solid var(--ui-black-transparent);\\n background: none;\\n outline: none;\\n cursor: pointer;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n position: relative;\\n width: 34px;\\n height: 34px;\\n display: flex;\\n justify-content: center;\\n align-items: center;\\n}\\n\\n.toggle-buttons_button_uta83 > img {\\n display: block;\\n transition: transform 0.1s;\\n filter: var(--filter-icon-gray);\\n}\\n\\n.toggle-buttons_button_uta83:not(:last-child) {\\n border-right: none;\\n}\\n\\n[dir=\"rtl\"] .toggle-buttons_button_uta83:not(:last-child) {\\n border-left: none;\\n border-right: 1px solid var(--ui-black-transparent);\\n}\\n\\n.toggle-buttons_button_uta83:focus::before {\\n content: \"\";\\n position: absolute;\\n top: -1px;\\n right: -1px;\\n bottom: -1px;\\n left: -1px;\\n border: 1px solid var(--looks-secondary);\\n}\\n\\n/* round corners for first and last buttons */\\n\\n.toggle-buttons_button_uta83:first-child,\\n[dir=\"rtl\"] .toggle-buttons_button_uta83:last-child,\\n.toggle-buttons_button_uta83:first-child:focus::before,\\n[dir=\"rtl\"] .toggle-buttons_button_uta83:last-child:focus::before {\\n border-radius: calc(0.5rem / 2) 0 0 calc(0.5rem / 2);\\n}\\n\\n.toggle-buttons_button_uta83:last-child,\\n[dir=\"rtl\"] .toggle-buttons_button_uta83:first-child,\\n.toggle-buttons_button_uta83:last-child:focus::before,\\n[dir=\"rtl\"] .toggle-buttons_button_uta83:first-child:focus::before {\\n border-radius: 0 calc(0.5rem / 2) calc(0.5rem / 2) 0;\\n}\\n\\n/* selected button styling */\\n\\n.toggle-buttons_button_uta83[aria-pressed=\\'true\\'] {\\n background-color: var(--looks-light-transparent);\\n}\\n\\n.toggle-buttons_button_uta83[aria-pressed=\\'true\\'] > img {\\n filter: none;\\n}\\n\\n/* pressed button styling */\\n\\n.toggle-buttons_button_uta83:active {\\n background-color: var(--looks-transparent);\\n}\\n\\n/* disabled styling */\\n\\n.toggle-buttons_disabled_YZksg .toggle-buttons_button_uta83 {\\n cursor: default;\\n}\\n',\"\"]),t.locals={row:\"toggle-buttons_row_27DUF\",button:\"toggle-buttons_button_uta83\",disabled:\"toggle-buttons_disabled_YZksg\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\"/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.dial_container_1JhHX {\\n padding: 1rem;\\n display: flex;\\n justify-content: center;\\n align-items: center;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n\\n.dial_dial-container_33mkQ {\\n position: relative;\\n}\\n\\n.dial_dial-face_2aWlr, .dial_dial-handle_1OHhg, .dial_gauge_3bwaY {\\n position: absolute;\\n top: 0;\\n left: 0;\\n overflow: visible;\\n}\\n\\n.dial_dial-face_2aWlr {\\n width: 100%;\\n}\\n\\n.dial_dial-handle_1OHhg {\\n cursor: pointer;\\n width: 40px;\\n height: 40px;\\n /* Use margin to make positioning via top/left easier */\\n margin-left: calc(40px / -2);\\n margin-top: calc(40px / -2);\\n}\\n\\n.dial_gauge-path_VQesE {\\n fill: var(--looks-transparent);\\n stroke: var(--looks-secondary);\\n stroke-width: 1px;\\n}\\n\",\"\"]),t.locals={container:\"dial_container_1JhHX\",\"dial-container\":\"dial_dial-container_33mkQ\",dialContainer:\"dial_dial-container_33mkQ\",\"dial-face\":\"dial_dial-face_2aWlr\",dialFace:\"dial_dial-face_2aWlr\",\"dial-handle\":\"dial_dial-handle_1OHhg\",dialHandle:\"dial_dial-handle_1OHhg\",gauge:\"dial_gauge_3bwaY\",\"gauge-path\":\"dial_gauge-path_VQesE\",gaugePath:\"dial_gauge-path_VQesE\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\".direction-picker_button-row_33xQd {\\n justify-content: center;\\n margin-bottom: 1rem;\\n}\\n\",\"\"]),t.locals={\"button-row\":\"direction-picker_button-row_33xQd\",buttonRow:\"direction-picker_button-row_33xQd\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.sprite-info_sprite-info_2qOXw {\\n padding: 0.75rem;\\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\\n background-color: var(--ui-white);\\n color: var(--text-primary);\\n border-top-left-radius: 0.5rem;\\n border-top-right-radius: 0.5rem;\\n border-bottom: 1px solid var(--ui-black-transparent);\\n}\\n\\n.sprite-info_row_1J2d3 {\\n display: flex;\\n justify-content: space-between;\\n}\\n\\n.sprite-info_row-primary_2Sk7Q {\\n margin-bottom: 0.5rem;\\n}\\n\\n.sprite-info_label_PWLUC { opacity: 0.8; }\\n\\n.sprite-info_group_-xfiq {\\n display: inline-flex;\\n flex-direction: row; /* makes columns, for each label/form group */\\n align-items: center;\\n}\\n\\n.sprite-info_column_232AG {\\n display: inline-flex;\\n flex-direction: column; /* put label above input */\\n align-items: flex-start;\\n}\\n\\n.sprite-info_column_232AG span {\\n margin-bottom: .25rem;\\n}\\n\\n.sprite-info_icon-wrapper_1fbXG {\\n display: inline-block;\\n width: calc(2rem + 2px);\\n height: calc(2rem + 2px);\\n padding: 0.5rem;\\n outline: none;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n filter: var(--filter-icon-gray);\\n}\\n\\n.sprite-info_icon_3o-TD {\\n width: 100%;\\n height: 100%;\\n pointer-events: none;\\n}\\n\\n.sprite-info_rotation-select_2Fbo2 {\\n width: 100%;\\n height: 1.85rem;\\n border: 1px solid var(--ui-black-transparent);\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n outline: none;\\n}\\n\\n.sprite-info_rotation-select_2Fbo2:focus {\\n border-color: var(--looks-secondary);\\n box-shadow: inset 0 0 0 1px var(--ui-black-transparent);\\n}\\n\\n.sprite-info_larger-input_2sT6m input {\\n width: 4rem;\\n}\\n\\n.sprite-info_sprite-input_IL2gd {\\n width: 8rem;\\n}\\n',\"\"]),t.locals={\"sprite-info\":\"sprite-info_sprite-info_2qOXw\",spriteInfo:\"sprite-info_sprite-info_2qOXw\",row:\"sprite-info_row_1J2d3\",\"row-primary\":\"sprite-info_row-primary_2Sk7Q\",rowPrimary:\"sprite-info_row-primary_2Sk7Q\",label:\"sprite-info_label_PWLUC\",group:\"sprite-info_group_-xfiq\",column:\"sprite-info_column_232AG\",\"icon-wrapper\":\"sprite-info_icon-wrapper_1fbXG\",iconWrapper:\"sprite-info_icon-wrapper_1fbXG\",icon:\"sprite-info_icon_3o-TD\",\"rotation-select\":\"sprite-info_rotation-select_2Fbo2\",rotationSelect:\"sprite-info_rotation-select_2Fbo2\",\"larger-input\":\"sprite-info_larger-input_2sT6m\",largerInput:\"sprite-info_larger-input_2sT6m\",\"sprite-input\":\"sprite-info_sprite-input_IL2gd\",spriteInput:\"sprite-info_sprite-input_IL2gd\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* overridden by src/lib/themes/guiHelpers.js */\\n\\n/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n/*\\n Contains constants for the z-index values of elements that are part of the global stack context.\\n In other words, z-index values that are \"inside\" a component are not added here.\\n This prevents conflicts between identical z-index values in different components.\\n*/\\n\\n/* Toolbox z-index: 40; set in scratch-blocks */\\n\\n/* tooltips should go over add buttons if they overlap */\\n\\n/* monitors go over add buttons */\\n\\n/* \"ask\" block text input goes above monitors */\\n\\n/* menu-bar should go over monitors, alerts and tutorials */\\n\\n/* behind menu-bar */\\n\\n/* Block drag z-index: 1000; default 50 is overriden in blocks.css */\\n\\n/* so it is draggable into other panes */\\n\\n/* behind modals */\\n\\n/* behind modals */\\n\\n/* in most interfaces, the context menu is always on top */\\n\\n.sprite-selector_sprite-selector_1s2N2 {\\n flex-grow: 1;\\n position: relative;\\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\\n margin-right: calc(0.5rem / 2);\\n background-color: var(--ui-secondary);\\n border-top-right-radius: 0.5rem;\\n border-top-left-radius: 0.5rem;\\n border-color: var(--ui-black-transparent);\\n border-width: 1px;\\n border-style: solid;\\n border-bottom: 0;\\n}\\n\\n.sprite-selector_sprite-wrapper_1CrRS {\\n /*\\n Our goal is to fit sprites evenly in a row without leftover space.\\n Flexbox\\'s `space between` property gets us close, but doesn\\'t flow\\n well when the # of items per row > 1 and less than the max per row.\\n\\n Solving by explicitly calc\\'ing the width of each sprite. Setting\\n `border-box` simplifies things, because content, padding and\\n border-width all are included in the width, leaving us only to subtract\\n the left + right margins.\\n\\n @todo: make room for the scrollbar\\n */\\n box-sizing: border-box;\\n width: calc((100% / 5 ) - 0.5rem);\\n max-width: 6rem;\\n min-width: 4rem;\\n min-height: 4rem; /* @todo: calc height same as width */\\n margin: calc(0.5rem / 2);\\n}\\n\\n.sprite-selector_sprite_uquo4 {\\n height: 100%;\\n}\\n\\n.sprite-selector_scroll-wrapper_3qlZ7 {\\n /*\\n Sets the sprite-selector items as a scrollable pane\\n\\n @todo: Safari: pane doesn\\'t stretch to fill height;\\n @todo: Adding `position: relative` still doesn\\'t fix Safari scrolling pane, and\\n also introduces a new bug in Chrome when vertically resizing window down,\\n then back up, introduces white space in the outside the page container.\\n */\\n height: calc(100% - 6rem);\\n overflow-y: auto;\\n}\\n\\n.sprite-selector_scroll-wrapper-dragging_2tIRk {\\n background-color: var(--drop-highlight);\\n}\\n\\n.sprite-selector_items-wrapper_17MEf {\\n display: flex;\\n flex-wrap: wrap;\\n flex-direction: row;\\n\\n padding-top: calc(0.5rem / 2);\\n padding-left: calc(0.5rem / 2);\\n padding-right: calc(0.5rem / 2);\\n padding-bottom: 0.5rem;\\n\\n overflow: hidden;\\n}\\n\\n.sprite-selector_add-button_13cFJ {\\n position: absolute;\\n bottom: 0.75rem;\\n}\\n\\n[dir=\"ltr\"] .sprite-selector_add-button_13cFJ {\\n right: 1rem;\\n}\\n\\n[dir=\"rtl\"] .sprite-selector_add-button_13cFJ {\\n left: 1rem;\\n}\\n\\n.sprite-selector_raised_hptEE {\\n background-color: var(--drop-highlight);\\n transition: all 0.25s ease;\\n}\\n\\n.sprite-selector_raised_hptEE:hover {\\n background-color: var(--drop-highlight);\\n transform: scale(1.05);\\n}\\n\\n.sprite-selector_raised_hptEE:hover {\\n animation-name: sprite-selector_wiggle_3VXHB;\\n animation-duration: 500ms;\\n animation-iteration-count: 1;\\n animation-timing-function: ease-in-out;\\n background-color: var(--drop-highlight);\\n}\\n\\n@keyframes sprite-selector_wiggle_3VXHB {\\n 0% {transform: rotate(3deg) scale(1.05);}\\n 25% {transform: rotate(-3deg) scale(1.05);}\\n 50% {transform: rotate(5deg) scale(1.05);}\\n 75% {transform: rotate(-2deg) scale(1.05);}\\n 100% {transform: rotate(0deg) scale(1.05);}\\n}\\n\\n.sprite-selector_receivedBlocks_3hqzt {\\n animation: sprite-selector_glowing_1Uyz7 250ms;\\n}\\n\\n@keyframes sprite-selector_glowing_1Uyz7 {\\n 10% { box-shadow: 0 0 10px #7fff1e; }\\n 90% { box-shadow: 0 0 10px #7fff1e; }\\n 100% { box-shadow: none; }\\n}\\n\\n.sprite-selector_placeholder_qVnyI > .sprite-selector_sprite_uquo4 {\\n background: black;\\n filter: opacity(15%) brightness(0%);\\n}\\n',\"\"]),t.locals={\"sprite-selector\":\"sprite-selector_sprite-selector_1s2N2\",spriteSelector:\"sprite-selector_sprite-selector_1s2N2\",\"sprite-wrapper\":\"sprite-selector_sprite-wrapper_1CrRS\",spriteWrapper:\"sprite-selector_sprite-wrapper_1CrRS\",sprite:\"sprite-selector_sprite_uquo4\",\"scroll-wrapper\":\"sprite-selector_scroll-wrapper_3qlZ7\",scrollWrapper:\"sprite-selector_scroll-wrapper_3qlZ7\",\"scroll-wrapper-dragging\":\"sprite-selector_scroll-wrapper-dragging_2tIRk\",scrollWrapperDragging:\"sprite-selector_scroll-wrapper-dragging_2tIRk\",\"items-wrapper\":\"sprite-selector_items-wrapper_17MEf\",itemsWrapper:\"sprite-selector_items-wrapper_17MEf\",\"add-button\":\"sprite-selector_add-button_13cFJ\",addButton:\"sprite-selector_add-button_13cFJ\",raised:\"sprite-selector_raised_hptEE\",wiggle:\"sprite-selector_wiggle_3VXHB\",receivedBlocks:\"sprite-selector_receivedBlocks_3hqzt\",glowing:\"sprite-selector_glowing_1Uyz7\",placeholder:\"sprite-selector_placeholder_qVnyI\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.stage-selector_stage-selector_2gOfn {\\n background-clip: padding-box;\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n position: relative; /* For the add backdrop button */\\n flex-grow: 1;\\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\\n background-color: var(--ui-white);\\n color: var(--text-primary);\\n border-top-left-radius: 0.5rem;\\n border-top-right-radius: 0.5rem;\\n border-color: var(--ui-black-transparent);\\n border-width: 1px;\\n border-style: solid;\\n border-bottom: 0;\\n cursor: pointer;\\n transition: all 0.25s ease;\\n}\\n\\n.stage-selector_stage-selector_2gOfn.stage-selector_is-selected_1hK41 {\\n border-top-left-radius: .625rem;\\n border-top-right-radius: .625rem;\\n border-color: var(--looks-secondary);\\n box-shadow: 0px 0px 0px 4px var(--looks-transparent);\\n}\\n\\n.stage-selector_stage-selector_2gOfn:hover {\\n border-color: var(--looks-secondary);\\n}\\n\\n.stage-selector_header_Q8vgs {\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n justify-content: center;\\n height: calc(2.75rem - 2px);\\n background-color: var(--ui-white);\\n color: var(--text-primary);\\n border-top-left-radius: 0.5rem;\\n border-top-right-radius: 0.5rem;\\n border-bottom: 1px solid var(--ui-black-transparent);\\n width: 100%;\\n transition: background-color 0.25s ease;\\n}\\n\\n.stage-selector_header-title_31bX- {\\n font-size: 0.625rem;\\n font-weight: bold;\\n color: var(--text-primary);\\n\\n /* @todo: make this a mixin for all UI text labels */\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n transition: color 0.25s ease;\\n}\\n\\n.stage-selector_stage-selector_2gOfn.stage-selector_is-selected_1hK41 .stage-selector_header_Q8vgs {\\n background-color: var(--looks-secondary);\\n}\\n\\n.stage-selector_stage-selector_2gOfn.stage-selector_is-selected_1hK41 .stage-selector_header-title_31bX- {\\n color: #ffffff;\\n}\\n\\n.stage-selector_count_R71ju {\\n padding: 0.3rem 0.75rem;\\n font-size: 0.625rem;\\n color: var(--text-primary);\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n\\n.stage-selector_label_XZ-2e {\\n margin: 0.75rem 0 0.25rem;\\n font-size: 0.6rem;\\n color: var(--text-primary);\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n text-align: center;\\n}\\n\\n.stage-selector_costume-canvas_2UktB {\\n display: block;\\n margin-top: .25rem;\\n width: 100%;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n border: 1px solid var(--ui-black-transparent);\\n border-radius: .25rem;\\n box-shadow: inset 0 0 4px var(--shadow);\\n max-width: 64px;\\n max-height: 48px;\\n}\\n\\n.stage-selector_add-button_oXPPX {\\n position: absolute;\\n bottom: 0.75rem;\\n}\\n\\n.stage-selector_raised_3yRmS, .stage-selector_raised_3yRmS .stage-selector_header_Q8vgs {\\n background-color: var(--drop-highlight);\\n transition: all 0.25s ease;\\n}\\n\\n.stage-selector_raised_3yRmS:hover {\\n transform: scale(1.05);\\n}\\n\\n.stage-selector_receivedBlocks_27hDS {\\n animation: stage-selector_glowing_24P3U 250ms;\\n}\\n\\n@keyframes stage-selector_glowing_24P3U {\\n 10% { box-shadow: 0 0 10px #7fff1e; }\\n 90% { box-shadow: 0 0 10px #7fff1e; }\\n 100% { box-shadow: none; }\\n}\\n',\"\"]),t.locals={\"stage-selector\":\"stage-selector_stage-selector_2gOfn\",stageSelector:\"stage-selector_stage-selector_2gOfn\",\"is-selected\":\"stage-selector_is-selected_1hK41\",isSelected:\"stage-selector_is-selected_1hK41\",header:\"stage-selector_header_Q8vgs\",\"header-title\":\"stage-selector_header-title_31bX-\",headerTitle:\"stage-selector_header-title_31bX-\",count:\"stage-selector_count_R71ju\",label:\"stage-selector_label_XZ-2e\",\"costume-canvas\":\"stage-selector_costume-canvas_2UktB\",costumeCanvas:\"stage-selector_costume-canvas_2UktB\",\"add-button\":\"stage-selector_add-button_oXPPX\",addButton:\"stage-selector_add-button_oXPPX\",raised:\"stage-selector_raised_3yRmS\",receivedBlocks:\"stage-selector_receivedBlocks_27hDS\",glowing:\"stage-selector_glowing_24P3U\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n.target-pane_target-pane_2ZTsJ {\\n /* Makes columns for the sprite library selector + and the stage selector */\\n display: flex;\\n flex-direction: row;\\n flex-grow: 1;\\n}\\n\\n.target-pane_stage-selector-wrapper_2LIOy {\\n display: flex;\\n flex-basis: 72px;\\n flex-shrink: 0;\\n}\\n\\n[dir=\"ltr\"] .target-pane_stage-selector-wrapper_2LIOy {\\n margin-left: calc(0.5rem / 2);\\n}\\n\\n[dir=\"rtl\"] .target-pane_stage-selector-wrapper_2LIOy {\\n margin-right: calc(0.5rem / 2);\\n}\\n',\"\"]),t.locals={\"target-pane\":\"target-pane_target-pane_2ZTsJ\",targetPane:\"target-pane_target-pane_2ZTsJ\",\"stage-selector-wrapper\":\"target-pane_stage-selector-wrapper_2LIOy\",stageSelectorWrapper:\"target-pane_stage-selector-wrapper_2LIOy\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\"/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.meter_green_1TDyl {\\n fill: rgb(171, 220, 170);\\n stroke: rgb(174, 211, 168);\\n}\\n\\n.meter_yellow_YVGHr {\\n fill: rgb(251, 219, 130);\\n stroke: rgb(239, 212, 134);\\n}\\n\\n.meter_red_S3fdX {\\n fill: rgb(251, 194, 142);\\n stroke: rgb(235, 189, 142);\\n}\\n\\n.meter_mask-container_m3uVt {\\n position: relative;\\n}\\n\\n.meter_mask_1s9vE {\\n position: absolute;\\n top: 0;\\n left: 0;\\n height: 100%;\\n width: 100%;\\n transform-origin: top;\\n will-change: transform;\\n background: var(--ui-primary);\\n opacity: 0.75;\\n}\\n\",\"\"]),t.locals={green:\"meter_green_1TDyl\",yellow:\"meter_yellow_YVGHr\",red:\"meter_red_S3fdX\",\"mask-container\":\"meter_mask-container_m3uVt\",maskContainer:\"meter_mask-container_m3uVt\",mask:\"meter_mask_1s9vE\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\"/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.waveform_container_243I7 {\\n width: 100%;\\n}\\n\\n.waveform_waveform-path_2LeiM {\\n /*\\n This color is lighter than sound-primary, but\\n cannot use alpha because of overlapping elements.\\n */\\n fill: hsl(300, 54%, 72%);\\n stroke: var(--sound-tertiary);\\n}\\n\\n.waveform_baseline_2hE-m {\\n stroke: var(--sound-tertiary);\\n}\\n\",\"\"]),t.locals={container:\"waveform_container_243I7\",\"waveform-path\":\"waveform_waveform-path_2LeiM\",waveformPath:\"waveform_waveform-path_2LeiM\",baseline:\"waveform_baseline_2hE-m\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* overridden by src/lib/themes/guiHelpers.js */\\n\\n/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n.record-modal_modal-content_2_5Zs {\\n width: 600px;\\n}\\n\\n.record-modal_body_3oKwC {\\n background: var(--ui-modal-background);\\n padding: 1.5rem 2.25rem;\\n}\\n\\n.record-modal_visualization-container_1QsU5 {\\n display: flex;\\n justify-content: space-around;\\n}\\n\\n.record-modal_meter-container_3vpbL, .record-modal_waveform-container_1d_a5 {\\n background: var(--ui-primary);\\n border: 1px solid var(--ui-black-transparent);\\n border-radius: 5px;\\n padding: 3px;\\n /* Force these to be on their own render layer because they update often */\\n transform: translateZ(0);\\n}\\n\\n.record-modal_meter-container_3vpbL {\\n margin-right: 5px;\\n height: 180px;\\n}\\n\\n.record-modal_waveform-container_1d_a5 {\\n display: flex;\\n justify-content: space-around;\\n align-items: center;\\n width: 100%;\\n height: 180px;\\n position: relative;\\n}\\n\\n.record-modal_help-text_hQoTW {\\n margin: 10px auto 0;\\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\\n color: rgb(167, 170, 181);\\n font-size: 0.95rem;\\n font-weight: 500;\\n}\\n\\n.record-modal_playing-text_20o4n {\\n color: var(--looks-secondary);\\n}\\n\\n.record-modal_recording-text_3AD3U {\\n color: var(--red-primary);\\n}\\n\\n.record-modal_main-button-row_3Vifq {\\n display: flex;\\n justify-content: space-around;\\n margin-top: 15px;\\n}\\n\\n.record-modal_main-button-row_3Vifq button {\\n padding: 0.5rem 0.75rem;\\n border-radius: 0.25rem;\\n background: transparent;\\n border: none;\\n}\\n\\n.record-modal_main-button-row_3Vifq button:disabled {\\n opacity: 0.25;\\n}\\n\\n.record-modal_main-button-row_3Vifq button:active, .record-modal_main-button-row_3Vifq button:focus {\\n outline: none;\\n}\\n\\n.record-modal_button-row_3qJ_b {\\n font-weight: bolder;\\n text-align: right;\\n display: flex;\\n justify-content: space-between;\\n}\\n\\n.record-modal_button-row_3qJ_b button {\\n padding: 0.75rem 1rem;\\n border-radius: 0.25rem;\\n background: white;\\n border: 1px solid var(--ui-black-transparent);\\n font-weight: 600;\\n font-size: 0.85rem;\\n color: var(--looks-secondary);\\n}\\n\\n.record-modal_button-row_3qJ_b button.record-modal_ok-button_CoeuZ {\\n background: var(--looks-secondary);\\n border: var(--looks-secondary);\\n color: white;\\n}\\n\\n.record-modal_button-row_3qJ_b button + button {\\n margin-left: 0.5rem;\\n}\\n\\n.record-modal_main-button_3eLhw {\\n text-align: center;\\n}\\n\\n/* Increase specificity to make sure this wins out over normalize.css */\\n\\nsvg.record-modal_record-button_1Lapz {\\n overflow: visible;\\n}\\n\\n.record-modal_record-button-circle_Cr04k {\\n fill: var(--red-primary);\\n stroke: var(--red-tertiary);\\n}\\n\\n.record-modal_record-button-circle-outline_2nUeJ {\\n fill: var(--red-primary);\\n opacity: 0.2;\\n transition: 0.1s;\\n}\\n\\n[dir=\"rtl\"] .record-modal_rerecord-button_3JZP1 img {\\n transform: scaleX(-1);\\n}\\n',\"\"]),t.locals={\"modal-content\":\"record-modal_modal-content_2_5Zs\",modalContent:\"record-modal_modal-content_2_5Zs\",body:\"record-modal_body_3oKwC\",\"visualization-container\":\"record-modal_visualization-container_1QsU5\",visualizationContainer:\"record-modal_visualization-container_1QsU5\",\"meter-container\":\"record-modal_meter-container_3vpbL\",meterContainer:\"record-modal_meter-container_3vpbL\",\"waveform-container\":\"record-modal_waveform-container_1d_a5\",waveformContainer:\"record-modal_waveform-container_1d_a5\",\"help-text\":\"record-modal_help-text_hQoTW\",helpText:\"record-modal_help-text_hQoTW\",\"playing-text\":\"record-modal_playing-text_20o4n\",playingText:\"record-modal_playing-text_20o4n\",\"recording-text\":\"record-modal_recording-text_3AD3U\",recordingText:\"record-modal_recording-text_3AD3U\",\"main-button-row\":\"record-modal_main-button-row_3Vifq\",mainButtonRow:\"record-modal_main-button-row_3Vifq\",\"button-row\":\"record-modal_button-row_3qJ_b\",buttonRow:\"record-modal_button-row_3qJ_b\",\"ok-button\":\"record-modal_ok-button_CoeuZ\",okButton:\"record-modal_ok-button_CoeuZ\",\"main-button\":\"record-modal_main-button_3eLhw\",mainButton:\"record-modal_main-button_3eLhw\",\"record-button\":\"record-modal_record-button_1Lapz\",recordButton:\"record-modal_record-button_1Lapz\",\"record-button-circle\":\"record-modal_record-button-circle_Cr04k\",recordButtonCircle:\"record-modal_record-button-circle_Cr04k\",\"record-button-circle-outline\":\"record-modal_record-button-circle-outline_2nUeJ\",recordButtonCircleOutline:\"record-modal_record-button-circle-outline_2nUeJ\",\"rerecord-button\":\"record-modal_rerecord-button_3JZP1\",rerecordButton:\"record-modal_rerecord-button_3JZP1\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\"/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.audio-trimmer_absolute_1slrG {\\n position: absolute;\\n top: 0;\\n left: 0;\\n width: 100%;\\n height: 100%;\\n\\n /* Force the browser to paint separately to avoid composite cost with waveform */\\n transform: translateZ(0);\\n}\\n\\n.audio-trimmer_selector_UDd9z {\\n cursor: pointer;\\n}\\n\\n.audio-trimmer_trim-background_MidSN {\\n cursor: pointer;\\n touch-action: none;\\n}\\n\\n.audio-trimmer_trim-background-mask_1AUPs {\\n border: 1px solid var(--red-tertiary);\\n opacity: 0.5;\\n\\n background: repeating-linear-gradient(\\n 45deg,\\n var(--red-primary),\\n var(--red-primary) 10px,\\n var(--red-tertiary) 10px,\\n var(--red-tertiary) calc(2 * 10px)\\n );\\n}\\n\\n.audio-trimmer_selection-background_28rcO {\\n background: var(--looks-secondary);\\n opacity: 0.5;\\n}\\n\\n.audio-trimmer_start-trim-background_1AI_1 .audio-trimmer_trim-background-mask_1AUPs {\\n border-top-left-radius: 4px;\\n border-bottom-left-radius: 4px;\\n}\\n\\n.audio-trimmer_end-trim-background_3P7V_ .audio-trimmer_trim-background-mask_1AUPs {\\n border-top-right-radius: 4px;\\n border-bottom-right-radius: 4px;\\n}\\n\\n.audio-trimmer_trim-line_3PC6A {\\n position: absolute;\\n top: 0;\\n width: 0px;\\n height: 100%;\\n border: 1px solid var(--red-tertiary);\\n}\\n\\n.audio-trimmer_selector_UDd9z .audio-trimmer_trim-line_3PC6A {\\n border: 1px solid var(--looks-secondary);\\n}\\n\\n.audio-trimmer_playhead-container_Louu9 {\\n position: absolute;\\n top: 0;\\n left: 0;\\n height: 100%;\\n width: 100%;\\n overflow: hidden;\\n}\\n\\n.audio-trimmer_playhead_3CwOH {\\n /*\\n Even though playhead is just a line, it is 100% width (the width of the waveform)\\n so that we can use transform: translateX() using percentages.\\n */\\n width: 100%;\\n height: 100%;\\n border-left: 1px solid var(--looks-secondary);\\n border-top: none;\\n border-bottom: none;\\n border-right: none;\\n}\\n\\n.audio-trimmer_right-handle_3gcG9 {\\n transform: scaleX(-1);\\n}\\n\\n.audio-trimmer_selector_UDd9z .audio-trimmer_left-handle_1qrCu {\\n left: -1px\\n}\\n\\n.audio-trimmer_selector_UDd9z .audio-trimmer_right-handle_3gcG9 {\\n right: -1px\\n}\\n\\n.audio-trimmer_trimmer_3g1Ji .audio-trimmer_left-handle_1qrCu {\\n right: -1px\\n}\\n\\n.audio-trimmer_trimmer_3g1Ji .audio-trimmer_right-handle_3gcG9 {\\n left: -1px\\n}\\n\\n.audio-trimmer_trim-handle_2yTDR {\\n position: absolute;\\n width: 30px;\\n height: 30px;\\n right: 0;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n\\n.audio-trimmer_trimmer_3g1Ji .audio-trimmer_trim-handle_2yTDR {\\n filter: hue-rotate(-240deg) brightness(1.35);\\n}\\n\\n.audio-trimmer_trim-handle_2yTDR img {\\n position: absolute;\\n width: 30px;\\n height: 30px;\\n left: calc(3px * 1.5);\\n\\n /* Make sure image dragging isn't triggered */\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n user-drag: none;\\n -webkit-user-drag: none; /* Autoprefixer doesn't seem to work for this */\\n\\n transition: 0.2s;\\n}\\n\\n.audio-trimmer_top-trim-handle_1CMHx {\\n top: calc(-30px + 3px);\\n}\\n\\n.audio-trimmer_bottom-trim-handle_3ZW0o {\\n bottom: calc(-30px + 3px);\\n}\\n\\n.audio-trimmer_top-trim-handle_1CMHx img {\\n transform: scaleY(-1);\\n}\\n\",\"\"]),t.locals={absolute:\"audio-trimmer_absolute_1slrG\",selector:\"audio-trimmer_selector_UDd9z\",\"trim-background\":\"audio-trimmer_trim-background_MidSN\",trimBackground:\"audio-trimmer_trim-background_MidSN\",\"trim-background-mask\":\"audio-trimmer_trim-background-mask_1AUPs\",trimBackgroundMask:\"audio-trimmer_trim-background-mask_1AUPs\",\"selection-background\":\"audio-trimmer_selection-background_28rcO\",selectionBackground:\"audio-trimmer_selection-background_28rcO\",\"start-trim-background\":\"audio-trimmer_start-trim-background_1AI_1\",startTrimBackground:\"audio-trimmer_start-trim-background_1AI_1\",\"end-trim-background\":\"audio-trimmer_end-trim-background_3P7V_\",endTrimBackground:\"audio-trimmer_end-trim-background_3P7V_\",\"trim-line\":\"audio-trimmer_trim-line_3PC6A\",trimLine:\"audio-trimmer_trim-line_3PC6A\",\"playhead-container\":\"audio-trimmer_playhead-container_Louu9\",playheadContainer:\"audio-trimmer_playhead-container_Louu9\",playhead:\"audio-trimmer_playhead_3CwOH\",\"right-handle\":\"audio-trimmer_right-handle_3gcG9\",rightHandle:\"audio-trimmer_right-handle_3gcG9\",\"left-handle\":\"audio-trimmer_left-handle_1qrCu\",leftHandle:\"audio-trimmer_left-handle_1qrCu\",trimmer:\"audio-trimmer_trimmer_3g1Ji\",\"trim-handle\":\"audio-trimmer_trim-handle_2yTDR\",trimHandle:\"audio-trimmer_trim-handle_2yTDR\",\"top-trim-handle\":\"audio-trimmer_top-trim-handle_1CMHx\",topTrimHandle:\"audio-trimmer_top-trim-handle_1CMHx\",\"bottom-trim-handle\":\"audio-trimmer_bottom-trim-handle_3ZW0o\",bottomTrimHandle:\"audio-trimmer_bottom-trim-handle_3ZW0o\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.icon-button_container_Vz-T6 {\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n cursor: pointer;\\n font-size: 0.75rem;\\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\\n color: var(--looks-secondary);\\n border-radius: 0.5rem;\\n}\\n\\n.icon-button_container_Vz-T6 + .icon-button_container_Vz-T6 {\\n margin-top: 1.25rem;\\n}\\n\\n.icon-button_title_3_47t {\\n margin-top: 0.5rem;\\n text-align: center;\\n}\\n\\n.icon-button_disabled_14mfd {\\n opacity: 0.5;\\n pointer-events: none;\\n}\\n\\n.icon-button_container_Vz-T6:active {\\n background-color: var(--looks-light-transparent);\\n}\\n',\"\"]),t.locals={container:\"icon-button_container_Vz-T6\",title:\"icon-button_title_3_47t\",disabled:\"icon-button_disabled_14mfd\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* overridden by src/lib/themes/guiHelpers.js */\\n\\n/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n.sound-editor_editor-container_3jiU9 {\\n display: flex;\\n flex-direction: column;\\n flex-grow: 1;\\n padding: calc(2 * 0.5rem);\\n}\\n\\n.sound-editor_row_1WmTk {\\n display: flex;\\n flex-direction: row;\\n align-items: center;\\n}\\n\\n[dir=\"rtl\"] .sound-editor_row-reverse_28RND {\\n flex-direction: row-reverse;\\n}\\n\\n.sound-editor_row_1WmTk + .sound-editor_row_1WmTk {\\n margin-top: calc(2 * 0.5rem);\\n}\\n\\n.sound-editor_input-group_2pRFc {\\n display: flex;\\n flex-direction: row;\\n}\\n\\n[dir=\"ltr\"] .sound-editor_input-group_2pRFc + .sound-editor_input-group_2pRFc {\\n margin-left: calc(2 * 0.5rem);\\n}\\n\\n[dir=\"rtl\"] .sound-editor_input-group_2pRFc + .sound-editor_input-group_2pRFc {\\n margin-right: calc(2 * 0.5rem);\\n}\\n\\n[dir=\"ltr\"] .sound-editor_input-group_2pRFc {\\n padding-right: calc(2 * 0.5rem);\\n border-right: 1px dashed var(--ui-black-transparent);\\n}\\n\\n[dir=\"rtl\"] .sound-editor_input-group_2pRFc {\\n padding-left: calc(2 * 0.5rem);\\n border-left: 1px dashed var(--ui-black-transparent);\\n}\\n\\n[dir=\"rtl\"] .sound-editor_row-reverse_28RND > .sound-editor_input-group_2pRFc {\\n padding-left: 0;\\n padding-right: calc(2 * 0.5rem);\\n border-left: none;\\n border-right: 1px dashed var(--ui-black-transparent);\\n}\\n\\n.sound-editor_name-input_2eET8 {\\n width: 100%;\\n}\\n\\n.sound-editor_waveform-container_18kSV {\\n display: flex;\\n justify-content: space-around;\\n align-items: center;\\n width: 100%;\\n\\n position: relative;\\n\\n background: hsla(300, 53%, 60%, 0.15);\\n border: 1px solid var(--ui-black-transparent);\\n border-radius: 5px;\\n\\n margin-top: 20px;\\n margin-bottom: 20px;\\n}\\n\\n.sound-editor_button_28oLj {\\n height: 2rem;\\n padding: 0.35rem;\\n outline: none;\\n background: var(--ui-white);\\n border-radius: 0.25rem;\\n border: 1px solid var(--ui-black-transparent);\\n cursor: pointer;\\n font-size: 0.85rem;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n margin: 0px;\\n position: relative;\\n}\\n\\n.sound-editor_button_28oLj:active {\\n background: var(--looks-transparent);\\n}\\n\\n.sound-editor_button_28oLj:focus::before {\\n content: \"\";\\n position: absolute;\\n top: -1px;\\n right: -1px;\\n bottom: -1px;\\n left: -1px;\\n border: 1px solid var(--looks-secondary);\\n z-index: 1;\\n}\\n\\n.sound-editor_button_28oLj > img {\\n flex-grow: 1;\\n max-width: 100%;\\n max-height: 100%;\\n min-width: 1.25rem;\\n}\\n\\n.sound-editor_round-button-outer_VC2nB {\\n display: flex;\\n align-items: center;\\n height: 100%;\\n}\\n\\n.sound-editor_round-button_3rlXm {\\n height: 3rem;\\n width: 3rem;\\n outline: none;\\n background: var(--looks-secondary);\\n border-radius: 100%;\\n border: none;\\n cursor: pointer;\\n padding: 0.75rem;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n\\n.sound-editor_round-button_3rlXm > img {\\n flex-grow: 1;\\n max-width: 100%;\\n max-height: 100%;\\n /*min-width: 1.5rem;*/\\n}\\n\\n[dir=\"rtl\"] .sound-editor_undo-icon_3EU8L, [dir=\"rtl\"] .sound-editor_redo-icon_38hFn {\\n transform: scaleX(-1);\\n}\\n\\n.sound-editor_trim-button_ZHKTA {\\n display: flex;\\n align-items: center;\\n color: var(--text-primary);\\n font-size: 0.625rem;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n\\n}\\n\\n[dir=\"ltr\"] .sound-editor_trim-button_ZHKTA {\\n margin-left: 1rem;\\n}\\n\\n[dir=\"rtl\"] .sound-editor_trim-button_ZHKTA {\\n margin-right: 1rem;\\n}\\n\\n.sound-editor_trim-button_ZHKTA > img {\\n width: 1.25rem;\\n}\\n\\n.sound-editor_effects_3n1kV {\\n display: flex;\\n flex-wrap: wrap;\\n width: 100%;\\n}\\n\\n.sound-editor_effect-button_2rpzQ {\\n flex-basis: 60px;\\n color: var(--text-primary);\\n font-size: 0.625rem;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n padding: 0.25rem 0;\\n}\\n\\n.sound-editor_effect-button_2rpzQ + .sound-editor_effect-button_2rpzQ {\\n margin: 0;\\n}\\n\\n.sound-editor_effect-button_2rpzQ img {\\n width: 1.25rem;\\n height: 1.25rem;\\n margin-bottom: -0.375rem;\\n}\\n\\n.sound-editor_tool-button_2WOCS {\\n flex-basis: 60px;\\n color: var(--text-primary);\\n font-size: 0.625rem;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n padding: 0.25rem 0;\\n}\\n\\n.sound-editor_tool-button_2WOCS + .sound-editor_tool-button_2WOCS {\\n margin: 0;\\n}\\n\\n.sound-editor_tool-button_2WOCS img {\\n width: 4rem;\\n height: 1.5rem;\\n margin-bottom: -0.375rem;\\n}\\n\\n[dir=\"rtl\"] .sound-editor_flip-in-rtl_2pijE img {\\n transform: scaleX(-1);\\n}\\n\\n[dir=\"ltr\"] .sound-editor_button-group_3TC6- {\\n margin-left: 1rem;\\n}\\n\\n[dir=\"rtl\"] .sound-editor_button-group_3TC6- {\\n margin-right: 1rem;\\n}\\n\\n.sound-editor_button-group_3TC6- {\\n display: flex;\\n}\\n\\n.sound-editor_button-group_3TC6- .sound-editor_button_28oLj {\\n border-radius: 0;\\n}\\n\\n.sound-editor_button_28oLj:not(:last-child) {\\n border-right: none;\\n}\\n\\n[dir=\"rtl\"] .sound-editor_button_28oLj:not(:last-child) {\\n border-left: none;\\n border-right: 1px solid var(--ui-black-transparent);\\n}\\n\\n.sound-editor_button-group_3TC6- .sound-editor_button_28oLj:first-child,\\n[dir=\"rtl\"] .sound-editor_button-group_3TC6- .sound-editor_button_28oLj:last-child,\\n.sound-editor_button-group_3TC6- .sound-editor_button_28oLj:first-child:focus::before,\\n[dir=\"rtl\"] .sound-editor_button-group_3TC6- .sound-editor_button_28oLj:last-child:focus::before {\\n border-radius: calc(0.5rem / 2) 0 0 calc(0.5rem / 2);\\n}\\n\\n.sound-editor_button-group_3TC6- .sound-editor_button_28oLj:last-child,\\n[dir=\"rtl\"] .sound-editor_button-group_3TC6- .sound-editor_button_28oLj:first-child,\\n.sound-editor_button-group_3TC6- .sound-editor_button_28oLj:last-child:focus::before,\\n[dir=\"rtl\"] .sound-editor_button-group_3TC6- .sound-editor_button_28oLj:first-child:focus::before {\\n border-radius: 0 calc(0.5rem / 2) calc(0.5rem / 2) 0;\\n}\\n\\n.sound-editor_button_28oLj:disabled > img {\\n opacity: 0.25;\\n}\\n\\n.sound-editor_info-row_1n0C6 {\\n display: flex;\\n justify-content: space-between;\\n margin-top: calc(2 * 0.5rem);\\n}\\n\\n.sound-editor_duration_1Kz-h {\\n font-weight: bold;\\n}\\n\\n.sound-editor_advanced-info_1_0Bb {\\n\\n}\\n\\n.sound-editor_alert_vTKxi {\\n margin-top: calc(2 * 0.5rem);\\n border-radius: 5px;\\n padding: 0.5rem;\\n display: flex;\\n align-items: center;\\n border-width: 1px;\\n border-style: solid;\\n}\\n\\n.sound-editor_stereo_xnbN5 {\\n background-color: rgba(145, 145, 255, 0.3);\\n border-color: rgb(145, 145, 255)\\n}\\n\\n.sound-editor_too-large_F2uJd {\\n background-color: rgba(255, 119, 0, 0.3);\\n border-color: rgb(255, 119, 0);\\n}\\n',\"\"]),t.locals={\"editor-container\":\"sound-editor_editor-container_3jiU9\",editorContainer:\"sound-editor_editor-container_3jiU9\",row:\"sound-editor_row_1WmTk\",\"row-reverse\":\"sound-editor_row-reverse_28RND\",rowReverse:\"sound-editor_row-reverse_28RND\",\"input-group\":\"sound-editor_input-group_2pRFc\",inputGroup:\"sound-editor_input-group_2pRFc\",\"name-input\":\"sound-editor_name-input_2eET8\",nameInput:\"sound-editor_name-input_2eET8\",\"waveform-container\":\"sound-editor_waveform-container_18kSV\",waveformContainer:\"sound-editor_waveform-container_18kSV\",button:\"sound-editor_button_28oLj\",\"round-button-outer\":\"sound-editor_round-button-outer_VC2nB\",roundButtonOuter:\"sound-editor_round-button-outer_VC2nB\",\"round-button\":\"sound-editor_round-button_3rlXm\",roundButton:\"sound-editor_round-button_3rlXm\",\"undo-icon\":\"sound-editor_undo-icon_3EU8L\",undoIcon:\"sound-editor_undo-icon_3EU8L\",\"redo-icon\":\"sound-editor_redo-icon_38hFn\",redoIcon:\"sound-editor_redo-icon_38hFn\",\"trim-button\":\"sound-editor_trim-button_ZHKTA\",trimButton:\"sound-editor_trim-button_ZHKTA\",effects:\"sound-editor_effects_3n1kV\",\"effect-button\":\"sound-editor_effect-button_2rpzQ\",effectButton:\"sound-editor_effect-button_2rpzQ\",\"tool-button\":\"sound-editor_tool-button_2WOCS\",toolButton:\"sound-editor_tool-button_2WOCS\",\"flip-in-rtl\":\"sound-editor_flip-in-rtl_2pijE\",flipInRtl:\"sound-editor_flip-in-rtl_2pijE\",\"button-group\":\"sound-editor_button-group_3TC6-\",buttonGroup:\"sound-editor_button-group_3TC6-\",\"info-row\":\"sound-editor_info-row_1n0C6\",infoRow:\"sound-editor_info-row_1n0C6\",duration:\"sound-editor_duration_1Kz-h\",\"advanced-info\":\"sound-editor_advanced-info_1_0Bb\",advancedInfo:\"sound-editor_advanced-info_1_0Bb\",alert:\"sound-editor_alert_vTKxi\",stereo:\"sound-editor_stereo_xnbN5\",\"too-large\":\"sound-editor_too-large_F2uJd\",tooLarge:\"sound-editor_too-large_F2uJd\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\".sound-editor-not-supported_container_xaEf- {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n text-align: center;\\n width: 100%;\\n height: 100%;\\n font-size: 1.5em;\\n}\\n\",\"\"]),t.locals={container:\"sound-editor-not-supported_container_xaEf-\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\"/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.green-flag_green-flag_mk1Vo {\\n width: 2rem;\\n height: 2rem;\\n padding: 0.375rem;\\n border-radius: 0.25rem;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n user-drag: none;\\n cursor: pointer;\\n}\\n\\n.green-flag_green-flag_mk1Vo:hover {\\n background-color: var(--looks-light-transparent);\\n}\\n\\n.green-flag_green-flag_mk1Vo.green-flag_is-active_17xP9 {\\n background-color: var(--looks-transparent);\\n}\\n\",\"\"]),t.locals={\"green-flag\":\"green-flag_green-flag_mk1Vo\",greenFlag:\"green-flag_green-flag_mk1Vo\",\"is-active\":\"green-flag_is-active_17xP9\",isActive:\"green-flag_is-active_17xP9\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\"/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.stop-all_stop-all_15h2t {\\n width: 2rem;\\n height: 2rem;\\n padding: 0.375rem;\\n border-radius: 0.25rem;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n cursor: pointer;\\n}\\n\\n.stop-all_stop-all_15h2t:hover {\\n background-color: var(--looks-light-transparent);\\n}\\n\\n.stop-all_stop-all_15h2t {\\n opacity: 0.5;\\n}\\n\\n.stop-all_stop-all_15h2t.stop-all_is-active_PEgCP {\\n opacity: 1;\\n}\\n\",\"\"]),t.locals={\"stop-all\":\"stop-all_stop-all_15h2t\",stopAll:\"stop-all_stop-all_15h2t\",\"is-active\":\"stop-all_is-active_PEgCP\",isActive:\"stop-all_is-active_PEgCP\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.turbo-mode_turbo-container_1qQFO {\\n display: flex;\\n align-items: center;\\n padding: 0.25rem;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n\\n.turbo-mode_turbo-icon_A_vJA {\\n margin: 0.25rem;\\n}\\n\\n.turbo-mode_turbo-label_1v23d {\\n font-size: 0.625rem;\\n font-weight: bold;\\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\\n color: var(--control-primary);\\n white-space: nowrap;\\n}\\n',\"\"]),t.locals={\"turbo-container\":\"turbo-mode_turbo-container_1qQFO\",turboContainer:\"turbo-mode_turbo-container_1qQFO\",\"turbo-icon\":\"turbo-mode_turbo-icon_A_vJA\",turboIcon:\"turbo-mode_turbo-icon_A_vJA\",\"turbo-label\":\"turbo-mode_turbo-label_1v23d\",turboLabel:\"turbo-mode_turbo-label_1v23d\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.framerate-indicator_framerate-container_3JPah {\\n display: flex;\\n align-items: center;\\n padding: 0.25rem;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n\\n.framerate-indicator_framerate-label_39miY {\\n font-size: 0.625rem;\\n font-weight: bold;\\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\\n color: var(--control-primary);\\n white-space: nowrap;\\n}\\n',\"\"]),t.locals={\"framerate-container\":\"framerate-indicator_framerate-container_3JPah\",framerateContainer:\"framerate-indicator_framerate-container_3JPah\",\"framerate-label\":\"framerate-indicator_framerate-label_39miY\",framerateLabel:\"framerate-indicator_framerate-label_39miY\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\".controls_controls-container_3ZRI_ {\\n display: flex;\\n}\\n\",\"\"]),t.locals={\"controls-container\":\"controls_controls-container_3ZRI_\",controlsContainer:\"controls_controls-container_3ZRI_\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n/* overridden by src/lib/themes/guiHelpers.js */\\n\\n/*\\n Contains constants for the z-index values of elements that are part of the global stack context.\\n In other words, z-index values that are \"inside\" a component are not added here.\\n This prevents conflicts between identical z-index values in different components.\\n*/\\n\\n/* Toolbox z-index: 40; set in scratch-blocks */\\n\\n/* tooltips should go over add buttons if they overlap */\\n\\n/* monitors go over add buttons */\\n\\n/* \"ask\" block text input goes above monitors */\\n\\n/* menu-bar should go over monitors, alerts and tutorials */\\n\\n/* behind menu-bar */\\n\\n/* Block drag z-index: 1000; default 50 is overriden in blocks.css */\\n\\n/* so it is draggable into other panes */\\n\\n/* behind modals */\\n\\n/* behind modals */\\n\\n/* in most interfaces, the context menu is always on top */\\n\\n.stage-header_stage-header-wrapper_8psPs {\\n position: absolute;\\n top: 0;\\n}\\n\\n[dir=\"ltr\"] .stage-header_stage-header-wrapper_8psPs {\\n right: 0;\\n}\\n\\n[dir=\"rtl\"] .stage-header_stage-header-wrapper_8psPs {\\n left: 0;\\n}\\n\\n.stage-header_stage-header-wrapper-overlay_7uuff {\\n position: fixed;\\n background-color: var(--fullscreen-accent);\\n top: 0;\\n left: 0;\\n right: 0;\\n z-index: 500;\\n}\\n\\n.stage-header_stage-header-wrapper-overlay_7uuff.stage-header_embedded_j6-4O {\\n background-color: transparent;\\n}\\n\\n.stage-header_stage-menu-wrapper_28MSs {\\n display: flex;\\n margin: auto;\\n justify-content: space-between;\\n flex-shrink: 0;\\n align-items: center;\\n height: 2.75rem;\\n padding-top: 0.5rem;\\n padding-bottom: 0.5rem;\\n}\\n\\n.stage-header_stage-size-row_1F3iv {\\n display: flex;\\n}\\n\\n.stage-header_stage-size-toggle-group_np08Q {\\n display: flex;\\n}\\n\\n.stage-header_stage-size-row_1F3iv > *, .stage-header_unselect-wrapper_3rRB- {\\n /* Use a white background so semi-transparent selection states look correct */\\n background-color: var(--ui-white);\\n border-radius: calc(0.5rem / 2);\\n}\\n\\n[dir=\"ltr\"] .stage-header_stage-size-toggle-group_np08Q,\\n[dir=\"ltr\"] .stage-header_settings-button_1c1vS {\\n margin-right: .2rem;\\n}\\n\\n[dir=\"rtl\"] .stage-header_stage-size-toggle-group_np08Q,\\n[dir=\"rtl\"] .stage-header_settings-button_1c1vS {\\n margin-left: .2rem;\\n}\\n\\n.stage-header_stage-button_4qxON {\\n display: block;\\n border: 1px solid var(--ui-black-transparent);\\n border-radius: calc(0.5rem / 2);\\n width: calc(2rem + 2px);\\n height: calc(2rem + 2px);\\n background: var(--ui-white);\\n padding: 0.375rem;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n cursor: pointer;\\n}\\n\\n.stage-header_stage-button_4qxON:active {\\n background-color: var(--looks-transparent);\\n}\\n\\n.stage-header_stage-button-icon_1SHv0 {\\n width: 100%;\\n height: 100%;\\n filter: var(--filter-icon-gray);\\n}\\n\\n[dir=\"rtl\"] .stage-header_stage-button-icon_1SHv0 {\\n transform: scaleX(-1);\\n}\\n\\n.stage-header_fullscreen-buttons-row_15tpO {\\n /* relied on by addons */\\n display: flex;\\n}\\n',\"\"]),t.locals={\"stage-header-wrapper\":\"stage-header_stage-header-wrapper_8psPs\",stageHeaderWrapper:\"stage-header_stage-header-wrapper_8psPs\",\"stage-header-wrapper-overlay\":\"stage-header_stage-header-wrapper-overlay_7uuff\",stageHeaderWrapperOverlay:\"stage-header_stage-header-wrapper-overlay_7uuff\",embedded:\"stage-header_embedded_j6-4O\",\"stage-menu-wrapper\":\"stage-header_stage-menu-wrapper_28MSs\",stageMenuWrapper:\"stage-header_stage-menu-wrapper_28MSs\",\"stage-size-row\":\"stage-header_stage-size-row_1F3iv\",stageSizeRow:\"stage-header_stage-size-row_1F3iv\",\"stage-size-toggle-group\":\"stage-header_stage-size-toggle-group_np08Q\",stageSizeToggleGroup:\"stage-header_stage-size-toggle-group_np08Q\",\"unselect-wrapper\":\"stage-header_unselect-wrapper_3rRB-\",unselectWrapper:\"stage-header_unselect-wrapper_3rRB-\",\"settings-button\":\"stage-header_settings-button_1c1vS\",settingsButton:\"stage-header_settings-button_1c1vS\",\"stage-button\":\"stage-header_stage-button_4qxON\",stageButton:\"stage-header_stage-button_4qxON\",\"stage-button-icon\":\"stage-header_stage-button-icon_1SHv0\",stageButtonIcon:\"stage-header_stage-button-icon_1SHv0\",\"fullscreen-buttons-row\":\"stage-header_fullscreen-buttons-row_15tpO\",fullscreenButtonsRow:\"stage-header_fullscreen-buttons-row_15tpO\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\"/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.loupe_color-picker_1hE1x {\\n position: absolute;\\n top: 0;\\n left: 0;\\n border-radius: 100%;\\n border: 4px solid var(--ui-black-transparent);\\n}\\n\",\"\"]),t.locals={\"color-picker\":\"loupe_color-picker_1hE1x\",colorPicker:\"loupe_color-picker_1hE1x\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n/*\\n Contains constants for the z-index values of elements that are part of the global stack context.\\n In other words, z-index values that are \"inside\" a component are not added here.\\n This prevents conflicts between identical z-index values in different components.\\n*/\\n\\n/* Toolbox z-index: 40; set in scratch-blocks */\\n\\n/* tooltips should go over add buttons if they overlap */\\n\\n/* monitors go over add buttons */\\n\\n/* \"ask\" block text input goes above monitors */\\n\\n/* menu-bar should go over monitors, alerts and tutorials */\\n\\n/* behind menu-bar */\\n\\n/* Block drag z-index: 1000; default 50 is overriden in blocks.css */\\n\\n/* so it is draggable into other panes */\\n\\n/* behind modals */\\n\\n/* behind modals */\\n\\n/* in most interfaces, the context menu is always on top */\\n\\n.monitor_monitor-container_BKHcx {\\n position: absolute;\\n background: var(--ui-primary-default);\\n z-index: 48;\\n border: 1px solid var(--ui-black-transparent-default);\\n border-radius: calc(0.5rem / 2);\\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\\n font-size: 0.75rem;\\n transition: box-shadow 0.2s;\\n pointer-events: all;\\n overflow: hidden;\\n}\\n\\n.monitor_monitor_1DS0_:hover {\\n cursor: pointer;\\n}\\n\\n.monitor_dragging_1m_Kt {\\n z-index: 1010;\\n box-shadow: 3px 3px 5px #888888;\\n}\\n\\n.monitor_default-monitor_2KHFc {\\n display: flex;\\n flex-direction: column;\\n padding: 3px;\\n}\\n\\n.monitor_label_1Jx1h {\\n font-weight: bold;\\n text-align: center;\\n margin: 0 5px;\\n}\\n\\n.monitor_value_2DN5C {\\n display: flex;\\n justify-content: center;\\n align-items: center;\\n min-width: 40px;\\n text-align: center;\\n margin: 0 5px;\\n border-radius: calc(0.5rem / 2);\\n padding: 0 2px;\\n white-space: pre-wrap;\\n transform: translateZ(0); /* Fixes flickering in Safari */\\n}\\n\\n.monitor_large-value_3DIcK {\\n min-height: 1.4rem;\\n min-width: 3rem;\\n padding: 0.1rem 0.25rem;\\n text-align: center;\\n font-size: 1rem;\\n white-space: pre-wrap;\\n transform: translateZ(0); /* Fixes flickering in Safari */\\n}\\n\\n.monitor_row_3kEbv {\\n display: flex;\\n flex-direction: row;\\n}\\n\\n.monitor_slider_18owZ {\\n width: 100%;\\n transform: translateZ(0); /* Fixes flickering in Safari */\\n}\\n\\n.monitor_list-monitor_2sZXc {\\n display: flex;\\n flex-direction: column;\\n}\\n\\n.monitor_list-header_2fGXP {\\n background: var(--ui-white-default);\\n border-bottom: 1px solid var(--ui-black-transparent-default);\\n text-align: center;\\n padding: 3px;\\n font-size: 0.75rem;\\n font-weight: bold;\\n color: var(--text-primary-default);\\n width: 100%;\\n}\\n\\n.monitor_list-body_3Yq5K {\\n background: var(--ui-primary-default);\\n width: 100%;\\n display: flex;\\n flex-direction: column;\\n overflow-x: hidden;\\n flex-grow: 1;\\n}\\n\\n.monitor_list-row_1nPeY {\\n display: flex;\\n flex-direction: row;\\n justify-content: space-around;\\n align-items: center;\\n padding: 2px;\\n flex-shrink: 0;\\n transform: translateZ(0); /* Keep sharp when scaled */\\n}\\n\\n.monitor_list-index_1h6b3 {\\n font-weight: bold;\\n color: var(--text-primary-default);\\n margin: 0 3px;\\n}\\n\\n.monitor_list-value_2Ui8b {\\n min-width: 40px;\\n text-align: left;\\n margin: 0 3px;\\n border-radius: calc(0.5rem / 2);\\n border: 1px solid var(--ui-black-transparent-default);\\n flex-grow: 1;\\n height: 22px;\\n}\\n\\n.monitor_list-footer_28WLY {\\n background: var(--ui-white-default);\\n display: flex;\\n flex-direction: row;\\n justify-content: space-between;\\n padding: 3px;\\n font-size: 0.75rem;\\n font-weight: bold;\\n border-top: 1px solid var(--ui-black-transparent-default);\\n color: var(--text-primary-default);\\n}\\n\\n.monitor_list-empty_kM_Oc {\\n text-align: center;\\n width: 100%;\\n padding: 5px;\\n}\\n\\n.monitor_input-wrapper_22rQF {\\n position: relative;\\n overflow: hidden;\\n display: flex;\\n align-items: center;\\n background: rgba(0, 0, 0, 0.1);\\n}\\n\\n.monitor_value-inner_2B2eT {\\n padding: 3px 5px;\\n min-height: 22px;\\n overflow: hidden; /* Don\\'t let long values escape container */\\n text-overflow: ellipsis;\\n -webkit-user-select: text;\\n -moz-user-select: text;\\n -ms-user-select: text;\\n user-select: text; /* Allow selecting list values for 2.0 compatibility, only relevant in player */\\n white-space: pre;\\n}\\n\\n.monitor_list-input_NzzdG {\\n padding: 3px 5px;\\n border: 0;\\n background: none;\\n outline: none;\\n font-size: 0.75rem;\\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\\n /* Workaround for Firefox */\\n width: 0;\\n flex: 1 1 auto;\\n}\\n\\n.monitor_remove-button_2PY5T {\\n padding: 0;\\n padding-right: 5px;\\n cursor: pointer;\\n}\\n\\n.monitor_add-button_3djmW {\\n cursor: pointer;\\n margin-right: 3px;\\n}\\n\\n.monitor_resize-handle_1DCXV {\\n cursor: nwse-resize;\\n margin-left: 3px;\\n}\\n\\n.monitor_footer-length_1SD4W {\\n text-align: center;\\n}\\n',\"\"]),t.locals={\"monitor-container\":\"monitor_monitor-container_BKHcx\",monitorContainer:\"monitor_monitor-container_BKHcx\",monitor:\"monitor_monitor_1DS0_\",dragging:\"monitor_dragging_1m_Kt\",\"default-monitor\":\"monitor_default-monitor_2KHFc\",defaultMonitor:\"monitor_default-monitor_2KHFc\",label:\"monitor_label_1Jx1h\",value:\"monitor_value_2DN5C\",\"large-value\":\"monitor_large-value_3DIcK\",largeValue:\"monitor_large-value_3DIcK\",row:\"monitor_row_3kEbv\",slider:\"monitor_slider_18owZ\",\"list-monitor\":\"monitor_list-monitor_2sZXc\",listMonitor:\"monitor_list-monitor_2sZXc\",\"list-header\":\"monitor_list-header_2fGXP\",listHeader:\"monitor_list-header_2fGXP\",\"list-body\":\"monitor_list-body_3Yq5K\",listBody:\"monitor_list-body_3Yq5K\",\"list-row\":\"monitor_list-row_1nPeY\",listRow:\"monitor_list-row_1nPeY\",\"list-index\":\"monitor_list-index_1h6b3\",listIndex:\"monitor_list-index_1h6b3\",\"list-value\":\"monitor_list-value_2Ui8b\",listValue:\"monitor_list-value_2Ui8b\",\"list-footer\":\"monitor_list-footer_28WLY\",listFooter:\"monitor_list-footer_28WLY\",\"list-empty\":\"monitor_list-empty_kM_Oc\",listEmpty:\"monitor_list-empty_kM_Oc\",\"input-wrapper\":\"monitor_input-wrapper_22rQF\",inputWrapper:\"monitor_input-wrapper_22rQF\",\"value-inner\":\"monitor_value-inner_2B2eT\",valueInner:\"monitor_value-inner_2B2eT\",\"list-input\":\"monitor_list-input_NzzdG\",listInput:\"monitor_list-input_NzzdG\",\"remove-button\":\"monitor_remove-button_2PY5T\",removeButton:\"monitor_remove-button_2PY5T\",\"add-button\":\"monitor_add-button_3djmW\",addButton:\"monitor_add-button_3djmW\",\"resize-handle\":\"monitor_resize-handle_1DCXV\",resizeHandle:\"monitor_resize-handle_1DCXV\",\"footer-length\":\"monitor_footer-length_1SD4W\",footerLength:\"monitor_footer-length_1SD4W\"}},,,,function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* overridden by src/lib/themes/guiHelpers.js */\\n\\n/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n.slider-prompt_modal-content_m3ASz {\\n width: 360px;\\n}\\n\\n.slider-prompt_body_fslhG {\\n background: var(--ui-modal-background);\\n padding: 1.5rem 2.25rem;\\n}\\n\\n.slider-prompt_label_YNsvF {\\n font-weight: 500;\\n margin: 0 0 0.75rem;\\n}\\n\\n.slider-prompt_min-input_2KCOC, .slider-prompt_max-input_2iIHC {\\n margin-bottom: 1.5rem;\\n width: 100%;\\n border: 1px solid var(--ui-black-transparent);\\n border-radius: 5px;\\n padding: 0 1rem;\\n height: 3rem;\\n color: var(--ui-text-primary-transparent);\\n font-size: .875rem;\\n background-color: var(--input-background);\\n}\\n\\n.slider-prompt_button-row_-JDyB {\\n font-weight: bolder;\\n text-align: right;\\n}\\n\\n.slider-prompt_button-row_-JDyB button {\\n padding: 0.75rem 1rem;\\n border-radius: 0.25rem;\\n background: white;\\n color: black;\\n border: 1px solid var(--ui-black-transparent);\\n font-weight: 600;\\n font-size: 0.85rem;\\n}\\n\\n.slider-prompt_button-row_-JDyB button.slider-prompt_ok-button_1Ptk- {\\n background: var(--looks-secondary);\\n border: var(--looks-secondary);\\n color: white;\\n}\\n\\n[dir=\"ltr\"] .slider-prompt_button-row_-JDyB button + button {\\n margin-left: 0.5rem;\\n}\\n\\n[dir=\"rtl\"] .slider-prompt_button-row_-JDyB button + button {\\n margin-right: 0.5rem;\\n}\\n',\"\"]),t.locals={\"modal-content\":\"slider-prompt_modal-content_m3ASz\",modalContent:\"slider-prompt_modal-content_m3ASz\",body:\"slider-prompt_body_fslhG\",label:\"slider-prompt_label_YNsvF\",\"min-input\":\"slider-prompt_min-input_2KCOC\",minInput:\"slider-prompt_min-input_2KCOC\",\"max-input\":\"slider-prompt_max-input_2iIHC\",maxInput:\"slider-prompt_max-input_2iIHC\",\"button-row\":\"slider-prompt_button-row_-JDyB\",buttonRow:\"slider-prompt_button-row_-JDyB\",\"ok-button\":\"slider-prompt_ok-button_1Ptk-\",okButton:\"slider-prompt_ok-button_1Ptk-\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\".monitor-list_monitor-list_aXinQ {\\n /* Width/height are set by the component, margin: auto centers in fullscreen */\\n margin: auto;\\n pointer-events: none;\\n overflow: hidden;\\n}\\n\\n.monitor-list_monitor-list-scaler_1jxP7 {\\n /* Scaling for monitors should happen from the top left */\\n transform-origin: left top;\\n}\\n\\n::-ms-clear { display: none; }\\n\",\"\"]),t.locals={\"monitor-list\":\"monitor-list_monitor-list_aXinQ\",monitorList:\"monitor-list_monitor-list_aXinQ\",\"monitor-list-scaler\":\"monitor-list_monitor-list-scaler_1jxP7\",monitorListScaler:\"monitor-list_monitor-list-scaler_1jxP7\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.question_question-container_26Z9Q {\\n margin: 0.5rem;\\n border: 1px solid var(--ui-black-transparent-default);\\n border-radius: 0.5rem;\\n border-width: 2px;\\n padding: 1rem;\\n background: white;\\n}\\n\\n.question_question-label_1SgY7 {\\n font-size: 0.75rem;\\n font-weight: bold;\\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\\n color: var(--text-primary-default);\\n padding-bottom: 0.5rem;\\n}\\n\\n.question_question-input_Bvy05 {\\n display: flex; /* Keeps the input from going outside this container */\\n position: relative;\\n}\\n\\n.question_question-submit-button_1zp3B {\\n position: absolute;\\n top: calc(0.5rem / 2);\\n\\n width: calc(2rem - 0.5rem);\\n height: calc(2rem - 0.5rem);\\n\\n border: none;\\n border-radius: 100%;\\n\\n color: white;\\n background: var(--looks-secondary);\\n}\\n\\n[dir=\"ltr\"] .question_question-submit-button_1zp3B {\\n right: calc(0.5rem / 2);\\n}\\n\\n[dir=\"rtl\"] .question_question-submit-button_1zp3B {\\n left: calc(0.5rem / 2);\\n}\\n\\n/* Input overrides: width, font-weight, focus outline and padding */\\n\\n.question_question-input_Bvy05 > input {\\n width: 100%;\\n font-weight: normal;\\n\\n /* override dark mode */\\n background-color: var(--input-background-default);\\n color: var(--text-primary-default);\\n border-color: var(--ui-black-transparent-default);\\n}\\n\\n[dir=\"ltr\"] .question_question-input_Bvy05 > input {\\n padding: 0 2rem 0 .75rem; /* To make room for the submit button */\\n}\\n\\n[dir=\"rtl\"] .question_question-input_Bvy05 > input {\\n padding: 0 .75rem 0 2rem; /* To make room for the submit button */\\n}\\n\\n.question_question-input_Bvy05 > input:focus {\\n box-shadow: 0px 0px 0px 3px var(--looks-transparent);\\n}\\n\\n.question_question-submit-button-icon_3E4g- {\\n width: calc(2rem - 0.5rem);\\n height: calc(2rem - 0.5rem);\\n position: relative;\\n right: -7px;\\n left: -7px;\\n}\\n',\"\"]),t.locals={\"question-container\":\"question_question-container_26Z9Q\",questionContainer:\"question_question-container_26Z9Q\",\"question-label\":\"question_question-label_1SgY7\",questionLabel:\"question_question-label_1SgY7\",\"question-input\":\"question_question-input_Bvy05\",questionInput:\"question_question-input_Bvy05\",\"question-submit-button\":\"question_question-submit-button_1zp3B\",questionSubmitButton:\"question_question-submit-button_1zp3B\",\"question-submit-button-icon\":\"question_question-submit-button-icon_3E4g-\",questionSubmitButtonIcon:\"question_question-submit-button-icon_3E4g-\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\"@keyframes mic-indicator_popIn_11qHK {\\n from {transform: scale(0.5)}\\n to {transform: scale(1)}\\n}\\n\\n.mic-indicator_mic-img_3cs6_ {\\n margin: 10px;\\n transform-origin: center;\\n animation: mic-indicator_popIn_11qHK 0.1s ease-in-out;\\n}\\n\",\"\"]),t.locals={\"mic-img\":\"mic-indicator_mic-img_3cs6_\",micImg:\"mic-indicator_mic-img_3cs6_\",popIn:\"mic-indicator_popIn_11qHK\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* overridden by src/lib/themes/guiHelpers.js */\\n\\n/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n/*\\n Contains constants for the z-index values of elements that are part of the global stack context.\\n In other words, z-index values that are \"inside\" a component are not added here.\\n This prevents conflicts between identical z-index values in different components.\\n*/\\n\\n/* Toolbox z-index: 40; set in scratch-blocks */\\n\\n/* tooltips should go over add buttons if they overlap */\\n\\n/* monitors go over add buttons */\\n\\n/* \"ask\" block text input goes above monitors */\\n\\n/* menu-bar should go over monitors, alerts and tutorials */\\n\\n/* behind menu-bar */\\n\\n/* Block drag z-index: 1000; default 50 is overriden in blocks.css */\\n\\n/* so it is draggable into other panes */\\n\\n/* behind modals */\\n\\n/* behind modals */\\n\\n/* in most interfaces, the context menu is always on top */\\n\\n.stage_stage_DTWo5 {\\n /*\\n Fixes a few extra pixels of margin/padding, that adds on to the bottom\\n of the element, which messes up the chrome padding consistency\\n */\\n display: block;\\n\\n border-radius: 0.5rem;\\n border: 0.0625rem solid var(--ui-black-transparent);\\n overflow: hidden;\\n\\n /* @todo: This is for overriding the value being set somewhere. Where is it being set? */\\n background-color: transparent;\\n\\n /* Allow custom touch handling to prevent scrolling on Edge */\\n touch-action: none;\\n\\n /* Make sure border is not included in size calculation */\\n box-sizing: content-box !important;\\n\\n /* enforce overflow + reset position of absolutely-positioned children */\\n position: relative;\\n\\n /* reset dark styles inherited from dark mode */\\n color-scheme: light;\\n color: var(--text-primary-default);\\n}\\n\\n.stage_stage_DTWo5.stage_full-screen_aqa2I {\\n border: 0.0625rem solid var(--ui-black-transparent);\\n}\\n\\n.stage_with-color-picker_27XHm {\\n cursor: none;\\n z-index: 2010;\\n}\\n\\n.stage_color-picker-background_2HBlI {\\n position: absolute;\\n width: 100%;\\n height: 100%;\\n background-color: rgba(0, 0, 0, 0.55);\\n display: block;\\n z-index: 2000;\\n top: 0;\\n left: 0;\\n}\\n\\n.stage_stage-wrapper_35Uar {\\n position: relative;\\n}\\n\\n/* we want stage overlays to all be positioned in the same spot as the stage, but can\\'t put them inside the border\\nbecause we want their overflow to be visible, and the bordered element must have overflow: hidden set so that the\\nstage doesn\\'t \"spill\" out from under its rounded corners. instead, shift these over by the border width. */\\n\\n.stage_stage-overlays_295lE {\\n position: absolute;\\n top: 0.0625rem;\\n left: 0.0625rem;\\n\\n /* the overlay itself should not capture pointer events; only its child elements can do that */\\n pointer-events: none;\\n}\\n\\n.stage_stage-overlays_295lE.stage_full-screen_aqa2I {\\n top: 0.0625rem;\\n left: 0.0625rem;\\n}\\n\\n.stage_monitor-wrapper_2hZ-i,\\n.stage_frame-wrapper_iYJos,\\n.stage_green-flag-overlay-wrapper_3bCO- {\\n position: absolute;\\n top: 0;\\n left: 0;\\n pointer-events: none;\\n}\\n\\n.stage_dragging-sprite_2rRMx {\\n position: absolute;\\n top: 0;\\n left: 0;\\n z-index: 1020;\\n filter: drop-shadow(5px 5px 5px var(--ui-black-transparent-default));\\n}\\n\\n.stage_stage-bottom-wrapper_fnczd {\\n position: absolute;\\n display: flex;\\n flex-direction: column;\\n justify-content: flex-end;\\n top: 0;\\n left: 0;\\n overflow: hidden;\\n pointer-events: none;\\n}\\n\\n.stage_mic-indicator_2hH2H {\\n transform-origin: bottom right;\\n z-index: 45;\\n pointer-events: none;\\n align-self: flex-end;\\n}\\n\\n.stage_question-wrapper_3Sii9 {\\n z-index: 49;\\n pointer-events: auto;\\n}\\n\\n.stage_frame_1-hsB {\\n background: var(--looks-transparent);\\n border: 2px solid var(--looks-secondary);\\n border-radius: 0.5rem;\\n animation-name: stage_flash_3LJh5;\\n animation-duration: 0.75s;\\n animation-fill-mode: forwards; /* Leave at 0 opacity after animation */\\n}\\n\\n.stage_green-flag-overlay-wrapper_3bCO- {\\n width: 100%;\\n height: 100%;\\n display: flex;\\n justify-content: center;\\n align-items: center;\\n background: rgba(0,0,0,0.25);\\n border-radius: 0.5rem;\\n pointer-events: all;\\n cursor: pointer;\\n}\\n\\n.stage_green-flag-overlay_219KT {\\n padding: 1rem;\\n border-radius: 100%;\\n background: rgba(255,255,255,0.75);\\n border: 3px solid var(--ui-white-default);\\n display: flex;\\n justify-content: center;\\n align-items: center;\\n box-sizing: border-box;\\n width: 5rem;\\n height: 5rem;\\n}\\n\\n.stage_green-flag-overlay_219KT > img {\\n width: 100%;\\n object-fit: contain;\\n}\\n\\n@keyframes stage_flash_3LJh5 {\\n 0% { opacity: 1; }\\n 100% { opacity: 0; }\\n}\\n',\"\"]),t.locals={stage:\"stage_stage_DTWo5\",\"full-screen\":\"stage_full-screen_aqa2I\",fullScreen:\"stage_full-screen_aqa2I\",\"with-color-picker\":\"stage_with-color-picker_27XHm\",withColorPicker:\"stage_with-color-picker_27XHm\",\"color-picker-background\":\"stage_color-picker-background_2HBlI\",colorPickerBackground:\"stage_color-picker-background_2HBlI\",\"stage-wrapper\":\"stage_stage-wrapper_35Uar\",stageWrapper:\"stage_stage-wrapper_35Uar\",\"stage-overlays\":\"stage_stage-overlays_295lE\",stageOverlays:\"stage_stage-overlays_295lE\",\"monitor-wrapper\":\"stage_monitor-wrapper_2hZ-i\",monitorWrapper:\"stage_monitor-wrapper_2hZ-i\",\"frame-wrapper\":\"stage_frame-wrapper_iYJos\",frameWrapper:\"stage_frame-wrapper_iYJos\",\"green-flag-overlay-wrapper\":\"stage_green-flag-overlay-wrapper_3bCO-\",greenFlagOverlayWrapper:\"stage_green-flag-overlay-wrapper_3bCO-\",\"dragging-sprite\":\"stage_dragging-sprite_2rRMx\",draggingSprite:\"stage_dragging-sprite_2rRMx\",\"stage-bottom-wrapper\":\"stage_stage-bottom-wrapper_fnczd\",stageBottomWrapper:\"stage_stage-bottom-wrapper_fnczd\",\"mic-indicator\":\"stage_mic-indicator_2hH2H\",micIndicator:\"stage_mic-indicator_2hH2H\",\"question-wrapper\":\"stage_question-wrapper_3Sii9\",questionWrapper:\"stage_question-wrapper_3Sii9\",frame:\"stage_frame_1-hsB\",flash:\"stage_flash_3LJh5\",\"green-flag-overlay\":\"stage_green-flag-overlay_219KT\",greenFlagOverlay:\"stage_green-flag-overlay_219KT\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* overridden by src/lib/themes/guiHelpers.js */\\n\\n/*\\n Contains constants for the z-index values of elements that are part of the global stack context.\\n In other words, z-index values that are \"inside\" a component are not added here.\\n This prevents conflicts between identical z-index values in different components.\\n*/\\n\\n/* Toolbox z-index: 40; set in scratch-blocks */\\n\\n/* tooltips should go over add buttons if they overlap */\\n\\n/* monitors go over add buttons */\\n\\n/* \"ask\" block text input goes above monitors */\\n\\n/* menu-bar should go over monitors, alerts and tutorials */\\n\\n/* behind menu-bar */\\n\\n/* Block drag z-index: 1000; default 50 is overriden in blocks.css */\\n\\n/* so it is draggable into other panes */\\n\\n/* behind modals */\\n\\n/* behind modals */\\n\\n/* in most interfaces, the context menu is always on top */\\n\\n.loader_background_1-Rwn {\\n position: absolute;\\n top: 0;\\n left: 0;\\n width: 100%;\\n height: 100%;\\n z-index: 490;\\n display: flex;\\n justify-content: center;\\n align-items: center;\\n background-color: var(--menu-bar-background);\\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\\n text-align: center;\\n color: white;\\n}\\n\\n.loader_fullscreen_tNbvL {\\n /* Break out of the layout using position: fixed to cover the whole screen */\\n position: fixed;\\n /* Use the fullscreen stage z-index to allow covering full-screen mode */\\n z-index: 500;\\n}\\n\\n.loader_block-animation_2EgCQ {\\n width: 125px;\\n height: 150px;\\n margin: 50px auto 0px;\\n}\\n\\n.loader_block-animation_2EgCQ img {\\n display: block;\\n position: relative;\\n height: 30%;\\n margin-top: -4px;\\n}\\n\\n.loader_top-block_1-yuR {\\n animation: loader_top-slide-in_3hScI 1.5s ease infinite;\\n}\\n\\n.loader_middle-block_2ma0T {\\n animation: loader_middle-slide-in_3GSy9 1.5s ease infinite;\\n}\\n\\n.loader_bottom-block_ABwSu {\\n animation: loader_bottom-slide-in_8euy_ 1.5s ease infinite;\\n}\\n\\n[dir=\"rtl\"] .loader_top-block_1-yuR {\\n animation: loader_top-slide-in-rtl_1iaUP 1.5s ease infinite;\\n}\\n\\n[dir=\"rtl\"] .loader_middle-block_2ma0T {\\n animation: loader_middle-slide-in-rtl_1Ve0h 1.5s ease infinite;\\n}\\n\\n[dir=\"rtl\"] .loader_bottom-block_ABwSu {\\n animation: loader_bottom-slide-in-rtl_2hnAN 1.5s ease infinite;\\n}\\n\\n@keyframes loader_top-slide-in_3hScI {\\n 0% {\\n transform: translateY(50px);\\n opacity: 0;\\n }\\n\\n 33% {\\n transform: translateY(0px);\\n opacity: 1;\\n }\\n}\\n\\n@keyframes loader_middle-slide-in_3GSy9 {\\n 0% {\\n transform: translateY(50px);\\n opacity: 0;\\n }\\n\\n 33% {\\n transform: translateY(50px);\\n opacity: 0;\\n }\\n\\n 66% {\\n transform: translateY(0px);\\n opacity: 1;\\n }\\n}\\n\\n@keyframes loader_bottom-slide-in_8euy_ {\\n 0% {\\n transform: translateY(50px);\\n opacity: 0;\\n }\\n\\n 66% {\\n transform: translateY(50px);\\n opacity: 0;\\n }\\n\\n 100% {\\n transform: translateY(0px);\\n opacity: 1;\\n }\\n}\\n\\n@keyframes loader_top-slide-in-rtl_1iaUP {\\n 0% {\\n transform: translateY(50px) scaleX(-1);\\n opacity: 0;\\n }\\n\\n 33% {\\n transform: translateY(0px) scaleX(-1);\\n opacity: 1;\\n }\\n 100% {\\n transform: translateY(0px) scaleX(-1);\\n opacity: 1;\\n }\\n}\\n\\n@keyframes loader_middle-slide-in-rtl_1Ve0h {\\n 0% {\\n transform: translateY(50px) scaleX(-1);\\n opacity: 0;\\n }\\n\\n 33% {\\n transform: translateY(50px) scaleX(-1);\\n opacity: 0;\\n }\\n\\n 66% {\\n transform: translateY(0px) scaleX(-1);\\n opacity: 1;\\n }\\n 100% {\\n transform: translateY(0px) scaleX(-1);\\n opacity: 1;\\n }\\n}\\n\\n@keyframes loader_bottom-slide-in-rtl_2hnAN {\\n 0% {\\n transform: translateY(50px) scaleX(-1);\\n opacity: 0;\\n }\\n\\n 66% {\\n transform: translateY(50px) scaleX(-1);\\n opacity: 0;\\n }\\n\\n 100% {\\n transform: translateY(0px) scaleX(-1);\\n opacity: 1;\\n }\\n}\\n\\n.loader_title_28GDz {\\n font-size: 2rem;\\n font-weight: bold;\\n margin: 0.75rem 0;\\n}\\n\\n.loader_message_rvm_w {\\n height: 20px;\\n margin: 5px 0;\\n}\\n\\n.loader_bar-outer_3B82p {\\n width: 250px;\\n height: 8px;\\n border-radius: 8px;\\n background-color: var(--ui-white-transparent-default);\\n overflow: hidden;\\n position: relative;\\n margin: auto;\\n}\\n\\n.loader_bar-inner_GYGdI {\\n position: absolute;\\n top: 0;\\n left: 0;\\n width: 0;\\n height: 100%;\\n background-color: var(--ui-white-default);\\n}\\n',\"\"]),t.locals={background:\"loader_background_1-Rwn\",fullscreen:\"loader_fullscreen_tNbvL\",\"block-animation\":\"loader_block-animation_2EgCQ\",blockAnimation:\"loader_block-animation_2EgCQ\",\"top-block\":\"loader_top-block_1-yuR\",topBlock:\"loader_top-block_1-yuR\",\"top-slide-in\":\"loader_top-slide-in_3hScI\",topSlideIn:\"loader_top-slide-in_3hScI\",\"middle-block\":\"loader_middle-block_2ma0T\",middleBlock:\"loader_middle-block_2ma0T\",\"middle-slide-in\":\"loader_middle-slide-in_3GSy9\",middleSlideIn:\"loader_middle-slide-in_3GSy9\",\"bottom-block\":\"loader_bottom-block_ABwSu\",bottomBlock:\"loader_bottom-block_ABwSu\",\"bottom-slide-in\":\"loader_bottom-slide-in_8euy_\",bottomSlideIn:\"loader_bottom-slide-in_8euy_\",\"top-slide-in-rtl\":\"loader_top-slide-in-rtl_1iaUP\",topSlideInRtl:\"loader_top-slide-in-rtl_1iaUP\",\"middle-slide-in-rtl\":\"loader_middle-slide-in-rtl_1Ve0h\",middleSlideInRtl:\"loader_middle-slide-in-rtl_1Ve0h\",\"bottom-slide-in-rtl\":\"loader_bottom-slide-in-rtl_2hnAN\",bottomSlideInRtl:\"loader_bottom-slide-in-rtl_2hnAN\",title:\"loader_title_28GDz\",message:\"loader_message_rvm_w\",\"bar-outer\":\"loader_bar-outer_3B82p\",barOuter:\"loader_bar-outer_3B82p\",\"bar-inner\":\"loader_bar-inner_GYGdI\",barInner:\"loader_bar-inner_GYGdI\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n/* overridden by src/lib/themes/guiHelpers.js */\\n\\n/*\\n Contains constants for the z-index values of elements that are part of the global stack context.\\n In other words, z-index values that are \"inside\" a component are not added here.\\n This prevents conflicts between identical z-index values in different components.\\n*/\\n\\n/* Toolbox z-index: 40; set in scratch-blocks */\\n\\n/* tooltips should go over add buttons if they overlap */\\n\\n/* monitors go over add buttons */\\n\\n/* \"ask\" block text input goes above monitors */\\n\\n/* menu-bar should go over monitors, alerts and tutorials */\\n\\n/* behind menu-bar */\\n\\n/* Block drag z-index: 1000; default 50 is overriden in blocks.css */\\n\\n/* so it is draggable into other panes */\\n\\n/* behind modals */\\n\\n/* behind modals */\\n\\n/* in most interfaces, the context menu is always on top */\\n\\n.stage-wrapper_stage-wrapper_3k56F {\\n position: relative;\\n}\\n\\n.stage-wrapper_stage-wrapper_3k56F * {\\n box-sizing: border-box;\\n}\\n\\n.stage-wrapper_stage-canvas-wrapper_n2Q5r {\\n /* Hides negative space between edge of rounded corners + container, when selected */\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n\\n.stage-wrapper_offset-controls__gBga .stage-wrapper_stage-canvas-wrapper_n2Q5r {\\n padding-top: 44px;\\n}\\n\\n.stage-wrapper_stage-wrapper_3k56F.stage-wrapper_full-screen_3WIKP {\\n position: fixed;\\n top: 2.75rem;\\n left: 0;\\n right: 0;\\n bottom: 0;\\n z-index: 500;\\n background-color: var(--fullscreen-background);\\n /* spacing between stage and control bar (on the top), or between\\n stage and window edges (on left/right/bottom) */\\n padding: 0.1875rem;\\n\\n /* this centers the stage */\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n}\\n\\n.stage-wrapper_stage-wrapper_3k56F.stage-wrapper_embedded_qKq7D {\\n background-color: transparent;\\n}\\n',\"\"]),t.locals={\"stage-wrapper\":\"stage-wrapper_stage-wrapper_3k56F\",stageWrapper:\"stage-wrapper_stage-wrapper_3k56F\",\"stage-canvas-wrapper\":\"stage-wrapper_stage-canvas-wrapper_n2Q5r\",stageCanvasWrapper:\"stage-wrapper_stage-canvas-wrapper_n2Q5r\",\"offset-controls\":\"stage-wrapper_offset-controls__gBga\",offsetControls:\"stage-wrapper_offset-controls__gBga\",\"full-screen\":\"stage-wrapper_full-screen_3WIKP\",fullScreen:\"stage-wrapper_full-screen_3WIKP\",embedded:\"stage-wrapper_embedded_qKq7D\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\"/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.community-button_community-button_20Q0O {\\n box-shadow: 0 0 0 1px var(--ui-black-transparent);\\n}\\n\\n.community-button_community-button-icon_WReZ5 {\\n height: 1.25rem;\\n}\\n\",\"\"]),t.locals={\"community-button\":\"community-button_community-button_20Q0O\",communityButton:\"community-button_community-button_20Q0O\",\"community-button-icon\":\"community-button_community-button-icon_WReZ5\",communityButtonIcon:\"community-button_community-button-icon_WReZ5\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\"/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.share-button_share-button_36Wbh {\\n background: var(--data-primary);\\n}\\n\\n.share-button_share-button-is-shared_2QzeZ {\\n background: var(--ui-black-transparent);\\n cursor: default;\\n}\\n\",\"\"]),t.locals={\"share-button\":\"share-button_share-button_36Wbh\",shareButton:\"share-button_share-button_36Wbh\",\"share-button-is-shared\":\"share-button_share-button-is-shared_2QzeZ\",shareButtonIsShared:\"share-button_share-button-is-shared_2QzeZ\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/*\\n * NOTE: the copious use of `important` is needed to overwrite\\n * the default tooltip styling, and is required by the 3rd party\\n * library being used, `react-tooltip`\\n */\\n\\n/* overridden by src/lib/themes/guiHelpers.js */\\n\\n/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n/*\\n Contains constants for the z-index values of elements that are part of the global stack context.\\n In other words, z-index values that are \"inside\" a component are not added here.\\n This prevents conflicts between identical z-index values in different components.\\n*/\\n\\n/* Toolbox z-index: 40; set in scratch-blocks */\\n\\n/* tooltips should go over add buttons if they overlap */\\n\\n/* monitors go over add buttons */\\n\\n/* \"ask\" block text input goes above monitors */\\n\\n/* menu-bar should go over monitors, alerts and tutorials */\\n\\n/* behind menu-bar */\\n\\n/* Block drag z-index: 1000; default 50 is overriden in blocks.css */\\n\\n/* so it is draggable into other panes */\\n\\n/* behind modals */\\n\\n/* behind modals */\\n\\n/* in most interfaces, the context menu is always on top */\\n\\n.coming-soon_coming-soon_1vQL2 {\\n background-color: var(--data-primary) !important;\\n border: 1px solid var(--ui-black-transparent) !important;\\n border-radius: calc(0.5rem / 2) !important;\\n box-shadow: 0 0 .5rem var(--ui-black-transparent) !important;\\n padding: .75rem 1rem !important;\\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif !important;\\n font-size: 1rem !important;\\n line-height: 1.25rem !important;\\n z-index: 47 !important;\\n}\\n\\n.coming-soon_coming-soon_1vQL2:after {\\n content: \"\";\\n border-top: 1px solid var(--ui-black-transparent) !important;\\n border-left: 0 !important;\\n border-bottom: 0 !important;\\n border-right: 1px solid var(--ui-black-transparent) !important;\\n border-radius: calc(0.5rem / 2);\\n background-color: var(--data-primary) !important;\\n height: 1rem !important;\\n width: 1rem !important;\\n}\\n\\n.coming-soon_show_1nq_9,\\n.coming-soon_show_1nq_9:before,\\n.coming-soon_show_1nq_9:after {\\n opacity: 1 !important;\\n}\\n\\n.coming-soon_left_1GGpa:after {\\n margin-top: -.5rem !important;\\n right: -.5rem !important;\\n transform: rotate(45deg) !important;\\n}\\n\\n.coming-soon_right_1V8UL:after {\\n margin-top: -.5rem !important;\\n left: -.5rem !important;\\n transform: rotate(-135deg) !important;\\n}\\n\\n.coming-soon_top_16kkJ:after {\\n margin-right: -.5rem !important;\\n bottom: -.5rem !important;\\n transform: rotate(135deg) !important;\\n}\\n\\n.coming-soon_bottom_1hhH7:after {\\n margin-left: -.5rem !important;\\n top: -.5rem !important;\\n transform: rotate(-45deg) !important;\\n}\\n\\n.coming-soon_coming-soon-image_2YdWF {\\n width: 1.25rem;\\n height: 1.25rem;\\n vertical-align: middle;\\n}\\n\\n[dir=\"ltr\"] .coming-soon_coming-soon-image_2YdWF {\\n margin-left: .125rem;\\n}\\n\\n[dir=\"rtl\"] .coming-soon_coming-soon-image_2YdWF {\\n margin-right: .125rem;\\n}\\n',\"\"]),t.locals={\"coming-soon\":\"coming-soon_coming-soon_1vQL2\",comingSoon:\"coming-soon_coming-soon_1vQL2\",show:\"coming-soon_show_1nq_9\",left:\"coming-soon_left_1GGpa\",right:\"coming-soon_right_1V8UL\",top:\"coming-soon_top_16kkJ\",bottom:\"coming-soon_bottom_1hhH7\",\"coming-soon-image\":\"coming-soon_coming-soon-image_2YdWF\",comingSoonImage:\"coming-soon_coming-soon-image_2YdWF\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* overridden by src/lib/themes/guiHelpers.js */\\n\\n/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n.inline-message_inline-message_3EzKK {\\n color: var(--menu-bar-foreground);\\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\\n display: flex;\\n justify-content: flex-end;\\n align-items: center;\\n font-size: .8125rem;\\n padding: 0 0.5rem;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n\\n.inline-message_success_1HE_O {\\n color: var(--ui-white-dim);\\n}\\n\\n.inline-message_info_8Giql {\\n color: var(--menu-bar-foreground);\\n}\\n\\n.inline-message_warn_3ryT7 {\\n color: var(--error-light);\\n}\\n\\n.inline-message_spinner_H-tr3 {\\n margin-right: 0.5rem;\\n}\\n',\"\"]),t.locals={\"inline-message\":\"inline-message_inline-message_3EzKK\",inlineMessage:\"inline-message_inline-message_3EzKK\",success:\"inline-message_success_1HE_O\",info:\"inline-message_info_8Giql\",warn:\"inline-message_warn_3ryT7\",spinner:\"inline-message_spinner_H-tr3\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\"/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.save-status_save-now_1Blzi {\\n cursor: pointer;\\n padding: 0 0.5rem;\\n height: 100%;\\n display: flex;\\n align-items: center;\\n}\\n\\n.save-status_save-now_1Blzi:hover {\\n background-color: var(--ui-black-transparent);\\n}\\n\",\"\"]),t.locals={\"save-now\":\"save-status_save-now_1Blzi\",saveNow:\"save-status_save-now_1Blzi\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\"/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.menu_menu_1rWB9 {\\n position: absolute;\\n border: 1px solid var(--ui-black-transparent);\\n border-radius: 0 0 8px 8px;\\n background-color: var(--menu-bar-background);\\n padding: 0;\\n margin: 0;\\n min-width: 186px;\\n overflow: visible;\\n box-shadow: 0 8px 8px 0 var(--shadow);\\n}\\n\\n.menu_menu_1rWB9.menu_left_1Zl7K {\\n right: 0;\\n}\\n\\n.menu_menu_1rWB9.menu_right_12vPx {\\n left: 0;\\n}\\n\\n.menu_menu-item_3ELPx {\\n display: block;\\n line-height: 34px;\\n white-space: nowrap;\\n padding: 0 10px;\\n font-size: .75rem;\\n margin: 0;\\n font-weight: bold;\\n position: relative;\\n}\\n\\n.menu_menu-item_3ELPx.menu_active_7GxsI,\\n.menu_menu-item_3ELPx:hover,\\n.menu_menu-item_3ELPx.menu_expanded_2Jcf9 {\\n background-color: var(--ui-black-transparent);\\n}\\n\\n.menu_menu-item_3ELPx.menu_hoverable_3mGWm {\\n cursor: pointer;\\n}\\n\\n.menu_menu-section_1ai_E {\\n border-top: 1px solid var(--ui-black-transparent);\\n}\\n\\n.menu_submenu_3SFWn {\\n display: none;\\n position: absolute;\\n top: -1px;\\n min-width: 186px;\\n height: -webkit-max-content;\\n height: max-content;\\n overflow: hidden;\\n border-radius: 8px;\\n}\\n\\n.menu_submenu_3SFWn.menu_right_12vPx {\\n left: 100%;\\n}\\n\\n.menu_submenu_3SFWn.menu_left_1Zl7K {\\n right: 100%;\\n}\\n\\n.menu_submenu_3SFWn > .menu_menu_1rWB9 {\\n position: relative;\\n overflow-y: auto;\\n overflow-x: hidden;\\n scrollbar-color: var(--menu-bar-foreground) var(--menu-bar-background);\\n border-radius: 8px;\\n}\\n\\n.menu_menu-item_3ELPx.menu_expanded_2Jcf9 > .menu_submenu_3SFWn {\\n display: block;\\n}\\n\\n:not(:has(> .menu_menu-item_3ELPx.menu_expanded_2Jcf9)) > .menu_menu-item_3ELPx:hover > .menu_submenu_3SFWn {\\n display: block;\\n}\\n\\n/* Fallback styling for webkit browsers that don't support scrollbar-color */\\n\\n.menu_submenu_3SFWn > .menu_menu_1rWB9::-webkit-scrollbar {\\n width: 12px;\\n}\\n\\n.menu_submenu_3SFWn > .menu_menu_1rWB9::-webkit-scrollbar-track {\\n background: var(--menu-bar-background);\\n}\\n\\n.menu_submenu_3SFWn > .menu_menu_1rWB9::-webkit-scrollbar-thumb {\\n background-color: var(--menu-bar-foreground);\\n border-radius: 12px;\\n border: 3px solid var(--menu-bar-background);\\n}\\n\",\"\"]),t.locals={menu:\"menu_menu_1rWB9\",left:\"menu_left_1Zl7K\",right:\"menu_right_12vPx\",\"menu-item\":\"menu_menu-item_3ELPx\",menuItem:\"menu_menu-item_3ELPx\",active:\"menu_active_7GxsI\",expanded:\"menu_expanded_2Jcf9\",hoverable:\"menu_hoverable_3mGWm\",\"menu-section\":\"menu_menu-section_1ai_E\",menuSection:\"menu_menu-section_1ai_E\",submenu:\"menu_submenu_3SFWn\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* overridden by src/lib/themes/guiHelpers.js */\\n\\n/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n/*\\n Contains constants for the z-index values of elements that are part of the global stack context.\\n In other words, z-index values that are \"inside\" a component are not added here.\\n This prevents conflicts between identical z-index values in different components.\\n*/\\n\\n/* Toolbox z-index: 40; set in scratch-blocks */\\n\\n/* tooltips should go over add buttons if they overlap */\\n\\n/* monitors go over add buttons */\\n\\n/* \"ask\" block text input goes above monitors */\\n\\n/* menu-bar should go over monitors, alerts and tutorials */\\n\\n/* behind menu-bar */\\n\\n/* Block drag z-index: 1000; default 50 is overriden in blocks.css */\\n\\n/* so it is draggable into other panes */\\n\\n/* behind modals */\\n\\n/* behind modals */\\n\\n/* in most interfaces, the context menu is always on top */\\n\\n.menu-bar_menu-bar_1gLUp {\\n display: flex;\\n flex-direction: row;\\n justify-content: space-between;\\n flex-wrap: nowrap;\\n gap: 0.5rem;\\n\\n /*\\n For most things, we shouldn\\'t explicitly set height, and let the\\n content push the element to whatever fits. Using a fixed height\\n instead, will help us subtract the value we assign from the body,\\n adding up to a perfect 100%. This means we don\\'t need to set\\n overflow: hidden, which makes it hard to debug. border-box\\n simplifies by all of this by removing padding from the equation.\\n */\\n box-sizing: border-box;\\n height: 3rem;\\n\\n /*\\n @todo: This adds ~20px in Chrome, when scrolling to the right,\\n but fixes [FFx + Safari] [resize window down + scroll to the right] bug.\\n width: 100%;\\n */\\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\\n font-size: 0.75rem;\\n font-weight: bold;\\n background-color: var(--menu-bar-background);\\n background-image: var(--menu-bar-background-image);\\n color: var(--menu-bar-foreground);\\n}\\n\\n.menu-bar_main-menu_EyCGw {\\n display: flex;\\n flex-direction: row;\\n justify-content: flex-start;\\n flex-wrap: nowrap;\\n align-items: center;\\n flex-grow: 1;\\n gap: 0.5rem;\\n}\\n\\n.menu-bar_inactive_2nFUV {\\n opacity: 0;\\n}\\n\\n.menu-bar_scratch-logo_7D20g {\\n height: 1.6rem;\\n vertical-align: middle;\\n}\\n\\n.menu-bar_scratch-logo_7D20g.menu-bar_clickable_26k4z {\\n cursor: pointer;\\n}\\n\\n.menu-bar_menu-bar-item_264qQ {\\n display: flex;\\n text-decoration: none;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n align-self: center;\\n position: relative;\\n align-items: center;\\n white-space: nowrap;\\n height: 3rem;\\n}\\n\\n.menu-bar_menu-bar-item_264qQ.menu-bar_hoverable_2sbwj {\\n cursor: pointer;\\n}\\n\\n.menu-bar_menu-bar-item_264qQ.menu-bar_active_qDap3,\\n.menu-bar_menu-bar-item_264qQ.menu-bar_hoverable_2sbwj:hover {\\n background-color: var(--ui-black-transparent);\\n}\\n\\n.menu-bar_menu-bar-item_264qQ.menu-bar_growable_gzAFf {\\n max-width: 12rem;\\n flex: 1;\\n}\\n\\n.menu-bar_title-field-growable_2DAmE {\\n flex-grow: 1;\\n width: 2rem;\\n}\\n\\n.menu-bar_file-group_Ofb7F {\\n display: flex;\\n flex-direction: row;\\n align-items: center;\\n gap: 0.5rem;\\n}\\n\\n.menu-bar_file-group_Ofb7F .menu-bar_menu-bar-item_264qQ {\\n padding: 0 0.5rem;\\n}\\n\\n.menu-bar_menu-bar-menu_3M6v8 {\\n margin-top: 3rem;\\n z-index: 491;\\n}\\n\\n.menu-bar_feedback-link_2Op70 {\\n color: var(--menu-bar-background);\\n text-decoration: none;\\n}\\n\\n.menu-bar_feedback-button_2XhjA {\\n background-color: white;\\n color: inherit;\\n height: 34px;\\n}\\n\\n.menu-bar_divider_2bLcv {\\n height: 34px;\\n}\\n\\n.menu-bar_author-info_3H1M3 {\\n margin-left: .25rem;\\n margin-right: .6875rem;\\n}\\n\\n.menu-bar_menu-bar-button_45YjE {\\n height: 2rem;\\n}\\n\\n.menu-bar_remix-button_22R_5 {\\n background-color: var(--pen-primary)\\n}\\n\\n.menu-bar_remix-button-icon_120Az {\\n height: 1.25rem;\\n}\\n\\n.menu-bar_coming-soon_1mxZx >:not(.menu-bar_coming-soon-tooltip_3ikkK) {\\n opacity: 0.5;\\n}\\n\\n.menu-bar_account-info-group_1CTpL {\\n display: flex;\\n flex-direction: row;\\n align-items: center;\\n}\\n\\n.menu-bar_account-info-group_1CTpL .menu-bar_menu-bar-item_264qQ {\\n margin: 0 .25rem;\\n padding: 0 0.75rem;\\n}\\n\\n.menu-bar_mystuff-icon_1f8Re {\\n margin: 0 .25rem;\\n height: 1rem;\\n}\\n\\n.menu-bar_help-icon_ieE_q {\\n margin: 0 .25rem 0 0;\\n}\\n\\n[dir=\"rtl\"] .menu-bar_help-icon_ieE_q {\\n margin: 0 0 0 .25rem;\\n}\\n\\n.menu-bar_account-nav-menu_1ts18, .menu-bar_mystuff-button_3aa9D {\\n padding: 0 .25rem;\\n display: flex;\\n flex-direction: row;\\n align-items: center;\\n}\\n\\n.menu-bar_profile-icon_9WA-H {\\n margin: 0 .25rem;\\n width: 2rem;\\n border-radius: calc(0.5rem / 2);\\n}\\n\\n.menu-bar_dropdown-caret-icon_3aBkY {\\n width: 0.5rem;\\n height: 0.5rem;\\n}\\n\\n[dir=\"ltr\"] .menu-bar_dropdown-caret-icon_3aBkY {\\n margin-left: .5rem;\\n}\\n\\n[dir=\"rtl\"] .menu-bar_dropdown-caret-icon_3aBkY {\\n margin-right: .5rem;\\n}\\n\\n.menu-bar_disabled_rGGrp {\\n opacity: 0.5;\\n}\\n\\n.menu-bar_mystuff_gxcZo > a {\\n background-repeat: no-repeat;\\n background-position: center center;\\n background-size: 45%;\\n padding-right: 10px;\\n padding-left: 10px;\\n width: 30px;\\n overflow: hidden;\\n text-indent: 50px;\\n white-space: nowrap;\\n}\\n\\n.menu-bar_mystuff_gxcZo > a:hover {\\n background-size: 50%;\\n}\\n\\n.menu-bar_mystuff_gxcZo > a {\\n /* background-image: url(\"/images/mystuff.png\"); */\\n}\\n\\n.menu-bar_about-icon_16Env {\\n height: 1.25rem;\\n margin: 0.5rem;\\n vertical-align: middle;\\n}\\n\\n.menu-bar_collapsible-label_3ql7m {\\n margin: 0 .25rem;\\n}\\n\\n@media only screen and (max-width: 1124px) {\\n .menu-bar_tutorials-label_23wK2, .menu-bar_collapsible-label_3ql7m {\\n display: none;\\n }\\n\\n .menu-bar_help-icon_ieE_q {\\n margin-right: 0;\\n }\\n}\\n\\n.menu-bar_menu-item-link_1-4xZ {\\n color: inherit;\\n text-decoration: none;\\n}\\n',\"\"]),t.locals={\"menu-bar\":\"menu-bar_menu-bar_1gLUp\",menuBar:\"menu-bar_menu-bar_1gLUp\",\"main-menu\":\"menu-bar_main-menu_EyCGw\",mainMenu:\"menu-bar_main-menu_EyCGw\",inactive:\"menu-bar_inactive_2nFUV\",\"scratch-logo\":\"menu-bar_scratch-logo_7D20g\",scratchLogo:\"menu-bar_scratch-logo_7D20g\",clickable:\"menu-bar_clickable_26k4z\",\"menu-bar-item\":\"menu-bar_menu-bar-item_264qQ\",menuBarItem:\"menu-bar_menu-bar-item_264qQ\",hoverable:\"menu-bar_hoverable_2sbwj\",active:\"menu-bar_active_qDap3\",growable:\"menu-bar_growable_gzAFf\",\"title-field-growable\":\"menu-bar_title-field-growable_2DAmE\",titleFieldGrowable:\"menu-bar_title-field-growable_2DAmE\",\"file-group\":\"menu-bar_file-group_Ofb7F\",fileGroup:\"menu-bar_file-group_Ofb7F\",\"menu-bar-menu\":\"menu-bar_menu-bar-menu_3M6v8\",menuBarMenu:\"menu-bar_menu-bar-menu_3M6v8\",\"feedback-link\":\"menu-bar_feedback-link_2Op70\",feedbackLink:\"menu-bar_feedback-link_2Op70\",\"feedback-button\":\"menu-bar_feedback-button_2XhjA\",feedbackButton:\"menu-bar_feedback-button_2XhjA\",divider:\"menu-bar_divider_2bLcv\",\"author-info\":\"menu-bar_author-info_3H1M3\",authorInfo:\"menu-bar_author-info_3H1M3\",\"menu-bar-button\":\"menu-bar_menu-bar-button_45YjE\",menuBarButton:\"menu-bar_menu-bar-button_45YjE\",\"remix-button\":\"menu-bar_remix-button_22R_5\",remixButton:\"menu-bar_remix-button_22R_5\",\"remix-button-icon\":\"menu-bar_remix-button-icon_120Az\",remixButtonIcon:\"menu-bar_remix-button-icon_120Az\",\"coming-soon\":\"menu-bar_coming-soon_1mxZx\",comingSoon:\"menu-bar_coming-soon_1mxZx\",\"coming-soon-tooltip\":\"menu-bar_coming-soon-tooltip_3ikkK\",comingSoonTooltip:\"menu-bar_coming-soon-tooltip_3ikkK\",\"account-info-group\":\"menu-bar_account-info-group_1CTpL\",accountInfoGroup:\"menu-bar_account-info-group_1CTpL\",\"mystuff-icon\":\"menu-bar_mystuff-icon_1f8Re\",mystuffIcon:\"menu-bar_mystuff-icon_1f8Re\",\"help-icon\":\"menu-bar_help-icon_ieE_q\",helpIcon:\"menu-bar_help-icon_ieE_q\",\"account-nav-menu\":\"menu-bar_account-nav-menu_1ts18\",accountNavMenu:\"menu-bar_account-nav-menu_1ts18\",\"mystuff-button\":\"menu-bar_mystuff-button_3aa9D\",mystuffButton:\"menu-bar_mystuff-button_3aa9D\",\"profile-icon\":\"menu-bar_profile-icon_9WA-H\",profileIcon:\"menu-bar_profile-icon_9WA-H\",\"dropdown-caret-icon\":\"menu-bar_dropdown-caret-icon_3aBkY\",dropdownCaretIcon:\"menu-bar_dropdown-caret-icon_3aBkY\",disabled:\"menu-bar_disabled_rGGrp\",mystuff:\"menu-bar_mystuff_gxcZo\",\"about-icon\":\"menu-bar_about-icon_16Env\",aboutIcon:\"menu-bar_about-icon_16Env\",\"collapsible-label\":\"menu-bar_collapsible-label_3ql7m\",collapsibleLabel:\"menu-bar_collapsible-label_3ql7m\",\"tutorials-label\":\"menu-bar_tutorials-label_23wK2\",tutorialsLabel:\"menu-bar_tutorials-label_23wK2\",\"menu-item-link\":\"menu-bar_menu-item-link_1-4xZ\",menuItemLink:\"menu-bar_menu-item-link_1-4xZ\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* overridden by src/lib/themes/guiHelpers.js */\\n\\n/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n/*\\n Contains constants for the z-index values of elements that are part of the global stack context.\\n In other words, z-index values that are \"inside\" a component are not added here.\\n This prevents conflicts between identical z-index values in different components.\\n*/\\n\\n/* Toolbox z-index: 40; set in scratch-blocks */\\n\\n/* tooltips should go over add buttons if they overlap */\\n\\n/* monitors go over add buttons */\\n\\n/* \"ask\" block text input goes above monitors */\\n\\n/* menu-bar should go over monitors, alerts and tutorials */\\n\\n/* behind menu-bar */\\n\\n/* Block drag z-index: 1000; default 50 is overriden in blocks.css */\\n\\n/* so it is draggable into other panes */\\n\\n/* behind modals */\\n\\n/* behind modals */\\n\\n/* in most interfaces, the context menu is always on top */\\n\\n/*\\nIf project-title-input.jsx is part of a menu bar say menu-bar.jsx, it can have additional css classes that\\ncan set a width for example or what it should do in a flex box (eg. grow).\\n*/\\n\\n.project-title-input_title-field_13MIs {\\n border: 1px dashed var(--ui-black-transparent);\\n border-radius: calc(0.5rem / 2);\\n -webkit-border-radius: calc(0.5rem / 2);\\n -moz-border-radius: calc(0.5rem / 2);\\n background-color: var(--project-title-inactive);\\n background-clip: padding-box;\\n -webkit-background-clip: padding-box;\\n height: auto;\\n padding: .5rem;\\n}\\n\\n.project-title-input_title-field_13MIs {\\n color: var(--menu-bar-foreground);\\n font-weight: bold;\\n font-size: .8rem;\\n}\\n\\n.project-title-input_title-field_13MIs::-ms-input-placeholder {\\n color: var(--menu-bar-foreground);\\n opacity: 0.8;\\n font-weight: normal;\\n font-size: .8rem;\\n font-style: italic;\\n}\\n\\n.project-title-input_title-field_13MIs::placeholder {\\n color: var(--menu-bar-foreground);\\n opacity: 0.8;\\n font-weight: normal;\\n font-size: .8rem;\\n font-style: italic;\\n}\\n\\n.project-title-input_title-field_13MIs:hover {\\n background-color: var(--project-title-hover);\\n border-color: var(--ui-black-transparent); /* dont use hover border from custom input */\\n}\\n\\n.project-title-input_title-field_13MIs:focus {\\n outline:none;\\n border: 1px solid var(--ui-transparent);\\n box-shadow: 0 0 0 calc(0.5rem * .5) var(--ui-white-transparent-default);\\n background-color: var(--ui-white);\\n color: var(--text-primary);\\n}\\n',\"\"]),t.locals={\"title-field\":\"project-title-input_title-field_13MIs\",titleField:\"project-title-input_title-field_13MIs\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\"/* overridden by src/lib/themes/guiHelpers.js */\\n\\n/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n.user-avatar_user-thumbnail_IwOnc {\\n width: 2rem;\\n height: 2rem;\\n border-radius: calc(0.5rem / 2);\\n vertical-align: middle;\\n box-shadow: 0 0 0 1px var(--ui-black-transparent);\\n}\\n\",\"\"]),t.locals={\"user-thumbnail\":\"user-avatar_user-thumbnail_IwOnc\",userThumbnail:\"user-avatar_user-thumbnail_IwOnc\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* overridden by src/lib/themes/guiHelpers.js */\\n\\n/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n.author-info_author-info__Auzh {\\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\\n display: flex;\\n justify-content: flex-start;\\n align-items: center;\\n cursor: default;\\n}\\n\\n.author-info_avatar_1EtPD {\\n margin-right: .5625rem;\\n}\\n\\n.author-info_project-title_3abqH {\\n max-width: 12rem;\\n display: block;\\n overflow: hidden;\\n font-size: 0.875rem;\\n font-weight: bold;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n margin: 0;\\n padding: 0;\\n}\\n\\n.author-info_username-line_30Olt {\\n max-width: 12rem;\\n font-size: 0.75rem;\\n display: block;\\n overflow: hidden;\\n font-weight: normal;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n\\n.author-info_username_3V5C- {\\n font-weight: bold;\\n}\\n\\n.author-info_link_2G8-F {\\n text-decoration: none;\\n color: var(--menu-bar-foreground) !important;\\n}\\n\\n.author-info_link_2G8-F:hover {\\n text-decoration: underline;\\n}\\n\\n.author-info_link_2G8-F .author-info_author-info__Auzh {\\n cursor: pointer;\\n}\\n',\"\"]),t.locals={\"author-info\":\"author-info_author-info__Auzh\",authorInfo:\"author-info_author-info__Auzh\",avatar:\"author-info_avatar_1EtPD\",\"project-title\":\"author-info_project-title_3abqH\",projectTitle:\"author-info_project-title_3abqH\",\"username-line\":\"author-info_username-line_30Olt\",usernameLine:\"author-info_username-line_30Olt\",username:\"author-info_username_3V5C-\",link:\"author-info_link_2G8-F\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.settings-menu_icon_1kXwl {\\n width: 1.5rem;\\n}\\n\\n.settings-menu_theme-label_1AHJT {\\n flex: 1;\\n}\\n\\n.settings-menu_option_3Pqud {\\n display: flex;\\n align-items: center;\\n gap: .5rem;\\n}\\n\\n.settings-menu_check_3urTz {\\n margin: 0 .25rem 0 0;\\n visibility: hidden;\\n}\\n\\n[dir=\"rtl\"] .settings-menu_check_3urTz {\\n margin: 0 0 0 .25rem;\\n}\\n\\n.settings-menu_selected_1h3PX {\\n visibility: visible;\\n}\\n\\n.settings-menu_submenu-label_14Jrk {\\n flex: 1;\\n}\\n\\n.settings-menu_dropdown-label_3OEOH {\\n margin: 0 0.5rem 0 0.25rem;\\n}\\n\\n[dir=\"rtl\"] .settings-menu_dropdown-label_3OEOH {\\n margin: 0 0.25rem 0 0.5rem;\\n}\\n\\n.settings-menu_expand-caret_1eVT8 {\\n transform: rotate(-90deg);\\n}\\n\\n[dir=\"rtl\"] .settings-menu_expand-caret_1eVT8 {\\n transform: rotate(90deg);\\n}\\n\\n/* Extra padding to deal with scrollbar overlapping options in Firefox */\\n\\n[dir=\"ltr\"] .settings-menu_language-menu-item_3MiEs {\\n padding-right: 1rem;\\n}\\n\\n[dir=\"rtl\"] .settings-menu_language-menu-item_3MiEs {\\n padding-left: 1rem;\\n}\\n\\n.settings-menu_language-submenu_2rhUy > ul {\\n max-height: calc(100vh - 5rem); /* Fallback if dvh not supported */\\n max-height: calc(100dvh - 5rem);\\n}\\n\\n@media only screen and (max-width: 1124px) {\\n .settings-menu_dropdown-label_3OEOH {\\n display: none;\\n }\\n}\\n\\n.settings-menu_accent-icon-outer_1RTK2 {\\n width: 24px;\\n height: 24px;\\n border: 3px solid var(--menu-bar-foreground);\\n border-radius: 100%;\\n box-sizing: border-box;\\n transform-origin: center;\\n transform: scale(90%);\\n}\\n\\n.settings-menu_disabled_22CX_ {\\n opacity: 0.5;\\n}\\n\\n.settings-menu_disabled_22CX_ img {\\n filter: grayscale(100%);\\n}\\n\\n.settings-menu_open-link_yTV-x {\\n margin-left: 0.5rem;\\n}\\n',\"\"]),t.locals={icon:\"settings-menu_icon_1kXwl\",\"theme-label\":\"settings-menu_theme-label_1AHJT\",themeLabel:\"settings-menu_theme-label_1AHJT\",option:\"settings-menu_option_3Pqud\",check:\"settings-menu_check_3urTz\",selected:\"settings-menu_selected_1h3PX\",\"submenu-label\":\"settings-menu_submenu-label_14Jrk\",submenuLabel:\"settings-menu_submenu-label_14Jrk\",\"dropdown-label\":\"settings-menu_dropdown-label_3OEOH\",dropdownLabel:\"settings-menu_dropdown-label_3OEOH\",\"expand-caret\":\"settings-menu_expand-caret_1eVT8\",expandCaret:\"settings-menu_expand-caret_1eVT8\",\"language-menu-item\":\"settings-menu_language-menu-item_3MiEs\",languageMenuItem:\"settings-menu_language-menu-item_3MiEs\",\"language-submenu\":\"settings-menu_language-submenu_2rhUy\",languageSubmenu:\"settings-menu_language-submenu_2rhUy\",\"accent-icon-outer\":\"settings-menu_accent-icon-outer_1RTK2\",accentIconOuter:\"settings-menu_accent-icon-outer_1RTK2\",disabled:\"settings-menu_disabled_22CX_\",\"open-link\":\"settings-menu_open-link_yTV-x\",openLink:\"settings-menu_open-link_yTV-x\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\"/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.tw-news_news_2xF72 {\\n background: var(--motion-tertiary);\\n display: flex;\\n flex-direction: row;\\n align-items: center;\\n justify-content: space-between;\\n padding: 0.375rem 0;\\n gap: 0.5rem;\\n}\\n\\n.tw-news_text_1OE4I {\\n flex-grow: 1;\\n color: white;\\n text-align: center;\\n\\n display: flex;\\n flex-direction: column;\\n gap: 0.25rem;\\n}\\n\\n.tw-news_text_1OE4I a {\\n color: inherit;\\n}\\n\\n.tw-news_close_3iAN3 {\\n flex-shrink: 0;\\n margin-right: 0.5rem;\\n}\\n\",\"\"]),t.locals={news:\"tw-news_news_2xF72\",text:\"tw-news_text_1OE4I\",close:\"tw-news_close_3iAN3\"}},function(e,t){e.exports=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAoCAYAAAC4h3lxAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDY3IDc5LjE1Nzc0NywgMjAxNS8wMy8zMC0yMzo0MDo0MiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODk0NzIwNTI1OTc1MTFFNTk3QzdGRjJDNDczODI4MEIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODk0NzIwNTM1OTc1MTFFNTk3QzdGRjJDNDczODI4MEIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4OTQ3MjA1MDU5NzUxMUU1OTdDN0ZGMkM0NzM4MjgwQiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4OTQ3MjA1MTU5NzUxMUU1OTdDN0ZGMkM0NzM4MjgwQiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PhTdRY8AAAImSURBVHja7JlfKENRHMePWYuNSP6UlJWU8iAPipe9KPmTJ09rD5QiJcW7Z3lQPMgTnjyqpSmaPHkgsRISSdZq5IGSWTZd35/dW9exzf5cOlfnV5+1/c7dvb/v2e937u7vMEVRWAY0gUPwrmRvd8Cd4XWypoBefrAKcAScLHeLglZwwQw2yw/jhWAtz+DJisCKer4/FTANug26VgcYN1pAuhTqBT46RucLgR4QyXByvKBZ53sBLeD6NwVUgi6wCMp1/jfgAgdZnL8d7HGpcwz8WcYZA5dgCzx8GdFVtAMsgGiK1WQsx5ViTjHOYmAJlGnn1y5SBQJpvriax1JXDC4VY+0c1GkCKI120xxMwux5rtcuEDdYxD6wUPD9yKQNLueo2HbAGZj/lne5WScYyHEp1eqyhPN7aHbWOWXXoOG37px5UA9OuVi3aSDEOd0CBq/Rx8X6aMXPUM39LHTXXQaNwM7EsFdwBQKcv5xqQGEmNgszuZlegDWF/0Stg7AgcVKdDoK2byNJbhB+YBNwBbICLx9sshSaVf+4iWZxMJNJDdwLnPJhuQpJAVKAFCAFSAFSgBQgBfwzAU+czy5wvHxfKEYCbjjnkMACBrnPQXqk3GSJ3RPNRlmie0bd6WdBAneAYTDB+X3UVqlhiZ5LqcnSn7atmizqExjNutn6Q5PgVv/Q7AERRXyj/YuRVLuUtWAKUMfaCWyCzDbt0ATVep1T33/ahwADAHdtdQ8icCDFAAAAAElFTkSuQmCC\"},function(e,t,n){e.exports=n.p+\"static/assets/7808d3b49fdf33cb82e053f00a27ba33.png\"},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* overridden by src/lib/themes/guiHelpers.js */\\n\\n/* this class must contain \"see-inside-button\" somewhere for the s3 dev tools to be able to reinject itself */\\n\\n/* https://github.com/griffpatch/Scratch3-Dev-Tools/blob/0.2.4/inject3.js#L1804-L1807 */\\n\\n.tw-see-inside_see-inside-button_1fSk6 {\\n box-shadow: 0 0 0 1px var(--ui-black-transparent);\\n}\\n\\n.tw-see-inside_see-inside-button-icon_UKAVj {\\n height: 1.25rem;\\n}\\n',\"\"]),t.locals={\"see-inside-button\":\"tw-see-inside_see-inside-button_1fSk6\",seeInsideButton:\"tw-see-inside_see-inside-button_1fSk6\",\"see-inside-button-icon\":\"tw-see-inside_see-inside-button-icon_UKAVj\",seeInsideButtonIcon:\"tw-see-inside_see-inside-button-icon_UKAVj\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\"\\n.watermark_sprite-image_3vILs {\\n margin: auto;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n max-width: 48px;\\n max-height: 48px;\\n opacity: 0.35;\\n}\\n\",\"\"]),t.locals={\"sprite-image\":\"watermark_sprite-image_3vILs\",spriteImage:\"watermark_sprite-image_3vILs\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.backpack_backpack-container_2HPPV {\\n flex-shrink: 1;\\n position: relative;\\n}\\n\\n.backpack_backpack-header_Vteeu {\\n margin-top: 0.5rem;\\n border: 1px solid var(--ui-black-transparent);\\n background: var(--ui-white);\\n padding: 0.25rem;\\n text-align: center;\\n font-size: 0.85rem;\\n color: var(--text-primary);\\n transition: 0.2s;\\n cursor: pointer;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n\\n[dir=\"ltr\"] .backpack_backpack-header_Vteeu {\\n border-top-right-radius: 0.5rem;\\n}\\n\\n[dir=\"rtl\"] .backpack_backpack-header_Vteeu {\\n border-top-left-radius: 0.5rem;\\n}\\n\\n.backpack_backpack-list_17cX_ {\\n position: relative;\\n display: flex;\\n flex-direction: row;\\n align-items: center;\\n border-right: 1px solid var(--ui-black-transparent);\\n min-height: 5.5rem;\\n}\\n\\n/* Absolute position the inner list to allow scrolling inside flex sized container */\\n\\n.backpack_backpack-list-inner_1OOGg {\\n position: absolute;\\n top: 0;\\n left: 0;\\n width: 100%;\\n height: 100%;\\n display: flex;\\n flex-direction: row;\\n align-items: center;\\n overflow-x: auto;\\n}\\n\\n.backpack_drag-over_3ptWa:after {\\n content: \\'\\';\\n position: absolute;\\n top: 0;\\n left: 0;\\n width: 100%;\\n height: 100%;\\n opacity: 0.75;\\n background-color: var(--drop-highlight);\\n transition: all 0.25s ease;\\n}\\n\\n.backpack_status-message_1RNp6 {\\n width: 100%;\\n text-align: center;\\n font-size: 0.85rem;\\n color: var(--text-primary);\\n}\\n\\n.backpack_error-message_1WKvR {\\n font-family: monospace;\\n}\\n\\n.backpack_backpack-item_2qZLR {\\n width: 4rem;\\n height: 4.5rem;\\n margin: 0 0.25rem;\\n flex-shrink: 0;\\n\\n /* Need to hide overflow because of background setting below */\\n overflow: hidden;\\n}\\n\\n.backpack_backpack-item_2qZLR > div {\\n /* Need to set the background to get blend-mode below to work */\\n background: var(--ui-primary);\\n}\\n\\n.backpack_more_2MpF0 {\\n background: var(--looks-secondary);\\n color: var(--ui-white);\\n border: none;\\n outline: none;\\n font-weight: bold;\\n border-radius: 0.5rem;\\n font-size: 0.85rem;\\n padding: 0.5rem;\\n margin: 0.5rem;\\n cursor: pointer;\\n}\\n',\"\"]),t.locals={\"backpack-container\":\"backpack_backpack-container_2HPPV\",backpackContainer:\"backpack_backpack-container_2HPPV\",\"backpack-header\":\"backpack_backpack-header_Vteeu\",backpackHeader:\"backpack_backpack-header_Vteeu\",\"backpack-list\":\"backpack_backpack-list_17cX_\",backpackList:\"backpack_backpack-list_17cX_\",\"backpack-list-inner\":\"backpack_backpack-list-inner_1OOGg\",backpackListInner:\"backpack_backpack-list-inner_1OOGg\",\"drag-over\":\"backpack_drag-over_3ptWa\",dragOver:\"backpack_drag-over_3ptWa\",\"status-message\":\"backpack_status-message_1RNp6\",statusMessage:\"backpack_status-message_1RNp6\",\"error-message\":\"backpack_error-message_1WKvR\",errorMessage:\"backpack_error-message_1WKvR\",\"backpack-item\":\"backpack_backpack-item_2qZLR\",backpackItem:\"backpack_backpack-item_2qZLR\",more:\"backpack_more_2MpF0\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* overridden by src/lib/themes/guiHelpers.js */\\n\\n/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\nbody {\\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\\n}\\n\\nh2 {\\n font-size: 1.5rem;\\n font-weight: bold;\\n}\\n\\np {\\n font-size: 1rem;\\n line-height: 1.5em;\\n}\\n\\n/*\\n Contains constants for the z-index values of elements that are part of the global stack context.\\n In other words, z-index values that are \"inside\" a component are not added here.\\n This prevents conflicts between identical z-index values in different components.\\n*/\\n\\n/* Toolbox z-index: 40; set in scratch-blocks */\\n\\n/* tooltips should go over add buttons if they overlap */\\n\\n/* monitors go over add buttons */\\n\\n/* \"ask\" block text input goes above monitors */\\n\\n/* menu-bar should go over monitors, alerts and tutorials */\\n\\n/* behind menu-bar */\\n\\n/* Block drag z-index: 1000; default 50 is overriden in blocks.css */\\n\\n/* so it is draggable into other panes */\\n\\n/* behind modals */\\n\\n/* behind modals */\\n\\n/* in most interfaces, the context menu is always on top */\\n\\n.browser-modal_modal-overlay_3n1Lc {\\n position: fixed;\\n top: 0;\\n left: 0;\\n right: 0;\\n bottom: 0;\\n z-index: 510;\\n background-color: var(--ui-modal-overlay);\\n}\\n\\n.browser-modal_modal-content_3udAD {\\n margin: 100px auto;\\n outline: none;\\n border: .25rem solid var(--ui-white-transparent);\\n padding: 0;\\n border-radius: 0.5rem;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n width: 500px;\\n\\n color: var(--text-primary);\\n overflow: hidden;\\n}\\n\\n.browser-modal_illustration_ZJXEu {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n width: 100%;\\n height: 100px;\\n background-color: var(--control-primary);\\n}\\n\\n[dir=\"rtl\"] .browser-modal_illustration_ZJXEu {\\n transform: scaleX(-1);\\n}\\n\\n.browser-modal_illustration_ZJXEu img {\\n height: 80%;\\n width: auto;\\n}\\n\\n.browser-modal_body_3XY4U {\\n background: var(--ui-modal-background);\\n padding: 1.5rem 2.25rem;\\n display: flex;\\n flex-direction: column;\\n gap: 0.25rem;\\n}\\n\\n.browser-modal_title_28E0- {\\n text-align: center;\\n}\\n\\n.browser-modal_desktop-settings-outer_qyuL1 {\\n display: flex;\\n justify-content: center;\\n}\\n\\n.browser-modal_desktop-settings-inner_26CQT {\\n font: inherit;\\n font-weight: bold;\\n padding: 0.75rem 1rem;\\n border-radius: 0.25rem;\\n border: 1px solid var(--ui-black-transparent);\\n background-color: var(--looks-secondary);\\n color: white;\\n}\\n',\"\"]),t.locals={\"modal-overlay\":\"browser-modal_modal-overlay_3n1Lc\",modalOverlay:\"browser-modal_modal-overlay_3n1Lc\",\"modal-content\":\"browser-modal_modal-content_3udAD\",modalContent:\"browser-modal_modal-content_3udAD\",illustration:\"browser-modal_illustration_ZJXEu\",body:\"browser-modal_body_3XY4U\",title:\"browser-modal_title_28E0-\",\"desktop-settings-outer\":\"browser-modal_desktop-settings-outer_qyuL1\",desktopSettingsOuter:\"browser-modal_desktop-settings-outer_qyuL1\",\"desktop-settings-inner\":\"browser-modal_desktop-settings-inner_26CQT\",desktopSettingsInner:\"browser-modal_desktop-settings-inner_26CQT\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n/* overridden by src/lib/themes/guiHelpers.js */\\n\\n/*\\n Contains constants for the z-index values of elements that are part of the global stack context.\\n In other words, z-index values that are \"inside\" a component are not added here.\\n This prevents conflicts between identical z-index values in different components.\\n*/\\n\\n/* Toolbox z-index: 40; set in scratch-blocks */\\n\\n/* tooltips should go over add buttons if they overlap */\\n\\n/* monitors go over add buttons */\\n\\n/* \"ask\" block text input goes above monitors */\\n\\n/* menu-bar should go over monitors, alerts and tutorials */\\n\\n/* behind menu-bar */\\n\\n/* Block drag z-index: 1000; default 50 is overriden in blocks.css */\\n\\n/* so it is draggable into other panes */\\n\\n/* behind modals */\\n\\n/* behind modals */\\n\\n/* in most interfaces, the context menu is always on top */\\n\\n.card_card-container-overlay_2QacE {\\n position: fixed;\\n pointer-events: none;\\n z-index: 480;\\n}\\n\\n.card_card-container_3CTj3 {\\n position:absolute;\\n pointer-events: auto;\\n z-index: 480;\\n margin: 0.5rem 2rem;\\n min-width: 468px;\\n}\\n\\n.card_left-card_37wEj, .card_right-card_IuwCX {\\n height: 90%;\\n position: absolute;\\n top: 5%;\\n background: var(--ui-white);\\n border: 1px solid var(--ui-tertiary);\\n width: .75rem;\\n z-index: 10;\\n opacity: 0.9;\\n overflow: hidden;\\n}\\n\\n.card_left-card_37wEj {\\n left: -.75rem;\\n border-right: 0;\\n border-top-left-radius: 0.75rem;\\n border-bottom-left-radius: 0.75rem;\\n}\\n\\n.card_right-card_IuwCX {\\n right: -.75rem;\\n border-left: 0;\\n border-top-right-radius: 0.75rem;\\n border-bottom-right-radius: 0.75rem;\\n}\\n\\n.card_left-card_37wEj::after, .card_right-card_IuwCX::after {\\n content: \"\";\\n position: absolute;\\n top: 0;\\n left: 0;\\n height: 2.5rem;\\n width: 100%;\\n background: var(--extensions-primary);\\n}\\n\\n.card_left-button_qn4Sw, .card_right-button_1SJvV {\\n position: absolute;\\n top: 50%;\\n margin-top: -15px;\\n z-index: 20;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n cursor: pointer;\\n background: var(--extensions-primary);\\n box-shadow: 0 0 0 4px var(--extensions-transparent);\\n height: 44px;\\n width: 44px;\\n border-radius: 100%;\\n display: flex;\\n justify-content: center;\\n align-items: center;\\n transition: all 0.25s ease;\\n}\\n\\n.card_left-button_qn4Sw:hover, .card_right-button_1SJvV:hover {\\n box-shadow: 0 0 0 6px var(--extensions-transparent);\\n transform: scale(1.125);\\n}\\n\\n.card_left-button_qn4Sw img, .card_right-button_1SJvV img{\\n width: 1.75rem;\\n}\\n\\n.card_left-button_qn4Sw {\\n left: -27px;\\n}\\n\\n.card_right-button_1SJvV {\\n right: -27px;\\n}\\n\\n.card_card_2Y01J {\\n border: 1px solid var(--ui-tertiary);\\n border-radius: 0.75rem;\\n display: flex;\\n flex-direction: column;\\n cursor: move;\\n z-index: 20;\\n overflow: hidden;\\n box-shadow: 0px 5px 25px 5px var(--shadow);\\n align-items: center;\\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\\n}\\n\\n.card_header-buttons_po2iq {\\n width: 100%;\\n display: flex;\\n flex-direction: row;\\n justify-content: space-between;\\n align-items: center;\\n background: var(--extensions-primary);\\n border-bottom: 1px solid var(--extensions-tertiary);\\n font-size: 0.625rem;\\n font-weight: bold;\\n}\\n\\n.card_header-buttons-hidden_3djQN {\\n border-bottom: 0px;\\n}\\n\\n.card_header-buttons-right_2gg8P {\\n display: flex;\\n flex-direction: row;\\n}\\n\\n.card_header-buttons_po2iq img {\\n margin-bottom: 2px;\\n}\\n\\n.card_shrink-expand-button_1ptQQ {\\n cursor: pointer;\\n color: white;\\n display: flex;\\n flex-direction: column;\\n justify-content: center;\\n align-items: center;\\n padding: 0.75rem;\\n}\\n\\n.card_shrink-expand-button_1ptQQ:hover, .card_all-button_lbA2Z:hover {\\n background-color: var(--ui-black-transparent);\\n}\\n\\n.card_remove-button_3_tlz, .card_all-button_lbA2Z {\\n cursor: pointer;\\n color: white;\\n display: flex;\\n flex-direction: column;\\n justify-content: center;\\n align-items: center;\\n padding: 0.75rem;\\n}\\n\\n.card_remove-button_3_tlz:hover, .card_all-button_lbA2Z:hover {\\n background-color: var(--ui-black-transparent);\\n}\\n\\n.card_step-title_1okGu {\\n font-size: 0.9rem;\\n margin: 0.9rem;\\n text-align: center;\\n font-weight: bold;\\n color: var(--text-primary);\\n}\\n\\n.card_step-body_2bEry {\\n width: 100%;\\n background: var(--ui-white);\\n display: flex;\\n flex-direction: column;\\n justify-content: center;\\n align-items: center;\\n position: relative;\\n text-align: center;\\n\\n /* Min height prevents layout changing when images change */\\n min-height: 256px;\\n}\\n\\n.card_step-video_3htRC {\\n height: 256px;\\n}\\n\\n.card_step-image_3A9ui {\\n max-width: 450px;\\n max-height: 200px;\\n object-fit: contain;\\n background: #F9F9F9;\\n border: 1px solid #ddd;\\n border-radius: 0.5rem;\\n overflow: hidden;\\n margin: 0 0.5rem 0.5rem;\\n}\\n\\n.card_decks_122D_ {\\n display: flex;\\n flex-direction: row;\\n justify-content: space-around;\\n padding: 0 1rem 0.5rem;\\n}\\n\\n.card_deck_3W7vN {\\n display: flex;\\n flex-direction: column;\\n margin: 0 8px 8px;\\n cursor: pointer;\\n border: 1px solid var(--ui-black-transparent);\\n border-radius: 0.25rem;\\n overflow: hidden;\\n}\\n\\n.card_deck-image_k0nPx {\\n width: 200px;\\n height: 100px;\\n object-fit: cover;\\n}\\n\\n.card_deck-name_1qY_0 {\\n color: var(--looks-secondary);\\n font-weight: bold;\\n font-size: 0.85rem;\\n margin: .625rem 0px;\\n text-align: center;\\n font-weight: bold;\\n text-align: center;\\n max-width: 200px;\\n}\\n\\n.card_help-icon_MqDLJ {\\n height: 1.25rem;\\n}\\n\\n.card_close-icon_1qu7W {\\n height: 1.25rem;\\n margin: .125rem 0; /* To offset the .25rem difference in icon size */\\n}\\n\\n[dir=\"ltr\"] .card_help-icon_MqDLJ {\\n margin-right: 0.25rem;\\n}\\n\\n[dir=\"rtl\"] .card_help-icon_MqDLJ {\\n margin-left: 0.25rem;\\n}\\n\\n[dir=\"ltr\"] .card_close-icon_1qu7W {\\n margin-left: 0.25rem;\\n}\\n\\n[dir=\"rtl\"] .card_close-icon_1qu7W {\\n margin-right: 0.25rem;\\n}\\n\\n.card_see-all_3a1cU {\\n display: flex;\\n flex-direction: row;\\n justify-content: center;\\n width: 100%;\\n padding: 0.5rem;\\n}\\n\\n.card_see-all-button_3is7d {\\n cursor: pointer;\\n padding: 0.5rem 1rem;\\n background-color: var(--looks-secondary);\\n color: white;\\n font-weight: bold;\\n border-radius: 0.25rem;\\n display: flex;\\n align-items: center;\\n color: var(--ui-white);\\n font-size: .75rem;\\n font-weight: bold;\\n line-height: 1rem;\\n text-align: center;\\n}\\n\\n[dir=\"ltr\"] .card_see-all-button_3is7d img {\\n margin-left: 0.5rem;\\n}\\n\\n[dir=\"rtl\"] .card_see-all-button_3is7d img {\\n margin-right: 0.5rem;\\n}\\n\\n.card_steps-list_3djjp {\\n display: flex;\\n flex-direction: row;\\n justify-content: center;\\n align-items: center;\\n}\\n\\n.card_active-step-pip_3R5x2, .card_inactiveStepPip_2yqeE {\\n width: 0.5rem;\\n height: 0.5rem;\\n margin: 0 0.25rem;\\n border-radius: 100%;\\n background: var(--ui-white-transparent);\\n}\\n\\n.card_active-step-pip_3R5x2 {\\n background: var(--ui-white);\\n box-shadow: 0px 0px 0px 2px var(--shadow);\\n}\\n\\n.card_hidden_10Vrd {\\n display: none;\\n}\\n',\"\"]),t.locals={\"card-container-overlay\":\"card_card-container-overlay_2QacE\",cardContainerOverlay:\"card_card-container-overlay_2QacE\",\"card-container\":\"card_card-container_3CTj3\",cardContainer:\"card_card-container_3CTj3\",\"left-card\":\"card_left-card_37wEj\",leftCard:\"card_left-card_37wEj\",\"right-card\":\"card_right-card_IuwCX\",rightCard:\"card_right-card_IuwCX\",\"left-button\":\"card_left-button_qn4Sw\",leftButton:\"card_left-button_qn4Sw\",\"right-button\":\"card_right-button_1SJvV\",rightButton:\"card_right-button_1SJvV\",card:\"card_card_2Y01J\",\"header-buttons\":\"card_header-buttons_po2iq\",headerButtons:\"card_header-buttons_po2iq\",\"header-buttons-hidden\":\"card_header-buttons-hidden_3djQN\",headerButtonsHidden:\"card_header-buttons-hidden_3djQN\",\"header-buttons-right\":\"card_header-buttons-right_2gg8P\",headerButtonsRight:\"card_header-buttons-right_2gg8P\",\"shrink-expand-button\":\"card_shrink-expand-button_1ptQQ\",shrinkExpandButton:\"card_shrink-expand-button_1ptQQ\",\"all-button\":\"card_all-button_lbA2Z\",allButton:\"card_all-button_lbA2Z\",\"remove-button\":\"card_remove-button_3_tlz\",removeButton:\"card_remove-button_3_tlz\",\"step-title\":\"card_step-title_1okGu\",stepTitle:\"card_step-title_1okGu\",\"step-body\":\"card_step-body_2bEry\",stepBody:\"card_step-body_2bEry\",\"step-video\":\"card_step-video_3htRC\",stepVideo:\"card_step-video_3htRC\",\"step-image\":\"card_step-image_3A9ui\",stepImage:\"card_step-image_3A9ui\",decks:\"card_decks_122D_\",deck:\"card_deck_3W7vN\",\"deck-image\":\"card_deck-image_k0nPx\",deckImage:\"card_deck-image_k0nPx\",\"deck-name\":\"card_deck-name_1qY_0\",deckName:\"card_deck-name_1qY_0\",\"help-icon\":\"card_help-icon_MqDLJ\",helpIcon:\"card_help-icon_MqDLJ\",\"close-icon\":\"card_close-icon_1qu7W\",closeIcon:\"card_close-icon_1qu7W\",\"see-all\":\"card_see-all_3a1cU\",seeAll:\"card_see-all_3a1cU\",\"see-all-button\":\"card_see-all-button_3is7d\",seeAllButton:\"card_see-all-button_3is7d\",\"steps-list\":\"card_steps-list_3djjp\",stepsList:\"card_steps-list_3djjp\",\"active-step-pip\":\"card_active-step-pip_3R5x2\",activeStepPip:\"card_active-step-pip_3R5x2\",inactiveStepPip:\"card_inactiveStepPip_2yqeE\",hidden:\"card_hidden_10Vrd\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n/* overridden by src/lib/themes/guiHelpers.js */\\n\\n/*\\n Contains constants for the z-index values of elements that are part of the global stack context.\\n In other words, z-index values that are \"inside\" a component are not added here.\\n This prevents conflicts between identical z-index values in different components.\\n*/\\n\\n/* Toolbox z-index: 40; set in scratch-blocks */\\n\\n/* tooltips should go over add buttons if they overlap */\\n\\n/* monitors go over add buttons */\\n\\n/* \"ask\" block text input goes above monitors */\\n\\n/* menu-bar should go over monitors, alerts and tutorials */\\n\\n/* behind menu-bar */\\n\\n/* Block drag z-index: 1000; default 50 is overriden in blocks.css */\\n\\n/* so it is draggable into other panes */\\n\\n/* behind modals */\\n\\n/* behind modals */\\n\\n/* in most interfaces, the context menu is always on top */\\n\\n.alert_alert_2I8f0 {\\n width: 100%;\\n display: flex;\\n flex-direction: row;\\n overflow: hidden;\\n justify-content: flex-start;\\n border-radius: 0.5rem;\\n padding-top: .875rem;\\n padding-bottom: .875rem;\\n padding-left: 1rem;\\n padding-right: 1rem;\\n margin-bottom: 7px;\\n min-height: 1.5rem;\\n pointer-events: all;\\n}\\n\\n.alert_alert_2I8f0.alert_warn_3EqUn {\\n background: #FFF0DF;\\n border: 1px solid #FF8C1A;\\n box-shadow: 0px 0px 0px 2px rgba(255, 140, 26, 0.25);\\n}\\n\\n.alert_alert_2I8f0.alert_success_1bP9- {\\n background: var(--extensions-light);\\n border: 1px solid var(--extensions-tertiary);\\n box-shadow: 0px 0px 0px 2px var(--extensions-light);\\n}\\n\\n.alert_alert-spinner_1VBcO {\\n self-align: center;\\n}\\n\\n.alert_icon-section_NZU2D {\\n min-width: 1.25rem;\\n min-height: 1.25rem;\\n display: flex;\\n padding-right: 1rem;\\n}\\n\\n.alert_alert-icon_Vk3t4 {\\n vertical-align: middle;\\n}\\n\\n.alert_alert-message_1UEAd {\\n color: #555;\\n font-weight: bold;\\n font-size: .8125rem;\\n line-height: .875rem;\\n display: flex;\\n align-items: center;\\n padding-right: .5rem;\\n}\\n\\n.alert_alert-buttons_13goQ {\\n display: flex;\\n flex-direction: row;\\n}\\n\\n.alert_alert-close-button_3XYnj {\\n outline-style:none;\\n}\\n\\n.alert_alert-close-button-container_4C-UN {\\n outline-style: none;\\n width: 30px;\\n height: 30px;\\n align-self: center;\\n}\\n\\n.alert_alert-connection-button_2zcTP {\\n min-height: 2rem;\\n width: 6.5rem;\\n padding: 0.55rem 0.9rem;\\n border-radius: 0.35rem;\\n background: #FF8C1A;\\n color: white;\\n font-weight: 700;\\n font-size: 0.77rem;\\n border: none;\\n cursor: pointer;\\n display: flex;\\n justify-content: center;\\n align-items: center;\\n align-self: stretch;\\n outline-style:none;\\n}\\n\\n[dir=\"ltr\"] .alert_alert-connection-button_2zcTP {\\n margin-right: 13px;\\n}\\n\\n[dir=\"rtl\"] .alert_alert-connection-button_2zcTP {\\n margin-left: 13px;\\n}\\n\\n/* prevent last button in list from too much margin to edge of alert */\\n\\n.alert_alert-buttons_13goQ > :last-child {\\n margin-left: 0;\\n margin-right: 0;\\n}\\n',\"\"]),t.locals={alert:\"alert_alert_2I8f0\",warn:\"alert_warn_3EqUn\",success:\"alert_success_1bP9-\",\"alert-spinner\":\"alert_alert-spinner_1VBcO\",alertSpinner:\"alert_alert-spinner_1VBcO\",\"icon-section\":\"alert_icon-section_NZU2D\",iconSection:\"alert_icon-section_NZU2D\",\"alert-icon\":\"alert_alert-icon_Vk3t4\",alertIcon:\"alert_alert-icon_Vk3t4\",\"alert-message\":\"alert_alert-message_1UEAd\",alertMessage:\"alert_alert-message_1UEAd\",\"alert-buttons\":\"alert_alert-buttons_13goQ\",alertButtons:\"alert_alert-buttons_13goQ\",\"alert-close-button\":\"alert_alert-close-button_3XYnj\",alertCloseButton:\"alert_alert-close-button_3XYnj\",\"alert-close-button-container\":\"alert_alert-close-button-container_4C-UN\",alertCloseButtonContainer:\"alert_alert-close-button-container_4C-UN\",\"alert-connection-button\":\"alert_alert-connection-button_2zcTP\",alertConnectionButton:\"alert_alert-connection-button_2zcTP\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\".alerts_alerts-inner-container_h6dBI {\\n min-width: 200px;\\n max-width: 548px;\\n}\\n\",\"\"]),t.locals={\"alerts-inner-container\":\"alerts_alerts-inner-container_h6dBI\",alertsInnerContainer:\"alerts_alerts-inner-container_h6dBI\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n/* overridden by src/lib/themes/guiHelpers.js */\\n\\n/*\\n Contains constants for the z-index values of elements that are part of the global stack context.\\n In other words, z-index values that are \"inside\" a component are not added here.\\n This prevents conflicts between identical z-index values in different components.\\n*/\\n\\n/* Toolbox z-index: 40; set in scratch-blocks */\\n\\n/* tooltips should go over add buttons if they overlap */\\n\\n/* monitors go over add buttons */\\n\\n/* \"ask\" block text input goes above monitors */\\n\\n/* menu-bar should go over monitors, alerts and tutorials */\\n\\n/* behind menu-bar */\\n\\n/* Block drag z-index: 1000; default 50 is overriden in blocks.css */\\n\\n/* so it is draggable into other panes */\\n\\n/* behind modals */\\n\\n/* behind modals */\\n\\n/* in most interfaces, the context menu is always on top */\\n\\n.drag-layer_drag-layer_3RGNn {\\n position: fixed;\\n pointer-events: none;\\n z-index: 1000;\\n left: 0;\\n top: 0;\\n width: 100%;\\n height: 100%;\\n direction: ltr;\\n}\\n\\n.drag-layer_image-wrapper_3G0af {\\n /* Absolute allows wrapper to snuggly fit image */\\n position: absolute;\\n}\\n\\n.drag-layer_image_2PHUm {\\n max-width: 80px;\\n max-height: 80px;\\n min-width: 50px;\\n min-height: 50px;\\n\\n /* Center the dragging image on the given position */\\n margin-left: -50%;\\n margin-top: -50%;\\n\\n padding: 0.25rem;\\n border: 2px solid var(--looks-secondary);\\n background: var(--ui-white);\\n border-radius: 0.5rem;\\n\\n /* Use the same drop shadow as stage dragging */\\n box-shadow: 5px 5px 5px var(--shadow);\\n}\\n',\"\"]),t.locals={\"drag-layer\":\"drag-layer_drag-layer_3RGNn\",dragLayer:\"drag-layer_drag-layer_3RGNn\",\"image-wrapper\":\"drag-layer_image-wrapper_3G0af\",imageWrapper:\"drag-layer_image-wrapper_3G0af\",image:\"drag-layer_image_2PHUm\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* overridden by src/lib/themes/guiHelpers.js */\\n\\n/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n.connection-modal_modal-content_znApD {\\n width: 480px;\\n line-height: 1.75;\\n}\\n\\n.connection-modal_header_12IsA {\\n background-color: var(--pen-tertiary);\\n}\\n\\n.connection-modal_body_2K6g8 {\\n background: var(--ui-modal-background);\\n}\\n\\n.connection-modal_label_1aIgw {\\n font-weight: 500;\\n margin: 0 0 0.75rem;\\n}\\n\\n.connection-modal_centered-row_1aluq {\\n display: flex;\\n flex-direction: row;\\n justify-content: center;\\n align-items: center;\\n}\\n\\n.connection-modal_peripheral-tile-pane_1Yvvr {\\n overflow-y: auto;\\n width: 100%;\\n height: 100%;\\n}\\n\\n.connection-modal_peripheral-tile_1uEjE {\\n display: flex;\\n flex-direction: row;\\n justify-content: space-between;\\n align-items: center;\\n\\n background-color: var(--ui-white);\\n border-radius: 0.25rem;\\n padding: 10px;\\n width: 100%;\\n height: 55px;\\n margin-bottom: 0.5rem;\\n}\\n\\n.connection-modal_peripheral-tile-name_FWRcO {\\n display: flex;\\n align-items: center;\\n}\\n\\n[dir=\"ltr\"] .connection-modal_peripheral-tile-image_fsr_J {\\n margin-right: 0.5rem;\\n}\\n\\n[dir=\"rtl\"] .connection-modal_peripheral-tile-image_fsr_J {\\n margin-left: 0.5rem;\\n}\\n\\n.connection-modal_peripheral-tile-name-wrapper_2xNWg {\\n display: flex;\\n flex-direction: column;\\n justify-content: center;\\n align-items: flex-start;\\n}\\n\\n.connection-modal_peripheral-tile-name-label_1tXxJ {\\n font-weight: bold;\\n font-size: 0.625rem;\\n}\\n\\n.connection-modal_peripheral-tile-name-text_1GANU {\\n font-size: 0.875rem;\\n}\\n\\n.connection-modal_peripheral-tile_1uEjE button {\\n padding: 0.6rem 0.75rem;\\n border: none;\\n border-radius: 0.25rem;\\n font-weight: 600;\\n font-size: 0.85rem;\\n background: var(--looks-secondary);\\n border: var(--looks-secondary);\\n color: white;\\n cursor: pointer;\\n}\\n\\n.connection-modal_signal-strength-meter_2gsno {\\n display: flex;\\n justify-content: space-between;\\n align-items: flex-end;\\n width: 22px;\\n height: 16px;\\n}\\n\\n[dir=\"ltr\"] .connection-modal_signal-strength-meter_2gsno {\\n margin-right: 1rem;\\n}\\n\\n[dir=\"rtl\"] .connection-modal_signal-strength-meter_2gsno {\\n margin-left: 1rem;\\n}\\n\\n.connection-modal_signal-bar_2tjmP {\\n width: 4px;\\n border-radius: 4px;\\n background-color: #DBDBDB;\\n}\\n\\n.connection-modal_signal-bar_2tjmP:nth-of-type(1) { height: 25%; }\\n\\n.connection-modal_signal-bar_2tjmP:nth-of-type(2) { height: 50%; }\\n\\n.connection-modal_signal-bar_2tjmP:nth-of-type(3) { height: 75%; }\\n\\n.connection-modal_signal-bar_2tjmP:nth-of-type(4) { height: 100%; }\\n\\n.connection-modal_green-bar_1aoqx {\\n background-color: var(--pen-primary);\\n}\\n\\n.connection-modal_radar-small_3aU1r {\\n width: 40px;\\n height: 40px;\\n}\\n\\n[dir=\"ltr\"] .connection-modal_radar-small_3aU1r {\\n margin-right: 0.5rem;\\n}\\n\\n[dir=\"rtl\"] .connection-modal_radar-small_3aU1r {\\n margin-left: 0.5rem;\\n}\\n\\n.connection-modal_radar-big_2N6j7 {\\n width: 120px;\\n height: 120px;\\n}\\n\\n.connection-modal_radar-spin_3EJdF {\\n animation: connection-modal_spin_1PyQc 4s linear infinite;\\n}\\n\\n[dir=\"ltr\"] .connection-modal_radar_1rdrv {\\n margin-right: .5rem;\\n}\\n\\n[dir=\"rtl\"] .connection-modal_radar_1rdrv {\\n margin-left: .5rem;\\n}\\n\\n@keyframes connection-modal_spin_1PyQc {\\n 100% {\\n transform: rotate(360deg);\\n }\\n}\\n\\n.connection-modal_peripheral-activity_2cL0Z {\\n position: relative;\\n}\\n\\n.connection-modal_peripheral-activity-icon_2OJ-L {\\n /* width: 80px;\\n height: 80px; */\\n}\\n\\n.connection-modal_connection-tip-icon_1HcJH {\\n position: absolute;\\n}\\n\\n.connection-modal_bluetooth-connecting-icon_2OEDp {\\n position: absolute;\\n top: -5px;\\n right: -15px;\\n left: -15px;\\n padding: 5px 5px;\\n background-color: var(--looks-secondary);\\n border-radius: 100%;\\n box-shadow: 0px 0px 0px 4px var(--looks-transparent);\\n /* animation: pulse-blue-ring 1s infinite ease-in-out alternate; */\\n animation: connection-modal_wiggle_27ALc 0.5s infinite ease-in-out alternate;\\n\\n}\\n\\n@keyframes connection-modal_pulse-blue-ring_3LY8c {\\n 100% {\\n box-shadow: 0px 0px 0px 8px var(--looks-light-transparent);\\n }\\n}\\n\\n.connection-modal_bluetooth-connected-icon_2zqfa {\\n position: absolute;\\n top: -5px;\\n right: -15px;\\n left: -15px;\\n padding: 5px 5px;\\n background-color: var(--pen-primary);\\n border-radius: 100%;\\n box-shadow: 0px 0px 0px 4px var(--pen-transparent);\\n}\\n\\n@keyframes connection-modal_wiggle_27ALc {\\n 0% {transform: rotate(3deg) scale(1.05);}\\n 25% {transform: rotate(-3deg) scale(1.05);}\\n 50% {transform: rotate(5deg) scale(1.05);}\\n 75% {transform: rotate(-2deg) scale(1.05);}\\n 100% {transform: rotate(0deg) scale(1.05);}\\n}\\n\\n.connection-modal_bluetooth-centered-icon_1ewY1 {\\n position: absolute;\\n padding: 5px 5px;\\n background-color: var(--looks-secondary);\\n border-radius: 100%;\\n box-shadow: 0px 0px 0px 2px var(--looks-transparent);\\n}\\n\\n.connection-modal_peripheral-tile-widgets_29jGg {\\n display: flex;\\n align-items: center;\\n}\\n\\n.connection-modal_activityArea_PqYoO {\\n height: 165px;\\n background-color: var(--looks-light-transparent);\\n display: flex;\\n justify-content: center;\\n align-items: center;\\n padding: .5rem;\\n}\\n\\n.connection-modal_scratch-link-help_THXi8 {\\n display: flex;\\n flex-direction: column;\\n justify-content: space-around;\\n height: 100%;\\n padding-top: .5rem;\\n padding-bottom: .5rem;\\n}\\n\\n.connection-modal_scratch-link-help-step_3T_WN {\\n display: flex;\\n flex-direction: row;\\n justify-content: flex-start;\\n align-items: center;\\n}\\n\\n[dir=\"ltr\"] .connection-modal_scratch-link-help-step_3T_WN {\\n margin-left: 2.5rem;\\n}\\n\\n[dir=\"rtl\"] .connection-modal_scratch-link-help-step_3T_WN {\\n margin-right: 2.5rem;\\n}\\n\\n.connection-modal_scratch-link-icon_2-yyq {\\n max-width: 50px;\\n}\\n\\n.connection-modal_help-step-image_3AZcE {\\n max-width: 40px;\\n}\\n\\n[dir=\"ltr\"] .connection-modal_help-step-image_3AZcE {\\n margin-right: 0.5rem;\\n}\\n\\n[dir=\"rtl\"] .connection-modal_help-step-image_3AZcE {\\n margin-left: 0.5rem;\\n}\\n\\n.connection-modal_help-step-number_20y3d {\\n background: var(--pen-tertiary);\\n border-radius: 100%;\\n display: flex;\\n justify-content: center;\\n align-items: center;\\n color: var(--ui-white);\\n font-weight: bold;\\n min-width: 2rem;\\n height: 2rem;\\n}\\n\\n[dir=\"ltr\"] .connection-modal_help-step-number_20y3d {\\n margin-right: 0.5rem;\\n}\\n\\n[dir=\"rtl\"] .connection-modal_help-step-number_20y3d {\\n margin-left: 0.5rem;\\n}\\n\\n.connection-modal_button-row_xsdb5 {\\n font-weight: bolder;\\n text-align: center;\\n display: flex;\\n}\\n\\n.connection-modal_abort-connecting-icon_2LN4n {\\n width: 10px;\\n transform: rotate(45deg);\\n}\\n\\n.connection-modal_connection-button_QekSE {\\n padding: 0.6rem 0.75rem;\\n border-radius: 0.5rem;\\n background: var(--looks-secondary);\\n color: white;\\n font-weight: 600;\\n font-size: 0.85rem;\\n margin: 0.25rem;\\n border: none;\\n cursor: pointer;\\n display: flex;\\n align-items: center;\\n}\\n\\n.connection-modal_connection-button_QekSE:disabled {\\n background: var(--looks-transparent);\\n}\\n\\n.connection-modal_segmented-button_3aETV {\\n display: flex;\\n}\\n\\n.connection-modal_segmented-button_3aETV .connection-modal_connection-button_QekSE:first-of-type {\\n border-top-right-radius: 0;\\n border-bottom-right-radius: 0;\\n margin-right: 0;\\n}\\n\\n.connection-modal_segmented-button_3aETV .connection-modal_connection-button_QekSE:last-of-type {\\n margin-left: 1px;\\n border-top-left-radius: 0;\\n border-bottom-left-radius: 0;\\n}\\n\\n[dir=\"ltr\"] .connection-modal_button-icon-right_1mnlx {\\n margin-left: 0.5rem;\\n}\\n\\n[dir=\"rtl\"] .connection-modal_button-icon-right_1mnlx {\\n margin-right: 0.5rem;\\n}\\n\\n[dir=\"ltr\"] .connection-modal_button-icon-left_19wwl {\\n margin-right: 0.5rem;\\n}\\n\\n[dir=\"rtl\"] .connection-modal_button-icon-left_19wwl {\\n margin-left: 0.5rem;\\n}\\n\\n/* reverse back arrow icon for RTL, don\\'t reverse other connection icons */\\n\\n[dir=\"rtl\"] .connection-modal_button-icon-back_1Y3FL {\\n transform: scaleX(-1);\\n}\\n\\n.connection-modal_red-button_343CG {\\n background: var(--red-primary);\\n}\\n\\n.connection-modal_corner-buttons_W5WN5 {\\n display: flex;\\n justify-content: space-between;\\n width: 100%;\\n padding: 0 1rem;\\n}\\n\\n.connection-modal_bottom-area_2LH2k {\\n background-color: var(--ui-modal-background);\\n text-align: center;\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n padding-top: 1rem;\\n padding-bottom: .75rem;\\n padding-left: .75rem;\\n padding-right: .75rem;\\n}\\n\\n.connection-modal_bottom-area_2LH2k .connection-modal_bottom-area-item_2LoAa+.connection-modal_bottom-area-item_2LoAa {\\n margin-top: 1rem;\\n}\\n\\n.connection-modal_instructions_1Y3Rz {\\n text-align: center;\\n}\\n\\n.connection-modal_dots-row_dl-ID {\\n display: flex;\\n flex-direction: row;\\n justify-content: center;\\n align-items: center;\\n}\\n\\n.connection-modal_dots-holder_1Cysu {\\n display: flex;\\n padding: 0.25rem 0.1rem;\\n border-radius: 1rem;\\n background: var(--looks-light-transparent);\\n}\\n\\n.connection-modal_dots-holder-success_33Q32 {\\n background: var(--pen-transparent);\\n}\\n\\n.connection-modal_dots-holder-error_3iTvC {\\n background: var(--error-transparent);\\n}\\n\\n.connection-modal_dot_x_s6W {\\n width: 0.5rem;\\n height: 0.5rem;\\n margin: 0 0.3rem;\\n border-radius: 100%;\\n}\\n\\n.connection-modal_inactive-step-dot_1MAPP {\\n background: var(--looks-transparent);\\n}\\n\\n.connection-modal_active-step-dot_18wW5 {\\n background: var(--looks-secondary);\\n}\\n\\n.connection-modal_success-dot_ecbdV {\\n background: var(--pen-primary);\\n}\\n\\n.connection-modal_error-dot_3e9VW {\\n background: var(--error-primary);\\n}\\n\\n.connection-modal_scratch-link-error_1NHj8 {\\n align-items: center;\\n display: flex;\\n flex-direction: column;\\n justify-content: space-around;\\n height: 100%;\\n padding-top: .5rem;\\n padding-bottom: .5rem;\\n width: 90%;\\n}\\n\\n.connection-modal_scratch-link-error-details_9I6TU {\\n display: flex;\\n resize: none;\\n height: 60%;\\n width: inherit;\\n}\\n',\"\"]),t.locals={\"modal-content\":\"connection-modal_modal-content_znApD\",modalContent:\"connection-modal_modal-content_znApD\",header:\"connection-modal_header_12IsA\",body:\"connection-modal_body_2K6g8\",label:\"connection-modal_label_1aIgw\",\"centered-row\":\"connection-modal_centered-row_1aluq\",centeredRow:\"connection-modal_centered-row_1aluq\",\"peripheral-tile-pane\":\"connection-modal_peripheral-tile-pane_1Yvvr\",peripheralTilePane:\"connection-modal_peripheral-tile-pane_1Yvvr\",\"peripheral-tile\":\"connection-modal_peripheral-tile_1uEjE\",peripheralTile:\"connection-modal_peripheral-tile_1uEjE\",\"peripheral-tile-name\":\"connection-modal_peripheral-tile-name_FWRcO\",peripheralTileName:\"connection-modal_peripheral-tile-name_FWRcO\",\"peripheral-tile-image\":\"connection-modal_peripheral-tile-image_fsr_J\",peripheralTileImage:\"connection-modal_peripheral-tile-image_fsr_J\",\"peripheral-tile-name-wrapper\":\"connection-modal_peripheral-tile-name-wrapper_2xNWg\",peripheralTileNameWrapper:\"connection-modal_peripheral-tile-name-wrapper_2xNWg\",\"peripheral-tile-name-label\":\"connection-modal_peripheral-tile-name-label_1tXxJ\",peripheralTileNameLabel:\"connection-modal_peripheral-tile-name-label_1tXxJ\",\"peripheral-tile-name-text\":\"connection-modal_peripheral-tile-name-text_1GANU\",peripheralTileNameText:\"connection-modal_peripheral-tile-name-text_1GANU\",\"signal-strength-meter\":\"connection-modal_signal-strength-meter_2gsno\",signalStrengthMeter:\"connection-modal_signal-strength-meter_2gsno\",\"signal-bar\":\"connection-modal_signal-bar_2tjmP\",signalBar:\"connection-modal_signal-bar_2tjmP\",\"green-bar\":\"connection-modal_green-bar_1aoqx\",greenBar:\"connection-modal_green-bar_1aoqx\",\"radar-small\":\"connection-modal_radar-small_3aU1r\",radarSmall:\"connection-modal_radar-small_3aU1r\",\"radar-big\":\"connection-modal_radar-big_2N6j7\",radarBig:\"connection-modal_radar-big_2N6j7\",\"radar-spin\":\"connection-modal_radar-spin_3EJdF\",radarSpin:\"connection-modal_radar-spin_3EJdF\",spin:\"connection-modal_spin_1PyQc\",radar:\"connection-modal_radar_1rdrv\",\"peripheral-activity\":\"connection-modal_peripheral-activity_2cL0Z\",peripheralActivity:\"connection-modal_peripheral-activity_2cL0Z\",\"peripheral-activity-icon\":\"connection-modal_peripheral-activity-icon_2OJ-L\",peripheralActivityIcon:\"connection-modal_peripheral-activity-icon_2OJ-L\",\"connection-tip-icon\":\"connection-modal_connection-tip-icon_1HcJH\",connectionTipIcon:\"connection-modal_connection-tip-icon_1HcJH\",\"bluetooth-connecting-icon\":\"connection-modal_bluetooth-connecting-icon_2OEDp\",bluetoothConnectingIcon:\"connection-modal_bluetooth-connecting-icon_2OEDp\",wiggle:\"connection-modal_wiggle_27ALc\",\"bluetooth-connected-icon\":\"connection-modal_bluetooth-connected-icon_2zqfa\",bluetoothConnectedIcon:\"connection-modal_bluetooth-connected-icon_2zqfa\",\"bluetooth-centered-icon\":\"connection-modal_bluetooth-centered-icon_1ewY1\",bluetoothCenteredIcon:\"connection-modal_bluetooth-centered-icon_1ewY1\",\"peripheral-tile-widgets\":\"connection-modal_peripheral-tile-widgets_29jGg\",peripheralTileWidgets:\"connection-modal_peripheral-tile-widgets_29jGg\",activityArea:\"connection-modal_activityArea_PqYoO\",\"scratch-link-help\":\"connection-modal_scratch-link-help_THXi8\",scratchLinkHelp:\"connection-modal_scratch-link-help_THXi8\",\"scratch-link-help-step\":\"connection-modal_scratch-link-help-step_3T_WN\",scratchLinkHelpStep:\"connection-modal_scratch-link-help-step_3T_WN\",\"scratch-link-icon\":\"connection-modal_scratch-link-icon_2-yyq\",scratchLinkIcon:\"connection-modal_scratch-link-icon_2-yyq\",\"help-step-image\":\"connection-modal_help-step-image_3AZcE\",helpStepImage:\"connection-modal_help-step-image_3AZcE\",\"help-step-number\":\"connection-modal_help-step-number_20y3d\",helpStepNumber:\"connection-modal_help-step-number_20y3d\",\"button-row\":\"connection-modal_button-row_xsdb5\",buttonRow:\"connection-modal_button-row_xsdb5\",\"abort-connecting-icon\":\"connection-modal_abort-connecting-icon_2LN4n\",abortConnectingIcon:\"connection-modal_abort-connecting-icon_2LN4n\",\"connection-button\":\"connection-modal_connection-button_QekSE\",connectionButton:\"connection-modal_connection-button_QekSE\",\"segmented-button\":\"connection-modal_segmented-button_3aETV\",segmentedButton:\"connection-modal_segmented-button_3aETV\",\"button-icon-right\":\"connection-modal_button-icon-right_1mnlx\",buttonIconRight:\"connection-modal_button-icon-right_1mnlx\",\"button-icon-left\":\"connection-modal_button-icon-left_19wwl\",buttonIconLeft:\"connection-modal_button-icon-left_19wwl\",\"button-icon-back\":\"connection-modal_button-icon-back_1Y3FL\",buttonIconBack:\"connection-modal_button-icon-back_1Y3FL\",\"red-button\":\"connection-modal_red-button_343CG\",redButton:\"connection-modal_red-button_343CG\",\"corner-buttons\":\"connection-modal_corner-buttons_W5WN5\",cornerButtons:\"connection-modal_corner-buttons_W5WN5\",\"bottom-area\":\"connection-modal_bottom-area_2LH2k\",bottomArea:\"connection-modal_bottom-area_2LH2k\",\"bottom-area-item\":\"connection-modal_bottom-area-item_2LoAa\",bottomAreaItem:\"connection-modal_bottom-area-item_2LoAa\",instructions:\"connection-modal_instructions_1Y3Rz\",\"dots-row\":\"connection-modal_dots-row_dl-ID\",dotsRow:\"connection-modal_dots-row_dl-ID\",\"dots-holder\":\"connection-modal_dots-holder_1Cysu\",dotsHolder:\"connection-modal_dots-holder_1Cysu\",\"dots-holder-success\":\"connection-modal_dots-holder-success_33Q32\",dotsHolderSuccess:\"connection-modal_dots-holder-success_33Q32\",\"dots-holder-error\":\"connection-modal_dots-holder-error_3iTvC\",dotsHolderError:\"connection-modal_dots-holder-error_3iTvC\",dot:\"connection-modal_dot_x_s6W\",\"inactive-step-dot\":\"connection-modal_inactive-step-dot_1MAPP\",inactiveStepDot:\"connection-modal_inactive-step-dot_1MAPP\",\"active-step-dot\":\"connection-modal_active-step-dot_18wW5\",activeStepDot:\"connection-modal_active-step-dot_18wW5\",\"success-dot\":\"connection-modal_success-dot_ecbdV\",successDot:\"connection-modal_success-dot_ecbdV\",\"error-dot\":\"connection-modal_error-dot_3e9VW\",errorDot:\"connection-modal_error-dot_3e9VW\",\"scratch-link-error\":\"connection-modal_scratch-link-error_1NHj8\",scratchLinkError:\"connection-modal_scratch-link-error_1NHj8\",\"scratch-link-error-details\":\"connection-modal_scratch-link-error-details_9I6TU\",scratchLinkErrorDetails:\"connection-modal_scratch-link-error-details_9I6TU\",\"pulse-blue-ring\":\"connection-modal_pulse-blue-ring_3LY8c\",pulseBlueRing:\"connection-modal_pulse-blue-ring_3LY8c\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\"/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.progress-ring_progress-ring_2ah6I {\\n margin: 0.5rem;\\n}\\n\\n.progress-ring_progress-ring-svg_2y_x6 {\\n fill: transparent;\\n}\\n\\n.progress-ring_progress-ring_2ah6I .progress-ring_progress-ring-ring_2wHxN {\\n stroke: var(--looks-light-transparent);\\n}\\n\\n.progress-ring_progress-ring_2ah6I .progress-ring_progress-ring-value_2c1U2 {\\n stroke: var(--looks-secondary);\\n stroke-linecap: round;\\n}\\n\",\"\"]),t.locals={\"progress-ring\":\"progress-ring_progress-ring_2ah6I\",progressRing:\"progress-ring_progress-ring_2ah6I\",\"progress-ring-svg\":\"progress-ring_progress-ring-svg_2y_x6\",progressRingSvg:\"progress-ring_progress-ring-svg_2y_x6\",\"progress-ring-ring\":\"progress-ring_progress-ring-ring_2wHxN\",progressRingRing:\"progress-ring_progress-ring-ring_2wHxN\",\"progress-ring-value\":\"progress-ring_progress-ring-value_2c1U2\",progressRingValue:\"progress-ring_progress-ring-value_2c1U2\"}},function(e,t,n){e.exports=n.p+\"static/assets/30d09ba32a17082ef820b57d52d60b7b.hex\"},function(e,t,n){var a=n(261);(t=e.exports=n(9)(!1)).push([e.i,'/* overridden by src/lib/themes/guiHelpers.js */\\n\\n/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\nbody {\\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\\n}\\n\\nh2 {\\n font-size: 1.5rem;\\n font-weight: bold;\\n}\\n\\np {\\n font-size: 1rem;\\n line-height: 1.5em;\\n}\\n\\n/*\\n Contains constants for the z-index values of elements that are part of the global stack context.\\n In other words, z-index values that are \"inside\" a component are not added here.\\n This prevents conflicts between identical z-index values in different components.\\n*/\\n\\n/* Toolbox z-index: 40; set in scratch-blocks */\\n\\n/* tooltips should go over add buttons if they overlap */\\n\\n/* monitors go over add buttons */\\n\\n/* \"ask\" block text input goes above monitors */\\n\\n/* menu-bar should go over monitors, alerts and tutorials */\\n\\n/* behind menu-bar */\\n\\n/* Block drag z-index: 1000; default 50 is overriden in blocks.css */\\n\\n/* so it is draggable into other panes */\\n\\n/* behind modals */\\n\\n/* behind modals */\\n\\n/* in most interfaces, the context menu is always on top */\\n\\n/* from scratch-www */\\n\\n.telemetry-modal_modal-overlay_SDoFR {\\n position: fixed;\\n top: 0;\\n left: 0;\\n right: 0;\\n bottom: 0;\\n z-index: 510;\\n background-color: var(--ui-modal-overlay);\\n}\\n\\n.telemetry-modal_modal-content_16B4g {\\n margin: 100px auto;\\n outline: none;\\n border: .25rem solid var(--ui-white-transparent);\\n padding: 0;\\n border-radius: 0.5rem;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n width: 640px;\\n\\n color: var(--text-primary);\\n overflow: hidden;\\n}\\n\\n.telemetry-modal_illustration_1Xxcy {\\n width: 100%;\\n height: 123px;\\n background-color: var(--looks-secondary);\\n background-image: url('+a(n(535))+');\\n background-size: cover;\\n}\\n\\n.telemetry-modal_body_2Gocn {\\n background: var(--ui-white);\\n padding: 1.5rem 2.25rem;\\n}\\n\\n.telemetry-modal_privacy-policy-link_18tcE {\\n color: var(--looks-secondary);\\n text-decoration: none;\\n}\\n\\n/* stack the radio buttons vertically, not horizontally */\\n\\n.telemetry-modal_radio-buttons_1Tkl7 label {\\n display: block;\\n margin: 0.5rem;\\n transition: all .125s ease;\\n background-color: hsla(0, 0%, 95%, 1);\\n border-radius: .5rem;\\n margin: 0 auto 0.375rem;\\n align-items: center;\\n padding: 1rem 0;\\n vertical-align: middle;\\n}\\n\\n.telemetry-modal_radio-buttons_1Tkl7 label:hover {\\n background-color: hsla(215, 100%, 65%, .1);\\n}\\n\\n.telemetry-modal_radio-buttons_1Tkl7 label.telemetry-modal_label-selected_NsTZr,\\n.telemetry-modal_radio-buttons_1Tkl7 label.telemetry-modal_label-selected_NsTZr:hover {\\n background-color: hsla(215, 100%, 65%, .25);\\n}\\n\\n.telemetry-modal_radio-buttons_1Tkl7 input[type=\"radio\"] {\\n margin: -1px 0.75rem 1px;\\n border: 1px solid hsla(0, 0%, 0%, .1);\\n border-radius: 50%;\\n width: 1rem;\\n height: 1rem;\\n -webkit-appearance: none;\\n -moz-appearance: none;\\n appearance: none;\\n background-color: var(--ui-white);\\n vertical-align: middle;\\n}\\n\\n.telemetry-modal_radio-buttons_1Tkl7 input[type=\"radio\"]:checked,\\n.telemetry-modal_radio-buttons_1Tkl7 input[type=\"radio\"]:focus {\\n box-shadow: 0 0 0 2px hsla(215, 100%, 65%, .25);\\n outline: none;\\n}\\n\\n.telemetry-modal_radio-buttons_1Tkl7 input[type=\"radio\"]:checked {\\n transition: all .25s ease;\\n background-color: var(--ui-white);\\n border: 1px solid var(--looks-secondary);\\n}\\n\\n.telemetry-modal_radio-buttons_1Tkl7 input[type=\"radio\"]:checked::after {\\n display: block;\\n margin: 0.125rem;\\n border-radius: 50%;\\n background-color: var(--looks-secondary);\\n width: .625rem;\\n height: .625rem;\\n content: \"\";\\n}\\n\\n/* Confirmation buttons at the bottom of the modal */\\n\\n.telemetry-modal_button-row_1DOWD {\\n display: flex;\\n flex-flow: row nowrap;\\n justify-content: space-between;\\n align-items: baseline;\\n\\n margin: 1.5rem 0;\\n font-weight: bolder;\\n}\\n\\n@keyframes telemetry-modal_fade-out_5Xhoq {\\n 0% {opacity: 1}\\n 100% {opacity: 0}\\n}\\n\\n.telemetry-modal_setting-was-updated_3U6oM {\\n animation: telemetry-modal_fade-out_5Xhoq 3s ease-out;\\n color: var(--extensions-primary);\\n}\\n\\n.telemetry-modal_button-row_1DOWD button {\\n border: 1px solid var(--looks-secondary);\\n border-radius: 0.25rem;\\n padding: 0.5rem 1.5rem;\\n color: white;\\n background: var(--looks-secondary);\\n font-weight: bold;\\n font-size: .875rem;\\n cursor: pointer;\\n}\\n\\n.telemetry-modal_button-row_1DOWD button:hover {\\n background: var(--extensions-primary);\\n box-shadow: 0 0 0 6px var(--looks-transparent);\\n}\\n\\n.telemetry-modal_button-row_1DOWD button:disabled {\\n background: var(--text-primary);\\n border-color: var(--ui-black-transparent);\\n box-shadow: none;\\n opacity: 0.25;\\n}\\n\\n@media screen and (max-height: 660px) {\\n .telemetry-modal_modal-content_16B4g {\\n margin: 5vh auto;\\n width: 90%;\\n }\\n}\\n\\n@media screen and (max-height: 540px) {\\n .telemetry-modal_illustration_1Xxcy {\\n display: none;\\n }\\n}\\n',\"\"]),t.locals={\"modal-overlay\":\"telemetry-modal_modal-overlay_SDoFR\",modalOverlay:\"telemetry-modal_modal-overlay_SDoFR\",\"modal-content\":\"telemetry-modal_modal-content_16B4g\",modalContent:\"telemetry-modal_modal-content_16B4g\",illustration:\"telemetry-modal_illustration_1Xxcy\",body:\"telemetry-modal_body_2Gocn\",\"privacy-policy-link\":\"telemetry-modal_privacy-policy-link_18tcE\",privacyPolicyLink:\"telemetry-modal_privacy-policy-link_18tcE\",\"radio-buttons\":\"telemetry-modal_radio-buttons_1Tkl7\",radioButtons:\"telemetry-modal_radio-buttons_1Tkl7\",\"label-selected\":\"telemetry-modal_label-selected_NsTZr\",labelSelected:\"telemetry-modal_label-selected_NsTZr\",\"button-row\":\"telemetry-modal_button-row_1DOWD\",buttonRow:\"telemetry-modal_button-row_1DOWD\",\"setting-was-updated\":\"telemetry-modal_setting-was-updated_3U6oM\",settingWasUpdated:\"telemetry-modal_setting-was-updated_3U6oM\",\"fade-out\":\"telemetry-modal_fade-out_5Xhoq\",fadeOut:\"telemetry-modal_fade-out_5Xhoq\"}},function(e,t,n){e.exports=n.p+\"static/assets/93babda8f98fc8009c28e97f1f118b6f.png\"},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.username-modal_modal-content_2AuAG {\\n width: 400px;\\n}\\n\\n.username-modal_body_3Vuvu {\\n background: var(--ui-modal-background);\\n padding: 1.5rem 2.25rem;\\n}\\n\\n.username-modal_body_3Vuvu input[type=\"checkbox\"],\\n.username-modal_body_3Vuvu input[type=\"radio\"] {\\n margin: 3px;\\n}\\n\\n.username-modal_text-input_1gGP7 {\\n margin-bottom: 1rem;\\n width: 100%;\\n border: 1px solid var(--ui-black-transparent);\\n border-radius: 5px;\\n padding: 0 1rem;\\n height: 3rem;\\n color: var(--ui-text-primary-transparent);\\n font-size: .875rem;\\n background-color: var(--input-background);\\n}\\n\\n.username-modal_button-row_HCDS0 {\\n font-weight: bolder;\\n text-align: right;\\n}\\n\\n.username-modal_button-row_HCDS0 button {\\n padding: 0.75rem 1rem;\\n border-radius: 0.25rem;\\n background: white;\\n border: 1px solid var(--ui-black-transparent);\\n font-weight: 600;\\n font-size: 0.85rem;\\n}\\n\\n.username-modal_button-row_HCDS0 button[disabled] {\\n opacity: 0.5;\\n}\\n\\n[dir=\"ltr\"] .username-modal_button-row_HCDS0 button + button {\\n margin-left: 0.5rem;\\n}\\n\\n[dir=\"rtl\"] .username-modal_button-row_HCDS0 button + button {\\n margin-right: 0.5rem;\\n}\\n\\n.username-modal_button-row_HCDS0 button.username-modal_ok-button_3Ig9c {\\n background: var(--looks-secondary);\\n border: var(--looks-secondary);\\n color: white;\\n}\\n\\n.username-modal_button-row_HCDS0 button.username-modal_cancel-button_GTsd- {\\n color: black;\\n}\\n\\n.username-modal_help-text_3Rb6d {\\n margin-bottom: 1rem;\\n}\\n\\n.username-modal_must-change_3SKT6 {\\n font-weight: bold;\\n}\\n\\n.username-modal_reset-link_37lrN {\\n cursor: pointer;\\n}\\n',\"\"]),t.locals={\"modal-content\":\"username-modal_modal-content_2AuAG\",modalContent:\"username-modal_modal-content_2AuAG\",body:\"username-modal_body_3Vuvu\",\"text-input\":\"username-modal_text-input_1gGP7\",textInput:\"username-modal_text-input_1gGP7\",\"button-row\":\"username-modal_button-row_HCDS0\",buttonRow:\"username-modal_button-row_HCDS0\",\"ok-button\":\"username-modal_ok-button_3Ig9c\",okButton:\"username-modal_ok-button_3Ig9c\",\"cancel-button\":\"username-modal_cancel-button_GTsd-\",cancelButton:\"username-modal_cancel-button_GTsd-\",\"help-text\":\"username-modal_help-text_3Rb6d\",helpText:\"username-modal_help-text_3Rb6d\",\"must-change\":\"username-modal_must-change_3SKT6\",mustChange:\"username-modal_must-change_3SKT6\",\"reset-link\":\"username-modal_reset-link_37lrN\",resetLink:\"username-modal_reset-link_37lrN\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\"/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.settings-modal_modal-content_14XGC {\\n max-width: 750px;\\n}\\n\\n.settings-modal_body_2_OnB {\\n background: var(--ui-modal-background);\\n padding: 1.5rem 2.25rem;\\n min-height: 150px;\\n max-height: calc(100vh - 250px);\\n overflow-y: auto;\\n}\\n\\n/* For small screens, such as in the embed */\\n\\n@media (max-height: 600px) {\\n .settings-modal_modal-content_14XGC {\\n margin: 50px auto;\\n }\\n .settings-modal_body_2_OnB {\\n max-height: calc(100vh - 150px);\\n }\\n}\\n\\n.settings-modal_setting_3KFrK {\\n display: flex;\\n flex-direction: column;\\n padding: 0.5rem 1rem;\\n margin: 0.25rem 0;\\n border-radius: 4px;\\n}\\n\\n.settings-modal_setting_3KFrK.settings-modal_active_1Tl18 {\\n background: var(--badge-background);\\n}\\n\\n.settings-modal_setting_3KFrK:hover,\\n.settings-modal_setting_3KFrK:focus-within {\\n background: var(--badge-border);\\n}\\n\\n.settings-modal_label_21R3L {\\n height: 32px;\\n display: flex;\\n flex-direction: row;\\n align-items: center;\\n}\\n\\n.settings-modal_setting_3KFrK table {\\n border-collapse: collapse;\\n}\\n\\n.settings-modal_setting_3KFrK tr,\\n.settings-modal_setting_3KFrK td,\\n.settings-modal_setting_3KFrK th {\\n padding: 0;\\n margin: 0;\\n border: 1px solid var(--ui-tertiary);\\n}\\n\\n.settings-modal_checkbox_3KZcV {\\n margin-right: 0.5rem;\\n}\\n\\n.settings-modal_help-icon__QQqI {\\n position: relative;\\n border: 0;\\n background-color: transparent;\\n width: 20px;\\n height: 20px;\\n background-size: 100%;\\n margin-left: 0.5rem;\\n cursor: pointer;\\n}\\n\\n.settings-modal_help-icon__QQqI img {\\n display: block;\\n position: absolute;\\n top: 0;\\n left: 0;\\n width: 100%;\\n height: 100%;\\n filter: var(--filter-icon-black);\\n}\\n\\n.settings-modal_custom-stage-size_dr_Qv > * {\\n margin-right: 0.5rem;\\n}\\n\\n.settings-modal_custom-stage-size-input_1Pr3z {\\n width: 80px;\\n}\\n\\n.settings-modal_info_Ce_iV {\\n margin-bottom: 0.25rem;\\n}\\n\\n.settings-modal_header_112iQ {\\n display: flex;\\n flex-direction: row;\\n align-items: center;\\n margin: 0.5rem 0 0 0;\\n font-weight: bold;\\n}\\n\\n.settings-modal_divider_3K8K_ {\\n flex-grow: 1;\\n margin-left: 1rem;\\n border-top: 1px dashed var(--ui-tertiary);\\n}\\n\\n.settings-modal_button_ACn0P {\\n font-family: inherit;\\n font-size: 14px;\\n background-color: var(--looks-secondary);\\n color: white;\\n border: none;\\n padding: 0.5rem 1rem;\\n margin: 0;\\n border-radius: 4px;\\n cursor: pointer;\\n font-family: inherit;\\n font-weight: bold;\\n}\\n\\n.settings-modal_button_ACn0P:active, .settings-modal_button_ACn0P:focus-within {\\n box-shadow: 0 0 0 3px var(--looks-transparent);\\n}\\n\\n.settings-modal_warning_3UmRm {\\n padding: 0.5rem 1rem;\\n margin: 0.25rem 0;\\n border-radius: 4px;\\n background: rgb(233, 233, 53);\\n color: var(--text-primary-default);\\n}\\n\",\"\"]),t.locals={\"modal-content\":\"settings-modal_modal-content_14XGC\",modalContent:\"settings-modal_modal-content_14XGC\",body:\"settings-modal_body_2_OnB\",setting:\"settings-modal_setting_3KFrK\",active:\"settings-modal_active_1Tl18\",label:\"settings-modal_label_21R3L\",checkbox:\"settings-modal_checkbox_3KZcV\",\"help-icon\":\"settings-modal_help-icon__QQqI\",helpIcon:\"settings-modal_help-icon__QQqI\",\"custom-stage-size\":\"settings-modal_custom-stage-size_dr_Qv\",customStageSize:\"settings-modal_custom-stage-size_dr_Qv\",\"custom-stage-size-input\":\"settings-modal_custom-stage-size-input_1Pr3z\",customStageSizeInput:\"settings-modal_custom-stage-size-input_1Pr3z\",info:\"settings-modal_info_Ce_iV\",header:\"settings-modal_header_112iQ\",divider:\"settings-modal_divider_3K8K_\",button:\"settings-modal_button_ACn0P\",warning:\"settings-modal_warning_3UmRm\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\"/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.load-extension_code_18JAZ,\\n.load-extension_unsandboxed-container_3wUNS,\\n.load-extension_unsandboxed-warning_3AXrs,\\n.load-extension_sandboxed_2q4uS {\\n margin: 8px 0;\\n}\\n\\n.load-extension_unsandboxed-container_3wUNS {\\n display: flex;\\n align-items: center;\\n}\\n\\n.load-extension_unsandboxed-checkbox_3F7r1 {\\n margin-right: 8px;\\n}\\n\\n.load-extension_unsandboxed-warning_3AXrs {\\n padding: 0.5rem;\\n border-radius: 0.25rem;\\n background-color: rgba(255, 81, 81, 0.25);\\n border: 1px solid red;\\n}\\n\",\"\"]),t.locals={code:\"load-extension_code_18JAZ\",\"unsandboxed-container\":\"load-extension_unsandboxed-container_3wUNS\",unsandboxedContainer:\"load-extension_unsandboxed-container_3wUNS\",\"unsandboxed-warning\":\"load-extension_unsandboxed-warning_3AXrs\",unsandboxedWarning:\"load-extension_unsandboxed-warning_3AXrs\",sandboxed:\"load-extension_sandboxed_2q4uS\",\"unsandboxed-checkbox\":\"load-extension_unsandboxed-checkbox_3F7r1\",unsandboxedCheckbox:\"load-extension_unsandboxed-checkbox_3F7r1\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\".url_url_3I3v0 {\\n font-family: monospace;\\n -webkit-user-select: text;\\n -moz-user-select: text;\\n -ms-user-select: text;\\n user-select: text;\\n word-wrap: break-word;\\n}\\n.url_url_3I3v0::before {\\n content: '\\\"';\\n}\\n.url_url_3I3v0::after {\\n content: '\\\"';\\n}\\n\",\"\"]),t.locals={url:\"url_url_3I3v0\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\"/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.data-url_code_fTTSN {\\n display: block;\\n width: 100%;\\n max-width: 100%;\\n min-width: 100%;\\n height: 5rem;\\n min-height: 3rem;\\n border: 1px solid var(--ui-black-transparent);\\n border-radius: 0.25rem;\\n padding: 0.25rem;\\n font-size: 0.875rem;\\n font-family: monospace;\\n margin: 0.5rem 0;\\n}\\n\",\"\"]),t.locals={code:\"data-url_code_fTTSN\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\".download_file-name_1ae0K {\\n font-family: monospace;\\n -webkit-user-select: text;\\n -moz-user-select: text;\\n -ms-user-select: text;\\n user-select: text;\\n word-wrap: break-word;\\n}\\n.download_file-name_1ae0K::before {\\n content: '\\\"';\\n}\\n.download_file-name_1ae0K::after {\\n content: '\\\"';\\n}\\n.download_name_1dXN3 {\\n\\n}\\n.download_dot_1GvC1 {\\n\\n}\\n.download_extension_15MbY {\\n text-decoration: underline;\\n}\\n\",\"\"]),t.locals={\"file-name\":\"download_file-name_1ae0K\",fileName:\"download_file-name_1ae0K\",name:\"download_name_1dXN3\",dot:\"download_dot_1GvC1\",extension:\"download_extension_15MbY\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\"/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.security-manager-modal_modal-content_33sCQ {\\n width: 440px;\\n margin-top: 25px;\\n}\\n\\n.security-manager-modal_body_1jZgz {\\n background: var(--ui-white);\\n padding: 1rem 1.5rem;\\n}\\n\\n.security-manager-modal_body_1jZgz p {\\n margin: 8px 0;\\n}\\n\\n.security-manager-modal_buttons_3qEck {\\n display: flex;\\n}\\n\\n.security-manager-modal_buttons_3qEck :disabled {\\n opacity: 0.8;\\n}\\n\\n.security-manager-modal_deny-button_dMRqK, .security-manager-modal_allow-button_3liNF {\\n flex-grow: 1;\\n font: inherit;\\n color: inherit;\\n padding: 0.75rem 1rem;\\n border-radius: 0.25rem;\\n border: 1px solid var(--ui-black-transparent);\\n font-weight: 600;\\n font-size: 0.85rem;\\n}\\n\\n.security-manager-modal_deny-button_dMRqK {\\n background-color: rgb(255, 92, 92);\\n color: white;\\n margin-right: 8px;\\n}\\n\\n.security-manager-modal_allow-button_3liNF {\\n background-color: #24cd11;\\n color: black;\\n}\\n\",\"\"]),t.locals={\"modal-content\":\"security-manager-modal_modal-content_33sCQ\",modalContent:\"security-manager-modal_modal-content_33sCQ\",body:\"security-manager-modal_body_1jZgz\",buttons:\"security-manager-modal_buttons_3qEck\",\"deny-button\":\"security-manager-modal_deny-button_dMRqK\",denyButton:\"security-manager-modal_deny-button_dMRqK\",\"allow-button\":\"security-manager-modal_allow-button_3liNF\",allowButton:\"security-manager-modal_allow-button_3liNF\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\"/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.file-input_container_3QJO5 {\\n display: block;\\n position: relative;\\n padding: 1rem;\\n margin: 1rem 0;\\n text-align: center;\\n border: 4px dashed var(--ui-tertiary);\\n border-radius: 5px;\\n cursor: pointer;\\n background: none;\\n width: 100%;\\n}\\n\\n.file-input_container_3QJO5:focus-within {\\n border-color: var(--looks-secondary);\\n}\\n\",\"\"]),t.locals={container:\"file-input_container_3QJO5\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.custom-extension-modal_modal-content_3xW36 {\\n max-width: 550px;\\n margin-top: 50px;\\n}\\n\\n.custom-extension-modal_body_1Ckhr {\\n background: var(--ui-white);\\n padding: 1.5rem 2.25rem;\\n}\\n\\n.custom-extension-modal_body_1Ckhr p,\\n.custom-extension-modal_unsandboxed-container_1odK4,\\n.custom-extension-modal_url-input_17a_x,\\n.custom-extension-modal_text-code-input_aggNo {\\n margin: 1rem 0;\\n display: block;\\n}\\n\\n.custom-extension-modal_type-selector-container_37RY2 {\\n display: flex;\\n justify-content: space-around;\\n}\\n\\n.custom-extension-modal_type-selector-button_3Ow2Y {\\n width: 100%;\\n cursor: pointer;\\n border-bottom: 0.25rem solid var(--ui-tertiary);\\n margin: 0 1rem;\\n padding: 0.5rem 0;\\n text-align: center;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n}\\n\\n.custom-extension-modal_type-selector-button_3Ow2Y[data-active=\"true\"] {\\n border-color: var(--looks-secondary);\\n}\\n\\n.custom-extension-modal_type-selector-button_3Ow2Y:active {\\n border-color: var(--looks-transparent);\\n}\\n\\n.custom-extension-modal_url-input_17a_x,\\n.custom-extension-modal_text-code-input_aggNo {\\n width: 100%;\\n border: 1px solid var(--ui-black-transparent);\\n border-radius: 0.25rem;\\n padding: 0.5rem;\\n font-size: inherit;\\n}\\n\\n.custom-extension-modal_url-input_17a_x {\\n height: 3rem;\\n}\\n\\n.custom-extension-modal_text-code-input_aggNo {\\n min-height: 3rem;\\n height: 8rem;\\n min-width: 100%;\\n max-width: 100%;\\n font-family: monospace;\\n}\\n\\n.custom-extension-modal_unsandboxed-container_1odK4 {\\n display: flex;\\n align-items: center;\\n}\\n\\n.custom-extension-modal_unsandboxed-checkbox_tsBMn {\\n margin-right: 0.5rem;\\n}\\n\\n.custom-extension-modal_trusted-extension_3s2FM,\\n.custom-extension-modal_unsandboxed-warning_1BisM {\\n padding: 0.5rem;\\n border-radius: 0.25rem;\\n}\\n\\n.custom-extension-modal_trusted-extension_3s2FM {\\n background-color: rgba(94, 255, 94, 0.25);\\n border: 1px solid green;\\n}\\n\\n.custom-extension-modal_unsandboxed-warning_1BisM {\\n background-color: rgba(255, 81, 81, 0.25);\\n border: 1px solid red;\\n}\\n\\n.custom-extension-modal_unsandboxed-warning_1BisM > *:not(:last-child) {\\n display: block;\\n margin-bottom: 4px;\\n}\\n\\n.custom-extension-modal_button-row_38P_C {\\n display: flex;\\n justify-content: flex-end;\\n}\\n\\n.custom-extension-modal_load-button_1rBmy {\\n font: inherit;\\n color: inherit;\\n padding: 0.75rem 1rem;\\n border-radius: 0.25rem;\\n border: 1px solid var(--ui-black-transparent);\\n font-weight: 600;\\n font-size: 0.85rem;\\n color: white;\\n background: var(--looks-secondary);\\n}\\n\\n.custom-extension-modal_load-button_1rBmy:disabled {\\n opacity: 0.8;\\n}\\n',\"\"]),t.locals={\"modal-content\":\"custom-extension-modal_modal-content_3xW36\",modalContent:\"custom-extension-modal_modal-content_3xW36\",body:\"custom-extension-modal_body_1Ckhr\",\"unsandboxed-container\":\"custom-extension-modal_unsandboxed-container_1odK4\",unsandboxedContainer:\"custom-extension-modal_unsandboxed-container_1odK4\",\"url-input\":\"custom-extension-modal_url-input_17a_x\",urlInput:\"custom-extension-modal_url-input_17a_x\",\"text-code-input\":\"custom-extension-modal_text-code-input_aggNo\",textCodeInput:\"custom-extension-modal_text-code-input_aggNo\",\"type-selector-container\":\"custom-extension-modal_type-selector-container_37RY2\",typeSelectorContainer:\"custom-extension-modal_type-selector-container_37RY2\",\"type-selector-button\":\"custom-extension-modal_type-selector-button_3Ow2Y\",typeSelectorButton:\"custom-extension-modal_type-selector-button_3Ow2Y\",\"unsandboxed-checkbox\":\"custom-extension-modal_unsandboxed-checkbox_tsBMn\",unsandboxedCheckbox:\"custom-extension-modal_unsandboxed-checkbox_tsBMn\",\"trusted-extension\":\"custom-extension-modal_trusted-extension_3s2FM\",trustedExtension:\"custom-extension-modal_trusted-extension_3s2FM\",\"unsandboxed-warning\":\"custom-extension-modal_unsandboxed-warning_1BisM\",unsandboxedWarning:\"custom-extension-modal_unsandboxed-warning_1BisM\",\"button-row\":\"custom-extension-modal_button-row_38P_C\",buttonRow:\"custom-extension-modal_button-row_38P_C\",\"load-button\":\"custom-extension-modal_load-button_1rBmy\",loadButton:\"custom-extension-modal_load-button_1rBmy\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\"/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.restore-point-modal_modal-content_1cTB4 {\\n max-width: 600px;\\n margin-top: 50px;\\n}\\n\\n.restore-point-modal_body_Ne9Vp {\\n background: var(--ui-modal-background);\\n padding: 1.5rem 2.25rem;\\n max-height: calc(100vh - 150px);\\n overflow: auto;\\n display: flex;\\n flex-direction: column;\\n gap: 1rem;\\n}\\n\\n.restore-point-modal_extra-container_tMv36 {\\n display: flex;\\n justify-content: space-between;\\n align-items: center;\\n}\\n\\n.restore-point-modal_total-size_3gtWl {\\n\\n}\\n\\n.restore-point-modal_total-size-description_3Zmy6 {\\n font-size: small;\\n}\\n\\n.restore-point-modal_button_cFvo3 {\\n font: inherit;\\n color: inherit;\\n padding: 0.75rem 1rem;\\n border-radius: 0.25rem;\\n border: 1px solid var(--ui-black-transparent);\\n font-weight: 600;\\n font-size: 0.85rem;\\n color: var(--ui-white);\\n}\\n\\n.restore-point-modal_button_cFvo3:disabled {\\n opacity: 0.8;\\n}\\n\\n.restore-point-modal_delete-all-button_9PWf0 {\\n margin-left: 1rem;\\n background-color: var(--data-primary);\\n color: white;\\n white-space: nowrap;\\n}\\n\\n.restore-point-modal_error-message_19Pqn {\\n font-family: monospace;\\n -webkit-user-select: text;\\n -moz-user-select: text;\\n -ms-user-select: text;\\n user-select: text;\\n}\\n\\n.restore-point-modal_restore-point-container_3KiD9 {\\n display: grid;\\n grid-template-columns: 1fr;\\n gap: 0.5rem;\\n}\\n\\n.restore-point-modal_restore-point_11IHu {\\n width: 100%;\\n cursor: pointer;\\n display: flex;\\n align-items: center;\\n border: 2px solid var(--ui-black-transparent);\\n padding: 0.5rem;\\n border-radius: 0.5rem;\\n gap: 0.5rem;\\n}\\n\\n.restore-point-modal_restore-point_11IHu:hover {\\n border-color: var(--looks-secondary);\\n}\\n\\n.restore-point-modal_restore-point-title_k0U8V {\\n font-weight: bold;\\n}\\n\\n.restore-point-modal_thumbnail-container_3RM7b {\\n flex-shrink: 0;\\n /* 4:3 */\\n width: 100px;\\n height: 75px;\\n}\\n\\n.restore-point-modal_thumbnail-image_31By_ {\\n display: block;\\n border-radius: 0.25rem;\\n width: 100%;\\n height: 100%;\\n}\\n\\n.restore-point-modal_thumbnail-placeholder_2Q3El {\\n width: 100%;\\n height: 100%;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n font-size: 2em;\\n}\\n\\n.restore-point-modal_restore-point-buttons_1mPFn {\\n margin-left: auto;\\n display: flex;\\n flex-direction: row;\\n gap: 0.5rem;\\n}\\n\\n.restore-point-modal_restore-point-button_2eIR7 {\\n -webkit-appearance: none;\\n -moz-appearance: none;\\n appearance: none;\\n background: none;\\n border: none;\\n border-radius: 100%;\\n width: 2rem;\\n height: 2rem;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n}\\n\\n.restore-point-modal_restore-point-button_2eIR7[disabled] {\\n opacity: 0.5;\\n}\\n\\n.restore-point-modal_restore-point-button_2eIR7 img {\\n display: block;\\n width: 75%;\\n height: 75%;\\n filter: var(--filter-icon-gray);\\n}\\n\\n.restore-point-modal_restore-point-button_2eIR7:not([disabled]):hover {\\n background-color: var(--ui-black-transparent);\\n}\\n\\n.restore-point-modal_disabled_7w0zS {\\n padding: 0.5rem;\\n border-radius: 0.5rem;\\n background-color: rgba(255, 0, 0, 0.18);\\n border: 2px solid rgba(255, 0, 0, 0.568);\\n font-weight: bold;\\n}\\n\",\"\"]),t.locals={\"modal-content\":\"restore-point-modal_modal-content_1cTB4\",modalContent:\"restore-point-modal_modal-content_1cTB4\",body:\"restore-point-modal_body_Ne9Vp\",\"extra-container\":\"restore-point-modal_extra-container_tMv36\",extraContainer:\"restore-point-modal_extra-container_tMv36\",\"total-size\":\"restore-point-modal_total-size_3gtWl\",totalSize:\"restore-point-modal_total-size_3gtWl\",\"total-size-description\":\"restore-point-modal_total-size-description_3Zmy6\",totalSizeDescription:\"restore-point-modal_total-size-description_3Zmy6\",button:\"restore-point-modal_button_cFvo3\",\"delete-all-button\":\"restore-point-modal_delete-all-button_9PWf0\",deleteAllButton:\"restore-point-modal_delete-all-button_9PWf0\",\"error-message\":\"restore-point-modal_error-message_19Pqn\",errorMessage:\"restore-point-modal_error-message_19Pqn\",\"restore-point-container\":\"restore-point-modal_restore-point-container_3KiD9\",restorePointContainer:\"restore-point-modal_restore-point-container_3KiD9\",\"restore-point\":\"restore-point-modal_restore-point_11IHu\",restorePoint:\"restore-point-modal_restore-point_11IHu\",\"restore-point-title\":\"restore-point-modal_restore-point-title_k0U8V\",restorePointTitle:\"restore-point-modal_restore-point-title_k0U8V\",\"thumbnail-container\":\"restore-point-modal_thumbnail-container_3RM7b\",thumbnailContainer:\"restore-point-modal_thumbnail-container_3RM7b\",\"thumbnail-image\":\"restore-point-modal_thumbnail-image_31By_\",thumbnailImage:\"restore-point-modal_thumbnail-image_31By_\",\"thumbnail-placeholder\":\"restore-point-modal_thumbnail-placeholder_2Q3El\",thumbnailPlaceholder:\"restore-point-modal_thumbnail-placeholder_2Q3El\",\"restore-point-buttons\":\"restore-point-modal_restore-point-buttons_1mPFn\",restorePointButtons:\"restore-point-modal_restore-point-buttons_1mPFn\",\"restore-point-button\":\"restore-point-modal_restore-point-button_2eIR7\",restorePointButton:\"restore-point-modal_restore-point-button_2eIR7\",disabled:\"restore-point-modal_disabled_7w0zS\"}},function(e,t,n){var a=n(261);(t=e.exports=n(9)(!1)).push([e.i,'/* overridden by src/lib/themes/guiHelpers.js */\\n\\n/*\\n Contains constants for the z-index values of elements that are part of the global stack context.\\n In other words, z-index values that are \"inside\" a component are not added here.\\n This prevents conflicts between identical z-index values in different components.\\n*/\\n\\n/* Toolbox z-index: 40; set in scratch-blocks */\\n\\n/* tooltips should go over add buttons if they overlap */\\n\\n/* monitors go over add buttons */\\n\\n/* \"ask\" block text input goes above monitors */\\n\\n/* menu-bar should go over monitors, alerts and tutorials */\\n\\n/* behind menu-bar */\\n\\n/* Block drag z-index: 1000; default 50 is overriden in blocks.css */\\n\\n/* so it is draggable into other panes */\\n\\n/* behind modals */\\n\\n/* behind modals */\\n\\n/* in most interfaces, the context menu is always on top */\\n\\n.fonts-modal_modal-content_18OL8 {\\n max-width: 550px;\\n margin-top: 50px;\\n}\\n\\n.fonts-modal_body_2iQc- {\\n background: var(--ui-modal-background);\\n padding: 1.5rem 2.25rem;\\n max-height: calc(100vh - 150px);\\n overflow: auto;\\n display: flex;\\n flex-direction: column;\\n gap: 1rem;\\n}\\n\\n.fonts-modal_open-buttons_Ibv_M {\\n display: flex;\\n gap: 1rem;\\n}\\n\\n.fonts-modal_open-button_tXG-L {\\n display: flex;\\n flex-direction: column;\\n gap: 0.5rem;\\n width: 100%;\\n align-items: center;\\n background: none;\\n padding: 0.5rem;\\n margin: 0;\\n border: 2px solid var(--ui-black-transparent);\\n border-radius: 0.5rem;\\n}\\n\\n.fonts-modal_open-button_tXG-L:hover {\\n color: var(--looks-secondary);\\n border-color: var(--looks-secondary);\\n}\\n\\n.fonts-modal_open-button-image_3Yvmx {\\n width: 64px;\\n height: 64px;\\n background-color: currentColor;\\n -webkit-mask-size: cover;\\n mask-size: cover;\\n -webkit-mask-repeat: no-repeat;\\n mask-repeat: no-repeat;\\n}\\n\\n.fonts-modal_system-image_1FMIX {\\n -webkit-mask-image: url('+a(n(262))+\");\\n mask-image: url(\"+a(n(262))+\");\\n}\\n\\n.fonts-modal_custom-image_3UlWl {\\n -webkit-mask-image: url(\"+a(n(263))+\");\\n mask-image: url(\"+a(n(263))+\");\\n}\\n\\n.fonts-modal_open-button-text_2zjAq {\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n justify-content: center;\\n width: 100%;\\n}\\n\\n.fonts-modal_open-button-text-main_2u3P1 {\\n font-weight: bold;\\n}\\n\\n.fonts-modal_open-button-text-sub_1635p {\\n\\n}\\n\\n.fonts-modal_font-input-outer__UCqK {\\n\\n}\\n\\n.fonts-modal_font-input_10TgQ {\\n width: 100%;\\n border: 1px solid var(--ui-black-transparent);\\n border-radius: 0.25rem;\\n padding: 0 1rem;\\n height: 3rem;\\n font: inherit;\\n color: var(--text-primary);\\n background-color: var(--input-background);\\n}\\n\\n.fonts-modal_font-dropdown-outer_PYJoD {\\n position: absolute;\\n z-index: 510;\\n background-color: var(--ui-white);\\n color: var(--text-primary);\\n border-radius: 0.25rem;\\n overflow: auto;\\n max-height: 300px;\\n border: 1px solid var(--ui-black-transparent);\\n box-sizing: border-box;\\n box-shadow: 0px 0px 8px 1px var(--shadow);\\n}\\n\\n.fonts-modal_font-dropdown-item_2hkHC {\\n display: flex;\\n align-items: center;\\n padding: 0.5rem 0.75rem;\\n height: 1.5rem;\\n cursor: pointer;\\n transition: .1s ease;\\n}\\n\\n.fonts-modal_font-dropdown-item_2hkHC:hover {\\n background-color: var(--looks-secondary);\\n color: #ffffff;\\n}\\n\\n.fonts-modal_font-playground_pRkK6 {\\n background: none;\\n border: none;\\n padding: 0.5rem;\\n margin: 0;\\n resize: none;\\n width: 100%;\\n height: 100px;\\n font-size: 1.5rem;\\n border: 1px solid var(--ui-black-transparent);\\n border-radius: 0.25rem;\\n}\\n\\n.fonts-modal_button_1M3QC {\\n font: inherit;\\n font-weight: bold;\\n padding: 0.75rem 1rem;\\n border-radius: 0.25rem;\\n border: 1px solid var(--ui-black-transparent);\\n background-color: var(--looks-secondary);\\n color: white;\\n}\\n\\n.fonts-modal_button_1M3QC:disabled {\\n opacity: 0.8;\\n}\\n\\n.fonts-modal_fallback-container_3pRR4 {\\n display: flex;\\n flex-direction: column;\\n}\\n\\n.fonts-modal_fallback-label_1O3KW {\\n margin-bottom: 0.5rem;\\n}\\n\\n.fonts-modal_fallback-list_3UBoZ {\\n display: grid;\\n grid-template-columns: 1fr 1fr 1fr;\\n gap: 0.25rem\\n}\\n\\n.fonts-modal_fallback-button_348ot {\\n background: none;\\n padding: 0;\\n border: 0;\\n border-radius: 0.25rem;\\n height: 30px;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n}\\n\\n.fonts-modal_fallback-button_348ot:hover {\\n color: var(--looks-secondary);\\n}\\n\\n.fonts-modal_fallback-container_3pRR4 .fonts-modal_fallback-button-selected_3tSlW {\\n background-color: var(--looks-secondary);\\n color: white;\\n}\\n\\n.fonts-modal_fonts-outer_3vCx7 {\\n border-top: 2px solid var(--ui-black-transparent);\\n padding-top: 1rem;\\n}\\n\\n.fonts-modal_fonts-outer_3vCx7 p {\\n margin-bottom: 0.5rem;\\n}\\n\\n.fonts-modal_fonts_2LnvP {\\n display: flex;\\n flex-direction: column;\\n gap: 0.5rem;\\n}\\n\\n.fonts-modal_manage-font_AA1bK {\\n width: 100%;\\n display: flex;\\n align-items: center;\\n border: 2px solid var(--ui-black-transparent);\\n border-radius: 0.5rem;\\n padding: 0.5rem;\\n gap: 0.5rem;\\n}\\n\\n.fonts-modal_manage-font-name_2SxDI {\\n font-size: 2rem;\\n margin-bottom: 0.5rem;\\n overflow-wrap: anywhere;\\n}\\n\\n.fonts-modal_manage-font-buttons_2JqqJ {\\n margin-left: auto;\\n flex-shrink: 0;\\n display: flex;\\n flex-direction: row;\\n gap: 0.5rem;\\n}\\n\\n.fonts-modal_manage-font-button_3V2ru {\\n background: none;\\n border: none;\\n border-radius: 100%;\\n width: 2rem;\\n height: 2rem;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n}\\n\\n.fonts-modal_manage-font-button_3V2ru:hover {\\n background-color: var(--ui-black-transparent);\\n}\\n\\n.fonts-modal_manage-font-button_3V2ru img {\\n display: block;\\n width: 100%;\\n height: 100%;\\n filter: var(--filter-icon-black);\\n}\\n\",\"\"]),t.locals={\"modal-content\":\"fonts-modal_modal-content_18OL8\",modalContent:\"fonts-modal_modal-content_18OL8\",body:\"fonts-modal_body_2iQc-\",\"open-buttons\":\"fonts-modal_open-buttons_Ibv_M\",openButtons:\"fonts-modal_open-buttons_Ibv_M\",\"open-button\":\"fonts-modal_open-button_tXG-L\",openButton:\"fonts-modal_open-button_tXG-L\",\"open-button-image\":\"fonts-modal_open-button-image_3Yvmx\",openButtonImage:\"fonts-modal_open-button-image_3Yvmx\",\"system-image\":\"fonts-modal_system-image_1FMIX\",systemImage:\"fonts-modal_system-image_1FMIX\",\"custom-image\":\"fonts-modal_custom-image_3UlWl\",customImage:\"fonts-modal_custom-image_3UlWl\",\"open-button-text\":\"fonts-modal_open-button-text_2zjAq\",openButtonText:\"fonts-modal_open-button-text_2zjAq\",\"open-button-text-main\":\"fonts-modal_open-button-text-main_2u3P1\",openButtonTextMain:\"fonts-modal_open-button-text-main_2u3P1\",\"open-button-text-sub\":\"fonts-modal_open-button-text-sub_1635p\",openButtonTextSub:\"fonts-modal_open-button-text-sub_1635p\",\"font-input-outer\":\"fonts-modal_font-input-outer__UCqK\",fontInputOuter:\"fonts-modal_font-input-outer__UCqK\",\"font-input\":\"fonts-modal_font-input_10TgQ\",fontInput:\"fonts-modal_font-input_10TgQ\",\"font-dropdown-outer\":\"fonts-modal_font-dropdown-outer_PYJoD\",fontDropdownOuter:\"fonts-modal_font-dropdown-outer_PYJoD\",\"font-dropdown-item\":\"fonts-modal_font-dropdown-item_2hkHC\",fontDropdownItem:\"fonts-modal_font-dropdown-item_2hkHC\",\"font-playground\":\"fonts-modal_font-playground_pRkK6\",fontPlayground:\"fonts-modal_font-playground_pRkK6\",button:\"fonts-modal_button_1M3QC\",\"fallback-container\":\"fonts-modal_fallback-container_3pRR4\",fallbackContainer:\"fonts-modal_fallback-container_3pRR4\",\"fallback-label\":\"fonts-modal_fallback-label_1O3KW\",fallbackLabel:\"fonts-modal_fallback-label_1O3KW\",\"fallback-list\":\"fonts-modal_fallback-list_3UBoZ\",fallbackList:\"fonts-modal_fallback-list_3UBoZ\",\"fallback-button\":\"fonts-modal_fallback-button_348ot\",fallbackButton:\"fonts-modal_fallback-button_348ot\",\"fallback-button-selected\":\"fonts-modal_fallback-button-selected_3tSlW\",fallbackButtonSelected:\"fonts-modal_fallback-button-selected_3tSlW\",\"fonts-outer\":\"fonts-modal_fonts-outer_3vCx7\",fontsOuter:\"fonts-modal_fonts-outer_3vCx7\",fonts:\"fonts-modal_fonts_2LnvP\",\"manage-font\":\"fonts-modal_manage-font_AA1bK\",manageFont:\"fonts-modal_manage-font_AA1bK\",\"manage-font-name\":\"fonts-modal_manage-font-name_2SxDI\",manageFontName:\"fonts-modal_manage-font-name_2SxDI\",\"manage-font-buttons\":\"fonts-modal_manage-font-buttons_2JqqJ\",manageFontButtons:\"fonts-modal_manage-font-buttons_2JqqJ\",\"manage-font-button\":\"fonts-modal_manage-font-button_3V2ru\",manageFontButton:\"fonts-modal_manage-font-button_3V2ru\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\"/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.unknown-platform-modal_modal-content_3mmhU {\\n max-width: 480px;\\n margin-top: 50px;\\n}\\n\\n.unknown-platform-modal_body_3AaGs {\\n background: var(--ui-modal-background);\\n padding: 1.5rem 2.25rem;\\n max-height: calc(100vh - 150px);\\n overflow: auto;\\n display: flex;\\n flex-direction: column;\\n gap: 1rem;\\n}\\n\\n.unknown-platform-modal_details_qZ8jy {\\n font-family: monospace;\\n -webkit-user-select: text;\\n -moz-user-select: text;\\n -ms-user-select: text;\\n user-select: text;\\n text-wrap: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n\\n.unknown-platform-modal_details_qZ8jy::before, .unknown-platform-modal_details_qZ8jy::after {\\n content: '\\\"';\\n}\\n\\n.unknown-platform-modal_button_3kMtl {\\n font: inherit;\\n font-weight: bold;\\n padding: 0.75rem 1rem;\\n border-radius: 0.25rem;\\n border: 1px solid var(--ui-black-transparent);\\n background-color: var(--looks-secondary);\\n color: white;\\n}\\n\\n.unknown-platform-modal_button_3kMtl:disabled {\\n opacity: 0.8;\\n}\\n\",\"\"]),t.locals={\"modal-content\":\"unknown-platform-modal_modal-content_3mmhU\",modalContent:\"unknown-platform-modal_modal-content_3mmhU\",body:\"unknown-platform-modal_body_3AaGs\",details:\"unknown-platform-modal_details_qZ8jy\",button:\"unknown-platform-modal_button_3kMtl\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\"/* overridden by src/lib/themes/guiHelpers.js */\\n\\n/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n.invalid-project-modal_modal-content_gjo_N {\\n max-width: 480px;\\n margin-top: 50px;\\n}\\n\\n.invalid-project-modal_body_2pc0v {\\n background: var(--ui-modal-background);\\n padding: 1.5rem 2.25rem;\\n max-height: calc(100vh - 150px);\\n overflow: auto;\\n display: flex;\\n flex-direction: column;\\n gap: 1rem;\\n}\\n\\n.invalid-project-modal_error_15lTg {\\n font-family: monospace;\\n height: 125px;\\n width: 100%;\\n box-sizing: border-box;\\n resize: vertical;\\n padding: 0.5rem;\\n border-radius: 0.5rem;\\n border: 1px solid var(--ui-black-transparent);\\n background-color: var(--input-background);\\n color: inherit;\\n}\\n\\n.invalid-project-modal_button_3w91i {\\n font: inherit;\\n font-weight: bold;\\n padding: 0.75rem 1rem;\\n border-radius: 0.25rem;\\n border: 1px solid var(--ui-black-transparent);\\n background-color: var(--looks-secondary);\\n color: white;\\n}\\n\",\"\"]),t.locals={\"modal-content\":\"invalid-project-modal_modal-content_gjo_N\",modalContent:\"invalid-project-modal_modal-content_gjo_N\",body:\"invalid-project-modal_body_2pc0v\",error:\"invalid-project-modal_error_15lTg\",button:\"invalid-project-modal_button_3w91i\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* make sure to keep these in sync with other constants,\\ne.g. STAGE_DIMENSION_DEFAULTS in lib/screen-utils.js */\\n\\n/* layout contants from `layout-constants.js` */\\n\\n/* overridden by src/lib/themes/guiHelpers.js */\\n\\n/*\\n Contains constants for the z-index values of elements that are part of the global stack context.\\n In other words, z-index values that are \"inside\" a component are not added here.\\n This prevents conflicts between identical z-index values in different components.\\n*/\\n\\n/* Toolbox z-index: 40; set in scratch-blocks */\\n\\n/* tooltips should go over add buttons if they overlap */\\n\\n/* monitors go over add buttons */\\n\\n/* \"ask\" block text input goes above monitors */\\n\\n/* menu-bar should go over monitors, alerts and tutorials */\\n\\n/* behind menu-bar */\\n\\n/* Block drag z-index: 1000; default 50 is overriden in blocks.css */\\n\\n/* so it is draggable into other panes */\\n\\n/* behind modals */\\n\\n/* behind modals */\\n\\n/* in most interfaces, the context menu is always on top */\\n\\n.gui_page-wrapper_r7IhT {\\n height: 100%;\\n display: flex;\\n flex-direction: column;\\n}\\n\\n.gui_body-wrapper_1T2l7 {\\n flex-grow: 1;\\n background-color: var(--ui-primary);\\n}\\n\\n.gui_body-wrapper_1T2l7 * {\\n box-sizing: border-box;\\n}\\n\\n.gui_flex-wrapper_2AgdD {\\n display: flex;\\n\\n /*\\n Make 2 columns:\\n a) for the blocks + workspace panes, and\\n b) for combined stage menu + stage + sprite/stage selectors\\n */\\n flex-direction: row;\\n height: 100%;\\n\\n /*\\n Stop scrollbar popping in and out from scratch-blocks border issue\\n https://github.com/LLK/scratch-gui/issues/318\\n TW: and also fix double horizontal scrollbar at some screen sizes in paint editor\\n */\\n overflow: hidden;\\n}\\n\\n.gui_editor-wrapper_WspaC {\\n /*\\n This is carefully balanced-- the minimum width at which the GUI will be displayed is 1024px.\\n At that size, the stage pane is 408px wide, with $space of padding to each side.\\n However, we must also add the border width to the stage pane. All-in-all, the stage pane\\'s final width is\\n 408px + ($space + $stage-standard-border-width * 2) (one border & padding per left/right side).\\n\\n @todo This is in place to prevent \"doubling up\" of horizontal scrollbars in narrow windows, but there are likely\\n much better ways to solve that (e.g. undo #2124, remove this flex-basis entirely). However, they run their own\\n risks of breaking things, so let\\'s just leave this as-is for the time being.\\n */\\n flex-basis: calc(1024px - 408px - ((0.5rem + 0.0625rem) * 2));\\n flex-grow: 1;\\n flex-shrink: 0;\\n position: relative;\\n\\n display: flex;\\n flex-direction: column;\\n}\\n\\n.gui_tab-list_3r8RB {\\n height: 2.75rem;\\n width: 250px; /* Match width of the toolbox */\\n display: flex;\\n align-items: flex-end;\\n flex-shrink: 0;\\n\\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\\n font-weight: 500;\\n font-size: 0.80rem;\\n\\n /* Overrides for react-tabs styling */\\n margin: 0 !important;\\n border-bottom: 0 !important;\\n\\n color: var(--text-primary);\\n}\\n\\n.gui_tab_3k_DV {\\n flex-grow: 1;\\n height: 80%;\\n margin-bottom: 0;\\n\\n border-radius: 1rem 1rem 0 0;\\n border: 1px solid var(--ui-black-transparent);\\n\\n padding: 0.125rem 1.25rem 0;\\n font-size: 0.75rem;\\n\\n background-color: var(--ui-tertiary);\\n color: var(--ui-text-primary-transparent);\\n\\n display: flex;\\n justify-content: center;\\n align-items: center;\\n\\n -webkit-user-select: none;\\n\\n -moz-user-select: none;\\n\\n -ms-user-select: none;\\n\\n user-select: none;\\n white-space: nowrap;\\n}\\n\\n[dir=\"ltr\"] .gui_tab_3k_DV {\\n margin-left: -0.5rem;\\n}\\n\\n[dir=\"rtl\"] .gui_tab_3k_DV {\\n margin-right: -0.5rem;\\n}\\n\\n[dir=\"ltr\"] .gui_tab_3k_DV:nth-of-type(1) {\\n margin-left: 0;\\n}\\n\\n[dir=\"rtl\"] .gui_tab_3k_DV:nth-of-type(1) {\\n margin-right: 0;\\n}\\n\\n/* Use z-indices to force left-on-top for tabs */\\n\\n.gui_tab_3k_DV:nth-of-type(1) {\\n z-index: 3;\\n}\\n\\n.gui_tab_3k_DV:nth-of-type(2) {\\n z-index: 2;\\n}\\n\\n.gui_tab_3k_DV:nth-of-type(3) {\\n z-index: 1;\\n}\\n\\n.gui_tab_3k_DV:hover {\\n background-color: var(--ui-primary);\\n}\\n\\n.gui_tab_3k_DV.gui_is-selected_3nXL3 {\\n height: 90%;\\n color: var(--looks-secondary);\\n background-color: var(--ui-white);\\n z-index: 4; /* Make sure selected is always above */\\n}\\n\\n.gui_tab_3k_DV img {\\n width: 1.375rem;\\n filter: grayscale(100%);\\n}\\n\\n[dir=\"ltr\"] .gui_tab_3k_DV img {\\n margin-right: 0.125rem;\\n}\\n\\n[dir=\"rtl\"] .gui_tab_3k_DV img {\\n margin-left: 0.125rem;\\n}\\n\\n/* mirror blocks and sound tab icons */\\n\\n[dir=\"rtl\"] .gui_tab_3k_DV:nth-of-type(1) img {\\n transform: scaleX(-1);\\n}\\n\\n[dir=\"rtl\"] .gui_tab_3k_DV:nth-of-type(3) img {\\n transform: scaleX(-1);\\n}\\n\\n.gui_tab_3k_DV.gui_is-selected_3nXL3 img {\\n filter: none;\\n}\\n\\n/* Tab style overrides from react-tabs */\\n\\n.gui_tab_3k_DV.gui_is-selected_3nXL3:after {\\n display: none;\\n}\\n\\n.gui_tab_3k_DV.gui_is-selected_3nXL3:focus {\\n outline: none;\\n box-shadow: none;\\n border-color: var(--ui-black-transparent);\\n}\\n\\n.gui_tab_3k_DV.gui_is-selected_3nXL3:focus:after {\\n display: none;\\n}\\n\\n/* Body of the tabs */\\n\\n.gui_tabs_3Cns4 {\\n position: relative;\\n flex-grow: 1;\\n display: flex;\\n flex-direction: column;\\n}\\n\\n.gui_tab-panel_12yVw {\\n position: relative;\\n flex-grow: 1;\\n display: none;\\n}\\n\\n.gui_tab-panel_12yVw.gui_is-selected_3nXL3 {\\n display: flex;\\n}\\n\\n.gui_blocks-wrapper_oRY_r {\\n flex-grow: 1;\\n position: relative;\\n}\\n\\n.gui_stage-and-target-wrapper_2TUbW {\\n /*\\n Makes rows for children:\\n 1) stage menu\\n 2) stage\\n 3) sprite/stage selectors\\n Only reason we need this, is so .targetWrapper, which holds the selectors,\\n goes to full vertical height of the window\\n */\\n display: flex;\\n flex-direction: column;\\n /* pad entire wrapper to the left and right; allow children to fill width */\\n padding-left: 0.5rem;\\n padding-right: 0.5rem;\\n\\n /* this will only ever be as wide as the stage */\\n flex-basis: 0;\\n}\\n\\n.gui_target-wrapper_2YpM2 {\\n display: flex;\\n flex-grow: 1;\\n flex-basis: 0;\\n\\n padding-top: 0.5rem;\\n min-height: 0; /* this makes it work in Firefox */\\n\\n /*\\n For making the sprite-selector a scrollable pane\\n @todo: Not working in Safari\\n */\\n /* TODO this also breaks the thermometer menu */\\n /* overflow: hidden; */\\n}\\n\\n.gui_extension-button-container_sM98M {\\n width: 3.75rem;\\n height: 3.25rem;\\n position: absolute;\\n bottom: 0;\\n left: 0;\\n right: 0;\\n z-index: 42;\\n background: var(--looks-secondary);\\n\\n border: 1px solid var(--looks-secondary);\\n box-sizing: content-box; /* To match scratch-block vertical toolbox borders */\\n}\\n\\n.gui_extension-button-container_sM98M:before {\\n content: \"\";\\n position: absolute;\\n top: calc(calc(-1 * 15px) - 1px);\\n left: -1px;\\n background: linear-gradient(rgba(0, 0, 0, 0),rgba(0, 0, 0, 0.15));\\n height: 15px;\\n width: calc(100% + 0.5px);\\n}\\n\\n.gui_extension-button_3Z58M {\\n background: none;\\n border: none;\\n outline: none;\\n width: 100%;\\n height: 100%;\\n cursor: pointer;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n}\\n\\n.gui_extension-button-icon_3lDFf {\\n width: 1.75rem;\\n height: 1.75rem;\\n}\\n\\n[dir=\"rtl\"] .gui_extension-button-icon_3lDFf {\\n transform: scaleX(-1);\\n}\\n\\n.gui_extension-button_3Z58M > div {\\n margin-top: 0;\\n}\\n\\n/* Sprite Selection Watermark */\\n\\n.gui_watermark_3oGgV {\\n position: absolute;\\n top: 1.25rem;\\n pointer-events: none;\\n}\\n\\n[dir=\"ltr\"] .gui_watermark_3oGgV {\\n right: 1.25rem;\\n}\\n\\n[dir=\"rtl\"] .gui_watermark_3oGgV {\\n left: 1.25rem;\\n}\\n\\n/* Menu */\\n\\n.gui_menu-bar-position_6ejza {\\n position: relative;\\n z-index: 491;\\n}\\n\\n/* Alerts */\\n\\n.gui_alerts-container_2cnr7 {\\n display: flex;\\n justify-content: center;\\n width: 100%;\\n z-index: 490;\\n position: absolute;\\n margin-top: 53px;\\n pointer-events: none;\\n}\\n\\n/*\\n Make the (background) page not scrollable when modals are open\\n This CSS class is automatically added to the body when react-modal is open\\n*/\\n\\n.ReactModal__Body--open {\\n overflow: hidden;\\n}\\n\\n/* when in the browser\\'s fullscreen mode, we need to put our own background to avoid just having black */\\n\\n.gui_fullscreen-background_2RW_a {\\n position: absolute;\\n top: 0;\\n left: 0;\\n width: 100%;\\n height: 100%;\\n /* overridden by JS; this will be used if the browser can\\'t understand that color */\\n background-color: white;\\n}\\n',\"\"]),t.locals={\"page-wrapper\":\"gui_page-wrapper_r7IhT\",pageWrapper:\"gui_page-wrapper_r7IhT\",\"body-wrapper\":\"gui_body-wrapper_1T2l7\",bodyWrapper:\"gui_body-wrapper_1T2l7\",\"flex-wrapper\":\"gui_flex-wrapper_2AgdD\",flexWrapper:\"gui_flex-wrapper_2AgdD\",\"editor-wrapper\":\"gui_editor-wrapper_WspaC\",editorWrapper:\"gui_editor-wrapper_WspaC\",\"tab-list\":\"gui_tab-list_3r8RB\",tabList:\"gui_tab-list_3r8RB\",tab:\"gui_tab_3k_DV\",\"is-selected\":\"gui_is-selected_3nXL3\",isSelected:\"gui_is-selected_3nXL3\",tabs:\"gui_tabs_3Cns4\",\"tab-panel\":\"gui_tab-panel_12yVw\",tabPanel:\"gui_tab-panel_12yVw\",\"blocks-wrapper\":\"gui_blocks-wrapper_oRY_r\",blocksWrapper:\"gui_blocks-wrapper_oRY_r\",\"stage-and-target-wrapper\":\"gui_stage-and-target-wrapper_2TUbW\",stageAndTargetWrapper:\"gui_stage-and-target-wrapper_2TUbW\",\"target-wrapper\":\"gui_target-wrapper_2YpM2\",targetWrapper:\"gui_target-wrapper_2YpM2\",\"extension-button-container\":\"gui_extension-button-container_sM98M\",extensionButtonContainer:\"gui_extension-button-container_sM98M\",\"extension-button\":\"gui_extension-button_3Z58M\",extensionButton:\"gui_extension-button_3Z58M\",\"extension-button-icon\":\"gui_extension-button-icon_3lDFf\",extensionButtonIcon:\"gui_extension-button-icon_3lDFf\",watermark:\"gui_watermark_3oGgV\",\"menu-bar-position\":\"gui_menu-bar-position_6ejza\",menuBarPosition:\"gui_menu-bar-position_6ejza\",\"alerts-container\":\"gui_alerts-container_2cnr7\",alertsContainer:\"gui_alerts-container_2cnr7\",\"fullscreen-background\":\"gui_fullscreen-background_2RW_a\",fullscreenBackground:\"gui_fullscreen-background_2RW_a\"}},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"default\",(function(){return X})),n.d(t,\"guiInitialState\",(function(){return H})),n.d(t,\"guiMiddleware\",(function(){return W})),n.d(t,\"initEmbedded\",(function(){return V})),n.d(t,\"initFullScreen\",(function(){return Y})),n.d(t,\"initPlayer\",(function(){return Q})),n.d(t,\"initTelemetryModal\",(function(){return J})),n.d(t,\"initTutorialCard\",(function(){return q}));var a=n(44),o=n(20),r=n(153),i=n(50),s=n(109),l=n(118),c=n(136),d=n(154),u=n(28),p=n(98),m=n(18),g=n(155),h=n(14),b=n(47),w=n(156),f=n(85),M=n(55),v=n(12),y=n(56),k=n(157),j=n(79),I=n(120),S=n(119),x=n(80),E=n(158),C=n(72),N=n(159),_=n(23),D=n(83),T=n(13),O=n.n(T),A=n(25),P=n(131);const z=\"scratch-gui/vm/SET_VM\",L=new O.a;L.setCompatibilityMode(!0),L.runtime.cloudOptions.limit=P.a,L.attachStorage(A.a);const R=L;var U=n(73),B=n(160),G=n(428),F=n.n(G),Z=n(63);const W=Object(a.d)(Object(a.a)(F()(300,{leading:!0,trailing:!0}))),H={alerts:o.a,assetDrag:r.a,blockDrag:d.a,cards:i.b,colorPicker:s.b,connectionModal:l.a,customStageSize:D.a,customProcedures:c.b,editorTab:u.f,mode:b.b,hoveredTarget:p.b,stageSize:I.c,menus:m.s,micIndicator:g.b,modals:h.s,monitors:w.b,monitorLayout:f.d,projectChanged:M.b,projectState:v.z,projectTitle:y.b,fontsLoaded:k.b,restoreDeletion:j.b,targets:S.c,theme:x.c,timeout:E.c,timeTravel:C.h,toolbox:N.b,tw:_.u,vm:R,vmStatus:U.e,workspaceMetrics:B.c},Q=function(e){return Object.assign({},e,{mode:{isEmbedded:!1,isFullScreen:e.mode.isFullScreen,isPlayerOnly:!0,hasEverEnteredEditor:!1}})},Y=function(e){return Object.assign({},e,{mode:{isEmbedded:!1,isFullScreen:!0,isPlayerOnly:e.mode.isPlayerOnly,hasEverEnteredEditor:e.mode.hasEverEnteredEditor}})},V=function(e){return Object.assign({},e,{mode:{isEmbedded:!0,isFullScreen:!1,isPlayerOnly:!0,hasEverEnteredEditor:!1}})},q=function(e,t){return Object.assign({},e,{cards:{visible:!0,content:Z.a,activeDeckId:t,expanded:!0,step:0,x:0,y:0,dragging:!1}})},J=function(e){return Object.assign({},e,{modals:{telemetryModal:!0}})},X=Object(a.c)({alerts:o.d,assetDrag:r.b,blockDrag:d.b,cards:i.d,colorPicker:s.d,connectionModal:l.b,customStageSize:D.b,customProcedures:c.d,editorTab:u.e,mode:b.a,hoveredTarget:p.a,stageSize:I.a,menus:m.m,micIndicator:g.a,modals:h.r,monitors:w.a,monitorLayout:f.b,projectChanged:M.a,projectState:v.d,projectTitle:y.a,fontsLoaded:k.a,restoreDeletion:j.a,targets:S.a,theme:x.a,timeout:E.a,timeTravel:C.a,toolbox:N.a,tw:_.c,vm:function(e,t){return void 0===e&&(e=R),t.type===z?t.vm:e},vmStatus:U.a,workspaceMetrics:B.a})},,,,,,,,,,,,,,,,,,,,,,,,,,,function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,'/* overridden by src/lib/themes/guiHelpers.js */\\n\\n/*\\n Contains constants for the z-index values of elements that are part of the global stack context.\\n In other words, z-index values that are \"inside\" a component are not added here.\\n This prevents conflicts between identical z-index values in different components.\\n*/\\n\\n/* Toolbox z-index: 40; set in scratch-blocks */\\n\\n/* tooltips should go over add buttons if they overlap */\\n\\n/* monitors go over add buttons */\\n\\n/* \"ask\" block text input goes above monitors */\\n\\n/* menu-bar should go over monitors, alerts and tutorials */\\n\\n/* behind menu-bar */\\n\\n/* Block drag z-index: 1000; default 50 is overriden in blocks.css */\\n\\n/* so it is draggable into other panes */\\n\\n/* behind modals */\\n\\n/* behind modals */\\n\\n/* in most interfaces, the context menu is always on top */\\n\\n.project-input_input_1gT4y {\\n border: none;\\n width: 100%;\\n font-size: 23px;\\n line-height: 32px;\\n opacity: 0.5;\\n background-color: transparent;\\n color: inherit;\\n}\\n\\n.project-input_input_1gT4y:focus {\\n opacity: 1;\\n}\\n\\n.project-input_input_1gT4y:disabled {\\n opacity: 0.8;\\n}\\n\\n.project-input_tooltip_3y9t4 {\\n opacity: 1 !important;\\n background-color: var(--extensions-primary) !important;\\n border: 1px solid var(--ui-black-transparent) !important;\\n box-shadow: 0 0 .5rem var(--shadow) !important;\\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif !important;\\n z-index: 491 !important;\\n}\\n\\n.project-input_tooltip_3y9t4:after {\\n border-top-color: var(--extensions-primary) !important;\\n}\\n',\"\"]),t.locals={input:\"project-input_input_1gT4y\",tooltip:\"project-input_tooltip_3y9t4\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\"/*\\nImported from:\\nhttps://github.com/forkphorus/forkphorus/tree/master/studioview\\nWith changes to make it work properly in the scratch-gui environment.\\n*/\\n\\n/* we wrap it in a
*/\\n\\n.studioview_wrapper_GWWqn {\\n height: 100%;\\n}\\n\\n/* fix some styles that can be messed up by scratch-gui */\\n\\n.studioview_studioview-root_z_auP * {\\n box-sizing: content-box !important;\\n}\\n\\n.studioview_studioview-root_z_auP {\\n height: 100%;\\n}\\n\\n.studioview_studioview-list_1X1Hw {\\n width: 100%;\\n height: 100%;\\n overflow-y: scroll;\\n overflow-anchor: none;\\n}\\n\\n.studioview_studioview-project_2kPXX, .studioview_studioview-placeholder__NrP7 {\\n display: inline-block;\\n width: 144px;\\n padding: 3px;\\n margin-bottom: 1px;\\n margin-right: 1px;\\n}\\n\\n.studioview_studioview-root_z_auP .studioview_studioview-project_2kPXX {\\n color: inherit;\\n position: relative;\\n text-decoration: none;\\n}\\n\\n.studioview_studioview-loaded_mx24q:hover::before, .studioview_studioview-loaded_mx24q:active::before {\\n content: '';\\n pointer-events: none;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n position: absolute;\\n top: 0;\\n left: 0;\\n width: 100%;\\n height: 100%;\\n background-color: currentColor;\\n opacity: 0.1;\\n}\\n\\n.studioview_studioview-root_z_auP .studioview_studioview-loaded_mx24q:active::before {\\n opacity: 0.2;\\n}\\n\\n.studioview_studioview-root_z_auP .studioview_studioview-title_1eZiq,\\n.studioview_studioview-root_z_auP .studioview_studioview-author_Bs0a5 {\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n overflow: hidden;\\n color: inherit;\\n text-decoration: none;\\n}\\n\\n.studioview_studioview-title_1eZiq {\\n font-size: 0.8em;\\n font-weight: bold;\\n}\\n\\n.studioview_studioview-author_Bs0a5 {\\n font-size: 0.75em;\\n}\\n\\n.studioview_studioview-error_ZX8-M {\\n width: 100%;\\n}\\n\\n.studioview_studioview-thumbnail_2nU6_, .studioview_studioview-placeholder-thumbnail_4Fi8w {\\n position: relative;\\n width: 144px;\\n height: 108px;\\n}\\n\\n.studioview_studioview-thumbnail_2nU6_::before {\\n content: '';\\n position: absolute;\\n top: 0;\\n left: 0;\\n width: 100%;\\n height: 100%;\\n background-color: currentColor;\\n opacity: 0.1;\\n}\\n\\n.studioview_studioview-thumbnail_2nU6_ img {\\n width: 100%;\\n height: 100%;\\n}\\n\\n.studioview_studioview-placeholder__NrP7 .studioview_studioview-thumbnail_2nU6_,\\n.studioview_studioview-placeholder__NrP7 .studioview_studioview-title_1eZiq,\\n.studioview_studioview-placeholder__NrP7 .studioview_studioview-author_Bs0a5 {\\n background-color: currentColor;\\n opacity: 0.1;\\n}\\n\\n.studioview_studioview-title_1eZiq {\\n height: 20px;\\n margin-top: 2px;\\n}\\n\\n.studioview_studioview-author_Bs0a5 {\\n height: 18px;\\n}\\n\\n.studioview_studioview-placeholder__NrP7 .studioview_studioview-title_1eZiq {\\n border-radius: 2px 2px 2px 0;\\n width: 100%;\\n}\\n\\n.studioview_studioview-placeholder__NrP7 .studioview_studioview-author_Bs0a5 {\\n border-radius: 0 0 2px 2px;\\n width: 50%;\\n}\\n\",\"\"]),t.locals={wrapper:\"studioview_wrapper_GWWqn\",\"studioview-root\":\"studioview_studioview-root_z_auP\",studioviewRoot:\"studioview_studioview-root_z_auP\",\"studioview-list\":\"studioview_studioview-list_1X1Hw\",studioviewList:\"studioview_studioview-list_1X1Hw\",\"studioview-project\":\"studioview_studioview-project_2kPXX\",studioviewProject:\"studioview_studioview-project_2kPXX\",\"studioview-placeholder\":\"studioview_studioview-placeholder__NrP7\",studioviewPlaceholder:\"studioview_studioview-placeholder__NrP7\",\"studioview-loaded\":\"studioview_studioview-loaded_mx24q\",studioviewLoaded:\"studioview_studioview-loaded_mx24q\",\"studioview-title\":\"studioview_studioview-title_1eZiq\",studioviewTitle:\"studioview_studioview-title_1eZiq\",\"studioview-author\":\"studioview_studioview-author_Bs0a5\",studioviewAuthor:\"studioview_studioview-author_Bs0a5\",\"studioview-error\":\"studioview_studioview-error_ZX8-M\",studioviewError:\"studioview_studioview-error_ZX8-M\",\"studioview-thumbnail\":\"studioview_studioview-thumbnail_2nU6_\",studioviewThumbnail:\"studioview_studioview-thumbnail_2nU6_\",\"studioview-placeholder-thumbnail\":\"studioview_studioview-placeholder-thumbnail_4Fi8w\",studioviewPlaceholderThumbnail:\"studioview_studioview-placeholder-thumbnail_4Fi8w\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\"/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.featured-projects_container_bte5t {\\n margin-bottom: 8px;\\n}\\n\\n.featured-projects_opener-container_2VEwo {\\n position: absolute;\\n top: 0;\\n left: 0;\\n width: 100%;\\n height: 100%;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n cursor: pointer;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n user-select: none;\\n opacity: 0.8;\\n}\\n\\n.featured-projects_opener-container_2VEwo:hover {\\n opacity: 1;\\n}\\n\\n.featured-projects_opener-content_2nRNs {\\n background-color: var(--ui-modal-background);\\n padding: 4px;\\n border: 1px solid var(--ui-black-transparent);\\n box-shadow: 0 0 8px 0 var(--shadow);\\n}\\n\\n.featured-projects_projects_3USxm {\\n position: relative;\\n height: 155px;\\n}\\n\\n.featured-projects_projects_3USxm.featured-projects_transition_2s3rd {\\n transition: .2s height;\\n}\\n\\n.featured-projects_projects_3USxm.featured-projects_opened_1ALXH {\\n height: 310px;\\n}\\n\\n.featured-projects_footer_UQGNp {\\n \\n}\\n\",\"\"]),t.locals={container:\"featured-projects_container_bte5t\",\"opener-container\":\"featured-projects_opener-container_2VEwo\",openerContainer:\"featured-projects_opener-container_2VEwo\",\"opener-content\":\"featured-projects_opener-content_2nRNs\",openerContent:\"featured-projects_opener-content_2nRNs\",projects:\"featured-projects_projects_3USxm\",transition:\"featured-projects_transition_2s3rd\",opened:\"featured-projects_opened_1ALXH\",footer:\"featured-projects_footer_UQGNp\"}},function(e,t,n){(t=e.exports=n(9)(!1)).push([e.i,\"/* overridden by src/lib/themes/guiHelpers.js */\\n\\n.description_description_TJxeu {\\n max-height: 250px;\\n overflow: auto;\\n white-space: pre-line;\\n overflow-wrap: break-word;\\n line-height: 1.5em;\\n padding: 0.5rem;\\n margin: 5px 0 8px 0;\\n border: 1px solid var(--badge-border);\\n background-color: var(--badge-background);\\n border-radius: 0.5rem;\\n}\\n\\n.description_description_TJxeu a {\\n font-weight: bold;\\n text-decoration: none;\\n}\\n\\n.description_header_3Bv2V {\\n font-weight: bold;\\n font-size: 1em;\\n margin: 0;\\n padding: 0;\\n}\\n\\n.description_divider_NGZle {\\n margin-top: 8px;\\n}\\n\\n.description_project-link_2xt5_ {\\n margin-bottom: 2px;\\n}\\n\",\"\"]),t.locals={description:\"description_description_TJxeu\",header:\"description_header_3Bv2V\",divider:\"description_divider_NGZle\",\"project-link\":\"description_project-link_2xt5_\",projectLink:\"description_project-link_2xt5_\"}},function(e,t,n){var a=n(582),o=n(586),r=n(587),i=r&&r.isRegExp,s=i?o(i):a;e.exports=s},function(e,t,n){var a=n(247),o=n(208);e.exports=function(e){return o(e)&&\"[object RegExp]\"==a(e)}},function(e,t,n){var a=n(424),o=\"object\"==typeof self&&self&&self.Object===Object&&self,r=a||o||Function(\"return this\")();e.exports=r},function(e,t,n){var a=n(248),o=Object.prototype,r=o.hasOwnProperty,i=o.toString,s=a?a.toStringTag:void 0;e.exports=function(e){var t=r.call(e,s),n=e[s];try{e[s]=void 0;var a=!0}catch(e){}var o=i.call(e);return a&&(t?e[s]=n:delete e[s]),o}},function(e,t){var n=Object.prototype.toString;e.exports=function(e){return n.call(e)}},function(e,t){e.exports=function(e){return function(t){return e(t)}}},function(e,t,n){(function(e){var a=n(424),o=t&&!t.nodeType&&t,r=o&&\"object\"==typeof e&&e&&!e.nodeType&&e,i=r&&r.exports===o&&a.process,s=function(){try{var e=r&&r.require&&r.require(\"util\").types;return e||i&&i.binding&&i.binding(\"util\")}catch(e){}}();e.exports=s}).call(this,n(555)(e))},function(e,t,n){var a=n(589),o=/[\\\\^$.*+?()[\\]{}|]/g,r=RegExp(o.source);e.exports=function(e){return(e=a(e))&&r.test(e)?e.replace(o,\"\\\\$&\"):e}},function(e,t,n){var a=n(590);e.exports=function(e){return null==e?\"\":a(e)}},function(e,t,n){var a=n(248),o=n(591),r=n(264),i=n(592),s=a?a.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if(\"string\"==typeof t)return t;if(r(t))return o(t,e)+\"\";if(i(t))return l?l.call(t):\"\";var n=t+\"\";return\"0\"==n&&1/t==-1/0?\"-0\":n}},function(e,t){e.exports=function(e,t){for(var n=-1,a=null==e?0:e.length,o=Array(a);++n0&&r(d)?n>1?e(d,n-1,r,i,s):a(s,d):i||(s[s.length]=d)}return s}},function(e,t){e.exports=function(e,t){for(var n=-1,a=t.length,o=e.length;++n * {\\n margin-bottom: 10px;\\n}\\n\\n.interface_infobox_KQp6d {\\n line-height: 1.5em;\\n padding: 0.5rem;\\n margin: 5px 0 8px 0;\\n border-radius: 0.5rem;\\n border: 1px solid #b9d6ff;\\n background-color: #dbebff;\\n}\\n\\n.interface_infobox_KQp6d p {\\n margin: 4px 0;\\n}\\n\\n.interface_infobox_KQp6d a {\\n font-weight: bold;\\n text-decoration: none;\\n}\\n\\n.interface_unshared-update_zPoHa {\\n border-color: #ff52526e;\\n background-color: #ff525240;\\n}\\n\",\"\"]),t.locals={container:\"interface_container_1cGgE\",editor:\"interface_editor_3WnQ8\",center:\"interface_center_2vEJw\",\"player-only\":\"interface_player-only_1YGqr\",playerOnly:\"interface_player-only_1YGqr\",menu:\"interface_menu_2TZCG\",section:\"interface_section_3f_bi\",footer:\"interface_footer_vF3nx\",\"footer-content\":\"interface_footer-content_2-VDh\",footerContent:\"interface_footer-content_2-VDh\",\"footer-text\":\"interface_footer-text_2qZPP\",footerText:\"interface_footer-text_2qZPP\",\"footer-columns\":\"interface_footer-columns_22Cpb\",footerColumns:\"interface_footer-columns_22Cpb\",\"footer-section\":\"interface_footer-section_vgGzW\",footerSection:\"interface_footer-section_vgGzW\",infobox:\"interface_infobox_KQp6d\",\"unshared-update\":\"interface_unshared-update_zPoHa\",unsharedUpdate:\"interface_unshared-update_zPoHa\"}},function(e,t){},,,,,,,,,,function(e,t){},function(e,t){},,,,function(e,t){},,,,,,function(e,t){},,,function(e,t){},function(e,t){},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(e,t,n){\"use strict\";n.r(t);n(438);var a=n(1),o=n.n(a),r=n(426),i=n(252);Object(i.a)(o.a.createElement(r.a,null))}]);","name":"js/pentapod/editor.474b85c480011cc9d185.js","input":"var GUI =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// install a JSONP callback for chunk loading\n/******/ \tfunction webpackJsonpCallback(data) {\n/******/ \t\tvar chunkIds = data[0];\n/******/ \t\tvar moreModules = data[1];\n/******/ \t\tvar executeModules = data[2];\n/******/\n/******/ \t\t// add \"moreModules\" to the modules object,\n/******/ \t\t// then flag all \"chunkIds\" as loaded and fire callback\n/******/ \t\tvar moduleId, chunkId, i = 0, resolves = [];\n/******/ \t\tfor(;i < chunkIds.length; i++) {\n/******/ \t\t\tchunkId = chunkIds[i];\n/******/ \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n/******/ \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n/******/ \t\t\t}\n/******/ \t\t\tinstalledChunks[chunkId] = 0;\n/******/ \t\t}\n/******/ \t\tfor(moduleId in moreModules) {\n/******/ \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n/******/ \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n/******/ \t\t\t}\n/******/ \t\t}\n/******/ \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n/******/\n/******/ \t\twhile(resolves.length) {\n/******/ \t\t\tresolves.shift()();\n/******/ \t\t}\n/******/\n/******/ \t\t// add entry modules from loaded chunk to deferred list\n/******/ \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n/******/\n/******/ \t\t// run deferred modules when all chunks ready\n/******/ \t\treturn checkDeferredModules();\n/******/ \t};\n/******/ \tfunction checkDeferredModules() {\n/******/ \t\tvar result;\n/******/ \t\tfor(var i = 0; i < deferredModules.length; i++) {\n/******/ \t\t\tvar deferredModule = deferredModules[i];\n/******/ \t\t\tvar fulfilled = true;\n/******/ \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n/******/ \t\t\t\tvar depId = deferredModule[j];\n/******/ \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n/******/ \t\t\t}\n/******/ \t\t\tif(fulfilled) {\n/******/ \t\t\t\tdeferredModules.splice(i--, 1);\n/******/ \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n/******/ \t\t\t}\n/******/ \t\t}\n/******/\n/******/ \t\treturn result;\n/******/ \t}\n/******/\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// object to store loaded and loading chunks\n/******/ \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n/******/ \t// Promise = chunk loading, 0 = chunk loaded\n/******/ \tvar installedChunks = {\n/******/ \t\t85: 0\n/******/ \t};\n/******/\n/******/ \tvar deferredModules = [];\n/******/\n/******/ \t// script path function\n/******/ \tfunction jsonpScriptSrc(chunkId) {\n/******/ \t\treturn __webpack_require__.p + \"js/pentapod/\" + ({\"4\":\"addon-default-entry\",\"5\":\"addon-entry-2d-color-picker\",\"6\":\"addon-entry-better-img-uploads\",\"7\":\"addon-entry-block-count\",\"8\":\"addon-entry-block-palette-icons\",\"9\":\"addon-entry-blocks2image\",\"10\":\"addon-entry-cat-blocks\",\"11\":\"addon-entry-clones\",\"12\":\"addon-entry-columns\",\"13\":\"addon-entry-copy-reporter\",\"14\":\"addon-entry-custom-block-shape\",\"15\":\"addon-entry-custom-block-text\",\"16\":\"addon-entry-custom-menu-bar\",\"17\":\"addon-entry-custom-zoom\",\"18\":\"addon-entry-data-category-tweaks-v2\",\"19\":\"addon-entry-debugger\",\"20\":\"addon-entry-default-costume-editor-color\",\"21\":\"addon-entry-disable-paste-offset\",\"22\":\"addon-entry-disable-stage-drag-select\",\"23\":\"addon-entry-editor-buttons-reverse-order\",\"24\":\"addon-entry-editor-colored-context-menus\",\"25\":\"addon-entry-editor-compact\",\"26\":\"addon-entry-editor-extra-keys\",\"27\":\"addon-entry-editor-number-arrow-keys\",\"28\":\"addon-entry-editor-sounds\",\"29\":\"addon-entry-editor-square-inputs\",\"30\":\"addon-entry-editor-stage-left\",\"31\":\"addon-entry-editor-stepping\",\"32\":\"addon-entry-editor-theme3\",\"33\":\"addon-entry-expanded-backpack\",\"34\":\"addon-entry-fullscreen\",\"35\":\"addon-entry-gamepad\",\"36\":\"addon-entry-hide-delete-button\",\"37\":\"addon-entry-hide-flyout\",\"38\":\"addon-entry-hide-new-variables\",\"39\":\"addon-entry-hide-stage\",\"40\":\"addon-entry-initialise-sprite-position\",\"41\":\"addon-entry-load-extensions\",\"42\":\"addon-entry-mediarecorder\",\"43\":\"addon-entry-mouse-pos\",\"44\":\"addon-entry-move-to-top-layer\",\"45\":\"addon-entry-no-script-bumping\",\"46\":\"addon-entry-number-pad\",\"47\":\"addon-entry-paint-by-default\",\"48\":\"addon-entry-paint-snap\",\"49\":\"addon-entry-remove-curved-stage-border\",\"50\":\"addon-entry-remove-sprite-confirm\",\"51\":\"addon-entry-script-snap\",\"52\":\"addon-entry-search-sprites\",\"53\":\"addon-entry-sprite-properties\",\"54\":\"addon-entry-swap-local-global\",\"55\":\"addon-entry-transparent-orphans\",\"56\":\"addon-entry-tw-disable-cloud-variables\",\"57\":\"addon-entry-tw-disable-compiler\",\"58\":\"addon-entry-tw-disable-vibration\",\"59\":\"addon-entry-tw-remove-backpack\",\"60\":\"addon-entry-tw-remove-feedback\",\"61\":\"addon-entry-tw-straighten-comments\",\"62\":\"addon-entry-variable-manager\",\"63\":\"addon-entry-vol-slider\",\"64\":\"addon-entry-zebra-striping\",\"65\":\"addon-l10n-de\",\"66\":\"addon-l10n-es\",\"67\":\"addon-l10n-fi\",\"68\":\"addon-l10n-fr\",\"69\":\"addon-l10n-hu\",\"70\":\"addon-l10n-it\",\"71\":\"addon-l10n-ja\",\"72\":\"addon-l10n-ko\",\"73\":\"addon-l10n-nl\",\"74\":\"addon-l10n-pl\",\"75\":\"addon-l10n-pt\",\"76\":\"addon-l10n-ro\",\"77\":\"addon-l10n-ru\",\"78\":\"addon-l10n-sl\",\"79\":\"addon-l10n-tr\",\"80\":\"addon-l10n-zh-cn\",\"81\":\"addon-l10n-zh-tw\",\"83\":\"addons\",\"88\":\"iframe-extension-worker\",\"89\":\"library-backdrops\",\"90\":\"library-costumes\",\"91\":\"library-sounds\",\"92\":\"library-sprites\",\"94\":\"sb\"}[chunkId]||chunkId) + \".\" + {\"4\":\"d3f27afe57fe32a8f692\",\"5\":\"c6e362cddf649e15e9f2\",\"6\":\"d5070a89c94e8095969d\",\"7\":\"a5e45edc9aca7be7e2c1\",\"8\":\"767b9cf0dbe12de7e2ce\",\"9\":\"7dcef2fa1b7aafe1d90b\",\"10\":\"a9f3accdc4653c2bfdb6\",\"11\":\"5bf671c9fc27ef6eb902\",\"12\":\"047432f96ac8e04cc8fa\",\"13\":\"8a0655d0075f9738981c\",\"14\":\"468eb49168648b0a58a4\",\"15\":\"cde57cae0cb11228bf39\",\"16\":\"7e5a0bad53a27b0e89dd\",\"17\":\"82749fd9fdd7cfd38322\",\"18\":\"8e11932b6d0cefe143de\",\"19\":\"4f427ef43b3c0597483e\",\"20\":\"6dc492ab3d8e5dcdf944\",\"21\":\"08227ae7b16265f5278e\",\"22\":\"19630373dd7880f6225e\",\"23\":\"84004c3c239b7ec687be\",\"24\":\"0b03535133411759e555\",\"25\":\"1214e29946d306f97517\",\"26\":\"6ed00a194ea668dd1be6\",\"27\":\"ce5b48ccd93c79b94f4b\",\"28\":\"86de82d3d30dfe524589\",\"29\":\"58340c35cba085a1acd2\",\"30\":\"c870b33f9717f08f01f5\",\"31\":\"3906443f65cdf76ddaee\",\"32\":\"7859d1ef0b54fa983841\",\"33\":\"608ff267cedc72a634bf\",\"34\":\"0a2138bc3870c2a490c2\",\"35\":\"ea3a3242277a802048bf\",\"36\":\"4dde5408a6daa47c3197\",\"37\":\"8165615dfdba03f82d80\",\"38\":\"726d1d2846d036ea4f3e\",\"39\":\"818c5db0b4490fd5f617\",\"40\":\"107ca51ae611cba8d0a5\",\"41\":\"d123e7e9d54efd4968af\",\"42\":\"5186d5b817776b0ba182\",\"43\":\"ca5f52cb19f5bcd0dedd\",\"44\":\"4858dee8dd38a81d560b\",\"45\":\"75c575c20dcbf0521b66\",\"46\":\"f293e81dab16644b825b\",\"47\":\"e4ac0b6084fd1b4ddd97\",\"48\":\"76a458197336a891e23b\",\"49\":\"7b02c15c63e117912be1\",\"50\":\"b470cffc68cc75a3adef\",\"51\":\"ec9222aec7ea0fae429c\",\"52\":\"a7aa4f501f12a7b7b300\",\"53\":\"03991ebc26d5c28eb6f0\",\"54\":\"1fa8de8f13233ee85304\",\"55\":\"9e22eadba9baed32b51f\",\"56\":\"dd1a7c8e22315ed4661c\",\"57\":\"6c726ef634a32efdb59d\",\"58\":\"b4017a6c7450f506432c\",\"59\":\"14998cdbdc0a1f199787\",\"60\":\"b28ac361fc8025f801e0\",\"61\":\"cce867fb08352d76e643\",\"62\":\"2cc194cd4b6bb339bdfb\",\"63\":\"c069f68d3ed3094fad67\",\"64\":\"bce894abba3caddbba4d\",\"65\":\"4786b9b460b4cc131e4f\",\"66\":\"68e31c73bb8f8cb13222\",\"67\":\"7e1e1b73b7fca47f653b\",\"68\":\"dd5540acbfcf64632ebb\",\"69\":\"5de5134dbc2343b4e2c5\",\"70\":\"fb557343b5db6fe96743\",\"71\":\"77f95502cb5cf3f39cb7\",\"72\":\"0e4595cf04811e7398de\",\"73\":\"4fef3792e77282e7ce3f\",\"74\":\"b56e0e6bbe29fce2eb0e\",\"75\":\"9c2dfe53b1684f73c30c\",\"76\":\"192fb8264503c4036baa\",\"77\":\"c399cf8178f19189f101\",\"78\":\"3b04dfedebc3840c9722\",\"79\":\"eab7eddd806417c2031e\",\"80\":\"d1f502eacdcce63df019\",\"81\":\"870e0e6695b7cdae7f83\",\"83\":\"a3af0b901e6436597a32\",\"88\":\"04894131cbc0ecf5be82\",\"89\":\"bf39959671478b878223\",\"90\":\"c2dbd8315555870ce4a5\",\"91\":\"165a51eab1ad1eb60c33\",\"92\":\"345884bbd5f3fed64366\",\"94\":\"b282044c946f0d1f66b2\"}[chunkId] + \".js\"\n/******/ \t}\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/ \t// This file contains only the entry chunk.\n/******/ \t// The chunk loading function for additional chunks\n/******/ \t__webpack_require__.e = function requireEnsure(chunkId) {\n/******/ \t\tvar promises = [];\n/******/\n/******/\n/******/ \t\t// JSONP chunk loading for javascript\n/******/\n/******/ \t\tvar installedChunkData = installedChunks[chunkId];\n/******/ \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n/******/\n/******/ \t\t\t// a Promise means \"currently loading\".\n/******/ \t\t\tif(installedChunkData) {\n/******/ \t\t\t\tpromises.push(installedChunkData[2]);\n/******/ \t\t\t} else {\n/******/ \t\t\t\t// setup Promise in chunk cache\n/******/ \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n/******/ \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n/******/ \t\t\t\t});\n/******/ \t\t\t\tpromises.push(installedChunkData[2] = promise);\n/******/\n/******/ \t\t\t\t// start chunk loading\n/******/ \t\t\t\tvar script = document.createElement('script');\n/******/ \t\t\t\tvar onScriptComplete;\n/******/\n/******/ \t\t\t\tscript.charset = 'utf-8';\n/******/ \t\t\t\tscript.timeout = 120;\n/******/ \t\t\t\tif (__webpack_require__.nc) {\n/******/ \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n/******/ \t\t\t\t}\n/******/ \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n/******/\n/******/ \t\t\t\t// create error before stack unwound to get useful stacktrace later\n/******/ \t\t\t\tvar error = new Error();\n/******/ \t\t\t\tonScriptComplete = function (event) {\n/******/ \t\t\t\t\t// avoid mem leaks in IE.\n/******/ \t\t\t\t\tscript.onerror = script.onload = null;\n/******/ \t\t\t\t\tclearTimeout(timeout);\n/******/ \t\t\t\t\tvar chunk = installedChunks[chunkId];\n/******/ \t\t\t\t\tif(chunk !== 0) {\n/******/ \t\t\t\t\t\tif(chunk) {\n/******/ \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n/******/ \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n/******/ \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n/******/ \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n/******/ \t\t\t\t\t\t\terror.type = errorType;\n/******/ \t\t\t\t\t\t\terror.request = realSrc;\n/******/ \t\t\t\t\t\t\tchunk[1](error);\n/******/ \t\t\t\t\t\t}\n/******/ \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n/******/ \t\t\t\t\t}\n/******/ \t\t\t\t};\n/******/ \t\t\t\tvar timeout = setTimeout(function(){\n/******/ \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n/******/ \t\t\t\t}, 120000);\n/******/ \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n/******/ \t\t\t\tdocument.head.appendChild(script);\n/******/ \t\t\t}\n/******/ \t\t}\n/******/ \t\treturn Promise.all(promises);\n/******/ \t};\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// on error function for async loading\n/******/ \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n/******/\n/******/ \tvar jsonpArray = window[\"webpackJsonpGUI\"] = window[\"webpackJsonpGUI\"] || [];\n/******/ \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n/******/ \tjsonpArray.push = webpackJsonpCallback;\n/******/ \tjsonpArray = jsonpArray.slice();\n/******/ \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n/******/ \tvar parentJsonpFunction = oldJsonpFunction;\n/******/\n/******/\n/******/ \t// add entry module to deferred list\n/******/ \tdeferredModules.push([903,0,3,1,2]);\n/******/ \t// run deferred modules when ready\n/******/ \treturn checkDeferredModules();\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */,\n/* 1 */,\n/* 2 */,\n/* 3 */,\n/* 4 */,\n/* 5 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(0);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(1);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var react_style_proptype__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(206);\n/* harmony import */ var react_style_proptype__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_style_proptype__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _box_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(298);\n/* harmony import */ var _box_css__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_box_css__WEBPACK_IMPORTED_MODULE_4__);\nconst _excluded = [\"alignContent\", \"alignItems\", \"alignSelf\", \"basis\", \"children\", \"className\", \"componentRef\", \"direction\", \"element\", \"grow\", \"height\", \"justifyContent\", \"width\", \"wrap\", \"shrink\", \"style\"];\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\n\nconst getRandomColor = function () {\n // In \"DEBUG\" mode this is used to output a random background color for each\n // box. The function gives the same \"random\" set for each seed, allowing re-\n // renders of the same content to give the same random display.\n const random = function (seed) {\n let mW = seed;\n let mZ = 987654321;\n const mask = 0xffffffff;\n return function () {\n mZ = 36969 * (mZ & 65535) + (mZ >> 16) & mask;\n mW = 18000 * (mW & 65535) + (mW >> 16) & mask;\n let result = (mZ << 16) + mW & mask;\n result /= 4294967296;\n return result + 1;\n };\n }(601);\n return function () {\n const r = Math.max(parseInt(random() * 100, 10) % 256, 1);\n const g = Math.max(parseInt(random() * 100, 10) % 256, 1);\n const b = Math.max(parseInt(random() * 100, 10) % 256, 1);\n return \"rgb(\".concat(r, \",\").concat(g, \",\").concat(b, \")\");\n };\n}();\nconst Box = props => {\n const {\n alignContent,\n alignItems,\n alignSelf,\n basis,\n children,\n className,\n componentRef,\n direction,\n element,\n grow,\n height,\n justifyContent,\n width,\n wrap,\n shrink,\n style\n } = props,\n componentProps = _objectWithoutProperties(props, _excluded);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(element, _objectSpread({\n className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(className, _box_css__WEBPACK_IMPORTED_MODULE_4___default.a.box),\n ref: componentRef,\n style: Object.assign({\n alignContent: alignContent,\n alignItems: alignItems,\n alignSelf: alignSelf,\n flexBasis: basis,\n flexDirection: direction,\n flexGrow: grow,\n flexShrink: shrink,\n flexWrap: wrap,\n justifyContent: justifyContent,\n width: width,\n height: height\n }, false ? undefined : {}, style)\n }, componentProps), children);\n};\nBox.propTypes = {\n /** Defines how the browser distributes space between and around content items vertically within this box. */\n alignContent: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf(['flex-start', 'flex-end', 'center', 'space-between', 'space-around', 'stretch']),\n /** Defines how the browser distributes space between and around flex items horizontally within this box. */\n alignItems: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf(['flex-start', 'flex-end', 'center', 'baseline', 'stretch']),\n /** Specifies how this box should be aligned inside of its container (requires the container to be flexable). */\n alignSelf: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf(['auto', 'flex-start', 'flex-end', 'center', 'baseline', 'stretch']),\n /** Specifies the initial length of this box */\n basis: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf(['auto'])]),\n /** Specifies the the HTML nodes which will be child elements of this box. */\n children: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.node,\n /** Specifies the class name that will be set on this box */\n className: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n /**\n * A callback function whose first parameter is the underlying dom elements.\n * This call back will be executed immediately after the component is mounted or unmounted\n */\n componentRef: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n /** https://developer.mozilla.org/en-US/docs/Web/CSS/flex-direction */\n direction: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf(['row', 'row-reverse', 'column', 'column-reverse']),\n /** Specifies the type of HTML element of this box. Defaults to div. */\n element: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n /** Specifies the flex grow factor of a flex item. */\n grow: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n /** The height in pixels (if specified as a number) or a string if different units are required. */\n height: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string]),\n /** https://developer.mozilla.org/en-US/docs/Web/CSS/justify-content */\n justifyContent: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf(['flex-start', 'flex-end', 'center', 'space-between', 'space-around']),\n /** Specifies the flex shrink factor of a flex item. */\n shrink: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n /** An object whose keys are css property names and whose values correspond the the css property. */\n style: react_style_proptype__WEBPACK_IMPORTED_MODULE_3___default.a,\n /** The width in pixels (if specified as a number) or a string if different units are required. */\n width: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string]),\n /** How whitespace should wrap within this block. */\n wrap: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf(['nowrap', 'wrap', 'wrap-reverse'])\n};\nBox.defaultProps = {\n element: 'div',\n style: {}\n};\n/* harmony default export */ __webpack_exports__[\"a\"] = (Box);\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(531);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 7 */,\n/* 8 */,\n/* 9 */,\n/* 10 */,\n/* 11 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _turbowarp_nanolog__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(260);\n/* harmony import */ var _turbowarp_nanolog__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_turbowarp_nanolog__WEBPACK_IMPORTED_MODULE_0__);\n\n_turbowarp_nanolog__WEBPACK_IMPORTED_MODULE_0___default.a.enable();\n/* harmony default export */ __webpack_exports__[\"default\"] = (_turbowarp_nanolog__WEBPACK_IMPORTED_MODULE_0___default()('gui'));\n\n/***/ }),\n/* 12 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return reducer; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"z\", function() { return initialState; });\n/* unused harmony export LoadingState */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return LoadingStates; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return autoUpdateProject; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return createProject; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return defaultProjectId; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"f\", function() { return doneCreatingProject; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"g\", function() { return doneUpdatingProject; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"h\", function() { return getIsAnyCreatingNewState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"i\", function() { return getIsCreatingCopy; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"j\", function() { return getIsCreatingNew; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"k\", function() { return getIsError; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"l\", function() { return getIsFetchingWithId; });\n/* unused harmony export getIsFetchingWithoutId */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"m\", function() { return getIsLoading; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"o\", function() { return getIsLoadingWithId; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"n\", function() { return getIsLoadingUpload; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"p\", function() { return getIsManualUpdating; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"q\", function() { return getIsRemixing; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"r\", function() { return getIsShowingProject; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"s\", function() { return getIsShowingWithId; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"t\", function() { return getIsShowingWithoutId; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"u\", function() { return getIsUpdating; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"v\", function() { return manualUpdateProject; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"w\", function() { return onFetchedProjectData; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"x\", function() { return onLoadedProject; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"y\", function() { return projectError; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"A\", function() { return remixProject; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"B\", function() { return requestNewProject; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"C\", function() { return requestProjectUpload; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"D\", function() { return saveProjectAsCopy; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"E\", function() { return setProjectId; });\n/* harmony import */ var keymirror__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(42);\n/* harmony import */ var keymirror__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(keymirror__WEBPACK_IMPORTED_MODULE_0__);\n\nconst DONE_CREATING_COPY = 'scratch-gui/project-state/DONE_CREATING_COPY';\nconst DONE_CREATING_NEW = 'scratch-gui/project-state/DONE_CREATING_NEW';\nconst DONE_FETCHING_DEFAULT = 'scratch-gui/project-state/DONE_FETCHING_DEFAULT';\nconst DONE_FETCHING_WITH_ID = 'scratch-gui/project-state/DONE_FETCHING_WITH_ID';\nconst DONE_LOADING_VM_TO_SAVE = 'scratch-gui/project-state/DONE_LOADING_VM_TO_SAVE';\nconst DONE_LOADING_VM_WITH_ID = 'scratch-gui/project-state/DONE_LOADING_VM_WITH_ID';\nconst DONE_LOADING_VM_WITHOUT_ID = 'scratch-gui/project-state/DONE_LOADING_VM_WITHOUT_ID';\nconst DONE_REMIXING = 'scratch-gui/project-state/DONE_REMIXING';\nconst DONE_UPDATING = 'scratch-gui/project-state/DONE_UPDATING';\nconst DONE_UPDATING_BEFORE_COPY = 'scratch-gui/project-state/DONE_UPDATING_BEFORE_COPY';\nconst DONE_UPDATING_BEFORE_NEW = 'scratch-gui/project-state/DONE_UPDATING_BEFORE_NEW';\nconst RETURN_TO_SHOWING = 'scratch-gui/project-state/RETURN_TO_SHOWING';\nconst SET_PROJECT_ID = 'scratch-gui/project-state/SET_PROJECT_ID';\nconst START_AUTO_UPDATING = 'scratch-gui/project-state/START_AUTO_UPDATING';\nconst START_CREATING_NEW = 'scratch-gui/project-state/START_CREATING_NEW';\nconst START_ERROR = 'scratch-gui/project-state/START_ERROR';\nconst START_FETCHING_NEW = 'scratch-gui/project-state/START_FETCHING_NEW';\nconst START_LOADING_VM_FILE_UPLOAD = 'scratch-gui/project-state/START_LOADING_VM_FILE_UPLOAD';\nconst START_MANUAL_UPDATING = 'scratch-gui/project-state/START_MANUAL_UPDATING';\nconst START_REMIXING = 'scratch-gui/project-state/START_REMIXING';\nconst START_UPDATING_BEFORE_CREATING_COPY = 'scratch-gui/project-state/START_UPDATING_BEFORE_CREATING_COPY';\nconst START_UPDATING_BEFORE_CREATING_NEW = 'scratch-gui/project-state/START_UPDATING_BEFORE_CREATING_NEW';\nconst defaultProjectId = '0'; // hardcoded id of default project\n\nconst LoadingState = keymirror__WEBPACK_IMPORTED_MODULE_0___default()({\n NOT_LOADED: null,\n ERROR: null,\n AUTO_UPDATING: null,\n CREATING_COPY: null,\n CREATING_NEW: null,\n FETCHING_NEW_DEFAULT: null,\n FETCHING_WITH_ID: null,\n LOADING_VM_FILE_UPLOAD: null,\n LOADING_VM_NEW_DEFAULT: null,\n LOADING_VM_WITH_ID: null,\n MANUAL_UPDATING: null,\n REMIXING: null,\n SHOWING_WITH_ID: null,\n SHOWING_WITHOUT_ID: null,\n UPDATING_BEFORE_COPY: null,\n UPDATING_BEFORE_NEW: null\n});\nconst LoadingStates = Object.keys(LoadingState);\nconst getIsFetchingWithoutId = loadingState =>\n// LOADING_VM_FILE_UPLOAD is an honorary fetch, since there is no fetching step for file uploads\nloadingState === LoadingState.LOADING_VM_FILE_UPLOAD || loadingState === LoadingState.FETCHING_NEW_DEFAULT;\nconst getIsFetchingWithId = loadingState => loadingState === LoadingState.FETCHING_WITH_ID || loadingState === LoadingState.FETCHING_NEW_DEFAULT;\nconst getIsLoadingWithId = loadingState => loadingState === LoadingState.LOADING_VM_WITH_ID || loadingState === LoadingState.LOADING_VM_NEW_DEFAULT;\nconst getIsLoading = loadingState => loadingState === LoadingState.LOADING_VM_FILE_UPLOAD || loadingState === LoadingState.LOADING_VM_WITH_ID || loadingState === LoadingState.LOADING_VM_NEW_DEFAULT;\nconst getIsLoadingUpload = loadingState => loadingState === LoadingState.LOADING_VM_FILE_UPLOAD;\nconst getIsCreatingNew = loadingState => loadingState === LoadingState.CREATING_NEW;\nconst getIsAnyCreatingNewState = loadingState => loadingState === LoadingState.FETCHING_NEW_DEFAULT || loadingState === LoadingState.LOADING_VM_NEW_DEFAULT || loadingState === LoadingState.CREATING_NEW;\nconst getIsCreatingCopy = loadingState => loadingState === LoadingState.CREATING_COPY;\nconst getIsManualUpdating = loadingState => loadingState === LoadingState.MANUAL_UPDATING;\nconst getIsRemixing = loadingState => loadingState === LoadingState.REMIXING;\nconst getIsUpdating = loadingState => loadingState === LoadingState.AUTO_UPDATING || loadingState === LoadingState.MANUAL_UPDATING || loadingState === LoadingState.UPDATING_BEFORE_COPY || loadingState === LoadingState.UPDATING_BEFORE_NEW;\nconst getIsShowingProject = loadingState => loadingState === LoadingState.SHOWING_WITH_ID || loadingState === LoadingState.SHOWING_WITHOUT_ID;\nconst getIsShowingWithId = loadingState => loadingState === LoadingState.SHOWING_WITH_ID;\nconst getIsShowingWithoutId = loadingState => loadingState === LoadingState.SHOWING_WITHOUT_ID;\nconst getIsError = loadingState => loadingState === LoadingState.ERROR;\nconst initialState = {\n error: null,\n projectData: null,\n projectId: null,\n loadingState: LoadingState.NOT_LOADED\n};\nconst reducer = function reducer(state, action) {\n if (typeof state === 'undefined') state = initialState;\n switch (action.type) {\n case DONE_CREATING_NEW:\n // We need to set project id since we just created new project on the server.\n // No need to load, we should have data already in vm.\n if (state.loadingState === LoadingState.CREATING_NEW) {\n return Object.assign({}, state, {\n loadingState: LoadingState.SHOWING_WITH_ID,\n projectId: action.projectId\n });\n }\n return state;\n case DONE_FETCHING_WITH_ID:\n if (state.loadingState === LoadingState.FETCHING_WITH_ID) {\n return Object.assign({}, state, {\n loadingState: LoadingState.LOADING_VM_WITH_ID,\n projectData: action.projectData\n });\n }\n return state;\n case DONE_FETCHING_DEFAULT:\n if (state.loadingState === LoadingState.FETCHING_NEW_DEFAULT) {\n return Object.assign({}, state, {\n loadingState: LoadingState.LOADING_VM_NEW_DEFAULT,\n projectData: action.projectData\n });\n }\n return state;\n case DONE_LOADING_VM_WITHOUT_ID:\n if (state.loadingState === LoadingState.LOADING_VM_FILE_UPLOAD || state.loadingState === LoadingState.LOADING_VM_NEW_DEFAULT) {\n return Object.assign({}, state, {\n loadingState: LoadingState.SHOWING_WITHOUT_ID,\n projectId: defaultProjectId\n });\n }\n return state;\n case DONE_LOADING_VM_WITH_ID:\n if (state.loadingState === LoadingState.LOADING_VM_WITH_ID) {\n return Object.assign({}, state, {\n loadingState: LoadingState.SHOWING_WITH_ID\n });\n }\n return state;\n case DONE_LOADING_VM_TO_SAVE:\n if (state.loadingState === LoadingState.LOADING_VM_FILE_UPLOAD) {\n return Object.assign({}, state, {\n loadingState: LoadingState.AUTO_UPDATING\n });\n }\n return state;\n case DONE_REMIXING:\n // We need to set project id since we just created new project on the server.\n // No need to load, we should have data already in vm.\n if (state.loadingState === LoadingState.REMIXING) {\n return Object.assign({}, state, {\n loadingState: LoadingState.SHOWING_WITH_ID,\n projectId: action.projectId\n });\n }\n return state;\n case DONE_CREATING_COPY:\n // We need to set project id since we just created new project on the server.\n // No need to load, we should have data already in vm.\n if (state.loadingState === LoadingState.CREATING_COPY) {\n return Object.assign({}, state, {\n loadingState: LoadingState.SHOWING_WITH_ID,\n projectId: action.projectId\n });\n }\n return state;\n case DONE_UPDATING:\n if (state.loadingState === LoadingState.AUTO_UPDATING || state.loadingState === LoadingState.MANUAL_UPDATING) {\n return Object.assign({}, state, {\n loadingState: LoadingState.SHOWING_WITH_ID\n });\n }\n return state;\n case DONE_UPDATING_BEFORE_COPY:\n if (state.loadingState === LoadingState.UPDATING_BEFORE_COPY) {\n return Object.assign({}, state, {\n loadingState: LoadingState.CREATING_COPY\n });\n }\n return state;\n case DONE_UPDATING_BEFORE_NEW:\n if (state.loadingState === LoadingState.UPDATING_BEFORE_NEW) {\n return Object.assign({}, state, {\n loadingState: LoadingState.FETCHING_NEW_DEFAULT,\n projectId: defaultProjectId\n });\n }\n return state;\n case RETURN_TO_SHOWING:\n if (state.projectId === null || state.projectId === defaultProjectId) {\n return Object.assign({}, state, {\n loadingState: LoadingState.SHOWING_WITHOUT_ID,\n projectId: defaultProjectId\n });\n }\n return Object.assign({}, state, {\n loadingState: LoadingState.SHOWING_WITH_ID\n });\n case SET_PROJECT_ID:\n // if the projectId hasn't actually changed do nothing\n if (state.projectId === action.projectId) {\n return state;\n }\n // if we were already showing a project, and a different projectId is set, only fetch that project if\n // projectId has changed. This prevents re-fetching projects unnecessarily.\n if (state.loadingState === LoadingState.SHOWING_WITH_ID) {\n // if setting the default project id, specifically fetch that project\n if (action.projectId === defaultProjectId || action.projectId === null) {\n return Object.assign({}, state, {\n loadingState: LoadingState.FETCHING_NEW_DEFAULT,\n projectId: defaultProjectId\n });\n }\n return Object.assign({}, state, {\n loadingState: LoadingState.FETCHING_WITH_ID,\n projectId: action.projectId\n });\n } else if (state.loadingState === LoadingState.SHOWING_WITHOUT_ID) {\n // if we were showing a project already, don't transition to default project.\n if (action.projectId !== defaultProjectId && action.projectId !== null) {\n return Object.assign({}, state, {\n loadingState: LoadingState.FETCHING_WITH_ID,\n projectId: action.projectId\n });\n }\n } else {\n // allow any other states to transition to fetching project\n // if setting the default project id, specifically fetch that project\n if (action.projectId === defaultProjectId || action.projectId === null) {\n return Object.assign({}, state, {\n loadingState: LoadingState.FETCHING_NEW_DEFAULT,\n projectId: defaultProjectId\n });\n }\n return Object.assign({}, state, {\n loadingState: LoadingState.FETCHING_WITH_ID,\n projectId: action.projectId\n });\n }\n return state;\n case START_AUTO_UPDATING:\n if (state.loadingState === LoadingState.SHOWING_WITH_ID) {\n return Object.assign({}, state, {\n loadingState: LoadingState.AUTO_UPDATING\n });\n }\n return state;\n case START_CREATING_NEW:\n if (state.loadingState === LoadingState.SHOWING_WITHOUT_ID) {\n return Object.assign({}, state, {\n loadingState: LoadingState.CREATING_NEW\n });\n }\n return state;\n case START_FETCHING_NEW:\n if ([LoadingState.SHOWING_WITH_ID, LoadingState.SHOWING_WITHOUT_ID].includes(state.loadingState)) {\n return Object.assign({}, state, {\n loadingState: LoadingState.FETCHING_NEW_DEFAULT,\n projectId: defaultProjectId\n });\n }\n return state;\n case START_LOADING_VM_FILE_UPLOAD:\n if ([LoadingState.NOT_LOADED, LoadingState.SHOWING_WITH_ID, LoadingState.SHOWING_WITHOUT_ID].includes(state.loadingState)) {\n return Object.assign({}, state, {\n loadingState: LoadingState.LOADING_VM_FILE_UPLOAD\n });\n }\n return state;\n case START_MANUAL_UPDATING:\n if (state.loadingState === LoadingState.SHOWING_WITH_ID) {\n return Object.assign({}, state, {\n loadingState: LoadingState.MANUAL_UPDATING\n });\n }\n return state;\n case START_REMIXING:\n if (state.loadingState === LoadingState.SHOWING_WITH_ID) {\n return Object.assign({}, state, {\n loadingState: LoadingState.REMIXING\n });\n }\n return state;\n case START_UPDATING_BEFORE_CREATING_COPY:\n if (state.loadingState === LoadingState.SHOWING_WITH_ID) {\n return Object.assign({}, state, {\n loadingState: LoadingState.UPDATING_BEFORE_COPY\n });\n }\n return state;\n case START_UPDATING_BEFORE_CREATING_NEW:\n if (state.loadingState === LoadingState.SHOWING_WITH_ID) {\n return Object.assign({}, state, {\n loadingState: LoadingState.UPDATING_BEFORE_NEW\n });\n }\n return state;\n case START_ERROR:\n // fatal errors: there's no correct editor state for us to show\n if ([LoadingState.FETCHING_NEW_DEFAULT, LoadingState.FETCHING_WITH_ID, LoadingState.LOADING_VM_NEW_DEFAULT, LoadingState.LOADING_VM_WITH_ID].includes(state.loadingState)) {\n return Object.assign({}, state, {\n loadingState: LoadingState.ERROR,\n error: action.error\n });\n }\n // non-fatal errors: can keep showing editor state fine\n if ([LoadingState.AUTO_UPDATING, LoadingState.CREATING_COPY, LoadingState.MANUAL_UPDATING, LoadingState.REMIXING, LoadingState.UPDATING_BEFORE_COPY, LoadingState.UPDATING_BEFORE_NEW].includes(state.loadingState)) {\n return Object.assign({}, state, {\n loadingState: LoadingState.SHOWING_WITH_ID,\n error: action.error\n });\n }\n // non-fatal error; state to show depends on whether project we're showing\n // has an id or not\n if (state.loadingState === LoadingState.CREATING_NEW) {\n if (state.projectId === defaultProjectId || state.projectId === null) {\n return Object.assign({}, state, {\n loadingState: LoadingState.SHOWING_WITHOUT_ID,\n error: action.error\n });\n }\n return Object.assign({}, state, {\n loadingState: LoadingState.SHOWING_WITH_ID,\n error: action.error\n });\n }\n return state;\n default:\n return state;\n }\n};\nconst createProject = () => ({\n type: START_CREATING_NEW\n});\nconst doneCreatingProject = (id, loadingState) => {\n switch (loadingState) {\n case LoadingState.CREATING_NEW:\n return {\n type: DONE_CREATING_NEW,\n projectId: id\n };\n case LoadingState.CREATING_COPY:\n return {\n type: DONE_CREATING_COPY,\n projectId: id\n };\n case LoadingState.REMIXING:\n return {\n type: DONE_REMIXING,\n projectId: id\n };\n default:\n break;\n }\n};\nconst onFetchedProjectData = (projectData, loadingState) => {\n switch (loadingState) {\n case LoadingState.FETCHING_WITH_ID:\n return {\n type: DONE_FETCHING_WITH_ID,\n projectData: projectData\n };\n case LoadingState.FETCHING_NEW_DEFAULT:\n return {\n type: DONE_FETCHING_DEFAULT,\n projectData: projectData\n };\n default:\n break;\n }\n};\nconst onLoadedProject = (loadingState, canSave, success) => {\n switch (loadingState) {\n case LoadingState.LOADING_VM_WITH_ID:\n if (success) {\n return {\n type: DONE_LOADING_VM_WITH_ID\n };\n }\n // failed to load project; just keep showing current project\n return {\n type: RETURN_TO_SHOWING\n };\n case LoadingState.LOADING_VM_FILE_UPLOAD:\n if (success) {\n if (canSave) {\n return {\n type: DONE_LOADING_VM_TO_SAVE\n };\n }\n return {\n type: DONE_LOADING_VM_WITHOUT_ID\n };\n }\n // failed to load project; just keep showing current project\n return {\n type: RETURN_TO_SHOWING\n };\n case LoadingState.LOADING_VM_NEW_DEFAULT:\n if (success) {\n return {\n type: DONE_LOADING_VM_WITHOUT_ID\n };\n }\n // failed to load default project; show error\n return {\n type: START_ERROR\n };\n default:\n return;\n }\n};\nconst doneUpdatingProject = loadingState => {\n switch (loadingState) {\n case LoadingState.AUTO_UPDATING:\n case LoadingState.MANUAL_UPDATING:\n return {\n type: DONE_UPDATING\n };\n case LoadingState.UPDATING_BEFORE_COPY:\n return {\n type: DONE_UPDATING_BEFORE_COPY\n };\n case LoadingState.UPDATING_BEFORE_NEW:\n return {\n type: DONE_UPDATING_BEFORE_NEW\n };\n default:\n break;\n }\n};\nconst projectError = error => ({\n type: START_ERROR,\n error: error\n});\nconst setProjectId = id => ({\n type: SET_PROJECT_ID,\n projectId: id\n});\nconst requestNewProject = needSave => {\n if (needSave) return {\n type: START_UPDATING_BEFORE_CREATING_NEW\n };\n return {\n type: START_FETCHING_NEW\n };\n};\nconst requestProjectUpload = loadingState => {\n switch (loadingState) {\n case LoadingState.NOT_LOADED:\n case LoadingState.SHOWING_WITH_ID:\n case LoadingState.SHOWING_WITHOUT_ID:\n return {\n type: START_LOADING_VM_FILE_UPLOAD\n };\n default:\n break;\n }\n};\nconst autoUpdateProject = () => ({\n type: START_AUTO_UPDATING\n});\nconst manualUpdateProject = () => ({\n type: START_MANUAL_UPDATING\n});\nconst saveProjectAsCopy = () => ({\n type: START_UPDATING_BEFORE_CREATING_COPY\n});\nconst remixProject = () => ({\n type: START_REMIXING\n});\n\n\n/***/ }),\n/* 13 */,\n/* 14 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"r\", function() { return reducer; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"s\", function() { return initialState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"t\", function() { return openBackdropLibrary; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"v\", function() { return openCostumeLibrary; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"x\", function() { return openExtensionLibrary; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"A\", function() { return openLoadingProject; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"D\", function() { return openSoundLibrary; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"F\", function() { return openSpriteLibrary; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"E\", function() { return openSoundRecorder; });\n/* unused harmony export openTelemetryModal */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"G\", function() { return openTipsLibrary; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"u\", function() { return openConnectionModal; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"I\", function() { return openUsernameModal; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"C\", function() { return openSettingsModal; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"w\", function() { return openCustomExtensionModal; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"B\", function() { return openRestorePointModal; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"y\", function() { return openFontsModal; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"H\", function() { return openUnknownPlatformModal; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"z\", function() { return openInvalidProjectModal; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return closeBackdropLibrary; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return closeCostumeLibrary; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return closeExtensionLibrary; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"h\", function() { return closeLoadingProject; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"m\", function() { return closeSpriteLibrary; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"k\", function() { return closeSoundLibrary; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"l\", function() { return closeSoundRecorder; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"n\", function() { return closeTelemetryModal; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"o\", function() { return closeTipsLibrary; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return closeConnectionModal; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"q\", function() { return closeUsernameModal; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"j\", function() { return closeSettingsModal; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return closeCustomExtensionModal; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"i\", function() { return closeRestorePointModal; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"f\", function() { return closeFontsModal; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"p\", function() { return closeUnknownPlatformModal; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"g\", function() { return closeInvalidProjectModal; });\nconst OPEN_MODAL = 'scratch-gui/modals/OPEN_MODAL';\nconst CLOSE_MODAL = 'scratch-gui/modals/CLOSE_MODAL';\nconst MODAL_BACKDROP_LIBRARY = 'backdropLibrary';\nconst MODAL_COSTUME_LIBRARY = 'costumeLibrary';\nconst MODAL_EXTENSION_LIBRARY = 'extensionLibrary';\nconst MODAL_LOADING_PROJECT = 'loadingProject';\nconst MODAL_TELEMETRY = 'telemetryModal';\nconst MODAL_SOUND_LIBRARY = 'soundLibrary';\nconst MODAL_SPRITE_LIBRARY = 'spriteLibrary';\nconst MODAL_SOUND_RECORDER = 'soundRecorder';\nconst MODAL_CONNECTION = 'connectionModal';\nconst MODAL_TIPS_LIBRARY = 'tipsLibrary';\nconst MODAL_USERNAME = 'usernameModal';\nconst MODAL_SETTINGS = 'settingsModal';\nconst MODAL_CUSTOM_EXTENSION = 'customExtensionModal';\nconst MODAL_RESTORE_POINTS = 'restorePointModal';\nconst MODAL_FONTS = 'fontsModal';\nconst MODAL_UNKNOWN_PLATFORM = 'unknownPlatformModal';\nconst MODAL_INVALID_PROJECT = 'invalidProjectModal';\nconst initialState = {\n [MODAL_BACKDROP_LIBRARY]: false,\n [MODAL_COSTUME_LIBRARY]: false,\n [MODAL_EXTENSION_LIBRARY]: false,\n [MODAL_LOADING_PROJECT]: false,\n [MODAL_TELEMETRY]: false,\n [MODAL_SOUND_LIBRARY]: false,\n [MODAL_SPRITE_LIBRARY]: false,\n [MODAL_SOUND_RECORDER]: false,\n [MODAL_CONNECTION]: false,\n [MODAL_TIPS_LIBRARY]: false,\n [MODAL_USERNAME]: false,\n [MODAL_SETTINGS]: false,\n [MODAL_CUSTOM_EXTENSION]: false,\n [MODAL_RESTORE_POINTS]: false,\n [MODAL_FONTS]: false,\n [MODAL_UNKNOWN_PLATFORM]: false,\n [MODAL_INVALID_PROJECT]: false\n};\nconst reducer = function reducer(state, action) {\n if (typeof state === 'undefined') state = initialState;\n switch (action.type) {\n case OPEN_MODAL:\n return Object.assign({}, state, {\n [action.modal]: true\n });\n case CLOSE_MODAL:\n return Object.assign({}, state, {\n [action.modal]: false\n });\n default:\n return state;\n }\n};\nconst openModal = function openModal(modal) {\n return {\n type: OPEN_MODAL,\n modal: modal\n };\n};\nconst closeModal = function closeModal(modal) {\n return {\n type: CLOSE_MODAL,\n modal: modal\n };\n};\nconst openBackdropLibrary = function openBackdropLibrary() {\n return openModal(MODAL_BACKDROP_LIBRARY);\n};\nconst openCostumeLibrary = function openCostumeLibrary() {\n return openModal(MODAL_COSTUME_LIBRARY);\n};\nconst openExtensionLibrary = function openExtensionLibrary() {\n return openModal(MODAL_EXTENSION_LIBRARY);\n};\nconst openLoadingProject = function openLoadingProject() {\n return openModal(MODAL_LOADING_PROJECT);\n};\nconst openTelemetryModal = function openTelemetryModal() {\n return openModal(MODAL_TELEMETRY);\n};\nconst openSoundLibrary = function openSoundLibrary() {\n return openModal(MODAL_SOUND_LIBRARY);\n};\nconst openSpriteLibrary = function openSpriteLibrary() {\n return openModal(MODAL_SPRITE_LIBRARY);\n};\nconst openSoundRecorder = function openSoundRecorder() {\n return openModal(MODAL_SOUND_RECORDER);\n};\nconst openConnectionModal = function openConnectionModal() {\n return openModal(MODAL_CONNECTION);\n};\nconst openTipsLibrary = function openTipsLibrary() {\n return openModal(MODAL_TIPS_LIBRARY);\n};\nconst openUsernameModal = function openUsernameModal() {\n return openModal(MODAL_USERNAME);\n};\nconst openSettingsModal = function openSettingsModal() {\n return openModal(MODAL_SETTINGS);\n};\nconst openCustomExtensionModal = function openCustomExtensionModal() {\n return openModal(MODAL_CUSTOM_EXTENSION);\n};\nconst openRestorePointModal = function openRestorePointModal() {\n return openModal(MODAL_RESTORE_POINTS);\n};\nconst openFontsModal = function openFontsModal() {\n return openModal(MODAL_FONTS);\n};\nconst openUnknownPlatformModal = function openUnknownPlatformModal() {\n return openModal(MODAL_UNKNOWN_PLATFORM);\n};\nconst openInvalidProjectModal = function openInvalidProjectModal() {\n return openModal(MODAL_INVALID_PROJECT);\n};\nconst closeBackdropLibrary = function closeBackdropLibrary() {\n return closeModal(MODAL_BACKDROP_LIBRARY);\n};\nconst closeCostumeLibrary = function closeCostumeLibrary() {\n return closeModal(MODAL_COSTUME_LIBRARY);\n};\nconst closeExtensionLibrary = function closeExtensionLibrary() {\n return closeModal(MODAL_EXTENSION_LIBRARY);\n};\nconst closeLoadingProject = function closeLoadingProject() {\n return closeModal(MODAL_LOADING_PROJECT);\n};\nconst closeTelemetryModal = function closeTelemetryModal() {\n return closeModal(MODAL_TELEMETRY);\n};\nconst closeSpriteLibrary = function closeSpriteLibrary() {\n return closeModal(MODAL_SPRITE_LIBRARY);\n};\nconst closeSoundLibrary = function closeSoundLibrary() {\n return closeModal(MODAL_SOUND_LIBRARY);\n};\nconst closeSoundRecorder = function closeSoundRecorder() {\n return closeModal(MODAL_SOUND_RECORDER);\n};\nconst closeTipsLibrary = function closeTipsLibrary() {\n return closeModal(MODAL_TIPS_LIBRARY);\n};\nconst closeConnectionModal = function closeConnectionModal() {\n return closeModal(MODAL_CONNECTION);\n};\nconst closeUsernameModal = function closeUsernameModal() {\n return closeModal(MODAL_USERNAME);\n};\nconst closeSettingsModal = function closeSettingsModal() {\n return closeModal(MODAL_SETTINGS);\n};\nconst closeCustomExtensionModal = function closeCustomExtensionModal() {\n return closeModal(MODAL_CUSTOM_EXTENSION);\n};\nconst closeRestorePointModal = function closeRestorePointModal() {\n return closeModal(MODAL_RESTORE_POINTS);\n};\nconst closeFontsModal = function closeFontsModal() {\n return closeModal(MODAL_FONTS);\n};\nconst closeUnknownPlatformModal = function closeUnknownPlatformModal() {\n return closeModal(MODAL_UNKNOWN_PLATFORM);\n};\nconst closeInvalidProjectModal = function closeInvalidProjectModal() {\n return closeModal(MODAL_INVALID_PROJECT);\n};\n\n\n/***/ }),\n/* 15 */,\n/* 16 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return BLOCKS_DEFAULT_SCALE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return STAGE_DISPLAY_SCALE_METADATA; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return STAGE_DISPLAY_SIZES; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return STAGE_SIZE_MODES; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return FIXED_WIDTH; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"f\", function() { return UNCONSTRAINED_NON_STAGE_WIDTH; });\n/* harmony import */ var keymirror__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(42);\n/* harmony import */ var keymirror__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(keymirror__WEBPACK_IMPORTED_MODULE_0__);\n\n\n/**\n * Names for each state of the stage size toggle\n * @enum {string}\n */\nconst STAGE_SIZE_MODES = keymirror__WEBPACK_IMPORTED_MODULE_0___default()({\n /**\n * Display the stage at a large (but fixed) width.\n */\n large: null,\n /**\n * Display the stage at a small (but fixed) width.\n */\n small: null,\n /**\n * Display the stage at its full size.\n */\n full: null\n});\n\n/**\n * Names for each stage render size\n * @enum {string}\n */\nconst STAGE_DISPLAY_SIZES = keymirror__WEBPACK_IMPORTED_MODULE_0___default()({\n large: null,\n small: null,\n constrained: null,\n full: null\n});\n\n// zoom level to start with\nconst BLOCKS_DEFAULT_SCALE = 0.675;\nconst FIXED_WIDTH = 480;\n\n/**\n * Minimum amount of screen width (excluding the width used by the stage itself) to display constrained.\n */\nconst UNCONSTRAINED_NON_STAGE_WIDTH = 1096 - FIXED_WIDTH;\nconst STAGE_DISPLAY_SCALE_METADATA = {\n [STAGE_DISPLAY_SIZES.large]: {\n width: FIXED_WIDTH\n },\n [STAGE_DISPLAY_SIZES.small]: {\n width: FIXED_WIDTH * 0.5\n },\n [STAGE_DISPLAY_SIZES.constrained]: {\n scale: 0.85\n },\n [STAGE_DISPLAY_SIZES.full]: {\n scale: 1\n }\n};\n\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(515);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 18 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"m\", function() { return reducer; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"s\", function() { return initialState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"u\", function() { return openAboutMenu; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return closeAboutMenu; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return aboutMenuOpen; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"w\", function() { return openAccountMenu; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"f\", function() { return closeAccountMenu; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return accountMenuOpen; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"y\", function() { return openEditMenu; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"g\", function() { return closeEditMenu; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"n\", function() { return editMenuOpen; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"A\", function() { return openFileMenu; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"i\", function() { return closeFileMenu; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"p\", function() { return fileMenuOpen; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"B\", function() { return openLanguageMenu; });\n/* unused harmony export closeLanguageMenu */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"q\", function() { return languageMenuOpen; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"C\", function() { return openLoginMenu; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"j\", function() { return closeLoginMenu; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"r\", function() { return loginMenuOpen; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"D\", function() { return openModeMenu; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"k\", function() { return closeModeMenu; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"t\", function() { return modeMenuOpen; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"E\", function() { return openSettingsMenu; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"l\", function() { return closeSettingsMenu; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"F\", function() { return settingsMenuOpen; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"v\", function() { return openAccentMenu; });\n/* unused harmony export closeAccentMenu */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return accentMenuOpen; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"x\", function() { return openBlocksThemeMenu; });\n/* unused harmony export closeBlocksThemeMenu */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return blocksThemeMenuOpen; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"z\", function() { return openErrorsMenu; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"h\", function() { return closeErrorsMenu; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"o\", function() { return errorsMenuOpen; });\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nconst OPEN_MENU = 'scratch-gui/menus/OPEN_MENU';\nconst CLOSE_MENU = 'scratch-gui/menus/CLOSE_MENU';\nconst MENU_ABOUT = 'aboutMenu';\nconst MENU_ACCOUNT = 'accountMenu';\nconst MENU_EDIT = 'editMenu';\nconst MENU_FILE = 'fileMenu';\nconst MENU_LANGUAGE = 'languageMenu';\nconst MENU_LOGIN = 'loginMenu';\nconst MENU_MODE = 'modeMenu';\nconst MENU_SETTINGS = 'settingsMenu';\nconst MENU_ACCENT = 'accentMenu';\nconst MENU_BLOCKS_THEME = 'blocksThemeMenu';\nconst MENU_ERRORS = 'errorsMenu';\nclass Menu {\n constructor(id) {\n this.id = id;\n this.children = [];\n this.parent = null;\n }\n addChild(menu) {\n this.children.push(menu);\n menu.parent = this;\n return this;\n }\n descendants() {\n return this.children.flatMap(child => [child, ...child.descendants()]);\n }\n siblings() {\n if (!this.parent) return [];\n return this.parent.children.filter(child => child.id !== this.id);\n }\n findById(id) {\n if (this.id === id) return this;\n for (const child of this.children) {\n const found = child.findById(id);\n if (found) return found;\n }\n return null;\n }\n}\n\n// Structure of nested menus, used for collapsing submenus logic.\nconst rootMenu = new Menu('root').addChild(new Menu(MENU_ERRORS)).addChild(new Menu(MENU_SETTINGS).addChild(new Menu(MENU_LANGUAGE)).addChild(new Menu(MENU_ACCENT)).addChild(new Menu(MENU_BLOCKS_THEME))).addChild(new Menu(MENU_FILE)).addChild(new Menu(MENU_EDIT)).addChild(new Menu(MENU_MODE)).addChild(new Menu(MENU_SETTINGS)).addChild(new Menu(MENU_LOGIN)).addChild(new Menu(MENU_ACCOUNT)).addChild(new Menu(MENU_ABOUT));\nconst initialState = {\n [MENU_ABOUT]: false,\n [MENU_ACCOUNT]: false,\n [MENU_EDIT]: false,\n [MENU_FILE]: false,\n [MENU_LANGUAGE]: false,\n [MENU_LOGIN]: false,\n [MENU_MODE]: false,\n [MENU_SETTINGS]: false,\n [MENU_ACCENT]: false,\n [MENU_BLOCKS_THEME]: false,\n [MENU_ERRORS]: false\n};\nconst reducer = function reducer(state, action) {\n if (typeof state === 'undefined') state = initialState;\n switch (action.type) {\n case OPEN_MENU:\n {\n const menu = rootMenu.findById(action.menu);\n // Close siblings when opening a menu\n const toClose = menu.siblings().flatMap(sibling => [sibling, ...sibling.descendants()]);\n return _objectSpread(_objectSpread({}, state), {}, {\n [action.menu]: true\n }, Object.fromEntries(toClose.map(_ref => {\n let {\n id\n } = _ref;\n return [id, false];\n })));\n }\n case CLOSE_MENU:\n {\n const menu = rootMenu.findById(action.menu);\n // Close this menu and any submenus\n const toClose = [menu, ...menu.descendants()];\n return _objectSpread(_objectSpread({}, state), Object.fromEntries(toClose.map(_ref2 => {\n let {\n id\n } = _ref2;\n return [id, false];\n })));\n }\n default:\n return state;\n }\n};\nconst openMenu = menu => ({\n type: OPEN_MENU,\n menu: menu\n});\nconst closeMenu = menu => ({\n type: CLOSE_MENU,\n menu: menu\n});\nconst openAboutMenu = () => openMenu(MENU_ABOUT);\nconst closeAboutMenu = () => closeMenu(MENU_ABOUT);\nconst aboutMenuOpen = state => state.scratchGui.menus[MENU_ABOUT];\nconst openAccountMenu = () => openMenu(MENU_ACCOUNT);\nconst closeAccountMenu = () => closeMenu(MENU_ACCOUNT);\nconst accountMenuOpen = state => state.scratchGui.menus[MENU_ACCOUNT];\nconst openEditMenu = () => openMenu(MENU_EDIT);\nconst closeEditMenu = () => closeMenu(MENU_EDIT);\nconst editMenuOpen = state => state.scratchGui.menus[MENU_EDIT];\nconst openFileMenu = () => openMenu(MENU_FILE);\nconst closeFileMenu = () => closeMenu(MENU_FILE);\nconst fileMenuOpen = state => state.scratchGui.menus[MENU_FILE];\nconst openLanguageMenu = () => openMenu(MENU_LANGUAGE);\nconst closeLanguageMenu = () => closeMenu(MENU_LANGUAGE);\nconst languageMenuOpen = state => state.scratchGui.menus[MENU_LANGUAGE];\nconst openLoginMenu = () => openMenu(MENU_LOGIN);\nconst closeLoginMenu = () => closeMenu(MENU_LOGIN);\nconst loginMenuOpen = state => state.scratchGui.menus[MENU_LOGIN];\nconst openModeMenu = () => openMenu(MENU_MODE);\nconst closeModeMenu = () => closeMenu(MENU_MODE);\nconst modeMenuOpen = state => state.scratchGui.menus[MENU_MODE];\nconst openSettingsMenu = () => openMenu(MENU_SETTINGS);\nconst closeSettingsMenu = () => closeMenu(MENU_SETTINGS);\nconst settingsMenuOpen = state => state.scratchGui.menus[MENU_SETTINGS];\nconst openAccentMenu = () => openMenu(MENU_ACCENT);\nconst closeAccentMenu = () => closeMenu(MENU_ACCENT);\nconst accentMenuOpen = state => state.scratchGui.menus[MENU_ACCENT];\nconst openBlocksThemeMenu = () => openMenu(MENU_BLOCKS_THEME);\nconst closeBlocksThemeMenu = () => closeMenu(MENU_BLOCKS_THEME);\nconst blocksThemeMenuOpen = state => state.scratchGui.menus[MENU_BLOCKS_THEME];\nconst openErrorsMenu = () => openMenu(MENU_ERRORS);\nconst closeErrorsMenu = () => closeMenu(MENU_ERRORS);\nconst errorsMenuOpen = state => state.scratchGui.menus[MENU_ERRORS];\n\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(489);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 20 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return reducer; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return initialState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return closeAlert; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return closeAlertWithId; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return filterInlineAlerts; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"f\", function() { return filterPopupAlerts; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"g\", function() { return showAlertWithTimeout; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"h\", function() { return showExtensionAlert; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"i\", function() { return showStandardAlert; });\n/* harmony import */ var _lib_alerts_index_jsx__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(45);\n/* harmony import */ var _lib_libraries_extensions_index_jsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(82);\n\n\nconst SHOW_ALERT = 'scratch-gui/alerts/SHOW_ALERT';\nconst SHOW_EXTENSION_ALERT = 'scratch-gui/alerts/SHOW_EXTENSION_ALERT';\nconst CLOSE_ALERT = 'scratch-gui/alerts/CLOSE_ALERT';\nconst CLOSE_ALERTS_WITH_ID = 'scratch-gui/alerts/CLOSE_ALERTS_WITH_ID';\nconst CLOSE_ALERT_WITH_ID = 'scratch-gui/alerts/CLOSE_ALERT_WITH_ID';\n\n/**\n * Initial state of alerts reducer\n *\n * {bool} visible - whether the alerts are visible\n * {array} alertsList - list of alerts, each with properties:\n * * alertType (required): one of AlertTypes\n * * closeButton (optional): bool indicating that we should show close button\n * * content (optional): react element (a )\n * * extentionId (optional): id string that identifies the extension\n * * iconURL (optional): string\n * * level (required): string, one of AlertLevels\n * * message (optional): string\n * * showReconnect (optional): bool\n */\nconst initialState = {\n visible: true,\n alertsList: []\n};\nconst filterPopupAlerts = alertsList => alertsList.filter(curAlert => curAlert.alertType === _lib_alerts_index_jsx__WEBPACK_IMPORTED_MODULE_0__[/* AlertTypes */ \"b\"].STANDARD || curAlert.alertType === _lib_alerts_index_jsx__WEBPACK_IMPORTED_MODULE_0__[/* AlertTypes */ \"b\"].EXTENSION);\nconst filterInlineAlerts = alertsList => alertsList.filter(curAlert => curAlert.alertType === _lib_alerts_index_jsx__WEBPACK_IMPORTED_MODULE_0__[/* AlertTypes */ \"b\"].INLINE);\nconst reducer = function reducer(state, action) {\n if (typeof state === 'undefined') state = initialState;\n switch (action.type) {\n case SHOW_ALERT:\n {\n // intended to show standard and inline alerts, but not extensions\n const alertId = action.alertId;\n if (alertId) {\n const newAlert = {\n alertId: alertId,\n level: _lib_alerts_index_jsx__WEBPACK_IMPORTED_MODULE_0__[/* AlertLevels */ \"a\"].WARN // default level\n };\n const alertData = _lib_alerts_index_jsx__WEBPACK_IMPORTED_MODULE_0__[/* default */ \"c\"].find(thisAlertData => thisAlertData.alertId === alertId);\n if (alertData) {\n const newList = state.alertsList.filter(curAlert => !alertData.clearList || alertData.clearList.indexOf(curAlert.alertId) === -1);\n if (action.data && action.data.message) {\n newAlert.message = action.data.message;\n }\n newAlert.alertType = alertData.alertType || _lib_alerts_index_jsx__WEBPACK_IMPORTED_MODULE_0__[/* AlertTypes */ \"b\"].STANDARD;\n newAlert.closeButton = alertData.closeButton;\n newAlert.content = alertData.content;\n newAlert.iconURL = alertData.iconURL;\n newAlert.iconSpinner = alertData.iconSpinner;\n newAlert.level = alertData.level;\n newAlert.showDownload = alertData.showDownload;\n newAlert.showSaveNow = alertData.showSaveNow;\n newList.push(newAlert);\n return Object.assign({}, state, {\n alertsList: newList\n });\n }\n }\n return state; // if alert not found, show nothing\n }\n case SHOW_EXTENSION_ALERT:\n {\n const extensionId = action.data.extensionId;\n if (extensionId) {\n const extension = _lib_libraries_extensions_index_jsx__WEBPACK_IMPORTED_MODULE_1__[/* default */ \"a\"].find(ext => ext.extensionId === extensionId);\n if (extension) {\n const newList = state.alertsList.slice();\n const newAlert = {\n alertType: _lib_alerts_index_jsx__WEBPACK_IMPORTED_MODULE_0__[/* AlertTypes */ \"b\"].EXTENSION,\n closeButton: true,\n extensionId: extensionId,\n extensionName: extension.name,\n iconURL: extension.connectionSmallIconURL,\n level: _lib_alerts_index_jsx__WEBPACK_IMPORTED_MODULE_0__[/* AlertLevels */ \"a\"].WARN,\n showReconnect: true\n };\n newList.push(newAlert);\n return Object.assign({}, state, {\n alertsList: newList\n });\n }\n }\n return state; // if alert not found, show nothing\n }\n case CLOSE_ALERT_WITH_ID:\n case CLOSE_ALERT:\n {\n if (action.alertId) {\n action.index = state.alertsList.findIndex(a => a.alertId === action.alertId);\n if (action.index === -1) return state;\n }\n const newList = state.alertsList.slice();\n newList.splice(action.index, 1);\n return Object.assign({}, state, {\n alertsList: newList\n });\n }\n case CLOSE_ALERTS_WITH_ID:\n {\n return Object.assign({}, state, {\n alertsList: state.alertsList.filter(curAlert => curAlert.alertId !== action.alertId)\n });\n }\n default:\n return state;\n }\n};\n\n/**\n * Action creator to close an alert with the given index.\n *\n * @param {object} index - the index of the alert to close.\n * @return {object} - an object to be passed to the reducer.\n */\nconst closeAlert = function closeAlert(index) {\n return {\n type: CLOSE_ALERT,\n index\n };\n};\n\n/**\n * Action creator to close all alerts with a given ID.\n *\n * @param {string} alertId - id string of the alert to close\n * @return {object} - an object to be passed to the reducer.\n */\nconst closeAlertsWithId = function closeAlertsWithId(alertId) {\n return {\n type: CLOSE_ALERTS_WITH_ID,\n alertId\n };\n};\n\n/**\n * Action creator to close a single alert with a given ID.\n *\n * @param {string} alertId - id string of the alert to close\n * @return {object} - an object to be passed to the reducer.\n */\nconst closeAlertWithId = function closeAlertWithId(alertId) {\n return {\n type: CLOSE_ALERT_WITH_ID,\n alertId\n };\n};\n\n/**\n * Action creator to show an alert with the given alertId.\n *\n * @param {string} alertId - id string of the alert to show\n * @return {object} - an object to be passed to the reducer.\n */\nconst showStandardAlert = function showStandardAlert(alertId) {\n return {\n type: SHOW_ALERT,\n alertId\n };\n};\n\n/**\n * Action creator to show an alert with the given input data.\n *\n * @param {object} data - data for the alert\n * @param {string} data.message - message for the alert\n * @param {string} data.extensionId - extension ID for the alert\n * @return {object} - an object to be passed to the reducer.\n */\nconst showExtensionAlert = function showExtensionAlert(data) {\n return {\n type: SHOW_EXTENSION_ALERT,\n data\n };\n};\n\n/**\n * Function to dispatch showing an alert, with optional\n * timeout to make it close/go away.\n *\n * @param {object} dispatch - dispatch function\n * @param {string} alertId - the ID of the alert\n */\nconst showAlertWithTimeout = function showAlertWithTimeout(dispatch, alertId) {\n const alertData = _lib_alerts_index_jsx__WEBPACK_IMPORTED_MODULE_0__[/* default */ \"c\"].find(thisAlertData => thisAlertData.alertId === alertId);\n if (alertData) {\n dispatch(showStandardAlert(alertId));\n if (alertData.maxDisplaySecs) {\n setTimeout(() => {\n dispatch(closeAlertsWithId(alertId));\n }, alertData.maxDisplaySecs * 1000);\n }\n }\n};\n\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(546);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 22 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(527);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 23 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* unused harmony export initialState */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return reducer; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"u\", function() { return initialState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"k\", function() { return setFramerateState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"n\", function() { return setInterpolationState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"g\", function() { return setCompilerOptionsState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"r\", function() { return setRuntimeOptionsState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"s\", function() { return setUsername; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return setCloud; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"m\", function() { return setHighQualityPenState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"o\", function() { return setIsWindowFullScreen; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"i\", function() { return setDimensions; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return setAuthor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"h\", function() { return setDescription; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return addCompileError; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return clearCompileErrors; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"j\", function() { return setFileHandle; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"t\", function() { return setUsernameInvalid; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"l\", function() { return setHasCloudVariables; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"f\", function() { return setCloudHost; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"p\", function() { return setPlatformMismatchDetails; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"q\", function() { return setProjectError; });\nconst SET_FRAMERATE = 'tw/SET_FRAMERATE';\nconst SET_INTERPOLATION = 'tw/SET_INTERPOLATION';\nconst SET_COMPILER_OPTIONS = 'tw/SET_COMPILER_OPTIONS';\nconst SET_RUNTIME_OPTIONS = 'tw/SET_RUNTIME_OPTIONS';\nconst SET_USERNAME = 'tw/SET_USERNAME';\nconst SET_CLOUD = 'tw/SET_CLOUD';\nconst SET_HIGH_QUALITY_PEN = 'tw/SET_HIGH_QUALITY_PEN';\nconst SET_WINDOW_FULLSCREEN = 'tw/SET_WINDOW_FULLSCREEN';\nconst SET_DIMENSIONS = 'tw/SET_DIMENSIONS';\nconst SET_AUTHOR = 'tw/SET_AUTHOR';\nconst SET_DESCRIPTION = 'tw/SET_DESCRIPTION';\nconst ADD_COMPILE_ERROR = 'tw/ADD_COMPILE_ERROR';\nconst CLEAR_COMPILE_ERRORS = 'tw/CLEAR_COMPILE_ERRORS';\nconst SET_FILE_HANDLE = 'tw/SET_FILE_HANDLE';\nconst SET_USERNAME_INVALID = 'tw/SET_USERNAME_INVALID';\nconst SET_HAS_CLOUD_VARIABLES = 'tw/SET_HAS_CLOUD_VARIABLES';\nconst SET_CLOUD_HOST = 'tw/SET_CLOUD_HOST';\nconst SET_PLATFORM_MISMATCH_DETAILS = 'tw/SET_PLATFORM_MISMATCH_DETAILS';\nconst SET_PROJECT_ERROR = 'tw/SET_PROJECT_ERROR';\nconst initialState = {\n framerate: 30,\n interpolation: false,\n cloud: true,\n username: '',\n highQualityPen: false,\n compilerOptions: {\n enabled: true,\n warpTimer: false\n },\n runtimeOptions: {\n maxClones: 300,\n miscLimits: true,\n fencing: true\n },\n isWindowFullScreen: false,\n dimensions: [0, 0],\n author: {\n username: '',\n thumbnail: ''\n },\n description: {\n instructions: '',\n credits: ''\n },\n compileErrors: [],\n fileHandle: null,\n usernameInvalid: false,\n hasCloudVariables: false,\n cloudHost: '',\n platformMismatchDetails: {\n platform: null,\n callback: null\n },\n projectError: null\n};\nconst reducer = function reducer(state, action) {\n if (typeof state === 'undefined') state = initialState;\n switch (action.type) {\n case SET_FRAMERATE:\n return Object.assign({}, state, {\n framerate: action.framerate\n });\n case SET_INTERPOLATION:\n return Object.assign({}, state, {\n interpolation: action.interpolation\n });\n case SET_COMPILER_OPTIONS:\n return Object.assign({}, state, {\n compilerOptions: action.compilerOptions\n });\n case SET_RUNTIME_OPTIONS:\n return Object.assign({}, state, {\n runtimeOptions: action.runtimeOptions\n });\n case SET_USERNAME:\n return Object.assign({}, state, {\n username: action.username\n });\n case SET_CLOUD:\n return Object.assign({}, state, {\n cloud: action.cloud\n });\n case SET_HIGH_QUALITY_PEN:\n return Object.assign({}, state, {\n highQualityPen: action.highQualityPen\n });\n case SET_WINDOW_FULLSCREEN:\n return Object.assign({}, state, {\n isWindowFullScreen: action.isWindowFullScreen\n });\n case SET_DIMENSIONS:\n return Object.assign({}, state, {\n dimensions: action.dimensions\n });\n case SET_AUTHOR:\n return Object.assign({}, state, {\n author: action.author\n });\n case SET_DESCRIPTION:\n return Object.assign({}, state, {\n description: action.description\n });\n case ADD_COMPILE_ERROR:\n return Object.assign({}, state, {\n compileErrors: [action.error, ...state.compileErrors.slice(0, 7)]\n });\n case CLEAR_COMPILE_ERRORS:\n return Object.assign({}, state, {\n compileErrors: []\n });\n case SET_FILE_HANDLE:\n return Object.assign({}, state, {\n fileHandle: action.fileHandle\n });\n case SET_USERNAME_INVALID:\n return Object.assign({}, state, {\n usernameInvalid: action.usernameInvalid\n });\n case SET_HAS_CLOUD_VARIABLES:\n return Object.assign({}, state, {\n hasCloudVariables: action.hasCloudVariables\n });\n case SET_CLOUD_HOST:\n return Object.assign({}, state, {\n cloudHost: action.cloudHost\n });\n case SET_PLATFORM_MISMATCH_DETAILS:\n return Object.assign({}, state, {\n platformMismatchDetails: {\n platform: action.platform,\n callback: action.callback\n }\n });\n case SET_PROJECT_ERROR:\n return Object.assign({}, state, {\n projectError: action.projectError\n });\n default:\n return state;\n }\n};\nconst setFramerateState = function setFramerateState(framerate) {\n return {\n type: SET_FRAMERATE,\n framerate: framerate\n };\n};\nconst setInterpolationState = function setInterpolationState(interpolation) {\n return {\n type: SET_INTERPOLATION,\n interpolation: interpolation\n };\n};\nconst setCompilerOptionsState = function setCompilerOptionsState(compilerOptions) {\n return {\n type: SET_COMPILER_OPTIONS,\n compilerOptions: compilerOptions\n };\n};\nconst setRuntimeOptionsState = function setRuntimeOptionsState(runtimeOptions) {\n return {\n type: SET_RUNTIME_OPTIONS,\n runtimeOptions: runtimeOptions\n };\n};\nconst setUsername = function setUsername(username) {\n return {\n type: SET_USERNAME,\n username: username\n };\n};\nconst setCloud = function setCloud(cloud) {\n return {\n type: SET_CLOUD,\n cloud: cloud\n };\n};\nconst setHighQualityPenState = function setHighQualityPenState(highQualityPen) {\n return {\n type: SET_HIGH_QUALITY_PEN,\n highQualityPen: highQualityPen\n };\n};\nconst setIsWindowFullScreen = function setIsWindowFullScreen(isWindowFullScreen) {\n return {\n type: SET_WINDOW_FULLSCREEN,\n isWindowFullScreen: isWindowFullScreen\n };\n};\nconst setDimensions = function setDimensions(dimensions) {\n return {\n type: SET_DIMENSIONS,\n dimensions: dimensions\n };\n};\nconst setAuthor = function setAuthor(author) {\n return {\n type: SET_AUTHOR,\n author: author\n };\n};\nconst setDescription = function setDescription(description) {\n return {\n type: SET_DESCRIPTION,\n description: description\n };\n};\nconst addCompileError = function addCompileError(error) {\n return {\n type: ADD_COMPILE_ERROR,\n error: error\n };\n};\nconst clearCompileErrors = function clearCompileErrors() {\n return {\n type: CLEAR_COMPILE_ERRORS\n };\n};\nconst setFileHandle = function setFileHandle(fileHandle) {\n return {\n type: SET_FILE_HANDLE,\n fileHandle: fileHandle\n };\n};\nconst setUsernameInvalid = function setUsernameInvalid(usernameInvalid) {\n return {\n type: SET_USERNAME_INVALID,\n usernameInvalid: usernameInvalid\n };\n};\nconst setHasCloudVariables = function setHasCloudVariables(hasCloudVariables) {\n return {\n type: SET_HAS_CLOUD_VARIABLES,\n hasCloudVariables: hasCloudVariables\n };\n};\nconst setCloudHost = function setCloudHost(cloudHost) {\n return {\n type: SET_CLOUD_HOST,\n cloudHost\n };\n};\nconst setPlatformMismatchDetails = function setPlatformMismatchDetails(platform, callback) {\n return {\n type: SET_PLATFORM_MISMATCH_DETAILS,\n platform,\n callback\n };\n};\nconst setProjectError = function setProjectError(projectError) {\n return {\n type: SET_PROJECT_ERROR,\n projectError\n };\n};\n\n\n/***/ }),\n/* 24 */,\n/* 25 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// EXTERNAL MODULE: ./node_modules/@turbowarp/scratch-storage/dist/web/scratch-storage.js\nvar scratch_storage = __webpack_require__(427);\nvar scratch_storage_default = /*#__PURE__*/__webpack_require__.n(scratch_storage);\n\n// EXTERNAL MODULE: ./node_modules/react-intl/lib/index.es.js + 1 modules\nvar index_es = __webpack_require__(2);\n\n// EXTERNAL MODULE: ./src/lib/shared-messages.js\nvar shared_messages = __webpack_require__(49);\n\n// CONCATENATED MODULE: ./src/lib/default-project/project-data.js\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\n\nlet messages = Object(index_es[\"g\" /* defineMessages */])({\n variable: {\n \"id\": \"gui.defaultProject.variable\",\n \"defaultMessage\": \"my variable\"\n }\n});\nmessages = _objectSpread(_objectSpread({}, messages), shared_messages[\"a\" /* default */]);\n\n// use the default message if a translation function is not passed\nconst defaultTranslator = msgObj => msgObj.defaultMessage;\n\n/**\n * Generate a localized version of the default project\n * @param {function} translateFunction a function to use for translating the default names\n * @return {object} the project data json for the default project\n */\nconst projectData = translateFunction => {\n const translator = translateFunction || defaultTranslator;\n return {\n targets: [{\n isStage: true,\n name: 'Stage',\n variables: {\n '`jEk@4|i[#Fk?(8x)AV.-my variable': [translator(messages.variable), 0]\n },\n lists: {},\n broadcasts: {},\n blocks: {},\n currentCostume: 0,\n costumes: [{\n assetId: 'cd21514d0531fdffb22204e0ec5ed84a',\n name: translator(messages.backdrop, {\n index: 1\n }),\n md5ext: 'cd21514d0531fdffb22204e0ec5ed84a.svg',\n dataFormat: 'svg',\n rotationCenterX: 240,\n rotationCenterY: 180\n }],\n sounds: [],\n volume: 100\n }, {\n isStage: false,\n name: translator(messages.sprite, {\n index: 1\n }),\n variables: {},\n lists: {},\n broadcasts: {},\n blocks: {},\n comments: {},\n currentCostume: 0,\n costumes: [{\n assetId: '927d672925e7b99f7813735c484c6922',\n name: translator(messages.costume, {\n index: 1\n }),\n bitmapResolution: 1,\n md5ext: '927d672925e7b99f7813735c484c6922.svg',\n dataFormat: 'svg',\n rotationCenterX: 30.74937882782359,\n rotationCenterY: 58.864768144346826\n }],\n sounds: [],\n volume: 100,\n visible: true,\n x: 0,\n y: 0,\n size: 100,\n direction: 90,\n draggable: false,\n rotationStyle: 'all around'\n }],\n meta: {\n semver: '3.0.0',\n vm: '0.1.0',\n agent: ''\n }\n };\n};\n/* harmony default export */ var project_data = (projectData);\n// EXTERNAL MODULE: ./node_modules/arraybuffer-loader!./src/lib/default-project/override-default-project.sb3\nvar override_default_project = __webpack_require__(229);\nvar override_default_project_default = /*#__PURE__*/__webpack_require__.n(override_default_project);\n\n// EXTERNAL MODULE: ./node_modules/raw-loader!./src/lib/default-project/cd21514d0531fdffb22204e0ec5ed84a.svg\nvar cd21514d0531fdffb22204e0ec5ed84a = __webpack_require__(296);\nvar cd21514d0531fdffb22204e0ec5ed84a_default = /*#__PURE__*/__webpack_require__.n(cd21514d0531fdffb22204e0ec5ed84a);\n\n// EXTERNAL MODULE: ./node_modules/raw-loader!./src/lib/default-project/dango-cat.svg\nvar dango_cat = __webpack_require__(297);\nvar dango_cat_default = /*#__PURE__*/__webpack_require__.n(dango_cat);\n\n// EXTERNAL MODULE: ./src/lib/tw-text-encoder.js\nvar tw_text_encoder = __webpack_require__(147);\n\n// CONCATENATED MODULE: ./src/lib/default-project/index.js\n\n\n/* eslint-disable import/no-unresolved */\n\n\n\n/* eslint-enable import/no-unresolved */\n\nconst defaultProject = translator => {\n if (override_default_project_default.a.byteLength > 0) {\n return [{\n id: 0,\n assetType: 'Project',\n dataFormat: 'JSON',\n data: override_default_project_default.a\n }];\n }\n let _TextEncoder;\n if (typeof tw_text_encoder[\"TextEncoder\"] === 'undefined') {\n _TextEncoder = __webpack_require__(147).TextEncoder;\n } else {\n _TextEncoder = tw_text_encoder[\"TextEncoder\"];\n }\n const encoder = new _TextEncoder();\n const projectJson = project_data(translator);\n return [{\n id: 0,\n assetType: 'Project',\n dataFormat: 'JSON',\n data: JSON.stringify(projectJson)\n }, {\n id: 'cd21514d0531fdffb22204e0ec5ed84a',\n assetType: 'ImageVector',\n dataFormat: 'SVG',\n data: encoder.encode(cd21514d0531fdffb22204e0ec5ed84a_default.a)\n }, {\n id: '927d672925e7b99f7813735c484c6922',\n assetType: 'ImageVector',\n dataFormat: 'SVG',\n data: encoder.encode(dango_cat_default.a)\n }];\n};\n/* harmony default export */ var default_project = (defaultProject);\n// CONCATENATED MODULE: ./src/lib/storage.js\n\n\n\n/**\n * Wrapper for ScratchStorage which adds default web sources.\n * @todo make this more configurable\n */\nclass storage_Storage extends scratch_storage_default.a {\n constructor() {\n super();\n this.cacheDefaultProject();\n }\n addOfficialScratchWebStores() {\n this.addWebStore([this.AssetType.Project], this.getProjectGetConfig.bind(this), this.getProjectCreateConfig.bind(this), this.getProjectUpdateConfig.bind(this));\n this.addWebStore([this.AssetType.ImageVector, this.AssetType.ImageBitmap, this.AssetType.Sound, this.AssetType.Font], this.getAssetGetConfig.bind(this),\n // We set both the create and update configs to the same method because\n // storage assumes it should update if there is an assetId, but the\n // asset store uses the assetId as part of the create URI.\n this.getAssetCreateConfig.bind(this), this.getAssetCreateConfig.bind(this));\n }\n setProjectHost(projectHost) {\n this.projectHost = projectHost;\n }\n setProjectToken(projectToken) {\n this.projectToken = projectToken;\n }\n getProjectGetConfig(projectAsset) {\n const path = \"\".concat(this.projectHost, \"/\").concat(projectAsset.assetId);\n const qs = this.projectToken ? \"?token=\".concat(this.projectToken) : '';\n return path + qs;\n }\n getProjectCreateConfig() {\n return {\n url: \"\".concat(this.projectHost, \"/\"),\n withCredentials: true\n };\n }\n getProjectUpdateConfig(projectAsset) {\n return {\n url: \"\".concat(this.projectHost, \"/\").concat(projectAsset.assetId),\n withCredentials: true\n };\n }\n setAssetHost(assetHost) {\n this.assetHost = assetHost;\n }\n getAssetGetConfig(asset) {\n return \"\".concat(this.assetHost, \"/internalapi/asset/\").concat(asset.assetId, \".\").concat(asset.dataFormat, \"/get/\");\n }\n getAssetCreateConfig(asset) {\n return {\n // There is no such thing as updating assets, but storage assumes it\n // should update if there is an assetId, and the asset store uses the\n // assetId as part of the create URI. So, force the method to POST.\n // Then when storage finds this config to use for the \"update\", still POSTs\n method: 'post',\n url: \"\".concat(this.assetHost, \"/\").concat(asset.assetId, \".\").concat(asset.dataFormat),\n withCredentials: true\n };\n }\n setTranslatorFunction(translator) {\n this.translator = translator;\n this.cacheDefaultProject();\n }\n cacheDefaultProject() {\n const defaultProjectAssets = default_project(this.translator);\n defaultProjectAssets.forEach(asset => this.builtinHelper._store(this.AssetType[asset.assetType], this.DataFormat[asset.dataFormat], asset.data, asset.id));\n }\n}\nconst storage = new storage_Storage();\n/* harmony default export */ var lib_storage = __webpack_exports__[\"a\"] = (storage);\n\n/***/ }),\n/* 26 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(498);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 27 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(519);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 28 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return reducer; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"f\", function() { return initialState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return activateTab; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return BLOCKS_TAB_INDEX; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return COSTUMES_TAB_INDEX; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return SOUNDS_TAB_INDEX; });\nconst ACTIVATE_TAB = 'scratch-gui/navigation/ACTIVATE_TAB';\n\n// Constants use numbers to make it easier to work with react-tabs\nconst BLOCKS_TAB_INDEX = 0;\nconst COSTUMES_TAB_INDEX = 1;\nconst SOUNDS_TAB_INDEX = 2;\nconst initialState = {\n activeTabIndex: BLOCKS_TAB_INDEX\n};\nconst reducer = function reducer(state, action) {\n if (typeof state === 'undefined') state = initialState;\n switch (action.type) {\n case ACTIVATE_TAB:\n return Object.assign({}, state, {\n activeTabIndex: action.activeTabIndex\n });\n default:\n return state;\n }\n};\nconst activateTab = function activateTab(tab) {\n return {\n type: ACTIVATE_TAB,\n activeTabIndex: tab\n };\n};\n\n\n/***/ }),\n/* 29 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(487);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 30 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(459);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 31 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(480);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 32 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(486);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 33 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(496);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 34 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(545);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 35 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(549);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 36 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(0);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(1);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _button_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(195);\n/* harmony import */ var _button_css__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_button_css__WEBPACK_IMPORTED_MODULE_3__);\nconst _excluded = [\"className\", \"disabled\", \"iconClassName\", \"iconSrc\", \"iconWidth\", \"iconHeight\", \"onClick\", \"children\"];\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nfunction _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\nconst ButtonComponent = _ref => {\n let {\n className,\n disabled,\n iconClassName,\n iconSrc,\n iconWidth,\n iconHeight,\n onClick,\n children\n } = _ref,\n props = _objectWithoutProperties(_ref, _excluded);\n if (disabled) {\n onClick = function onClick() {};\n }\n const icon = iconSrc && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(\"img\", {\n className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(iconClassName, _button_css__WEBPACK_IMPORTED_MODULE_3___default.a.icon),\n draggable: false,\n src: iconSrc,\n height: iconHeight,\n width: iconWidth\n });\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(\"span\", _extends({\n className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_button_css__WEBPACK_IMPORTED_MODULE_3___default.a.outlinedButton, className),\n role: \"button\",\n onClick: onClick\n }, props), icon, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(\"div\", {\n className: _button_css__WEBPACK_IMPORTED_MODULE_3___default.a.content\n }, children));\n};\nButtonComponent.propTypes = {\n children: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.node,\n className: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n disabled: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n iconClassName: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n iconSrc: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n iconHeight: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n iconWidth: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n onClick: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func\n};\n/* harmony default export */ __webpack_exports__[\"a\"] = (ButtonComponent);\n\n/***/ }),\n/* 37 */,\n/* 38 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(467);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 39 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(537);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 40 */,\n/* 41 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(506);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 42 */,\n/* 43 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(472);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 44 */,\n/* 45 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return alerts; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return AlertLevels; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return AlertTypes; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2);\n/* harmony import */ var keymirror__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(42);\n/* harmony import */ var keymirror__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(keymirror__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _assets_icon_success_svg__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(110);\n/* harmony import */ var _assets_icon_success_svg__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_assets_icon_success_svg__WEBPACK_IMPORTED_MODULE_3__);\n\n\n\n\nconst AlertTypes = keymirror__WEBPACK_IMPORTED_MODULE_2___default()({\n STANDARD: null,\n EXTENSION: null,\n INLINE: null\n});\nconst AlertLevels = {\n SUCCESS: 'success',\n INFO: 'info',\n WARN: 'warn'\n};\nconst alerts = [{\n alertId: 'createSuccess',\n alertType: AlertTypes.STANDARD,\n clearList: ['createSuccess', 'creating', 'createCopySuccess', 'creatingCopy', 'createRemixSuccess', 'creatingRemix', 'saveSuccess', 'saving'],\n content: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"New project created.\",\n id: \"gui.alerts.createsuccess\"\n }),\n iconURL: _assets_icon_success_svg__WEBPACK_IMPORTED_MODULE_3___default.a,\n level: AlertLevels.SUCCESS,\n maxDisplaySecs: 5\n}, {\n alertId: 'createCopySuccess',\n alertType: AlertTypes.STANDARD,\n clearList: ['createSuccess', 'creating', 'createCopySuccess', 'creatingCopy', 'createRemixSuccess', 'creatingRemix', 'saveSuccess', 'saving'],\n content: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Project saved as a copy.\",\n id: \"gui.alerts.createcopysuccess\"\n }),\n iconURL: _assets_icon_success_svg__WEBPACK_IMPORTED_MODULE_3___default.a,\n level: AlertLevels.SUCCESS,\n maxDisplaySecs: 5\n}, {\n alertId: 'createRemixSuccess',\n alertType: AlertTypes.STANDARD,\n clearList: ['createSuccess', 'creating', 'createCopySuccess', 'creatingCopy', 'createRemixSuccess', 'creatingRemix', 'saveSuccess', 'saving'],\n content: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Project saved as a remix.\",\n id: \"gui.alerts.createremixsuccess\"\n }),\n iconURL: _assets_icon_success_svg__WEBPACK_IMPORTED_MODULE_3___default.a,\n level: AlertLevels.SUCCESS,\n maxDisplaySecs: 5\n}, {\n alertId: 'creating',\n alertType: AlertTypes.STANDARD,\n clearList: ['createSuccess', 'creating', 'createCopySuccess', 'creatingCopy', 'createRemixSuccess', 'creatingRemix', 'saveSuccess', 'saving'],\n content: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Creating new\\u2026\",\n id: \"gui.alerts.creating\"\n }),\n iconSpinner: true,\n level: AlertLevels.SUCCESS\n}, {\n alertId: 'creatingCopy',\n alertType: AlertTypes.STANDARD,\n clearList: ['createSuccess', 'creating', 'createCopySuccess', 'creatingCopy', 'createRemixSuccess', 'creatingRemix', 'saveSuccess', 'saving'],\n content: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Copying project\\u2026\",\n id: \"gui.alerts.creatingCopy\"\n }),\n iconSpinner: true,\n level: AlertLevels.SUCCESS\n}, {\n alertId: 'creatingRemix',\n alertType: AlertTypes.STANDARD,\n clearList: ['createSuccess', 'creating', 'createCopySuccess', 'creatingCopy', 'createRemixSuccess', 'creatingRemix', 'saveSuccess', 'saving'],\n content: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Remixing project\\u2026\",\n id: \"gui.alerts.creatingRemix\"\n }),\n iconSpinner: true,\n level: AlertLevels.SUCCESS\n}, {\n alertId: 'creatingError',\n clearList: ['createSuccess', 'creating', 'createCopySuccess', 'creatingCopy', 'createRemixSuccess', 'creatingRemix', 'saveSuccess', 'saving'],\n closeButton: true,\n content: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Could not create the project. Please try again!\",\n id: \"gui.alerts.creatingError\"\n }),\n level: AlertLevels.WARN\n}, {\n alertId: 'savingError',\n clearList: ['createSuccess', 'creating', 'createCopySuccess', 'creatingCopy', 'createRemixSuccess', 'creatingRemix', 'saveSuccess', 'saving'],\n showDownload: true,\n // showSaveNow: true,\n closeButton: true,\n content: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Project could not save.\",\n id: \"gui.alerts.savingError\"\n }),\n level: AlertLevels.WARN\n}, {\n alertId: 'saveSuccess',\n alertType: AlertTypes.INLINE,\n clearList: ['saveSuccess', 'saving', 'savingError', 'twSaveToDiskSuccess', 'twCreatingRestorePoint', 'twRestorePointSuccess', 'twRestorePointError'],\n content: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Project saved.\",\n id: \"gui.alerts.savesuccess\"\n }),\n iconURL: _assets_icon_success_svg__WEBPACK_IMPORTED_MODULE_3___default.a,\n level: AlertLevels.SUCCESS,\n maxDisplaySecs: 3\n}, {\n alertId: 'twSaveToDiskSuccess',\n alertType: AlertTypes.INLINE,\n clearList: ['saveSuccess', 'saving', 'savingError', 'twCreatingRestorePoint', 'twRestorePointSuccess', 'twRestorePointError'],\n content: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Saved to your computer.\",\n id: \"tw.alerts.savedToDisk\"\n }),\n iconURL: _assets_icon_success_svg__WEBPACK_IMPORTED_MODULE_3___default.a,\n level: AlertLevels.SUCCESS,\n maxDisplaySecs: 3\n}, {\n alertId: 'saving',\n alertType: AlertTypes.INLINE,\n clearList: ['saveSuccess', 'saving', 'savingError', 'twSaveToDiskSuccess', 'twCreatingRestorePoint', 'twRestorePointSuccess', 'twRestorePointError'],\n content: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Saving project\\u2026\",\n id: \"gui.alerts.saving\"\n }),\n iconSpinner: true,\n level: AlertLevels.INFO\n}, {\n alertId: 'twCreatingRestorePoint',\n alertType: AlertTypes.INLINE,\n clearList: ['twRestorePointSuccess', 'twRestorePointError'],\n content: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Creating restore point\\u2026\",\n id: \"tw.alerts.creatingRestorePoint\"\n }),\n iconSpinner: true,\n level: AlertLevels.INFO\n}, {\n alertId: 'twRestorePointSuccess',\n alertType: AlertTypes.INLINE,\n clearList: ['twCreatingRestorePoint', 'twRestorePointError'],\n content: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Access restore points in \\\"File\\\"\"\n // eslint-disable-next-line max-len\n ,\n\n id: \"tw.alerts.restorePointSuccess\"\n }),\n iconURL: _assets_icon_success_svg__WEBPACK_IMPORTED_MODULE_3___default.a,\n level: AlertLevels.SUCCESS,\n maxDisplaySecs: 3\n}, {\n alertId: 'twRestorePointError',\n alertType: AlertTypes.INLINE,\n clearList: ['twCreatingRestorePoint', 'twRestorePointSuccess'],\n content: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Could not create restore point\"\n // eslint-disable-next-line max-len\n ,\n\n id: \"tw.alerts.restorePointError\"\n }),\n iconURL: _assets_icon_success_svg__WEBPACK_IMPORTED_MODULE_3___default.a,\n level: AlertLevels.WARN,\n maxDisplaySecs: 5\n}, {\n alertId: 'cloudInfo',\n alertType: AlertTypes.STANDARD,\n clearList: ['cloudInfo'],\n content: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Please note, cloud variables only support numbers, not letters or symbols. {learnMoreLink}\" // eslint-disable-line max-len\n ,\n\n id: \"gui.alerts.cloudInfo\",\n values: {\n learnMoreLink: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(\"a\", {\n href: \"https://scratch.mit.edu/info/faq/#clouddata\",\n rel: \"noopener noreferrer\",\n target: \"_blank\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Learn more.\",\n id: \"gui.alerts.cloudInfoLearnMore\"\n }))\n }\n }),\n closeButton: true,\n level: AlertLevels.SUCCESS,\n maxDisplaySecs: 15\n}, {\n alertId: 'importingAsset',\n alertType: AlertTypes.STANDARD,\n clearList: [],\n content: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Importing\\u2026\",\n id: \"gui.alerts.importing\"\n }),\n iconSpinner: true,\n level: AlertLevels.SUCCESS\n}];\n\n\n/***/ }),\n/* 46 */,\n/* 47 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return reducer; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return initialState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return setFullScreen; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return setPlayer; });\nconst SET_FULL_SCREEN = 'scratch-gui/mode/SET_FULL_SCREEN';\nconst SET_PLAYER = 'scratch-gui/mode/SET_PLAYER';\nconst initialState = {\n isEmbedded: false,\n isFullScreen: false,\n isPlayerOnly: false,\n hasEverEnteredEditor: true\n};\nconst reducer = function reducer(state, action) {\n if (typeof state === 'undefined') state = initialState;\n switch (action.type) {\n case SET_FULL_SCREEN:\n return Object.assign({}, state, {\n isFullScreen: action.isFullScreen\n });\n case SET_PLAYER:\n return Object.assign({}, state, {\n isPlayerOnly: action.isPlayerOnly,\n hasEverEnteredEditor: state.hasEverEnteredEditor || !action.isPlayerOnly\n });\n default:\n return state;\n }\n};\nconst setFullScreen = function setFullScreen(isFullScreen) {\n return {\n type: SET_FULL_SCREEN,\n isFullScreen: isFullScreen\n };\n};\nconst setPlayer = function setPlayer(isPlayerOnly) {\n return {\n type: SET_PLAYER,\n isPlayerOnly: isPlayerOnly\n };\n};\n\n\n/***/ }),\n/* 48 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(602);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 49 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Object(react_intl__WEBPACK_IMPORTED_MODULE_0__[/* defineMessages */ \"g\"])({\n backdrop: {\n \"id\": \"gui.sharedMessages.backdrop\",\n \"defaultMessage\": \"backdrop{index}\"\n },\n costume: {\n \"id\": \"gui.sharedMessages.costume\",\n \"defaultMessage\": \"costume{index}\"\n },\n sprite: {\n \"id\": \"gui.sharedMessages.sprite\",\n \"defaultMessage\": \"Sprite{index}\"\n },\n pop: {\n \"id\": \"gui.sharedMessages.pop\",\n \"defaultMessage\": \"pop\"\n },\n replaceProjectWarning: {\n \"id\": \"gui.sharedMessages.replaceProjectWarning\",\n \"defaultMessage\": \"Replace contents of the current project?\"\n },\n loadFromComputerTitle: {\n \"id\": \"gui.sharedMessages.loadFromComputerTitle\",\n \"defaultMessage\": \"Load from your computer\"\n }\n}));\n\n/***/ }),\n/* 50 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return reducer; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return initialState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return activateDeck; });\n/* unused harmony export viewCards */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return closeCards; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"i\", function() { return shrinkExpandCards; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"g\", function() { return nextStep; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"h\", function() { return prevStep; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return dragCard; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"j\", function() { return startDrag; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"f\", function() { return endDrag; });\n/* harmony import */ var _lib_analytics__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(84);\n/* harmony import */ var _lib_libraries_decks_index_jsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(63);\n\n\nconst CLOSE_CARDS = 'scratch-gui/cards/CLOSE_CARDS';\nconst SHRINK_EXPAND_CARDS = 'scratch-gui/cards/SHRINK_EXPAND_CARDS';\nconst VIEW_CARDS = 'scratch-gui/cards/VIEW_CARDS';\nconst ACTIVATE_DECK = 'scratch-gui/cards/ACTIVATE_DECK';\nconst NEXT_STEP = 'scratch-gui/cards/NEXT_STEP';\nconst PREV_STEP = 'scratch-gui/cards/PREV_STEP';\nconst DRAG_CARD = 'scratch-gui/cards/DRAG_CARD';\nconst START_DRAG = 'scratch-gui/cards/START_DRAG';\nconst END_DRAG = 'scratch-gui/cards/END_DRAG';\nconst initialState = {\n visible: false,\n content: _lib_libraries_decks_index_jsx__WEBPACK_IMPORTED_MODULE_1__[/* default */ \"a\"],\n activeDeckId: null,\n step: 0,\n x: 0,\n y: 0,\n expanded: true,\n dragging: false\n};\nconst reducer = function reducer(state, action) {\n if (typeof state === 'undefined') state = initialState;\n switch (action.type) {\n case CLOSE_CARDS:\n return Object.assign({}, state, {\n visible: false\n });\n case SHRINK_EXPAND_CARDS:\n return Object.assign({}, state, {\n expanded: !state.expanded\n });\n case VIEW_CARDS:\n return Object.assign({}, state, {\n visible: true\n });\n case ACTIVATE_DECK:\n return Object.assign({}, state, {\n activeDeckId: action.activeDeckId,\n step: 0,\n x: 0,\n y: 0,\n expanded: true,\n visible: true\n });\n case NEXT_STEP:\n if (state.activeDeckId !== null) {\n _lib_analytics__WEBPACK_IMPORTED_MODULE_0__[/* default */ \"a\"].event({\n category: 'how-to',\n action: 'next step',\n label: \"\".concat(state.activeDeckId, \" - \").concat(state.step)\n });\n return Object.assign({}, state, {\n step: state.step + 1\n });\n }\n return state;\n case PREV_STEP:\n if (state.activeDeckId !== null) {\n if (state.step > 0) {\n return Object.assign({}, state, {\n step: state.step - 1\n });\n }\n }\n return state;\n case DRAG_CARD:\n return Object.assign({}, state, {\n x: action.x,\n y: action.y\n });\n case START_DRAG:\n return Object.assign({}, state, {\n dragging: true\n });\n case END_DRAG:\n return Object.assign({}, state, {\n dragging: false\n });\n default:\n return state;\n }\n};\nconst activateDeck = function activateDeck(activeDeckId) {\n return {\n type: ACTIVATE_DECK,\n activeDeckId\n };\n};\nconst viewCards = function viewCards() {\n return {\n type: VIEW_CARDS\n };\n};\nconst closeCards = function closeCards() {\n return {\n type: CLOSE_CARDS\n };\n};\nconst shrinkExpandCards = function shrinkExpandCards() {\n return {\n type: SHRINK_EXPAND_CARDS\n };\n};\nconst nextStep = function nextStep() {\n return {\n type: NEXT_STEP\n };\n};\nconst prevStep = function prevStep() {\n return {\n type: PREV_STEP\n };\n};\nconst dragCard = function dragCard(x, y) {\n return {\n type: DRAG_CARD,\n x,\n y\n };\n};\nconst startDrag = function startDrag() {\n return {\n type: START_DRAG\n };\n};\nconst endDrag = function endDrag() {\n return {\n type: END_DRAG\n };\n};\n\n\n/***/ }),\n/* 51 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(456);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 52 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(544);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 53 */,\n/* 54 */,\n/* 55 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return reducer; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return initialState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return setProjectChanged; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return setProjectUnchanged; });\nconst SET_PROJECT_CHANGED = 'scratch-gui/project-changed/SET_PROJECT_CHANGED';\nconst initialState = false;\nconst reducer = function reducer(state, action) {\n if (typeof state === 'undefined') state = initialState;\n switch (action.type) {\n case SET_PROJECT_CHANGED:\n return action.changed;\n default:\n return state;\n }\n};\nconst setProjectChanged = () => ({\n type: SET_PROJECT_CHANGED,\n changed: true\n});\nconst setProjectUnchanged = () => ({\n type: SET_PROJECT_CHANGED,\n changed: false\n});\n\n\n/***/ }),\n/* 56 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return reducer; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return initialState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return setProjectTitle; });\nconst SET_PROJECT_TITLE = 'projectTitle/SET_PROJECT_TITLE';\n\n// we are initializing to a blank string instead of an actual title,\n// because it would be hard to localize here\nconst initialState = '';\nconst reducer = function reducer(state, action) {\n if (typeof state === 'undefined') state = initialState;\n switch (action.type) {\n case SET_PROJECT_TITLE:\n return action.title;\n default:\n return state;\n }\n};\nconst setProjectTitle = title => ({\n type: SET_PROJECT_TITLE,\n title: title\n});\n\n\n/***/ }),\n/* 57 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nlet _ScratchBlocks = null;\nconst isLoaded = () => !!_ScratchBlocks;\nconst get = () => {\n if (!isLoaded()) {\n throw new Error('scratch-blocks is not loaded yet');\n }\n return _ScratchBlocks;\n};\nconst load = () => {\n if (_ScratchBlocks) {\n return Promise.resolve();\n }\n return __webpack_require__.e(/* import() | sb */ 94).then(__webpack_require__.t.bind(null, 657, 7)).then(m => {\n _ScratchBlocks = m.default;\n return _ScratchBlocks;\n });\n};\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n get,\n isLoaded,\n load\n});\n\n/***/ }),\n/* 58 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(455);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 59 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(536);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 60 */,\n/* 61 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// EXTERNAL MODULE: ./node_modules/react/index.js\nvar react = __webpack_require__(1);\nvar react_default = /*#__PURE__*/__webpack_require__.n(react);\n\n// EXTERNAL MODULE: ./node_modules/prop-types/index.js\nvar prop_types = __webpack_require__(0);\nvar prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);\n\n// EXTERNAL MODULE: ./src/components/crash-message/crash-message.jsx\nvar crash_message = __webpack_require__(181);\n\n// EXTERNAL MODULE: ./src/lib/log.js\nvar log = __webpack_require__(11);\n\n// CONCATENATED MODULE: ./src/containers/error-boundary.jsx\n\n\n\n\nclass error_boundary_ErrorBoundary extends react_default.a.Component {\n constructor(props) {\n super(props);\n this.state = {\n error: null,\n errorInfo: null\n };\n }\n\n /**\n * Handle an error caught by this ErrorBoundary component.\n * @param {Error} error - the error that was caught.\n * @param {React.ErrorInfo} errorInfo - the React error info associated with the error.\n */\n componentDidCatch(error, errorInfo) {\n // Error object may be undefined (IE?)\n error = error || {\n stack: 'Unknown stack',\n message: 'Unknown error'\n };\n errorInfo = errorInfo || {\n componentStack: 'Unknown component stack'\n };\n\n // only remember the first error: later errors might just be side effects of that first one\n if (!this.state.error) {\n // store error & errorInfo for debugging\n this.setState({\n error,\n errorInfo\n });\n }\n\n // report every error in the console\n log[\"default\"].error([\"Unhandled Error with action='\".concat(this.props.action, \"': \").concat(error.stack), \"Component stack: \".concat(errorInfo.componentStack)].join('\\n'));\n }\n handleBack() {\n window.history.back();\n }\n handleReload() {\n window.location.replace(window.location.origin + window.location.pathname);\n }\n formatErrorMessage() {\n let message = '';\n if (this.state.error) {\n message += \"\".concat(this.state.error);\n } else {\n message += 'Unknown error';\n }\n if (this.state.errorInfo) {\n const firstCoupleLines = this.state.errorInfo.componentStack.trim().split('\\n').slice(0, 2).map(i => i.trim());\n message += \"\\nComponent stack: \".concat(firstCoupleLines.join(' '), \" ...\");\n }\n return message;\n }\n render() {\n if (this.state.error) {\n return /*#__PURE__*/react_default.a.createElement(crash_message[\"a\" /* default */], {\n errorMessage: this.formatErrorMessage(),\n onReload: this.handleReload\n });\n }\n return this.props.children;\n }\n}\nerror_boundary_ErrorBoundary.propTypes = {\n action: prop_types_default.a.string.isRequired,\n // Used for defining tracking action\n children: prop_types_default.a.node\n};\n/* harmony default export */ var error_boundary = (error_boundary_ErrorBoundary);\n// CONCATENATED MODULE: ./src/lib/error-boundary-hoc.jsx\n\n\n\n/*\n * Higher Order Component to provide error boundary for wrapped component.\n * A curried function, call like errorHOC()().\n * @param {string} action - Label for GA tracking of errors.\n * @returns {function} a function that accepts a component to wrap.\n */\nconst error_boundary_hoc_ErrorBoundaryHOC = function ErrorBoundaryHOC(action) {\n /**\n * The function to be called with a React component to wrap it.\n * @param {React.ComponentType} WrappedComponent - Component to wrap with an error boundary.\n * @returns {React.ComponentType} the component wrapped with an error boundary.\n */\n return function (WrappedComponent) {\n const ErrorBoundaryWrapper = props => /*#__PURE__*/react_default.a.createElement(error_boundary, {\n action: action\n }, /*#__PURE__*/react_default.a.createElement(WrappedComponent, props));\n return ErrorBoundaryWrapper;\n };\n};\n/* harmony default export */ var error_boundary_hoc = __webpack_exports__[\"a\"] = (error_boundary_hoc_ErrorBoundaryHOC);\n\n/***/ }),\n/* 62 */,\n/* 63 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n // tw: remove decks. we don't use them.\n});\n\n/***/ }),\n/* 64 */,\n/* 65 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(466);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 66 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(528);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 67 */,\n/* 68 */,\n/* 69 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _input_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(232);\n/* harmony import */ var _input_css__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_input_css__WEBPACK_IMPORTED_MODULE_3__);\nconst _excluded = [\"small\"];\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nfunction _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\nconst Input = props => {\n const {\n small\n } = props,\n componentProps = _objectWithoutProperties(props, _excluded);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"input\", _extends({}, componentProps, {\n className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_input_css__WEBPACK_IMPORTED_MODULE_3___default.a.inputForm, props.className, {\n [_input_css__WEBPACK_IMPORTED_MODULE_3___default.a.inputSmall]: small\n })\n }));\n};\nInput.propTypes = {\n className: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,\n small: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool\n};\nInput.defaultProps = {\n small: false\n};\n/* harmony default export */ __webpack_exports__[\"a\"] = (Input);\n\n/***/ }),\n/* 70 */,\n/* 71 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iOHB4IiBoZWlnaHQ9IjVweCIgdmlld0JveD0iMCAwIDggNSIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgIDwhLS0gR2VuZXJhdG9yOiBTa2V0Y2ggNDguMiAoNDczMjcpIC0gaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoIC0tPgogICAgPHRpdGxlPmRyb3Bkb3duLWNhcmV0PC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGRlZnM+PC9kZWZzPgogICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9ImRyb3Bkb3duLWNhcmV0IiBmaWxsPSIjRkZGRkZGIj4KICAgICAgICAgICAgPHBhdGggZD0iTTQsNSBDMy43MjUyMDcwOCw1IDMuNDUxNjMwMDYsNC44OTY5NTA0NSAzLjI0MTI3OTczLDQuNjg5NjUzMTEgTDAuMzE0NjEzNTcyLDEuODA2NjYyMjcgQy0wLjEwNDg3MTE5MSwxLjM5MzI2NTgzIC0wLjEwNDg3MTE5MSwwLjcyNDY0MjAyMyAwLjMxNDYxMzU3MiwwLjMxMDA0NzMzMSBDMC43MzI4ODI0MzgsLTAuMTAzMzQ5MTEgNy4yNjcxMTc1NiwtMC4xMDMzNDkxMSA3LjY4NTM4NjQzLDAuMzEwMDQ3MzMxIEM4LjEwNDg3MTE5LDAuNzIzNDQzNzcyIDguMTA0ODcxMTksMS4zOTMyNjU4MyA3LjY4NTM4NjQzLDEuODA2NjYyMjcgTDQuNzU5OTM2MTcsNC42ODk2NTMxMSBDNC41NDk1ODU4Myw0Ljg5Njk1MDQ1IDQuMjc2MDA4ODIsNSA0LDUiPjwvcGF0aD4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg==\"\n\n/***/ }),\n/* 72 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return reducer; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"h\", function() { return initialState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return isTimeTravel220022BC; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return isTimeTravel1920; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return isTimeTravel1990; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return isTimeTravel2020; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"f\", function() { return isTimeTravelNow; });\n/* unused harmony export setTimeTravel220022BC */\n/* unused harmony export setTimeTravel1920 */\n/* unused harmony export setTimeTravel1990 */\n/* unused harmony export setTimeTravel2020 */\n/* unused harmony export setTimeTravelNow */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"g\", function() { return setTimeTravel; });\nconst SET_TIME_TRAVEL = 'scratch-gui/time-travel/SET_TIME_TRAVEL';\nconst initialState = {\n year: 'NOW'\n};\nconst NOW = 'NOW';\nconst YEAR_2020 = '2020';\nconst YEAR_1990 = '1990';\nconst YEAR_1920 = '1920';\nconst YEAR_220022BC = '220022BC';\nconst reducer = function reducer(state, action) {\n if (typeof state === 'undefined') state = initialState;\n switch (action.type) {\n case SET_TIME_TRAVEL:\n return Object.assign({}, state, {\n year: action.year\n });\n default:\n return state;\n }\n};\nconst isTimeTravel220022BC = function isTimeTravel220022BC(state) {\n return state.scratchGui.timeTravel.year === YEAR_220022BC;\n};\nconst setTimeTravel220022BC = function setTimeTravel220022BC() {\n return {\n type: SET_TIME_TRAVEL,\n year: YEAR_220022BC\n };\n};\nconst isTimeTravel1920 = function isTimeTravel1920(state) {\n return state.scratchGui.timeTravel.year === YEAR_1920;\n};\nconst setTimeTravel1920 = function setTimeTravel1920() {\n return {\n type: SET_TIME_TRAVEL,\n year: YEAR_1920\n };\n};\nconst isTimeTravel1990 = function isTimeTravel1990(state) {\n return state.scratchGui.timeTravel.year === YEAR_1990;\n};\nconst setTimeTravel1990 = function setTimeTravel1990() {\n return {\n type: SET_TIME_TRAVEL,\n year: YEAR_1990\n };\n};\nconst isTimeTravel2020 = function isTimeTravel2020(state) {\n return state.scratchGui.timeTravel.year === YEAR_2020;\n};\nconst setTimeTravel2020 = function setTimeTravel2020() {\n return {\n type: SET_TIME_TRAVEL,\n year: YEAR_2020\n };\n};\nconst isTimeTravelNow = function isTimeTravelNow(state) {\n return state.scratchGui.timeTravel.year === NOW;\n};\nconst setTimeTravelNow = function setTimeTravelNow() {\n return {\n type: SET_TIME_TRAVEL,\n year: NOW\n };\n};\nconst setTimeTravel = function setTimeTravel(mode) {\n return {\n type: SET_TIME_TRAVEL,\n year: mode\n };\n};\n\n\n/***/ }),\n/* 73 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return reducer; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return initialState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return setRunningState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return setStartedState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return setTurboState; });\nconst SET_RUNNING_STATE = 'scratch-gui/vm-status/SET_RUNNING_STATE';\nconst SET_TURBO_STATE = 'scratch-gui/vm-status/SET_TURBO_STATE';\nconst SET_STARTED_STATE = 'scratch-gui/vm-status/SET_STARTED_STATE';\nconst initialState = {\n running: false,\n started: false,\n turbo: false\n};\nconst reducer = function reducer(state, action) {\n if (typeof state === 'undefined') state = initialState;\n switch (action.type) {\n case SET_STARTED_STATE:\n return Object.assign({}, state, {\n started: action.started\n });\n case SET_RUNNING_STATE:\n return Object.assign({}, state, {\n running: action.running\n });\n case SET_TURBO_STATE:\n return Object.assign({}, state, {\n turbo: action.turbo\n });\n default:\n return state;\n }\n};\nconst setStartedState = function setStartedState(started) {\n return {\n type: SET_STARTED_STATE,\n started: started\n };\n};\nconst setRunningState = function setRunningState(running) {\n return {\n type: SET_RUNNING_STATE,\n running: running\n };\n};\nconst setTurboState = function setTurboState(turbo) {\n return {\n type: SET_TURBO_STATE,\n turbo: turbo\n };\n};\n\n\n/***/ }),\n/* 74 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(481);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 75 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(507);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 76 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(525);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 77 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(534);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 78 */,\n/* 79 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return reducer; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return initialState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return setRestore; });\nconst RESTORE_UPDATE = 'scratch-gui/restore-deletion/RESTORE_UPDATE';\nconst initialState = {\n restoreFun: null,\n deletedItem: ''\n};\nconst reducer = function reducer(state, action) {\n if (typeof state === 'undefined') state = initialState;\n switch (action.type) {\n case RESTORE_UPDATE:\n return Object.assign({}, state, action.state);\n default:\n return state;\n }\n};\nconst setRestore = function setRestore(state) {\n return {\n type: RESTORE_UPDATE,\n state: {\n restoreFun: state.restoreFun,\n deletedItem: state.deletedItem\n }\n };\n};\n\n\n/***/ }),\n/* 80 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return reducer; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return initialState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return setTheme; });\n/* harmony import */ var _lib_themes_themePersistance__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(78);\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\nconst SET_THEME = 'scratch-gui/theme/SET_THEME';\nconst initialState = {\n theme: Object(_lib_themes_themePersistance__WEBPACK_IMPORTED_MODULE_0__[/* detectTheme */ \"a\"])()\n};\nconst reducer = function reducer() {\n let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;\n let action = arguments.length > 1 ? arguments[1] : undefined;\n switch (action.type) {\n case SET_THEME:\n return _objectSpread(_objectSpread({}, state), {}, {\n theme: action.theme\n });\n default:\n return state;\n }\n};\nconst setTheme = theme => ({\n type: SET_THEME,\n theme\n});\n\n\n/***/ }),\n/* 81 */,\n/* 82 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return galleryLoading; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return galleryMore; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return galleryError; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2);\n/* harmony import */ var _music_music_png__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(267);\n/* harmony import */ var _music_music_png__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_music_music_png__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _music_music_small_svg__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(268);\n/* harmony import */ var _music_music_small_svg__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_music_music_small_svg__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _pen_pen_png__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(269);\n/* harmony import */ var _pen_pen_png__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_pen_pen_png__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _pen_pen_small_svg__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(270);\n/* harmony import */ var _pen_pen_small_svg__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_pen_pen_small_svg__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _videoSensing_video_sensing_png__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(271);\n/* harmony import */ var _videoSensing_video_sensing_png__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_videoSensing_video_sensing_png__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _videoSensing_video_sensing_small_svg__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(272);\n/* harmony import */ var _videoSensing_video_sensing_small_svg__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_videoSensing_video_sensing_small_svg__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _faceSensing_face_sensing_svg__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(273);\n/* harmony import */ var _faceSensing_face_sensing_svg__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_faceSensing_face_sensing_svg__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var _faceSensing_face_sensing_small_svg__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(274);\n/* harmony import */ var _faceSensing_face_sensing_small_svg__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_faceSensing_face_sensing_small_svg__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var _text2speech_text2speech_png__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(275);\n/* harmony import */ var _text2speech_text2speech_png__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(_text2speech_text2speech_png__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var _text2speech_text2speech_small_svg__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(276);\n/* harmony import */ var _text2speech_text2speech_small_svg__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(_text2speech_text2speech_small_svg__WEBPACK_IMPORTED_MODULE_11__);\n/* harmony import */ var _translate_translate_png__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(277);\n/* harmony import */ var _translate_translate_png__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(_translate_translate_png__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var _translate_translate_small_png__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(278);\n/* harmony import */ var _translate_translate_small_png__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(_translate_translate_small_png__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var _makeymakey_makeymakey_png__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(279);\n/* harmony import */ var _makeymakey_makeymakey_png__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(_makeymakey_makeymakey_png__WEBPACK_IMPORTED_MODULE_14__);\n/* harmony import */ var _makeymakey_makeymakey_small_svg__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(280);\n/* harmony import */ var _makeymakey_makeymakey_small_svg__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(_makeymakey_makeymakey_small_svg__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var _microbit_microbit_png__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(281);\n/* harmony import */ var _microbit_microbit_png__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(_microbit_microbit_png__WEBPACK_IMPORTED_MODULE_16__);\n/* harmony import */ var _microbit_microbit_small_svg__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(175);\n/* harmony import */ var _microbit_microbit_small_svg__WEBPACK_IMPORTED_MODULE_17___default = /*#__PURE__*/__webpack_require__.n(_microbit_microbit_small_svg__WEBPACK_IMPORTED_MODULE_17__);\n/* harmony import */ var _microbit_microbit_illustration_svg__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(282);\n/* harmony import */ var _microbit_microbit_illustration_svg__WEBPACK_IMPORTED_MODULE_18___default = /*#__PURE__*/__webpack_require__.n(_microbit_microbit_illustration_svg__WEBPACK_IMPORTED_MODULE_18__);\n/* harmony import */ var _ev3_ev3_png__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(283);\n/* harmony import */ var _ev3_ev3_png__WEBPACK_IMPORTED_MODULE_19___default = /*#__PURE__*/__webpack_require__.n(_ev3_ev3_png__WEBPACK_IMPORTED_MODULE_19__);\n/* harmony import */ var _ev3_ev3_small_svg__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(176);\n/* harmony import */ var _ev3_ev3_small_svg__WEBPACK_IMPORTED_MODULE_20___default = /*#__PURE__*/__webpack_require__.n(_ev3_ev3_small_svg__WEBPACK_IMPORTED_MODULE_20__);\n/* harmony import */ var _ev3_ev3_hub_illustration_svg__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(284);\n/* harmony import */ var _ev3_ev3_hub_illustration_svg__WEBPACK_IMPORTED_MODULE_21___default = /*#__PURE__*/__webpack_require__.n(_ev3_ev3_hub_illustration_svg__WEBPACK_IMPORTED_MODULE_21__);\n/* harmony import */ var _wedo2_wedo_png__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(285);\n/* harmony import */ var _wedo2_wedo_png__WEBPACK_IMPORTED_MODULE_22___default = /*#__PURE__*/__webpack_require__.n(_wedo2_wedo_png__WEBPACK_IMPORTED_MODULE_22__);\n/* harmony import */ var _wedo2_wedo_small_svg__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(177);\n/* harmony import */ var _wedo2_wedo_small_svg__WEBPACK_IMPORTED_MODULE_23___default = /*#__PURE__*/__webpack_require__.n(_wedo2_wedo_small_svg__WEBPACK_IMPORTED_MODULE_23__);\n/* harmony import */ var _wedo2_wedo_illustration_svg__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(286);\n/* harmony import */ var _wedo2_wedo_illustration_svg__WEBPACK_IMPORTED_MODULE_24___default = /*#__PURE__*/__webpack_require__.n(_wedo2_wedo_illustration_svg__WEBPACK_IMPORTED_MODULE_24__);\n/* harmony import */ var _wedo2_wedo_button_illustration_svg__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(287);\n/* harmony import */ var _wedo2_wedo_button_illustration_svg__WEBPACK_IMPORTED_MODULE_25___default = /*#__PURE__*/__webpack_require__.n(_wedo2_wedo_button_illustration_svg__WEBPACK_IMPORTED_MODULE_25__);\n/* harmony import */ var _boost_boost_png__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(288);\n/* harmony import */ var _boost_boost_png__WEBPACK_IMPORTED_MODULE_26___default = /*#__PURE__*/__webpack_require__.n(_boost_boost_png__WEBPACK_IMPORTED_MODULE_26__);\n/* harmony import */ var _boost_boost_small_svg__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(178);\n/* harmony import */ var _boost_boost_small_svg__WEBPACK_IMPORTED_MODULE_27___default = /*#__PURE__*/__webpack_require__.n(_boost_boost_small_svg__WEBPACK_IMPORTED_MODULE_27__);\n/* harmony import */ var _boost_boost_illustration_svg__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(289);\n/* harmony import */ var _boost_boost_illustration_svg__WEBPACK_IMPORTED_MODULE_28___default = /*#__PURE__*/__webpack_require__.n(_boost_boost_illustration_svg__WEBPACK_IMPORTED_MODULE_28__);\n/* harmony import */ var _boost_boost_button_illustration_svg__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(290);\n/* harmony import */ var _boost_boost_button_illustration_svg__WEBPACK_IMPORTED_MODULE_29___default = /*#__PURE__*/__webpack_require__.n(_boost_boost_button_illustration_svg__WEBPACK_IMPORTED_MODULE_29__);\n/* harmony import */ var _gdxfor_gdxfor_png__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(291);\n/* harmony import */ var _gdxfor_gdxfor_png__WEBPACK_IMPORTED_MODULE_30___default = /*#__PURE__*/__webpack_require__.n(_gdxfor_gdxfor_png__WEBPACK_IMPORTED_MODULE_30__);\n/* harmony import */ var _gdxfor_gdxfor_small_svg__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(179);\n/* harmony import */ var _gdxfor_gdxfor_small_svg__WEBPACK_IMPORTED_MODULE_31___default = /*#__PURE__*/__webpack_require__.n(_gdxfor_gdxfor_small_svg__WEBPACK_IMPORTED_MODULE_31__);\n/* harmony import */ var _gdxfor_gdxfor_illustration_svg__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(292);\n/* harmony import */ var _gdxfor_gdxfor_illustration_svg__WEBPACK_IMPORTED_MODULE_32___default = /*#__PURE__*/__webpack_require__.n(_gdxfor_gdxfor_illustration_svg__WEBPACK_IMPORTED_MODULE_32__);\n/* harmony import */ var _tw_tw_svg__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(293);\n/* harmony import */ var _tw_tw_svg__WEBPACK_IMPORTED_MODULE_33___default = /*#__PURE__*/__webpack_require__.n(_tw_tw_svg__WEBPACK_IMPORTED_MODULE_33__);\n/* harmony import */ var _custom_custom_svg__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(294);\n/* harmony import */ var _custom_custom_svg__WEBPACK_IMPORTED_MODULE_34___default = /*#__PURE__*/__webpack_require__.n(_custom_custom_svg__WEBPACK_IMPORTED_MODULE_34__);\n/* harmony import */ var _custom_return_svg__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(295);\n/* harmony import */ var _custom_return_svg__WEBPACK_IMPORTED_MODULE_35___default = /*#__PURE__*/__webpack_require__.n(_custom_return_svg__WEBPACK_IMPORTED_MODULE_35__);\n/* harmony import */ var _gallery_gallery_svg__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(194);\n/* harmony import */ var _gallery_gallery_svg__WEBPACK_IMPORTED_MODULE_36___default = /*#__PURE__*/__webpack_require__.n(_gallery_gallery_svg__WEBPACK_IMPORTED_MODULE_36__);\n/* harmony import */ var _brand__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(24);\n/* harmony import */ var _brand__WEBPACK_IMPORTED_MODULE_37___default = /*#__PURE__*/__webpack_require__.n(_brand__WEBPACK_IMPORTED_MODULE_37__);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n // TODO: Rename file names to match variable/prop names?\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ([{\n name: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Music\",\n id: \"gui.extension.music.name\"\n }),\n extensionId: 'music',\n iconURL: _music_music_png__WEBPACK_IMPORTED_MODULE_2___default.a,\n insetIconURL: _music_music_small_svg__WEBPACK_IMPORTED_MODULE_3___default.a,\n description: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Play instruments and drums.\",\n id: \"gui.extension.music.description\"\n }),\n tags: ['scratch'],\n featured: true\n}, {\n name: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Pen\",\n id: \"gui.extension.pen.name\"\n }),\n extensionId: 'pen',\n iconURL: _pen_pen_png__WEBPACK_IMPORTED_MODULE_4___default.a,\n insetIconURL: _pen_pen_small_svg__WEBPACK_IMPORTED_MODULE_5___default.a,\n description: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Draw with your sprites.\",\n id: \"gui.extension.pen.description\"\n }),\n tags: ['scratch'],\n featured: true\n}, {\n name: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Video Sensing\",\n id: \"gui.extension.videosensing.name\"\n }),\n extensionId: 'videoSensing',\n iconURL: _videoSensing_video_sensing_png__WEBPACK_IMPORTED_MODULE_6___default.a,\n insetIconURL: _videoSensing_video_sensing_small_svg__WEBPACK_IMPORTED_MODULE_7___default.a,\n description: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Sense motion with the camera.\",\n id: \"gui.extension.videosensing.description\"\n }),\n tags: ['scratch'],\n featured: true\n}, {\n name: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Face Sensing\",\n id: \"tw.extension.faceSensing.name\"\n }),\n extensionId: 'faceSensing',\n extensionURL: 'https://extensions.turbowarp.org/lab/face-sensing.js',\n iconURL: _faceSensing_face_sensing_svg__WEBPACK_IMPORTED_MODULE_8___default.a,\n insetIconURL: _faceSensing_face_sensing_small_svg__WEBPACK_IMPORTED_MODULE_9___default.a,\n description: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Sense faces with the camera.\",\n id: \"tw.extension.faceSensing.description\"\n }),\n tags: ['scratch'],\n featured: true\n}, {\n name: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Text to Speech\",\n id: \"gui.extension.text2speech.name\"\n }),\n extensionId: 'text2speech',\n collaborator: 'Amazon Web Services',\n iconURL: _text2speech_text2speech_png__WEBPACK_IMPORTED_MODULE_10___default.a,\n insetIconURL: _text2speech_text2speech_small_svg__WEBPACK_IMPORTED_MODULE_11___default.a,\n description: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Make your projects talk.\",\n id: \"gui.extension.text2speech.description\"\n }),\n tags: ['scratch'],\n featured: true,\n internetConnectionRequired: true\n}, {\n name: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Translate\",\n id: \"gui.extension.translate.name\"\n }),\n extensionId: 'translate',\n collaborator: 'Google',\n iconURL: _translate_translate_png__WEBPACK_IMPORTED_MODULE_12___default.a,\n insetIconURL: _translate_translate_small_png__WEBPACK_IMPORTED_MODULE_13___default.a,\n description: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Translate text into many languages.\",\n id: \"gui.extension.translate.description\"\n }),\n tags: ['scratch'],\n featured: true,\n internetConnectionRequired: true\n}, {\n name: 'Makey Makey',\n extensionId: 'makeymakey',\n collaborator: 'JoyLabz',\n iconURL: _makeymakey_makeymakey_png__WEBPACK_IMPORTED_MODULE_14___default.a,\n insetIconURL: _makeymakey_makeymakey_small_svg__WEBPACK_IMPORTED_MODULE_15___default.a,\n description: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Make anything into a key.\",\n id: \"gui.extension.makeymakey.description\"\n }),\n tags: ['scratch'],\n featured: true\n}, {\n name: 'micro:bit',\n extensionId: 'microbit',\n collaborator: 'micro:bit',\n iconURL: _microbit_microbit_png__WEBPACK_IMPORTED_MODULE_16___default.a,\n insetIconURL: _microbit_microbit_small_svg__WEBPACK_IMPORTED_MODULE_17___default.a,\n description: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Connect your projects with the world.\",\n id: \"gui.extension.microbit.description\"\n }),\n tags: ['scratch'],\n featured: true,\n disabled: false,\n bluetoothRequired: true,\n internetConnectionRequired: true,\n launchPeripheralConnectionFlow: true,\n useAutoScan: false,\n connectionIconURL: _microbit_microbit_illustration_svg__WEBPACK_IMPORTED_MODULE_18___default.a,\n connectionSmallIconURL: _microbit_microbit_small_svg__WEBPACK_IMPORTED_MODULE_17___default.a,\n connectingMessage: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Connecting\",\n id: \"gui.extension.microbit.connectingMessage\"\n }),\n helpLink: 'https://scratch.mit.edu/microbit'\n}, {\n name: 'LEGO MINDSTORMS EV3',\n extensionId: 'ev3',\n collaborator: 'LEGO',\n iconURL: _ev3_ev3_png__WEBPACK_IMPORTED_MODULE_19___default.a,\n insetIconURL: _ev3_ev3_small_svg__WEBPACK_IMPORTED_MODULE_20___default.a,\n description: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Build interactive robots and more.\",\n id: \"gui.extension.ev3.description\"\n }),\n tags: ['scratch'],\n featured: true,\n disabled: false,\n bluetoothRequired: true,\n internetConnectionRequired: true,\n launchPeripheralConnectionFlow: true,\n useAutoScan: false,\n connectionIconURL: _ev3_ev3_hub_illustration_svg__WEBPACK_IMPORTED_MODULE_21___default.a,\n connectionSmallIconURL: _ev3_ev3_small_svg__WEBPACK_IMPORTED_MODULE_20___default.a,\n connectingMessage: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Connecting. Make sure the pin on your EV3 is set to 1234.\",\n id: \"gui.extension.ev3.connectingMessage\"\n }),\n helpLink: 'https://scratch.mit.edu/ev3'\n}, {\n name: 'LEGO BOOST',\n extensionId: 'boost',\n collaborator: 'LEGO',\n iconURL: _boost_boost_png__WEBPACK_IMPORTED_MODULE_26___default.a,\n insetIconURL: _boost_boost_small_svg__WEBPACK_IMPORTED_MODULE_27___default.a,\n description: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Bring robotic creations to life.\",\n id: \"gui.extension.boost.description\"\n }),\n tags: ['scratch'],\n featured: true,\n disabled: false,\n bluetoothRequired: true,\n internetConnectionRequired: true,\n launchPeripheralConnectionFlow: true,\n useAutoScan: true,\n connectionIconURL: _boost_boost_illustration_svg__WEBPACK_IMPORTED_MODULE_28___default.a,\n connectionSmallIconURL: _boost_boost_small_svg__WEBPACK_IMPORTED_MODULE_27___default.a,\n connectionTipIconURL: _boost_boost_button_illustration_svg__WEBPACK_IMPORTED_MODULE_29___default.a,\n connectingMessage: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Connecting\",\n id: \"gui.extension.boost.connectingMessage\"\n }),\n helpLink: 'https://scratch.mit.edu/boost'\n}, {\n name: 'LEGO Education WeDo 2.0',\n extensionId: 'wedo2',\n collaborator: 'LEGO',\n iconURL: _wedo2_wedo_png__WEBPACK_IMPORTED_MODULE_22___default.a,\n insetIconURL: _wedo2_wedo_small_svg__WEBPACK_IMPORTED_MODULE_23___default.a,\n description: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Build with motors and sensors.\",\n id: \"gui.extension.wedo2.description\"\n }),\n tags: ['scratch'],\n featured: true,\n disabled: false,\n bluetoothRequired: true,\n internetConnectionRequired: true,\n launchPeripheralConnectionFlow: true,\n useAutoScan: true,\n connectionIconURL: _wedo2_wedo_illustration_svg__WEBPACK_IMPORTED_MODULE_24___default.a,\n connectionSmallIconURL: _wedo2_wedo_small_svg__WEBPACK_IMPORTED_MODULE_23___default.a,\n connectionTipIconURL: _wedo2_wedo_button_illustration_svg__WEBPACK_IMPORTED_MODULE_25___default.a,\n connectingMessage: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Connecting\",\n id: \"gui.extension.wedo2.connectingMessage\"\n }),\n helpLink: 'https://scratch.mit.edu/wedo'\n}, {\n name: 'Go Direct Force & Acceleration',\n extensionId: 'gdxfor',\n collaborator: 'Vernier',\n iconURL: _gdxfor_gdxfor_png__WEBPACK_IMPORTED_MODULE_30___default.a,\n insetIconURL: _gdxfor_gdxfor_small_svg__WEBPACK_IMPORTED_MODULE_31___default.a,\n description: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Sense push, pull, motion, and spin.\",\n id: \"gui.extension.gdxfor.description\"\n }),\n tags: ['scratch'],\n featured: true,\n disabled: false,\n bluetoothRequired: true,\n internetConnectionRequired: true,\n launchPeripheralConnectionFlow: true,\n useAutoScan: false,\n connectionIconURL: _gdxfor_gdxfor_illustration_svg__WEBPACK_IMPORTED_MODULE_32___default.a,\n connectionSmallIconURL: _gdxfor_gdxfor_small_svg__WEBPACK_IMPORTED_MODULE_31___default.a,\n connectingMessage: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Connecting\",\n id: \"gui.extension.gdxfor.connectingMessage\"\n }),\n helpLink: 'https://scratch.mit.edu/vernier'\n}, {\n // not really an extension, but it's easiest to present it as one\n name: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Custom Reporters\",\n id: \"tw.customReporters.name\"\n }),\n extensionId: 'procedures_enable_return',\n iconURL: _custom_return_svg__WEBPACK_IMPORTED_MODULE_35___default.a,\n description: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Allow custom blocks to output values and be used as inputs.\",\n id: \"tw.customReporters.description\"\n }),\n tags: ['tw'],\n incompatibleWithScratch: true,\n featured: true\n}, {\n name: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"{APP_NAME} Blocks\",\n id: \"tw.twExtension.name\",\n values: {\n APP_NAME: _brand__WEBPACK_IMPORTED_MODULE_37__[\"APP_NAME\"]\n }\n }),\n extensionId: 'tw',\n iconURL: _tw_tw_svg__WEBPACK_IMPORTED_MODULE_33___default.a,\n description: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Weird new blocks.\",\n id: \"tw.twExtension.description\"\n }),\n incompatibleWithScratch: true,\n tags: ['tw'],\n featured: true\n}, {\n name: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Custom Extension\",\n id: \"tw.customExtension.name\"\n }),\n extensionId: 'custom_extension',\n iconURL: _custom_custom_svg__WEBPACK_IMPORTED_MODULE_34___default.a,\n description: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Load custom extensions from URLs, files, or JavaScript source code.\",\n id: \"tw.customExtension.description\"\n }),\n tags: ['tw'],\n featured: true\n // Not marked as incompatible with Scratch so that clicking on it doesn't show a prompt\n}]);\nconst galleryLoading = {\n name: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"{APP_NAME} Extension Gallery\",\n id: \"tw.extensionGallery.name\",\n values: {\n APP_NAME: _brand__WEBPACK_IMPORTED_MODULE_37__[\"APP_NAME\"]\n }\n }),\n href: 'https://extensions.turbowarp.org/',\n extensionId: 'gallery',\n iconURL: _gallery_gallery_svg__WEBPACK_IMPORTED_MODULE_36___default.a,\n description: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"]\n // eslint-disable-next-line max-len\n , {\n defaultMessage: \"Loading extension gallery...\",\n id: \"tw.extensionGallery.loading\"\n }),\n tags: ['tw'],\n featured: true\n};\nconst galleryMore = {\n name: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"{APP_NAME} Extension Gallery\",\n id: \"tw.extensionGallery.name\",\n values: {\n APP_NAME: _brand__WEBPACK_IMPORTED_MODULE_37__[\"APP_NAME\"]\n }\n }),\n href: 'https://extensions.turbowarp.org/',\n extensionId: 'gallery',\n iconURL: _gallery_gallery_svg__WEBPACK_IMPORTED_MODULE_36___default.a,\n description: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"]\n // eslint-disable-next-line max-len\n , {\n defaultMessage: \"Learn more about extensions at extensions.turbowarp.org.\",\n id: \"tw.extensionGallery.more\"\n }),\n tags: ['tw'],\n featured: true\n};\nconst galleryError = {\n name: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"{APP_NAME} Extension Gallery\",\n id: \"tw.extensionGallery.name\",\n values: {\n APP_NAME: _brand__WEBPACK_IMPORTED_MODULE_37__[\"APP_NAME\"]\n }\n }),\n href: 'https://extensions.turbowarp.org/',\n extensionId: 'gallery',\n iconURL: _gallery_gallery_svg__WEBPACK_IMPORTED_MODULE_36___default.a,\n description: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__[/* FormattedMessage */ \"b\"]\n // eslint-disable-next-line max-len\n , {\n defaultMessage: \"Error loading extension gallery. Visit extensions.turbowarp.org to find more extensions.\",\n id: \"tw.extensionGallery.error\"\n }),\n tags: ['tw'],\n featured: true\n};\n\n/***/ }),\n/* 83 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return reducer; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return initialState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return defaultStageSize; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return setCustomStageSize; });\nconst SET_CUSTOM_STAGE_SIZE = 'tw/custom-stage-size/SET';\nconst getDimensions = () => {\n // Running in node.js\n if (typeof URLSearchParams === 'undefined') {\n return null;\n }\n const urlParameters = new URLSearchParams(location.search);\n const dimensionsQuery = urlParameters.get('size');\n if (dimensionsQuery === null) {\n return null;\n }\n const match = dimensionsQuery.match(/^(\\d+)[^\\d]+(\\d+)$/);\n if (!match) {\n // eslint-disable-next-line no-alert\n alert('Could not parse custom stage size');\n return null;\n }\n const [_, widthText, heightText] = match;\n if (!widthText || !heightText) {\n return null;\n }\n const width = Math.max(0, Math.min(4096, +widthText));\n const height = Math.max(0, Math.min(4096, +heightText));\n return {\n width,\n height\n };\n};\nconst defaultStageSize = {\n width: 480,\n height: 360\n};\nconst initialState = getDimensions() || defaultStageSize;\nconst reducer = function reducer(state, action) {\n if (typeof state === 'undefined') state = initialState;\n switch (action.type) {\n case SET_CUSTOM_STAGE_SIZE:\n return Object.assign({}, state, {\n width: action.width,\n height: action.height\n });\n default:\n return state;\n }\n};\nconst setCustomStageSize = function setCustomStageSize(width, height) {\n return {\n type: SET_CUSTOM_STAGE_SIZE,\n width,\n height\n };\n};\n\n\n/***/ }),\n/* 84 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nconst GoogleAnalytics = {\n // Disable Scratch's analytics\n event() {}\n};\n/* harmony default export */ __webpack_exports__[\"a\"] = (GoogleAnalytics);\n\n/***/ }),\n/* 85 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return reducer; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return initialState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return addMonitorRect; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return getInitialPosition; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return moveMonitorRect; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"h\", function() { return resizeMonitorRect; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"f\", function() { return removeMonitorRect; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"g\", function() { return resetMonitorLayout; });\n/* unused harmony export PADDING */\n/* unused harmony export SCREEN_HEIGHT */\n/* unused harmony export SCREEN_WIDTH */\n/* harmony import */ var _lib_log__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(11);\n\nconst ADD_MONITOR_RECT = 'scratch-gui/monitors/ADD_MONITOR_RECT';\nconst MOVE_MONITOR_RECT = 'scratch-gui/monitors/MOVE_MONITOR_RECT';\nconst RESIZE_MONITOR_RECT = 'scratch-gui/monitors/RESIZE_MONITOR_RECT';\nconst REMOVE_MONITOR_RECT = 'scratch-gui/monitors/REMOVE_MONITOR_RECT';\nconst RESET_MONITOR_LAYOUT = 'scratch-gui/monitors/RESET_MONITOR_LAYOUT';\nconst initialState = {\n monitors: {},\n savedMonitorPositions: {}\n};\n\n// Verify that the rectangle formed by the 2 points is well-formed\nconst _verifyRect = function _verifyRect(upperStart, lowerEnd) {\n if (isNaN(upperStart.x) || isNaN(upperStart.y) || isNaN(lowerEnd.x) || isNaN(lowerEnd.y)) {\n return false;\n }\n if (!(upperStart.x < lowerEnd.x)) {\n return false;\n }\n if (!(upperStart.y < lowerEnd.y)) {\n return false;\n }\n return true;\n};\nconst _addMonitorRect = function _addMonitorRect(state, action) {\n if (Object.prototype.hasOwnProperty.call(state.monitors, action.monitorId)) {\n _lib_log__WEBPACK_IMPORTED_MODULE_0__[\"default\"].error(\"Can't add monitor, monitor with id \".concat(action.monitorId, \" already exists.\"));\n return state;\n }\n if (!_verifyRect(action.upperStart, action.lowerEnd)) {\n _lib_log__WEBPACK_IMPORTED_MODULE_0__[\"default\"].error(\"Monitor rectangle not formatted correctly\");\n return state;\n }\n return {\n monitors: Object.assign({}, state.monitors, {\n [action.monitorId]: {\n upperStart: action.upperStart,\n lowerEnd: action.lowerEnd\n }\n }),\n savedMonitorPositions: action.savePosition ? Object.assign({}, state.savedMonitorPositions, {\n [action.monitorId]: {\n x: action.upperStart.x,\n y: action.upperStart.y\n }\n }) : state.savedMonitorPositions\n };\n};\nconst _moveMonitorRect = function _moveMonitorRect(state, action) {\n if (!Object.prototype.hasOwnProperty.call(state.monitors, action.monitorId)) {\n _lib_log__WEBPACK_IMPORTED_MODULE_0__[\"default\"].error(\"Can't move monitor, monitor with id \".concat(action.monitorId, \" does not exist.\"));\n return state;\n }\n if (isNaN(action.newX) || isNaN(action.newY)) {\n _lib_log__WEBPACK_IMPORTED_MODULE_0__[\"default\"].error(\"Monitor rectangle not formatted correctly\");\n return state;\n }\n const oldMonitor = state.monitors[action.monitorId];\n if (oldMonitor.upperStart.x === action.newX && oldMonitor.upperStart.y === action.newY) {\n // Hasn't moved\n return state;\n }\n const monitorWidth = oldMonitor.lowerEnd.x - oldMonitor.upperStart.x;\n const monitorHeight = oldMonitor.lowerEnd.y - oldMonitor.upperStart.y;\n return {\n monitors: Object.assign({}, state.monitors, {\n [action.monitorId]: {\n upperStart: {\n x: action.newX,\n y: action.newY\n },\n lowerEnd: {\n x: action.newX + monitorWidth,\n y: action.newY + monitorHeight\n }\n }\n }),\n // User generated position is saved\n savedMonitorPositions: Object.assign({}, state.savedMonitorPositions, {\n [action.monitorId]: {\n x: action.newX,\n y: action.newY\n }\n })\n };\n};\nconst _resizeMonitorRect = function _resizeMonitorRect(state, action) {\n if (!Object.prototype.hasOwnProperty.call(state.monitors, action.monitorId)) {\n _lib_log__WEBPACK_IMPORTED_MODULE_0__[\"default\"].error(\"Can't resize monitor, monitor with id \".concat(action.monitorId, \" does not exist.\"));\n return state;\n }\n if (isNaN(action.newWidth) || isNaN(action.newHeight) || action.newWidth <= 0 || action.newHeight <= 0) {\n _lib_log__WEBPACK_IMPORTED_MODULE_0__[\"default\"].error(\"Monitor rectangle not formatted correctly\");\n return state;\n }\n const oldMonitor = state.monitors[action.monitorId];\n const newMonitor = {\n upperStart: oldMonitor.upperStart,\n lowerEnd: {\n x: oldMonitor.upperStart.x + action.newWidth,\n y: oldMonitor.upperStart.y + action.newHeight\n }\n };\n if (newMonitor.lowerEnd.x === oldMonitor.lowerEnd.x && newMonitor.lowerEnd.y === oldMonitor.lowerEnd.y) {\n // no change\n return state;\n }\n return {\n monitors: Object.assign({}, state.monitors, {\n [action.monitorId]: newMonitor\n }),\n savedMonitorPositions: state.savedMonitorPositions\n };\n};\nconst _removeMonitorRect = function _removeMonitorRect(state, action) {\n if (!Object.prototype.hasOwnProperty.call(state.monitors, action.monitorId)) {\n _lib_log__WEBPACK_IMPORTED_MODULE_0__[\"default\"].error(\"Can't remove monitor, monitor with id \".concat(action.monitorId, \" does not exist.\"));\n return state;\n }\n const newMonitors = Object.assign({}, state.monitors);\n delete newMonitors[action.monitorId];\n return {\n monitors: newMonitors,\n savedMonitorPositions: state.savedMonitorPositions\n };\n};\nconst reducer = function reducer(state, action) {\n if (typeof state === 'undefined') state = initialState;\n switch (action.type) {\n case ADD_MONITOR_RECT:\n return _addMonitorRect(state, action);\n case MOVE_MONITOR_RECT:\n return _moveMonitorRect(state, action);\n case RESIZE_MONITOR_RECT:\n return _resizeMonitorRect(state, action);\n case REMOVE_MONITOR_RECT:\n return _removeMonitorRect(state, action);\n case RESET_MONITOR_LAYOUT:\n return initialState;\n default:\n return state;\n }\n};\n\n// Init position --------------------------\nconst PADDING = 5;\n// @todo fix these numbers when we fix https://github.com/LLK/scratch-gui/issues/980\nconst SCREEN_WIDTH = 400;\nconst SCREEN_HEIGHT = 300;\nconst SCREEN_EDGE_BUFFER = 40;\nconst _rectsIntersect = function _rectsIntersect(rect1, rect2) {\n // If one rectangle is on left side of other\n if (rect1.upperStart.x >= rect2.lowerEnd.x || rect2.upperStart.x >= rect1.lowerEnd.x) return false;\n // If one rectangle is above other\n if (rect1.upperStart.y >= rect2.lowerEnd.y || rect2.upperStart.y >= rect1.lowerEnd.y) return false;\n return true;\n};\n\n// We need to place a monitor with the given width and height. Return a rect defining where it should be placed.\nconst getInitialPosition = function getInitialPosition(state, monitorId, eltWidth, eltHeight) {\n // If this monitor was purposefully moved to a certain position before, put it back in that position\n if (Object.prototype.hasOwnProperty.call(state.savedMonitorPositions, monitorId)) {\n const saved = state.savedMonitorPositions[monitorId];\n return {\n upperStart: saved,\n lowerEnd: {\n x: saved.x + eltWidth,\n y: saved.y + eltHeight\n }\n };\n }\n\n // Try all starting positions for the new monitor to find one that doesn't intersect others\n const endXs = [0];\n const endYs = [0];\n let lastX = null;\n let lastY = null;\n for (const monitor in state.monitors) {\n let x = state.monitors[monitor].lowerEnd.x;\n x = Math.ceil(x / 50) * 50; // Try to choose a sensible \"tab width\" so more monitors line up\n endXs.push(x);\n endYs.push(Math.ceil(state.monitors[monitor].lowerEnd.y));\n }\n endXs.sort((a, b) => a - b);\n endYs.sort((a, b) => a - b);\n // We'll use plan B if the monitor doesn't fit anywhere (too long or tall)\n let planB = null;\n for (const x of endXs) {\n if (x === lastX) {\n continue;\n }\n lastX = x;\n outer: for (const y of endYs) {\n if (y === lastY) {\n continue;\n }\n lastY = y;\n const monitorRect = {\n upperStart: {\n x: x + PADDING,\n y: y + PADDING\n },\n lowerEnd: {\n x: x + PADDING + eltWidth,\n y: y + PADDING + eltHeight\n }\n };\n // Intersection testing rect that includes padding\n const rect = {\n upperStart: {\n x,\n y\n },\n lowerEnd: {\n x: x + eltWidth + 2 * PADDING,\n y: y + eltHeight + 2 * PADDING\n }\n };\n for (const monitor in state.monitors) {\n if (_rectsIntersect(state.monitors[monitor], rect)) {\n continue outer;\n }\n }\n // If the rect overlaps the ends of the screen\n if (rect.lowerEnd.x > SCREEN_WIDTH || rect.lowerEnd.y > SCREEN_HEIGHT) {\n // If rect is not too close to completely off screen, set it as plan B\n if (!planB && !(rect.upperStart.x + SCREEN_EDGE_BUFFER > SCREEN_WIDTH || rect.upperStart.y + SCREEN_EDGE_BUFFER > SCREEN_HEIGHT)) {\n planB = monitorRect;\n }\n continue;\n }\n return monitorRect;\n }\n }\n // If the monitor is too long to fit anywhere, put it in the leftmost spot available\n // that intersects the right or bottom edge and isn't too close to the edge.\n if (planB) {\n return planB;\n }\n\n // If plan B fails and there's nowhere reasonable to put it, plan C is to place the monitor randomly\n const randX = Math.ceil(Math.random() * (SCREEN_WIDTH / 2));\n const randY = Math.ceil(Math.random() * (SCREEN_HEIGHT - SCREEN_EDGE_BUFFER));\n return {\n upperStart: {\n x: randX,\n y: randY\n },\n lowerEnd: {\n x: randX + eltWidth,\n y: randY + eltHeight\n }\n };\n};\n\n// Action creators ------------------------\n/**\n * @param {!string} monitorId Id to add\n * @param {!object} upperStart upper point defining the rectangle\n * @param {!number} upperStart.x X of top point that defines the monitor location\n * @param {!number} upperStart.y Y of top point that defines the monitor location\n * @param {!object} lowerEnd lower point defining the rectangle\n * @param {!number} lowerEnd.x X of bottom point that defines the monitor location\n * @param {!number} lowerEnd.y Y of bottom point that defines the monitor location\n * @param {?boolean} savePosition True if the placement should be saved when adding the monitor\n * @returns {object} action to add a new monitor at the location\n */\nconst addMonitorRect = function addMonitorRect(monitorId, upperStart, lowerEnd, savePosition) {\n return {\n type: ADD_MONITOR_RECT,\n monitorId: monitorId,\n upperStart: upperStart,\n lowerEnd: lowerEnd,\n savePosition: savePosition\n };\n};\n\n/**\n * @param {!string} monitorId Id for monitor to move\n * @param {!number} newX X of top point that defines the monitor location\n * @param {!number} newY Y of top point that defines the monitor location\n * @returns {object} action to move an existing monitor to the location\n */\nconst moveMonitorRect = function moveMonitorRect(monitorId, newX, newY) {\n return {\n type: MOVE_MONITOR_RECT,\n monitorId: monitorId,\n newX: newX,\n newY: newY\n };\n};\n\n/**\n * @param {!string} monitorId Id for monitor to resize\n * @param {!number} newWidth Width to set monitor to\n * @param {!number} newHeight Height to set monitor to\n * @returns {object} action to resize an existing monitor to the given dimensions\n */\nconst resizeMonitorRect = function resizeMonitorRect(monitorId, newWidth, newHeight) {\n return {\n type: RESIZE_MONITOR_RECT,\n monitorId: monitorId,\n newWidth: newWidth,\n newHeight: newHeight\n };\n};\n\n/**\n * @param {!string} monitorId Id for monitor to remove\n * @returns {object} action to remove an existing monitor\n */\nconst removeMonitorRect = function removeMonitorRect(monitorId) {\n return {\n type: REMOVE_MONITOR_RECT,\n monitorId: monitorId\n };\n};\nconst resetMonitorLayout = function resetMonitorLayout() {\n return {\n type: RESET_MONITOR_LAYOUT\n };\n};\n\n\n/***/ }),\n/* 86 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(470);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 87 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(482);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 88 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(514);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 89 */,\n/* 90 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(578);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 91 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4);\n/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(0);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(1);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n\n\n\n\n/**\n * Higher Order Component to manage inputs that submit on blur and \n * @param {React.Component} Input text input that consumes onChange, onBlur, onKeyPress\n * @returns {React.Component} Buffered input that calls onSubmit on blur and \n */\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (Input) {\n class BufferedInput extends react__WEBPACK_IMPORTED_MODULE_2___default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['handleChange', 'handleKeyPress', 'handleFlush']);\n this.state = {\n value: null\n };\n }\n handleKeyPress(e) {\n if (e.key === 'Enter') {\n this.handleFlush();\n e.target.blur();\n }\n }\n handleFlush() {\n const isNumeric = typeof this.props.value === 'number';\n const validatesNumeric = isNumeric ? !isNaN(this.state.value) : true;\n if (this.state.value !== null && validatesNumeric) {\n this.props.onSubmit(isNumeric ? Number(this.state.value) : this.state.value);\n }\n this.setState({\n value: null\n });\n }\n handleChange(e) {\n this.setState({\n value: e.target.value\n });\n }\n render() {\n const bufferedValue = this.state.value === null ? this.props.value : this.state.value;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(Input, _extends({}, this.props, {\n value: bufferedValue,\n onBlur: this.handleFlush,\n onChange: this.handleChange,\n onKeyPress: this.handleKeyPress\n }));\n }\n }\n BufferedInput.propTypes = {\n onSubmit: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func.isRequired,\n value: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number])\n };\n return BufferedInput;\n});\n\n/***/ }),\n/* 92 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _close_button_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(111);\n/* harmony import */ var _close_button_css__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_close_button_css__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _icon_close_svg__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(108);\n/* harmony import */ var _icon_close_svg__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_icon_close_svg__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _icon_close_orange_svg__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(301);\n/* harmony import */ var _icon_close_orange_svg__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_icon_close_orange_svg__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _lib_assets_icon_back_svg__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(184);\n/* harmony import */ var _lib_assets_icon_back_svg__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_lib_assets_icon_back_svg__WEBPACK_IMPORTED_MODULE_6__);\n\n\n\n\n\n\n\nlet closeIcons = {};\nconst CloseButton = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"div\", {\n \"aria-label\": \"Close\",\n className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_close_button_css__WEBPACK_IMPORTED_MODULE_3___default.a.closeButton, props.className, {\n [_close_button_css__WEBPACK_IMPORTED_MODULE_3___default.a.small]: props.size === CloseButton.SIZE_SMALL,\n [_close_button_css__WEBPACK_IMPORTED_MODULE_3___default.a.large]: props.size === CloseButton.SIZE_LARGE,\n [_close_button_css__WEBPACK_IMPORTED_MODULE_3___default.a.orange]: props.color === CloseButton.COLOR_ORANGE\n }),\n role: \"button\",\n tabIndex: \"0\",\n onClick: props.onClick\n}, props.buttonType === 'back' ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"img\", {\n className: _close_button_css__WEBPACK_IMPORTED_MODULE_3___default.a.backIcon,\n src: _lib_assets_icon_back_svg__WEBPACK_IMPORTED_MODULE_6___default.a,\n draggable: false\n}) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"img\", {\n className: classnames__WEBPACK_IMPORTED_MODULE_2___default()(_close_button_css__WEBPACK_IMPORTED_MODULE_3___default.a.closeIcon, {\n [_close_button_css__WEBPACK_IMPORTED_MODULE_3___default.a[props.color]]: props.color !== CloseButton.COLOR_NEUTRAL\n }),\n src: props.color && closeIcons[props.color] ? closeIcons[props.color] : _icon_close_svg__WEBPACK_IMPORTED_MODULE_4___default.a,\n draggable: false\n}));\nCloseButton.SIZE_SMALL = 'small';\nCloseButton.SIZE_LARGE = 'large';\nCloseButton.COLOR_NEUTRAL = 'neutral';\nCloseButton.COLOR_GREEN = 'green';\nCloseButton.COLOR_ORANGE = 'orange';\ncloseIcons = {\n [CloseButton.COLOR_NEUTRAL]: _icon_close_svg__WEBPACK_IMPORTED_MODULE_4___default.a,\n [CloseButton.COLOR_GREEN]: _icon_close_svg__WEBPACK_IMPORTED_MODULE_4___default.a,\n // TODO: temporary, need green icon\n [CloseButton.COLOR_ORANGE]: _icon_close_orange_svg__WEBPACK_IMPORTED_MODULE_5___default.a\n};\nCloseButton.propTypes = {\n buttonType: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.oneOf(['back', 'close']),\n className: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,\n color: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,\n onClick: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired,\n size: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.oneOf([CloseButton.SIZE_SMALL, CloseButton.SIZE_LARGE])\n};\nCloseButton.defaultProps = {\n color: CloseButton.COLOR_NEUTRAL,\n size: CloseButton.SIZE_LARGE,\n buttonType: 'close'\n};\n/* harmony default export */ __webpack_exports__[\"a\"] = (CloseButton);\n\n/***/ }),\n/* 93 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(502);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 94 */,\n/* 95 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return isRendererSupported; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return isNewFunctionSupported; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return findIncompatibleUserscripts; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return isBrowserSupported; });\n/* harmony import */ var scratch_render__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(220);\n/* harmony import */ var scratch_render__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(scratch_render__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11);\n\n\nlet cachedRendererSupport = null;\nconst isRendererSupported = () => {\n if (cachedRendererSupport === null) {\n cachedRendererSupport = scratch_render__WEBPACK_IMPORTED_MODULE_0___default.a.isSupported();\n }\n return cachedRendererSupport;\n};\nlet cachedNewFunctionSupport = null;\nconst isNewFunctionSupported = () => {\n if (cachedNewFunctionSupport === null) {\n try {\n // This will throw if blocked by CSP\n // eslint-disable-next-line no-new\n new Function('');\n cachedNewFunctionSupport = true;\n } catch (e) {\n cachedNewFunctionSupport = false;\n }\n }\n return cachedNewFunctionSupport;\n};\nconst findIncompatibleUserscripts = () => {\n /* eslint-disable max-len */\n\n /** @type {string[]} */\n const errors = [];\n\n // Chibi < v4 breaks extensionURLs in project.json\n // Check suggested by SinanShiki\n if (typeof window.chibi === 'object' && Number(window.chibi.version) <= 3) {\n errors.push('You are using an old version of the \"Chibi\" userscript that has known project corruption bugs. Please disable it, uninstall it, or update to version 4.');\n }\n\n // For debugging incompatibilities, allow ignoring the errors with an undocumented URL parameter.\n if (errors.length > 0) {\n const params = new URLSearchParams(location.search);\n if (params.get('ignore_unsupported_userscripts') === 'i_will_not_ask_for_help_if_something_breaks') {\n _log__WEBPACK_IMPORTED_MODULE_1__[\"default\"].error('Ignoring unsupported userscripts', errors);\n return [];\n }\n }\n\n /* eslint-enable max-len */\n return errors;\n};\nconst isBrowserSupported = () => isNewFunctionSupported() && isRendererSupported() && findIncompatibleUserscripts().length === 0;\n\n/***/ }),\n/* 96 */,\n/* 97 */,\n/* 98 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return reducer; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return initialState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return setHoveredSprite; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return setReceivedBlocks; });\nconst SET_HOVERED_SPRITE = 'scratch-gui/hovered-target/SET_HOVERED_SPRITE';\nconst SET_RECEIVED_BLOCKS = 'scratch-gui/hovered-target/SET_RECEIVED_BLOCKS';\nconst initialState = {\n sprite: null,\n receivedBlocks: false\n};\nconst reducer = function reducer(state, action) {\n if (typeof state === 'undefined') state = initialState;\n switch (action.type) {\n case SET_HOVERED_SPRITE:\n return {\n sprite: action.spriteId,\n receivedBlocks: false\n };\n case SET_RECEIVED_BLOCKS:\n return {\n sprite: state.sprite,\n receivedBlocks: action.receivedBlocks\n };\n default:\n return state;\n }\n};\nconst setHoveredSprite = function setHoveredSprite(spriteId) {\n return {\n type: SET_HOVERED_SPRITE,\n spriteId: spriteId,\n meta: {\n throttle: 30\n }\n };\n};\nconst setReceivedBlocks = function setReceivedBlocks(receivedBlocks) {\n return {\n type: SET_RECEIVED_BLOCKS,\n receivedBlocks: receivedBlocks\n };\n};\n\n\n/***/ }),\n/* 99 */,\n/* 100 */,\n/* 101 */,\n/* 102 */,\n/* 103 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDQ4LjIgKDQ3MzI3KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5maWxlLXVwbG9hZDwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxkZWZzPjwvZGVmcz4KICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJmaWxlLXVwbG9hZCIgZmlsbD0iI0ZGRkZGRiI+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik01LjkxNzM3MDk4LDYuODg2MTI0NjMgTDkuNjM4ODg5OTcsMy4xNjQ2MDU2NSBDOS44NTcwMDA5NywyLjk0NTEzMTQ1IDEwLjE5Nzc5OTQsMi45NDUxMzE0NSAxMC40MTU5MTA0LDMuMTY0NjA1NjUgTDE0LjEzNzQyOTQsNi44ODYxMjQ2MyBDMTQuNDkxODU5OCw3LjI0MDU1NTAxIDE0LjIzMjg1Myw3LjgyNTM2NTE0IDEzLjc0MjEwMzIsNy44MjUzNjUxNCBMMTEuODg4MTU5Nyw3LjgyNTM2NTE0IEwxMC43ODM5NzI3LDEyLjIwMTIxNzEgQzEwLjY3NDkxNzIsMTIuNjI1MTcwNCAxMC4yMzg2OTUyLDEyLjg4MjgxNCA5LjgxNjEwNTE2LDEyLjc3Mzc1ODUgQzkuNTE2MjAyNTMsMTIuNzA2OTYyIDkuMjk4MDkxNTMsMTIuNDc1MjE5MSA5LjIyOTkzMTg0LDEyLjIwMTIxNzEgTDguMTI1NzQ0ODksNy44MjUzNjUxNCBMNi4zMTI2OTcxOCw3LjgyNTM2NTE0IEM1LjgyMTk0NzQyLDcuODI1MzY1MTQgNS41NjI5NDA2LDcuMjQwNTU1MDEgNS45MTczNzA5OCw2Ljg4NjEyNDYzIFogTTE3LDExLjYwMTc1MyBMMTcsMTMuODUxMDIyNyBDMTcsMTUuNTgyMjc4OCAxNS41OTU5MTA0LDE3LjAwMDAwMDMgMTMuODY0NjU0MywxNy4wMDAwMDAzIEw2LjE0ODk3NzYsMTcuMDAwMDAwMyBDNC40MDQwODk1OCwxNy4wMDAwMDAzIDMsMTUuNTgyMjc4OCAzLDEzLjg1MTAyMjcgTDMsMTEuNjAxNzUzIEMzLDExLjAyOTIxMTYgMy40NjM0ODU4OCwxMC41NzkzNTc2IDQuMDIyMzk1MzMsMTAuNTc5MzU3NiBDNC41ODEzMDQ3NywxMC41NzkzNTc2IDUuMDQ0NzkwNjUsMTEuMDI5MjExNiA1LjA0NDc5MDY1LDExLjYwMTc1MyBMNS4wNDQ3OTA2NSwxMy44NTEwMjI3IEM1LjA0NDc5MDY1LDE0LjQ1MDgyNzkgNS41MzU1NDA0MSwxNC45NTUyMDk2IDYuMTQ4OTc3NiwxNC45NTUyMDk2IEwxMy44NjQ2NTQzLDE0Ljk1NTIwOTYgQzE0LjQ2NDQ1OTYsMTQuOTU1MjA5NiAxNC45NTUyMDkzLDE0LjQ1MDgyNzkgMTQuOTU1MjA5MywxMy44NTEwMjI3IEwxNC45NTUyMDkzLDExLjYwMTc1MyBDMTQuOTU1MjA5MywxMS4wMjkyMTE2IDE1LjQxODY5NTIsMTAuNTc5MzU3NiAxNS45Nzc2MDQ3LDEwLjU3OTM1NzYgQzE2LjU1MDE0NjEsMTAuNTc5MzU3NiAxNywxMS4wMjkyMTE2IDE3LDExLjYwMTc1MyBaIiBpZD0iZmlsZS11cGxvYWQtaWNvbiI+PC9wYXRoPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+\"\n\n/***/ }),\n/* 104 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/00aa0c4320b93631ab3c223604ead431.svg\";\n\n/***/ }),\n/* 105 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUwLjIgKDU1MDQ3KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5zZWFyY2gtc3ByaXRlLWxpYnJhcnk8L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZGVmcz48L2RlZnM+CiAgICA8ZyBpZD0ic2VhcmNoLXNwcml0ZS1saWJyYXJ5IiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8cGF0aCBkPSJNOS4wODkyMDMyNSw1LjI4MjQ5NDIyIEMxMS4xNzQ0OTY3LDUuMjgyNDk0MjIgMTIuODk0NDgzMyw2Ljk4NzI1OTcgMTIuODk0NDgzMyw5LjA4Nzc3NDMgQzEyLjg5NDQ4MzMsMTEuMTg4Mjg4OSAxMS4xNzQ0OTY3LDEyLjg5MzA1NDQgOS4wODkyMDMyNSwxMi44OTMwNTQ0IEM2Ljk4ODY4ODY1LDEyLjg5MzA1NDQgNS4yODM5MjMxOCwxMS4xODgyODg5IDUuMjgzOTIzMTgsOS4wODc3NzQzIEM1LjI4MzkyMzE4LDYuOTg3MjU5NyA2Ljk4ODY4ODY1LDUuMjgyNDk0MjIgOS4wODkyMDMyNSw1LjI4MjQ5NDIyIE0xNi42Njc3OTksMTUuMDU0NDUzNSBMMTQuNTQ1OTc0OSwxMi45MzExMDcyIEMxNC4zMDA5MTQ4LDEyLjY4NDUyNSAxNC4yNjc0Mjg0LDEyLjMxMTYwNzYgMTQuNDM0ODYwNywxMi4wMDU2NjMxIEMxNS4yODcyNDM0LDEwLjQyNzIzMjkgMTUuNDk1NzcyOCw4LjQxMzQ3ODY3IDE0LjU3OTQ2MTMsNi40Mzc3NzcyNSBDMTMuODQ3MzI1NSw0Ljg1NjMwMjg1IDEyLjM5OTc5NjksMy42NDQ3MDE2OCAxMC43MTE3NzQ3LDMuMjA5Mzc3NjQgQzYuMjU5NTk2OTksMi4wNjAxODMwNiAyLjMwNjY3MjA1LDUuODE1MjMzNDMgMy4xMDI3MzY2NCwxMC4yMjYzMTQxIEMzLjUwNDU3NDIyLDEyLjQ0ODU5NzcgNS4yMDMyNTEyNCwxNC4zMTkyNzMzIDcuMzc1MzA1MTEsMTQuOTM0MjA2NiBDOS4wNTg3NjEwMSwxNS40MTIxNDk4IDEwLjY3MDY3NzcsMTUuMTUwMzQ2NSAxMS45OTE4NzA5LDE0LjQzMzQzMTcgQzEyLjI5NzgxNTQsMTQuMjY1OTk5NCAxMi42NzIyNTUsMTQuMjk5NDg1OSAxMi45MjAzNTkyLDE0LjU0NDU0NTkgTDE1LjA1NTg4MjQsMTYuNjY3ODkyMiBDMTUuMjY4OTc4MSwxNi44OTYyMDkgMTUuNTU4MTc5NCwxNy4wMDI3NTY5IDE1Ljg2MjYwMTgsMTcuMDAyNzU2OSBDMTYuMTUxODAzMSwxNy4wMDI3NTY5IDE2LjQ0MTAwNDQsMTYuODk2MjA5IDE2LjY2Nzc5OSwxNi42Njc4OTIyIEMxNy4xMTA3MzM3LDE2LjIyNjQ3OTcgMTcuMTEwNzMzNywxNS40OTU4NjU5IDE2LjY2Nzc5OSwxNS4wNTQ0NTM1IiBpZD0ic2VhcmNoIiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+CiAgICA8L2c+Cjwvc3ZnPg==\"\n\n/***/ }),\n/* 106 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4);\n/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(0);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(1);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(7);\n/* harmony import */ var _reducers_project_title__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(56);\n/* harmony import */ var _lib_download_blob__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(60);\n/* harmony import */ var _reducers_project_changed__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(55);\n/* harmony import */ var _reducers_alerts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(20);\n/* harmony import */ var _reducers_tw__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(23);\n/* harmony import */ var _reducers_project_state__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(12);\n/* harmony import */ var _lib_log__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(11);\n\n\n\n\n\n\n\n\n\n\n\n\n// from sb-file-uploader-hoc.jsx\nconst getProjectTitleFromFilename = fileInputFilename => {\n if (!fileInputFilename) return '';\n // only parse title with valid scratch project extensions\n // (.sb, .sb2, and .sb3)\n const matches = fileInputFilename.match(/^(.*)\\.sb[23]?$/);\n if (!matches) return '';\n return matches[1].substring(0, 100); // truncate project title to max 100 chars\n};\n\n/**\n * @param {Uint8Array[]} arrays List of byte arrays\n * @returns {number} Total length of the arrays\n */\nconst getLengthOfByteArrays = arrays => {\n let length = 0;\n for (let i = 0; i < arrays.length; i++) {\n length += arrays[i].byteLength;\n }\n return length;\n};\n\n/**\n * @param {Uint8Array[]} arrays List of byte arrays\n * @returns {Uint8Array} One big array containing all of the little arrays in order.\n */\nconst concatenateByteArrays = arrays => {\n const totalLength = getLengthOfByteArrays(arrays);\n const newArray = new Uint8Array(totalLength);\n let p = 0;\n for (let i = 0; i < arrays.length; i++) {\n newArray.set(arrays[i], p);\n p += arrays[i].byteLength;\n }\n return newArray;\n};\n\n/**\n * Project saver component passes a downloadProject function to its child.\n * It expects this child to be a function with the signature\n * function (downloadProject, props) {}\n * The component can then be used to attach project saving functionality\n * to any other component:\n *\n * {(downloadProject, props) => (\n * \n * )}\n */\nclass SB3Downloader extends react__WEBPACK_IMPORTED_MODULE_2___default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['downloadProject', 'saveAsNew', 'saveToLastFile', 'saveToLastFileOrNew']);\n }\n startedSaving() {\n this.props.onShowSavingAlert();\n }\n finishedSaving() {\n this.props.onProjectUnchanged();\n this.props.onShowSaveSuccessAlert();\n if (this.props.onSaveFinished) {\n this.props.onSaveFinished();\n }\n }\n downloadProject() {\n if (!this.props.canSaveProject) {\n return;\n }\n this.startedSaving();\n this.props.saveProjectSb3().then(content => {\n this.finishedSaving();\n Object(_lib_download_blob__WEBPACK_IMPORTED_MODULE_5__[/* default */ \"a\"])(this.props.projectFilename, content);\n });\n }\n async saveAsNew() {\n if (!this.props.canSaveProject) {\n return;\n }\n try {\n const handle = await this.props.showSaveFilePicker({\n suggestedName: this.props.projectFilename,\n types: [{\n description: 'Scratch 3 Project',\n accept: {\n 'application/octet-stream': '.sb3'\n }\n }],\n excludeAcceptAllOption: true\n });\n await this.saveToHandle(handle);\n this.props.onSetFileHandle(handle);\n const title = getProjectTitleFromFilename(handle.name);\n if (title) {\n this.props.onSetProjectTitle(title);\n }\n } catch (e) {\n this.handleSaveError(e);\n }\n }\n async saveToLastFile() {\n try {\n await this.saveToHandle(this.props.fileHandle);\n } catch (e) {\n this.handleSaveError(e);\n }\n }\n saveToLastFileOrNew() {\n if (this.props.fileHandle) {\n return this.saveToLastFile();\n }\n return this.saveAsNew();\n }\n async saveToHandle(handle) {\n if (!this.props.canSaveProject) {\n return;\n }\n const writable = await handle.createWritable();\n this.startedSaving();\n await new Promise((resolve, reject) => {\n // Projects can be very large, so we'll utilize JSZip's stream API to avoid having the\n // entire sb3 in memory at the same time.\n const jszipStream = this.props.saveProjectSb3Stream();\n const abortController = new AbortController();\n jszipStream.on('error', error => {\n abortController.abort(error);\n });\n\n // JSZip's stream pause() and resume() methods are not necessarily completely no-ops\n // if they are already paused or resumed. These also make it easier to add debug\n // logging of when we actually pause or resume.\n // Note that JSZip will keep sending some data after you ask it to pause.\n let jszipStreamRunning = false;\n const pauseJSZipStream = () => {\n if (jszipStreamRunning) {\n jszipStreamRunning = false;\n jszipStream.pause();\n }\n };\n const resumeJSZipStream = () => {\n if (!jszipStreamRunning) {\n jszipStreamRunning = true;\n jszipStream.resume();\n }\n };\n\n // Allow the JSZip stream to run quite a bit ahead of file writing. This helps\n // reduce zip stream pauses on systems with high latency storage.\n const HIGH_WATER_MARK_BYTES = 1024 * 1024 * 5;\n\n // Minimum size of buffer to pass into write(). Small buffers will be queued and\n // written in batches as they reach or exceed this size.\n const WRITE_BUFFER_TARGET_SIZE_BYTES = 1024 * 1024;\n const zipStream = new ReadableStream({\n start: controller => {\n jszipStream.on('data', data => {\n controller.enqueue(data);\n if (controller.desiredSize <= 0) {\n pauseJSZipStream();\n }\n });\n jszipStream.on('end', () => {\n controller.close();\n });\n resumeJSZipStream();\n },\n pull: () => {\n resumeJSZipStream();\n },\n cancel: () => {\n pauseJSZipStream();\n }\n }, new ByteLengthQueuingStrategy({\n highWaterMark: HIGH_WATER_MARK_BYTES\n }));\n const queuedChunks = [];\n const fileStream = new WritableStream({\n write: chunk => {\n queuedChunks.push(chunk);\n const currentSize = getLengthOfByteArrays(queuedChunks);\n if (currentSize >= WRITE_BUFFER_TARGET_SIZE_BYTES) {\n const newBuffer = concatenateByteArrays(queuedChunks);\n queuedChunks.length = 0;\n return writable.write(newBuffer);\n }\n // Otherwise wait for more data\n },\n close: async () => {\n // Write the last batch of data.\n const lastBuffer = concatenateByteArrays(queuedChunks);\n if (lastBuffer.byteLength) {\n await writable.write(lastBuffer);\n }\n // File handle must be closed at the end to actually save the file.\n await writable.close();\n },\n abort: async () => {\n await writable.abort();\n }\n });\n zipStream.pipeTo(fileStream, {\n signal: abortController.signal\n }).then(() => {\n this.finishedSaving();\n resolve();\n }).catch(error => {\n reject(error);\n });\n });\n }\n handleSaveError(e) {\n // AbortError can happen when someone cancels the file selector dialog\n if (e && e.name === 'AbortError') {\n return;\n }\n _lib_log__WEBPACK_IMPORTED_MODULE_10__[\"default\"].error(e);\n this.props.onShowSaveErrorAlert();\n }\n render() {\n const {\n children\n } = this.props;\n return children(this.props.className, this.downloadProject, this.props.showSaveFilePicker ? {\n available: true,\n name: this.props.fileHandle ? this.props.fileHandle.name : null,\n saveAsNew: this.saveAsNew,\n saveToLastFile: this.saveToLastFile,\n saveToLastFileOrNew: this.saveToLastFileOrNew,\n smartSave: this.saveToLastFileOrNew\n } : {\n available: false,\n smartSave: this.downloadProject\n });\n }\n}\nconst getProjectFilename = (curTitle, defaultTitle) => {\n let filenameTitle = curTitle;\n if (!filenameTitle || filenameTitle.length === 0) {\n filenameTitle = defaultTitle;\n }\n return \"\".concat(filenameTitle.substring(0, 100), \".sb3\");\n};\nSB3Downloader.propTypes = {\n children: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n className: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n fileHandle: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({\n name: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string\n }),\n onSaveFinished: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n projectFilename: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n saveProjectSb3: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n saveProjectSb3Stream: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n canSaveProject: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n onSetFileHandle: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n onSetProjectTitle: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n onShowSavingAlert: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n onShowSaveSuccessAlert: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n onShowSaveErrorAlert: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n onProjectUnchanged: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n showSaveFilePicker: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func\n};\nSB3Downloader.defaultProps = {\n className: '',\n showSaveFilePicker: typeof showSaveFilePicker === 'function' && !navigator.userAgent.includes('Android') ? window.showSaveFilePicker.bind(window) : null\n};\nconst mapStateToProps = state => ({\n fileHandle: state.scratchGui.tw.fileHandle,\n saveProjectSb3: state.scratchGui.vm.saveProjectSb3.bind(state.scratchGui.vm),\n saveProjectSb3Stream: state.scratchGui.vm.saveProjectSb3Stream.bind(state.scratchGui.vm),\n canSaveProject: Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_9__[/* getIsShowingProject */ \"r\"])(state.scratchGui.projectState.loadingState),\n projectFilename: getProjectFilename(state.scratchGui.projectTitle, _reducers_project_title__WEBPACK_IMPORTED_MODULE_4__[/* projectTitleInitialState */ \"b\"])\n});\nconst mapDispatchToProps = dispatch => ({\n onSetFileHandle: fileHandle => dispatch(Object(_reducers_tw__WEBPACK_IMPORTED_MODULE_8__[/* setFileHandle */ \"j\"])(fileHandle)),\n onSetProjectTitle: title => dispatch(Object(_reducers_project_title__WEBPACK_IMPORTED_MODULE_4__[/* setProjectTitle */ \"c\"])(title)),\n onShowSavingAlert: () => Object(_reducers_alerts__WEBPACK_IMPORTED_MODULE_7__[/* showAlertWithTimeout */ \"g\"])(dispatch, 'saving'),\n onShowSaveSuccessAlert: () => Object(_reducers_alerts__WEBPACK_IMPORTED_MODULE_7__[/* showAlertWithTimeout */ \"g\"])(dispatch, 'twSaveToDiskSuccess'),\n onShowSaveErrorAlert: () => dispatch(Object(_reducers_alerts__WEBPACK_IMPORTED_MODULE_7__[/* showStandardAlert */ \"i\"])('savingError')),\n onProjectUnchanged: () => dispatch(Object(_reducers_project_changed__WEBPACK_IMPORTED_MODULE_6__[/* setProjectUnchanged */ \"d\"])())\n});\n/* harmony default export */ __webpack_exports__[\"a\"] = (Object(react_redux__WEBPACK_IMPORTED_MODULE_3__[/* connect */ \"b\"])(mapStateToProps, mapDispatchToProps)(SB3Downloader));\n\n/***/ }),\n/* 107 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUwLjIgKDU1MDQ3KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5iYWNrPC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGRlZnM+PC9kZWZzPgogICAgPGcgaWQ9ImJhY2siIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxwYXRoIGQ9Ik0xMC4xNTc1OTIyLDE2Ljk5NDEwMyBDOS44NDY1MDAyMSwxNi45OTQxMDMgOS41NTYxNDc2OCwxNi44NzUxOTY3IDkuMzQwNDU3MjMsMTYuNjYwODg4OSBMNC45OTg5OTU1OSwxMi4zMTk0MjcyIEM0LjY2MzAxNjIzLDExLjk2MjcwODQgNC41NzMxNDUyMSwxMS40NjIxOTU5IDQuNzU5ODAwNDEsMTEuMDMyMTk3NyBDNC45NDUwNzI5OCwxMC42MDIxOTk0IDUuMzU0MzMxNzgsMTAuMzM2NzM0MiA1LjgyODU3NDI1LDEwLjMzNjczNDIgTDcuNDc1Mjg3ODgsMTAuMzM2NzM0MiBMOC4zMTQ1NDQ5Niw0LjI5NDYzNjMzIEM4LjQzNDgzMzg2LDMuMzY5NjU2MTMgOS4yMzk1MjUxNiwyLjY2NTg5NjkgMTAuMTg2NjI3NSwyLjY2NTg5NjkgQzEwLjI2ODIwMjcsMi42NjU4OTY5IDEwLjM1MTE2MDYsMi42NzE0Mjc0MiAxMC40MzI3MzU4LDIuNjgxMTA1ODQgQzExLjI4NzIwMTgsMi44MTUyMjEwNiAxMS45NDY3MTY4LDMuNDgxNjQ5MjQgMTIuMDUwNDE0Miw0LjMwMTU0OTQ4IEwxMi45MTE3OTM0LDEwLjMzNjczNDIgTDE0LjQ4NjYxMDIsMTAuMzM2NzM0MiBDMTQuOTY2MzgzMiwxMC4zMzY3MzQyIDE1LjM5MzYxNjIsMTAuNjE4NzkxIDE1LjU3NDc0MDgsMTEuMDU0MzE5OCBDMTUuNzU1ODY1NSwxMS40OTI2MTM4IDE1LjY1NzY5ODcsMTEuOTc3OTE3MyAxNS4zMTYxODg4LDEyLjMxOTQyNzIgTDEwLjk3NDcyNzIsMTYuNjYwODg4OSBDMTAuNzU5MDM2NywxNi44NzUxOTY3IDEwLjQ2ODY4NDIsMTYuOTk0MTAzIDEwLjE1NzU5MjIsMTYuOTk0MTAzIiBpZD0iRmlsbC0xIiBmaWxsPSIjRkZGRkZGIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMC4xNjQxMDMsIDkuODMwMDAwKSByb3RhdGUoLTI3MC4wMDAwMDApIHRyYW5zbGF0ZSgtMTAuMTY0MTAzLCAtOS44MzAwMDApICI+PC9wYXRoPgogICAgPC9nPgo8L3N2Zz4=\"\n\n/***/ }),\n/* 108 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA3LjQ4IDcuNDgiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojZmZmO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6MnB4O308L3N0eWxlPjwvZGVmcz48dGl0bGU+aWNvbi0tYWRkPC90aXRsZT48bGluZSBjbGFzcz0iY2xzLTEiIHgxPSIzLjc0IiB5MT0iNi40OCIgeDI9IjMuNzQiIHkyPSIxIi8+PGxpbmUgY2xhc3M9ImNscy0xIiB4MT0iMSIgeTE9IjMuNzQiIHgyPSI2LjQ4IiB5Mj0iMy43NCIvPjwvc3ZnPg==\"\n\n/***/ }),\n/* 109 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return reducer; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return initialState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return activateColorPicker; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return deactivateColorPicker; });\n/* unused harmony export setCallback */\nconst ACTIVATE_COLOR_PICKER = 'scratch-gui/color-picker/ACTIVATE_COLOR_PICKER';\nconst DEACTIVATE_COLOR_PICKER = 'scratch-gui/color-picker/DEACTIVATE_COLOR_PICKER';\nconst SET_CALLBACK = 'scratch-gui/color-picker/SET_CALLBACK';\nconst initialState = {\n active: false,\n callback: () => {\n throw new Error('Color picker callback not initialized');\n }\n};\nconst reducer = function reducer(state, action) {\n if (typeof state === 'undefined') state = initialState;\n switch (action.type) {\n case ACTIVATE_COLOR_PICKER:\n return Object.assign({}, state, {\n active: true,\n callback: action.callback\n });\n case DEACTIVATE_COLOR_PICKER:\n // Can be called without a string to deactivate without setting color\n // i.e. when clicking on the modal background\n if (typeof action.color === 'string') {\n state.callback(action.color);\n }\n return Object.assign({}, state, {\n active: false\n });\n case SET_CALLBACK:\n return Object.assign({}, state, {\n callback: action.callback\n });\n default:\n return state;\n }\n};\nconst activateColorPicker = callback => ({\n type: ACTIVATE_COLOR_PICKER,\n callback: callback\n});\nconst deactivateColorPicker = color => ({\n type: DEACTIVATE_COLOR_PICKER,\n color: color\n});\nconst setCallback = callback => ({\n type: SET_CALLBACK,\n callback: callback\n});\n\n\n/***/ }),\n/* 110 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjIgKDY3MTQ1KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5BbGVydHMvQ2hlY2s8L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZyBpZD0iQWxlcnRzL0NoZWNrIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8cGF0aCBkPSJNMTUuMjI0NzgyLDQuNTE0MjQ3MzIgQzE1LjgyNDQzMDEsMy44NjUxOTU4MiAxNi44MzY3MDEyLDMuODI1MTQ2NDUgMTcuNDg1NzUyNyw0LjQyNDc5NDU1IEMxOC4xMzQ4MDQyLDUuMDI0NDQyNjUgMTguMTc0ODUzNSw2LjAzNjcxMzY4IDE3LjU3NTIwNTUsNi42ODU3NjUxOCBMOS40NDUwMzY5LDE1LjQ4NTc1NjYgQzguODExNTczNTcsMTYuMTcxNDA5MyA3LjcyODA3NjgyLDE2LjE3MTQwOTMgNy4wOTQ2MTM0OSwxNS40ODU3NTY2IEwyLjQyNDc5NDU1LDEwLjQzMTIwMzcgQzEuODI1MTQ2NDUsOS43ODIxNTIyNCAxLjg2NTE5NTgyLDguNzY5ODgxMjEgMi41MTQyNDczMiw4LjE3MDIzMzExIEMzLjE2MzI5ODgzLDcuNTcwNTg1MDEgNC4xNzU1Njk4Niw3LjYxMDYzNDM5IDQuNzc1MjE3OTYsOC4yNTk2ODU4OSBMOC4yNjk4MjUxOSwxMi4wNDIyMDQ1IEwxNS4yMjQ3ODIsNC41MTQyNDczMiBaIiBpZD0iQ2hlY2siIGZpbGw9IiMwRUJEOEMiIGZpbGwtcnVsZT0ibm9uemVybyI+PC9wYXRoPgogICAgPC9nPgo8L3N2Zz4=\"\n\n/***/ }),\n/* 111 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(454);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 112 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(471);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 113 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(508);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 114 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(511);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 115 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(518);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 116 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(526);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 117 */,\n/* 118 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return reducer; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return initialState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return setConnectionModalExtensionId; });\nconst SET_ID = 'scratch-gui/connection-modal/setId';\nconst initialState = {\n extensionId: null\n};\nconst reducer = function reducer(state, action) {\n if (typeof state === 'undefined') state = initialState;\n switch (action.type) {\n case SET_ID:\n return Object.assign({}, state, {\n extensionId: action.extensionId\n });\n default:\n return state;\n }\n};\nconst setConnectionModalExtensionId = function setConnectionModalExtensionId(extensionId) {\n return {\n type: SET_ID,\n extensionId: extensionId\n };\n};\n\n\n/***/ }),\n/* 119 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return reducer; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return initialState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return updateTargets; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return highlightTarget; });\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nconst UPDATE_TARGET_LIST = 'scratch-gui/targets/UPDATE_TARGET_LIST';\nconst HIGHLIGHT_TARGET = 'scratch-gui/targets/HIGHLIGHT_TARGET';\nconst initialState = {\n sprites: {},\n stage: {},\n highlightedTargetId: null,\n highlightedTargetTime: null\n};\nconst reducer = function reducer(state, action) {\n if (typeof state === 'undefined') state = initialState;\n switch (action.type) {\n case UPDATE_TARGET_LIST:\n return Object.assign({}, state, {\n sprites: action.targets.filter(target => !target.isStage).reduce((targets, target, listId) => Object.assign(targets, {\n [target.id]: _objectSpread({\n order: listId\n }, target)\n }), {}),\n stage: action.targets.filter(target => target.isStage)[0] || {},\n editingTarget: action.editingTarget\n });\n case HIGHLIGHT_TARGET:\n return Object.assign({}, state, {\n highlightedTargetId: action.targetId,\n highlightedTargetTime: action.updateTime\n });\n default:\n return state;\n }\n};\nconst updateTargets = function updateTargets(targetList, editingTarget) {\n return {\n type: UPDATE_TARGET_LIST,\n targets: targetList,\n editingTarget: editingTarget\n };\n};\nconst highlightTarget = function highlightTarget(targetId) {\n return {\n type: HIGHLIGHT_TARGET,\n targetId: targetId,\n updateTime: Date.now()\n };\n};\n\n\n/***/ }),\n/* 120 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return reducer; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return initialState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return setStageSize; });\n/* harmony import */ var _lib_layout_constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(16);\n\nconst SET_STAGE_SIZE = 'scratch-gui/StageSize/SET_STAGE_SIZE';\nconst initialState = {\n stageSize: _lib_layout_constants_js__WEBPACK_IMPORTED_MODULE_0__[/* STAGE_DISPLAY_SIZES */ \"d\"].full\n};\nconst reducer = function reducer(state, action) {\n if (typeof state === 'undefined') state = initialState;\n switch (action.type) {\n case SET_STAGE_SIZE:\n return {\n stageSize: action.stageSize\n };\n default:\n return state;\n }\n};\nconst setStageSize = function setStageSize(stageSize) {\n return {\n type: SET_STAGE_SIZE,\n stageSize: stageSize\n };\n};\n\n\n/***/ }),\n/* 121 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, \"a\", function() { return /* binding */ locales_reducer; });\n__webpack_require__.d(__webpack_exports__, \"c\", function() { return /* binding */ initialState; });\n__webpack_require__.d(__webpack_exports__, \"b\", function() { return /* binding */ locales_initLocale; });\n__webpack_require__.d(__webpack_exports__, \"d\", function() { return /* binding */ locales_selectLocale; });\n\n// UNUSED EXPORTS: setLocales\n\n// EXTERNAL MODULE: ./node_modules/react-intl/lib/index.es.js + 1 modules\nvar index_es = __webpack_require__(2);\n\n// EXTERNAL MODULE: ./node_modules/@turbowarp/scratch-l10n/src/index.js + 2 modules\nvar src = __webpack_require__(67);\n\n// EXTERNAL MODULE: ./node_modules/@turbowarp/scratch-l10n/locales/editor-msgs.js\nvar editor_msgs = __webpack_require__(222);\n\n// EXTERNAL MODULE: ./src/lib/tw-translations/generated-translations.json\nvar generated_translations = __webpack_require__(228);\n\n// CONCATENATED MODULE: ./src/lib/tw-translations/index.js\n\nconst addAdditionalTranslations = editorMessages => {\n for (const locale of Object.keys(editorMessages)) {\n const toMixIn = generated_translations[locale.toLowerCase()];\n if (toMixIn) {\n Object.assign(editorMessages[locale], toMixIn);\n }\n }\n\n // We reuse our `es` translations for `es-419` instead of maintaining separate translations.\n Object.assign(editorMessages['es-419'], generated_translations.es);\n};\n/* harmony default export */ var tw_translations = (addAdditionalTranslations);\n// EXTERNAL MODULE: ./src/lib/detect-locale.js\nvar detect_locale = __webpack_require__(205);\n\n// CONCATENATED MODULE: ./src/reducers/locales.js\n\n\n\n\n\ntw_translations(editor_msgs[\"a\" /* default */]);\nObject(index_es[\"f\" /* addLocaleData */])(src[\"c\" /* localeData */]);\nconst UPDATE_LOCALES = 'scratch-gui/locales/UPDATE_LOCALES';\nconst SELECT_LOCALE = 'scratch-gui/locales/SELECT_LOCALE';\nconst initialState = {\n isRtl: false,\n locale: 'en',\n messagesByLocale: editor_msgs[\"a\" /* default */],\n messages: editor_msgs[\"a\" /* default */].en\n};\nconst locales_reducer = function reducer(state, action) {\n if (typeof state === 'undefined') state = initialState;\n switch (action.type) {\n case SELECT_LOCALE:\n return Object.assign({}, state, {\n isRtl: Object(src[\"b\" /* isRtl */])(action.locale),\n locale: action.locale,\n messagesByLocale: state.messagesByLocale,\n messages: state.messagesByLocale[action.locale]\n });\n case UPDATE_LOCALES:\n return Object.assign({}, state, {\n isRtl: state.isRtl,\n locale: state.locale,\n messagesByLocale: action.messagesByLocale,\n messages: action.messagesByLocale[state.locale]\n });\n default:\n return state;\n }\n};\nconst locales_selectLocale = function selectLocale(locale) {\n // tw: store language in localStorage\n try {\n localStorage.setItem(detect_locale[\"a\" /* LANGUAGE_KEY */], locale);\n } catch (e) {/* ignore */}\n return {\n type: SELECT_LOCALE,\n locale: locale\n };\n};\nconst setLocales = function setLocales(localesMessages) {\n return {\n type: UPDATE_LOCALES,\n messagesByLocale: localesMessages\n };\n};\nconst locales_initLocale = function initLocale(currentState, locale) {\n if (Object.prototype.hasOwnProperty.call(currentState.messagesByLocale, locale)) {\n return Object.assign({}, currentState, {\n isRtl: Object(src[\"b\" /* isRtl */])(locale),\n locale: locale,\n messagesByLocale: currentState.messagesByLocale,\n messages: currentState.messagesByLocale[locale]\n });\n }\n // don't change locale if it's not in the current messages\n return currentState;\n};\n\n\n/***/ }),\n/* 122 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(452);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 123 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(461);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 124 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(478);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 125 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(484);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 126 */,\n/* 127 */,\n/* 128 */,\n/* 129 */,\n/* 130 */,\n/* 131 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return MAXIMUM_CLOUD_VARIABLES; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return SCRATCH_MAX_CLOUD_VARIABLES; });\n// The maximum number of cloudv ariables that can be created in this scratch-gui instance.\nconst MAXIMUM_CLOUD_VARIABLES = Infinity;\n\n// The maximum number of cloud variables that can be created in a vanilla Scratch.\nconst SCRATCH_MAX_CLOUD_VARIABLES = 10;\n\n/***/ }),\n/* 132 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(0);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(1);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _spinner_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(163);\n/* harmony import */ var _spinner_css__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_spinner_css__WEBPACK_IMPORTED_MODULE_3__);\n\n\n\n\nconst SpinnerComponent = function SpinnerComponent(props) {\n const {\n className,\n level,\n small,\n large\n } = props;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(\"div\", {\n className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(className, _spinner_css__WEBPACK_IMPORTED_MODULE_3___default.a.spinner, _spinner_css__WEBPACK_IMPORTED_MODULE_3___default.a[level], {\n [_spinner_css__WEBPACK_IMPORTED_MODULE_3___default.a.small]: small,\n [_spinner_css__WEBPACK_IMPORTED_MODULE_3___default.a.large]: large\n })\n });\n};\nSpinnerComponent.propTypes = {\n className: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n large: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n level: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n small: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool\n};\nSpinnerComponent.defaultProps = {\n className: '',\n large: false,\n level: 'info',\n small: false\n};\n/* harmony default export */ __webpack_exports__[\"a\"] = (SpinnerComponent);\n\n/***/ }),\n/* 133 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/a11919e102077f40302da55fb9150440.svg\";\n\n/***/ }),\n/* 134 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTUiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxNSAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik01LjE3MTUgMTEuNDAzQzQuNzQ1MzMgMTEuNDAzIDQuMzE5MTYgMTEuMjM5OCAzLjk5NDUzIDEwLjkxNTJMMC43OTgyNDIgNy43MTg5MkMwLjE0NzMzMSA3LjA2ODAxIDAuMTQ3MzMxIDYuMDE1ODkgMC43OTgyNDIgNS4zNjQ5OEMxLjQ0OTE1IDQuNzE0MDcgMi41MDEyNyA0LjcxNDA3IDMuMTUyMTggNS4zNjQ5OEw1LjE3MTUgNy4zODQzMUwxMS40NjkyIDEuMDg4MjhDMTIuMTE4NCAwLjQzNzM3IDEzLjE3MjIgMC40MzczNyAxMy44MjMxIDEuMDg4MjhDMTQuNDcyNCAxLjczNzUzIDE0LjQ3MjQgMi43OTEzIDEzLjgyMzEgMy40NDIyMkw2LjM0ODQ3IDEwLjkxNTJDNi4wMjM4NCAxMS4yMzk4IDUuNTk3NjcgMTEuNDAzIDUuMTcxNSAxMS40MDNaIiBmaWxsPSJ3aGl0ZSIvPgo8L3N2Zz4K\"\n\n/***/ }),\n/* 135 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUwLjIgKDU1MDQ3KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5ibHVldG9vdGgtd2hpdGU8L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZGVmcz48L2RlZnM+CiAgICA8ZyBpZD0iYmx1ZXRvb3RoLXdoaXRlIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8cGF0aCBkPSJNMTAuMDA2NzkyOSwxMi4xMDY3NTA1IEwxMi4zOTU3Mzg3LDE0LjAwMTY2MDggTDEwLjAwNjc5MjksMTUuOTE3ODk1OSBMMTAuMDA2NzkyOSwxMi4xMDY3NTA1IFogTTEwLjAwNjc5MjksNC4wODkyODQxMyBMMTIuMzg1NDM0NCw1Ljk5NDUyMzYyIEwxMC4wMDY3OTI5LDcuODc5MTA0NjkgTDEwLjAwNjc5MjksNC4wODkyODQxMyBaIE04Ljg4NDk0ODk2LDEuMDA2ODQ3ODcgQzguMzgzMzYwMDgsMS4wNzAxNTU5MyA4LjAwODQxNDkyLDEuNDk5OTg0MzYgOC4wMTI0MDM2OSwyLjAwNjc4MjA2IEw4LjAxMjQwMzY5LDcuOTYyNDA0NzcgTDYuNjQxMjYxMTMsNi44Nzk1MDM3IEM2LjQzMTg1MDI2LDYuNzA3OTA1NTMgNi4xNjE5NDI5Miw2LjYyOTI3MDI1IDUuODkzMzY1MTgsNi42NjA5MjQyOCBDNS4zNDU1NzI5NSw2LjcxODU2Nzk0IDQuOTQ4MDI0Nyw3LjIxMDAzODQzIDUuMDA1NTI5NTksNy43NTkxNTI1NyBDNS4wMzQxMTU4NCw4LjAzNDA0Mjg0IDUuMTc1MDUyNjcsOC4yODQ5NDI2OSA1LjM5NDc2Nzg4LDguNDUxODc2MDYgTDcuMzQ3NjA3Myw5Ljk5MjkyNzU5IEw1LjM5NDc2Nzg4LDExLjU0NDMwODMgQzQuOTYxNjUzMDMsMTEuODg5NTAzOSA0Ljg4OTUyMjYyLDEyLjUyMTI1MTcgNS4yMzM4ODcxNSwxMi45NTUwNzg1IEM1LjU3NzkxOTI5LDEzLjM4OTU3MTggNi4yMDgxNDYyNywxMy40NjE1NDMgNi42NDEyNjExMywxMy4xMTY2ODA3IEw4LjAxMjQwMzY5LDEyLjAyMzQ1MDQgTDguMDEyNDAzNjksMTguMDAwMDY0NyBDOC4wMTI0MDM2OSwxOC41NTIxNzc3IDguNDU4NDgyMDgsMTguOTk5OTk4OSA5LjAwOTI2NTg5LDE4Ljk5OTk5ODkgQzkuMjM1OTYxNDYsMTkuMDAwMzMyMSA5LjQ1NjAwOTA3LDE4LjkyMzAyOTcgOS42MzI4NDQ5MSwxOC43ODEwODYzIEwxNC42MTg4MTc5LDE0Ljc4MjY4MjMgQzE1LjA1MTkzMjcsMTQuNDQxODE4NCAxNS4xMjcwNTQ3LDEzLjgxMzA2OTQgMTQuNzg3MDExNCwxMy4zNzg5MDkzIEMxNC43Mzc4MTY0LDEzLjMxNjI2NzcgMTQuNjgxMzA4NywxMy4yNTk2MjM2IDE0LjYxODgxNzksMTMuMjEwMzEgTDEwLjU2NzU0ODYsMTAuMDAzMjU2OCBMMTQuNjE4ODE3OSw2Ljc4NTg3NDQxIEMxNS4wNDg5NDEyLDYuNDQxMzQ1MjYgMTUuMTE5MDc3Miw1LjgxMTkyOTg0IDE0Ljc3NTM3NzQsNS4zODA3Njg2MSBDMTQuNzI5MTc0MSw1LjMyMjc5MTc1IDE0LjY3NjY1NTIsNS4yNzAxNDYxIDE0LjYxODgxNzksNS4yMjM4MzEyNiBMOS42MzI4NDQ5MSwxLjIyNTQyNzI5IEM5LjQyMzQzNDA1LDEuMDU0MTYyMzIgOS4xNTM1MjY3MSwwLjk3NTE5MzgzOCA4Ljg4NDk0ODk2LDEuMDA2ODQ3ODcgWiIgaWQ9IkZpbGwtMSIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPgogICAgPC9nPgo8L3N2Zz4=\"\n\n/***/ }),\n/* 136 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return reducer; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return initialState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return activateCustomProcedures; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return deactivateCustomProcedures; });\nconst ACTIVATE_CUSTOM_PROCEDURES = 'scratch-gui/custom-procedures/ACTIVATE_CUSTOM_PROCEDURES';\nconst DEACTIVATE_CUSTOM_PROCEDURES = 'scratch-gui/custom-procedures/DEACTIVATE_CUSTOM_PROCEDURES';\nconst SET_CALLBACK = 'scratch-gui/custom-procedures/SET_CALLBACK';\nconst initialState = {\n active: false,\n mutator: null,\n callback: null\n};\nconst reducer = function reducer(state, action) {\n if (typeof state === 'undefined') state = initialState;\n switch (action.type) {\n case ACTIVATE_CUSTOM_PROCEDURES:\n return Object.assign({}, state, {\n active: true,\n mutator: action.mutator,\n callback: action.callback\n });\n case DEACTIVATE_CUSTOM_PROCEDURES:\n // Can be called without a mutator to deactivate without new procedure\n // i.e. when clicking on the modal background\n if (action.mutator) {\n state.callback(action.mutator);\n }\n return Object.assign({}, state, {\n active: false,\n mutator: null,\n callback: null\n });\n case SET_CALLBACK:\n return Object.assign({}, state, {\n callback: action.callback\n });\n default:\n return state;\n }\n};\n\n/**\n * Action creator to open the custom procedures modal.\n * @param {!Element} mutator The XML node of the mutator for the procedure.\n * @param {!function(!Element)} callback The function to call when done editing procedure.\n * Expect the callback to be a function that takes a new XML mutator node.\n * @returns {object} An action object with type ACTIVATE_CUSTOM_PROCEDURES.\n */\nconst activateCustomProcedures = (mutator, callback) => ({\n type: ACTIVATE_CUSTOM_PROCEDURES,\n mutator: mutator,\n callback: callback\n});\n\n/**\n * Action creator to close the custom procedures modal.\n * @param {?Element} mutator The new mutator, or null if the callback should not be called.\n * @returns {object} An action object with type ACTIVATE_CUSTOM_PROCEDURES.\n */\nconst deactivateCustomProcedures = mutator => ({\n type: DEACTIVATE_CUSTOM_PROCEDURES,\n mutator: mutator\n});\n\n\n/***/ }),\n/* 137 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(473);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 138 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(504);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 139 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(541);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 140 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(542);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 141 */,\n/* 142 */,\n/* 143 */,\n/* 144 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(600);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 145 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(579);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 146 */,\n/* 147 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"TextEncoder\", function() { return _TextEncoder; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"TextDecoder\", function() { return _TextDecoder; });\nconst _TextEncoder = typeof TextEncoder === 'function' ? TextEncoder : class TextEncoder {\n constructor(encoding) {\n if (typeof encoding !== 'undefined' && encoding !== null && encoding !== 'utf-8' && encoding !== 'utf8') {\n throw new Error('Encoding is not supported');\n }\n this.encoding = 'utf-8';\n }\n encode(str) {\n if (typeof str !== 'string') {\n throw new TypeError('Argument is not a string');\n }\n str = unescape(encodeURIComponent(str));\n const arr = new Uint8Array(str.length);\n for (let i = 0; i < str.length; i++) {\n arr[i] = str.charCodeAt(i);\n }\n return arr;\n }\n};\nconst _TextDecoder = typeof TextDecoder === 'function' ? TextDecoder : class TextDecoder {\n constructor(encoding) {\n if (typeof encoding !== 'undefined' && encoding !== null && encoding !== 'utf-8' && encoding !== 'utf8') {\n throw new Error('Encoding is not supported');\n }\n this.encoding = 'utf-8';\n }\n decode(view) {\n const array = new Uint8Array(view.buffer, view.byteOffset, view.byteLength);\n let result = '';\n for (let i = 0; i < array.length; i++) {\n result += String.fromCharCode(array[i]);\n }\n return decodeURIComponent(escape(result));\n }\n};\n\n\n/***/ }),\n/* 148 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nlet changeChannel;\nlet reloadChannel;\nif (typeof BroadcastChannel !== 'undefined') {\n changeChannel = new BroadcastChannel('addons-change');\n reloadChannel = new BroadcastChannel('addons-reload');\n}\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n changeChannel,\n reloadChannel\n});\n\n/***/ }),\n/* 149 */,\n/* 150 */,\n/* 151 */,\n/* 152 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return setProjectId; });\n/* unused harmony export searchParamsToString */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return setSearchParams; });\n/* harmony import */ var _reducers_project_state__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12);\n\nconst setProjectId = (dispatch, projectId) => {\n if (false) {}\n dispatch(Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_0__[/* setProjectId */ \"E\"])(projectId));\n};\nconst searchParamsToString = params => {\n let newSearch = params.toString();\n if (newSearch.length > 0) {\n // Add leading question mark\n newSearch = \"?\".concat(newSearch);\n newSearch = newSearch\n // Remove '=' from empty values\n // eslint-disable-next-line no-div-regex\n .replace(/=(?=$|&)/g, '')\n // Decode / and : (common in project_url setting)\n .replace(/%2F/g, '/').replace(/%3A/g, ':');\n }\n return newSearch;\n};\n\n/**\n * Change URL search params to something else in place\n * @param {URLSearchParams} params New URLSearchParams\n */\nconst setSearchParams = params => {\n const newSearch = searchParamsToString(params);\n if (location.search !== newSearch) {\n history.replaceState(null, null, \"\".concat(location.pathname).concat(newSearch).concat(location.hash));\n }\n};\n\n\n/***/ }),\n/* 153 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return reducer; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return initialState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return updateAssetDrag; });\nconst DRAG_UPDATE = 'scratch-gui/asset-drag/DRAG_UPDATE';\nconst initialState = {\n dragging: false,\n currentOffset: null,\n img: null\n};\nconst reducer = function reducer(state, action) {\n if (typeof state === 'undefined') state = initialState;\n switch (action.type) {\n case DRAG_UPDATE:\n return Object.assign({}, state, action.state);\n default:\n return state;\n }\n};\nconst updateAssetDrag = function updateAssetDrag(state) {\n return {\n type: DRAG_UPDATE,\n state: state\n };\n};\n\n\n/***/ }),\n/* 154 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return reducer; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return initialState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return updateBlockDrag; });\nconst BLOCK_DRAG_UPDATE = 'scratch-gui/block-drag/BLOCK_DRAG_UPDATE';\nconst initialState = false;\nconst reducer = function reducer(state, action) {\n if (typeof state === 'undefined') state = initialState;\n switch (action.type) {\n case BLOCK_DRAG_UPDATE:\n return action.areBlocksOverGui;\n default:\n return state;\n }\n};\nconst updateBlockDrag = function updateBlockDrag(areBlocksOverGui) {\n return {\n type: BLOCK_DRAG_UPDATE,\n areBlocksOverGui: areBlocksOverGui,\n meta: {\n throttle: 30\n }\n };\n};\n\n\n/***/ }),\n/* 155 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return reducer; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return initialState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return updateMicIndicator; });\nconst UPDATE = 'scratch-gui/mic-indicator/UPDATE';\nconst initialState = false;\nconst reducer = function reducer(state, action) {\n if (typeof state === 'undefined') state = initialState;\n switch (action.type) {\n case UPDATE:\n return action.visible;\n default:\n return state;\n }\n};\nconst updateMicIndicator = function updateMicIndicator(visible) {\n return {\n type: UPDATE,\n visible: visible\n };\n};\n\n\n/***/ }),\n/* 156 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return reducer; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return initialState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return updateMonitors; });\nconst UPDATE_MONITORS = 'scratch-gui/monitors/UPDATE_MONITORS';\nconst initialState = null;\nconst reducer = function reducer(state, action) {\n if (typeof state === 'undefined') state = initialState;\n switch (action.type) {\n case UPDATE_MONITORS:\n return action.monitors;\n default:\n return state;\n }\n};\nconst updateMonitors = function updateMonitors(monitors) {\n return {\n type: UPDATE_MONITORS,\n monitors: monitors\n };\n};\n\n\n/***/ }),\n/* 157 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return reducer; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return initialState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return setFontsLoaded; });\nconst SET_FONTS_LOADED = 'fontsLoaded/SET_FONTS_LOADED';\nconst initialState = false;\nconst reducer = function reducer(state, action) {\n if (typeof state === 'undefined') state = initialState;\n switch (action.type) {\n case SET_FONTS_LOADED:\n return action.loaded;\n default:\n return state;\n }\n};\nconst setFontsLoaded = () => ({\n type: SET_FONTS_LOADED,\n loaded: true\n});\n\n\n/***/ }),\n/* 158 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return reducer; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return initialState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return setAutoSaveTimeoutId; });\nconst SET_AUTOSAVE_TIMEOUT_ID = 'timeout/SET_AUTOSAVE_TIMEOUT_ID';\nconst initialState = {\n autoSaveTimeoutId: null\n};\nconst reducer = function reducer(state, action) {\n if (typeof state === 'undefined') state = initialState;\n switch (action.type) {\n case SET_AUTOSAVE_TIMEOUT_ID:\n return Object.assign({}, state, {\n autoSaveTimeoutId: action.id\n });\n default:\n return state;\n }\n};\nconst setAutoSaveTimeoutId = id => ({\n type: SET_AUTOSAVE_TIMEOUT_ID,\n id\n});\n\n\n/***/ }),\n/* 159 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return reducer; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return initialState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return updateToolbox; });\n/* harmony import */ var _lib_make_toolbox_xml__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(180);\nconst UPDATE_TOOLBOX = 'scratch-gui/toolbox/UPDATE_TOOLBOX';\n\nconst initialState = {\n toolboxXML: Object(_lib_make_toolbox_xml__WEBPACK_IMPORTED_MODULE_0__[/* default */ \"a\"])(true)\n};\nconst reducer = function reducer(state, action) {\n if (typeof state === 'undefined') state = initialState;\n switch (action.type) {\n case UPDATE_TOOLBOX:\n return Object.assign({}, state, {\n toolboxXML: action.toolboxXML\n });\n default:\n return state;\n }\n};\nconst updateToolbox = function updateToolbox(toolboxXML) {\n return {\n type: UPDATE_TOOLBOX,\n toolboxXML: toolboxXML\n };\n};\n\n\n/***/ }),\n/* 160 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return reducer; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return initialState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return updateMetrics; });\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nconst UPDATE_METRICS = 'scratch-gui/workspace-metrics/UPDATE_METRICS';\nconst initialState = {\n targets: {}\n};\nconst reducer = function reducer(state, action) {\n if (typeof state === 'undefined') state = initialState;\n switch (action.type) {\n case UPDATE_METRICS:\n return Object.assign({}, state, {\n targets: Object.assign({}, state.targets, {\n [action.targetID]: {\n scrollX: action.scrollX,\n scrollY: action.scrollY,\n scale: action.scale\n }\n })\n });\n default:\n return state;\n }\n};\nconst updateMetrics = function updateMetrics(metrics) {\n return _objectSpread({\n type: UPDATE_METRICS\n }, metrics);\n};\n\n\n/***/ }),\n/* 161 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* unused harmony export ComingSoonComponent */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return ComingSoonTooltip; });\n/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4);\n/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(2);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(0);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(1);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var react_tooltip__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(97);\n/* harmony import */ var react_tooltip__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react_tooltip__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _coming_soon_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(114);\n/* harmony import */ var _coming_soon_css__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_coming_soon_css__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _aww_cat_png__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(354);\n/* harmony import */ var _aww_cat_png__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_aww_cat_png__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _cool_cat_png__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(355);\n/* harmony import */ var _cool_cat_png__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_cool_cat_png__WEBPACK_IMPORTED_MODULE_8__);\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n\n\n\n\n\n\n\n\n\nconst messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_2__[/* defineMessages */ \"g\"])({\n message1: {\n \"id\": \"gui.comingSoon.message1\",\n \"defaultMessage\": \"Don't worry, we're on it {emoji}\"\n },\n message2: {\n \"id\": \"gui.comingSoon.message2\",\n \"defaultMessage\": \"Coming Soon...\"\n },\n message3: {\n \"id\": \"gui.comingSoon.message3\",\n \"defaultMessage\": \"We're working on it {emoji}\"\n }\n});\nclass ComingSoonContent extends react__WEBPACK_IMPORTED_MODULE_4___default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['setHide', 'setShow', 'getRandomMessage']);\n this.state = {\n isShowing: false\n };\n }\n setShow() {\n // needed to set the opacity to 1, since the default is .9 on show\n this.setState({\n isShowing: true\n });\n }\n setHide() {\n this.setState({\n isShowing: false\n });\n }\n getRandomMessage() {\n // randomly chooses a messages from `messages` to display in the tooltip.\n const images = [_aww_cat_png__WEBPACK_IMPORTED_MODULE_7___default.a, _cool_cat_png__WEBPACK_IMPORTED_MODULE_8___default.a];\n const messageNumber = Math.floor(Math.random() * Object.keys(messages).length) + 1;\n const imageNumber = Math.floor(Math.random() * Object.keys(images).length);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__[/* FormattedMessage */ \"b\"], _extends({}, messages[\"message\".concat(messageNumber)], {\n values: {\n emoji: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(\"img\", {\n className: _coming_soon_css__WEBPACK_IMPORTED_MODULE_6___default.a.comingSoonImage,\n src: images[imageNumber],\n draggable: false\n })\n }\n }));\n }\n render() {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(react_tooltip__WEBPACK_IMPORTED_MODULE_5___default.a, {\n afterHide: this.setHide,\n afterShow: this.setShow,\n className: classnames__WEBPACK_IMPORTED_MODULE_1___default()(_coming_soon_css__WEBPACK_IMPORTED_MODULE_6___default.a.comingSoon, this.props.className, {\n [_coming_soon_css__WEBPACK_IMPORTED_MODULE_6___default.a.show]: this.state.isShowing,\n [_coming_soon_css__WEBPACK_IMPORTED_MODULE_6___default.a.left]: this.props.place === 'left',\n [_coming_soon_css__WEBPACK_IMPORTED_MODULE_6___default.a.right]: this.props.place === 'right',\n [_coming_soon_css__WEBPACK_IMPORTED_MODULE_6___default.a.top]: this.props.place === 'top',\n [_coming_soon_css__WEBPACK_IMPORTED_MODULE_6___default.a.bottom]: this.props.place === 'bottom'\n }),\n getContent: this.getRandomMessage,\n id: this.props.tooltipId\n });\n }\n}\nComingSoonContent.propTypes = {\n className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n intl: react_intl__WEBPACK_IMPORTED_MODULE_2__[/* intlShape */ \"i\"],\n place: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['top', 'right', 'bottom', 'left']),\n tooltipId: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string.isRequired\n};\nComingSoonContent.defaultProps = {\n place: 'bottom'\n};\nconst ComingSoon = Object(react_intl__WEBPACK_IMPORTED_MODULE_2__[/* injectIntl */ \"h\"])(ComingSoonContent);\nconst ComingSoonTooltip = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(\"div\", {\n className: props.className\n}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(\"div\", {\n \"data-delay-hide\": props.delayHide,\n \"data-delay-show\": props.delayShow,\n \"data-effect\": \"solid\",\n \"data-for\": props.tooltipId,\n \"data-place\": props.place,\n \"data-tip\": \"tooltip\"\n}, props.children), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ComingSoon, {\n className: props.tooltipClassName,\n place: props.place,\n tooltipId: props.tooltipId\n}));\nComingSoonTooltip.propTypes = {\n children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node.isRequired,\n className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n delayHide: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number,\n delayShow: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number,\n place: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['top', 'right', 'bottom', 'left']),\n tooltipClassName: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string,\n tooltipId: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string.isRequired\n};\nComingSoonTooltip.defaultProps = {\n delayHide: 0,\n delayShow: 0\n};\n\n\n/***/ }),\n/* 162 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/48df3abff5e8eb9a597f355daaf5348c.png\";\n\n/***/ }),\n/* 163 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(463);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 164 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(475);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 165 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(488);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 166 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(494);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 167 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(532);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 168 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(538);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 169 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(547);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 170 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(548);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 171 */,\n/* 172 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(580);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 173 */,\n/* 174 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);\n/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7);\n\n\nconst mapStateToProps = state => ({\n key: state.locales.locale,\n locale: state.locales.locale,\n messages: state.locales.messages\n});\n/* harmony default export */ __webpack_exports__[\"a\"] = (Object(react_redux__WEBPACK_IMPORTED_MODULE_1__[/* connect */ \"b\"])(mapStateToProps)(react_intl__WEBPACK_IMPORTED_MODULE_0__[/* IntlProvider */ \"e\"]));\n\n/***/ }),\n/* 175 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/7d043362c1c4cabd22aeb93b43fc5fc6.svg\";\n\n/***/ }),\n/* 176 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/40167d33efb7d0929a3bcbc591fc78b0.svg\";\n\n/***/ }),\n/* 177 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/86f568a0ecc0badac2c4952b39fff148.svg\";\n\n/***/ }),\n/* 178 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBzdHJva2U9IiM3Qzg3QTUiIGZpbGw9IiNGRkYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZD0iTTEgMTJoMzh2MTZIMXoiLz48cGF0aCBzdHJva2U9IiNFNkU3RTgiIGZpbGw9IiNFNkU3RTgiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZD0iTTE2IDEydjJoMXYtMWgydjFoMXYtMnoiLz48cGF0aCBkPSJNMTQuNSAxMkgyMiIgc3Ryb2tlPSIjN0M4N0E1IiBzdHJva2UtbGluZWNhcD0ic3F1YXJlIi8+PHBhdGggc3Ryb2tlPSIjN0M4N0E1IiBmaWxsPSIjRkZGIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGQ9Ik0xIDE2aDE5djZoNHY0aC00djJIMXoiLz48cGF0aCBzdHJva2U9IiM3Qzg3QTUiIGZpbGw9IiNFNkU3RTgiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZD0iTTEgMjZoMzh2Mkgxek0xIDE5aDlsMyAzaDR2NEgxeiIvPjxjaXJjbGUgZmlsbD0iI0ZGNjYxQSIgY3g9IjQuNSIgY3k9IjIyLjUiIHI9IjEuNSIvPjxjaXJjbGUgZmlsbD0iIzdDODdBNSIgY3g9IjIyIiBjeT0iMjQiIHI9IjEiLz48cGF0aCBzdHJva2U9IiM3Qzg3QTUiIGZpbGw9IiNGRkYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZD0iTTI5IDIyaDEwdjRIMjl6Ii8+PGNpcmNsZSBmaWxsPSIjN0M4N0E1IiBjeD0iMzEiIGN5PSIyNCIgcj0iMSIvPjxjaXJjbGUgZmlsbD0iIzdDODdBNSIgY3g9IjM0IiBjeT0iMjQiIHI9IjEiLz48Y2lyY2xlIGZpbGw9IiM3Qzg3QTUiIGN4PSIzNyIgY3k9IjI0IiByPSIxIi8+PGcgc3Ryb2tlPSIjN0M4N0E1IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik0zIDE2di0uNU01IDE2di0uNU03IDE2di0uNU05IDE2di0uNU0xMSAxNnYtLjVNMTMgMTZ2LS41Ii8+PC9nPjxnIHN0cm9rZT0iIzdDODdBNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cGF0aCBkPSJNMjEgMjJ2LS41TTIzIDIydi0uNSIvPjwvZz48ZyBzdHJva2U9IiM3Qzg3QTUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTMgMTJ2LS41TTUgMTJ2LS41TTcgMTJ2LS41TTkgMTJ2LS41TTExIDEydi0uNU0xMyAxMnYtLjUiLz48L2c+PGcgc3Ryb2tlPSIjN0M4N0E1IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik0yOCAxMnYtLjVNMjYgMTJ2LS41TTI0IDEydi0uNU0zMCAxMnYtLjVNMzIgMTJ2LS41TTM0IDEydi0uNU0zNiAxMnYtLjVNMzggMTJ2LS41Ii8+PC9nPjxnIHN0cm9rZT0iIzdDODdBNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cGF0aCBkPSJNMzEgMjJ2LS41TTMzIDIydi0uNU0zNSAyMnYtLjVNMzcgMjJ2LS41Ii8+PC9nPjwvZz48L3N2Zz4=\"\n\n/***/ }),\n/* 179 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoOCAuNSkiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+PHBhdGggZD0iTTEyIDM5YTMgMyAwIDAgMS0zLTNjMC0uNi40LTEgMS0xIC41IDAgMSAuNCAxIDFhMSAxIDAgMSAwIDIgMHYtLjJhMSAxIDAgMCAwLS4zLS43bC0uOC0uOGEzIDMgMCAwIDEtMS0yLjFWMzBjMC0uNi41LTEgMS0xIC42IDAgMSAuNCAxIDF2Mi4ybC40LjcuOC44Yy42LjYuOSAxLjMuOSAyLjF2LjJhMyAzIDAgMCAxLTMgM3oiIHN0cm9rZS1vcGFjaXR5PSIuMSIgc3Ryb2tlPSIjMDAwIiBmaWxsPSIjRTZFN0U4Ii8+PHBhdGggZD0iTTIzLjcuM0ExIDEgMCAwIDAgMjMgMEgxYTEgMSAwIDAgMC0uNy4zQTEgMSAwIDAgMCAwIDF2MjZjMCAuMy4xLjUuMy43LjIuMi40LjMuNy4zaDIyYy4zIDAgLjUtLjEuNy0uMy4yLS4yLjMtLjQuMy0uN1YxYTEgMSAwIDAgMC0uMy0uN3pNMTIgNGMyIDAgMy4zIDIgMi42IDMuOEwxMy4zIDExYTEuNCAxLjQgMCAwIDEtMi43IDBMOS41IDcuN2wtLjItMUM5LjIgNS40IDEwLjQgNCAxMiA0eiIgc3Ryb2tlPSIjN0M4N0E1IiBmaWxsPSIjODU5MkFGIiBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjxwYXRoIGQ9Ik0yIDJ2MjRoMjBWMkgyem0xMCAyYzIgMCAzLjMgMiAyLjYgMy44TDEzLjMgMTFhMS40IDEuNCAwIDAgMS0yLjcgMEw5LjUgNy43bC0uMi0xQzkuMiA1LjQgMTAuNCA0IDEyIDR6IiBzdHJva2U9IiM3Qzg3QTUiIGZpbGw9IiM1Q0IxRDYiIGZpbGwtcnVsZT0ibm9uemVybyIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PHBhdGggc3Ryb2tlPSIjN0M4N0E1IiBmaWxsPSIjODU5MkFGIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGQ9Ik0yMiAyNkgydi02bDIwLTR6Ii8+PHBhdGggZD0iTS4zIDI3LjdMMiAyNk0uMy4zTDIgMk0yMiAyTDIzLjcuM00yMy43IDI3LjdMMjIgMjYiIHN0cm9rZT0iIzdDODdBNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PGNpcmNsZSBmaWxsPSIjRkZCRjAwIiBjeD0iMTIiIGN5PSIxNC44IiByPSIxLjIiLz48cGF0aCBzdHJva2U9IiM3Qzg3QTUiIGZpbGw9IiNFNkU3RTgiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZD0iTTEwIDI4aDR2NGgtNHoiLz48cGF0aCBkPSJNMTUuNSAyMmgtN2EuNS41IDAgMCAxLS41LS41YzAtLjMuMi0uNS41LS41aDdjLjMgMCAuNS4yLjUuNXMtLjIuNS0uNS41ek0xNy41IDI0aC0xMWEuNS41IDAgMCAxLS41LS41YzAtLjMuMi0uNS41LS41aDExYy4zIDAgLjUuMi41LjVzLS4yLjUtLjUuNXoiIGZpbGw9IiNGRkJGMDAiLz48L2c+PC9zdmc+\"\n\n/***/ }),\n/* 180 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var _tw_lazy_scratch_blocks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(57);\n/* harmony import */ var _themes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(15);\n\n\nconst categorySeparator = '';\nconst blockSeparator = ''; // At default scale, about 28px\n\nconst translate = (id, english) => {\n if (_tw_lazy_scratch_blocks__WEBPACK_IMPORTED_MODULE_0__[/* default */ \"a\"].isLoaded()) {\n return _tw_lazy_scratch_blocks__WEBPACK_IMPORTED_MODULE_0__[/* default */ \"a\"].get().ScratchMsgs.translate(id, english);\n }\n return english;\n};\n\n/* eslint-disable no-unused-vars */\nconst motion = function motion(isInitialSetup, isStage, targetId, colors) {\n const stageSelected = translate('MOTION_STAGE_SELECTED', 'Stage selected: no motion blocks');\n // Note: the category's secondaryColour matches up with the blocks' tertiary color, both used for border color.\n return \"\\n \\n \").concat(isStage ? \"\\n \\n \") : \"\\n \\n \\n \\n 10\\n \\n \\n \\n \\n \\n \\n 15\\n \\n \\n \\n \\n \\n \\n 15\\n \\n \\n \\n \".concat(blockSeparator, \"\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n 0\\n \\n \\n \\n \\n 0\\n \\n \\n \\n \\n \\n \\n 1\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n 1\\n \\n \\n \\n \\n 0\\n \\n \\n \\n \\n 0\\n \\n \\n \\n \").concat(blockSeparator, \"\\n \\n \\n \\n 90\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \").concat(blockSeparator, \"\\n \\n \\n \\n 10\\n \\n \\n \\n \\n \\n \\n 0\\n \\n \\n \\n \\n \\n \\n 10\\n \\n \\n \\n \\n \\n \\n 0\\n \\n \\n \\n \").concat(blockSeparator, \"\\n \\n \").concat(blockSeparator, \"\\n \\n \").concat(blockSeparator, \"\\n \\n \\n \"), \"\\n \").concat(categorySeparator, \"\\n \\n \");\n};\nconst xmlEscape = function xmlEscape(unsafe) {\n return unsafe.replace(/[<>&'\"]/g, c => {\n switch (c) {\n case '<':\n return '<';\n case '>':\n return '>';\n case '&':\n return '&';\n case '\\'':\n return ''';\n case '\"':\n return '"';\n }\n });\n};\nconst looks = function looks(isInitialSetup, isStage, targetId, costumeName, backdropName, colors) {\n const hello = translate('LOOKS_HELLO', 'Hello!');\n const hmm = translate('LOOKS_HMM', 'Hmm...');\n // Note: the category's secondaryColour matches up with the blocks' tertiary color, both used for border color.\n return \"\\n \\n \").concat(isStage ? '' : \"\\n \\n \\n \\n \".concat(hello, \"\\n \\n \\n \\n \\n 2\\n \\n \\n \\n \\n \\n \\n \").concat(hello, \"\\n \\n \\n \\n \\n \\n \\n \").concat(hmm, \"\\n \\n \\n \\n \\n 2\\n \\n \\n \\n \\n \\n \\n \").concat(hmm, \"\\n \\n \\n \\n \").concat(blockSeparator, \"\\n \"), \"\\n \").concat(isStage ? \"\\n \\n \\n \\n \".concat(backdropName, \"\\n \\n \\n \\n \\n \\n \\n \").concat(backdropName, \"\\n \\n \\n \\n \\n \") : \"\\n \\n \\n \\n \").concat(costumeName, \"\\n \\n \\n \\n \\n \\n \\n \\n \").concat(backdropName, \"\\n \\n \\n \\n \\n \").concat(blockSeparator, \"\\n \\n \\n \\n 10\\n \\n \\n \\n \\n \\n \\n 100\\n \\n \\n \\n \"), \"\\n \").concat(blockSeparator, \"\\n \\n \\n \\n 25\\n \\n \\n \\n \\n \\n \\n 0\\n \\n \\n \\n \\n \").concat(blockSeparator, \"\\n \").concat(isStage ? '' : \"\\n \\n \\n \".concat(blockSeparator, \"\\n \\n \\n \\n \\n 1\\n \\n \\n \\n \"), \"\\n \").concat(isStage ? \"\\n \\n \" : \"\\n \\n \\n \\n \"), \"\\n \").concat(categorySeparator, \"\\n \\n \");\n};\nconst sound = function sound(isInitialSetup, isStage, targetId, soundName, colors) {\n // Note: the category's secondaryColour matches up with the blocks' tertiary color, both used for border color.\n return \"\\n \\n \\n \\n \\n \").concat(soundName, \"\\n \\n \\n \\n \\n \\n \\n \").concat(soundName, \"\\n \\n \\n \\n \\n \").concat(blockSeparator, \"\\n \\n \\n \\n 10\\n \\n \\n \\n \\n \\n \\n 100\\n \\n \\n \\n \\n \").concat(blockSeparator, \"\\n \\n \\n \\n -10\\n \\n \\n \\n \\n \\n \\n 100\\n \\n \\n \\n \\n \").concat(categorySeparator, \"\\n \\n \");\n};\nconst events = function events(isInitialSetup, isStage, targetId, colors) {\n // Note: the category's secondaryColour matches up with the blocks' tertiary color, both used for border color.\n return \"\\n \\n \\n \\n \\n \").concat(isStage ? \"\\n \\n \" : \"\\n \\n \", \"\\n \\n \\n \").concat(blockSeparator, \"\\n \\n \\n \\n 10\\n \\n \\n \\n \").concat(blockSeparator, \"\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \").concat(categorySeparator, \"\\n \\n \");\n};\nconst control = function control(isInitialSetup, isStage, targetId, colors) {\n // Note: the category's secondaryColour matches up with the blocks' tertiary color, both used for border color.\n return \"\\n \\n \\n \\n \\n 1\\n \\n \\n \\n \").concat(blockSeparator, \"\\n \\n \\n \\n 10\\n \\n \\n \\n \\n \").concat(blockSeparator, \"\\n \\n \\n \\n \\n \\n \").concat(blockSeparator, \"\\n \\n \").concat(blockSeparator, \"\\n \").concat(isStage ? \"\\n \\n \\n \\n \\n \\n \" : \"\\n \\n \\n \\n \\n \\n \\n \\n \", \"\\n \").concat(categorySeparator, \"\\n \\n \");\n};\nconst sensing = function sensing(isInitialSetup, isStage, targetId, colors) {\n const name = translate('SENSING_ASK_TEXT', 'What\\'s your name?');\n // Note: the category's secondaryColour matches up with the blocks' tertiary color, both used for border color.\n return \"\\n \\n \").concat(isStage ? '' : \"\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \".concat(blockSeparator, \"\\n \"), \"\\n \").concat(isInitialSetup ? '' : \"\\n \\n \\n \\n \".concat(name, \"\\n \\n \\n \\n \"), \"\\n \\n \").concat(blockSeparator, \"\\n \\n \\n \\n \\n \\n \\n \\n \\n \").concat(isStage ? '' : \"\\n \".concat(blockSeparator, \"\\n ''+\\n \").concat(blockSeparator, \"\\n \"), \"\\n \").concat(blockSeparator, \"\\n \\n \").concat(blockSeparator, \"\\n \\n \\n \").concat(blockSeparator, \"\\n \\n \\n \\n \\n \\n \").concat(blockSeparator, \"\\n \\n \\n \").concat(blockSeparator, \"\\n \\n \\n \").concat(categorySeparator, \"\\n \\n \");\n};\nconst operators = function operators(isInitialSetup, isStage, targetId, colors) {\n const apple = translate('OPERATORS_JOIN_APPLE', 'apple');\n const banana = translate('OPERATORS_JOIN_BANANA', 'banana');\n const letter = translate('OPERATORS_LETTEROF_APPLE', 'a');\n // Note: the category's secondaryColour matches up with the blocks' tertiary color, both used for border color.\n return \"\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \").concat(blockSeparator, \"\\n \\n \\n \\n 1\\n \\n \\n \\n \\n 10\\n \\n \\n \\n \").concat(blockSeparator, \"\\n \\n \\n \\n \\n \\n \\n \\n \\n 50\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n 50\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n 50\\n \\n \\n \\n \").concat(blockSeparator, \"\\n \\n \\n \\n \").concat(blockSeparator, \"\\n \").concat(isInitialSetup ? '' : \"\\n \\n \\n \\n \".concat(apple, \" \\n \\n \\n \\n \\n \").concat(banana, \"\\n \\n \\n \\n \\n \\n \\n 1\\n \\n \\n \\n \\n \").concat(apple, \"\\n \\n \\n \\n \\n \\n \\n \").concat(apple, \"\\n \\n \\n \\n \\n \\n \\n \").concat(apple, \"\\n \\n \\n \\n \\n \").concat(letter, \"\\n \\n \\n \\n \"), \"\\n \").concat(blockSeparator, \"\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \").concat(blockSeparator, \"\\n \\n \\n \\n \\n \\n \\n \\n \").concat(categorySeparator, \"\\n \\n \");\n};\nconst variables = function variables(isInitialSetup, isStage, targetId, colors) {\n // Note: the category's secondaryColour matches up with the blocks' tertiary color, both used for border color.\n return \"\\n \\n \\n \");\n};\nconst myBlocks = function myBlocks(isInitialSetup, isStage, targetId, colors) {\n // Note: the category's secondaryColour matches up with the blocks' tertiary color, both used for border color.\n return \"\\n \\n \\n \");\n};\n\n// eslint-disable-next-line max-len\nconst extraTurboWarpBlocks = \"\\nis compiled?\\nis TurboWarp?\\n\";\n/* eslint-enable no-unused-vars */\n\nconst xmlOpen = '';\nconst xmlClose = '';\n\n/**\n * @param {!boolean} isInitialSetup - Whether the toolbox is for initial setup. If the mode is \"initial setup\",\n * blocks with localized default parameters (e.g. ask and wait) should not be loaded. (LLK/scratch-gui#5445)\n * @param {?boolean} isStage - Whether the toolbox is for a stage-type target. This is always set to true\n * when isInitialSetup is true.\n * @param {?string} targetId - The current editing target\n * @param {?Array.} categoriesXML - optional array of `{id,xml}` for categories. This can include both core\n * and other extensions: core extensions will be placed in the normal Scratch order; others will go at the bottom.\n * @property {string} id - the extension / category ID.\n * @property {string} xml - the `...` XML for this extension / category.\n * @param {?string} costumeName - The name of the default selected costume dropdown.\n * @param {?string} backdropName - The name of the default selected backdrop dropdown.\n * @param {?string} soundName - The name of the default selected sound dropdown.\n * @param {?object} colors - The colors for the theme.\n * @returns {string} - a ScratchBlocks-style XML document for the contents of the toolbox.\n */\nconst makeToolboxXML = function makeToolboxXML(isInitialSetup) {\n let isStage = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n let targetId = arguments.length > 2 ? arguments[2] : undefined;\n let categoriesXML = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];\n let costumeName = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : '';\n let backdropName = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : '';\n let soundName = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : '';\n let colors = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : _themes__WEBPACK_IMPORTED_MODULE_1__[/* defaultBlockColors */ \"n\"];\n isStage = isInitialSetup || isStage;\n const gap = [categorySeparator];\n costumeName = xmlEscape(costumeName);\n backdropName = xmlEscape(backdropName);\n soundName = xmlEscape(soundName);\n categoriesXML = categoriesXML.slice();\n const moveCategory = categoryId => {\n const index = categoriesXML.findIndex(categoryInfo => categoryInfo.id === categoryId);\n if (index >= 0) {\n // remove the category from categoriesXML and return its XML\n const [categoryInfo] = categoriesXML.splice(index, 1);\n return categoryInfo.xml;\n }\n // return `undefined`\n };\n const motionXML = moveCategory('motion') || motion(isInitialSetup, isStage, targetId, colors.motion);\n const looksXML = moveCategory('looks') || looks(isInitialSetup, isStage, targetId, costumeName, backdropName, colors.looks);\n const soundXML = moveCategory('sound') || sound(isInitialSetup, isStage, targetId, soundName, colors.sounds);\n const eventsXML = moveCategory('event') || events(isInitialSetup, isStage, targetId, colors.event);\n const controlXML = moveCategory('control') || control(isInitialSetup, isStage, targetId, colors.control);\n const sensingXML = moveCategory('sensing') || sensing(isInitialSetup, isStage, targetId, colors.sensing);\n const operatorsXML = moveCategory('operators') || operators(isInitialSetup, isStage, targetId, colors.operators);\n const variablesXML = moveCategory('data') || variables(isInitialSetup, isStage, targetId, colors.data);\n const myBlocksXML = moveCategory('procedures') || myBlocks(isInitialSetup, isStage, targetId, colors.more);\n\n // Always display TurboWarp blocks as the first extension, if it exists,\n // and also add an \"is compiled?\" block to the top.\n let turbowarpXML = moveCategory('tw');\n if (turbowarpXML && !turbowarpXML.includes(extraTurboWarpBlocks)) {\n turbowarpXML = turbowarpXML.replace(' /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"div\", {\n className: _crash_message_css__WEBPACK_IMPORTED_MODULE_4___default.a.crashWrapper\n}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_2__[/* default */ \"a\"], {\n className: _crash_message_css__WEBPACK_IMPORTED_MODULE_4___default.a.body\n}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"img\", {\n className: _crash_message_css__WEBPACK_IMPORTED_MODULE_4___default.a.reloadIcon,\n src: _reload_svg__WEBPACK_IMPORTED_MODULE_5___default.a,\n draggable: false\n}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"p\", {\n className: _crash_message_css__WEBPACK_IMPORTED_MODULE_4___default.a.header\n}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Oops! Something went wrong.\",\n id: \"gui.crashMessage.label\"\n})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"p\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__[/* FormattedMessage */ \"b\"], {\n defaultMessage: 'We are so sorry, but it looks like the page has crashed.' + ' Please refresh your page to try' + ' again.',\n id: \"tw.gui.crashMessage.description\"\n})), props.errorMessage && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"p\", {\n className: _crash_message_css__WEBPACK_IMPORTED_MODULE_4___default.a.errorMessage\n}, props.errorMessage), props.eventId && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"p\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Your error was logged with id {errorId}\",\n id: \"gui.crashMessage.errorNumber\",\n values: {\n errorId: props.eventId\n }\n})), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"button\", {\n className: _crash_message_css__WEBPACK_IMPORTED_MODULE_4___default.a.reloadButton,\n onClick: props.onReload\n}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_3__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Reload\",\n id: \"gui.crashMessage.reload\"\n}))));\nCrashMessage.propTypes = {\n eventId: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,\n errorMessage: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.string,\n onReload: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func.isRequired\n};\n/* harmony default export */ __webpack_exports__[\"a\"] = (CrashMessage);\n\n/***/ }),\n/* 182 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return generateRandomUsername; });\nconst generateRandomUsername = () => {\n const DIGITS = 4;\n const randomNumber = Math.round(Math.random() * 10 ** DIGITS);\n const randomId = randomNumber.toString().padStart(DIGITS, '0');\n const randomUsername = \"player\".concat(randomId);\n return randomUsername;\n};\n\n\n/***/ }),\n/* 183 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/**\n * Report a telemetry event.\n * @param {string} event - one of `projectWasCreated`, `projectDidLoad`, `projectDidSave`, `projectWasUploaded`\n */\n// TODO make a telemetry HOC and move this stuff there\nconst collectMetadata = function collectMetadata(vm) {\n let projectName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n let locale = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n // TODO move most or all of this into a collectMetadata() method on the VM/Runtime\n const metadata = {\n projectName: projectName,\n language: locale,\n spriteCount: 0,\n blocksCount: 0,\n costumesCount: 0,\n listsCount: 0,\n scriptCount: 0,\n soundsCount: 0,\n variablesCount: 0\n };\n for (const target of vm.runtime.targets) {\n ++metadata.spriteCount;\n metadata.blocksCount += Object.keys(target.sprite.blocks._blocks).length;\n metadata.costumesCount += target.sprite.costumes_.length;\n metadata.scriptCount += target.sprite.blocks._scripts.length;\n metadata.soundsCount += target.sprite.sounds.length;\n for (const variableName in target.variables) {\n const variable = target.variables[variableName];\n if (variable.type === 'list') {\n ++metadata.listsCount;\n } else {\n ++metadata.variablesCount;\n }\n }\n }\n return metadata;\n};\n/* harmony default export */ __webpack_exports__[\"a\"] = (collectMetadata);\n\n/***/ }),\n/* 184 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDQ4LjIgKDQ3MzI3KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5iYWNrLWljb248L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZGVmcz48L2RlZnM+CiAgICA8ZyBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0iYmFjay1pY29uIiBmaWxsPSIjRkZGRkZGIj4KICAgICAgICAgICAgPHBhdGggZD0iTTQuMTA4MDQ5MTIsOC41Nzc2NTA1NSBMOS4zMzIwMzYzOCwzLjM1MzY2MzI5IEM5LjYzODIwNDEzLDMuMDQ1NTgxOTkgMTAuMTE2NTkxMiwzLjA0NTU4MTk5IDEwLjQyMjc1OSwzLjM1MzY2MzI5IEwxNS42NDY3NDYyLDguNTc3NjUwNTUgQzE2LjE0NDI2ODgsOS4wNzUxNzMxNCAxNS43ODA2OTQ2LDkuODk2MDg1NDMgMTUuMDkxODE3Miw5Ljg5NjA4NTQzIEwxMi40ODkzOTEzLDkuODk2MDg1NDMgTDEwLjkzOTQxNzEsMTYuMDM4NTc1OSBDMTAuNzg2MzMzMiwxNi42MzM2ODk1IDEwLjE3Mzk5NzcsMTYuOTk1MzUwMiA5LjU4MDc5NzY4LDE2Ljg0MjI2NjMgQzkuMTU5ODE3MDIsMTYuNzQ4NTAyNCA4Ljg1MzY0OTI3LDE2LjQyMzE5OTIgOC43NTc5NzE4NCwxNi4wMzg1NzU5IEw3LjIwNzk5NzYsOS44OTYwODU0MyBMNC42NjI5NzgxNyw5Ljg5NjA4NTQzIEMzLjk3NDEwMDczLDkuODk2MDg1NDMgMy42MTA1MjY1Myw5LjA3NTE3MzE0IDQuMTA4MDQ5MTIsOC41Nzc2NTA1NSIgaWQ9IkZpbGwtMSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoOS44NzczOTgsIDEwLjAwMDAwMCkgcm90YXRlKC05MC4wMDAwMDApIHRyYW5zbGF0ZSgtOS44NzczOTgsIC0xMC4wMDAwMDApICI+PC9wYXRoPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+\"\n\n/***/ }),\n/* 185 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3);\n/* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(0);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(1);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _divider_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(309);\n/* harmony import */ var _divider_css__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_divider_css__WEBPACK_IMPORTED_MODULE_3__);\n\n\n\n\nconst Divider = _ref => {\n let {\n className\n } = _ref;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(\"div\", {\n className: classnames__WEBPACK_IMPORTED_MODULE_0___default()(_divider_css__WEBPACK_IMPORTED_MODULE_3___default.a.divider, className)\n });\n};\nDivider.propTypes = {\n className: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string\n};\n/* harmony default export */ __webpack_exports__[\"a\"] = (Divider);\n\n/***/ }),\n/* 186 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/78e3f697df85275aa8d384ca6fc0e288.svg\";\n\n/***/ }),\n/* 187 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNi42MyAxNy41Ij48ZGVmcz48c3R5bGU+LmNscy0xLC5jbHMtMntmaWxsOiM0Y2JmNTY7c3Ryb2tlOiM0NTk5M2Q7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO30uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuNXB4O308L3N0eWxlPjwvZGVmcz48dGl0bGU+aWNvbi0tZ3JlZW4tZmxhZzwvdGl0bGU+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNLjc1LDJBNi40NCw2LjQ0LDAsMCwxLDguNDQsMmgwYTYuNDQsNi40NCwwLDAsMCw3LjY5LDBWMTIuNGE2LjQ0LDYuNDQsMCwwLDEtNy42OSwwaDBhNi40NCw2LjQ0LDAsMCwwLTcuNjksMCIvPjxsaW5lIGNsYXNzPSJjbHMtMiIgeDE9IjAuNzUiIHkxPSIxNi43NSIgeDI9IjAuNzUiIHkyPSIwLjc1Ii8+PC9zdmc+\"\n\n/***/ }),\n/* 188 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/b3a6f3783f393f641dc3e51211dd50f4.svg\";\n\n/***/ }),\n/* 189 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(513);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 190 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xNS43ODQgNS41ODd2Ni4xNGMtLjAxNS40OS0uMzA1LjkwNy0uNzQxIDEuMDhhMS4xNDMgMS4xNDMgMCAwIDEtMS4yNDgtLjI2NWwtMS4xNjQtMS4xNjQtNC44NjYgMy42NzlhMS44ODcgMS44ODcgMCAwIDEtMi42MzktLjM1N2MtLjUxLS42OTktLjUwNC0xLjYzNi4wMDItMi4yOWwzLjY1OC00Ljg3Nkw3LjY3MyA2LjQyYy0uMzQtLjMzOS0uNDQyLS44NC0uMjYyLTEuMjc3YTEuMTQ1IDEuMTQ1IDAgMCAxIDEuMDc3LS43MTFoNi4xNGMuMzA0IDAgLjU5NC4xMjIuODEzLjM0Mi4yMi4yMi4zNDIuNTEuMzQzLjgxM3oiIGZpbGw9IiNmZmYiLz48L3N2Zz4=\"\n\n/***/ }),\n/* 191 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDQiIGhlaWdodD0iNDQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjBfZF8yODI4XzI2NDM0KSI+PHJlY3QgeD0iNCIgeT0iNCIgd2lkdGg9IjM2IiBoZWlnaHQ9IjM2IiByeD0iMTgiIGZpbGw9IiNGRjhDMUEiLz48Y2lyY2xlIGN4PSIyMiIgY3k9IjIyIiByPSIxMCIgZmlsbD0iI0ZGOEMxQSIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMjIgMjMuNDI0YTEuNDQgMS40NCAwIDAgMC0xLjQ1MiAxLjQzYzAgLjc5MS42NSAxLjQzMSAxLjQ1MiAxLjQzMWExLjQ0IDEuNDQgMCAwIDAgMS40NTItMS40M2MwLS43OS0uNjUtMS40My0xLjQ1Mi0xLjQzem0uODM0LTEuMzAzYy0uMzcuODE1LTEuMjk4LjgxNS0xLjY2OCAwbC0xLjE4LTIuNTg2Yy0uMzY4LS44MS4wOTQtMS44MjEuODM1LTEuODIxaDIuMzU4Yy43NCAwIDEuMjAzIDEuMDExLjgzNCAxLjgybC0xLjE4IDIuNTg3eiIgZmlsbD0iI2ZmZiIvPjwvZz48ZGVmcz48ZmlsdGVyIGlkPSJmaWx0ZXIwX2RfMjgyOF8yNjQzNCIgeD0iMCIgeT0iMCIgd2lkdGg9IjQ0IiBoZWlnaHQ9IjQ0IiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+PGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz48ZmVDb2xvck1hdHJpeCBpbj0iU291cmNlQWxwaGEiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDAiIHJlc3VsdD0iaGFyZEFscGhhIi8+PGZlTW9ycGhvbG9neSByYWRpdXM9IjQiIG9wZXJhdG9yPSJkaWxhdGUiIGluPSJTb3VyY2VBbHBoYSIgcmVzdWx0PSJlZmZlY3QxX2Ryb3BTaGFkb3dfMjgyOF8yNjQzNCIvPjxmZU9mZnNldC8+PGZlQ29tcG9zaXRlIGluMj0iaGFyZEFscGhhIiBvcGVyYXRvcj0ib3V0Ii8+PGZlQ29sb3JNYXRyaXggdmFsdWVzPSIwIDAgMCAwIDEgMCAwIDAgMCAwLjU0OTAyIDAgMCAwIDAgMC4xMDE5NjEgMCAwIDAgMC4xNSAwIi8+PGZlQmxlbmQgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0iZWZmZWN0MV9kcm9wU2hhZG93XzI4MjhfMjY0MzQiLz48ZmVCbGVuZCBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJlZmZlY3QxX2Ryb3BTaGFkb3dfMjgyOF8yNjQzNCIgcmVzdWx0PSJzaGFwZSIvPjwvZmlsdGVyPjwvZGVmcz48L3N2Zz4=\"\n\n/***/ }),\n/* 192 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUwLjIgKDU1MDQ3KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5oZWxwPC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGRlZnM+PC9kZWZzPgogICAgPGcgaWQ9ImhlbHAiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxwYXRoIGQ9Ik05Ljk5OTA1NDQ5LDE4IEM1LjU4MTYwOTc0LDE4IDIsMTQuNDE3MzQ2MSAyLDEwLjAwMDk0NTMgQzIsNS41ODI2NTM5MSA1LjU4MTYwOTc0LDIgOS45OTkwNTQ0OSwyIEMxNC40MTgzOTAzLDIgMTgsNS41ODI2NTM5MSAxOCwxMC4wMDA5NDUzIEMxOCwxNC40MTczNDYxIDE0LjQxODM5MDMsMTggOS45OTkwNTQ0OSwxOCBaIE05Ljg1MzI1NjEyLDEyLjM2MTUyNjYgQzkuMjY4OTI4MDIsMTIuMzYxNTI2NiA4LjgwNTYyNTgxLDEyLjgzNjA2MjkgOC44MDU2MjU4MSwxMy40MjIxNDM0IEM4LjgwNTYyNTgxLDEzLjk5MzA5OTQgOS4yNjg5MjgwMiwxNC40Njc2MzU2IDkuODUzMjU2MTIsMTQuNDY3NjM1NiBDMTAuNDM5NDc1MiwxNC40Njc2MzU2IDEwLjkxNDEyMzYsMTMuOTkzMDk5NCAxMC45MTQxMjM2LDEzLjQyMjE0MzQgQzEwLjkxNDEyMzYsMTIuODM2MDYyOSAxMC40Mzk0NzUyLDEyLjM2MTUyNjYgOS44NTMyNTYxMiwxMi4zNjE1MjY2IFogTTkuNDYxODEzMDIsMTEuNjQzMTA1MyBMMTAuMTU5NjAyOSwxMS42NDMxMDUzIEMxMC4zNDg3MDU4LDExLjY0MzEwNTMgMTAuNTI0NTcxNiwxMS41MjM5OTg2IDEwLjU2OTk1NjMsMTEuMzQwNjEyMSBDMTAuNjU4ODM0NywxMC45NzAwNTc5IDEwLjkxNDEyMzYsMTAuNzE2NzE5OCAxMS4yNTQ1MDg5LDEwLjQ2MTQ5MTIgTDExLjcxNTkyMDEsMTAuMTIxMTg2MyBDMTIuNDQ1ODU3NSw5LjU3MjkxNzQxIDEyLjg5NzgxMzUsOC45MDU1NDE3NyAxMi44OTc4MTM1LDcuOTMwMDAxMTggQzEyLjg5NzgxMzUsNi43MTQzNTY2MSAxMS45MTA2OTYxLDUuNTMyNzQyNTMgOS45MzgzNTI0NCw1LjUzMjc0MjUzIEM4LjE2MDc4NDc4LDUuNTMyNzQyNTMgNy4xMDE4MDgzLDYuNzM3MDQzNiA3LjEwMTgwODMsOC4xNjA2NTIyNSBDNy4xMDE4MDgzLDguMTk4NDYzOSA3LjEwMzY5OTMzLDguMjM2Mjc1NTUgNy4xMDM2OTkzMyw4LjI3NTk3Nzc5IEM3LjExMzE1NDQ3LDguNDk3MTc1OTQgNy4yODkwMjAyMSw4LjY3ODY3MTg3IDcuNTEwMjcwNjUsOC42ODYyMzQyIEw4LjM4MzkyNjI1LDguNzE2NDgzNTIgQzguNjI0MDg2OTksOC43MjU5MzY0MyA4LjgxODg2MzAyLDguNTMzMDk3MDEgOC44MTg4NjMwMiw4LjI5Mjk5MzAzIEw4LjgxODg2MzAyLDguMjgzNTQwMTIgQzguODE4ODYzMDIsNy43MTI1ODQxOSA5LjIzMjk5ODQ2LDcuMTM5NzM3NjggOS45MzgzNTI0NCw3LjEzOTczNzY4IEMxMC42NzAxODA4LDcuMTM5NzM3NjggMTEuMDIxOTEyMyw3LjYwMTAzOTgyIDExLjAyMTkxMjMsOC4wNzU1NzYwNCBDMTEuMDIxOTEyMyw4LjM5MzE5MzkgMTAuOTE0MTIzNiw4LjY4NjIzNDIgMTAuNTg1MDg0NSw4LjkzMDExOTM0IEw5Ljk2NDgyNjg1LDkuMzkzMzEyMDYgQzkuMjY4OTI4MDIsOS45MTUxMTI4NCA5LjAzNjMzMTQsMTAuNTM1MjIzOSA5LjAzNjMzMTQsMTEuMTA4MDcwNCBDOS4wMzYzMzE0LDExLjE1MTU1MzggOS4wMzgyMjI0MywxMS4xOTUwMzcyIDkuMDM4MjIyNDMsMTEuMjM0NzM5NSBDOS4wNDU3ODY1NSwxMS40NjM0OTk5IDkuMjMyOTk4NDYsMTEuNjQzMTA1MyA5LjQ2MTgxMzAyLDExLjY0MzEwNTMgWiIgaWQ9ImhlbHAtaWNvbiIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPgogICAgPC9nPgo8L3N2Zz4=\"\n\n/***/ }),\n/* 193 */,\n/* 194 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/5b36d8cf15d803226e2fe4c0737be43f.svg\";\n\n/***/ }),\n/* 195 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(453);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 196 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(458);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 197 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(462);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 198 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(469);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 199 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(474);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 200 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(477);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 201 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(493);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 202 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(512);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 203 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(520);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 204 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(530);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 205 */,\n/* 206 */,\n/* 207 */,\n/* 208 */\n/***/ (function(module, exports) {\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n\n\n/***/ }),\n/* 209 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return fetchProjectMeta; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return TWProjectMetaFetcherHOC; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(0);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(7);\n/* harmony import */ var _log__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(11);\n/* harmony import */ var _reducers_project_title__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(56);\n/* harmony import */ var _reducers_tw__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(23);\nconst _excluded = [\"reduxProjectId\", \"onSetAuthor\", \"onSetDescription\", \"onSetProjectTitle\"];\nfunction _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\n\n\nconst fetchProjectMeta = async projectId => {\n const urls = [\"https://trampoline.turbowarp.org/api/projects/\".concat(projectId), \"https://trampoline.turbowarp.xyz/api/projects/\".concat(projectId)];\n let firstError;\n for (const url of urls) {\n try {\n const res = await fetch(url);\n const data = await res.json();\n if (res.ok) {\n return data;\n }\n if (res.status === 404) {\n throw new Error('Project is probably unshared');\n }\n throw new Error(\"Unexpected status code: \".concat(res.status));\n } catch (err) {\n if (!firstError) {\n firstError = err;\n }\n }\n }\n throw firstError;\n};\nconst getNoIndexTag = () => document.querySelector('meta[name=\"robots\"][content=\"noindex\"]');\nconst setIndexable = indexable => {\n if (indexable) {\n const tag = getNoIndexTag();\n if (tag) {\n tag.remove();\n }\n } else if (!getNoIndexTag()) {\n const tag = document.createElement('meta');\n tag.name = 'robots';\n tag.content = 'noindex';\n document.head.appendChild(tag);\n }\n};\nconst TWProjectMetaFetcherHOC = function TWProjectMetaFetcherHOC(WrappedComponent) {\n class ProjectMetaFetcherComponent extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {\n componentDidUpdate(prevProps) {\n // project title resetting is handled in titled-hoc.jsx\n if (this.props.reduxProjectId !== prevProps.reduxProjectId) {\n this.props.onSetAuthor('', '');\n this.props.onSetDescription('', '');\n const projectId = this.props.reduxProjectId;\n if (projectId === '0') {\n // don't try to get metadata\n } else {\n fetchProjectMeta(projectId).then(data => {\n // If project ID changed, ignore the results.\n if (this.props.reduxProjectId !== projectId) {\n return;\n }\n const title = data.title;\n if (title) {\n this.props.onSetProjectTitle(title);\n }\n const authorName = data.author.username;\n const authorThumbnail = \"https://trampoline.turbowarp.org/avatars/\".concat(data.author.id);\n this.props.onSetAuthor(authorName, authorThumbnail);\n const instructions = data.instructions || '';\n const credits = data.description || '';\n if (instructions || credits) {\n this.props.onSetDescription(instructions, credits);\n }\n setIndexable(true);\n }).catch(err => {\n setIndexable(false);\n if (\"\".concat(err).includes('unshared')) {\n this.props.onSetDescription('unshared', 'unshared');\n }\n _log__WEBPACK_IMPORTED_MODULE_3__[\"default\"].warn('cannot fetch project meta', err);\n });\n }\n }\n }\n render() {\n const _this$props = this.props,\n {\n /* eslint-disable no-unused-vars */\n reduxProjectId,\n onSetAuthor,\n onSetDescription,\n onSetProjectTitle\n /* eslint-enable no-unused-vars */\n } = _this$props,\n props = _objectWithoutProperties(_this$props, _excluded);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(WrappedComponent, props);\n }\n }\n ProjectMetaFetcherComponent.propTypes = {\n reduxProjectId: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n onSetAuthor: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n onSetDescription: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n onSetProjectTitle: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func\n };\n const mapStateToProps = state => ({\n reduxProjectId: state.scratchGui.projectState.projectId\n });\n const mapDispatchToProps = dispatch => ({\n onSetAuthor: (username, thumbnail) => dispatch(Object(_reducers_tw__WEBPACK_IMPORTED_MODULE_5__[/* setAuthor */ \"d\"])({\n username,\n thumbnail\n })),\n onSetDescription: (instructions, credits) => dispatch(Object(_reducers_tw__WEBPACK_IMPORTED_MODULE_5__[/* setDescription */ \"h\"])({\n instructions,\n credits\n })),\n onSetProjectTitle: title => dispatch(Object(_reducers_project_title__WEBPACK_IMPORTED_MODULE_4__[/* setProjectTitle */ \"c\"])(title))\n });\n return Object(react_redux__WEBPACK_IMPORTED_MODULE_2__[/* connect */ \"b\"])(mapStateToProps, mapDispatchToProps)(ProjectMetaFetcherComponent);\n};\n\n\n/***/ }),\n/* 210 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return SBFileUploaderHOC; });\n/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4);\n/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(0);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(2);\n/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(7);\n/* harmony import */ var _lib_log__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(11);\n/* harmony import */ var _shared_messages__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(49);\n/* harmony import */ var _reducers_tw__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(23);\n/* harmony import */ var _reducers_project_state__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(12);\n/* harmony import */ var _reducers_project_title__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(56);\n/* harmony import */ var _reducers_modals__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(14);\n/* harmony import */ var _reducers_menus__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(18);\nconst _excluded = [\"cancelFileUpload\", \"closeFileMenu\", \"isLoadingUpload\", \"isShowingWithoutId\", \"loadingState\", \"onLoadingFailed\", \"onLoadingFinished\", \"onLoadingStarted\", \"onSetFileHandle\", \"onSetProjectTitle\", \"projectChanged\", \"requestProjectUpload\", \"userOwnsProject\"];\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nfunction _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Higher Order Component to provide behavior for loading local project files into editor.\n * @param {React.Component} WrappedComponent the component to add project file loading functionality to\n * @returns {React.Component} WrappedComponent with project file loading functionality added\n *\n * \n * \n * \n */\nconst SBFileUploaderHOC = function SBFileUploaderHOC(WrappedComponent) {\n class SBFileUploaderComponent extends react__WEBPACK_IMPORTED_MODULE_1___default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall__WEBPACK_IMPORTED_MODULE_0___default()(this, ['createFileObjects', 'getProjectTitleFromFilename', 'handleFinishedLoadingUpload', 'handleStartSelectingFileUpload', 'handleChange', 'onload', 'removeFileObjects']);\n // tw: We have multiple instances of this HOC alive at a time. This flag fixes issues that arise from that.\n this.expectingFileUploadFinish = false;\n }\n componentDidUpdate(prevProps) {\n if (this.props.isLoadingUpload && !prevProps.isLoadingUpload && this.expectingFileUploadFinish) {\n this.handleFinishedLoadingUpload(); // cue step 5 below\n }\n }\n componentWillUnmount() {\n this.removeFileObjects();\n }\n // step 1: this is where the upload process begins\n handleStartSelectingFileUpload() {\n this.expectingFileUploadFinish = true;\n this.createFileObjects(); // go to step 2\n }\n // step 2: create a FileReader and an element, and issue a\n // pseudo-click to it. That will open the file chooser dialog.\n createFileObjects() {\n // redo step 7, in case it got skipped last time and its objects are\n // still in memory\n this.removeFileObjects();\n // create fileReader\n this.fileReader = new FileReader();\n this.fileReader.onload = this.onload;\n // tw: Use FS API when available\n if (this.props.showOpenFilePicker) {\n (async () => {\n try {\n const [handle] = await this.props.showOpenFilePicker({\n multiple: false,\n types: [{\n description: 'Scratch Project',\n accept: {\n // Chrome on Android tracks the MIME type of files that get downloaded and\n // then actually enforces that the type must match in showOpenFilePicker()\n // and does not allow the user to override the filter. As Scratch projects have\n // no well-defined and well-adopted MIME types, we can't assume anything about\n // what MIME type they are saved with, so we have to use the most broad MIME\n // type here. Otherwise some users just won't be able to load files for no\n // fault of their own.\n '*/*': ['.sb', '.sb2', '.sb3']\n }\n }]\n });\n const file = await handle.getFile();\n this.handleChange({\n target: {\n files: [file],\n handle: handle\n }\n });\n } catch (err) {\n // If the user aborted it, that's not an error.\n if (err && err.name === 'AbortError') {\n return;\n }\n _lib_log__WEBPACK_IMPORTED_MODULE_5__[\"default\"].error(err);\n }\n })();\n } else {\n // create element and add it to DOM\n this.inputElement = document.createElement('input');\n this.inputElement.accept = '.sb,.sb2,.sb3';\n this.inputElement.style = 'display: none;';\n this.inputElement.type = 'file';\n this.inputElement.onchange = this.handleChange; // connects to step 3\n document.body.appendChild(this.inputElement);\n // simulate a click to open file chooser dialog\n this.inputElement.click();\n }\n }\n // step 3: user has picked a file using the file chooser dialog.\n // We don't actually load the file here, we only decide whether to do so.\n handleChange(e) {\n const {\n intl,\n isShowingWithoutId,\n loadingState,\n projectChanged,\n userOwnsProject\n } = this.props;\n const thisFileInput = e.target;\n if (thisFileInput.files) {\n // Don't attempt to load if no file was selected\n this.fileToUpload = thisFileInput.files[0];\n\n // If user owns the project, or user has changed the project,\n // we must confirm with the user that they really intend to\n // replace it. (If they don't own the project and haven't\n // changed it, no need to confirm.)\n let uploadAllowed = true;\n if (userOwnsProject || projectChanged && isShowingWithoutId) {\n uploadAllowed = confirm(\n // eslint-disable-line no-alert\n intl.formatMessage(_shared_messages__WEBPACK_IMPORTED_MODULE_6__[/* default */ \"a\"].replaceProjectWarning));\n }\n if (uploadAllowed) {\n // Don't update file handle until after confirming replace.\n const handle = thisFileInput.handle;\n if (handle) {\n if (this.fileToUpload.name.endsWith('.sb3')) {\n this.props.onSetFileHandle(handle);\n } else {\n this.props.onSetFileHandle(null);\n }\n }\n\n // cues step 4\n this.props.requestProjectUpload(loadingState);\n } else {\n // skips ahead to step 7\n this.removeFileObjects();\n }\n this.props.closeFileMenu();\n }\n }\n // step 4 is below, in mapDispatchToProps\n\n // step 5: called from componentDidUpdate when project state shows\n // that project data has finished \"uploading\" into the browser\n handleFinishedLoadingUpload() {\n this.expectingFileUploadFinish = false;\n if (this.fileToUpload && this.fileReader) {\n // begin to read data from the file. When finished,\n // cues step 6 using the reader's onload callback\n this.fileReader.readAsArrayBuffer(this.fileToUpload);\n } else {\n this.props.cancelFileUpload(this.props.loadingState);\n // skip ahead to step 7\n this.removeFileObjects();\n }\n }\n // used in step 6 below\n getProjectTitleFromFilename(fileInputFilename) {\n if (!fileInputFilename) return '';\n // only parse title with valid scratch project extensions\n // (.sb, .sb2, and .sb3)\n const matches = fileInputFilename.match(/^(.*)\\.sb[23]?$/);\n if (!matches) return '';\n return matches[1].substring(0, 100); // truncate project title to max 100 chars\n }\n // step 6: attached as a handler on our FileReader object; called when\n // file upload raw data is available in the reader\n onload() {\n if (this.fileReader) {\n this.props.onLoadingStarted();\n const filename = this.fileToUpload && this.fileToUpload.name;\n let loadingSuccess = false;\n // tw: stop when loading new project\n this.props.vm.quit();\n this.props.vm.loadProject(this.fileReader.result).then(() => {\n if (filename) {\n const uploadedProjectTitle = this.getProjectTitleFromFilename(filename);\n this.props.onSetProjectTitle(uploadedProjectTitle);\n }\n this.props.vm.renderer.draw();\n loadingSuccess = true;\n }).catch(error => {\n _lib_log__WEBPACK_IMPORTED_MODULE_5__[\"default\"].error(error);\n this.props.onLoadingFailed(error);\n }).then(() => {\n this.props.onLoadingFinished(this.props.loadingState, loadingSuccess);\n // go back to step 7: whether project loading succeeded\n // or failed, reset file objects\n this.removeFileObjects();\n });\n }\n }\n // step 7: remove the element from the DOM and clear reader and\n // fileToUpload reference, so those objects can be garbage collected\n removeFileObjects() {\n if (this.inputElement) {\n this.inputElement.value = null;\n document.body.removeChild(this.inputElement);\n }\n this.inputElement = null;\n this.fileReader = null;\n this.fileToUpload = null;\n }\n render() {\n const _this$props = this.props,\n {\n /* eslint-disable no-unused-vars */\n cancelFileUpload,\n closeFileMenu: closeFileMenuProp,\n isLoadingUpload,\n isShowingWithoutId,\n loadingState,\n onLoadingFailed,\n onLoadingFinished,\n onLoadingStarted,\n onSetFileHandle,\n onSetProjectTitle,\n projectChanged,\n requestProjectUpload: requestProjectUploadProp,\n userOwnsProject\n /* eslint-enable no-unused-vars */\n } = _this$props,\n componentProps = _objectWithoutProperties(_this$props, _excluded);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_1___default.a.Fragment, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(WrappedComponent, _extends({\n onStartSelectingFileUpload: this.handleStartSelectingFileUpload\n }, componentProps)));\n }\n }\n SBFileUploaderComponent.propTypes = {\n canSave: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n cancelFileUpload: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,\n closeFileMenu: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,\n intl: react_intl__WEBPACK_IMPORTED_MODULE_3__[/* intlShape */ \"i\"].isRequired,\n isLoadingUpload: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n isShowingProject: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n isShowingWithoutId: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n loadingState: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(_reducers_project_state__WEBPACK_IMPORTED_MODULE_8__[/* LoadingStates */ \"a\"]),\n onLoadingFailed: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,\n onLoadingFinished: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,\n onLoadingStarted: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,\n onSetProjectTitle: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,\n projectChanged: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n requestProjectUpload: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,\n showOpenFilePicker: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,\n userOwnsProject: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool,\n vm: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.shape({\n loadProject: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,\n quit: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func,\n renderer: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.shape({\n draw: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func\n })\n }),\n onSetFileHandle: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func\n };\n SBFileUploaderComponent.defaultProps = {\n showOpenFilePicker: typeof showOpenFilePicker === 'function' && !navigator.userAgent.includes('Android') ? window.showOpenFilePicker.bind(window) : null\n };\n const mapStateToProps = (state, ownProps) => {\n const loadingState = state.scratchGui.projectState.loadingState;\n const user = state.session && state.session.session && state.session.session.user;\n return {\n isLoadingUpload: Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_8__[/* getIsLoadingUpload */ \"n\"])(loadingState),\n isShowingProject: Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_8__[/* getIsShowingProject */ \"r\"])(loadingState),\n isShowingWithoutId: Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_8__[/* getIsShowingWithoutId */ \"t\"])(loadingState),\n loadingState: loadingState,\n projectChanged: state.scratchGui.projectChanged,\n userOwnsProject: ownProps.authorUsername && user && ownProps.authorUsername === user.username,\n vm: state.scratchGui.vm\n };\n };\n const mapDispatchToProps = (dispatch, ownProps) => ({\n cancelFileUpload: loadingState => dispatch(Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_8__[/* onLoadedProject */ \"x\"])(loadingState, false, false)),\n closeFileMenu: () => dispatch(Object(_reducers_menus__WEBPACK_IMPORTED_MODULE_11__[/* closeFileMenu */ \"i\"])()),\n onLoadingFailed: error => {\n dispatch(Object(_reducers_tw__WEBPACK_IMPORTED_MODULE_7__[/* setProjectError */ \"q\"])(error));\n dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_10__[/* openInvalidProjectModal */ \"z\"])());\n },\n // transition project state from loading to regular, and close\n // loading screen and file menu\n onLoadingFinished: (loadingState, success) => {\n dispatch(Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_8__[/* onLoadedProject */ \"x\"])(loadingState, ownProps.canSave, success));\n dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_10__[/* closeLoadingProject */ \"h\"])());\n dispatch(Object(_reducers_menus__WEBPACK_IMPORTED_MODULE_11__[/* closeFileMenu */ \"i\"])());\n },\n // show project loading screen\n onLoadingStarted: () => dispatch(Object(_reducers_modals__WEBPACK_IMPORTED_MODULE_10__[/* openLoadingProject */ \"A\"])()),\n onSetProjectTitle: title => dispatch(Object(_reducers_project_title__WEBPACK_IMPORTED_MODULE_9__[/* setProjectTitle */ \"c\"])(title)),\n // step 4: transition the project state so we're ready to handle the new\n // project data. When this is done, the project state transition will be\n // noticed by componentDidUpdate()\n requestProjectUpload: loadingState => dispatch(Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_8__[/* requestProjectUpload */ \"C\"])(loadingState)),\n onSetFileHandle: fileHandle => dispatch(Object(_reducers_tw__WEBPACK_IMPORTED_MODULE_7__[/* setFileHandle */ \"j\"])(fileHandle))\n });\n // Allow incoming props to override redux-provided props. Used to mock in tests.\n const mergeProps = (stateProps, dispatchProps, ownProps) => Object.assign({}, stateProps, dispatchProps, ownProps);\n return Object(react_intl__WEBPACK_IMPORTED_MODULE_3__[/* injectIntl */ \"h\"])(Object(react_redux__WEBPACK_IMPORTED_MODULE_4__[/* connect */ \"b\"])(mapStateToProps, mapDispatchToProps, mergeProps)(SBFileUploaderComponent));\n};\n\n\n/***/ }),\n/* 211 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var react_modal__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(96);\n/* harmony import */ var react_modal__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_modal__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _box_box_jsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(5);\n/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(2);\n/* harmony import */ var _lib_tw_environment_support_prober_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(95);\n/* harmony import */ var _lib_brand_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(24);\n/* harmony import */ var _lib_brand_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_lib_brand_js__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _browser_modal_css__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(116);\n/* harmony import */ var _browser_modal_css__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_browser_modal_css__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _unsupported_browser_svg__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(380);\n/* harmony import */ var _unsupported_browser_svg__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_unsupported_browser_svg__WEBPACK_IMPORTED_MODULE_8__);\nconst _excluded = [\"intl\"];\nfunction _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\n\n\n\n\n\nconst messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_4__[/* defineMessages */ \"g\"])({\n browserNotSupported: {\n \"id\": \"gui.unsupportedBrowser.label\",\n \"defaultMessage\": \"Browser is not supported\"\n },\n systemNotSupported: {\n \"id\": \"tw.browserModal.desktopTitle\",\n \"defaultMessage\": \"System is not supported\"\n }\n});\nconst noop = () => {};\nconst BrowserModal = _ref => {\n let {\n intl\n } = _ref,\n props = _objectWithoutProperties(_ref, _excluded);\n const title = props.onClickDesktopSettings ? messages.systemNotSupported : messages.browserNotSupported;\n const incompatibleUserscripts = Object(_lib_tw_environment_support_prober_js__WEBPACK_IMPORTED_MODULE_5__[/* findIncompatibleUserscripts */ \"a\"])();\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_modal__WEBPACK_IMPORTED_MODULE_2___default.a, {\n isOpen: true,\n className: _browser_modal_css__WEBPACK_IMPORTED_MODULE_7___default.a.modalContent,\n contentLabel: intl.formatMessage(title),\n overlayClassName: _browser_modal_css__WEBPACK_IMPORTED_MODULE_7___default.a.modalOverlay,\n onRequestClose: noop\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"div\", {\n dir: props.isRtl ? 'rtl' : 'ltr'\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__[/* default */ \"a\"], {\n className: _browser_modal_css__WEBPACK_IMPORTED_MODULE_7___default.a.illustration\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"img\", {\n src: _unsupported_browser_svg__WEBPACK_IMPORTED_MODULE_8___default.a,\n draggable: false\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_box_box_jsx__WEBPACK_IMPORTED_MODULE_3__[/* default */ \"a\"], {\n className: _browser_modal_css__WEBPACK_IMPORTED_MODULE_7___default.a.body\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"h2\", {\n className: _browser_modal_css__WEBPACK_IMPORTED_MODULE_7___default.a.title\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_4__[/* FormattedMessage */ \"b\"], title)), Object(_lib_tw_environment_support_prober_js__WEBPACK_IMPORTED_MODULE_5__[/* isNewFunctionSupported */ \"c\"])() ? null :\n /*#__PURE__*/\n // This message should only be seen by website operators, so we don't need to translate it\n react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"p\", null, 'Unable to compile JavaScript with new Function(). This is most likely caused by an overly-strict Content-Security-Policy. The CSP must include \\'unsafe-eval\\'.'), incompatibleUserscripts.length > 0 && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_1___default.a.Fragment, null, incompatibleUserscripts.map((message, index) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"p\", {\n key: index\n }, message))), !Object(_lib_tw_environment_support_prober_js__WEBPACK_IMPORTED_MODULE_5__[/* isRendererSupported */ \"d\"])() && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_1___default.a.Fragment, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"p\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_4__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"{APP_NAME} requires WebGL, however your computer does not seem to support it. This is often a temporary error that can be fixed by restarting your computer.\",\n id: \"tw.browserModal.webgl1\",\n values: {\n APP_NAME: _lib_brand_js__WEBPACK_IMPORTED_MODULE_6__[\"APP_NAME\"]\n }\n })), props.onClickDesktopSettings ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_1___default.a.Fragment, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"p\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_4__[/* FormattedMessage */ \"b\"], {\n defaultMessage: 'You can also try toggling the \"graphics acceleration\" option in desktop settings:',\n id: \"tw.browserModal.webglDesktop\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"div\", {\n className: _browser_modal_css__WEBPACK_IMPORTED_MODULE_7___default.a.desktopSettingsOuter\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"button\", {\n onClick: props.onClickDesktopSettings,\n className: _browser_modal_css__WEBPACK_IMPORTED_MODULE_7___default.a.desktopSettingsInner\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_4__[/* FormattedMessage */ \"b\"], {\n defaultMessage: \"Open Desktop Settings\",\n id: \"tw.browserModal.desktopSettings\"\n })))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(\"p\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_4__[/* FormattedMessage */ \"b\"], {\n defaultMessage: 'Use a recent version of Chrome, Firefox, or Safari, and ensure your graphics drivers are up to date. You can also try toggling the \"graphics acceleration\" or \"hardware acceleration\" option in your browser\\'s settings.',\n id: \"tw.browserModal.webglBrowser\"\n }))))));\n};\nBrowserModal.propTypes = {\n intl: react_intl__WEBPACK_IMPORTED_MODULE_4__[/* intlShape */ \"i\"].isRequired,\n isRtl: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.bool,\n onClickDesktopSettings: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.func\n};\nconst WrappedBrowserModal = Object(react_intl__WEBPACK_IMPORTED_MODULE_4__[/* injectIntl */ \"h\"])(BrowserModal);\nWrappedBrowserModal.setAppElement = react_modal__WEBPACK_IMPORTED_MODULE_2___default.a.setAppElement;\n/* harmony default export */ __webpack_exports__[\"a\"] = (WrappedBrowserModal);\n\n/***/ }),\n/* 212 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// EXTERNAL MODULE: ./node_modules/classnames/index.js\nvar classnames = __webpack_require__(3);\nvar classnames_default = /*#__PURE__*/__webpack_require__.n(classnames);\n\n// EXTERNAL MODULE: ./node_modules/react-redux/es/index.js + 14 modules\nvar es = __webpack_require__(7);\n\n// EXTERNAL MODULE: ./node_modules/redux/es/index.js + 6 modules\nvar redux_es = __webpack_require__(44);\n\n// EXTERNAL MODULE: ./node_modules/react-intl/lib/index.es.js + 1 modules\nvar index_es = __webpack_require__(2);\n\n// EXTERNAL MODULE: ./node_modules/prop-types/index.js\nvar prop_types = __webpack_require__(0);\nvar prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);\n\n// EXTERNAL MODULE: ./node_modules/lodash.bindall/index.js\nvar lodash_bindall = __webpack_require__(4);\nvar lodash_bindall_default = /*#__PURE__*/__webpack_require__.n(lodash_bindall);\n\n// EXTERNAL MODULE: ./node_modules/bowser/src/bowser.js\nvar bowser = __webpack_require__(218);\nvar bowser_default = /*#__PURE__*/__webpack_require__.n(bowser);\n\n// EXTERNAL MODULE: ./node_modules/react/index.js\nvar react = __webpack_require__(1);\nvar react_default = /*#__PURE__*/__webpack_require__.n(react);\n\n// EXTERNAL MODULE: ./node_modules/scratch-vm/src/index.js\nvar src = __webpack_require__(13);\nvar src_default = /*#__PURE__*/__webpack_require__.n(src);\n\n// EXTERNAL MODULE: ./src/components/box/box.jsx\nvar box = __webpack_require__(5);\n\n// EXTERNAL MODULE: ./src/components/button/button.jsx\nvar button_button = __webpack_require__(36);\n\n// EXTERNAL MODULE: ./src/components/menu-bar/icon--see-community.svg\nvar icon_see_community = __webpack_require__(188);\nvar icon_see_community_default = /*#__PURE__*/__webpack_require__.n(icon_see_community);\n\n// EXTERNAL MODULE: ./src/components/menu-bar/community-button.css\nvar community_button = __webpack_require__(239);\nvar community_button_default = /*#__PURE__*/__webpack_require__.n(community_button);\n\n// CONCATENATED MODULE: ./src/components/menu-bar/community-button.jsx\n\n\n\n\n\n\n\nconst CommunityButton = _ref => {\n let {\n className,\n onClick\n } = _ref;\n return /*#__PURE__*/react_default.a.createElement(button_button[\"a\" /* default */], {\n className: classnames_default()(className, community_button_default.a.communityButton),\n iconClassName: community_button_default.a.communityButtonIcon,\n iconSrc: icon_see_community_default.a,\n iconWidth: 20,\n iconHeight: 20,\n onClick: onClick\n }, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"See Project Page\",\n id: \"gui.menuBar.seeProjectPage\"\n }));\n};\nCommunityButton.propTypes = {\n className: prop_types_default.a.string,\n onClick: prop_types_default.a.func\n};\nCommunityButton.defaultProps = {\n onClick: () => {}\n};\n/* harmony default export */ var menu_bar_community_button = (CommunityButton);\n// EXTERNAL MODULE: ./src/components/menu-bar/share-button.css\nvar share_button = __webpack_require__(240);\nvar share_button_default = /*#__PURE__*/__webpack_require__.n(share_button);\n\n// CONCATENATED MODULE: ./src/components/menu-bar/share-button.jsx\n\n\n\n\n\n\nconst ShareButton = _ref => {\n let {\n className,\n isShared,\n onClick\n } = _ref;\n return /*#__PURE__*/react_default.a.createElement(button_button[\"a\" /* default */], {\n className: classnames_default()(className, share_button_default.a.shareButton, {\n [share_button_default.a.shareButtonIsShared]: isShared\n }),\n onClick: onClick\n }, isShared ? /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Shared\",\n id: \"gui.menuBar.isShared\"\n }) : /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Share\",\n id: \"gui.menuBar.share\"\n }));\n};\nShareButton.propTypes = {\n className: prop_types_default.a.string,\n isShared: prop_types_default.a.bool,\n onClick: prop_types_default.a.func\n};\nShareButton.defaultProps = {\n onClick: () => {}\n};\n/* harmony default export */ var menu_bar_share_button = (ShareButton);\n// EXTERNAL MODULE: ./src/components/coming-soon/coming-soon.jsx\nvar coming_soon = __webpack_require__(161);\n\n// EXTERNAL MODULE: ./src/components/divider/divider.jsx\nvar divider = __webpack_require__(185);\n\n// EXTERNAL MODULE: ./src/reducers/alerts.js\nvar alerts = __webpack_require__(20);\n\n// EXTERNAL MODULE: ./src/components/spinner/spinner.jsx\nvar spinner = __webpack_require__(132);\n\n// EXTERNAL MODULE: ./src/lib/alerts/index.jsx\nvar lib_alerts = __webpack_require__(45);\n\n// EXTERNAL MODULE: ./src/components/alerts/inline-message.css\nvar inline_message = __webpack_require__(202);\nvar inline_message_default = /*#__PURE__*/__webpack_require__.n(inline_message);\n\n// CONCATENATED MODULE: ./src/components/alerts/inline-message.jsx\n\n\n\n\n\n\nconst InlineMessageComponent = _ref => {\n let {\n content,\n iconSpinner,\n level\n } = _ref;\n return /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: classnames_default()(inline_message_default.a.inlineMessage, inline_message_default.a[level])\n }, iconSpinner && /*#__PURE__*/react_default.a.createElement(spinner[\"a\" /* default */], {\n small: true,\n className: inline_message_default.a.spinner,\n level: 'info'\n }), content);\n};\nInlineMessageComponent.propTypes = {\n content: prop_types_default.a.element,\n iconSpinner: prop_types_default.a.bool,\n level: prop_types_default.a.string\n};\nInlineMessageComponent.defaultProps = {\n level: lib_alerts[\"a\" /* AlertLevels */].INFO\n};\n/* harmony default export */ var alerts_inline_message = (InlineMessageComponent);\n// CONCATENATED MODULE: ./src/containers/inline-messages.jsx\n\n\n\n\n\nconst InlineMessages = _ref => {\n let {\n alertsList,\n className\n } = _ref;\n if (!alertsList) {\n return null;\n }\n // only display inline alerts here\n const inlineAlerts = Object(alerts[\"e\" /* filterInlineAlerts */])(alertsList);\n if (!inlineAlerts || !inlineAlerts.length) {\n return null;\n }\n\n // get first alert\n const firstInlineAlert = inlineAlerts[0];\n const {\n content,\n iconSpinner,\n level\n } = firstInlineAlert;\n return /*#__PURE__*/react_default.a.createElement(alerts_inline_message, {\n className: className,\n content: content,\n iconSpinner: iconSpinner,\n level: level\n });\n};\nInlineMessages.propTypes = {\n alertsList: prop_types_default.a.arrayOf(prop_types_default.a.object),\n className: prop_types_default.a.string\n};\nconst inline_messages_mapStateToProps = state => ({\n alertsList: state.scratchGui.alerts.alertsList\n});\nconst inline_messages_mapDispatchToProps = () => ({});\n/* harmony default export */ var inline_messages = (Object(es[\"b\" /* connect */])(inline_messages_mapStateToProps, inline_messages_mapDispatchToProps)(InlineMessages));\n// EXTERNAL MODULE: ./src/reducers/project-state.js\nvar project_state = __webpack_require__(12);\n\n// EXTERNAL MODULE: ./src/components/menu-bar/save-status.css\nvar save_status = __webpack_require__(189);\nvar save_status_default = /*#__PURE__*/__webpack_require__.n(save_status);\n\n// CONCATENATED MODULE: ./src/components/menu-bar/save-status.jsx\n\n\n\n\n\n\n\n\n\n// Wrapper for inline messages in the nav bar, which are all related to saving.\n// Show any inline messages if present, else show the \"Save Now\" button if the\n// project has changed.\n// We decided to not use an inline message for \"Save Now\" because it is a reflection\n// of the project state, rather than an event.\nconst SaveStatus = _ref => {\n let {\n alertsList,\n projectChanged,\n onClickSave\n } = _ref;\n return Object(alerts[\"e\" /* filterInlineAlerts */])(alertsList).length > 0 ? /*#__PURE__*/react_default.a.createElement(inline_messages, null) : projectChanged && /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: save_status_default.a.saveNow,\n onClick: onClickSave\n }, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Save Now\",\n id: \"gui.menuBar.saveNowLink\"\n }));\n};\nSaveStatus.propTypes = {\n alertsList: prop_types_default.a.arrayOf(prop_types_default.a.object),\n onClickSave: prop_types_default.a.func,\n projectChanged: prop_types_default.a.bool\n};\nconst save_status_mapStateToProps = state => ({\n alertsList: state.scratchGui.alerts.alertsList,\n projectChanged: state.scratchGui.projectChanged\n});\nconst save_status_mapDispatchToProps = dispatch => ({\n onClickSave: () => dispatch(Object(project_state[\"v\" /* manualUpdateProject */])())\n});\n/* harmony default export */ var menu_bar_save_status = (Object(es[\"b\" /* connect */])(save_status_mapStateToProps, save_status_mapDispatchToProps)(SaveStatus));\n// CONCATENATED MODULE: ./src/containers/project-watcher.jsx\n\n\n\n\n\n\n/**\n * Watches for project to finish updating before taking some action.\n *\n * To use ProjectWatcher, pass it a callback function using the onDoneUpdating prop.\n * ProjectWatcher passes a waitForUpdate function to its children, which they can call\n * to set ProjectWatcher to request that it call the onDoneUpdating callback when\n * project is no longer updating.\n */\nclass project_watcher_ProjectWatcher extends react_default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['waitForUpdate']);\n this.state = {\n waiting: false\n };\n }\n componentDidUpdate(prevProps) {\n if (this.state.waiting && this.props.isShowingWithId && !prevProps.isShowingWithId) {\n this.fulfill();\n }\n }\n fulfill() {\n this.props.onDoneUpdating();\n this.setState({\n // eslint-disable-line react/no-did-update-set-state\n waiting: false\n });\n }\n waitForUpdate(isUpdating) {\n if (isUpdating) {\n this.setState({\n waiting: true\n });\n } else {\n // fulfill immediately\n this.fulfill();\n }\n }\n render() {\n return this.props.children(this.waitForUpdate);\n }\n}\nproject_watcher_ProjectWatcher.propTypes = {\n children: prop_types_default.a.func,\n isShowingWithId: prop_types_default.a.bool,\n onDoneUpdating: prop_types_default.a.func\n};\nproject_watcher_ProjectWatcher.defaultProps = {\n onDoneUpdating: () => {}\n};\nconst project_watcher_mapStateToProps = state => {\n const loadingState = state.scratchGui.projectState.loadingState;\n return {\n isShowingWithId: Object(project_state[\"s\" /* getIsShowingWithId */])(loadingState)\n };\n};\nconst project_watcher_mapDispatchToProps = () => ({});\n/* harmony default export */ var project_watcher = (Object(es[\"b\" /* connect */])(project_watcher_mapStateToProps, project_watcher_mapDispatchToProps)(project_watcher_ProjectWatcher));\n// EXTERNAL MODULE: ./src/components/menu/menu.css\nvar menu = __webpack_require__(88);\nvar menu_default = /*#__PURE__*/__webpack_require__.n(menu);\n\n// CONCATENATED MODULE: ./src/components/menu/menu.jsx\nconst _excluded = [\"children\", \"className\", \"place\"];\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nfunction _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\nconst MenuComponent = _ref => {\n let {\n className = '',\n children,\n componentRef,\n place = 'right'\n } = _ref;\n return /*#__PURE__*/react_default.a.createElement(\"ul\", {\n className: classnames_default()(menu_default.a.menu, className, {\n [menu_default.a.left]: place === 'left',\n [menu_default.a.right]: place === 'right'\n }),\n ref: componentRef\n }, children);\n};\nMenuComponent.propTypes = {\n children: prop_types_default.a.node,\n className: prop_types_default.a.string,\n componentRef: prop_types_default.a.func,\n place: prop_types_default.a.oneOf(['left', 'right'])\n};\nconst Submenu = _ref2 => {\n let {\n children,\n className,\n place\n } = _ref2,\n props = _objectWithoutProperties(_ref2, _excluded);\n return /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: classnames_default()(menu_default.a.submenu, className, {\n [menu_default.a.left]: place === 'left',\n [menu_default.a.right]: place === 'right'\n })\n }, /*#__PURE__*/react_default.a.createElement(MenuComponent, _extends({\n place: place\n }, props), children));\n};\nSubmenu.propTypes = {\n children: prop_types_default.a.node,\n className: prop_types_default.a.string,\n place: prop_types_default.a.oneOf(['left', 'right'])\n};\nconst MenuItem = _ref3 => {\n let {\n children,\n className,\n expanded = false,\n onClick\n } = _ref3;\n return /*#__PURE__*/react_default.a.createElement(\"li\", {\n className: classnames_default()(menu_default.a.menuItem, menu_default.a.hoverable, className, {\n [menu_default.a.expanded]: expanded\n }),\n onClick: onClick\n }, children);\n};\nMenuItem.propTypes = {\n children: prop_types_default.a.node,\n className: prop_types_default.a.string,\n expanded: prop_types_default.a.bool,\n onClick: prop_types_default.a.func\n};\nconst addDividerClassToFirstChild = (child, id) => child && /*#__PURE__*/react_default.a.cloneElement(child, {\n className: classnames_default()(child.className, {\n [menu_default.a.menuSection]: id === 0\n }),\n key: id\n});\nconst MenuSection = _ref4 => {\n let {\n children\n } = _ref4;\n return /*#__PURE__*/react_default.a.createElement(react_default.a.Fragment, null, react_default.a.Children.map(children, addDividerClassToFirstChild));\n};\nMenuSection.propTypes = {\n children: prop_types_default.a.node\n};\n\n// CONCATENATED MODULE: ./src/containers/menu.jsx\nconst menu_excluded = [\"open\", \"children\"];\nfunction menu_objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = menu_objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction menu_objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\nconst Menu = _ref => {\n let {\n open,\n children\n } = _ref,\n props = menu_objectWithoutProperties(_ref, menu_excluded);\n return open ? /*#__PURE__*/react_default.a.createElement(MenuComponent, props, children) : null;\n};\nMenu.propTypes = {\n children: prop_types_default.a.node,\n open: prop_types_default.a.bool.isRequired\n};\n/* harmony default export */ var containers_menu = (Menu);\n// CONCATENATED MODULE: ./src/components/menu-bar/menu-bar-menu.jsx\n\n\n\nconst MenuBarMenu = _ref => {\n let {\n children,\n className,\n open,\n place = 'right'\n } = _ref;\n return /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: className\n }, /*#__PURE__*/react_default.a.createElement(containers_menu, {\n open: open,\n place: place\n }, children));\n};\nMenuBarMenu.propTypes = {\n children: prop_types_default.a.node,\n className: prop_types_default.a.string,\n open: prop_types_default.a.bool,\n place: prop_types_default.a.oneOf(['left', 'right'])\n};\n/* harmony default export */ var menu_bar_menu = (MenuBarMenu);\n// EXTERNAL MODULE: ./src/components/menu-bar/menu-bar.css\nvar menu_bar = __webpack_require__(17);\nvar menu_bar_default = /*#__PURE__*/__webpack_require__.n(menu_bar);\n\n// CONCATENATED MODULE: ./src/components/menu-bar/tw-menu-label.jsx\n\n\n\n\n\nclass tw_menu_label_MenuLabel extends react_default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['handleClick', 'handleMouseUp', 'menuRef']);\n }\n componentDidMount() {\n if (this.props.open) this.addListeners();\n }\n componentDidUpdate(prevProps) {\n if (this.props.open && !prevProps.open) this.addListeners();\n if (!this.props.open && prevProps.open) this.removeListeners();\n }\n componentWillUnmount() {\n this.removeListeners();\n }\n addListeners() {\n document.addEventListener('mouseup', this.handleMouseUp);\n }\n removeListeners() {\n document.removeEventListener('mouseup', this.handleMouseUp);\n }\n handleClick(e) {\n // this is a bit sketchy, but we want to allow clicking on the menu itself and the images\n // and text directly inside it, but not the items inside the menu, which are under the button\n // in the DOM.\n if (e.target.closest('div') === this.menuEl) {\n if (this.props.open) {\n this.props.onClose();\n } else {\n this.props.onOpen();\n }\n }\n }\n handleMouseUp(e) {\n if (this.props.open && !this.menuEl.contains(e.target)) {\n this.props.onClose();\n }\n }\n menuRef(c) {\n this.menuEl = c;\n }\n render() {\n return /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: classnames_default()(menu_bar_default.a.menuBarItem, menu_bar_default.a.hoverable, {\n [menu_bar_default.a.active]: this.props.open\n }),\n onClick: this.handleClick,\n ref: this.menuRef\n }, this.props.children);\n }\n}\ntw_menu_label_MenuLabel.propTypes = {\n children: prop_types_default.a.node,\n open: prop_types_default.a.bool,\n onOpen: prop_types_default.a.func,\n onClose: prop_types_default.a.func\n};\n/* harmony default export */ var tw_menu_label = (tw_menu_label_MenuLabel);\n// EXTERNAL MODULE: ./src/reducers/project-title.js\nvar project_title = __webpack_require__(56);\n\n// EXTERNAL MODULE: ./src/components/forms/buffered-input-hoc.jsx\nvar buffered_input_hoc = __webpack_require__(91);\n\n// EXTERNAL MODULE: ./src/components/forms/input.jsx\nvar input = __webpack_require__(69);\n\n// EXTERNAL MODULE: ./src/components/menu-bar/project-title-input.css\nvar project_title_input = __webpack_require__(356);\nvar project_title_input_default = /*#__PURE__*/__webpack_require__.n(project_title_input);\n\n// CONCATENATED MODULE: ./src/components/menu-bar/project-title-input.jsx\n\n\n\n\n\n\n\n\nconst BufferedInput = Object(buffered_input_hoc[\"a\" /* default */])(input[\"a\" /* default */]);\n\nconst messages = Object(index_es[\"g\" /* defineMessages */])({\n projectTitlePlaceholder: {\n \"id\": \"gui.gui.projectTitlePlaceholder\",\n \"defaultMessage\": \"Project title here\"\n }\n});\nconst ProjectTitleInput = _ref => {\n let {\n className,\n intl,\n onSubmit,\n projectTitle\n } = _ref;\n return /*#__PURE__*/react_default.a.createElement(BufferedInput, {\n className: classnames_default()(project_title_input_default.a.titleField, className),\n maxLength: \"100\",\n placeholder: intl.formatMessage(messages.projectTitlePlaceholder),\n tabIndex: \"0\",\n type: \"text\",\n value: projectTitle,\n onSubmit: onSubmit\n });\n};\nProjectTitleInput.propTypes = {\n className: prop_types_default.a.string,\n intl: index_es[\"i\" /* intlShape */].isRequired,\n onSubmit: prop_types_default.a.func,\n projectTitle: prop_types_default.a.string\n};\nconst project_title_input_mapStateToProps = state => ({\n projectTitle: state.scratchGui.projectTitle\n});\nconst project_title_input_mapDispatchToProps = dispatch => ({\n onSubmit: title => dispatch(Object(project_title[\"c\" /* setProjectTitle */])(title))\n});\n/* harmony default export */ var menu_bar_project_title_input = (Object(index_es[\"h\" /* injectIntl */])(Object(es[\"b\" /* connect */])(project_title_input_mapStateToProps, project_title_input_mapDispatchToProps)(ProjectTitleInput)));\n// EXTERNAL MODULE: ./src/components/menu-bar/user-avatar.css\nvar user_avatar = __webpack_require__(357);\nvar user_avatar_default = /*#__PURE__*/__webpack_require__.n(user_avatar);\n\n// CONCATENATED MODULE: ./src/components/menu-bar/user-avatar.jsx\n\n\n\n\nconst UserAvatar = _ref => {\n let {\n className,\n imageUrl\n } = _ref;\n return /*#__PURE__*/react_default.a.createElement(\"img\", {\n className: classnames_default()(className, user_avatar_default.a.userThumbnail),\n src: imageUrl,\n draggable: false\n });\n};\nUserAvatar.propTypes = {\n className: prop_types_default.a.string,\n imageUrl: prop_types_default.a.string\n};\n/* harmony default export */ var menu_bar_user_avatar = (UserAvatar);\n// EXTERNAL MODULE: ./src/components/menu-bar/author-info.css\nvar author_info = __webpack_require__(115);\nvar author_info_default = /*#__PURE__*/__webpack_require__.n(author_info);\n\n// CONCATENATED MODULE: ./src/components/menu-bar/author-info.jsx\nconst author_info_excluded = [\"projectId\"];\nfunction author_info_objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = author_info_objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction author_info_objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\n\n\nconst ActualAuthorInfo = _ref => {\n let {\n className,\n imageUrl,\n projectTitle,\n // TODO: use userId to link to user's profile\n userId,\n // eslint-disable-line no-unused-vars\n username\n } = _ref;\n return /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: classnames_default()(className, author_info_default.a.authorInfo)\n }, /*#__PURE__*/react_default.a.createElement(menu_bar_user_avatar, {\n className: author_info_default.a.avatar,\n imageUrl: imageUrl\n }), /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: author_info_default.a.titleAuthor\n }, /*#__PURE__*/react_default.a.createElement(\"h1\", {\n className: author_info_default.a.projectTitle\n }, projectTitle), /*#__PURE__*/react_default.a.createElement(\"div\", null, /*#__PURE__*/react_default.a.createElement(\"span\", {\n className: author_info_default.a.usernameLine\n }, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"by {username}\",\n id: \"gui.authorInfo.byUser\",\n values: {\n username: /*#__PURE__*/react_default.a.createElement(\"span\", {\n className: author_info_default.a.username\n }, username)\n }\n })))));\n};\nActualAuthorInfo.propTypes = {\n className: prop_types_default.a.string,\n imageUrl: prop_types_default.a.string,\n projectTitle: prop_types_default.a.string,\n userId: prop_types_default.a.oneOfType([prop_types_default.a.string, prop_types_default.a.bool]),\n username: prop_types_default.a.oneOfType([prop_types_default.a.string, prop_types_default.a.bool])\n};\nconst AuthorInfo = _ref2 => {\n let {\n projectId\n } = _ref2,\n props = author_info_objectWithoutProperties(_ref2, author_info_excluded);\n return projectId ? /*#__PURE__*/react_default.a.createElement(\"a\", {\n className: author_info_default.a.link,\n href: \"https://scratch.mit.edu/projects/\".concat(projectId),\n target: \"_blank\",\n rel: \"noreferrer\"\n }, /*#__PURE__*/react_default.a.createElement(ActualAuthorInfo, props)) : /*#__PURE__*/react_default.a.createElement(ActualAuthorInfo, props);\n};\nAuthorInfo.propTypes = {\n projectId: prop_types_default.a.string\n};\n/* harmony default export */ var menu_bar_author_info = (AuthorInfo);\n// EXTERNAL MODULE: ./src/containers/sb3-downloader.jsx\nvar sb3_downloader = __webpack_require__(106);\n\n// EXTERNAL MODULE: ./src/reducers/restore-deletion.js\nvar restore_deletion = __webpack_require__(79);\n\n// CONCATENATED MODULE: ./src/containers/deletion-restorer.jsx\nconst deletion_restorer_excluded = [\"children\", \"dispatchUpdateRestore\"];\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction deletion_restorer_objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = deletion_restorer_objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction deletion_restorer_objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\n\n\n/**\n * DeletionRestorer component passes a restoreDeletion function to its child.\n * It expects this child to be a function with the signature\n * function (restoreDeletion, props) {}\n * The component can then be used to attach deletion restoring functionality\n * to any other component:\n *\n * {(restoreDeletion, props) => (\n * \n * )}\n */\nclass deletion_restorer_DeletionRestorer extends react_default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['restoreDeletion']);\n }\n restoreDeletion() {\n if (typeof this.props.restore === 'function') {\n this.props.restore();\n this.props.dispatchUpdateRestore({\n restoreFun: null,\n deletedItem: ''\n });\n }\n }\n render() {\n const _this$props = this.props,\n {\n /* eslint-disable no-unused-vars */\n children,\n dispatchUpdateRestore\n /* eslint-enable no-unused-vars */\n } = _this$props,\n props = deletion_restorer_objectWithoutProperties(_this$props, deletion_restorer_excluded);\n const restorable = typeof this.props.restore === 'function';\n return this.props.children(this.restoreDeletion, _objectSpread(_objectSpread({}, props), {}, {\n restorable\n }));\n }\n}\ndeletion_restorer_DeletionRestorer.propTypes = {\n children: prop_types_default.a.func,\n deletedItem: prop_types_default.a.string,\n dispatchUpdateRestore: prop_types_default.a.func,\n restore: prop_types_default.a.func\n};\nconst deletion_restorer_mapStateToProps = state => ({\n deletedItem: state.scratchGui.restoreDeletion.deletedItem,\n restore: state.scratchGui.restoreDeletion.restoreFun\n});\nconst deletion_restorer_mapDispatchToProps = dispatch => ({\n dispatchUpdateRestore: updatedState => {\n dispatch(Object(restore_deletion[\"c\" /* setRestore */])(updatedState));\n }\n});\n/* harmony default export */ var deletion_restorer = (Object(es[\"b\" /* connect */])(deletion_restorer_mapStateToProps, deletion_restorer_mapDispatchToProps)(deletion_restorer_DeletionRestorer));\n// CONCATENATED MODULE: ./src/containers/turbo-mode.jsx\nconst turbo_mode_excluded = [\"children\", \"vm\"];\nfunction turbo_mode_objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = turbo_mode_objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction turbo_mode_objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\n\n/**\n * Turbo Mode component passes toggleTurboMode function to its child.\n * It also includes `turboMode` in the props passed to the children.\n * It expects this child to be a function with the signature\n * function (toggleTurboMode, {turboMode, ...props}) {}\n * The component can then be used to attach turbo mode setting functionality\n * to any other component:\n *\n * {(toggleTurboMode, props) => (\n * \n * )}\n */\nclass turbo_mode_TurboMode extends react_default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['toggleTurboMode']);\n }\n toggleTurboMode() {\n this.props.vm.setTurboMode(!this.props.turboMode);\n }\n render() {\n const _this$props = this.props,\n {\n /* eslint-disable no-unused-vars */\n children,\n vm\n /* eslint-enable no-unused-vars */\n } = _this$props,\n props = turbo_mode_objectWithoutProperties(_this$props, turbo_mode_excluded);\n return this.props.children(this.toggleTurboMode, props);\n }\n}\nturbo_mode_TurboMode.propTypes = {\n children: prop_types_default.a.func,\n turboMode: prop_types_default.a.bool,\n vm: prop_types_default.a.shape({\n setTurboMode: prop_types_default.a.func\n })\n};\nconst turbo_mode_mapStateToProps = state => ({\n vm: state.scratchGui.vm,\n turboMode: state.scratchGui.vmStatus.turbo\n});\n/* harmony default export */ var turbo_mode = (Object(es[\"b\" /* connect */])(turbo_mode_mapStateToProps, () => ({}) // omit dispatch prop\n)(turbo_mode_TurboMode));\n// CONCATENATED MODULE: ./src/containers/menu-bar-hoc.jsx\nconst menu_bar_hoc_excluded = [\"projectChanged\"];\nfunction menu_bar_hoc_extends() { return menu_bar_hoc_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, menu_bar_hoc_extends.apply(null, arguments); }\nfunction menu_bar_hoc_objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = menu_bar_hoc_objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction menu_bar_hoc_objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\n\nconst menu_bar_hoc_MenuBarHOC = function MenuBarHOC(WrappedComponent) {\n class MenuBarContainer extends react_default.a.PureComponent {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['confirmReadyToReplaceProject', 'shouldSaveBeforeTransition']);\n }\n confirmReadyToReplaceProject(message) {\n let readyToReplaceProject = true;\n if (this.props.projectChanged && !this.props.canCreateNew) {\n readyToReplaceProject = this.props.confirmWithMessage(message);\n }\n return readyToReplaceProject;\n }\n shouldSaveBeforeTransition() {\n return this.props.canSave && this.props.projectChanged;\n }\n render() {\n const _this$props = this.props,\n {\n /* eslint-disable no-unused-vars */\n projectChanged\n /* eslint-enable no-unused-vars */\n } = _this$props,\n props = menu_bar_hoc_objectWithoutProperties(_this$props, menu_bar_hoc_excluded);\n return /*#__PURE__*/react_default.a.createElement(sb3_downloader[\"a\" /* default */], {\n showSaveFilePicker: this.props.showSaveFilePicker\n }, (_className, _downloadProject, extended) => /*#__PURE__*/react_default.a.createElement(WrappedComponent, menu_bar_hoc_extends({\n confirmReadyToReplaceProject: this.confirmReadyToReplaceProject,\n shouldSaveBeforeTransition: this.shouldSaveBeforeTransition,\n handleSaveProject: extended.smartSave\n }, props)));\n }\n }\n MenuBarContainer.propTypes = {\n canCreateNew: prop_types_default.a.bool,\n canSave: prop_types_default.a.bool,\n confirmWithMessage: prop_types_default.a.func,\n projectChanged: prop_types_default.a.bool,\n showSaveFilePicker: prop_types_default.a.func\n };\n MenuBarContainer.defaultProps = {\n // default to using standard js confirm\n confirmWithMessage: message => confirm(message) // eslint-disable-line no-alert\n };\n const mapStateToProps = state => ({\n projectChanged: state.scratchGui.projectChanged\n });\n const mapDispatchToProps = () => ({});\n // Allow incoming props to override redux-provided props. Used to mock in tests.\n const mergeProps = (stateProps, dispatchProps, ownProps) => Object.assign({}, stateProps, dispatchProps, ownProps);\n return Object(es[\"b\" /* connect */])(mapStateToProps, mapDispatchToProps, mergeProps)(MenuBarContainer);\n};\n/* harmony default export */ var menu_bar_hoc = (menu_bar_hoc_MenuBarHOC);\n// EXTERNAL MODULE: ./node_modules/@turbowarp/scratch-l10n/src/index.js + 2 modules\nvar scratch_l10n_src = __webpack_require__(67);\n\n// EXTERNAL MODULE: ./src/components/menu-bar/check.svg\nvar check = __webpack_require__(134);\nvar check_default = /*#__PURE__*/__webpack_require__.n(check);\n\n// EXTERNAL MODULE: ./src/components/language-selector/language-icon.svg\nvar language_icon = __webpack_require__(358);\nvar language_icon_default = /*#__PURE__*/__webpack_require__.n(language_icon);\n\n// EXTERNAL MODULE: ./src/reducers/menus.js\nvar menus = __webpack_require__(18);\n\n// EXTERNAL MODULE: ./src/reducers/locales.js + 1 modules\nvar locales = __webpack_require__(121);\n\n// EXTERNAL MODULE: ./src/components/menu-bar/settings-menu.css\nvar settings_menu = __webpack_require__(27);\nvar settings_menu_default = /*#__PURE__*/__webpack_require__.n(settings_menu);\n\n// EXTERNAL MODULE: ./src/components/menu-bar/dropdown-caret.svg\nvar dropdown_caret = __webpack_require__(71);\nvar dropdown_caret_default = /*#__PURE__*/__webpack_require__.n(dropdown_caret);\n\n// CONCATENATED MODULE: ./src/components/menu-bar/language-menu.jsx\nfunction language_menu_extends() { return language_menu_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, language_menu_extends.apply(null, arguments); }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass language_menu_LanguageMenu extends react_default.a.PureComponent {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['setRef', 'handleMouseOver']);\n }\n componentDidUpdate(prevProps) {\n // If the submenu has been toggled open, try scrolling the selected option into view.\n if (!prevProps.menuOpen && this.props.menuOpen && this.selectedRef) {\n this.scrollSelectedIntoView();\n }\n }\n setRef(component) {\n this.selectedRef = component;\n }\n handleMouseOver() {\n // If we are using hover rather than clicks for submenus, scroll the selected option into view\n if (!this.props.menuOpen && this.selectedRef) {\n this.scrollSelectedIntoView();\n }\n }\n scrollSelectedIntoView() {\n // the native scrollIntoView() scrolls the entire page when used outside the editor,\n // so we do this manually instead.\n // selectedRef is the checkmark , its parent is a
from , then a
from \n\n const menuItem = this.selectedRef.parentNode;\n const scrollContainer = menuItem.parentNode;\n const itemHeight = menuItem.offsetHeight;\n const selectedItemPosition = menuItem.offsetTop;\n const visibleHeight = scrollContainer.offsetHeight;\n scrollContainer.scrollTop = selectedItemPosition - visibleHeight / 2 + itemHeight / 2;\n }\n render() {\n return /*#__PURE__*/react_default.a.createElement(MenuItem, {\n expanded: this.props.menuOpen\n }, /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: settings_menu_default.a.option,\n onClick: this.props.onRequestOpen,\n onMouseOver: this.handleMouseOver\n }, /*#__PURE__*/react_default.a.createElement(\"img\", {\n className: settings_menu_default.a.icon,\n src: language_icon_default.a,\n draggable: false\n }), /*#__PURE__*/react_default.a.createElement(\"span\", {\n className: settings_menu_default.a.submenuLabel\n }, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Language\",\n id: \"gui.menuBar.language\"\n })), /*#__PURE__*/react_default.a.createElement(\"img\", {\n className: settings_menu_default.a.expandCaret,\n src: dropdown_caret_default.a,\n draggable: false\n })), /*#__PURE__*/react_default.a.createElement(Submenu, {\n className: settings_menu_default.a.languageSubmenu,\n place: this.props.isRtl ? 'left' : 'right'\n }, Object.keys(scratch_l10n_src[\"a\" /* default */]).map(locale => /*#__PURE__*/react_default.a.createElement(MenuItem, {\n key: locale,\n className: settings_menu_default.a.languageMenuItem\n // eslint-disable-next-line react/jsx-no-bind\n ,\n onClick: () => this.props.onChangeLanguage(locale)\n }, /*#__PURE__*/react_default.a.createElement(\"img\", language_menu_extends({\n className: classnames_default()(settings_menu_default.a.check, {\n [settings_menu_default.a.selected]: this.props.currentLocale === locale\n }),\n src: check_default.a,\n draggable: false\n }, this.props.currentLocale === locale && {\n ref: this.setRef\n })), scratch_l10n_src[\"a\" /* default */][locale].name))));\n }\n}\nlanguage_menu_LanguageMenu.propTypes = {\n currentLocale: prop_types_default.a.string,\n isRtl: prop_types_default.a.bool,\n label: prop_types_default.a.string,\n menuOpen: prop_types_default.a.bool,\n onChangeLanguage: prop_types_default.a.func,\n onRequestCloseSettings: prop_types_default.a.func,\n onRequestOpen: prop_types_default.a.func\n};\nconst language_menu_mapStateToProps = state => ({\n currentLocale: state.locales.locale,\n isRtl: state.locales.isRtl,\n menuOpen: Object(menus[\"q\" /* languageMenuOpen */])(state),\n messagesByLocale: state.locales.messagesByLocale\n});\nconst language_menu_mapDispatchToProps = (dispatch, ownProps) => ({\n onChangeLanguage: locale => {\n dispatch(Object(locales[\"d\" /* selectLocale */])(locale));\n ownProps.onRequestCloseSettings();\n },\n onRequestOpen: () => dispatch(Object(menus[\"B\" /* openLanguageMenu */])())\n});\n/* harmony default export */ var language_menu = (Object(es[\"b\" /* connect */])(language_menu_mapStateToProps, language_menu_mapDispatchToProps)(language_menu_LanguageMenu));\n// EXTERNAL MODULE: ./src/lib/themes/index.js + 10 modules\nvar themes = __webpack_require__(15);\n\n// EXTERNAL MODULE: ./src/reducers/theme.js\nvar reducers_theme = __webpack_require__(80);\n\n// EXTERNAL MODULE: ./src/lib/themes/themePersistance.js\nvar themePersistance = __webpack_require__(78);\n\n// EXTERNAL MODULE: ./src/components/menu-bar/tw-accent-rainbow.svg\nvar tw_accent_rainbow = __webpack_require__(359);\nvar tw_accent_rainbow_default = /*#__PURE__*/__webpack_require__.n(tw_accent_rainbow);\n\n// CONCATENATED MODULE: ./src/components/menu-bar/tw-theme-accent.jsx\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst options = Object(index_es[\"g\" /* defineMessages */])({\n [themes[\"e\" /* ACCENT_RED */]]: {\n \"id\": \"tw.accent.red\",\n \"defaultMessage\": \"Red\"\n },\n [themes[\"c\" /* ACCENT_PURPLE */]]: {\n \"id\": \"tw.accent.purple\",\n \"defaultMessage\": \"Purple\"\n },\n [themes[\"a\" /* ACCENT_BLUE */]]: {\n \"id\": \"tw.accent.blue\",\n \"defaultMessage\": \"Blue\"\n },\n [themes[\"d\" /* ACCENT_RAINBOW */]]: {\n \"id\": \"tw.accent.rainbow\",\n \"defaultMessage\": \"Rainbow\"\n }\n});\nconst icons = {\n [themes[\"d\" /* ACCENT_RAINBOW */]]: tw_accent_rainbow_default.a\n};\nconst ColorIcon = props => icons[props.id] ? /*#__PURE__*/react_default.a.createElement(\"img\", {\n className: settings_menu_default.a.accentIconOuter,\n src: icons[props.id],\n draggable: false\n // Image is decorative\n ,\n alt: \"\"\n}) : /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: settings_menu_default.a.accentIconOuter,\n style: {\n // menu-bar-background is var(...), don't want to evaluate with the current values\n backgroundColor: themes[\"b\" /* ACCENT_MAP */][props.id].guiColors['looks-secondary'],\n backgroundImage: themes[\"b\" /* ACCENT_MAP */][props.id].guiColors['menu-bar-background-image']\n }\n});\nColorIcon.propTypes = {\n id: prop_types_default.a.string\n};\nconst AccentMenuItem = props => /*#__PURE__*/react_default.a.createElement(MenuItem, {\n onClick: props.onClick\n}, /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: settings_menu_default.a.option\n}, /*#__PURE__*/react_default.a.createElement(\"img\", {\n className: classnames_default()(settings_menu_default.a.check, {\n [settings_menu_default.a.selected]: props.isSelected\n }),\n width: 15,\n height: 12,\n src: check_default.a,\n draggable: false\n}), /*#__PURE__*/react_default.a.createElement(ColorIcon, {\n id: props.id\n}), /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], options[props.id])));\nAccentMenuItem.propTypes = {\n id: prop_types_default.a.string,\n isSelected: prop_types_default.a.bool,\n onClick: prop_types_default.a.func\n};\nconst AccentThemeMenu = _ref => {\n let {\n isOpen,\n isRtl,\n onChangeTheme,\n onOpen,\n theme\n } = _ref;\n return /*#__PURE__*/react_default.a.createElement(MenuItem, {\n expanded: isOpen\n }, /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: settings_menu_default.a.option,\n onClick: onOpen\n }, /*#__PURE__*/react_default.a.createElement(ColorIcon, {\n id: theme.accent\n }), /*#__PURE__*/react_default.a.createElement(\"span\", {\n className: settings_menu_default.a.submenuLabel\n }, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Accent\",\n id: \"tw.menuBar.accent\"\n })), /*#__PURE__*/react_default.a.createElement(\"img\", {\n className: settings_menu_default.a.expandCaret,\n src: dropdown_caret_default.a,\n draggable: false\n })), /*#__PURE__*/react_default.a.createElement(Submenu, {\n place: isRtl ? 'left' : 'right'\n }, Object.keys(options).map(item => /*#__PURE__*/react_default.a.createElement(AccentMenuItem, {\n key: item,\n id: item,\n isSelected: theme.accent === item\n // eslint-disable-next-line react/jsx-no-bind\n ,\n onClick: () => onChangeTheme(theme.set('accent', item))\n }))));\n};\nAccentThemeMenu.propTypes = {\n isOpen: prop_types_default.a.bool,\n isRtl: prop_types_default.a.bool,\n onChangeTheme: prop_types_default.a.func,\n onOpen: prop_types_default.a.func,\n theme: prop_types_default.a.instanceOf(themes[\"m\" /* Theme */])\n};\nconst tw_theme_accent_mapStateToProps = state => ({\n isOpen: Object(menus[\"b\" /* accentMenuOpen */])(state),\n isRtl: state.locales.isRtl,\n theme: state.scratchGui.theme.theme\n});\nconst tw_theme_accent_mapDispatchToProps = dispatch => ({\n onChangeTheme: theme => {\n dispatch(Object(reducers_theme[\"b\" /* setTheme */])(theme));\n dispatch(Object(menus[\"l\" /* closeSettingsMenu */])());\n Object(themePersistance[\"c\" /* persistTheme */])(theme);\n },\n onOpen: () => dispatch(Object(menus[\"v\" /* openAccentMenu */])())\n});\n/* harmony default export */ var tw_theme_accent = (Object(es[\"b\" /* connect */])(tw_theme_accent_mapStateToProps, tw_theme_accent_mapDispatchToProps)(AccentThemeMenu));\n// EXTERNAL MODULE: ./src/components/menu-bar/tw-sun.svg\nvar tw_sun = __webpack_require__(360);\nvar tw_sun_default = /*#__PURE__*/__webpack_require__.n(tw_sun);\n\n// EXTERNAL MODULE: ./src/components/menu-bar/tw-moon.svg\nvar tw_moon = __webpack_require__(361);\nvar tw_moon_default = /*#__PURE__*/__webpack_require__.n(tw_moon);\n\n// CONCATENATED MODULE: ./src/components/menu-bar/tw-theme-gui.jsx\n\n\n\n\n\n\n\n\n\n\n\n\nconst GuiThemeMenu = _ref => {\n let {\n onChangeTheme,\n theme\n } = _ref;\n return /*#__PURE__*/react_default.a.createElement(MenuItem, null, /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: settings_menu_default.a.option\n // eslint-disable-next-line react/jsx-no-bind\n ,\n onClick: () => onChangeTheme(theme.set('gui', theme.gui === themes[\"k\" /* GUI_DARK */] ? themes[\"l\" /* GUI_LIGHT */] : themes[\"k\" /* GUI_DARK */]))\n }, /*#__PURE__*/react_default.a.createElement(\"img\", {\n src: theme.gui === themes[\"k\" /* GUI_DARK */] ? tw_sun_default.a : tw_moon_default.a,\n draggable: false,\n width: 24,\n height: 24\n }), /*#__PURE__*/react_default.a.createElement(\"span\", {\n className: settings_menu_default.a.submenuLabel\n }, theme.gui === themes[\"k\" /* GUI_DARK */] ? /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Switch To Light Mode\",\n id: \"tw.darkMode\"\n }) : /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Switch To Dark Mode\",\n id: \"tw.lightMode\"\n }))));\n};\nGuiThemeMenu.propTypes = {\n onChangeTheme: prop_types_default.a.func,\n theme: prop_types_default.a.instanceOf(themes[\"m\" /* Theme */])\n};\nconst tw_theme_gui_mapStateToProps = state => ({\n theme: state.scratchGui.theme.theme\n});\nconst tw_theme_gui_mapDispatchToProps = dispatch => ({\n onChangeTheme: theme => {\n dispatch(Object(reducers_theme[\"b\" /* setTheme */])(theme));\n dispatch(Object(menus[\"l\" /* closeSettingsMenu */])());\n Object(themePersistance[\"c\" /* persistTheme */])(theme);\n }\n});\n/* harmony default export */ var tw_theme_gui = (Object(es[\"b\" /* connect */])(tw_theme_gui_mapStateToProps, tw_theme_gui_mapDispatchToProps)(GuiThemeMenu));\n// EXTERNAL MODULE: ./src/components/menu-bar/tw-blocks-three.svg\nvar tw_blocks_three = __webpack_require__(362);\nvar tw_blocks_three_default = /*#__PURE__*/__webpack_require__.n(tw_blocks_three);\n\n// EXTERNAL MODULE: ./src/components/menu-bar/tw-blocks-high-contrast.svg\nvar tw_blocks_high_contrast = __webpack_require__(363);\nvar tw_blocks_high_contrast_default = /*#__PURE__*/__webpack_require__.n(tw_blocks_high_contrast);\n\n// EXTERNAL MODULE: ./src/components/menu-bar/tw-blocks-dark.svg\nvar tw_blocks_dark = __webpack_require__(364);\nvar tw_blocks_dark_default = /*#__PURE__*/__webpack_require__.n(tw_blocks_dark);\n\n// EXTERNAL MODULE: ./src/components/menu-bar/tw-blocks-custom.svg\nvar tw_blocks_custom = __webpack_require__(365);\nvar tw_blocks_custom_default = /*#__PURE__*/__webpack_require__.n(tw_blocks_custom);\n\n// EXTERNAL MODULE: ./src/components/menu-bar/tw-open-link.svg\nvar tw_open_link = __webpack_require__(366);\nvar tw_open_link_default = /*#__PURE__*/__webpack_require__.n(tw_open_link);\n\n// CONCATENATED MODULE: ./src/components/menu-bar/tw-theme-blocks.jsx\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst tw_theme_blocks_options = Object(index_es[\"g\" /* defineMessages */])({\n [themes[\"j\" /* BLOCKS_THREE */]]: {\n \"id\": \"tw.blockColors.three\",\n \"defaultMessage\": \"Original\"\n },\n [themes[\"h\" /* BLOCKS_HIGH_CONTRAST */]]: {\n \"id\": \"tw.blockColors.highContrast\",\n \"defaultMessage\": \"High Contrast\"\n },\n [themes[\"g\" /* BLOCKS_DARK */]]: {\n \"id\": \"tw.blockColors.dark\",\n \"defaultMessage\": \"Dark (Beta)\"\n },\n [themes[\"f\" /* BLOCKS_CUSTOM */]]: {\n \"id\": \"tw.blockColors.custom\",\n \"defaultMessage\": \"Customize in Addon Settings\"\n }\n});\nconst tw_theme_blocks_icons = {\n [themes[\"j\" /* BLOCKS_THREE */]]: tw_blocks_three_default.a,\n [themes[\"h\" /* BLOCKS_HIGH_CONTRAST */]]: tw_blocks_high_contrast_default.a,\n [themes[\"g\" /* BLOCKS_DARK */]]: tw_blocks_dark_default.a,\n [themes[\"f\" /* BLOCKS_CUSTOM */]]: tw_blocks_custom_default.a\n};\nconst ThemeIcon = _ref => {\n let {\n id\n } = _ref;\n return /*#__PURE__*/react_default.a.createElement(\"img\", {\n src: tw_theme_blocks_icons[id],\n draggable: false,\n width: 24\n });\n};\nThemeIcon.propTypes = {\n id: prop_types_default.a.string\n};\nconst ThemeMenuItem = _ref2 => {\n let {\n id,\n disabled,\n isSelected,\n onClick\n } = _ref2;\n return /*#__PURE__*/react_default.a.createElement(MenuItem, {\n onClick: disabled ? null : onClick\n }, /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: classnames_default()(settings_menu_default.a.option, {\n [settings_menu_default.a.disabled]: disabled\n })\n }, /*#__PURE__*/react_default.a.createElement(\"img\", {\n width: 15,\n height: 12,\n className: classnames_default()(settings_menu_default.a.check, {\n [settings_menu_default.a.selected]: isSelected\n }),\n src: check_default.a,\n draggable: false\n }), /*#__PURE__*/react_default.a.createElement(ThemeIcon, {\n id: id\n }), /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], tw_theme_blocks_options[id]), id === themes[\"f\" /* BLOCKS_CUSTOM */] && /*#__PURE__*/react_default.a.createElement(\"img\", {\n width: 20,\n height: 20,\n className: settings_menu_default.a.openLink,\n src: tw_open_link_default.a,\n draggable: false\n })));\n};\nThemeMenuItem.propTypes = {\n id: prop_types_default.a.string,\n isSelected: prop_types_default.a.bool,\n onClick: prop_types_default.a.func,\n disabled: prop_types_default.a.bool\n};\nconst BlocksThemeMenu = _ref3 => {\n let {\n isOpen,\n isRtl,\n onChangeTheme,\n onOpenCustomSettings,\n onOpenMenu,\n theme\n } = _ref3;\n return /*#__PURE__*/react_default.a.createElement(MenuItem, {\n expanded: isOpen\n }, /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: settings_menu_default.a.option,\n onClick: onOpenMenu\n }, /*#__PURE__*/react_default.a.createElement(ThemeIcon, {\n id: theme.blocks\n }), /*#__PURE__*/react_default.a.createElement(\"span\", {\n className: settings_menu_default.a.submenuLabel\n }, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Block Colors\",\n id: \"tw.menuBar.blockColors\"\n })), /*#__PURE__*/react_default.a.createElement(\"img\", {\n className: settings_menu_default.a.expandCaret,\n src: dropdown_caret_default.a,\n draggable: false\n })), /*#__PURE__*/react_default.a.createElement(Submenu, {\n place: isRtl ? 'left' : 'right'\n }, [themes[\"j\" /* BLOCKS_THREE */], themes[\"h\" /* BLOCKS_HIGH_CONTRAST */], themes[\"g\" /* BLOCKS_DARK */], ...(onOpenCustomSettings ? [themes[\"f\" /* BLOCKS_CUSTOM */]] : [])].map(i => /*#__PURE__*/react_default.a.createElement(ThemeMenuItem, {\n key: i,\n id: i,\n isSelected: theme.blocks === i\n // eslint-disable-next-line react/jsx-no-bind\n ,\n onClick: i === themes[\"f\" /* BLOCKS_CUSTOM */] ? onOpenCustomSettings : () => onChangeTheme(theme.set('blocks', i)),\n disabled: i !== themes[\"f\" /* BLOCKS_CUSTOM */] && theme.blocks === themes[\"f\" /* BLOCKS_CUSTOM */]\n }))));\n};\nBlocksThemeMenu.propTypes = {\n isOpen: prop_types_default.a.bool,\n isRtl: prop_types_default.a.bool,\n onChangeTheme: prop_types_default.a.func,\n onOpenCustomSettings: prop_types_default.a.func,\n onOpenMenu: prop_types_default.a.func,\n theme: prop_types_default.a.instanceOf(themes[\"m\" /* Theme */])\n};\nconst tw_theme_blocks_mapStateToProps = state => ({\n isOpen: Object(menus[\"d\" /* blocksThemeMenuOpen */])(state),\n isRtl: state.locales.isRtl,\n theme: state.scratchGui.theme.theme\n});\nconst tw_theme_blocks_mapDispatchToProps = dispatch => ({\n onChangeTheme: theme => {\n dispatch(Object(reducers_theme[\"b\" /* setTheme */])(theme));\n dispatch(Object(menus[\"l\" /* closeSettingsMenu */])());\n Object(themePersistance[\"c\" /* persistTheme */])(theme);\n },\n onOpenMenu: () => dispatch(Object(menus[\"x\" /* openBlocksThemeMenu */])())\n});\n/* harmony default export */ var tw_theme_blocks = (Object(es[\"b\" /* connect */])(tw_theme_blocks_mapStateToProps, tw_theme_blocks_mapDispatchToProps)(BlocksThemeMenu));\n// EXTERNAL MODULE: ./src/components/menu-bar/tw-desktop-icon.svg\nvar tw_desktop_icon = __webpack_require__(367);\nvar tw_desktop_icon_default = /*#__PURE__*/__webpack_require__.n(tw_desktop_icon);\n\n// CONCATENATED MODULE: ./src/components/menu-bar/tw-desktop-settings.jsx\n\n\n\n\n\n\nconst TWDesktopSettings = props => /*#__PURE__*/react_default.a.createElement(MenuItem, {\n onClick: props.onClick\n}, /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: settings_menu_default.a.option\n}, /*#__PURE__*/react_default.a.createElement(\"img\", {\n src: tw_desktop_icon_default.a,\n draggable: false,\n width: 24,\n height: 24,\n alt: \"\"\n}), /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Desktop Settings\",\n id: \"tw.menuBar.desktopSettings\"\n})));\nTWDesktopSettings.propTypes = {\n onClick: prop_types_default.a.func\n};\n/* harmony default export */ var tw_desktop_settings = (TWDesktopSettings);\n// EXTERNAL MODULE: ./src/components/menu-bar/icon--settings.svg\nvar icon_settings = __webpack_require__(368);\nvar icon_settings_default = /*#__PURE__*/__webpack_require__.n(icon_settings);\n\n// CONCATENATED MODULE: ./src/components/menu-bar/settings-menu.jsx\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst SettingsMenu = _ref => {\n let {\n canChangeLanguage,\n canChangeTheme,\n isRtl,\n onClickDesktopSettings,\n onOpenCustomSettings,\n onRequestClose,\n onRequestOpen,\n settingsMenuOpen\n } = _ref;\n return /*#__PURE__*/react_default.a.createElement(tw_menu_label, {\n open: settingsMenuOpen,\n onOpen: onRequestOpen,\n onClose: onRequestClose\n }, /*#__PURE__*/react_default.a.createElement(\"img\", {\n src: icon_settings_default.a,\n draggable: false,\n width: 20,\n height: 20\n }), /*#__PURE__*/react_default.a.createElement(\"span\", {\n className: settings_menu_default.a.dropdownLabel\n }, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Settings\",\n id: \"gui.menuBar.settings\"\n })), /*#__PURE__*/react_default.a.createElement(\"img\", {\n src: dropdown_caret_default.a,\n draggable: false,\n width: 8,\n height: 5\n }), /*#__PURE__*/react_default.a.createElement(menu_bar_menu, {\n className: menu_bar_default.a.menuBarMenu,\n open: settingsMenuOpen,\n place: isRtl ? 'left' : 'right'\n }, /*#__PURE__*/react_default.a.createElement(MenuSection, null, canChangeLanguage && /*#__PURE__*/react_default.a.createElement(language_menu, {\n onRequestCloseSettings: onRequestClose\n }), canChangeTheme && /*#__PURE__*/react_default.a.createElement(react_default.a.Fragment, null, /*#__PURE__*/react_default.a.createElement(tw_theme_gui, null), /*#__PURE__*/react_default.a.createElement(tw_theme_blocks, {\n onOpenCustomSettings: onOpenCustomSettings\n }), /*#__PURE__*/react_default.a.createElement(tw_theme_accent, null)), onClickDesktopSettings && /*#__PURE__*/react_default.a.createElement(tw_desktop_settings, {\n onClick: onClickDesktopSettings\n }))));\n};\nSettingsMenu.propTypes = {\n canChangeLanguage: prop_types_default.a.bool,\n canChangeTheme: prop_types_default.a.bool,\n isRtl: prop_types_default.a.bool,\n onClickDesktopSettings: prop_types_default.a.func,\n onOpenCustomSettings: prop_types_default.a.func,\n onRequestClose: prop_types_default.a.func,\n onRequestOpen: prop_types_default.a.func,\n settingsMenuOpen: prop_types_default.a.bool\n};\n/* harmony default export */ var menu_bar_settings_menu = (SettingsMenu);\n// CONCATENATED MODULE: ./src/containers/tw-framerate-changer.jsx\nconst tw_framerate_changer_excluded = [\"intl\", \"children\", \"vm\"];\nfunction tw_framerate_changer_objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = tw_framerate_changer_objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction tw_framerate_changer_objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\n\n\nconst tw_framerate_changer_messages = Object(index_es[\"g\" /* defineMessages */])({\n newFramerate: {\n \"id\": \"tw.menuBar.newFramerate\",\n \"defaultMessage\": \"New framerate:\"\n }\n});\nclass tw_framerate_changer_FramerateChanger extends react_default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['changeFramerate']);\n }\n async changeFramerate(e) {\n if (e && (e.ctrlKey || e.shiftKey)) {\n // prompt() returns Promise in desktop app\n // eslint-disable-next-line no-alert\n const newFPS = await prompt(this.props.intl.formatMessage(tw_framerate_changer_messages.newFramerate), this.props.framerate);\n if (newFPS === null) {\n return;\n }\n const fps = +newFPS;\n if (isFinite(fps) && fps > 0) {\n this.props.vm.setFramerate(fps);\n }\n } else if (this.props.framerate === 60) {\n this.props.vm.setFramerate(30);\n } else {\n this.props.vm.setFramerate(60);\n }\n }\n render() {\n const _this$props = this.props,\n {\n /* eslint-disable no-unused-vars */\n intl,\n children,\n vm\n /* eslint-enable no-unused-vars */\n } = _this$props,\n props = tw_framerate_changer_objectWithoutProperties(_this$props, tw_framerate_changer_excluded);\n return this.props.children(this.changeFramerate, props);\n }\n}\ntw_framerate_changer_FramerateChanger.propTypes = {\n intl: index_es[\"i\" /* intlShape */],\n children: prop_types_default.a.func,\n framerate: prop_types_default.a.number,\n vm: prop_types_default.a.instanceOf(src_default.a)\n};\nconst tw_framerate_changer_mapStateToProps = state => ({\n framerate: state.scratchGui.tw.framerate,\n vm: state.scratchGui.vm\n});\n/* harmony default export */ var tw_framerate_changer = (Object(index_es[\"h\" /* injectIntl */])(Object(es[\"b\" /* connect */])(tw_framerate_changer_mapStateToProps, () => ({}) // omit dispatch prop\n)(tw_framerate_changer_FramerateChanger)));\n// EXTERNAL MODULE: ./src/reducers/modals.js\nvar modals = __webpack_require__(14);\n\n// EXTERNAL MODULE: ./src/lib/isScratchDesktop.js\nvar isScratchDesktop = __webpack_require__(37);\n\n// CONCATENATED MODULE: ./src/containers/tw-change-username.jsx\n\n\n\n\n\n\n\n\nconst tw_change_username_messages = Object(index_es[\"g\" /* defineMessages */])({\n cannotChangeWhileRunning: {\n \"id\": \"tw.changeUsername.cannotChangeWhileRunning\",\n \"defaultMessage\": \"Username cannot be changed while the project is running.\"\n }\n});\nclass tw_change_username_ChangeUsername extends react_default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['changeUsername']);\n }\n changeUsername() {\n if (this.props.running && !Object(isScratchDesktop[\"a\" /* default */])()) {\n // eslint-disable-next-line no-alert\n alert(this.props.intl.formatMessage(tw_change_username_messages.cannotChangeWhileRunning));\n return;\n }\n this.props.onOpenUsernameModal();\n }\n render() {\n return this.props.children(this.changeUsername);\n }\n}\ntw_change_username_ChangeUsername.propTypes = {\n children: prop_types_default.a.func,\n onOpenUsernameModal: prop_types_default.a.func,\n running: prop_types_default.a.bool,\n intl: index_es[\"i\" /* intlShape */]\n};\nconst tw_change_username_mapStateToProps = state => ({\n running: state.scratchGui.vmStatus.running\n});\nconst tw_change_username_mapDispatchToProps = dispatch => ({\n onOpenUsernameModal: () => {\n dispatch(Object(modals[\"I\" /* openUsernameModal */])());\n dispatch(Object(menus[\"g\" /* closeEditMenu */])());\n }\n});\n/* harmony default export */ var tw_change_username = (Object(index_es[\"h\" /* injectIntl */])(Object(es[\"b\" /* connect */])(tw_change_username_mapStateToProps, tw_change_username_mapDispatchToProps)(tw_change_username_ChangeUsername)));\n// EXTERNAL MODULE: ./src/reducers/tw.js\nvar tw = __webpack_require__(23);\n\n// CONCATENATED MODULE: ./src/containers/tw-cloud-toggler.jsx\nconst tw_cloud_toggler_excluded = [\"children\"];\nfunction tw_cloud_toggler_objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = tw_cloud_toggler_objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction tw_cloud_toggler_objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\n\n\n\nconst tw_cloud_toggler_messages = Object(index_es[\"g\" /* defineMessages */])({\n cloudUnavailableAlert: {\n \"id\": \"tw.menuBar.cloudUnavailableAlert\",\n \"defaultMessage\": \"Cannot use cloud variables, most likely because you opened the editor.\"\n }\n});\nclass tw_cloud_toggler_CloudVariablesToggler extends react_default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['toggleCloudVariables']);\n }\n toggleCloudVariables() {\n if (!this.props.canUseCloudVariables) {\n const message = this.props.intl.formatMessage(tw_cloud_toggler_messages.cloudUnavailableAlert);\n // eslint-disable-next-line no-alert\n alert(message);\n return;\n }\n this.props.onCloudChange(!this.props.enabled);\n }\n render() {\n const _this$props = this.props,\n {\n /* eslint-disable no-unused-vars */\n children\n /* eslint-enable no-unused-vars */\n } = _this$props,\n props = tw_cloud_toggler_objectWithoutProperties(_this$props, tw_cloud_toggler_excluded);\n return this.props.children(this.toggleCloudVariables, props);\n }\n}\ntw_cloud_toggler_CloudVariablesToggler.propTypes = {\n intl: index_es[\"i\" /* intlShape */],\n children: prop_types_default.a.func,\n enabled: prop_types_default.a.bool,\n username: prop_types_default.a.string,\n onCloudChange: prop_types_default.a.func,\n canUseCloudVariables: prop_types_default.a.bool\n};\nconst tw_cloud_toggler_mapStateToProps = state => ({\n username: state.scratchGui.tw.username,\n enabled: state.scratchGui.tw.cloud,\n canUseCloudVariables: Object(isScratchDesktop[\"a\" /* default */])() || !state.scratchGui.mode.hasEverEnteredEditor\n});\nconst tw_cloud_toggler_mapDispatchToProps = dispatch => ({\n onCloudChange: enabled => dispatch(Object(tw[\"e\" /* setCloud */])(enabled))\n});\n/* harmony default export */ var tw_cloud_toggler = (Object(index_es[\"h\" /* injectIntl */])(Object(es[\"b\" /* connect */])(tw_cloud_toggler_mapStateToProps, tw_cloud_toggler_mapDispatchToProps)(tw_cloud_toggler_CloudVariablesToggler)));\n// CONCATENATED MODULE: ./src/components/menu-bar/tw-save-status.jsx\n\n\n\n\n\n\n\n\nconst TWSaveStatus = _ref => {\n let {\n alertsList,\n fileHandle,\n projectChanged,\n showSaveFilePicker\n } = _ref;\n return Object(alerts[\"e\" /* filterInlineAlerts */])(alertsList).length > 0 ? /*#__PURE__*/react_default.a.createElement(inline_messages, null) : projectChanged && /*#__PURE__*/react_default.a.createElement(sb3_downloader[\"a\" /* default */], {\n showSaveFilePicker: showSaveFilePicker\n }, (_className, _downloadProjectCallback, _ref2) => {\n let {\n smartSave\n } = _ref2;\n return /*#__PURE__*/react_default.a.createElement(\"div\", {\n onClick: smartSave,\n className: save_status_default.a.saveNow\n }, fileHandle ? /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Save as {file}\",\n id: \"tw.menuBar.saveAs\",\n values: {\n file: fileHandle.name\n }\n }) : /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Save to your computer\",\n id: \"gui.menuBar.downloadToComputer\"\n }));\n });\n};\nTWSaveStatus.propTypes = {\n alertsList: prop_types_default.a.arrayOf(prop_types_default.a.object),\n fileHandle: prop_types_default.a.shape({\n name: prop_types_default.a.string\n }),\n projectChanged: prop_types_default.a.bool,\n showSaveFilePicker: prop_types_default.a.func\n};\nconst tw_save_status_mapStateToProps = state => ({\n alertsList: state.scratchGui.alerts.alertsList,\n fileHandle: state.scratchGui.tw.fileHandle,\n projectChanged: state.scratchGui.projectChanged\n});\n/* harmony default export */ var tw_save_status = (Object(es[\"b\" /* connect */])(tw_save_status_mapStateToProps, () => ({}))(TWSaveStatus));\n// EXTERNAL MODULE: ./src/components/close-button/close-button.jsx\nvar close_button = __webpack_require__(92);\n\n// EXTERNAL MODULE: ./src/components/menu-bar/tw-news.css\nvar tw_news = __webpack_require__(203);\nvar tw_news_default = /*#__PURE__*/__webpack_require__.n(tw_news);\n\n// CONCATENATED MODULE: ./src/components/menu-bar/tw-news.jsx\n\n\n\n\nconst LOCAL_STORAGE_KEY = 'tw:closedNews';\nconst NEWS_ID = 'scratch-vulnerability';\nconst newsAppliesToUser = () => true;\nconst NewsBody = () => /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: tw_news_default.a.text,\n lang: \"en\"\n}, /*#__PURE__*/react_default.a.createElement(\"div\", null, 'We discovered a critical vulnerability in all versions of Scratch. In the desktop app, opening a malicious project could install ransomware on your computer.'), /*#__PURE__*/react_default.a.createElement(\"div\", null, 'We reported this to Scratch two years ago, but no fix has been released yet. The latest TurboWarp is not affected. ', /*#__PURE__*/react_default.a.createElement(\"a\", {\n href: \"https://muffin.ink/blog/scratch-vulnerability-disclosure/\",\n target: \"_blank\",\n rel: \"noreferrer\"\n}, 'More details on my blog.')));\nconst getIsClosedInLocalStorage = () => {\n try {\n return localStorage.getItem(LOCAL_STORAGE_KEY) === NEWS_ID;\n } catch (e) {\n return false;\n }\n};\nconst markAsClosedInLocalStorage = () => {\n try {\n localStorage.setItem(LOCAL_STORAGE_KEY, NEWS_ID);\n } catch (e) {\n // ignore\n }\n};\nclass tw_news_TWNews extends react_default.a.Component {\n constructor(props) {\n super(props);\n this.state = {\n closed: getIsClosedInLocalStorage() || !newsAppliesToUser()\n };\n this.handleClose = this.handleClose.bind(this);\n }\n handleClose() {\n markAsClosedInLocalStorage();\n this.setState({\n closed: true\n }, () => {\n window.dispatchEvent(new Event('resize'));\n });\n }\n render() {\n if (this.state.closed || Object(isScratchDesktop[\"b\" /* isScratchDesktop */])()) {\n return null;\n }\n return /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: tw_news_default.a.news\n }, /*#__PURE__*/react_default.a.createElement(NewsBody, null), /*#__PURE__*/react_default.a.createElement(close_button[\"a\" /* default */], {\n className: tw_news_default.a.close,\n onClick: this.handleClose\n }));\n }\n}\n/* harmony default export */ var menu_bar_tw_news = (tw_news_TWNews);\n// EXTERNAL MODULE: ./src/reducers/mode.js\nvar reducers_mode = __webpack_require__(47);\n\n// EXTERNAL MODULE: ./src/reducers/time-travel.js\nvar time_travel = __webpack_require__(72);\n\n// EXTERNAL MODULE: ./src/lib/collect-metadata.js\nvar collect_metadata = __webpack_require__(183);\n\n// EXTERNAL MODULE: ./src/lib/assets/icon--tutorials.svg\nvar icon_tutorials = __webpack_require__(227);\n\n// EXTERNAL MODULE: ./src/components/menu-bar/icon--mystuff.png\nvar icon_mystuff = __webpack_require__(521);\n\n// EXTERNAL MODULE: ./src/components/menu-bar/icon--profile.png\nvar icon_profile = __webpack_require__(522);\n\n// EXTERNAL MODULE: ./src/components/menu-bar/icon--remix.svg\nvar icon_remix = __webpack_require__(369);\nvar icon_remix_default = /*#__PURE__*/__webpack_require__.n(icon_remix);\n\n// EXTERNAL MODULE: ./src/components/menu-bar/icon--about.svg\nvar icon_about = __webpack_require__(241);\nvar icon_about_default = /*#__PURE__*/__webpack_require__.n(icon_about);\n\n// EXTERNAL MODULE: ./src/components/menu-bar/icon--file.svg\nvar icon_file = __webpack_require__(370);\nvar icon_file_default = /*#__PURE__*/__webpack_require__.n(icon_file);\n\n// EXTERNAL MODULE: ./src/components/menu-bar/icon--edit.svg\nvar icon_edit = __webpack_require__(371);\nvar icon_edit_default = /*#__PURE__*/__webpack_require__.n(icon_edit);\n\n// EXTERNAL MODULE: ./src/components/menu-bar/addons.svg\nvar addons = __webpack_require__(372);\nvar addons_default = /*#__PURE__*/__webpack_require__.n(addons);\n\n// EXTERNAL MODULE: ./src/components/menu-bar/tw-error.svg\nvar tw_error = __webpack_require__(373);\nvar tw_error_default = /*#__PURE__*/__webpack_require__.n(tw_error);\n\n// EXTERNAL MODULE: ./src/components/menu-bar/tw-advanced.svg\nvar tw_advanced = __webpack_require__(374);\nvar tw_advanced_default = /*#__PURE__*/__webpack_require__.n(tw_advanced);\n\n// EXTERNAL MODULE: ./src/components/menu-bar/nineties_logo.svg\nvar nineties_logo = __webpack_require__(375);\nvar nineties_logo_default = /*#__PURE__*/__webpack_require__.n(nineties_logo);\n\n// EXTERNAL MODULE: ./src/components/menu-bar/cat_logo.svg\nvar cat_logo = __webpack_require__(376);\nvar cat_logo_default = /*#__PURE__*/__webpack_require__.n(cat_logo);\n\n// EXTERNAL MODULE: ./src/components/menu-bar/prehistoric-logo.svg\nvar prehistoric_logo = __webpack_require__(377);\nvar prehistoric_logo_default = /*#__PURE__*/__webpack_require__.n(prehistoric_logo);\n\n// EXTERNAL MODULE: ./src/components/menu-bar/oldtimey-logo.svg\nvar oldtimey_logo = __webpack_require__(378);\nvar oldtimey_logo_default = /*#__PURE__*/__webpack_require__.n(oldtimey_logo);\n\n// EXTERNAL MODULE: ./src/lib/shared-messages.js\nvar shared_messages = __webpack_require__(49);\n\n// EXTERNAL MODULE: ./src/components/menu-bar/tw-see-inside.css\nvar tw_see_inside = __webpack_require__(242);\nvar tw_see_inside_default = /*#__PURE__*/__webpack_require__.n(tw_see_inside);\n\n// CONCATENATED MODULE: ./src/components/menu-bar/tw-see-inside.jsx\n\n\n\n\n\n\n\nconst SeeInsideButton = _ref => {\n let {\n className,\n onClick\n } = _ref;\n return /*#__PURE__*/react_default.a.createElement(button_button[\"a\" /* default */], {\n className: classnames_default()(className, tw_see_inside_default.a.seeInsideButton),\n iconClassName: tw_see_inside_default.a.seeInsideButtonIcon,\n iconSrc: icon_see_community_default.a,\n iconWidth: 20,\n iconHeight: 20,\n onClick: onClick\n }, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"See inside\",\n id: \"tw.menuBar.seeInside\"\n }));\n};\nSeeInsideButton.propTypes = {\n className: prop_types_default.a.string,\n onClick: prop_types_default.a.func\n};\nSeeInsideButton.defaultProps = {\n onClick: () => {}\n};\n/* harmony default export */ var menu_bar_tw_see_inside = (SeeInsideButton);\n// EXTERNAL MODULE: ./src/lib/brand.js\nvar brand = __webpack_require__(24);\n\n// CONCATENATED MODULE: ./src/components/menu-bar/menu-bar.jsx\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst ariaMessages = Object(index_es[\"g\" /* defineMessages */])({\n tutorials: {\n \"id\": \"gui.menuBar.tutorialsLibrary\",\n \"defaultMessage\": \"Tutorials\"\n }\n});\nconst twMessages = Object(index_es[\"g\" /* defineMessages */])({\n compileError: {\n \"id\": \"tw.menuBar.compileError\",\n \"defaultMessage\": \"{sprite}: {error}\"\n }\n});\nconst MenuBarItemTooltip = _ref => {\n let {\n children,\n className,\n enable,\n id,\n place = 'bottom'\n } = _ref;\n if (enable) {\n return /*#__PURE__*/react_default.a.createElement(react_default.a.Fragment, null, children);\n }\n return /*#__PURE__*/react_default.a.createElement(coming_soon[\"a\" /* ComingSoonTooltip */], {\n className: classnames_default()(menu_bar_default.a.comingSoon, className),\n place: place,\n tooltipClassName: menu_bar_default.a.comingSoonTooltip,\n tooltipId: id\n }, children);\n};\nMenuBarItemTooltip.propTypes = {\n children: prop_types_default.a.node,\n className: prop_types_default.a.string,\n enable: prop_types_default.a.bool,\n id: prop_types_default.a.string,\n place: prop_types_default.a.oneOf(['top', 'bottom', 'left', 'right'])\n};\nconst MenuItemTooltip = _ref2 => {\n let {\n id,\n isRtl,\n children,\n className\n } = _ref2;\n return /*#__PURE__*/react_default.a.createElement(coming_soon[\"a\" /* ComingSoonTooltip */], {\n className: classnames_default()(menu_bar_default.a.comingSoon, className),\n isRtl: isRtl,\n place: isRtl ? 'left' : 'right',\n tooltipClassName: menu_bar_default.a.comingSoonTooltip,\n tooltipId: id\n }, children);\n};\nMenuItemTooltip.propTypes = {\n children: prop_types_default.a.node,\n className: prop_types_default.a.string,\n id: prop_types_default.a.string,\n isRtl: prop_types_default.a.bool\n};\nconst AboutButton = props => /*#__PURE__*/react_default.a.createElement(button_button[\"a\" /* default */], {\n className: classnames_default()(menu_bar_default.a.menuBarItem, menu_bar_default.a.hoverable),\n iconClassName: menu_bar_default.a.aboutIcon,\n iconSrc: icon_about_default.a,\n onClick: props.onClick\n});\nAboutButton.propTypes = {\n onClick: prop_types_default.a.func.isRequired\n};\n\n// Unlike , this uses an actual \nconst MenuItemLink = props => /*#__PURE__*/react_default.a.createElement(\"a\", {\n href: props.href,\n rel: \"noreferrer\",\n target: \"_blank\",\n className: menu_bar_default.a.menuItemLink\n}, /*#__PURE__*/react_default.a.createElement(MenuItem, null, props.children));\nMenuItemLink.propTypes = {\n children: prop_types_default.a.node.isRequired,\n href: prop_types_default.a.string.isRequired\n};\nclass menu_bar_MenuBar extends react_default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['handleClickSeeInside', 'handleClickNew', 'handleClickNewWindow', 'handleClickRemix', 'handleClickSave', 'handleClickSaveAsCopy', 'handleClickPackager', 'handleClickDesktopSettings', 'handleClickRestorePoints', 'handleClickSeeCommunity', 'handleClickShare', 'handleSetMode', 'handleKeyPress', 'handleRestoreOption', 'getSaveToComputerHandler', 'restoreOptionMessage']);\n }\n componentDidMount() {\n document.addEventListener('keydown', this.handleKeyPress);\n }\n componentWillUnmount() {\n document.removeEventListener('keydown', this.handleKeyPress);\n }\n handleClickNew() {\n // if the project is dirty, and user owns the project, we will autosave.\n // but if they are not logged in and can't save, user should consider\n // downloading or logging in first.\n // Note that if user is logged in and editing someone else's project,\n // they'll lose their work.\n const readyToReplaceProject = this.props.confirmReadyToReplaceProject(this.props.intl.formatMessage(shared_messages[\"a\" /* default */].replaceProjectWarning));\n this.props.onRequestCloseFile();\n if (readyToReplaceProject) {\n this.props.onClickNew(this.props.canSave && this.props.canCreateNew);\n }\n this.props.onRequestCloseFile();\n }\n handleClickNewWindow() {\n this.props.onClickNewWindow();\n this.props.onRequestCloseFile();\n }\n handleClickRemix() {\n this.props.onClickRemix();\n this.props.onRequestCloseFile();\n }\n handleClickSave() {\n this.props.onClickSave();\n this.props.onRequestCloseFile();\n }\n handleClickSaveAsCopy() {\n this.props.onClickSaveAsCopy();\n this.props.onRequestCloseFile();\n }\n handleClickPackager() {\n this.props.onClickPackager();\n this.props.onRequestCloseFile();\n }\n handleClickDesktopSettings() {\n this.props.onClickDesktopSettings();\n this.props.onRequestCloseSettings();\n }\n handleClickRestorePoints() {\n this.props.onClickRestorePoints();\n this.props.onRequestCloseFile();\n }\n handleClickSeeCommunity(waitForUpdate) {\n if (this.props.shouldSaveBeforeTransition()) {\n this.props.autoUpdateProject(); // save before transitioning to project page\n waitForUpdate(true); // queue the transition to project page\n } else {\n waitForUpdate(false); // immediately transition to project page\n }\n }\n handleClickShare(waitForUpdate) {\n if (!this.props.isShared) {\n if (this.props.canShare) {\n // save before transitioning to project page\n this.props.onShare();\n }\n if (this.props.canSave) {\n // save before transitioning to project page\n this.props.autoUpdateProject();\n waitForUpdate(true); // queue the transition to project page\n } else {\n waitForUpdate(false); // immediately transition to project page\n }\n }\n }\n handleSetMode(mode) {\n return () => {\n // Turn on/off filters for modes.\n if (mode === '1920') {\n document.documentElement.style.filter = 'brightness(.9)contrast(.8)sepia(1.0)';\n document.documentElement.style.height = '100%';\n } else if (mode === '1990') {\n document.documentElement.style.filter = 'hue-rotate(40deg)';\n document.documentElement.style.height = '100%';\n } else {\n document.documentElement.style.filter = '';\n document.documentElement.style.height = '';\n }\n\n // Change logo for modes\n if (mode === '1990') {\n document.getElementById('logo_img').src = nineties_logo_default.a;\n } else if (mode === '2020') {\n document.getElementById('logo_img').src = cat_logo_default.a;\n } else if (mode === '1920') {\n document.getElementById('logo_img').src = oldtimey_logo_default.a;\n } else if (mode === '220022BC') {\n document.getElementById('logo_img').src = prehistoric_logo_default.a;\n } else {\n document.getElementById('logo_img').src = this.props.logo;\n }\n this.props.onSetTimeTravelMode(mode);\n };\n }\n handleRestoreOption(restoreFun) {\n return () => {\n restoreFun();\n this.props.onRequestCloseEdit();\n };\n }\n handleKeyPress(event) {\n const modifier = bowser_default.a.mac ? event.metaKey : event.ctrlKey;\n if (modifier) {\n if (event.key.toLowerCase() === 's') {\n this.props.handleSaveProject();\n event.preventDefault();\n } else if (event.key.toLowerCase() === 'o') {\n event.preventDefault();\n this.props.onStartSelectingFileUpload();\n }\n }\n }\n getSaveToComputerHandler(downloadProjectCallback) {\n return () => {\n this.props.onRequestCloseFile();\n downloadProjectCallback();\n if (this.props.onProjectTelemetryEvent) {\n const metadata = Object(collect_metadata[\"a\" /* default */])(this.props.vm, this.props.projectTitle, this.props.locale);\n this.props.onProjectTelemetryEvent('projectDidSave', metadata);\n }\n };\n }\n restoreOptionMessage(deletedItem) {\n switch (deletedItem) {\n case 'Sprite':\n return /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Restore Sprite\",\n id: \"gui.menuBar.restoreSprite\"\n });\n case 'Sound':\n return /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Restore Sound\",\n id: \"gui.menuBar.restoreSound\"\n });\n case 'Costume':\n return /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Restore Costume\",\n id: \"gui.menuBar.restoreCostume\"\n });\n default:\n {\n return /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Restore\",\n /* eslint-disable-line max-len */\n id: \"gui.menuBar.restore\"\n });\n }\n }\n }\n handleClickSeeInside() {\n this.props.onClickSeeInside();\n }\n buildAboutMenu(onClickAbout) {\n if (!onClickAbout) {\n // hide the button\n return null;\n }\n if (typeof onClickAbout === 'function') {\n // make a button which calls a function\n return /*#__PURE__*/react_default.a.createElement(AboutButton, {\n onClick: onClickAbout\n });\n }\n // assume it's an array of objects\n // each item must have a 'title' FormattedMessage and a 'handleClick' function\n // generate a menu with items for each object in the array\n return /*#__PURE__*/react_default.a.createElement(tw_menu_label, {\n open: this.props.aboutMenuOpen,\n onOpen: this.props.onRequestOpenAbout,\n onClose: this.props.onRequestCloseAbout\n }, /*#__PURE__*/react_default.a.createElement(\"img\", {\n className: menu_bar_default.a.aboutIcon,\n src: icon_about_default.a,\n draggable: false\n }), /*#__PURE__*/react_default.a.createElement(menu_bar_menu, {\n className: classnames_default()(menu_bar_default.a.menuBarMenu),\n open: this.props.aboutMenuOpen,\n place: this.props.isRtl ? 'right' : 'left'\n }, onClickAbout.map(itemProps => /*#__PURE__*/react_default.a.createElement(MenuItem, {\n key: itemProps.title,\n isRtl: this.props.isRtl,\n onClick: this.wrapAboutMenuCallback(itemProps.onClick)\n }, itemProps.title))));\n }\n wrapAboutMenuCallback(callback) {\n return () => {\n callback();\n this.props.onRequestCloseAbout();\n };\n }\n render() {\n const saveNowMessage = /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Save now\",\n id: \"gui.menuBar.saveNow\"\n });\n const createCopyMessage = /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Save as a copy\",\n id: \"gui.menuBar.saveAsCopy\"\n });\n const remixMessage = /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Remix\",\n id: \"gui.menuBar.remix\"\n });\n const newProjectMessage = /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"New\",\n id: \"gui.menuBar.new\"\n });\n const remixButton = /*#__PURE__*/react_default.a.createElement(button_button[\"a\" /* default */], {\n className: classnames_default()(menu_bar_default.a.menuBarButton, menu_bar_default.a.remixButton),\n iconClassName: menu_bar_default.a.remixButtonIcon,\n iconSrc: icon_remix_default.a,\n onClick: this.handleClickRemix\n }, remixMessage);\n // Show the About button only if we have a handler for it (like in the desktop app)\n const aboutButton = this.buildAboutMenu(this.props.onClickAbout);\n const menuBar = /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: classnames_default()(this.props.className, menu_bar_default.a.menuBar)\n }, /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: menu_bar_default.a.mainMenu\n }, /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: menu_bar_default.a.fileGroup\n }, this.props.errors.length > 0 && /*#__PURE__*/react_default.a.createElement(\"div\", null, /*#__PURE__*/react_default.a.createElement(tw_menu_label, {\n open: this.props.errorsMenuOpen,\n onOpen: this.props.onClickErrors,\n onClose: this.props.onRequestCloseErrors\n }, /*#__PURE__*/react_default.a.createElement(\"img\", {\n src: tw_error_default.a,\n draggable: false,\n width: 20,\n height: 20\n }), /*#__PURE__*/react_default.a.createElement(\"img\", {\n src: dropdown_caret_default.a,\n draggable: false,\n width: 8,\n height: 5\n }), /*#__PURE__*/react_default.a.createElement(menu_bar_menu, {\n className: classnames_default()(menu_bar_default.a.menuBarMenu),\n open: this.props.errorsMenuOpen,\n place: this.props.isRtl ? 'left' : 'right'\n }, /*#__PURE__*/react_default.a.createElement(MenuSection, null, /*#__PURE__*/react_default.a.createElement(MenuItemLink, {\n href: \"https://scratch.mit.edu/users/GarboMuffin/#comments\"\n }, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Some scripts encountered errors.\",\n id: \"tw.menuBar.reportError1\"\n })), /*#__PURE__*/react_default.a.createElement(MenuItemLink, {\n href: \"https://scratch.mit.edu/users/GarboMuffin/#comments\"\n }, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"This is a bug. Please report it.\",\n id: \"tw.menuBar.reportError2\"\n }))), /*#__PURE__*/react_default.a.createElement(MenuSection, null, this.props.errors.map(_ref3 => {\n let {\n id,\n sprite,\n error\n } = _ref3;\n return /*#__PURE__*/react_default.a.createElement(MenuItem, {\n key: id\n }, this.props.intl.formatMessage(twMessages.compileError, {\n sprite,\n error\n }));\n }))))), (this.props.canChangeTheme || this.props.canChangeLanguage) && /*#__PURE__*/react_default.a.createElement(menu_bar_settings_menu, {\n canChangeLanguage: this.props.canChangeLanguage,\n canChangeTheme: this.props.canChangeTheme,\n isRtl: this.props.isRtl,\n onClickDesktopSettings: this.props.onClickDesktopSettings && this.handleClickDesktopSettings\n // eslint-disable-next-line react/jsx-no-bind\n ,\n onOpenCustomSettings: this.props.onClickAddonSettings && this.props.onClickAddonSettings.bind(null, 'editor-theme3'),\n onRequestClose: this.props.onRequestCloseSettings,\n onRequestOpen: this.props.onClickSettings,\n settingsMenuOpen: this.props.settingsMenuOpen\n }), this.props.canManageFiles && /*#__PURE__*/react_default.a.createElement(tw_menu_label, {\n open: this.props.fileMenuOpen,\n onOpen: this.props.onClickFile,\n onClose: this.props.onRequestCloseFile\n }, /*#__PURE__*/react_default.a.createElement(\"img\", {\n src: icon_file_default.a,\n draggable: false,\n width: 20,\n height: 20\n }), /*#__PURE__*/react_default.a.createElement(\"span\", {\n className: menu_bar_default.a.collapsibleLabel\n }, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"File\",\n id: \"gui.menuBar.file\"\n })), /*#__PURE__*/react_default.a.createElement(\"img\", {\n src: dropdown_caret_default.a,\n draggable: false,\n width: 8,\n height: 5\n }), /*#__PURE__*/react_default.a.createElement(menu_bar_menu, {\n className: classnames_default()(menu_bar_default.a.menuBarMenu),\n open: this.props.fileMenuOpen,\n place: this.props.isRtl ? 'left' : 'right'\n }, /*#__PURE__*/react_default.a.createElement(MenuItem, {\n isRtl: this.props.isRtl,\n onClick: this.handleClickNew\n }, newProjectMessage), this.props.onClickNewWindow && /*#__PURE__*/react_default.a.createElement(MenuItem, {\n isRtl: this.props.isRtl,\n onClick: this.handleClickNewWindow\n }, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"New window\"\n // eslint-disable-next-line max-len\n ,\n\n id: \"tw.menuBar.newWindow\"\n })), (this.props.canSave || this.props.canCreateCopy || this.props.canRemix) && /*#__PURE__*/react_default.a.createElement(MenuSection, null, this.props.canSave && /*#__PURE__*/react_default.a.createElement(MenuItem, {\n onClick: this.handleClickSave\n }, saveNowMessage), this.props.canCreateCopy && /*#__PURE__*/react_default.a.createElement(MenuItem, {\n onClick: this.handleClickSaveAsCopy\n }, createCopyMessage), this.props.canRemix && /*#__PURE__*/react_default.a.createElement(MenuItem, {\n onClick: this.handleClickRemix\n }, remixMessage)), /*#__PURE__*/react_default.a.createElement(MenuSection, null, /*#__PURE__*/react_default.a.createElement(MenuItem, {\n onClick: this.props.onStartSelectingFileUpload\n }, this.props.intl.formatMessage(shared_messages[\"a\" /* default */].loadFromComputerTitle)), /*#__PURE__*/react_default.a.createElement(sb3_downloader[\"a\" /* default */], {\n showSaveFilePicker: this.props.showSaveFilePicker\n }, (_className, downloadProject, extended) => /*#__PURE__*/react_default.a.createElement(react_default.a.Fragment, null, extended.available && /*#__PURE__*/react_default.a.createElement(react_default.a.Fragment, null, extended.name !== null &&\n /*#__PURE__*/\n // eslint-disable-next-line max-len\n react_default.a.createElement(MenuItem, {\n onClick: this.getSaveToComputerHandler(extended.saveToLastFile)\n }, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Save to {file}\"\n // eslint-disable-next-line max-len\n ,\n\n id: \"tw.saveTo\",\n values: {\n file: extended.name\n }\n })), /*#__PURE__*/react_default.a.createElement(MenuItem, {\n onClick: this.getSaveToComputerHandler(extended.saveAsNew)\n }, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Save as...\"\n // eslint-disable-next-line max-len\n ,\n\n id: \"tw.saveAs\"\n }))), Object(isScratchDesktop[\"c\" /* notScratchDesktop */])() && /*#__PURE__*/react_default.a.createElement(MenuItem, {\n onClick: this.getSaveToComputerHandler(downloadProject)\n }, extended.available ? /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Save to separate file...\"\n // eslint-disable-next-line max-len\n ,\n\n id: \"tw.oldDownload\"\n }) : /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Save to your computer\",\n // eslint-disable-line max-len\n id: \"gui.menuBar.downloadToComputer\"\n }))))), this.props.onClickPackager && /*#__PURE__*/react_default.a.createElement(MenuSection, null, /*#__PURE__*/react_default.a.createElement(MenuItem, {\n onClick: this.handleClickPackager\n }, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Package project\"\n // eslint-disable-next-line max-len\n ,\n\n id: \"tw.menuBar.package\"\n }))), /*#__PURE__*/react_default.a.createElement(MenuSection, null, /*#__PURE__*/react_default.a.createElement(MenuItem, {\n onClick: this.handleClickRestorePoints\n }, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Restore points\",\n id: \"tw.menuBar.restorePoints\"\n }))))), /*#__PURE__*/react_default.a.createElement(tw_menu_label, {\n open: this.props.editMenuOpen,\n onOpen: this.props.onClickEdit,\n onClose: this.props.onRequestCloseEdit\n }, /*#__PURE__*/react_default.a.createElement(\"img\", {\n src: icon_edit_default.a,\n draggable: false,\n width: 20,\n height: 20\n }), /*#__PURE__*/react_default.a.createElement(\"span\", {\n className: menu_bar_default.a.collapsibleLabel\n }, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Edit\",\n id: \"gui.menuBar.edit\"\n })), /*#__PURE__*/react_default.a.createElement(\"img\", {\n src: dropdown_caret_default.a,\n draggable: false,\n width: 8,\n height: 5\n }), /*#__PURE__*/react_default.a.createElement(menu_bar_menu, {\n className: classnames_default()(menu_bar_default.a.menuBarMenu),\n open: this.props.editMenuOpen,\n place: this.props.isRtl ? 'left' : 'right'\n }, this.props.isPlayerOnly ? null : /*#__PURE__*/react_default.a.createElement(deletion_restorer, null, (handleRestore, _ref4) => {\n let {\n restorable,\n deletedItem\n } = _ref4;\n return /*#__PURE__*/react_default.a.createElement(MenuItem, {\n className: classnames_default()({\n [menu_bar_default.a.disabled]: !restorable\n }),\n onClick: this.handleRestoreOption(handleRestore)\n }, this.restoreOptionMessage(deletedItem));\n }), /*#__PURE__*/react_default.a.createElement(MenuSection, null, /*#__PURE__*/react_default.a.createElement(turbo_mode, null, (toggleTurboMode, _ref5) => {\n let {\n turboMode\n } = _ref5;\n return /*#__PURE__*/react_default.a.createElement(MenuItem, {\n onClick: toggleTurboMode\n }, turboMode ? /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Turn off Turbo Mode\",\n id: \"gui.menuBar.turboModeOff\"\n }) : /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Turn on Turbo Mode\",\n id: \"gui.menuBar.turboModeOn\"\n }));\n }), /*#__PURE__*/react_default.a.createElement(tw_framerate_changer, null, (changeFramerate, _ref6) => {\n let {\n framerate\n } = _ref6;\n return /*#__PURE__*/react_default.a.createElement(MenuItem, {\n onClick: changeFramerate\n }, framerate === 60 ? /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Turn off 60 FPS Mode\",\n id: \"tw.menuBar.60off\"\n }) : /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Turn on 60 FPS Mode\",\n id: \"tw.menuBar.60on\"\n }));\n }), /*#__PURE__*/react_default.a.createElement(tw_change_username, null, changeUsername => /*#__PURE__*/react_default.a.createElement(MenuItem, {\n onClick: changeUsername\n }, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Change Username\",\n id: \"tw.menuBar.changeUsername\"\n }))), /*#__PURE__*/react_default.a.createElement(tw_cloud_toggler, null, (toggleCloudVariables, _ref7) => {\n let {\n enabled,\n canUseCloudVariables\n } = _ref7;\n return /*#__PURE__*/react_default.a.createElement(MenuItem, {\n className: classnames_default()({\n [menu_bar_default.a.disabled]: !canUseCloudVariables\n }),\n onClick: toggleCloudVariables\n }, canUseCloudVariables ? enabled ? /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Disable Cloud Variables\",\n id: \"tw.menuBar.cloudOff\"\n }) : /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Enable Cloud Variables\",\n id: \"tw.menuBar.cloudOn\"\n }) : /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Cloud Variables are not Available\"\n // eslint-disable-next-line max-len\n ,\n\n id: \"tw.menuBar.cloudUnavailable\"\n }));\n })), /*#__PURE__*/react_default.a.createElement(MenuSection, null, /*#__PURE__*/react_default.a.createElement(MenuItem, {\n onClick: this.props.onClickSettingsModal\n }, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Advanced Settings\",\n id: \"tw.menuBar.moreSettings\"\n }))))), this.props.isTotallyNormal && /*#__PURE__*/react_default.a.createElement(tw_menu_label, {\n open: this.props.modeMenuOpen,\n onOpen: this.props.onClickMode,\n onClose: this.props.onRequestCloseMode\n }, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Mode\",\n id: \"gui.menuBar.modeMenu\"\n }), /*#__PURE__*/react_default.a.createElement(menu_bar_menu, {\n className: classnames_default()(menu_bar_default.a.menuBarMenu),\n open: this.props.modeMenuOpen,\n place: this.props.isRtl ? 'left' : 'right'\n }, /*#__PURE__*/react_default.a.createElement(MenuSection, null, /*#__PURE__*/react_default.a.createElement(MenuItem, {\n onClick: this.handleSetMode('NOW')\n }, /*#__PURE__*/react_default.a.createElement(\"span\", {\n className: classnames_default()({\n [menu_bar_default.a.inactive]: !this.props.modeNow\n })\n }, '✓'), ' ', /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Normal mode\",\n id: \"gui.menuBar.normalMode\"\n })), /*#__PURE__*/react_default.a.createElement(MenuItem, {\n onClick: this.handleSetMode('2020')\n }, /*#__PURE__*/react_default.a.createElement(\"span\", {\n className: classnames_default()({\n [menu_bar_default.a.inactive]: !this.props.mode2020\n })\n }, '✓'), ' ', /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Caturday mode\",\n id: \"gui.menuBar.caturdayMode\"\n }))))), this.props.onClickAddonSettings && /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: classnames_default()(menu_bar_default.a.menuBarItem, menu_bar_default.a.hoverable),\n onClick: this.props.onClickAddonSettings\n }, /*#__PURE__*/react_default.a.createElement(\"img\", {\n src: addons_default.a,\n draggable: false,\n width: 20,\n height: 20\n }), /*#__PURE__*/react_default.a.createElement(\"span\", {\n className: menu_bar_default.a.collapsibleLabel\n }, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Addons\",\n id: \"tw.menuBar.addons\"\n }))), this.props.onClickSettingsModal && /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: classnames_default()(menu_bar_default.a.menuBarItem, menu_bar_default.a.hoverable),\n onClick: this.props.onClickSettingsModal\n }, /*#__PURE__*/react_default.a.createElement(\"img\", {\n src: tw_advanced_default.a,\n draggable: false,\n width: 20,\n height: 20\n }), /*#__PURE__*/react_default.a.createElement(\"span\", {\n className: menu_bar_default.a.collapsibleLabel\n }, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Advanced\",\n id: \"tw.menuBar.advanced\"\n })))), /*#__PURE__*/react_default.a.createElement(divider[\"a\" /* default */], {\n className: menu_bar_default.a.divider\n }), this.props.canEditTitle ? /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: classnames_default()(menu_bar_default.a.menuBarItem, menu_bar_default.a.growable)\n }, /*#__PURE__*/react_default.a.createElement(MenuBarItemTooltip, {\n enable: true,\n id: \"title-field\"\n }, /*#__PURE__*/react_default.a.createElement(menu_bar_project_title_input, {\n className: classnames_default()(menu_bar_default.a.titleFieldGrowable)\n }))) : this.props.authorUsername && this.props.authorUsername !== this.props.username ? /*#__PURE__*/react_default.a.createElement(menu_bar_author_info, {\n className: menu_bar_default.a.authorInfo,\n imageUrl: this.props.authorThumbnailUrl,\n projectId: this.props.projectId,\n projectTitle: this.props.projectTitle,\n userId: this.props.authorId,\n username: this.props.authorUsername\n }) : null, this.props.canShare ? (this.props.isShowingProject || this.props.isUpdating) && /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: classnames_default()(menu_bar_default.a.menuBarItem)\n }, /*#__PURE__*/react_default.a.createElement(project_watcher, {\n onDoneUpdating: this.props.onSeeCommunity\n }, waitForUpdate => /*#__PURE__*/react_default.a.createElement(menu_bar_share_button, {\n className: menu_bar_default.a.menuBarButton,\n isShared: this.props.isShared\n /* eslint-disable react/jsx-no-bind */,\n onClick: () => {\n this.handleClickShare(waitForUpdate);\n }\n /* eslint-enable react/jsx-no-bind */\n }))) : this.props.showComingSoon ? /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: classnames_default()(menu_bar_default.a.menuBarItem)\n }, /*#__PURE__*/react_default.a.createElement(MenuBarItemTooltip, {\n id: \"share-button\"\n }, /*#__PURE__*/react_default.a.createElement(menu_bar_share_button, {\n className: menu_bar_default.a.menuBarButton\n }))) : null, this.props.canRemix && /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: classnames_default()(menu_bar_default.a.menuBarItem)\n }, remixButton), /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: classnames_default()(menu_bar_default.a.menuBarItem, menu_bar_default.a.communityButtonWrapper)\n }, this.props.enableCommunity ? (this.props.isShowingProject || this.props.isUpdating) && /*#__PURE__*/react_default.a.createElement(project_watcher, {\n onDoneUpdating: this.props.onSeeCommunity\n }, waitForUpdate => /*#__PURE__*/react_default.a.createElement(menu_bar_community_button, {\n className: menu_bar_default.a.menuBarButton\n /* eslint-disable react/jsx-no-bind */,\n onClick: () => {\n this.handleClickSeeCommunity(waitForUpdate);\n }\n /* eslint-enable react/jsx-no-bind */\n })) : this.props.showComingSoon ? /*#__PURE__*/react_default.a.createElement(MenuBarItemTooltip, {\n id: \"community-button\"\n }, /*#__PURE__*/react_default.a.createElement(menu_bar_community_button, {\n className: menu_bar_default.a.menuBarButton\n })) : this.props.enableSeeInside ? /*#__PURE__*/react_default.a.createElement(menu_bar_tw_see_inside, {\n className: menu_bar_default.a.menuBarButton,\n onClick: this.handleClickSeeInside\n }) : []), /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: menu_bar_default.a.menuBarItem\n }, /*#__PURE__*/react_default.a.createElement(\"a\", {\n className: menu_bar_default.a.feedbackLink,\n href: \"https://scratch.mit.edu/users/GarboMuffin/#comments\",\n rel: \"noopener noreferrer\",\n target: \"_blank\"\n }, /*#__PURE__*/react_default.a.createElement(button_button[\"a\" /* default */], {\n className: menu_bar_default.a.feedbackButton\n }, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"{APP_NAME} Feedback\",\n id: \"tw.feedbackButton\",\n values: {\n APP_NAME: brand[\"APP_NAME\"]\n }\n }))))), /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: menu_bar_default.a.accountInfoGroup\n }, /*#__PURE__*/react_default.a.createElement(tw_save_status, {\n showSaveFilePicker: this.props.showSaveFilePicker\n })), aboutButton);\n return /*#__PURE__*/react_default.a.createElement(react_default.a.Fragment, null, menuBar, /*#__PURE__*/react_default.a.createElement(menu_bar_tw_news, null));\n }\n}\nmenu_bar_MenuBar.propTypes = {\n enableSeeInside: prop_types_default.a.bool,\n onClickSeeInside: prop_types_default.a.func,\n aboutMenuOpen: prop_types_default.a.bool,\n accountMenuOpen: prop_types_default.a.bool,\n authorId: prop_types_default.a.oneOfType([prop_types_default.a.string, prop_types_default.a.bool]),\n authorThumbnailUrl: prop_types_default.a.string,\n authorUsername: prop_types_default.a.oneOfType([prop_types_default.a.string, prop_types_default.a.bool]),\n autoUpdateProject: prop_types_default.a.func,\n canChangeLanguage: prop_types_default.a.bool,\n canChangeTheme: prop_types_default.a.bool,\n canCreateCopy: prop_types_default.a.bool,\n canCreateNew: prop_types_default.a.bool,\n canEditTitle: prop_types_default.a.bool,\n canManageFiles: prop_types_default.a.bool,\n canRemix: prop_types_default.a.bool,\n canSave: prop_types_default.a.bool,\n canShare: prop_types_default.a.bool,\n className: prop_types_default.a.string,\n errors: prop_types_default.a.arrayOf(prop_types_default.a.shape({\n sprite: prop_types_default.a.string,\n error: prop_types_default.a.string,\n id: prop_types_default.a.number\n })),\n errorsMenuOpen: prop_types_default.a.bool,\n onClickErrors: prop_types_default.a.func,\n onRequestCloseErrors: prop_types_default.a.func,\n confirmReadyToReplaceProject: prop_types_default.a.func,\n currentLocale: prop_types_default.a.string.isRequired,\n editMenuOpen: prop_types_default.a.bool,\n enableCommunity: prop_types_default.a.bool,\n fileMenuOpen: prop_types_default.a.bool,\n handleSaveProject: prop_types_default.a.func,\n intl: index_es[\"i\" /* intlShape */],\n isPlayerOnly: prop_types_default.a.bool,\n isRtl: prop_types_default.a.bool,\n isShared: prop_types_default.a.bool,\n isShowingProject: prop_types_default.a.bool,\n isTotallyNormal: prop_types_default.a.bool,\n isUpdating: prop_types_default.a.bool,\n locale: prop_types_default.a.string.isRequired,\n loginMenuOpen: prop_types_default.a.bool,\n mode1920: prop_types_default.a.bool,\n mode1990: prop_types_default.a.bool,\n mode2020: prop_types_default.a.bool,\n mode220022BC: prop_types_default.a.bool,\n modeMenuOpen: prop_types_default.a.bool,\n modeNow: prop_types_default.a.bool,\n onClickAbout: prop_types_default.a.oneOfType([prop_types_default.a.func,\n // button mode: call this callback when the About button is clicked\n prop_types_default.a.arrayOf(\n // menu mode: list of items in the About menu\n prop_types_default.a.shape({\n title: prop_types_default.a.string,\n // text for the menu item\n onClick: prop_types_default.a.func // call this callback when the menu item is clicked\n }))]),\n onClickAccount: prop_types_default.a.func,\n onClickAddonSettings: prop_types_default.a.func,\n onClickDesktopSettings: prop_types_default.a.func,\n onClickPackager: prop_types_default.a.func,\n onClickRestorePoints: prop_types_default.a.func,\n onClickEdit: prop_types_default.a.func,\n onClickFile: prop_types_default.a.func,\n onClickLogin: prop_types_default.a.func,\n onClickMode: prop_types_default.a.func,\n onClickNew: prop_types_default.a.func,\n onClickNewWindow: prop_types_default.a.func,\n onClickRemix: prop_types_default.a.func,\n onClickSave: prop_types_default.a.func,\n onClickSaveAsCopy: prop_types_default.a.func,\n onClickSettings: prop_types_default.a.func,\n onClickSettingsModal: prop_types_default.a.func,\n onLogOut: prop_types_default.a.func,\n onOpenRegistration: prop_types_default.a.func,\n onOpenTipLibrary: prop_types_default.a.func,\n onProjectTelemetryEvent: prop_types_default.a.func,\n onRequestCloseAbout: prop_types_default.a.func,\n onRequestCloseAccount: prop_types_default.a.func,\n onRequestCloseEdit: prop_types_default.a.func,\n onRequestCloseFile: prop_types_default.a.func,\n onRequestCloseLogin: prop_types_default.a.func,\n onRequestCloseMode: prop_types_default.a.func,\n onRequestCloseSettings: prop_types_default.a.func,\n onRequestOpenAbout: prop_types_default.a.func,\n onSeeCommunity: prop_types_default.a.func,\n onSetTimeTravelMode: prop_types_default.a.func,\n onShare: prop_types_default.a.func,\n onStartSelectingFileUpload: prop_types_default.a.func,\n onToggleLoginOpen: prop_types_default.a.func,\n projectId: prop_types_default.a.string,\n projectTitle: prop_types_default.a.string,\n renderLogin: prop_types_default.a.func,\n sessionExists: prop_types_default.a.bool,\n settingsMenuOpen: prop_types_default.a.bool,\n shouldSaveBeforeTransition: prop_types_default.a.func,\n showSaveFilePicker: prop_types_default.a.func,\n showComingSoon: prop_types_default.a.bool,\n username: prop_types_default.a.string,\n userOwnsProject: prop_types_default.a.bool,\n vm: prop_types_default.a.instanceOf(src_default.a).isRequired\n};\nmenu_bar_MenuBar.defaultProps = {\n onShare: () => {}\n};\nconst menu_bar_mapStateToProps = (state, ownProps) => {\n const loadingState = state.scratchGui.projectState.loadingState;\n const user = state.session && state.session.session && state.session.session.user;\n return {\n authorUsername: state.scratchGui.tw.author.username,\n authorThumbnailUrl: state.scratchGui.tw.author.thumbnail,\n projectId: state.scratchGui.projectState.projectId,\n aboutMenuOpen: Object(menus[\"a\" /* aboutMenuOpen */])(state),\n accountMenuOpen: Object(menus[\"c\" /* accountMenuOpen */])(state),\n currentLocale: state.locales.locale,\n fileMenuOpen: Object(menus[\"p\" /* fileMenuOpen */])(state),\n editMenuOpen: Object(menus[\"n\" /* editMenuOpen */])(state),\n errors: state.scratchGui.tw.compileErrors,\n errorsMenuOpen: Object(menus[\"o\" /* errorsMenuOpen */])(state),\n isPlayerOnly: state.scratchGui.mode.isPlayerOnly,\n isRtl: state.locales.isRtl,\n isUpdating: Object(project_state[\"u\" /* getIsUpdating */])(loadingState),\n isShowingProject: Object(project_state[\"r\" /* getIsShowingProject */])(loadingState),\n locale: state.locales.locale,\n loginMenuOpen: Object(menus[\"r\" /* loginMenuOpen */])(state),\n modeMenuOpen: Object(menus[\"t\" /* modeMenuOpen */])(state),\n projectTitle: state.scratchGui.projectTitle,\n sessionExists: state.session && typeof state.session.session !== 'undefined',\n settingsMenuOpen: Object(menus[\"F\" /* settingsMenuOpen */])(state),\n username: user ? user.username : null,\n userOwnsProject: ownProps.authorUsername && user && ownProps.authorUsername === user.username,\n vm: state.scratchGui.vm,\n mode220022BC: Object(time_travel[\"e\" /* isTimeTravel220022BC */])(state),\n mode1920: Object(time_travel[\"b\" /* isTimeTravel1920 */])(state),\n mode1990: Object(time_travel[\"c\" /* isTimeTravel1990 */])(state),\n mode2020: Object(time_travel[\"d\" /* isTimeTravel2020 */])(state),\n modeNow: Object(time_travel[\"f\" /* isTimeTravelNow */])(state)\n };\n};\nconst menu_bar_mapDispatchToProps = dispatch => ({\n onClickSeeInside: () => dispatch(Object(reducers_mode[\"d\" /* setPlayer */])(false)),\n autoUpdateProject: () => dispatch(Object(project_state[\"b\" /* autoUpdateProject */])()),\n onOpenTipLibrary: () => dispatch(Object(modals[\"G\" /* openTipsLibrary */])()),\n onClickAccount: () => dispatch(Object(menus[\"w\" /* openAccountMenu */])()),\n onRequestCloseAccount: () => dispatch(Object(menus[\"f\" /* closeAccountMenu */])()),\n onClickFile: () => dispatch(Object(menus[\"A\" /* openFileMenu */])()),\n onRequestCloseFile: () => dispatch(Object(menus[\"i\" /* closeFileMenu */])()),\n onClickEdit: () => dispatch(Object(menus[\"y\" /* openEditMenu */])()),\n onRequestCloseEdit: () => dispatch(Object(menus[\"g\" /* closeEditMenu */])()),\n onClickErrors: () => dispatch(Object(menus[\"z\" /* openErrorsMenu */])()),\n onRequestCloseErrors: () => dispatch(Object(menus[\"h\" /* closeErrorsMenu */])()),\n onClickLogin: () => dispatch(Object(menus[\"C\" /* openLoginMenu */])()),\n onRequestCloseLogin: () => dispatch(Object(menus[\"j\" /* closeLoginMenu */])()),\n onClickMode: () => dispatch(Object(menus[\"D\" /* openModeMenu */])()),\n onRequestCloseMode: () => dispatch(Object(menus[\"k\" /* closeModeMenu */])()),\n onRequestOpenAbout: () => dispatch(Object(menus[\"u\" /* openAboutMenu */])()),\n onRequestCloseAbout: () => dispatch(Object(menus[\"e\" /* closeAboutMenu */])()),\n onClickRestorePoints: () => dispatch(Object(modals[\"B\" /* openRestorePointModal */])()),\n onClickSettings: () => dispatch(Object(menus[\"E\" /* openSettingsMenu */])()),\n onClickSettingsModal: () => {\n dispatch(Object(menus[\"g\" /* closeEditMenu */])());\n dispatch(Object(modals[\"C\" /* openSettingsModal */])());\n },\n onRequestCloseSettings: () => dispatch(Object(menus[\"l\" /* closeSettingsMenu */])()),\n onClickNew: needSave => {\n dispatch(Object(project_state[\"B\" /* requestNewProject */])(needSave));\n dispatch(Object(tw[\"j\" /* setFileHandle */])(null));\n },\n onClickRemix: () => dispatch(Object(project_state[\"A\" /* remixProject */])()),\n onClickSave: () => dispatch(Object(project_state[\"v\" /* manualUpdateProject */])()),\n onClickSaveAsCopy: () => dispatch(Object(project_state[\"D\" /* saveProjectAsCopy */])()),\n onSeeCommunity: () => dispatch(Object(reducers_mode[\"d\" /* setPlayer */])(true)),\n onSetTimeTravelMode: mode => dispatch(Object(time_travel[\"g\" /* setTimeTravel */])(mode))\n});\n/* harmony default export */ var menu_bar_menu_bar = __webpack_exports__[\"a\"] = (Object(redux_es[\"d\" /* compose */])(index_es[\"h\" /* injectIntl */], menu_bar_hoc, Object(es[\"b\" /* connect */])(menu_bar_mapStateToProps, menu_bar_mapDispatchToProps))(menu_bar_MenuBar));\n\n/***/ }),\n/* 213 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/**\n * Return whether the fullscreen API is available in this environment.\n * @returns {boolean} true if the fullscreen API is available\n */\nconst available = () => document.fullscreenEnabled || document.webkitFullscreenEnabled;\n\n/**\n * Return whether fullscreen is currently enabled.\n * @returns {boolean} true if in fullscreen\n */\nconst enabled = () => {\n if (typeof document.fullscreenElement !== 'undefined') {\n return document.fullscreenElement !== null;\n }\n if (typeof document.webkitFullscreenElement !== 'undefined') {\n return document.webkitFullscreenElement !== null;\n }\n return false;\n};\n\n/**\n * Request entering the document into fullscreen mode.\n */\nconst request = () => {\n if (document.body.requestFullscreen) {\n document.body.requestFullscreen();\n } else if (document.body.webkitRequestFullscreen) {\n document.body.webkitRequestFullscreen();\n }\n};\n\n/**\n * Exit fullscreen mode.\n */\nconst exit = () => {\n if (document.exitFullscreen) {\n document.exitFullscreen();\n } else if (document.webkitExitFullscreen) {\n document.webkitExitFullscreen();\n }\n};\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n available,\n enabled,\n request,\n exit\n});\n\n/***/ }),\n/* 214 */,\n/* 215 */,\n/* 216 */,\n/* 217 */,\n/* 218 */,\n/* 219 */,\n/* 220 */,\n/* 221 */,\n/* 222 */,\n/* 223 */,\n/* 224 */,\n/* 225 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return PaintEditor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ScratchPaintReducer\", function() { return ScratchPaintReducer; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n\nlet realScratchPaint;\nconst getRealScratchPaint = () => {\n if (!realScratchPaint) {\n realScratchPaint = __webpack_require__(642);\n }\n return realScratchPaint;\n};\nconst PaintEditor = props => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(getRealScratchPaint().default, props);\nlet hasSetupReducer = false;\nconst ScratchPaintReducer = (state, action) => {\n if (!hasSetupReducer && action.type === 'scratch-gui/navigation/ACTIVATE_TAB' && action.activeTabIndex === 1) {\n hasSetupReducer = true;\n }\n if (hasSetupReducer) {\n return getRealScratchPaint().ScratchPaintReducer(state, action);\n }\n return {};\n};\n\n\n/***/ }),\n/* 226 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAACXBIWXMAAAlyAAAJcgErz99GAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAYBQTFRF////AAAAgICAZmZmVVWASW1tYGCAVVVxTWaAVVWAW1ttWlp4VWNxUV55WVlzXFxwWGJ2VV5xW1t2WGFyWlpzWGB4VV10WmJ4V15yVVtzV110VWB3WV50V1x3VWB1V1x1VV9zWF12WF10VV50Vl91WFx1Vl9zVl52V191Vl13WWB1Vl11WF90V151WF92Vl91WF51Vl91WF50V192WF12V191Vl52WF10V151WF92V150V191WF11V152V150WF91WF51V111WF52WF11Vl51V151Vl50Vl11V151V150V111WF52V151V192V191V111V111V151V111V150V151Vl51V191V151V151Vl11Vl51V151WF51WF51V151WF51WF52V151V151V151V152V150V151V151V151V151Vl51V151Vl52V191Vl51V151V151V151V151V151V151V151V151V151V151V151V151V151V151V151V151V151ZcERRAAAAH90Uk5TAAECBQYHCAkKDA4REhMUGRobHB0fICEiJiosLS4vMDIzNDc5Oz0+QUZHSEpLTE5TV1laW11eX2NkZmdpa2xydHp+gIOFh4iOkJWZmpucn6GkpaytsLGys7W3vb7AxsfJzM/R2Nnb3t/g4ePk5ujp6+3u7/Dx9Pb3+Pn6+/z9/q0U6K8AAAHASURBVFjD7ZVXV8JAEEYDomAXEbuiggXBgr2jKNgLWLBiQcSOYEWU+esyG8WD7kYSXnzI95J7hsw9G7KZ5Tg5cuT8/1Q65nuyMugffQGAowKp7QonkCxI7Fet8f1wJa0/d+ezH14k9WtPICOB+QZYAqs/vKQS7laaNuPAEmjxzcwye1unXIveEKQkVdCNpecSenv+LlDCC5SGGgVeDaQ2RxdsA1NgCAIclyIdYC2STeuvA6ZA6Ufy4RrMpNhJE/SzBUU8duEGPUNapQmGBVZwQXAfb3MhnYoUcOME47oEtiG954kU5EQI25KP0yRSwHkIOxHvkSxiBTOElxGDSL1iBQ5I/vkBpAGxghXC5CMIsTaCkEBB1g0jCdS8IzVTBEMCAgvPtQk0EiqmCKwCAh9BP6Id6Zq2kTS3TEEhjxN42yHSFvVr7IiyBKo7pEt1AqvIsBmkf88NG2HGI/TFAJ7akdxYiwocFupym/v192usnrRX4FX3hrX1P2ZqmUd4pMUNf47lsRhDUI8lbxqD3fLIGOvOOAT06RwNjV9Hw8OPH/TGNA/silP4HkOSUkQGcLRFsoDLmT4P75k4OXLkyEkzH2pOgd/43vP4AAAAAElFTkSuQmCC\"\n\n/***/ }),\n/* 227 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/c216c70ef78cc80a1538a3accc6612af.svg\";\n\n/***/ }),\n/* 228 */\n/***/ (function(module) {\n\nmodule.exports = JSON.parse(\"{\\\"ar\\\":{\\\"tw.footer.credits\\\":\\\"الاعتمادات\\\",\\\"tw.usernameModal.reset\\\":\\\"إعادة تعيين\\\"},\\\"ca\\\":{\\\"tw.alerts.creatingRestorePoint\\\":\\\"S'està creant un punt de restauració...\\\",\\\"tw.alerts.lostPeripheralConnection\\\":\\\"S'ha perdut la connexió a {extensionName}.\\\",\\\"tw.alerts.savedToDisk\\\":\\\"Desat al teu ordinador.\\\",\\\"tw.backpack.rename\\\":\\\"Nou nom:\\\",\\\"tw.blocks.PROCEDURES_DOCS\\\":\\\"Com utilitzar el retorn\\\",\\\"tw.blocks.PROCEDURES_RETURN\\\":\\\"retorna {v}\\\",\\\"tw.blocks.PROCEDURES_TO_REPORTER\\\":\\\"Canvia a Reporter\\\",\\\"tw.blocks.PROCEDURES_TO_STATEMENT\\\":\\\"Canvia a Declaració\\\",\\\"tw.blocks.buttonIsDown\\\":\\\"[MOUSE_BUTTON] el botó del ratolí premut?\\\",\\\"tw.blocks.lastKeyPressed\\\":\\\"última tecla premuda\\\",\\\"tw.blocks.mouseButton.middle\\\":\\\"(1) mig\\\",\\\"tw.blocks.mouseButton.primary\\\":\\\"(0) primari\\\",\\\"tw.blocks.mouseButton.secondary\\\":\\\"(2) secundari\\\",\\\"tw.blocks.openDocs\\\":\\\"Obre la Documentació\\\",\\\"tw.cantUseCloud\\\":\\\"Tot i que pots crear variables al núvol, no funcionaran tret que aquest projecte es carregui a Scratch o es converteixi amb una eina com ara {packager}.\\\",\\\"tw.changeUsername.cannotChangeWhileRunning\\\":\\\"El nom d'usuari no es pot modificar si el projecte s'està executant.\\\",\\\"tw.clipboard.danger\\\":\\\"Si el vostre porta-retalls conté dades com ara contrasenyes, és possible que el projecte les comparteixi amb altres persones o servidors.\\\",\\\"tw.clipboard.permission\\\":\\\"L'accés al porta-retalls podria no funcionar en alguns navegadors. Si s'hi permet, es permetran automàticament propers accessos al porta-retalls.\\\",\\\"tw.clipboard.title\\\":\\\"El projecte vol llegir les dades del vostre porta-retalls.\\\",\\\"tw.cloudProvider\\\":\\\"Servidor proporcionat per {name}.\\\",\\\"tw.cloudServers\\\":\\\"Trieu un servidor a prop vostre:\\\",\\\"tw.code\\\":\\\"Codi font\\\",\\\"tw.confirmIncompatibleExtension\\\":\\\"Aquesta extensió és incompatible amb Scratch. Els projectes fets amb ell no es poden penjar al lloc web del Scratch. Segur que vols activar-lo?\\\",\\\"tw.createdBy\\\":\\\"Creat per:\\\",\\\"tw.customCloudServer\\\":\\\"Utilitzant un servidor de variables al núvol personalitzat: {server}\\\",\\\"tw.customExtension.description\\\":\\\"Carregueu extensions personalitzades des d'una adreça URL, fitxers o el codi font en JavaScript.\\\",\\\"tw.customExtension.name\\\":\\\"Extensió personalitzada\\\",\\\"tw.customExtensionModal.load\\\":\\\"Carregar\\\",\\\"tw.customExtensionModal.promptText\\\":\\\"Enganxeu el codi font en JavaScript de l'extensió:\\\",\\\"tw.customExtensionModal.promptURL\\\":\\\"Introduïu l'adreça URL de l'extensió:\\\",\\\"tw.customExtensionModal.title\\\":\\\"Carregar una extensió personalitzada\\\",\\\"tw.customExtensionModal.trusted\\\":\\\"Aquesta extensió es carregarà sense sandbox perquè ve d'una font verificada.\\\",\\\"tw.customExtensionModal.unsandboxedWarning1\\\":\\\"Carregar les extensions sense el sandbox és perillós i no s'hauria d'activar si no sabeu el què feu.\\\",\\\"tw.customExtensionModal.unsandboxedWarning2\\\":\\\"Les extensions sense \\\\\\\"sandbox\\\\\\\" poden corrompre el vostre projecte, suprimir les vostres configuracions, obtenir contrasenyes i altres actes perillosos. Els desenvolupadors de {APP_NAME} no es fan responsables dels problemes que se'n poden derivar.\\\",\\\"tw.customExtensionModal.untrusted\\\":\\\"Les extensions d'URL que no siguin fiables es carregaran sempre amb sandbox per la vostra seguretat.\\\",\\\"tw.documentation\\\":\\\"Documentació\\\",\\\"tw.embed.persistent\\\":\\\"Si s'hi permet, es permetran automàticament més embeds de la mateixa pàgina.\\\",\\\"tw.embed.risks\\\":\\\"Encara que la incrustació estigui aïllada en un entorn segur, encara podrà accedir a informació del vostre dispositiu, com ara la vostra adreça IP i la localització relativa.\\\",\\\"tw.embed.title1\\\":\\\"El projecte vol inserir contingut HTML a l'escenari:\\\",\\\"tw.embed.title2\\\":\\\"El projecte vol inserir contingut remot a l'escenari:\\\",\\\"tw.favorite\\\":\\\"Preferit\\\",\\\"tw.featuredProjectsStudio\\\":\\\"Veure l'estudi a Scratch.\\\",\\\"tw.feedback\\\":\\\"Comentaris i errors interns\\\",\\\"tw.fetch.title\\\":\\\"El projecte vol connectar-se a aquesta pàgina web:\\\",\\\"tw.fonts.add\\\":\\\"Afegeix\\\",\\\"tw.fonts.custom.file\\\":\\\"Seleccioneu un fitxer de tipus de lletra des de l'ordinador:\\\",\\\"tw.fonts.custom.name\\\":\\\"Poseu un nom a la família tipogràfica:\\\",\\\"tw.fonts.custom1\\\":\\\"Afegeix un tipus de lletra des d'un fitxer\\\",\\\"tw.fonts.custom2\\\":\\\"Probablement, no funcioni a Scratch. Formats compatibles: {formats}.\\\",\\\"tw.fonts.delete\\\":\\\"Voleu suprimir \\\\\\\"{font}\\\\\\\"? Qualsevol vestit vectorial utilitzarà la font alternativa.\\\",\\\"tw.fonts.fallback\\\":\\\"Trieu un tipus de lletra alternatiu per utilitzar-lo si no es carrega o s'elimina:\\\",\\\"tw.fonts.list\\\":\\\"Tipus de lletra instal·lats:\\\",\\\"tw.fonts.none\\\":\\\"Encara no s'ha afegit cap família tipogràfica.\\\",\\\"tw.fonts.readError\\\":\\\"Error en llegir el fitxer de tipus de lletra: {error}\\\",\\\"tw.fonts.system\\\":\\\"Família tipogràfica del sistema\\\",\\\"tw.fonts.system.name\\\":\\\"Escriviu el nom de qualsevol família tipogràfica integrada a l'ordinador. És possible que el tipus de lletra no aparegui correctament per a tots.\\\",\\\"tw.fonts.system1\\\":\\\"Afegir una família tipogràfica del sistema\\\",\\\"tw.fonts.system2\\\":\\\"Podria funcionar a Scratch, però no apareixerà correctament per a tots.\\\",\\\"tw.fonts.title\\\":\\\"Tipus de lletra\\\",\\\"tw.footer.credits\\\":\\\"Crèdits\\\",\\\"tw.footer.documentation\\\":\\\"Documentació\\\",\\\"tw.footer.embed\\\":\\\"Incrustació web\\\",\\\"tw.footer.parameters\\\":\\\"Paràmetres d'URL\\\",\\\"tw.geolocate.permission\\\":\\\"Si es permet, és possible que el navegador us demani que autoritzeu l'accés a la ubicació.\\\",\\\"tw.geolocate.title\\\":\\\"El projecte vol obtenir la vostra ubicació.\\\",\\\"tw.gui.crashMessage.description\\\":\\\"Ho sentim molt, però sembla que la pàgina s'ha bloquejat. Actualitza la pàgina per tornar-ho a provar.\\\",\\\"tw.gui.defaultProjectTitle\\\":\\\"Projecte\\\",\\\"tw.guiDefaultTitle\\\":\\\"Executa projectes del Scratch més ràpid\\\",\\\"tw.home.credit\\\":\\\"Notes i crèdits\\\",\\\"tw.home.instructions\\\":\\\"Instruccions\\\",\\\"tw.input.tooltip\\\":\\\"Copia i enganxa un enllaç d'un projecte del Scratch aquí!\\\",\\\"tw.interpolationEnabled\\\":\\\"Interpolació\\\",\\\"tw.invalidParameters.clones\\\":\\\"El paràmetre d'URL \\\\\\\"clone\\\\\\\" no és correcte\\\",\\\"tw.invalidParameters.fps\\\":\\\"El paràmetre d'URL \\\\\\\"fps\\\\\\\" no és correcte\\\",\\\"tw.loadExtension.embedded\\\":\\\"El projecte vol carregar una extensió personalitzada amb aquest codi:\\\",\\\"tw.loadExtension.sandboxed\\\":\\\"Tot i que el codi s'emmagatzemarà al sandbox, encara podrà tenir accés a informació sobre el vostre dispositiu, com ara la vostra adreça IP i la ubicació general. Assegureu-vos de confiar en l'autor d'aquesta extensió abans de seguir.\\\",\\\"tw.loadExtension.unsandboxedWarning\\\":\\\"Carregar extensions sense sandbox és perillós. Poden corrompre el vostre projecte, suprimir les vostres configuracions, obtenir contrasenyes i altres actes perillosos. Els desenvolupadors de {APP_NAME} no es fan responsables dels problemes que se'n poden derivar.\\\",\\\"tw.loadExtension.url\\\":\\\"El projecte vol carregar una extensió personalitzada a partir d'aquesta URL:\\\",\\\"tw.loader.downloadingAssets\\\":\\\"Baixant assets ({complete}/{total}) …\\\",\\\"tw.loader.projectData\\\":\\\"S'està carregant el projecte...\\\",\\\"tw.menuBar.60off\\\":\\\"Desactiva el mode de 60 FPS\\\",\\\"tw.menuBar.60on\\\":\\\"Activa el mode de 60 FPS\\\",\\\"tw.menuBar.advanced\\\":\\\"Avançat\\\",\\\"tw.menuBar.changeUsername\\\":\\\"Canvia el nom d'usuari\\\",\\\"tw.menuBar.cloudOff\\\":\\\"Desactiva les variables al núvol\\\",\\\"tw.menuBar.cloudOn\\\":\\\"Activa les variables al núvol\\\",\\\"tw.menuBar.cloudUnavailable\\\":\\\"Les variables al núvol no estan disponibles\\\",\\\"tw.menuBar.cloudUnavailableAlert\\\":\\\"No es poden utilitzar variables del núvol, probablement perquè heu obert l'editor.\\\",\\\"tw.menuBar.desktopSettings\\\":\\\"Configuració de l'escriptori\\\",\\\"tw.menuBar.moreSettings\\\":\\\"Configuració avançada\\\",\\\"tw.menuBar.newFramerate\\\":\\\"Nova velocitat de fotogrames:\\\",\\\"tw.menuBar.newWindow\\\":\\\"Nova finestra\\\",\\\"tw.menuBar.package\\\":\\\"Empaquetar projecte\\\",\\\"tw.menuBar.reportError2\\\":\\\"Això és un error. Informeu-ho si us plau.\\\",\\\"tw.menuBar.restorePoints\\\":\\\"Punts de restauració\\\",\\\"tw.menuBar.saveAs\\\":\\\"Desa com a {file}\\\",\\\"tw.menuBar.seeInside\\\":\\\"Veure per dins\\\",\\\"tw.moreCloud\\\":\\\"Més informació sobre les variables al núvol.\\\",\\\"tw.notify.permission\\\":\\\"Si es permet, és possible que es demani que habiliteu les notificacions al vostre navegador i es permetran més notificacions de forma automàtica.\\\",\\\"tw.notify.title\\\":\\\"El projecte demana mostrar notificacions.\\\",\\\"tw.oldDownload\\\":\\\"Desa com fitxer separat...\\\",\\\"tw.opcode.2000\\\":\\\"dies des del 2000\\\",\\\"tw.opcode.mousedown\\\":\\\"ratolí clicat?\\\",\\\"tw.opcode.mousex\\\":\\\"ratolí x\\\",\\\"tw.opcode.mousey\\\":\\\"ratolí y\\\",\\\"tw.openAdvanced\\\":\\\"Obrir la configuració avançada\\\",\\\"tw.openWindow.dangerous\\\":\\\"Els desenvolupadors de {APP_NAME} no han revisat aquest lloc web. Pot contenir codi perillós o maliciós.\\\",\\\"tw.openWindow.title\\\":\\\"El projecte vol obrir una finestra o una pestanya amb l'URL:\\\",\\\"tw.paint.alpha\\\":\\\"Opacitat\\\",\\\"tw.paint.fonts.more\\\":\\\"Afegir més tipus de lletra...\\\",\\\"tw.privacy\\\":\\\"Política de privacitat\\\",\\\"tw.recordAudio.permission\\\":\\\"Si es permet, és possible que se us demani que habiliteu l'accés al micròfon des del vostre navegador, i es permetran més accessos al micròfon de forma automàtica.\\\",\\\"tw.recordAudio.title\\\":\\\"El projecte vol gravar àudio del micròfon. Això pot incloure transcripció de text o dades d'arrel de l'àudio. És possible que el projecte comparteixi l'àudio amb altres persones o servidors.\\\",\\\"tw.recordVideo.permission\\\":\\\"Si es permet, és possible que se us demani que habiliteu l'accés a la càmera des del vostre navegador, i es permetran més accessos a la càmera de forma automàtica.\\\",\\\"tw.recordVideo.title\\\":\\\"El projecte vol gravar vídeo des de la càmera. És possible que el projecte comparteixi imatges amb altres persones o servidors.\\\",\\\"tw.redirect.dangerous\\\":\\\"Els desenvolupadors de {APP_NAME} no han revisat aquest lloc web. Pot contenir codi perillós o maliciós.\\\",\\\"tw.redirect.title\\\":\\\"El projecte vol reencaminar aquesta pestanya a l'URL:\\\",\\\"tw.restorePoints.1minute\\\":\\\"cada minut\\\",\\\"tw.restorePoints.assets\\\":\\\"{n} elements\\\",\\\"tw.restorePoints.deleteAll\\\":\\\"Esborra'ls tots\\\",\\\"tw.restorePoints.description\\\":\\\"{APP_NAME} realitza punts de restauració periòdics del vostre projecte al vostre ordinador per recuperar-lo si oblideu desar o es produeix un error. Tanmateix, el vostre ordinador pot eliminar aquests punts de restauració en qualsevol moment. NO CONFIEU EXCLUSIVAMENT en aquesta funció.\\\",\\\"tw.restorePoints.empty\\\":\\\"No s'ha trobat cap punt de restauració.\\\",\\\"tw.restorePoints.error\\\":\\\"S'ha produït un error en carregar el punt de restauració: {error}\\\",\\\"tw.restorePoints.intervalOption\\\":\\\"Els punts de restauració es creen {time}.\\\",\\\"tw.restorePoints.loading\\\":\\\"Carregant...\\\",\\\"tw.restorePoints.minutes\\\":\\\"cada {n} minuts\\\",\\\"tw.restorePoints.never\\\":\\\"mai\\\",\\\"tw.restorePoints.off\\\":\\\"Desactivar els punts de restauració és perillós.\\\",\\\"tw.restorePoints.size\\\":\\\"Estimació de l'emmagatzematge utilitzat: {size}\\\",\\\"tw.restorePoints.size2\\\":\\\"Només es desen una única vegada les disfresses o els sons utilitzats per diversos punts de restauració.\\\",\\\"tw.restorePoints.title\\\":\\\"Punts de restauració\\\",\\\"tw.sample\\\":\\\"Projecte d'exemple\\\",\\\"tw.saveAs\\\":\\\"Desa com a...\\\",\\\"tw.saveTo\\\":\\\"Desa a {file}\\\",\\\"tw.scratchUnsafeCloud\\\":\\\"Si fass aquesta variable al núvol, el projecte superarà el límit de {number} variables de l'Scratch i algunes variables no funcionaran si penges el projecte a l'Scratch.\\\",\\\"tw.securityManager.allow\\\":\\\"Permet\\\",\\\"tw.securityManager.deny\\\":\\\"Denega\\\",\\\"tw.securityManager.title\\\":\\\"Seguretat de l'Extensió\\\",\\\"tw.securityManager.trust\\\":\\\"Si s'hi permet, es permetran automàticament més sol·licituds al mateix lloc web.\\\",\\\"tw.securityManager.why\\\":\\\"Es pot utilitzar per descarregar imatges, so, implementar multijugador, accedir a una API o amb propòsits maliciosos. Això compartirà la vostra adreça IP, la ubicació generalitzada, i altres dades amb el lloc web.\\\",\\\"tw.settingsModal.customStageSize\\\":\\\"Mida personalitzada de l'escenari:\\\",\\\"tw.settingsModal.customStageSizeHelp\\\":\\\"Canvia la mida de l'escenari Scratch de 480x360 a una altra mida. Prova 640x360 per fer que l'escenari sigui panoràmic. Molt pocs projectes ho gestionen correctament.\\\",\\\"tw.settingsModal.dangerZone\\\":\\\"Zona perillosa\\\",\\\"tw.settingsModal.disableCompiler\\\":\\\"Desactiva el compilador\\\",\\\"tw.settingsModal.featured\\\":\\\"Destacat\\\",\\\"tw.settingsModal.fps\\\":\\\"60 FPS (FPS Personalitzats)\\\",\\\"tw.settingsModal.fpsHelp\\\":\\\"Executa scripts 60 vegades per segon en lloc de 30. La gran majoria dels projectes no executaran correctament amb aquesta funció. Hauríes de provar la interpolació amb el mode 60 FPS desactivat si és el cas.{customFramerate}.\\\",\\\"tw.settingsModal.fpsHelp.customFramerate\\\":\\\"Fes click per utilitzar una velocitat de fotogrames diferent de 30 o 60\\\",\\\"tw.settingsModal.help\\\":\\\"Feu click per obtenir ajuda\\\",\\\"tw.settingsModal.highQualityPen\\\":\\\"Llapis d'alta qualitat\\\",\\\"tw.settingsModal.highQualityPenHelp\\\":\\\"Permet que els projectes amb l'extensiu de llapis es mostrin a resolucions més altes i desactiva alguns arrodoniments de coordenades a l'editor. No tots els projectes es beneficien d'aquesta eina i pot afectar el rendiment.\\\",\\\"tw.settingsModal.infiniteClones\\\":\\\"Clons infinits\\\",\\\"tw.settingsModal.infiniteClonesHelp\\\":\\\"Desactiva el límit de 300 clons d'Scratch.\\\",\\\"tw.settingsModal.interpolation\\\":\\\"Interpolació\\\",\\\"tw.settingsModal.interpolationHelp\\\":\\\"Fa que els projectes semblin més suaus i fluids interpolant el moviment dels personatges. La interpolació no s'ha d'utilitzar en projectes 3D, traçadors de raigs/raytracers, projectes amb l'extensió de llapis i projectes amb lag, ja que la interpolació farà que funcionin més lent sense que semblin suaus.\\\",\\\"tw.settingsModal.largeStageWarning\\\":\\\"No es recomana utilitzar una mida d'escenari personalitzada tan gran! En comptes d'això, utilitza una mida inferior amb la mateixa relació d'aspecte i deixa que el mode de pantalla completa l'augmenti perquè coincideixi amb la pantalla de l'usuari.\\\",\\\"tw.settingsModal.removeFencing\\\":\\\"Eliminar les limitacions de pantalla\\\",\\\"tw.settingsModal.removeFencingHelp\\\":\\\"Permet que els personatges es moguin fora de la pantalla, siguin tan grans o tan petits com vulguin, i fa que els blocs que es pugin fer click funcionin fora de la pantalla.\\\",\\\"tw.settingsModal.removeLimits\\\":\\\"Elimina els límits\\\",\\\"tw.settingsModal.removeMiscLimits\\\":\\\"Treure límits miscel·lanis\\\",\\\"tw.settingsModal.removeMiscLimitsHelp\\\":\\\"Elimina els límits d'efectes de so i els límits de mida del llapis.\\\",\\\"tw.settingsModal.storeProjectOptions\\\":\\\"Emmagatzema la configuració al projecte\\\",\\\"tw.settingsModal.storeProjectOptionsHelp\\\":\\\"Emmagatzema la configuració seleccionada al projecte perquè s'apliquin automàticament quan TurboWarp carregui aquest projecte. El temporitzador Warp i el \\\\\\\"Desactiva el compilador\\\\\\\" no es desaran.\\\",\\\"tw.settingsModal.title\\\":\\\"Configuració avançada\\\",\\\"tw.settingsModal.warpTimer\\\":\\\"Temporitzador Warp\\\",\\\"tw.settingsModal.warpTimerHelp\\\":\\\"Fa que els scripts comprovin si estan encallars en un bucle llarg o infinit i s'executen a una velocitat de fotogrames baixa en lloc d'enganxar-se fins que s'acabi el bucle. Això corregeix la majoria de crashes, però té un impacte significatiu en el rendiment, de manera que només està activat de manera predeterminada a l'editor.\\\",\\\"tw.soundEditorNotSupported\\\":\\\"Aquest navegador no és compatible amb l'editor de so.\\\",\\\"tw.spriteSelectorItem.rename\\\":\\\"renombra\\\",\\\"tw.stereo\\\":\\\"Estèreo\\\",\\\"tw.stereoAlert\\\":\\\"Al editar aquest so estèreo és convertirà irreversiblement a mono.\\\",\\\"tw.studioview.authorAttribution\\\":\\\"fet per {author}\\\",\\\"tw.studioview.error\\\":\\\"S'ha produït un error al carregar la següent pàgina dels projectes.\\\",\\\"tw.studioview.hoverText\\\":\\\"{title}, fet per {author}\\\",\\\"tw.tooLarge\\\":\\\"És probable que aquest so sigui molt pesat per poder carregar-lo a l'Scratch.\\\",\\\"tw.twExtension.description\\\":\\\"Nous blocs estranys.\\\",\\\"tw.unfavorite\\\":\\\"No preferit\\\",\\\"tw.unshared.2\\\":\\\"Per a més informació, visita: {link}\\\",\\\"tw.unshared.bug\\\":\\\"Si realment aquest projecte s'ha compartit, si us plau informeu del error.\\\",\\\"tw.unshared.cache\\\":\\\"Si el projecte s'ha compartit recentment, aquest avís pot trigar uns minuts en desaparèixer.\\\",\\\"tw.unshared2.1\\\":\\\"Els projectes sense compartir ja no es poden veure.\\\",\\\"tw.usernameModal.help\\\":\\\"Aquest valor s'emmagatzemarà a les del vostre explorador. Es pot registrar quan interaccionis amb projectes que contenen variables al núvol.\\\",\\\"tw.usernameModal.help2\\\":\\\"Els valors que no corresponen a un compte del Scratch vàlid normalment seran rebutjats pel nostre servidor de variables al núvol. Us recomanem que ho deixis tal qual o que el canvïs pel teu nom d'usuari del Scratch.\\\",\\\"tw.usernameModal.mustChange\\\":\\\"Ho sentim, el servidor de variables al núvol creu que el teu nom d'usuari pot ser insegur. Si us plau, canvia-ho per una altre o {resetIt}.\\\",\\\"tw.usernameModal.mustChange.resetIt\\\":\\\"reseteja-ho (recomanat)\\\",\\\"tw.usernameModal.new\\\":\\\"Nou nom d'usuari:\\\",\\\"tw.usernameModal.reset\\\":\\\"Restableix\\\",\\\"tw.usernameModal.title\\\":\\\"Canvia el nom d'usuari\\\",\\\"tw.usesCloudVariables\\\":\\\"Aquest projecte utilitza variables al núvol.\\\",\\\"tw.usesCloudVariables2\\\":\\\"Les variables al núvol de {APP_NAME} no estan connectades a Scratch. Qualsevol pot {changeTheirUsername} per qualsevol, així que aneu amb compte amb la suplantació d'identitat.\\\",\\\"tw.usesCloudVariables2.change\\\":\\\"canviar el seu nom d'usuari\\\",\\\"tw.viewFeaturedProjects\\\":\\\"Fes click per veure els projectes destacats.\\\",\\\"tw.viewOnScratch\\\":\\\"Veure a l'Scratch\\\"},\\\"cs\\\":{\\\"tw.alerts.creatingRestorePoint\\\":\\\"Vytvářím bod obnovení...\\\",\\\"tw.alerts.savedToDisk\\\":\\\"Uloženo na váš počítač.\\\",\\\"tw.backpack.rename\\\":\\\"Nové jméno:\\\",\\\"tw.blocks.addons\\\":\\\"Doplňky\\\",\\\"tw.blocks.buttonIsDown\\\":\\\"[MOUSE_BUTTON]tlačítko myši stisknuto?\\\",\\\"tw.blocks.lastKeyPressed\\\":\\\"poslední stisknutá klávesa\\\",\\\"tw.blocks.mouseButton.middle\\\":\\\"(1) střední\\\",\\\"tw.blocks.mouseButton.primary\\\":\\\"(0) hlavní\\\",\\\"tw.blocks.mouseButton.secondary\\\":\\\"(2) sekundární\\\",\\\"tw.blocks.openDocs\\\":\\\"Otevřít dokumentaci\\\",\\\"tw.changeUsername.cannotChangeWhileRunning\\\":\\\"Jméno nemůže být změněno, když běží projekt.\\\",\\\"tw.code\\\":\\\"Zdrojový kód\\\",\\\"tw.confirmIncompatibleExtension\\\":\\\"Toto rozšíření není kompatibilní se Scratchem. Projekty vytvořené s tímto rozšířením nemůžou být nahrány na stránku Scratch. Jste si jisti, že chcete toto rozšíření aktivovat?\\\",\\\"tw.customExtension.name\\\":\\\"Vlastní rozšíření\\\",\\\"tw.featuredProjectsStudio\\\":\\\"Zhlédnout studio na Scratchi.\\\",\\\"tw.feedback\\\":\\\"Zpětná vazba & chyby\\\",\\\"tw.footer.credits\\\":\\\"Příspěvky\\\",\\\"tw.footer.embed\\\":\\\"Vkládání\\\",\\\"tw.footer.parameters\\\":\\\"Parametry odkazu\\\",\\\"tw.fps\\\":\\\"{framerate}FPS\\\",\\\"tw.gui.defaultProjectTitle\\\":\\\"Projekt\\\",\\\"tw.guiDefaultTitle\\\":\\\"Zrychlit projekty Scratch\\\",\\\"tw.home.credit\\\":\\\"Poznámky a příspěvky\\\",\\\"tw.home.instructions\\\":\\\"Instrukce\\\",\\\"tw.input.tooltip\\\":\\\"Sem zkopírujte a vložte link projektu Scratch!\\\",\\\"tw.interpolationEnabled\\\":\\\"Interpolace\\\",\\\"tw.invalidParameters.clones\\\":\\\"\\\\\\\"clone\\\\\\\" parametr odkazu je neplatný\\\",\\\"tw.invalidParameters.fps\\\":\\\"\\\\\\\"fps\\\\\\\" parametr odkazu je neplatný\\\",\\\"tw.invalidProject.title\\\":\\\"Chyba\\\",\\\"tw.loader.downloadingAssets\\\":\\\"Stahuji soubory ({complete}/{total}) ...\\\",\\\"tw.loader.projectData\\\":\\\"Načítám projekt ...\\\",\\\"tw.menuBar.60off\\\":\\\"Vypnout režím 60 FPS\\\",\\\"tw.menuBar.60on\\\":\\\"Zapnout režim 60 FPS\\\",\\\"tw.menuBar.addons\\\":\\\"Doplňky\\\",\\\"tw.menuBar.advanced\\\":\\\"Pokročilé\\\",\\\"tw.menuBar.changeUsername\\\":\\\"Změnit jméno\\\",\\\"tw.menuBar.cloudOff\\\":\\\"Vypnout cloudové proměnné\\\",\\\"tw.menuBar.cloudOn\\\":\\\"Zapnout cloudové proměnné\\\",\\\"tw.menuBar.cloudUnavailable\\\":\\\"Cloudové proměnné nejsou dostupné\\\",\\\"tw.menuBar.cloudUnavailableAlert\\\":\\\"Nelze použít cloudové proměnné, protože jste pravděpodobně otevřeli editor.\\\",\\\"tw.menuBar.compileError\\\":\\\"{sprite}:{error}\\\",\\\"tw.menuBar.moreSettings\\\":\\\"Pokročilé nastavení\\\",\\\"tw.menuBar.newFramerate\\\":\\\"Nová snímková frekvence:\\\",\\\"tw.menuBar.reportError2\\\":\\\"Toto je chyba, prosíme, nahlaste ji.\\\",\\\"tw.menuBar.saveAs\\\":\\\"Uložit jako {file}\\\",\\\"tw.menuBar.seeInside\\\":\\\"Pohlédnout dovnitř\\\",\\\"tw.paint.alpha\\\":\\\"Průhlednost\\\",\\\"tw.privacy\\\":\\\"Zásady ochrany osobních údajů\\\",\\\"tw.saveAs\\\":\\\"Uložit jako...\\\",\\\"tw.saveTo\\\":\\\"Uložit jako {file}\\\",\\\"tw.settingsModal.customStageSize\\\":\\\"Vlastní velikost scény\\\",\\\"tw.settingsModal.customStageSizeHelp\\\":\\\"Změní velikost scény Scratche z 480x360 na něco jiného. Zkuste 640x360, aby se změnilo rozlišení na širokoúhlé. Velmi málo projektů to zvládne.\\\",\\\"tw.settingsModal.dangerZone\\\":\\\"Zóna nebezpečí\\\",\\\"tw.settingsModal.disableCompiler\\\":\\\"Deaktivovat kompilátor\\\",\\\"tw.settingsModal.featured\\\":\\\"Vybrané\\\",\\\"tw.settingsModal.fps\\\":\\\"60 FPS (Vlastní FPS)\\\",\\\"tw.settingsModal.fpsHelp\\\":\\\"Spouští skripty 60krát za sekundu místo 30krát za sekundu. Většina projektů nebude fungovat správně s tímto nastavením. Měli byste zkusit interpolaci s deaktivovaným režimem 60 FPS, jestli se toto děje. {customFramerate}.\\\",\\\"tw.settingsModal.fpsHelp.customFramerate\\\":\\\"Klikněte sem pro použití jiné snímkové frekvence než 30 nebo 60\\\",\\\"tw.settingsModal.help\\\":\\\"Klikněte sem pro pomoc\\\",\\\"tw.settingsModal.highQualityPen\\\":\\\"Pero s vysokým rozlišením\\\",\\\"tw.settingsModal.highQualityPenHelp\\\":\\\"Povolí projekty s perem, aby kreslili na větších rozlišeních a deaktivuje některé zaokrouhlování souřadnic v editoru. Ne všechny projekty mají výhodu v tomto nastavení a může to ovlivnit výkon. \\\",\\\"tw.settingsModal.infiniteClones\\\":\\\"Nekonečné klony\\\",\\\"tw.settingsModal.infiniteClonesHelp\\\":\\\"Deaktivuje limit 300 klonů Scratche\\\",\\\"tw.settingsModal.interpolation\\\":\\\"Interpolace\\\",\\\"tw.settingsModal.interpolationHelp\\\":\\\"Zrychlí projekty interpolací pohybu postav. Interpolace by se neměla používat na 3D projektech, raytracerech, projekty s perem a zpomalených projektech, protože je interpolace zpomalí bez jejich zrychlení.\\\",\\\"tw.settingsModal.largeStageWarning\\\":\\\"Používání vlastní obrovské velikosti scény není doporučeno! Místo toho používejte menší velikost se stejnými poměry stran a nechte režim plné obrazovky zvětšit rozlišení, aby se srovnalo s displejem uživatele.\\\",\\\"tw.settingsModal.removeFencing\\\":\\\"Odstranit hranice\\\",\\\"tw.settingsModal.removeLimits\\\":\\\"Odstranit limity\\\",\\\"tw.settingsModal.removeMiscLimits\\\":\\\"Odstranit různé limity\\\",\\\"tw.settingsModal.removeMiscLimitsHelp\\\":\\\"Odstraní limity zvukových efektů a velikosti pera.\\\",\\\"tw.settingsModal.storeProjectOptions\\\":\\\"Ukládat nastavení v projektu\\\",\\\"tw.settingsModal.title\\\":\\\"Pokročilé nastavení\\\",\\\"tw.settingsModal.warpTimer\\\":\\\"Warp časovač\\\",\\\"tw.settingsModal.warpTimerHelp\\\":\\\"Skripty zkontrolují, jestli nejsou zaseklé ve dlouhém nebo nekonečném cyklu a poběží na malé snímkové frekvenci místo zaseknutí než se cyklus dokončí. Toto opraví většinu zastavení, ale má velký vliv na výkon, takže toto je jen výchozně aktivované v editoru.\\\",\\\"tw.spriteSelectorItem.rename\\\":\\\"přejmenovat\\\",\\\"tw.studioview.authorAttribution\\\":\\\"od {author}\\\",\\\"tw.studioview.error\\\":\\\"Při načítání další stránky projektů nastala chyba.\\\",\\\"tw.studioview.hoverText\\\":\\\"{title} od {author}\\\",\\\"tw.usernameModal.help\\\":\\\"Tato hodnota bude uložena ve vašem prohlížeči. Může být zapsaná, když upravujete projekty které mají cloudové proměnné.\\\",\\\"tw.usernameModal.mustChange\\\":\\\"Omlouváme se, server cloudových proměň si myslí, že vaše jméno není bezpečné. Prosíme, změňte jméno nebo {resetIt}.\\\",\\\"tw.usernameModal.mustChange.resetIt\\\":\\\"obnovit (doporučeno)\\\",\\\"tw.usernameModal.reset\\\":\\\"Obnovit\\\",\\\"tw.usernameModal.title\\\":\\\"Změnit jméno\\\",\\\"tw.viewFeaturedProjects\\\":\\\"Klikněte sem pro zhlédnutí vybraných projektů.\\\",\\\"tw.viewOnScratch\\\":\\\"Zhlédnout projekt na Scratchi\\\"},\\\"de\\\":{\\\"tw.accent.blue\\\":\\\"Blau\\\",\\\"tw.accent.purple\\\":\\\"Lila\\\",\\\"tw.accent.rainbow\\\":\\\"Regenbogen\\\",\\\"tw.accent.red\\\":\\\"Rot\\\",\\\"tw.alerts.creatingRestorePoint\\\":\\\"Wiederherstellungspunkt wird erstellt...\\\",\\\"tw.alerts.lostPeripheralConnection\\\":\\\"Verbindung zu {extensionName} verloren.\\\",\\\"tw.alerts.restorePointError\\\":\\\"Der Wiederherstellpunkt konnte nicht erstellt werden\\\",\\\"tw.alerts.restorePointSuccess\\\":\\\"Siehe \\\\\\\"Datei\\\\\\\" für die Wiederherstellpunkte\\\",\\\"tw.alerts.savedToDisk\\\":\\\"Auf deinem Computer gespeichert.\\\",\\\"tw.backpack.rename\\\":\\\"Neuer Name:\\\",\\\"tw.blockColors.custom\\\":\\\"In Addon-Einstellungen anpassen\\\",\\\"tw.blockColors.dark\\\":\\\"Dunkel (Beta)\\\",\\\"tw.blockColors.highContrast\\\":\\\"Hoher Kontrast\\\",\\\"tw.blocks.PROCEDURES_DOCS\\\":\\\"Wie funktioniert \\\\\\\"gebe aus\\\\\\\"?\\\",\\\"tw.blocks.PROCEDURES_RETURN\\\":\\\"gebe {v} aus \\\",\\\"tw.blocks.PROCEDURES_TO_REPORTER\\\":\\\"In Wertblock umwandeln\\\",\\\"tw.blocks.PROCEDURES_TO_STATEMENT\\\":\\\"In Stapelblock umwandeln\\\",\\\"tw.blocks.buttonIsDown\\\":\\\"[MOUSE_BUTTON] Maustaste gedrückt?\\\",\\\"tw.blocks.lastKeyPressed\\\":\\\"zuletzt gedrückte Taste\\\",\\\"tw.blocks.mouseButton.middle\\\":\\\"(1) mittlere\\\",\\\"tw.blocks.mouseButton.primary\\\":\\\"(0) linke\\\",\\\"tw.blocks.mouseButton.secondary\\\":\\\"(2) rechte\\\",\\\"tw.blocks.openDocs\\\":\\\"Dokumentation öffnen\\\",\\\"tw.browserModal.desktopSettings\\\":\\\"Desktopeinstellungen öffnen\\\",\\\"tw.browserModal.desktopTitle\\\":\\\"System nicht unterstützt\\\",\\\"tw.browserModal.webgl1\\\":\\\"{APP_NAME} benötigt WebGL, aber anscheinend wird es von deinem Computer nicht unterstützt. Dies ist meist ein temporärer Fehler, der durch einen Neustart des Computers behoben werden kann.\\\",\\\"tw.browserModal.webglBrowser\\\":\\\"Nutze eine aktuelle Version von Chrome, Firefox oder Safari und stelle sicher, dass deine Grafiktreiber aktuell sind. Du kannst auch versuchen, die \\\\\\\"Grafikbeschleunigung\\\\\\\" bzw. \\\\\\\"Hardwarebeschleunigung\\\\\\\" in den Browsereinstellungen ein- bzw. auszuschalten.\\\",\\\"tw.browserModal.webglDesktop\\\":\\\"Du kannst auch versuchen, die \\\\\\\"Grafikbeschleunigung\\\\\\\" in den Desktopeinstellungen ein- bzw. auszuschalten:\\\",\\\"tw.cantUseCloud\\\":\\\"Obwohl du Cloud-Variablen erstellen kannst, werden sie bis zum Hochladen auf Scratch oder auf einem Tool wie dem {packager} nicht funktionieren.\\\",\\\"tw.changeUsername.cannotChangeWhileRunning\\\":\\\"Der Benutzername kann nicht geändert werden, während das Projekt ausgeführt wird.\\\",\\\"tw.clipboard.danger\\\":\\\"Wenn deine Zwischenablage Sachen wie Passwörter einthält, könnte das Projekt in der Lage sein, sie mit anderen Nutzern oder Servern zu teilen.\\\",\\\"tw.clipboard.permission\\\":\\\"Der Zugriff auf die Zwischenablage könnte in manchen Browsern nicht funktionieren. Wenn zugelassen, werden zukünftige Zugriffe automatisch zugelassen.\\\",\\\"tw.clipboard.title\\\":\\\"Das Projekt möchte auf den Inhalt deiner Zwischenablage zugreifen.\\\",\\\"tw.cloudProvider\\\":\\\"Server bereitgestellt von {name}.\\\",\\\"tw.cloudServers\\\":\\\"Wähle einen Server in deiner Nähe:\\\",\\\"tw.code\\\":\\\"Quellcode\\\",\\\"tw.confirmIncompatibleExtension\\\":\\\"Diese Erweiterung ist nicht mit Scratch kompatibel. Projekte, die damit entwickelt werden, können nicht auf die Scratch-Website geladen werden. Bist du sicher, dass du sie aktivieren willst?\\\",\\\"tw.createdBy\\\":\\\"Entwickelt von:\\\",\\\"tw.customCloudServer\\\":\\\"Benutzerdefinierter Cloud-Variablen-Server in Verwendung: {server}\\\",\\\"tw.customExtension.description\\\":\\\"Lade eigene Erweiterungen von URLs, Dateien oder JavaScript-Quellcode.\\\",\\\"tw.customExtension.name\\\":\\\"Benutzerdefinierte Erweiterung\\\",\\\"tw.customExtensionModal.file\\\":\\\"Dateien\\\",\\\"tw.customExtensionModal.load\\\":\\\"Laden\\\",\\\"tw.customExtensionModal.promptFile\\\":\\\"Ziehe die JavaScript-Dateien der Erweiterung hierher:\\\",\\\"tw.customExtensionModal.promptText\\\":\\\"Füge den JavaScript-Quellcode mit der Erweiterung ein:\\\",\\\"tw.customExtensionModal.promptURL\\\":\\\"URL der Erweiterung eingeben:\\\",\\\"tw.customExtensionModal.title\\\":\\\"Benutzerdefinierte Erweiterung laden\\\",\\\"tw.customExtensionModal.trusted\\\":\\\"Diese Erweiterung wird ohne Sandbox geladen, weil sie aus einer vertrauenswürdigen Quelle stammt.\\\",\\\"tw.customExtensionModal.unsandboxed\\\":\\\"Ohne Sandbox ausführen\\\",\\\"tw.customExtensionModal.unsandboxedWarning1\\\":\\\"Das Laden von Erweiterungen ohne Sandbox ist gefährlich und du solltest es nur tun, wenn du dir sicher bist.\\\",\\\"tw.customExtensionModal.unsandboxedWarning2\\\":\\\"Erweiterungen ohne Sandbox können dein Projekt beschädigen, deine Einstellungen löschen, deine Passwörter phishen und sonstige schlechte Aktivitäten. Die Entwickler von {APP_NAME} sind nicht verantwortlich für jegliche Probleme.\\\",\\\"tw.customExtensionModal.untrusted\\\":\\\"Erweiterungen von Unvertrauenswürdigen URLs werden zur Sicherheit immer mit der Sandbox geladen.\\\",\\\"tw.customReporters.description\\\":\\\"Erlaubt es, eigenen Blöcken Werte ausgeben zu lassen und als Wertblöcke zu funktionieren.\\\",\\\"tw.customReporters.name\\\":\\\"Eigene Wertblöcke\\\",\\\"tw.darkMode\\\":\\\"Zu hellem Modus wechseln\\\",\\\"tw.desktopCloud\\\":\\\"In der Desktop-App werden Cloud-Variablen nur zwischen den Fenstern der Desktop-App synchronisiert. Lade das Projekt auf Scratch hoch oder nutze ein Tool wie den {packager}, um sie weltweit zu synchronisieren. \\\",\\\"tw.documentation\\\":\\\"Dokumentation\\\",\\\"tw.download.danger\\\":\\\"Diese Datei wurde nicht von den {APP_NAME}-Entwicklern geprüft.\\\",\\\"tw.download.executable\\\":\\\"Dies ist ein ausführbares Dateiformat, das schädlichen Code enthalten könnte.\\\",\\\"tw.download.file\\\":\\\"Dieses Projekt möchte eine Datei auf deinen Computer herunterladen. Es wird als {name} in deinem \\\\\\\"Downloads\\\\\\\"-Ordner gespeichert.\\\",\\\"tw.embed.persistent\\\":\\\"Wenn zugelassen, werden künftige EInbettungen zur selben Seite automatisch zugelassen.\\\",\\\"tw.embed.risks\\\":\\\"Während die Einbettung isoliert sein wird, wird sie weiterhin Zugriff auf Geräteinformationen wie deine IP-Adresse und Region haben.\\\",\\\"tw.embed.title1\\\":\\\"Dieses Projekt möchte HTML-Inhalt über die Bühne einbetten:\\\",\\\"tw.embed.title2\\\":\\\"Dieses Projekt möchte eine andere Seite über die Bühne einbetten:\\\",\\\"tw.extension.faceSensing.description\\\":\\\"Erkenne Gesichter mit der Kamera.\\\",\\\"tw.extension.faceSensing.name\\\":\\\"Gesichtserkennung\\\",\\\"tw.extensionGallery.error\\\":\\\"Erweiterungen-Sammlung konnte nicht laden werden. Besuche extensions.turbowarp.org, um mehr Erweiterungen zu finden.\\\",\\\"tw.extensionGallery.loading\\\":\\\"Erweiterungen werden geladen…\\\",\\\"tw.extensionGallery.more\\\":\\\"Erfahre mehr auf extensions.turbowarp.org.\\\",\\\"tw.extensionGallery.name\\\":\\\"Erweiterungsgalerie von {APP_NAME}\\\",\\\"tw.favorite\\\":\\\"Zu Favoriten hinzufügen \\\",\\\"tw.featuredProjectsStudio\\\":\\\"Studio auf Scratch anzeigen.\\\",\\\"tw.feedback\\\":\\\"Feedback & Fehler\\\",\\\"tw.feedbackButton\\\":\\\"Feedback für {APP_NAME}\\\",\\\"tw.fetch.title\\\":\\\"Das Projekt versucht, sich mit dieser Website zu verbinden:\\\",\\\"tw.fileInput.none\\\":\\\"Keine Dateien ausgewählt.\\\",\\\"tw.fileInput.selected\\\":\\\"Ausgewählt: {names}\\\",\\\"tw.fonts.add\\\":\\\"Hinzufügen\\\",\\\"tw.fonts.custom.file\\\":\\\"Wähle eine Schriftartdatei von deinem Computer aus:\\\",\\\"tw.fonts.custom.name\\\":\\\"Gebe der Schriftart einen Namen:\\\",\\\"tw.fonts.custom1\\\":\\\"Schriftart von einer Datei hinzufügen\\\",\\\"tw.fonts.custom2\\\":\\\"Wird normalerweise nicht auf Scratch funktionieren. Erlaubte Formate: {formats}\\\",\\\"tw.fonts.delete\\\":\\\"Bist du dir sicher, dass du \\\\\\\"{font}\\\\\\\" löschen willst? Alle Vektorkostüme werden stattdessen die Ersatzschriftart nutzen.\\\",\\\"tw.fonts.fallback\\\":\\\"Wähle eine Schriftart, die angezeigt werden soll, wenn die Schriftart nicht geladen werden kann oder gelöscht wird:\\\",\\\"tw.fonts.list\\\":\\\"Installierte Schriftarten:\\\",\\\"tw.fonts.none\\\":\\\"Es wurden noch keine Schriftarten hinzugefügt.\\\",\\\"tw.fonts.readError\\\":\\\"Schriftartdatei konnte nicht gelesen werden: {error}\\\",\\\"tw.fonts.system\\\":\\\"Systemschriftart\\\",\\\"tw.fonts.system.name\\\":\\\"Tippe den Namen einer Schriftart, die auf deinem Computer installiert ist. Die Schriftart könnte nicht für jeden richtig aussehen.\\\",\\\"tw.fonts.system1\\\":\\\"Systemschriftart hinzufügen\\\",\\\"tw.fonts.system2\\\":\\\"Kann auf Scratch funktionieren, wird aber nicht für jeden richtig aussehen\\\",\\\"tw.fonts.title\\\":\\\"Schriftarten\\\",\\\"tw.footer.credits\\\":\\\"Danksagungen\\\",\\\"tw.footer.disclaimer\\\":\\\"{APP_NAME} ist nicht mit Scratch, dem Scratch Team oder der Scratch Foundation assoziiert.\\\",\\\"tw.footer.documentation\\\":\\\"Dokumentation\\\",\\\"tw.footer.embed\\\":\\\"Einbettung\\\",\\\"tw.footer.parameters\\\":\\\"URL-Parameter\\\",\\\"tw.footer.scratchDisclaimer\\\":\\\"Scratch ist ein Projekt der Scratch Foundation. Es ist unter {scratchDotOrg} kostenlos verfügbar.\\\",\\\"tw.geolocate.permission\\\":\\\"Wenn du das erlaubt hast, könntest du von deinem Browser angefragt werden, Standortzugriff zu erlauben.\\\",\\\"tw.geolocate.title\\\":\\\"Dieses Projekt will deinen Standort einsehen.\\\",\\\"tw.gui.crashMessage.description\\\":\\\"Es tut uns leid, anscheinend ist die Seite abgestürzt. Bitte aktualisiere die Seite und versuche es erneut.\\\",\\\"tw.gui.defaultProjectTitle\\\":\\\"Projekt\\\",\\\"tw.guiDefaultTitle\\\":\\\"Scratch-Projekte schneller ausführen\\\",\\\"tw.home.credit\\\":\\\"Anmerkungen und Danksagungen\\\",\\\"tw.home.description\\\":\\\"{APP_NAME} ist eine Scratch-Modifikation, die Projekte in JavaScript kompiliert, damit sie sehr schnell ausgeführt werden. Probiere es aus, indem du die Projekt-ID oder URL oben einfügst oder eines der vorgestellten Projekte unten auswählst.\\\",\\\"tw.home.instructions\\\":\\\"Anleitung\\\",\\\"tw.input.tooltip\\\":\\\"Kopiere den Link zu einem Scratch-Projekt und füge ihn hier ein!\\\",\\\"tw.invalidParameters.clones\\\":\\\"URL-Parameter \\\\\\\"clone\\\\\\\" ist ungültig\\\",\\\"tw.invalidParameters.fps\\\":\\\"URL-Parameter \\\\\\\"fps\\\\\\\" ist ungültig\\\",\\\"tw.invalidProject.error\\\":\\\"Projekt konnte nicht geladen werden:\\\",\\\"tw.invalidProject.options\\\":\\\"Versuche, eine frühere Version des Projekts aus automatischen Wiederherstellungspunkten oder anderen Back-ups wiederherzustellen.\\\",\\\"tw.invalidProject.reportIt\\\":\\\"melde es\\\",\\\"tw.invalidProject.restorePoints\\\":\\\"Wiederherstellungspunkte anzeigen\\\",\\\"tw.invalidProject.sb3fix\\\":\\\"Verwende sb3fix, um das Projekt wiederherzustellen\\\",\\\"tw.invalidProject.title\\\":\\\"Fehler\\\",\\\"tw.invalidProject.validationError\\\":\\\"Dieser Fehler bedeutet meistens, dass ein kleiner Teil des Projekts beschädigt wurde, aber der Rest noch gültig ist. Dieses Problem kann oft leicht behoben werden, also {reportIt}.\\\",\\\"tw.invalidProject.zipCorruption\\\":\\\"Dieser Fehler bedeutet oft, dass die Datei beschädigt wurde, möglicherweise aufgrund eines fehlerhaften Speichergeräts, eines Stromausfalls oder des Trennens eines USB-Laufwerks ohne Auswerfen. Versuche {usingSb3fix}, da es diese Art von Fehler beheben kann.\\\",\\\"tw.lightMode\\\":\\\"Zu dunklem Modus wechseln\\\",\\\"tw.loadExtension.embedded\\\":\\\"Das Projekt will eine benutzerdefinierte Erweiterung laden, die folgenden Code hat:\\\",\\\"tw.loadExtension.sandboxed\\\":\\\"Obwohl der Code in der Sandbox ausgeführt wird, wird sie weiterhin Zugang zu Geräteinformationen wie deine IP-Adresse und ungefähre Position haben. Stelle sicher, dass du dem Entwickler dieser Erweiterung vertraust, bevor du fortfährst.\\\",\\\"tw.loadExtension.unsandboxed\\\":\\\"Ohne Sandbox ausführen\\\",\\\"tw.loadExtension.unsandboxedWarning\\\":\\\"Erweiterungen ohne Sandbox sind gefährlich. Sie können dann dein Projekt beschädigen, deine Einstellungen löschen, deine Passwörter phishen und sonstige schlechte Aktivitäten. Die Entwickler von {APP_NAME} sind nicht verantwortlich für jegliche Probleme.\\\",\\\"tw.loadExtension.url\\\":\\\"Das Projekt will eine benutzerdefinierte Erweiterung laden, die folgende URL hat:\\\",\\\"tw.loader.downloadingAssets\\\":\\\"Ressourcen werden heruntergeladen ({complete}/{total}) ...\\\",\\\"tw.loader.loadingAssets\\\":\\\"Ressourcen werden geladen ({complete}/{total}) ...\\\",\\\"tw.loader.projectData\\\":\\\"Projekt wird geladen ...\\\",\\\"tw.menuBar.60off\\\":\\\"60 FPS-Modus ausschalten\\\",\\\"tw.menuBar.60on\\\":\\\"60 FPS-Modus einschalten\\\",\\\"tw.menuBar.accent\\\":\\\"Akzent\\\",\\\"tw.menuBar.advanced\\\":\\\"Erweitert\\\",\\\"tw.menuBar.blockColors\\\":\\\"Blockfarben\\\",\\\"tw.menuBar.changeUsername\\\":\\\"Benutzernamen ändern\\\",\\\"tw.menuBar.cloudOff\\\":\\\"Cloud-Variablen ausschalten\\\",\\\"tw.menuBar.cloudOn\\\":\\\"Cloud-Variablen einschalten\\\",\\\"tw.menuBar.cloudUnavailable\\\":\\\"Cloud-Variablen sind nicht Verfügbar\\\",\\\"tw.menuBar.cloudUnavailableAlert\\\":\\\"Kann Cloud-Variablen nicht verwenden, wahrscheinlich, weil du den Editor geöffnet hast.\\\",\\\"tw.menuBar.desktopSettings\\\":\\\"Desktop-Einstellungen\\\",\\\"tw.menuBar.moreSettings\\\":\\\"Erweitert\\\",\\\"tw.menuBar.newFramerate\\\":\\\"Neue Framefrequenz:\\\",\\\"tw.menuBar.newWindow\\\":\\\"Neues Fenster\\\",\\\"tw.menuBar.package\\\":\\\"Paketisieren\\\",\\\"tw.menuBar.reportError1\\\":\\\"Bei manchen Skripten sind Fehler aufgetreten.\\\",\\\"tw.menuBar.reportError2\\\":\\\"Dies ist ein Fehler. Bitte melde ihn.\\\",\\\"tw.menuBar.restorePoints\\\":\\\"Wiederherstellpunkte\\\",\\\"tw.menuBar.saveAs\\\":\\\"Speichern unter {file}\\\",\\\"tw.menuBar.seeInside\\\":\\\"Schau hinein\\\",\\\"tw.moreCloud\\\":\\\"Mehr über Cloud-Variablen erfahren.\\\",\\\"tw.notify.permission\\\":\\\"Wenn du das erlaubst, könntest du von deinem Browser angefragt werden, Benachrichtigungen einzuschalten. Danach werden Benachrichtigungen automatisch erlaubt sein.\\\",\\\"tw.notify.title\\\":\\\"Das Projekt möchte Benachrichtigungen anzeigen.\\\",\\\"tw.oldDownload\\\":\\\"Kopie speichern unter...\\\",\\\"tw.opcode.2000\\\":\\\"Tage seit 2000\\\",\\\"tw.opcode.mousedown\\\":\\\"Maustaste gedrückt?\\\",\\\"tw.opcode.mousex\\\":\\\"Maus-x-Position\\\",\\\"tw.opcode.mousey\\\":\\\"Maus-y-Position\\\",\\\"tw.openAdvanced\\\":\\\"Öffne die fortgeschrittenen Einstellungen\\\",\\\"tw.openWindow.dangerous\\\":\\\"Diese Website wurde nicht von den {APP_NAME}-Entwicklern geprüft. Sie könnte schädlichen oder bösartigen Code enthalten.\\\",\\\"tw.openWindow.title\\\":\\\"Dieses Projekt möchte ein neues Fenster oder Tab mit dieser URL öffnen:\\\",\\\"tw.paint.alpha\\\":\\\"Durchsichtigkeit\\\",\\\"tw.paint.fonts.more\\\":\\\"Mehr Schriftarten hinzufügen...\\\",\\\"tw.pen.stageSelected\\\":\\\"Bühne ausgewählte: weniger Stift-Blöcke verfügbar\\\",\\\"tw.privacy\\\":\\\"Datenschutzerklärung\\\",\\\"tw.recordAudio.permission\\\":\\\"Wenn zugelassen, könnte eine Anfrage deines Browsers erscheinen, und zukünftige Zugriffe werden automatisch zugelassen.\\\",\\\"tw.recordAudio.title\\\":\\\"Dieses Projekt will von deinem Mikrofon Audio aufnehmen. Das kann ein Transkript oder rohe Audiodaten beinhalten. Das Projekt könnte das Audio mit anderen Nutzern oder Servern teilen.\\\",\\\"tw.recordVideo.permission\\\":\\\"Wenn du das erlaubst, könntest du von deinem Browser angefragt werden, Kamerazugriff zu erlauben, und weitere Kamerazugriffe werden automatisch erlaubt werden.\\\",\\\"tw.recordVideo.title\\\":\\\"Dieses Projekt möchte Video von deiner Kamera aufnehmen. Das Projekt könnte diese Bilder mit anderen Nutzern oder Servern teilen.\\\",\\\"tw.redirect.dangerous\\\":\\\"Diese Website wurde nicht von den {APP_NAME}-Entwicklern geprüft. Sie könnte schädlichen oder bösartigen Code enthalten.\\\",\\\"tw.redirect.title\\\":\\\"Das Projekt will von diesem Tab zur URL:\\\",\\\"tw.removedTrademarks\\\":\\\"Elemente mit Scratchs Markenzeichen werden hier nicht mehr aufgelistet.\\\",\\\"tw.restorePoints.1minute\\\":\\\"jede Minute\\\",\\\"tw.restorePoints.assets\\\":\\\"{n} Resourcen\\\",\\\"tw.restorePoints.confirmDelete\\\":\\\"Bist du dir sicher, dass du \\\\\\\"{projectTitle}\\\\\\\" löschen wirst? Dies kann nicht mehr rückgängig gemacht werden. \\\",\\\"tw.restorePoints.confirmDeleteAll\\\":\\\"Bist du dir sicher, dass du ALLE Wiederherstellpunkte löschen willst? Dies kann nicht mehr rückgängig gemacht weren.\\\",\\\"tw.restorePoints.confirmLoad\\\":\\\"Du hast ungespeicherte Änderungen. Willst du das momentane Projekt ersetzen?\\\",\\\"tw.restorePoints.deleteAll\\\":\\\"Alle löschen\\\",\\\"tw.restorePoints.description\\\":\\\"{APP_NAME}speichert periodisch Wiederherstellpunkte auf deinem Computer, damit dein Projekt wiederhergestellt werden kann, wenn du vergisst, zu speichern. Dies ist als letzter Ausweg für Wiederherstellung gedacht. Dein Computer kann jederzeit diese Wiederherstellpunkte unbemerkt löschen. Verlasse dich NICHT auf dieses Feature.\\\",\\\"tw.restorePoints.empty\\\":\\\"Keine Wiederherstellpunkte gefunden.\\\",\\\"tw.restorePoints.error\\\":\\\"Fehler beim Laden des Wiederherstellpunktes: {error}\\\",\\\"tw.restorePoints.exportError\\\":\\\"Fehler beim Exportieren des Wiederherstellungspunkts: {error}\\\",\\\"tw.restorePoints.intervalOption\\\":\\\"Wiederherstellpunkte werden {time} erstellt.\\\",\\\"tw.restorePoints.loading\\\":\\\"Laden...\\\",\\\"tw.restorePoints.minutes\\\":\\\"alle {n} Minuten \\\",\\\"tw.restorePoints.never\\\":\\\"nie\\\",\\\"tw.restorePoints.off\\\":\\\"Wiederherstellpunkte auszuschalten ist gefährlich.\\\",\\\"tw.restorePoints.size\\\":\\\"Ungefähre Anzahl an genutztem Speicherplatz: {size}\\\",\\\"tw.restorePoints.size2\\\":\\\"Kostüme oder Klänge, die von mehreren Wiederherstellungspunkten genutzt werden, werden nur einmal gespeichert.\\\",\\\"tw.restorePoints.title\\\":\\\"Wiederherstellpunkte\\\",\\\"tw.sample\\\":\\\"Beispielprojekt\\\",\\\"tw.saveAs\\\":\\\"Speichern unter...\\\",\\\"tw.saveTo\\\":\\\"Speichern unter {file}\\\",\\\"tw.scratchUnsafeCloud\\\":\\\"Wenn du diese Cloudvariable erstllst, wird dieses Projekt die maximale Anzahl von {number} Variablen überschreiten, und manche von ihnen werden beim Hochladen auf Scratch nicht funktionieren.\\\",\\\"tw.securityManager.allow\\\":\\\"Zulassen\\\",\\\"tw.securityManager.deny\\\":\\\"Verweigern\\\",\\\"tw.securityManager.title\\\":\\\"Erweiterungssicherheit\\\",\\\"tw.securityManager.trust\\\":\\\"Wenn es einmal zugelassen wird, werden zukünftige Anfragen zur selben Website automatisch zugelassen.\\\",\\\"tw.securityManager.why\\\":\\\"Das Projekt könnte dies zum Herunterladen von zusätzlichen Bildern und Klängen, Einbauen von Multiplayerfunktionen, Zugreifen auf eine API, aber auch für bösartige Zwecke benötigen. Es wird deine IP-Adresse, Region und möglicherweise weitere Daten mit der Website teilen.\\\",\\\"tw.settingsModal.customStageSize\\\":\\\"Benutzerdefinierte Bühnengröße:\\\",\\\"tw.settingsModal.customStageSizeHelp\\\":\\\"Ändert die Größe der Bühne von 480x360 zu etwas anderem. Versuche 640x360, um die Bühen erweitert zu machen. Sehr wenige Projekte behandlen diese Einstellung richtig.\\\",\\\"tw.settingsModal.dangerZone\\\":\\\"Gefahrenzone\\\",\\\"tw.settingsModal.disableCompiler\\\":\\\"Compiler ausschalten\\\",\\\"tw.settingsModal.disableCompilerHelp\\\":\\\"Deaktiviert den Compiler von {APP_NAME}. Du möchtest dies vielleicht während dem Bearbeiten von Projekten tun, damit die Skripte sofort aktualisiert werden. Ansonsten solltest du den Compiler aktiviert lassen.\\\",\\\"tw.settingsModal.featured\\\":\\\"Vorgestellt\\\",\\\"tw.settingsModal.fps\\\":\\\"60 FPS (Benutzerdefinierte FPS)\\\",\\\"tw.settingsModal.fpsHelp\\\":\\\"Führt Skripte 60 anstatt 30 Mal pro Sekunde aus. Die meisten Projekte werden mit diesem nicht richtig funktionieren. Falls dies der Fall ist, solltest du Interpolation ohne 60 FPS verwenden. {customFramerate}.\\\",\\\"tw.settingsModal.fpsHelp.customFramerate\\\":\\\"Klicke, um eine andere Framefrequenz als 30 oder 60 zu verwenden\\\",\\\"tw.settingsModal.help\\\":\\\"Klicke für Hilfe\\\",\\\"tw.settingsModal.highQualityPen\\\":\\\"Stift mit Hoher Qualität\\\",\\\"tw.settingsModal.highQualityPenHelp\\\":\\\"Erlaubt Stiftprojekte mit höherer Auflösung zu rendern und deaktiviert manche Koordinatenrundungen im Editor. Nicht alle Projekte haben einen Vorteil von dieser EInstellung, und sie könnte die Leistung beeinflussen.\\\",\\\"tw.settingsModal.infiniteClones\\\":\\\"Unendliche Klone\\\",\\\"tw.settingsModal.infiniteClonesHelp\\\":\\\"Deaktiviert Scratch's Limit von 300 Klonen.\\\",\\\"tw.settingsModal.interpolationHelp\\\":\\\"Macht die Ausführung des Projekts flüssiger, indem es die Bewegungen der Figuren interpoliert. Interpolation sollte nicht auf 3D-Projekten, Raytracern, Stiftprojekten und laggenden Projekten verwendet werden, da die Interpolation sie langsamer ausführen wird.\\\",\\\"tw.settingsModal.largeStageWarning\\\":\\\"Es wird nicht empfohlen, die Bühne so groß zu machen! Verwende stattdessen eine kleinere Zahl mit der gleichen Ansichtsratio und lass den Vollbildschirm sie größer machen, um sie mit dem Display des Benutzers anzupassen.\\\",\\\"tw.settingsModal.removeFencing\\\":\\\"Einzäunung entfernen\\\",\\\"tw.settingsModal.removeFencingHelp\\\":\\\"Lässt zu, dass sich Figuren über den Bildschirm hinaus bewegen, so groß oder so klein werden, wie sie wollen und macht die Erkennung von Berührungen zwischen Figuren außerhalb des Bildschirms möglich.\\\",\\\"tw.settingsModal.removeLimits\\\":\\\"Limits enfernen\\\",\\\"tw.settingsModal.removeMiscLimits\\\":\\\"Verschiedene Begrenzungen entfernen\\\",\\\"tw.settingsModal.removeMiscLimitsHelp\\\":\\\"Entfernt Begrenzungen bei Klangeffekten und bei der Stiftgröße.\\\",\\\"tw.settingsModal.storeProjectOptions\\\":\\\"Einstellungen im Projekt speichern\\\",\\\"tw.settingsModal.storeProjectOptionsHelp\\\":\\\"Speichert die ausgewählten Einstellungen im Projekt, damit sie beim Laden in TurboWarp automatisch angewendet werden. Der Compiler und der Warp Timer werden nicht gespeichert.\\\",\\\"tw.settingsModal.title\\\":\\\"Erweiterte Einstellungen\\\",\\\"tw.settingsModal.warpTimerHelp\\\":\\\"Überprüft, ob Skripte in einer langen oder endlosen Schleife feststecken, und führt sie mit einer niedrigeren Framefrequenz aus, anstatt sie auf das Ende der Schleife warten zu zu lassen. was die meisten Abstürze verbessert aber einen bedeutenden Einfluss auf die Leistung hat, deshalb ist es standardmäßig außerhalb des Editors deaktiviert.\\\",\\\"tw.soundEditorNotSupported\\\":\\\"Der Klängeeditor wird von diesem Browser nicht unterstützt.\\\",\\\"tw.spriteSelectorItem.rename\\\":\\\"umbenennnen\\\",\\\"tw.stageHeader.full\\\":\\\"Zu voller Bühne wechseln\\\",\\\"tw.stereoAlert\\\":\\\"Dieses Stereogeräusch zu ändern wird es zu Mono umwandeln, ohne dass man es wieder zurückumwandeln kann.\\\",\\\"tw.studioview.authorAttribution\\\":\\\"von {author}\\\",\\\"tw.studioview.error\\\":\\\"Es gab einen Fehler beim Laden der nächsten Seite von Projekten.\\\",\\\"tw.studioview.hoverText\\\":\\\"{title} von {author}\\\",\\\"tw.tooLarge\\\":\\\"Dieses Geräusch könnte zu groß sein, um es auf Scratch hochzuladen.\\\",\\\"tw.twExtension.description\\\":\\\"Seltsame neue Blöcke.\\\",\\\"tw.twExtension.name\\\":\\\"Blöcke von {APP_NAME}\\\",\\\"tw.unfavorite\\\":\\\"Aus Favoriten entfernen\\\",\\\"tw.unknownPlatform.1\\\":\\\"Dieses Projekt wurde für eine andere Plattform entwickelt:\\\",\\\"tw.unknownPlatform.2\\\":\\\"Die Kompatibilität mit {APP_NAME} kann nicht garantiert werden. Du kannst auf eigene Gefahr fortfahren, aber wir könnten nicht in der Lage zu sein, dir bei Problemen zu helfen.\\\",\\\"tw.unknownPlatform.continue\\\":\\\"Verstanden\\\",\\\"tw.unknownPlatform.title\\\":\\\"Unbekannte Plattform\\\",\\\"tw.unshared.2\\\":\\\"Mehr Informationen unter: {link}\\\",\\\"tw.unshared.bug\\\":\\\"Falls das Projekt eigentlich veröffentlicht ist, bitte melde den Fehler.\\\",\\\"tw.unshared.cache\\\":\\\"Falls das Projekt erst vor Kurzem veröffentlicht wurde, wird diese Nachricht möglicherweise einige Minuten lang erscheinen.\\\",\\\"tw.unshared2.1\\\":\\\"Nicht veröffentlichte Projekte sind nicht mehr sichtbar\\\",\\\"tw.usernameModal.help\\\":\\\"Dieser Wert wird in deinem Browserspeicher gespeichert. Er könnte geloggt werden, wenn du mit Projekten, die Cloudvariablen enthalten, interagierst.\\\",\\\"tw.usernameModal.help2\\\":\\\"Werte, die nicht mit einem gültigen Scratch-Konto entsprechen, werden normalerweise vom Cloudserver abgelehnt. Es ist empfohlen, diesen Wert so zu lassen, wie er ist, oder ihn auf deinen Scratch-Benutzernamen zu setzen.\\\",\\\"tw.usernameModal.mustChange\\\":\\\"Es tut uns Leid, der Cloudvariablenserver denkt, dass dein Benutzername unsicher sein könnte. Bitte ändere ihn oder {resetIt}.\\\",\\\"tw.usernameModal.mustChange.resetIt\\\":\\\"setze ihn zurück (empfohlen)\\\",\\\"tw.usernameModal.new\\\":\\\"Neuer Benutzername:\\\",\\\"tw.usernameModal.reset\\\":\\\"Zurücksetzen\\\",\\\"tw.usernameModal.title\\\":\\\"Benutzernamen ändern\\\",\\\"tw.usesCloudVariables\\\":\\\"Dieses Projekt nutzt Cloudvariablen.\\\",\\\"tw.usesCloudVariables2\\\":\\\"{APP_NAME}s Cloud-Variablen sind nicht mit denen von Scratch verbunden. Jeder kann willkürlich {changeTheirUsername}.\\\",\\\"tw.usesCloudVariables2.change\\\":\\\"seinen Benutzernamen ändern\\\",\\\"tw.viewFeaturedProjects\\\":\\\"Klicke, um vorgestellte Projekte anzusehen.\\\",\\\"tw.viewOnScratch\\\":\\\"Projekt auf Scratch anzeigen\\\"},\\\"es\\\":{\\\"tw.accent.blue\\\":\\\"Azul\\\",\\\"tw.accent.purple\\\":\\\"Morado\\\",\\\"tw.accent.rainbow\\\":\\\"Arcoíris\\\",\\\"tw.accent.red\\\":\\\"Rojo\\\",\\\"tw.alerts.creatingRestorePoint\\\":\\\"Creando punto de restauración...\\\",\\\"tw.alerts.lostPeripheralConnection\\\":\\\"Se perdió la conexión con {extensionName}.\\\",\\\"tw.alerts.restorePointError\\\":\\\"No se pudo crear el punto de restauración\\\",\\\"tw.alerts.restorePointSuccess\\\":\\\"Acceder a puntos de restauración en \\\\\\\"Archivo\\\\\\\"\\\",\\\"tw.alerts.savedToDisk\\\":\\\"Guardado a tu computadora.\\\",\\\"tw.backpack.rename\\\":\\\"Nuevo nombre:\\\",\\\"tw.blockColors.custom\\\":\\\"Personalizar en Ajustes de Addons\\\",\\\"tw.blockColors.dark\\\":\\\"Oscuro (Beta)\\\",\\\"tw.blockColors.highContrast\\\":\\\"Alto Contraste\\\",\\\"tw.blocks.PROCEDURES_DOCS\\\":\\\"Cómo usar devolver\\\",\\\"tw.blocks.PROCEDURES_RETURN\\\":\\\"devolver {v}\\\",\\\"tw.blocks.PROCEDURES_TO_REPORTER\\\":\\\"Cambiar A Reportero\\\",\\\"tw.blocks.PROCEDURES_TO_STATEMENT\\\":\\\"Cambiar A Declaración\\\",\\\"tw.blocks.buttonIsDown\\\":\\\"¿botón del ratón [MOUSE_BUTTON] presionado?\\\",\\\"tw.blocks.lastKeyPressed\\\":\\\"última tecla presionada\\\",\\\"tw.blocks.mouseButton.middle\\\":\\\"(1) central\\\",\\\"tw.blocks.mouseButton.primary\\\":\\\"(0) primario\\\",\\\"tw.blocks.mouseButton.secondary\\\":\\\"(2) secundario\\\",\\\"tw.blocks.openDocs\\\":\\\"Abrir Documentación\\\",\\\"tw.browserModal.desktopSettings\\\":\\\"Abrir Ajustes de Desktop\\\",\\\"tw.browserModal.desktopTitle\\\":\\\"Sistema no es compatible\\\",\\\"tw.browserModal.webgl1\\\":\\\"{APP_NAME} requiere WebGL, pero parece que su computador no es compatible. Esto suele ser un error temporal, y puede arreglarlo reiniciando su computador.\\\",\\\"tw.browserModal.webglBrowser\\\":\\\"Use una versión reciente de Chrome, Firefox, o Safari, y asegúrese de que sus controladores de gráficos estén actualizados. También puede intentar cambiar la opción de \\\\\\\"aceleración de gráficos\\\\\\\" o \\\\\\\"aceleración de hardware\\\\\\\" en los ajustes de su navegador.\\\",\\\"tw.browserModal.webglDesktop\\\":\\\"También puede intentar cambiar la opción de \\\\\\\"aceleración de gráficos\\\\\\\" en los ajustes de desktop.\\\",\\\"tw.cantUseCloud\\\":\\\"Aunque puedes crear variables en la nube, no fucionarán a menos que este proyecto se suba a Scratch o se convierta usando una herramienta como el {packager}.\\\",\\\"tw.changeUsername.cannotChangeWhileRunning\\\":\\\"El nombre de usuario no puede ser cambiado mientras el proyecto se está ejecutando.\\\",\\\"tw.clipboard.danger\\\":\\\"Si su portapapeles tiene cosas como contraseñas, el proyecto podría compartirlas con otros usuarios o servidores.\\\",\\\"tw.clipboard.permission\\\":\\\"El acceso a el portapapeles podría no funcionaren algunos navegadores. Si se permite, las próximas lecturas del portapapeles se permitirán automáticamente.\\\",\\\"tw.clipboard.title\\\":\\\"El proyecto quiere leer los datos de su portapapeles.\\\",\\\"tw.cloudProvider\\\":\\\"Servidor proporcionado por {name}.\\\",\\\"tw.cloudServers\\\":\\\"Elija un servidor cerca de usted:\\\",\\\"tw.code\\\":\\\"Código Fuente\\\",\\\"tw.confirmIncompatibleExtension\\\":\\\"Esta extensión es incompatible con Scratch. Proyectos hechos con ella no podrán ser subidos al sitio web de Scratch. ¿Está seguro de que quiere activarla?\\\",\\\"tw.createdBy\\\":\\\"Creado por:\\\",\\\"tw.customCloudServer\\\":\\\"Usando un servidor de variables en la nube personalizado: {server}\\\",\\\"tw.customExtension.description\\\":\\\"Cargar extensiones personalizadas desde URLs, archivos o código fuente JavaScript.\\\",\\\"tw.customExtension.name\\\":\\\"Extensión Personalizada\\\",\\\"tw.customExtensionModal.file\\\":\\\"Archivos\\\",\\\"tw.customExtensionModal.load\\\":\\\"Cargar\\\",\\\"tw.customExtensionModal.promptFile\\\":\\\"Seleccionar o soltar archivos JavaScript de la extensión:\\\",\\\"tw.customExtensionModal.promptText\\\":\\\"Pegar código fuente JavaScript de la extensión:\\\",\\\"tw.customExtensionModal.promptURL\\\":\\\"Ingresar URL de la extensión:\\\",\\\"tw.customExtensionModal.text\\\":\\\"Texto\\\",\\\"tw.customExtensionModal.title\\\":\\\"Cargar Extensión Personalizada\\\",\\\"tw.customExtensionModal.trusted\\\":\\\"Esta extensión será cargada sin el sandbox porque es de una fuente confiada.\\\",\\\"tw.customExtensionModal.unsandboxed\\\":\\\"Ejecutar sin sandbox\\\",\\\"tw.customExtensionModal.unsandboxedWarning1\\\":\\\"Cargar extensiones sin el sandbox es peligroso y no debería habilitarlo si no sabe lo que está haciendo.\\\",\\\"tw.customExtensionModal.unsandboxedWarning2\\\":\\\"Extensiones sin sandbox pueden corromper su proyecto, eliminar sus ajustes, pescar sus contraseñas, y otras cosas malas. Los desarrolladores de {APP_NAME} no son responsables por ningún problema resultante.\\\",\\\"tw.customExtensionModal.untrusted\\\":\\\"Extensiones de URLs no confiadas siempre serán cargadas con sandbox por seguridad.\\\",\\\"tw.customReporters.description\\\":\\\"Permitir a bloques personalizados devolver resultados y ser usados como entradas.\\\",\\\"tw.customReporters.name\\\":\\\"Reporteros Personalizados\\\",\\\"tw.darkMode\\\":\\\"Cambiar a Tema Claro\\\",\\\"tw.desktopCloud\\\":\\\"En la app del escritorio, las variables de la nube se sincronizan entre todas las ventanas de esta computadora. Suba el proyecto a Scratch o use una herramienta como el {packager} para que se sincronicen de forma global.\\\",\\\"tw.documentation\\\":\\\"Documentación\\\",\\\"tw.download.danger\\\":\\\"Este archivo no ha sido revisado por los desarrolladores de {APP_NAME}.\\\",\\\"tw.download.executable\\\":\\\"Este es un formato de archivo ejecutable que puede contener código malicioso si lo ejecuta.\\\",\\\"tw.embed.persistent\\\":\\\"Si se permite, se permitirán automáticamente más incrustaciones en el mismo sitio.\\\",\\\"tw.embed.risks\\\":\\\"Si bien la inserción estará protegida, seguirá teniendo acceso a información sobre su dispositivo, como su IP y ubicación general.\\\",\\\"tw.embed.title1\\\":\\\"El proyecto quiere incrustar contenido HTML en el escenario:\\\",\\\"tw.embed.title2\\\":\\\"El proyecto quiere incorporar contenido remoto sobre el escenario:\\\",\\\"tw.extension.faceSensing.description\\\":\\\"Detecta caras con la cámara.\\\",\\\"tw.extension.faceSensing.name\\\":\\\"Sensor de Cara\\\",\\\"tw.extensionGallery.error\\\":\\\"Error al cargar la galería de extensiones. Visita extensions.turbowarp.org para encontrar más extensiones.\\\",\\\"tw.extensionGallery.loading\\\":\\\"Cargando galería de extensiones...\\\",\\\"tw.extensionGallery.more\\\":\\\"Obtenga más información sobre las extensiones en extensions.turbowarp.org.\\\",\\\"tw.extensionGallery.name\\\":\\\"Extensiones de {APP_NAME}\\\",\\\"tw.favorite\\\":\\\"Favorito\\\",\\\"tw.featuredProjectsStudio\\\":\\\"Ver estudio en Scratch\\\",\\\"tw.feedback\\\":\\\"Comentarios y Bugs\\\",\\\"tw.feedbackButton\\\":\\\"Feedback de {APP_NAME}\\\",\\\"tw.fetch.title\\\":\\\"El proyecto quiere conectarse al sitio web:\\\",\\\"tw.fileInput.none\\\":\\\"No se han seleccionado archivos.\\\",\\\"tw.fileInput.selected\\\":\\\"Seleccionado: {names}\\\",\\\"tw.fonts.add\\\":\\\"Agregar\\\",\\\"tw.fonts.custom.file\\\":\\\"Selecciona una fuente tipográfica de tu computador:\\\",\\\"tw.fonts.custom.name\\\":\\\"Dale un nombre a la fuente:\\\",\\\"tw.fonts.custom1\\\":\\\"Agrega fuente de un archivo\\\",\\\"tw.fonts.custom2\\\":\\\"Usualmente no funcionará en Scratch. Formatos soportados: {formats}\\\",\\\"tw.fonts.delete\\\":\\\"¿Estás seguro que quieres borrar \\\\\\\"{font}\\\\\\\"? Cualquier disfraz vector usará la fuente de reemplazo en vez.\\\",\\\"tw.fonts.fallback\\\":\\\"Elige una fuente alternativa que se utilizará si la fuente no se carga o se elimina:\\\",\\\"tw.fonts.list\\\":\\\"Fuentes instaladas:\\\",\\\"tw.fonts.none\\\":\\\"Sin fuentes añadidas aún.\\\",\\\"tw.fonts.readError\\\":\\\"Fallo en leer fuente tipográfica: {error}\\\",\\\"tw.fonts.system\\\":\\\"Fuente del sistema\\\",\\\"tw.fonts.system.name\\\":\\\"Escribe el nombre de cualquier fuente en tu computador. La fuente puede no aparecer correctamente para todos.\\\",\\\"tw.fonts.system1\\\":\\\"Agregar una fuente del sistema\\\",\\\"tw.fonts.system2\\\":\\\"Podría funcionar en Scratch, pero no aparecerá correctamente para todos.\\\",\\\"tw.fonts.title\\\":\\\"Fuentes\\\",\\\"tw.footer.credits\\\":\\\"Créditos\\\",\\\"tw.footer.disclaimer\\\":\\\"{APP_NAME} no está afiliado con Scratch, el Equipo de Scratch o la Scratch Foundation.\\\",\\\"tw.footer.documentation\\\":\\\"Documentación\\\",\\\"tw.footer.embed\\\":\\\"Incrustado\\\",\\\"tw.footer.parameters\\\":\\\"Parámetros de URL\\\",\\\"tw.footer.scratchDisclaimer\\\":\\\"Scratch es un proyecto de la Scratch Foundation. Está disponible gratis en {scratchDotOrg}.\\\",\\\"tw.geolocate.permission\\\":\\\"Si se permite, puede que su navegador le pida acceso a su ubicación.\\\",\\\"tw.geolocate.title\\\":\\\"El proyecto quiere saber su ubicación.\\\",\\\"tw.gui.crashMessage.description\\\":\\\"Lo lamentamos mucho, pero parece que la página dejó de funcionar. Por favor actualice la página para intentar de nuevo.\\\",\\\"tw.gui.defaultProjectTitle\\\":\\\"Proyecto\\\",\\\"tw.guiDefaultTitle\\\":\\\"Ejecute proyectos de Scratch más rápido\\\",\\\"tw.home.credit\\\":\\\"Notas y Créditos\\\",\\\"tw.home.description\\\":\\\"{APP_NAME} es un mod de Scratch que compila los proyectos a JavaScript para hacerlos ejecutar muy rápido. Pruébelo insertando un ID o URL de proyecto debajo o elija un proyecto destacado debajo.\\\",\\\"tw.home.instructions\\\":\\\"Instrucciones\\\",\\\"tw.input.tooltip\\\":\\\"¡Copie y pegue un enlace a un proyecto de Scratch aquí!\\\",\\\"tw.interpolationEnabled\\\":\\\"Interpolación\\\",\\\"tw.invalidParameters.clones\\\":\\\"Parámetro de URL «clone» es inválido\\\",\\\"tw.invalidParameters.fps\\\":\\\"Parámetro de URL «fps» es inválido\\\",\\\"tw.invalidProject.error\\\":\\\"No se ha podido cargar el proyecto:\\\",\\\"tw.invalidProject.reportIt\\\":\\\"reportarlo\\\",\\\"tw.invalidProject.restorePoints\\\":\\\"Ver Puntos de Restauración\\\",\\\"tw.invalidProject.sb3fix\\\":\\\"usar sb3fix para recuperar su proyecto\\\",\\\"tw.invalidProject.zipCorruption\\\":\\\"Este error a menudo significa que el archivo se ha dañado, posiblemente debido a un dispositivo almacenamiento defectuoso, un corte de energía o a la desconexión de una unidad USB. Probe {usingSb3fix} porque puede arreglar este tipo de error.\\\",\\\"tw.lightMode\\\":\\\"Cambiar a Tema Oscuro\\\",\\\"tw.loadExtension.embedded\\\":\\\"El proyecto quiere cargar una extensión personalizada con el código:\\\",\\\"tw.loadExtension.sandboxed\\\":\\\"A pesar de que el código tenga sandbox, tendrá acceso a la información de su dispositivo como su IP y su ubicación general. Asegúrese de confiar el autor de esta extensión antes de continuar.\\\",\\\"tw.loadExtension.unsandboxed\\\":\\\"Ejecutar sin sandbox\\\",\\\"tw.loadExtension.unsandboxedWarning\\\":\\\"Cargar extensiones sin sandbox es peligroso. Será capaz de corromper su proyecto, eliminar sus ajustes, pescar sus contraseñas, y otras cosas malas. Los desarrolladores de {APP_NAME} no son responsables de ningún problema resultante.\\\",\\\"tw.loadExtension.url\\\":\\\"El proyecto quiere cargar una extensión personalizada de la URL:\\\",\\\"tw.loader.downloadingAssets\\\":\\\"Descargando assets ({complete}/{total}) ...\\\",\\\"tw.loader.loadingAssets\\\":\\\"Cargando archivos ({complete}/{total}) ...\\\",\\\"tw.loader.projectData\\\":\\\"Cargando proyecto ...\\\",\\\"tw.menuBar.60off\\\":\\\"Desactivar modo 60 FPS\\\",\\\"tw.menuBar.60on\\\":\\\"Activar modo 60 FPS\\\",\\\"tw.menuBar.accent\\\":\\\"Acento\\\",\\\"tw.menuBar.advanced\\\":\\\"Avanzado\\\",\\\"tw.menuBar.blockColors\\\":\\\"Colores de los Bloques\\\",\\\"tw.menuBar.changeUsername\\\":\\\"Cambiar Nombre de Usuario\\\",\\\"tw.menuBar.cloudOff\\\":\\\"Desactivar Variables en la Nube\\\",\\\"tw.menuBar.cloudOn\\\":\\\"Activar Variables en la Nube\\\",\\\"tw.menuBar.cloudUnavailable\\\":\\\"Variables en la Nube no Disponibles\\\",\\\"tw.menuBar.cloudUnavailableAlert\\\":\\\"No se pueden usar variables en la nube, probablemente porque abriste el editor.\\\",\\\"tw.menuBar.desktopSettings\\\":\\\"Ajustes de Desktop\\\",\\\"tw.menuBar.moreSettings\\\":\\\"Ajustes Avanzados\\\",\\\"tw.menuBar.newFramerate\\\":\\\"Nuevo FPS:\\\",\\\"tw.menuBar.newWindow\\\":\\\"Nueva ventana\\\",\\\"tw.menuBar.package\\\":\\\"Convertir proyecto\\\",\\\"tw.menuBar.reportError1\\\":\\\"Algunos scripts encontraron errores.\\\",\\\"tw.menuBar.reportError2\\\":\\\"Esto es un bug. Por favor repórtelo.\\\",\\\"tw.menuBar.restorePoints\\\":\\\"Puntos de restauración\\\",\\\"tw.menuBar.saveAs\\\":\\\"Guardar como {file}\\\",\\\"tw.menuBar.seeInside\\\":\\\"Ver dentro\\\",\\\"tw.moreCloud\\\":\\\"Obtenga más información sobre las variables de la nube.\\\",\\\"tw.notify.permission\\\":\\\"Si se permite, puede que su navegador le pida habilitar notificaciones, y próximas notificaciones serán permitidas automáticamente.\\\",\\\"tw.notify.title\\\":\\\"El proyecto quiere mostrar notificaciones.\\\",\\\"tw.oldDownload\\\":\\\"Guardar a archivo separado...\\\",\\\"tw.opcode.2000\\\":\\\"días desde el 2000\\\",\\\"tw.opcode.mousedown\\\":\\\"¿ratón presionado?\\\",\\\"tw.opcode.mousex\\\":\\\"posición x del ratón\\\",\\\"tw.opcode.mousey\\\":\\\"posición y del ratón\\\",\\\"tw.openAdvanced\\\":\\\"Abrir opciones avanzadas\\\",\\\"tw.openWindow.dangerous\\\":\\\"Este sitio web no ha sido revisado por los desarrolladores de {APP_NAME}. Podría contener código peligroso o malicioso.\\\",\\\"tw.openWindow.title\\\":\\\"Este proyecto quiere abrir una nueva ventana o pestaña con la URL:\\\",\\\"tw.paint.alpha\\\":\\\"Opacidad\\\",\\\"tw.paint.fonts.more\\\":\\\"Agregar más fuentes...\\\",\\\"tw.pen.stageSelected\\\":\\\"Escenario seleccionado: menos bloques de lápiz\\\",\\\"tw.privacy\\\":\\\"Política de Privacidad\\\",\\\"tw.recordAudio.permission\\\":\\\"Si se permite, puede que su navegador le pida acceso al micrófono, y los próximos accesos al micrófono se permitirán automáticamente.\\\",\\\"tw.recordAudio.title\\\":\\\"El proyecto quiere grabar audio de su micrófono. Esto podría incluir un transcriptor a texto o datos de audio sin procesar. El proyecto podría compartir el audio con otros usuarios o servidores.\\\",\\\"tw.recordVideo.permission\\\":\\\"Si se permite, puede que su navegador le pida acceso a su cámara, y los próximos accesos a la cámara se permitirán autiomáticamente.\\\",\\\"tw.recordVideo.title\\\":\\\"El proyecto quiere grabar video de su cámara. El proyecto podría compartir imágenes con otros usuarios o servidores.\\\",\\\"tw.redirect.dangerous\\\":\\\"Este sitio web no ha sido revisado por los desarrolladores de {APP_NAME}. Podría contener código peligroso o malicioso.\\\",\\\"tw.redirect.title\\\":\\\"El proyecto quiere trasladar esta pestaña a la URL:\\\",\\\"tw.restorePoints.1minute\\\":\\\"cada minuto\\\",\\\"tw.restorePoints.confirmDelete\\\":\\\"¿Está seguro de que quiere eliminar \\\\\\\"{projectTitle}\\\\\\\"? Esto no se puede deshacer.\\\",\\\"tw.restorePoints.confirmDeleteAll\\\":\\\"¿Está seguro de que desea eliminar TODOS los puntos de restauración? Esto no se puede deshacer.\\\",\\\"tw.restorePoints.confirmLoad\\\":\\\"Tiene cambios sin guardar. ¿Remplazar el proyecto existente?\\\",\\\"tw.restorePoints.deleteAll\\\":\\\"Eliminar Todos\\\",\\\"tw.restorePoints.description\\\":\\\"{APP_NAME} Guarda periódicamente puntos de guardado en su computadora para ayudarlo a recuperar su proyecto olvida guardarlo. Esto es guardado como una última oportunidad de recuperación. Su computadora podría silenciosamente eliminar estos puntos de guardado en cualquier momento. NO confíe en esta función.\\\",\\\"tw.restorePoints.empty\\\":\\\"No se encontraron puntos de recuperación.\\\",\\\"tw.restorePoints.error\\\":\\\"Error al cargar punto de recuperación: {error}\\\",\\\"tw.restorePoints.exportError\\\":\\\"Error al exportar punto de recuperación: {error}\\\",\\\"tw.restorePoints.intervalOption\\\":\\\"Los puntos de recuperación son creados {time}.\\\",\\\"tw.restorePoints.loading\\\":\\\"Cargando...\\\",\\\"tw.restorePoints.minutes\\\":\\\"cada {n} minutos\\\",\\\"tw.restorePoints.never\\\":\\\"nunca\\\",\\\"tw.restorePoints.off\\\":\\\"Deshabilitar puntos de recuperación es peligroso.\\\",\\\"tw.restorePoints.size\\\":\\\"Estimación del almacenamiento usado: {size}\\\",\\\"tw.restorePoints.size2\\\":\\\"Los disfraces y sonidos usados por múltiples puntos de recuperación son solo almacenados una vez.\\\",\\\"tw.restorePoints.title\\\":\\\"Puntos de Restauración\\\",\\\"tw.sample\\\":\\\"Proyecto de muestra\\\",\\\"tw.saveAs\\\":\\\"Guardar como...\\\",\\\"tw.saveTo\\\":\\\"Guardar a {file}\\\",\\\"tw.scratchUnsafeCloud\\\":\\\"Si hace esto una variable en la nube, el proyecto exederá el límite de Scratch de {number} variables y algunas variables no funcionarán si sube el proyecto a Scratch.\\\",\\\"tw.securityManager.allow\\\":\\\"Permitir\\\",\\\"tw.securityManager.deny\\\":\\\"Denegar\\\",\\\"tw.securityManager.title\\\":\\\"Seguridad de la Extensión\\\",\\\"tw.securityManager.trust\\\":\\\"Si se permite, las próximas consultas al mismo sitio web serán automáticamente permitidas.\\\",\\\"tw.securityManager.why\\\":\\\"Esto podría ser usado para descargar imágenes o sonidos, implementar multijugador, acceder a una API, o con intenciones maliciosas. Esto compartirá tu dirección de IP, ubicación general, y probablemente otra información con el sitio web.\\\",\\\"tw.settingsModal.customStageSize\\\":\\\"Tamaño Personalizado del Escenario:\\\",\\\"tw.settingsModal.customStageSizeHelp\\\":\\\"Cambia el tamaño del escenario de Scratch de 480x360 a algo diferente. Pruebe 640x360 para hacer el escenario más ancho. Muy pocos proyectos manejarán esto adecuadamente.\\\",\\\"tw.settingsModal.dangerZone\\\":\\\"Zona Peligrosa\\\",\\\"tw.settingsModal.disableCompiler\\\":\\\"Desactivar Compilador\\\",\\\"tw.settingsModal.disableCompilerHelp\\\":\\\"Desactiva el compilador de {APP_NAME}. Puede que quiera activar esto mientras edita proyectos para que sus scripts se actualicen inmediatamente. Si ese no es el caso, no debería activar esto nunca.\\\",\\\"tw.settingsModal.featured\\\":\\\"Destacado\\\",\\\"tw.settingsModal.fps\\\":\\\"60 FPS (FPS Personalizado)\\\",\\\"tw.settingsModal.fpsHelp\\\":\\\"Ejecuta scripts 60 veces por segundo en vez de 30. La mayoría de los proyectos no funcionarán correctamente con esto activado. Debería probar Interpolación con modo 60 FPS desactivado si ese es el caso. {customFramerate}.\\\",\\\"tw.settingsModal.fpsHelp.customFramerate\\\":\\\"Haga click para usar un framerate diferente a 30 o 60\\\",\\\"tw.settingsModal.help\\\":\\\"Haga click para ayuda\\\",\\\"tw.settingsModal.highQualityPen\\\":\\\"Lápiz de Alta Calidad\\\",\\\"tw.settingsModal.highQualityPenHelp\\\":\\\"Permite a los proyectos que usen la extensión del Lápiz renderizar en una mayor resolución y desactiva el redondeo de coordenadas dentro del editor. No todos los proyectos se ven beneficiados de esta configuración, pues puede afectar negativamente el rendimiento. \\\",\\\"tw.settingsModal.infiniteClones\\\":\\\"Clones Infinitos\\\",\\\"tw.settingsModal.infiniteClonesHelp\\\":\\\"Desactiva el límite de 300 clones de Scratch.\\\",\\\"tw.settingsModal.interpolation\\\":\\\"Interpolación\\\",\\\"tw.settingsModal.interpolationHelp\\\":\\\"Hace que los movimientos dentro de los proyectos se vean más suaves al interpolar los cambios de posición de los objetos. No es recomendable utilizar el ajuste de interpolación en proyectos 3D o proyectos que utilicen la extensión del Lápiz u otros proyectos que sean de bajo rendimiento, ya que esta función lo ralentizará aún más.\\\",\\\"tw.settingsModal.largeStageWarning\\\":\\\"Usar un tamaño personalizado del escenario tan grande no es recomendado. En cambio, use un tamaño más pequeño con la misma relación de aspecto y permita que el modo pantalla completa agrande el escenario para cubrir toda la pantalla del usuario.\\\",\\\"tw.settingsModal.removeFencing\\\":\\\"Quitar Fencing\\\",\\\"tw.settingsModal.removeFencingHelp\\\":\\\"Permite a los objetos moverse afuera de la pantalla o hacerse tan grandes o chicos como deseen y hace funcionar los bloques \\\\\\\"tocando\\\\\\\" fuera de la pantalla.\\\",\\\"tw.settingsModal.removeLimits\\\":\\\"Quitar Límites\\\",\\\"tw.settingsModal.removeMiscLimits\\\":\\\"Quitar Límites Varios\\\",\\\"tw.settingsModal.removeMiscLimitsHelp\\\":\\\"Elimina los límites de sonido y de tamaño del lápiz.\\\",\\\"tw.settingsModal.storeProjectOptions\\\":\\\"Guardar ajustes en proyecto\\\",\\\"tw.settingsModal.storeProjectOptionsHelp\\\":\\\"Guarda los ajustes seleccionados en el proyecto para que sean aplicados automáticamente cuando TurboWarp carga este proyecto. Warp Timer y desactivar compilador no serán guardados.\\\",\\\"tw.settingsModal.title\\\":\\\"Ajustes Avanzados\\\",\\\"tw.settingsModal.warpTimerHelp\\\":\\\"Hace que los scripts revisen si están atascados en un bucle infinito y si es así, hace que vayan a una menor tasa de refresco hasta que el bucle termine, logrando evitar la mayoría de colapsos por este tipo de errores. Este ajuste tiene un impacto negativo significante en el rendimiento, por lo que solo está habilitado por defecto en el editor.\\\",\\\"tw.soundEditorNotSupported\\\":\\\"El editor de sonido no es compatible con este navegador.\\\",\\\"tw.spriteSelectorItem.rename\\\":\\\"renombrar\\\",\\\"tw.stageHeader.full\\\":\\\"Cambiar a un escenario lleno\\\",\\\"tw.stereo\\\":\\\"Estéreo\\\",\\\"tw.stereoAlert\\\":\\\"Editar este sonido estéreo lo convertirá irreversiblemente en mono.\\\",\\\"tw.studioview.authorAttribution\\\":\\\"por {author}\\\",\\\"tw.studioview.error\\\":\\\"Ocurrió un error cargando la siguiente página de proyectos.\\\",\\\"tw.studioview.hoverText\\\":\\\"{title} por {author}\\\",\\\"tw.tooLarge\\\":\\\"Este sonido podría ser demasiado grande como para cargarlo en Scratch.\\\",\\\"tw.twExtension.description\\\":\\\"Nuevos bloques extraños.\\\",\\\"tw.twExtension.name\\\":\\\"Bloques de {APP_NAME}\\\",\\\"tw.unfavorite\\\":\\\"No favorito\\\",\\\"tw.unshared.2\\\":\\\"Para más información, visite: {link}\\\",\\\"tw.unshared.bug\\\":\\\"Si el proyecto está realmente compartido, por favor reporte un error.\\\",\\\"tw.unshared.cache\\\":\\\"Si el proyecto se a compartido recientemente, este mensaje podría aparecer incorrectamente por algunos minutos.\\\",\\\"tw.unshared2.1\\\":\\\"Los proyectos no compartidos ya no son visibles\\\",\\\"tw.usernameModal.help\\\":\\\"Este valor será guardado en el almacenamiento de su navegador. Es posible que sea usado cuando interactúe con proyectos que contengan variables en la nube.\\\",\\\"tw.usernameModal.help2\\\":\\\"Valores que no corresponden a una cuenta de Scratch válida típicamente serán rechazadas por el servidor de variables en la nube. Se le recomienda dejarlo como está o cambiarlo a su nombre de usuario de Scratch.\\\",\\\"tw.usernameModal.mustChange\\\":\\\"Lo sentimos, el servidor de variables en la nube piensa que tu nombre de usuario puede ser inseguro. Por favor cámbielo a otra cosa o {resetIt}.\\\",\\\"tw.usernameModal.mustChange.resetIt\\\":\\\"resetéelo (recomendado)\\\",\\\"tw.usernameModal.new\\\":\\\"Nuevo nombre de usuario:\\\",\\\"tw.usernameModal.reset\\\":\\\"Reiniciar\\\",\\\"tw.usernameModal.title\\\":\\\"Cambiar Nombre de Usuario\\\",\\\"tw.usesCloudVariables\\\":\\\"Este proyecto utiliza variables de nube.\\\",\\\"tw.usesCloudVariables2\\\":\\\"Las variables de la nube de {APP_NAME} no están conectadas a las de Scratch. Cualquiera puede {changeTheirUsername}, así que tenga cuidado con la suplantación.\\\",\\\"tw.usesCloudVariables2.change\\\":\\\"cambiar su nombre de usuario\\\",\\\"tw.viewFeaturedProjects\\\":\\\"Clickee para ver proyectos destacados.\\\",\\\"tw.viewOnScratch\\\":\\\"Ver proyecto en Scratch\\\"},\\\"fi\\\":{\\\"tw.accent.blue\\\":\\\"Sininen\\\",\\\"tw.accent.purple\\\":\\\"Violetti\\\",\\\"tw.accent.rainbow\\\":\\\"Sateenkaari\\\",\\\"tw.accent.red\\\":\\\"Punainen\\\",\\\"tw.alerts.creatingRestorePoint\\\":\\\"Luodaan palautuskohtaa...\\\",\\\"tw.alerts.lostPeripheralConnection\\\":\\\"Yhteys laajennukseen {extensionName} katkesi.\\\",\\\"tw.alerts.restorePointError\\\":\\\"Palautuskohtaa ei voitu luoda\\\",\\\"tw.alerts.restorePointSuccess\\\":\\\"Palautuskohdat ovat \\\\\\\"Tiedosto\\\\\\\"-valikossa\\\",\\\"tw.alerts.savedToDisk\\\":\\\"Tallennettu tietokoneellesi.\\\",\\\"tw.backpack.rename\\\":\\\"Uusi nimi:\\\",\\\"tw.blockColors.custom\\\":\\\"Mukauta lisäosa-asetuksissa\\\",\\\"tw.blockColors.dark\\\":\\\"Tumma (beeta)\\\",\\\"tw.blockColors.highContrast\\\":\\\"Korkea kontrasti\\\",\\\"tw.blockColors.three\\\":\\\"Alkuperäinen\\\",\\\"tw.blocks.PROCEDURES_DOCS\\\":\\\"Palauta-lohkon käyttäminen\\\",\\\"tw.blocks.PROCEDURES_RETURN\\\":\\\"palauta {v}\\\",\\\"tw.blocks.PROCEDURES_TO_REPORTER\\\":\\\"Muuta ilmoituslohkoksi\\\",\\\"tw.blocks.PROCEDURES_TO_STATEMENT\\\":\\\"Muuta komennoksi\\\",\\\"tw.blocks.addons\\\":\\\"Lisäosat\\\",\\\"tw.blocks.buttonIsDown\\\":\\\"onko hiiren [MOUSE_BUTTON] nappi painettu?\\\",\\\"tw.blocks.lastKeyPressed\\\":\\\"viimeisin painettu näppäin\\\",\\\"tw.blocks.mouseButton.middle\\\":\\\"(1) keskimmäinen\\\",\\\"tw.blocks.mouseButton.primary\\\":\\\"(0) ensisijainen\\\",\\\"tw.blocks.mouseButton.secondary\\\":\\\"(2) toissijainen\\\",\\\"tw.blocks.openDocs\\\":\\\"Avaa opas\\\",\\\"tw.browserModal.desktopSettings\\\":\\\"Avaa selaimen asetukset\\\",\\\"tw.browserModal.desktopTitle\\\":\\\"Järjestelmää ei tueta\\\",\\\"tw.browserModal.webgl1\\\":\\\"{APP_NAME} vaatii WebGL:n, mutta tietokoneesi ei vaikuta tukevan sitä. Tämä virhe on usein väliaikainen, ja voit korjata sen käynnistämällä tietokoneesi uudelleen.\\\",\\\"tw.browserModal.webglBrowser\\\":\\\"Käytä Chromen, Firefoxin tai Safarin uutta versiota ja varmista, että grafiikka-ajurisi ovat ajan tasalla. Voit myös kytkeä \\\\\\\"grafiikkakiihdytys\\\\\\\"- tai \\\\\\\"laitteistokiihdytys\\\\\\\"-asetuksen päälle tai pois selaimesi asetuksissa.\\\",\\\"tw.browserModal.webglDesktop\\\":\\\"Voit myös koettaa kytkeä \\\\\\\"grafiikkakiihdytys\\\\\\\"-asetuksen päälle tai pois selaimen asetuksissa:\\\",\\\"tw.cantUseCloud\\\":\\\"Vaikka voit luoda pilvimuuttujia, ne eivät toimi, ellei tätä projektia ladata Scratchiin tai muunneta {packager} -pakkauskoneen kaltaisella työkalulla.\\\",\\\"tw.changeUsername.cannotChangeWhileRunning\\\":\\\"Käyttäjänimeä ei voi muuttaa, kun projekti on käynnissä.\\\",\\\"tw.clipboard.danger\\\":\\\"Jos leikepöytäsi sisältää salasanojen kaltaisia asioita, projekti saattaa voida jakaa niitä muiden käyttäjien tai palvelimien kanssa.\\\",\\\"tw.clipboard.permission\\\":\\\"Pääsy leikepöydän sisältöön ei välttämättä toimi joissakin selaimissa. Jos sallit sen nyt, pääsy leikepöydän sisältöön sallitaan jatkossa automaattisesti.\\\",\\\"tw.clipboard.title\\\":\\\"Projekti haluaa pääsyn leikepöytäsi sisältöön.\\\",\\\"tw.cloudProvider\\\":\\\"Palvelimen tarjoaa {name}.\\\",\\\"tw.cloudServers\\\":\\\"Valitse lähelläsi oleva palvelin:\\\",\\\"tw.code\\\":\\\"Lähdekoodi\\\",\\\"tw.confirmIncompatibleExtension\\\":\\\"Tämä laajennus ei ole yhteensopiva Scratchin kanssa. Sillä tehtyjä projekteja ei voi ladata Scratchin verkkosivustolle. Haluatko varmasti ottaa sen käyttöön?\\\",\\\"tw.createdBy\\\":\\\"Tekijät:\\\",\\\"tw.customCloudServer\\\":\\\"Käytä omaa pilvimuuttujapalvelinta: {server}\\\",\\\"tw.customExtension.description\\\":\\\"Lataa oma laajennus URL-osoitteista, tiedostoista tai JavaScript-lähdekoodista.\\\",\\\"tw.customExtension.name\\\":\\\"Oma laajennus\\\",\\\"tw.customExtensionModal.file\\\":\\\"Tiedostot\\\",\\\"tw.customExtensionModal.load\\\":\\\"Lataa\\\",\\\"tw.customExtensionModal.promptFile\\\":\\\"Valitse tai pudota laajennuksen JavaScript-tiedostot:\\\",\\\"tw.customExtensionModal.promptText\\\":\\\"Liitä laajennuksen JavaScript-lähdekoodi:\\\",\\\"tw.customExtensionModal.promptURL\\\":\\\"Anna laajennuksen URL-osoite:\\\",\\\"tw.customExtensionModal.text\\\":\\\"Teksti\\\",\\\"tw.customExtensionModal.title\\\":\\\"Lataa oma laajennus\\\",\\\"tw.customExtensionModal.trusted\\\":\\\"Tämä laajennus voidaan ladata hiekkalaatikon ulkopuolelle, koska se on peräisin luotetusta lähteestä.\\\",\\\"tw.customExtensionModal.unsandboxed\\\":\\\"Suorita hiekkalaatikon ulkopuolella\\\",\\\"tw.customExtensionModal.unsandboxedWarning1\\\":\\\"Laajennusten lataaminen hiekkalaatikon ulkopuolelle on vaarallista. Älä tee sitä, jos et tiedä, mitä teet.\\\",\\\"tw.customExtensionModal.unsandboxedWarning2\\\":\\\"Hiekkalaatikon ulkopuoliset laajennukset voivat turmella projektia, poistaa asetuksia, kalastella salasanoja ja tehdä muita pahoja asioita. {APP_NAME}in kehittäjät eivät ole vastuussa ilmenneistä ongelmista.\\\",\\\"tw.customExtensionModal.untrusted\\\":\\\"Epäluotettavista URL-osoitteista peräisin olevat laajennukset ladataan aina hiekkalaatikkoon turvallisuusyistä.\\\",\\\"tw.customExtensionModal.url\\\":\\\"URL-osoite\\\",\\\"tw.customReporters.description\\\":\\\"Käytä omia lohkoja syötteinä ja arvojen palauttamiseen.\\\",\\\"tw.customReporters.name\\\":\\\"Omat ilmoituslohkot\\\",\\\"tw.darkMode\\\":\\\"Vaihda vaaleaan tilaan\\\",\\\"tw.desktopCloud\\\":\\\"Työpöytäsovelluksessa pilvimuuttujat synkronoituvat kaikkien tämän tietokoneen sovellusikkunoiden välillä. Lataa projekti Scratchiin tai käytä {packager} -pakkauskonetta, jotta ne synkronoituvat maailmanlaajuisesti.\\\",\\\"tw.documentation\\\":\\\"Opas\\\",\\\"tw.download.danger\\\":\\\"{APP_NAME}in kehittäjät eivät ole tarkastaneet tätä tiedostoa.\\\",\\\"tw.download.executable\\\":\\\"Tämä on ajotiedosto, joka saattaa olla suoritettaessa haitallinen.\\\",\\\"tw.download.file\\\":\\\"Projekti haluaa ladata tiedoston tietokoneellesi. Se tallennetaan nimellä {name} Ladatut tiedostot -kansioosi.\\\",\\\"tw.embed.persistent\\\":\\\"Jos sallit tämän, tulevat upotukset samalta sivustolta sallitaan automaattisesti.\\\",\\\"tw.embed.risks\\\":\\\"Vaikka upotus on hiekkalaatikossa, sillä on silti pääsy laitteesi tietoihin, kuten IP-osoitteeseen ja likimääräiseen sijaintiin.\\\",\\\"tw.embed.title1\\\":\\\"Projekti haluaa upottaa HTML-sisältöä esiintymislavan ylle:\\\",\\\"tw.embed.title2\\\":\\\"Projekti haluaa upottaa ulkoista sisältöä esiintymislavan ylle:\\\",\\\"tw.extensionGallery.error\\\":\\\"Virhe laajennusgalleriaa ladatessa. Lisää laajennuksia löydät osoitteesta extensions.turbowarp.org.\\\",\\\"tw.extensionGallery.loading\\\":\\\"Ladataan laajennusgalleriaa...\\\",\\\"tw.extensionGallery.more\\\":\\\"Lisätietoja laajennuksista osoitteessa extensions.turbowarp.org.\\\",\\\"tw.extensionGallery.name\\\":\\\"{APP_NAME}in laajennusgalleria\\\",\\\"tw.favorite\\\":\\\"Lisää suosikiksi\\\",\\\"tw.featuredProjectsStudio\\\":\\\"Näytä studio Scratchissa.\\\",\\\"tw.feedback\\\":\\\"Palaute ja bugit\\\",\\\"tw.feedbackButton\\\":\\\"Palaute {APP_NAME}ista\\\",\\\"tw.fetch.title\\\":\\\"Projekti haluaa yhdistää verkkosivustoon:\\\",\\\"tw.fileInput.none\\\":\\\"Ei valittuja tiedostoja.\\\",\\\"tw.fileInput.selected\\\":\\\"Valitut: {names}\\\",\\\"tw.fonts.add\\\":\\\"Lisää\\\",\\\"tw.fonts.custom.file\\\":\\\"Valitse fonttitiedosto tietokoneeltasi:\\\",\\\"tw.fonts.custom.name\\\":\\\"Nimeä fontti:\\\",\\\"tw.fonts.custom1\\\":\\\"Lisää fontti tiedostosta\\\",\\\"tw.fonts.custom2\\\":\\\"Ei yleensä toimi Scratchissa. Tuetut tiedostotyypit: {formats}.\\\",\\\"tw.fonts.delete\\\":\\\"Haluatko varmasti poistaa fontin \\\\\\\"{font}\\\\\\\"? Kaikki vektoriasusteet alkavat käyttää varmistusfonttia sen sijaan.\\\",\\\"tw.fonts.fallback\\\":\\\"Valitse varmistusfontti, jota käytetään, jos fontin lataaminen epäonnistuu tai se on poistettu:\\\",\\\"tw.fonts.list\\\":\\\"Asennetut fontit:\\\",\\\"tw.fonts.none\\\":\\\"Fontteja ei ole vielä lisätty.\\\",\\\"tw.fonts.readError\\\":\\\"Fonttitiedoston lukeminen epäonnistui: {error}\\\",\\\"tw.fonts.system\\\":\\\"Järjestelmäfontti\\\",\\\"tw.fonts.system.name\\\":\\\"Kirjoita minkä tahansa tietokoneeseesi sisäänrakennetun fontin nimi. Fontti ei välttämättä näy oikein kaikille.\\\",\\\"tw.fonts.system1\\\":\\\"Lisää järjestelmäfontti\\\",\\\"tw.fonts.system2\\\":\\\"Saattaa toimia Scratchissa, mutta ei näy kaikille oikein.\\\",\\\"tw.fonts.title\\\":\\\"Fontit\\\",\\\"tw.footer.credits\\\":\\\"Tekijät\\\",\\\"tw.footer.disclaimer\\\":\\\"{APP_NAME} ei ole kytköksissä Scratchiin, Scratch-tiimiin tai Scratch-säätiöön.\\\",\\\"tw.footer.documentation\\\":\\\"Opas\\\",\\\"tw.footer.embed\\\":\\\"Upottaminen\\\",\\\"tw.footer.parameters\\\":\\\"URL-parametrit\\\",\\\"tw.footer.scratchDisclaimer\\\":\\\"Scratch on Scratch-säätiön projekti. Se on saatavilla ilmaiseksi osoitteessa {scratchDotOrg}.\\\",\\\"tw.fps\\\":\\\"{framerate} ruutua/s\\\",\\\"tw.geolocate.permission\\\":\\\"Jos sallit tämän, selaimesi saattaa pyytää sinua hyväksymään sijainnin käytön.\\\",\\\"tw.geolocate.title\\\":\\\"Projekti haluaa tietää sijaintisi.\\\",\\\"tw.gui.crashMessage.description\\\":\\\"Pahoittelut, mutta vaikuttaa siltä, että sivu kaatui. Yritä uudelleen päivittämällä sivu uudelleen.\\\",\\\"tw.gui.defaultProjectTitle\\\":\\\"Projekti\\\",\\\"tw.guiDefaultTitle\\\":\\\"Aja Scratch-projekteja nopeammin\\\",\\\"tw.home.credit\\\":\\\"Ilmoitukset ja kiitokset\\\",\\\"tw.home.description\\\":\\\"{APP_NAME} on Scratchin muunnelma, joka kääntää projektit JavaScriptiksi, jotta ne voidaan suorittaa todella nopeasti. Koeta kirjoittaa projektin tunnus tai URL-osoite ylle tai valitse valittu projekti alta.\\\",\\\"tw.home.instructions\\\":\\\"Ohjeet\\\",\\\"tw.input.tooltip\\\":\\\"Kopioi ja liitä Scratch-projektin linkki tähän!\\\",\\\"tw.interpolationEnabled\\\":\\\"Interpolaatio\\\",\\\"tw.invalidParameters.clones\\\":\\\"\\\\\\\"clone\\\\\\\"-URL-parametri ei ole kelvollinen\\\",\\\"tw.invalidParameters.fps\\\":\\\"\\\\\\\"fps\\\\\\\"-URL-parametri ei ole kelvollinen\\\",\\\"tw.invalidProject.error\\\":\\\"Projektia ei voitu ladata:\\\",\\\"tw.invalidProject.options\\\":\\\"Voit ehkä saada takaisin projektin vanhemman version automaattisista palautuskohdista tai muista varmuuskopioista.\\\",\\\"tw.invalidProject.reportIt\\\":\\\"ilmoita siitä\\\",\\\"tw.invalidProject.restorePoints\\\":\\\"Näytä palautuskohdat\\\",\\\"tw.invalidProject.title\\\":\\\"Virhe\\\",\\\"tw.invalidProject.validationError\\\":\\\"Tämä virhe tarkoittaa useimmiten sitä, että pieni osa projektista on turmeltunut, mutta muuten se toimii. Tämä voidaan helposti korjata, joten {reportIt}.\\\",\\\"tw.lightMode\\\":\\\"Vaihda tummaan tilaan\\\",\\\"tw.loadExtension.embedded\\\":\\\"Projekti haluaa ladata oman laajennuksen koodilla:\\\",\\\"tw.loadExtension.sandboxed\\\":\\\"Vaikka koodi on hiekkalaatikossa, sillä on silti pääsy laitteesi tietoihin, kuten IP-osoitteeseen ja likimääräiseen sijaintiin. Varmista ennen jatkamista, että tekijä on luotettava.\\\",\\\"tw.loadExtension.unsandboxed\\\":\\\"Suorita hiekkalaatikon ulkopuolella\\\",\\\"tw.loadExtension.unsandboxedWarning\\\":\\\"Laajennusten lataaminen hiekkalaatikon ulkopuolelle on vaarallista. Se voi turmella projektia, poistaa asetuksia, kalastella salasanoja ja tehdä muita pahoja asioita. {APP_NAME}in kehittäjät eivät ole vastuussa ilmenneistä ongelmista.\\\",\\\"tw.loadExtension.url\\\":\\\"Projekti haluaa ladata oman laajennuksen URL-osoitteesta:\\\",\\\"tw.loader.downloadingAssets\\\":\\\"Ladataan resursseja ({complete}/{total})...\\\",\\\"tw.loader.loadingAssets\\\":\\\"Ladataan resursseja ({complete}/{total})...\\\",\\\"tw.loader.projectData\\\":\\\"Ladataan projektia...\\\",\\\"tw.menuBar.60off\\\":\\\"Kytke 60 ruutua sekunnissa -tila pois\\\",\\\"tw.menuBar.60on\\\":\\\"Kytke 60 ruutua sekunnissa -tila päälle\\\",\\\"tw.menuBar.accent\\\":\\\"Korostus\\\",\\\"tw.menuBar.addons\\\":\\\"Lisäosat\\\",\\\"tw.menuBar.advanced\\\":\\\"Edistykselliset\\\",\\\"tw.menuBar.blockColors\\\":\\\"Lohkojen väri\\\",\\\"tw.menuBar.changeUsername\\\":\\\"Muuta käyttäjänimi\\\",\\\"tw.menuBar.cloudOff\\\":\\\"Poista pilvimuuttujat käytöstä\\\",\\\"tw.menuBar.cloudOn\\\":\\\"Ota pilvimuuttujat käyttöön\\\",\\\"tw.menuBar.cloudUnavailable\\\":\\\"Pilvimuuttujat eivät ole saatavilla\\\",\\\"tw.menuBar.cloudUnavailableAlert\\\":\\\"Pilvimuuttujia ei voida käyttää. Todennäköisesti siksi, koska sinä avasit editorin.\\\",\\\"tw.menuBar.desktopSettings\\\":\\\"Työpöytäversion asetukset\\\",\\\"tw.menuBar.moreSettings\\\":\\\"Edistykselliset asetukset\\\",\\\"tw.menuBar.newFramerate\\\":\\\"Uusi kuvataajuus:\\\",\\\"tw.menuBar.newWindow\\\":\\\"Uusi ikkuna\\\",\\\"tw.menuBar.package\\\":\\\"Pakkaa projekti\\\",\\\"tw.menuBar.reportError1\\\":\\\"Joissakin skripteissä tapahtui virheitä.\\\",\\\"tw.menuBar.reportError2\\\":\\\"Tämä on bugi. Ilmoita siitä.\\\",\\\"tw.menuBar.restorePoints\\\":\\\"Palautuskohdat\\\",\\\"tw.menuBar.saveAs\\\":\\\"Tallenna nimellä {file}\\\",\\\"tw.menuBar.seeInside\\\":\\\"Katso sisälle\\\",\\\"tw.mono\\\":\\\"Monoääni\\\",\\\"tw.moreCloud\\\":\\\"Lisätietoja pilvimuuttujista.\\\",\\\"tw.notify.permission\\\":\\\"Jos sallit tämän, käyttöjärjestelmäsi saattaa pyytää sinua ottamaan ilmoitukset käyttöön ja ilmoitukset sallitaan jatkossa automaattisesti.\\\",\\\"tw.notify.title\\\":\\\"Projekti haluaa näyttää ilmoituksia.\\\",\\\"tw.oldDownload\\\":\\\"Tallenna erilliseen tiedostoon...\\\",\\\"tw.opcode.2000\\\":\\\"päiviä vuoden 2000 jälkeen\\\",\\\"tw.opcode.mousedown\\\":\\\"onko hiiren nappi painettu?\\\",\\\"tw.opcode.mousex\\\":\\\"hiiren x-sijainti\\\",\\\"tw.opcode.mousey\\\":\\\"hiiren y-sijainti\\\",\\\"tw.openAdvanced\\\":\\\"Avaa edistykselliset asetukset\\\",\\\"tw.openWindow.dangerous\\\":\\\"{APP_NAME}in kehittäjät eivät ole tarkastaneet tätä verkkosivustoa. Se saattaa sisältää vaarallista tai pahantahtoista koodia.\\\",\\\"tw.openWindow.title\\\":\\\"Projekti haluaa avata uuden ikkunan tai välilehden URL-osoitteella:\\\",\\\"tw.paint.alpha\\\":\\\"Läpinäkyvyys\\\",\\\"tw.paint.fonts.more\\\":\\\"Lisää fontteja...\\\",\\\"tw.pen.stageSelected\\\":\\\"Esiintymislava valittu: vähemmän kynälohkoja\\\",\\\"tw.privacy\\\":\\\"Tietosuojakäytäntö\\\",\\\"tw.recordAudio.permission\\\":\\\"Jos sallit tämän, selaimesi saattaa pyytää sinua sallimaan mikrofonin käytön ja käyttö sallitaan jatkossa automaattisesti.\\\",\\\"tw.recordAudio.title\\\":\\\"Projekti haluaa nauhoittaa mikrofonisi ääntä. Tähän sisältyvät puheen tekstiksi muuttaminen sekä raaka äänidata. Projekti saattaa voida jakaa ääntä muiden käyttäjien ja palvelimien kanssa.\\\",\\\"tw.recordVideo.permission\\\":\\\"Jos sallit tämän, selaimesi saattaa pyytää sinua sallimaan kameran käytön ja käyttö sallitaan jatkossa automaattisesti.\\\",\\\"tw.recordVideo.title\\\":\\\"Projekti haluaa käyttää kameraasi. Projekti saattaa voida jakaa kuvia muiden käyttäjien ja palvelimien kanssa.\\\",\\\"tw.redirect.dangerous\\\":\\\"{APP_NAME}in kehittäjät eivät ole tarkastaneet tätä verkkosivustoa. Se saattaa sisältää vaarallista tai pahantahtoista koodia.\\\",\\\"tw.redirect.title\\\":\\\"Projekti haluaa siirtyä tällä välilehdellä URL-osoitteeseen:\\\",\\\"tw.removedTrademarks\\\":\\\"Jotkin Scratchin tavaramerkkejä sisältäneet kohteet eivät enää näy tässä luettelossa.\\\",\\\"tw.restorePoints.1minute\\\":\\\"minuutin välein\\\",\\\"tw.restorePoints.assets\\\":\\\"{n} resurssia\\\",\\\"tw.restorePoints.confirmDelete\\\":\\\"Haluatko varmasti poistaa projektin \\\\\\\"{projectTitle}\\\\\\\"? Tätä ei voi kumota.\\\",\\\"tw.restorePoints.confirmDeleteAll\\\":\\\"Haluatko varmasti poistaa KAIKKI palautuskohdat? Tätä ei voi kumota.\\\",\\\"tw.restorePoints.confirmLoad\\\":\\\"Sinulla on tallentamattomia muutoksia. Korvataanko nykyinen projekti?\\\",\\\"tw.restorePoints.deleteAll\\\":\\\"Poista kaikki\\\",\\\"tw.restorePoints.description\\\":\\\"{APP_NAME} tallentaa säännöllisesti palautuskohtia tietokoneellesi, jotta voit saada projektisi takaisin, jos unohdat tallentaa. Tämä on tarkoitettu viimeiseksi palautuskeinoksi. Tietokoneesi voi kaikessa hiljaisuudessa poistaa nämä palautuskohdat milloin tahansa. ÄLÄ LUOTA tähän toimintoon.\\\",\\\"tw.restorePoints.empty\\\":\\\"Palautuskohtia ei löytynyt.\\\",\\\"tw.restorePoints.error\\\":\\\"Virhe palautuskohtaa ladatessa: {error}\\\",\\\"tw.restorePoints.exportError\\\":\\\"Palautuskohdan viennissä tapahtui virhe: {error}\\\",\\\"tw.restorePoints.intervalOption\\\":\\\"Luo palautuskohta {time}.\\\",\\\"tw.restorePoints.loading\\\":\\\"Ladataan...\\\",\\\"tw.restorePoints.minutes\\\":\\\"{n} minuutin välein\\\",\\\"tw.restorePoints.never\\\":\\\"ei koskaan\\\",\\\"tw.restorePoints.off\\\":\\\"Palautuskohtien käytöstä poistaminen on vaarallista.\\\",\\\"tw.restorePoints.size\\\":\\\"Arvioitu tallennustilan käyttö: {size}\\\",\\\"tw.restorePoints.size2\\\":\\\"Useammassa tallennuskohdassa käytetyt asusteet ja äänet tallennetaan vain kerran.\\\",\\\"tw.restorePoints.title\\\":\\\"Palautuskohdat\\\",\\\"tw.sample\\\":\\\"Esimerkkiprojekti\\\",\\\"tw.saveAs\\\":\\\"Tallenna nimellä...\\\",\\\"tw.saveTo\\\":\\\"Tallenna tiedostoon {file}\\\",\\\"tw.scratchUnsafeCloud\\\":\\\"Jos teet tästä pilvimuuttujan, projekti ylittää Scratchin {number} muuttujan rajan, jolloin jotkin muuttujat eivät toimi, jos lataat projektin Scratchiin.\\\",\\\"tw.securityManager.allow\\\":\\\"Salli\\\",\\\"tw.securityManager.deny\\\":\\\"Kiellä\\\",\\\"tw.securityManager.title\\\":\\\"Laajennuksen turvallisuus\\\",\\\"tw.securityManager.trust\\\":\\\"Jos sallit tämän, tulevat pyynnöt samalle sivustolle sallitaan automaattisesti.\\\",\\\"tw.securityManager.why\\\":\\\"Tätä voidaan käyttää kuvien tai äänten lataamiseen, moninpelityökaluihin, ohjelmointirajapintoihin tai pahantahtoisiin tarkoituksiin. Tämä jakaa IP-osoitteesi, likimääräisen sijaintisi ja mahdollisia muita tietoja verkkosivuston kanssa.\\\",\\\"tw.settingsModal.customStageSize\\\":\\\"Oma esiintymislavan koko:\\\",\\\"tw.settingsModal.customStageSizeHelp\\\":\\\"Muuttaa Scratchin esiintymislavan koon 480x360 joksikin muuksi. Tee esiintymislavasta laajakuvainen käyttämällä kokoa 640x360.\\\",\\\"tw.settingsModal.dangerZone\\\":\\\"Vaaralliset asetukset\\\",\\\"tw.settingsModal.disableCompiler\\\":\\\"Poista kääntäjä käytöstä\\\",\\\"tw.settingsModal.disableCompilerHelp\\\":\\\"Poistaa {APP_NAME}in kääntäjän käytöstä. Tämän käyttämisestä on hyötyä, kun muokkaat projektia, jotta skriptit päivittyvät välittömästi. Muussa tapauksessa älä ikinä ota tätä käyttöön.\\\",\\\"tw.settingsModal.featured\\\":\\\"Suositut\\\",\\\"tw.settingsModal.fps\\\":\\\"60 ruutua/s (oma kuvataajuus)\\\",\\\"tw.settingsModal.fpsHelp\\\":\\\"Suorita skriptejä 60 kertaa sekunnissa 30:n sijaan. Useimmat projektit eivät toimi kunnolla, kun tämä on käytössä. Koeta siinä tapauksessa käyttää interpolaatiota ilman 60 ruutua/s -tilaa. {customFramerate}.\\\",\\\"tw.settingsModal.fpsHelp.customFramerate\\\":\\\"Käytä muuta kuvataajuutta kuin 30 tai 60 napauttamalla\\\",\\\"tw.settingsModal.help\\\":\\\"Lisätietoja\\\",\\\"tw.settingsModal.highQualityPen\\\":\\\"Korkealaatuinen kynä\\\",\\\"tw.settingsModal.highQualityPenHelp\\\":\\\"Saa kynän piirtymään korkeampilaatuisena ja poistaa joidenkin koordinaattien pyöristymisen editorissa. Kaikki projektit eivät hyödy tästä asetuksesta. Asetus saattaa vaikuttaa suorituskykyyn.\\\",\\\"tw.settingsModal.infiniteClones\\\":\\\"Loputtomasti klooneja\\\",\\\"tw.settingsModal.infiniteClonesHelp\\\":\\\"Poistaa Scratchin 300 kloonin rajoituksen.\\\",\\\"tw.settingsModal.interpolation\\\":\\\"Interpolaatio\\\",\\\"tw.settingsModal.interpolationHelp\\\":\\\"Tekee projekteista sujuvamman näköisiä interpoloimalla hahmojen liikettä. Interpolaatiota ei tule käyttää 3D-, säteenseuranta- ja kynäprojekteissa eikä viiveellisissä projekteissa, koska se hidastaa niitä lisäämättä sujuvuutta.\\\",\\\"tw.settingsModal.largeStageWarning\\\":\\\"Näin suuren esiintymislavan käyttäminen ei ole suositeltavaa! Käytä sen sijaan pienempää kokoa samalla kuvasuhteella, jotta koko näytön tila muuttaa koon sopivaksi käyttäjän näytölle.\\\",\\\"tw.settingsModal.removeFencing\\\":\\\"Poista esiintymislavan rajat\\\",\\\"tw.settingsModal.removeFencingHelp\\\":\\\"Antaa hahmojen mennä esiintymislavan ulkopuolelle, kasvaa niin suureksi tai pieneksi kuin koodi määrää ja tekee kosketuslohkoista toimivia myös esiintymislavan ulkopuolella.\\\",\\\"tw.settingsModal.removeLimits\\\":\\\"Poista rajoitukset\\\",\\\"tw.settingsModal.removeMiscLimits\\\":\\\"Poista erilaiset rajoitukset\\\",\\\"tw.settingsModal.removeMiscLimitsHelp\\\":\\\"Poistaa äänitehosteiden ja kynän koon rajoitukset.\\\",\\\"tw.settingsModal.storeProjectOptions\\\":\\\"Tallenna asetukset projektiin\\\",\\\"tw.settingsModal.storeProjectOptionsHelp\\\":\\\"Tallentaa valitut asetukset projektiin, jotta ne otetaan automaattisesti käyttöön, kun projekti avataan TurboWarpissa. Warp-ajastin- ja Poista kääntäjä käytöstä -asetuksia ei tallenneta.\\\",\\\"tw.settingsModal.title\\\":\\\"Edistykselliset asetukset\\\",\\\"tw.settingsModal.warpTimer\\\":\\\"Warp-ajastin\\\",\\\"tw.settingsModal.warpTimerHelp\\\":\\\"Tarkastaa, ovatko skriptit jumissa pitkässä tai loputtomassa silmukassa, ja suorittaa ne tällöin matalammalla kuvataajuudella jumiin jäämisen sijaan. Tämä korjaa useimmat kaatumiset, mutta sillä on merkittävä vaikutus suorituskykyyn, joten se on oletuksena käytössä editorissa.\\\",\\\"tw.soundEditorNotSupported\\\":\\\"Äänieditoria ei tueta tässä selaimessa.\\\",\\\"tw.spriteSelectorItem.rename\\\":\\\"nimeä uudelleen\\\",\\\"tw.stageHeader.full\\\":\\\"Vaihda suureen esiintymislavaan\\\",\\\"tw.stereo\\\":\\\"Stereoääni\\\",\\\"tw.stereoAlert\\\":\\\"Stereoäänen muokkaaminen muuntaa sen peruuttamattomasti monoääneksi.\\\",\\\"tw.studioview.authorAttribution\\\":\\\"tekijä: {author}\\\",\\\"tw.studioview.error\\\":\\\"Seuraavaa projektien sivua ladatessa tapahtui virhe.\\\",\\\"tw.studioview.hoverText\\\":\\\"käyttäjän {author} projekti {title}\\\",\\\"tw.tooLarge\\\":\\\"Tämä ääni saattaa olla liian suuri Scratchiin ladattavaksi.\\\",\\\"tw.twExtension.description\\\":\\\"Erikoisia uusia lohkoja.\\\",\\\"tw.twExtension.name\\\":\\\"{APP_NAME}in lohkot\\\",\\\"tw.unfavorite\\\":\\\"Poista suosikeista\\\",\\\"tw.unknownPlatform.1\\\":\\\"Projekti on tehty eri alustalle:\\\",\\\"tw.unknownPlatform.2\\\":\\\"Yhteensopivuutta {APP_NAME}in kanssa ei ole taattu. Voit jatkaa omalla vastuullasi, mutta emme voi auttaa, jos ongelmia ilmenee.\\\",\\\"tw.unknownPlatform.continue\\\":\\\"Ymmärrän\\\",\\\"tw.unknownPlatform.title\\\":\\\"Tuntematon alusta\\\",\\\"tw.unshared.2\\\":\\\"Lisätietoja: {link}\\\",\\\"tw.unshared.bug\\\":\\\"Jos projekti on todella jaettu, ilmoita bugista.\\\",\\\"tw.unshared.cache\\\":\\\"Jos projekti jaettiin äskettäin, tämän viesti saattaa näkyä virheellisesti muutamien minuuttien ajan.\\\",\\\"tw.unshared2.1\\\":\\\"Jakamattomat projektit eivät ole enää näkyvissä.\\\",\\\"tw.usernameModal.help\\\":\\\"Tämä arvo tallennetaan selaimesi muistiin. Se kirjataan, kun olet vuorovaikutuksessa pilvimuuttujia käyttävän projektin kanssa.\\\",\\\"tw.usernameModal.help2\\\":\\\"Scratch-tilin kanssa yhteensopimattomat arvot yleensä hylätään pilvimuuttujapalvelimella. Suosittelemme olemaan muokkaamatta nimeä tai muuttamaan sen Scratch-käyttäjänimeksesi.\\\",\\\"tw.usernameModal.mustChange\\\":\\\"Pahoittelut, pilvimuuttujapalvelimen mielestä käyttäjänimesi ei ole turvallinen. Muuta se joksikin muuksi tai {resetIt}.\\\",\\\"tw.usernameModal.mustChange.resetIt\\\":\\\"nollaa se (suositeltava)\\\",\\\"tw.usernameModal.new\\\":\\\"Uusi käyttäjänimi:\\\",\\\"tw.usernameModal.reset\\\":\\\"Nollaa\\\",\\\"tw.usernameModal.title\\\":\\\"Muuta käyttäjänimi\\\",\\\"tw.usesCloudVariables\\\":\\\"Tämä projekti käyttää pilvimuuttujia.\\\",\\\"tw.usesCloudVariables2\\\":\\\"{APP_NAME}in muuttujia ei ole yhdistetty Scratchiin. Kuka vain voi {changeTheirUsername} miksi vain, joten varo toisena henkilönä esiintymistä.\\\",\\\"tw.usesCloudVariables2.change\\\":\\\"vaihtaa käyttäjänimensä\\\",\\\"tw.viewFeaturedProjects\\\":\\\"Näytä valitut projektit napauttamalla\\\",\\\"tw.viewOnScratch\\\":\\\"Näytä projekti Scratchissa\\\"},\\\"fr\\\":{\\\"tw.accent.blue\\\":\\\"Bleu\\\",\\\"tw.accent.purple\\\":\\\"Violet\\\",\\\"tw.accent.rainbow\\\":\\\"Arc-en-ciel\\\",\\\"tw.accent.red\\\":\\\"Rouge\\\",\\\"tw.alerts.creatingRestorePoint\\\":\\\"Création d'un point de restauration…\\\",\\\"tw.alerts.lostPeripheralConnection\\\":\\\"Le périphérique {extensionName} vient d’être déconnecté.\\\",\\\"tw.alerts.savedToDisk\\\":\\\"Enregistré sur votre ordinateur.\\\",\\\"tw.backpack.rename\\\":\\\"Nouveau nom :\\\",\\\"tw.blockColors.highContrast\\\":\\\"Contraste élevé\\\",\\\"tw.blocks.buttonIsDown\\\":\\\"bouton [MOUSE_BUTTON] de la souris pressé ?\\\",\\\"tw.blocks.lastKeyPressed\\\":\\\"dernière touche pressée\\\",\\\"tw.blocks.mouseButton.middle\\\":\\\"(1) milieu\\\",\\\"tw.blocks.mouseButton.primary\\\":\\\"(0) primaire\\\",\\\"tw.blocks.mouseButton.secondary\\\":\\\"(2) secondaire\\\",\\\"tw.blocks.openDocs\\\":\\\"Ouvrir la documentation\\\",\\\"tw.browserModal.desktopTitle\\\":\\\"Système non pris en charge\\\",\\\"tw.cantUseCloud\\\":\\\"Bien que vous puissiez créer des variables cloud, elles ne fonctionneront que si ce projet est téléchargé sur Scratch ou converti à l'aide d'un outil comme le{packager}.\\\",\\\"tw.changeUsername.cannotChangeWhileRunning\\\":\\\"Le nom d'utilisateur ne peut pas être modifié pendant l'exécution du projet.\\\",\\\"tw.code\\\":\\\"Code source\\\",\\\"tw.confirmIncompatibleExtension\\\":\\\"Cette extension est incompatible avec Scratch. Les projets réalisés avec lui ne peuvent pas être téléchargés sur le site Web de Scratch. Voulez-vous vraiment l'activer ?\\\",\\\"tw.createdBy\\\":\\\"Créé par :\\\",\\\"tw.customExtension.name\\\":\\\"Extension customisée\\\",\\\"tw.customExtensionModal.load\\\":\\\"Charger\\\",\\\"tw.customExtensionModal.promptFile\\\":\\\"Sélectionnez ou déposez les fichiers JavaScript des extensions\\\",\\\"tw.customExtensionModal.promptText\\\":\\\"Collez le code source JavaScript de l'extension :\\\",\\\"tw.customExtensionModal.promptURL\\\":\\\"Entrez l'URL de l'extension :\\\",\\\"tw.customExtensionModal.trusted\\\":\\\"Cette extension sera chargée sans la sandbox car elle provient d'une source fiable.\\\",\\\"tw.customExtensionModal.unsandboxed\\\":\\\"Exécuter sans la sandbox\\\",\\\"tw.customExtensionModal.unsandboxedWarning1\\\":\\\"Le chargement d'extensions sans sandbox est dangereux et ne doit pas être activé si vous ne savez pas ce que vous faites.\\\",\\\"tw.customExtensionModal.unsandboxedWarning2\\\":\\\"Les extensions non sandboxées peuvent corrompre votre projet, supprimer vos paramètres, voler vos mots de passe et causer d'autres dommages. Les développeurs de {APP_NAME} ne sont pas responsables des problèmes qui pourraient en résulter.\\\",\\\"tw.customExtensionModal.untrusted\\\":\\\"Les extensions provenant d'URL non fiables seront toujours chargées avec la sandbox pour des raisons de sécurité.\\\",\\\"tw.darkMode\\\":\\\"Basculer sur le mode clair\\\",\\\"tw.favorite\\\":\\\"Ajouter aux favoris\\\",\\\"tw.featuredProjectsStudio\\\":\\\"Voir le studio sur scratch.\\\",\\\"tw.feedback\\\":\\\"retour et signalement de bugues\\\",\\\"tw.fileInput.none\\\":\\\"Aucun fichier sélectionné.\\\",\\\"tw.fileInput.selected\\\":\\\"Sélectionné : {names}\\\",\\\"tw.fonts.add\\\":\\\"Ajouter\\\",\\\"tw.fonts.custom.file\\\":\\\"Sélectionnez un fichier de police sur votre ordinateur :\\\",\\\"tw.fonts.custom.name\\\":\\\"Donnez un nom à la police :\\\",\\\"tw.fonts.fallback\\\":\\\"Choisissez une police de remplacement à utiliser si la police ne parvient pas à se charger ou est supprimée :\\\",\\\"tw.fonts.readError\\\":\\\"Échec de la lecture du fichier de police : {error}\\\",\\\"tw.fonts.system.name\\\":\\\"Saisissez le nom d'une police intégrée à votre ordinateur. Il est possible que la police ne s'affiche pas correctement pour tout le monde.\\\",\\\"tw.fonts.title\\\":\\\"Polices\\\",\\\"tw.footer.credits\\\":\\\"Crédits\\\",\\\"tw.footer.embed\\\":\\\"Intégrer\\\",\\\"tw.footer.parameters\\\":\\\"Paramères URL\\\",\\\"tw.gui.crashMessage.description\\\":\\\"Nous sommes vraiment désolés, mais il semble que TurboWarp a crashé. Veuillez actualiser la page pour réessayer.\\\",\\\"tw.gui.defaultProjectTitle\\\":\\\"Projet\\\",\\\"tw.guiDefaultTitle\\\":\\\"Exécute les projets Scratch plus rapidement\\\",\\\"tw.home.credit\\\":\\\"Notes et Crédits\\\",\\\"tw.input.tooltip\\\":\\\"Copie et colle le lien d'un projet Scratch ici !\\\",\\\"tw.invalidParameters.clones\\\":\\\"Le paramètre d'URL \\\\\\\"clone\\\\\\\" n'est pas valide.\\\",\\\"tw.invalidParameters.fps\\\":\\\"Le paramètre d'URL \\\\\\\"fps\\\\\\\" n'est pas valide.\\\",\\\"tw.invalidProject.title\\\":\\\"Erreur\\\",\\\"tw.lightMode\\\":\\\"Baculer sur le mode sombre\\\",\\\"tw.loadExtension.unsandboxed\\\":\\\"Exécuter sans la sandbox\\\",\\\"tw.loader.downloadingAssets\\\":\\\"Téléchargement des assets ({complete}/{total}) ...\\\",\\\"tw.loader.loadingAssets\\\":\\\"Chargement des assets ({complete}/{total})...\\\",\\\"tw.loader.projectData\\\":\\\"Lecture du projet ...\\\",\\\"tw.menuBar.60off\\\":\\\"Désactiver le mode 60 FPS\\\",\\\"tw.menuBar.60on\\\":\\\"Activer le mode 60 FPS\\\",\\\"tw.menuBar.advanced\\\":\\\"Avancé\\\",\\\"tw.menuBar.changeUsername\\\":\\\"Changer le nom d'utilisateur\\\",\\\"tw.menuBar.cloudOff\\\":\\\"Désactiver les variables cloud\\\",\\\"tw.menuBar.cloudOn\\\":\\\"Activer les variables cloud\\\",\\\"tw.menuBar.cloudUnavailable\\\":\\\"Les variables cloud ne sont pas disponibles\\\",\\\"tw.menuBar.cloudUnavailableAlert\\\":\\\"Impossible d'utiliser les variables cloud, probablement parce que vous avez ouvert l'éditeur.\\\",\\\"tw.menuBar.compileError\\\":\\\"{sprite} : {error}\\\",\\\"tw.menuBar.moreSettings\\\":\\\"Paramètres Avancés\\\",\\\"tw.menuBar.newFramerate\\\":\\\"Nouveau ratio d'images par seconde :\\\",\\\"tw.menuBar.newWindow\\\":\\\"Nouvelle fenêtre\\\",\\\"tw.menuBar.package\\\":\\\"Empaqueter le projet\\\",\\\"tw.menuBar.reportError2\\\":\\\"Ceci est un bug. Merci de le signaler.\\\",\\\"tw.menuBar.saveAs\\\":\\\"Enregistrer sous {file}\\\",\\\"tw.menuBar.seeInside\\\":\\\"Voir à l'intérieur\\\",\\\"tw.oldDownload\\\":\\\"Enregistrer dans un fichier séparé...\\\",\\\"tw.opcode.2000\\\":\\\"jours depuis 2000\\\",\\\"tw.opcode.mousedown\\\":\\\"clic gauche?\\\",\\\"tw.opcode.mousex\\\":\\\"souris x\\\",\\\"tw.opcode.mousey\\\":\\\"souris y\\\",\\\"tw.openAdvanced\\\":\\\"Ouvrir les paramètres avancés\\\",\\\"tw.openWindow.dangerous\\\":\\\"Ce site web n'a pas été vérifié par les développeurs de {APP_NAME}. Il peut contenir du code dangereux ou malveillant.\\\",\\\"tw.paint.alpha\\\":\\\"Opacité\\\",\\\"tw.paint.fonts.more\\\":\\\"Ajouter d'autres polices...\\\",\\\"tw.privacy\\\":\\\"Politique de Confidentialité\\\",\\\"tw.recordAudio.title\\\":\\\"Le projet souhaite enregistrer le son provenant de votre microphone. Il peut s'agir d'une transcription textuelle ou de données audio brutes. Le projet peut être en mesure de partager le son avec d'autres utilisateurs ou serveurs.\\\",\\\"tw.recordVideo.permission\\\":\\\"Si vous l'autorisez, votre navigateur peut vous demander d'activer l'accès à la caméra, et tout accès ultérieur à la caméra sera automatiquement autorisé.\\\",\\\"tw.recordVideo.title\\\":\\\"Le projet souhaite enregistrer des vidéos à partir de votre caméra. Le projet peut être en mesure de partager des images avec d'autres utilisateurs ou serveurs.\\\",\\\"tw.redirect.dangerous\\\":\\\"Ce site web n'a pas été vérifié par les développeurs de {APP_NAME}. Il peut contenir du code dangereux ou malveillant.\\\",\\\"tw.redirect.title\\\":\\\"Le projet souhaite naviguer vers cette URL à partir de cet onglet :\\\",\\\"tw.restorePoints.deleteAll\\\":\\\"Tout supprimer\\\",\\\"tw.restorePoints.loading\\\":\\\"Chargement...\\\",\\\"tw.saveAs\\\":\\\"Enregistrer sous...\\\",\\\"tw.saveTo\\\":\\\"Sauvegarder sous {file}\\\",\\\"tw.scratchUnsafeCloud\\\":\\\"Si vous créez cette variable cloud, le projet dépassera la limite de Scratch de {number} variables, et certaines variables ne fonctionneront pas si vous téléchargez le projet dans Scratch.\\\",\\\"tw.securityManager.allow\\\":\\\"Autoriser\\\",\\\"tw.securityManager.deny\\\":\\\"Refuser\\\",\\\"tw.securityManager.title\\\":\\\"Sécurité des extensions\\\",\\\"tw.settingsModal.customStageSize\\\":\\\"Taille de la scène personnalisé :\\\",\\\"tw.settingsModal.customStageSizeHelp\\\":\\\"Change la taille de la scène Scratch de 480x360 à autre chose. Essayez 640x360 pour rendre la scène grand écran. Très peu de projets gèrent cela correctement.\\\",\\\"tw.settingsModal.dangerZone\\\":\\\"Zone de danger\\\",\\\"tw.settingsModal.disableCompiler\\\":\\\"Désactiver le compilateur\\\",\\\"tw.settingsModal.featured\\\":\\\"En vedette\\\",\\\"tw.settingsModal.fps\\\":\\\"60 FPS (personnalisé)\\\",\\\"tw.settingsModal.fpsHelp\\\":\\\"Exécute les scripts 60 fois par seconde au lieu de 30. La plupart des projets ne fonctionneront pas correctement si cette option est activée. Vous devriez essayer l'interpolation avec le mode 60 FPS désactivé si tel est le cas.{customFramerate}\\\",\\\"tw.settingsModal.fpsHelp.customFramerate\\\":\\\"Clique pour utiliser un autre ratio d'images par seconde (FPS) que 30 ou 60\\\",\\\"tw.settingsModal.help\\\":\\\"Clique pour obtenir de l'aide\\\",\\\"tw.settingsModal.highQualityPen\\\":\\\"Stylo de haute qualité\\\",\\\"tw.settingsModal.highQualityPenHelp\\\":\\\"Permet aux projets utilisant le stylo d'utiliser une plus grande résolution et permet de désactiver certains arrondis dans les coordonnées de l'éditeur. Tout le projet ne bénéfie pas de ce paramètre et il peut impacter la performance.\\\",\\\"tw.settingsModal.infiniteClones\\\":\\\"Clones Infinis\\\",\\\"tw.settingsModal.infiniteClonesHelp\\\":\\\"Désactive la limite de 300 clones de Scratch\\\",\\\"tw.settingsModal.interpolationHelp\\\":\\\"Rend les projets plus fluides en interpolant le mouvement du sprite. L'interpolation ne doit pas être utilisée sur les projets 3D, les lanceurs de rayons, les projets de stylet et les projets décalés, car l'interpolation les ralentira sans les rendre plus lisses.\\\",\\\"tw.settingsModal.largeStageWarning\\\":\\\"Utiliser une taille de scène personnalisée plus large n'est pas recommandé. Utilisez plutôt cette option pour une taille plus petite et avec le même ration longueur/largeur pour que le projet soit facilement utilisable par n'importe quel utilisateur.\\\",\\\"tw.settingsModal.removeFencing\\\":\\\"Supprimer les limites\\\",\\\"tw.settingsModal.removeFencingHelp\\\":\\\"Permet aux sprites de se déplacer hors de l'écran, de devenir aussi grands ou aussi petits qu'ils le souhaitent et de faire fonctionner les blocs tactiles hors de l'écran.\\\",\\\"tw.settingsModal.removeLimits\\\":\\\"Supprimer les limites\\\",\\\"tw.settingsModal.removeMiscLimits\\\":\\\"Supprimer diverses limites\\\",\\\"tw.settingsModal.removeMiscLimitsHelp\\\":\\\"Supprime les limites des effets sonores ou celles de la taille du stylo.\\\",\\\"tw.settingsModal.storeProjectOptions\\\":\\\"Sauvegarder les paramètres du projet.\\\",\\\"tw.settingsModal.storeProjectOptionsHelp\\\":\\\"Stocke les paramètres sélectionnés dans le projet afin qu'ils soient automatiquement appliqués lorsque TurboWarp charge ce projet. Le temporisateur Warp et le compilateur désactivé ne seront pas enregistrés.\\\",\\\"tw.settingsModal.title\\\":\\\"Paramètres Avancés\\\",\\\"tw.settingsModal.warpTimer\\\":\\\"Vérificateur de boucles infinies.\\\",\\\"tw.settingsModal.warpTimerHelp\\\":\\\"Vérifie si les scripts sont bloqués dans des boucles infinies, et le cas échéant, fait tourner le programme a une vitesse très réduite pour empêcher le logiciel de crasher. Cela peut cependant fortement impacter les performances du programme.\\\",\\\"tw.spriteSelectorItem.rename\\\":\\\"renommer\\\",\\\"tw.stereo\\\":\\\"Stéréo\\\",\\\"tw.stereoAlert\\\":\\\"L'édition de ce son stéréo le convertira irréversiblement en mono.\\\",\\\"tw.studioview.authorAttribution\\\":\\\"Fait par {author}\\\",\\\"tw.studioview.error\\\":\\\"Il y a eu une erreur dans le chargement de la page suivante des projets\\\",\\\"tw.studioview.hoverText\\\":\\\"{title} fait par {author}\\\",\\\"tw.tooLarge\\\":\\\"Ce son peut être trop volumineux pour être chargé dans Scratch.\\\",\\\"tw.unfavorite\\\":\\\"Supprimer des favoris\\\",\\\"tw.unshared.2\\\":\\\"Pour plus d'informations, visitez : {link}\\\",\\\"tw.unshared.cache\\\":\\\"Si le projet a été partagé récemment, ce message peut s'afficher de manière incorrecte pendant quelques minutes.\\\",\\\"tw.usernameModal.help\\\":\\\"Cette valeur sera stockée dans la mémoire de votre navigateur. Il peut être consigné lorsque vous interagissez avec des projets contenant des variables cloud.\\\",\\\"tw.usernameModal.help2\\\":\\\"Les valeurs qui ne correspondent pas à un compte Scratch valide seront généralement rejetées par le serveur de variables cloud. Nous vous recommandons de le laisser tel quel ou de le remplacer par votre nom d'utilisateur Scratch.\\\",\\\"tw.usernameModal.mustChange\\\":\\\"Désolé, le serveur de variables cloud pense que votre nom d'utilisateur n'est peut-être pas sûr. Veuillez le changer pour autre chose ou{resetIt}.\\\",\\\"tw.usernameModal.mustChange.resetIt\\\":\\\"réinitialiser (recommandé)\\\",\\\"tw.usernameModal.reset\\\":\\\"Réinitialiser\\\",\\\"tw.usernameModal.title\\\":\\\"Changer votre nom d'utilisateur\\\",\\\"tw.usesCloudVariables\\\":\\\"Ce projet utilise des variables cloud.\\\",\\\"tw.viewFeaturedProjects\\\":\\\"Cliquez pour voir les projets sélectionnés.\\\",\\\"tw.viewOnScratch\\\":\\\"Voir le projet sur Scratch\\\"},\\\"he\\\":{\\\"tw.accent.blue\\\":\\\"כחול\\\",\\\"tw.accent.purple\\\":\\\"סגול\\\",\\\"tw.accent.rainbow\\\":\\\"צבעוני\\\",\\\"tw.accent.red\\\":\\\"אדום\\\",\\\"tw.alerts.creatingRestorePoint\\\":\\\"ביצוע נקודת שחזור קוד\\\",\\\"tw.alerts.lostPeripheralConnection\\\":\\\"איבד חיבור ל{extensionName}.\\\",\\\"tw.alerts.savedToDisk\\\":\\\"הקובץ נשמר בהתקן שלך.\\\",\\\"tw.backpack.rename\\\":\\\"שם חדש:\\\",\\\"tw.blockColors.dark\\\":\\\"כהה (בטא)\\\",\\\"tw.blockColors.highContrast\\\":\\\"ניגודיות גבוהה\\\",\\\"tw.blockColors.three\\\":\\\"מקורי\\\",\\\"tw.blocks.addons\\\":\\\"הרחבות\\\",\\\"tw.blocks.buttonIsDown\\\":\\\"[MOUSE_BUTTON]לחצן העכבר נלחץ?\\\",\\\"tw.blocks.lastKeyPressed\\\":\\\"מקש אחרון שנלחץ על המקלדת\\\",\\\"tw.blocks.mouseButton.middle\\\":\\\"(1) במרכז\\\",\\\"tw.blocks.mouseButton.primary\\\":\\\"(0)נורמלי\\\",\\\"tw.blocks.mouseButton.secondary\\\":\\\"(2) שני\\\",\\\"tw.blocks.openDocs\\\":\\\"פתח מסמכים\\\",\\\"tw.browserModal.desktopTitle\\\":\\\"המערכת לא נתמכת\\\",\\\"tw.changeUsername.cannotChangeWhileRunning\\\":\\\"אינך יכול לשנות את שם המשתמש שלך כאשר פרויקט הקוד פועל.\\\",\\\"tw.cloudProvider\\\":\\\"השרת מופעל על ידי {name}.\\\",\\\"tw.cloudServers\\\":\\\"בחר את השרת הקרוב אליך:\\\",\\\"tw.code\\\":\\\"קוד קוד פתוח\\\",\\\"tw.createdBy\\\":\\\"נוצר על ידי:\\\",\\\"tw.customExtension.name\\\":\\\"הרחבה מותאמת אישית\\\",\\\"tw.customExtensionModal.file\\\":\\\"קבצים\\\",\\\"tw.customExtensionModal.load\\\":\\\"העלאה\\\",\\\"tw.customExtensionModal.promptURL\\\":\\\"הזן את כתובת האתר של ההרחבה:\\\",\\\"tw.customExtensionModal.text\\\":\\\"טקסט\\\",\\\"tw.customExtensionModal.title\\\":\\\"העלה הרחבה מותאמת אישית\\\",\\\"tw.customExtensionModal.unsandboxed\\\":\\\"הפעל ללא ארגז חול\\\",\\\"tw.customExtensionModal.unsandboxedWarning1\\\":\\\"טעינת תוספים ללא ארגז חול מסוכנת ואין להפעיל אותה אם אתה לא יודע מה אתה עושה.\\\",\\\"tw.customExtensionModal.url\\\":\\\"כתובת אתר\\\",\\\"tw.darkMode\\\":\\\"החלף למצב בהיר\\\",\\\"tw.documentation\\\":\\\"מסמכים\\\",\\\"tw.featuredProjectsStudio\\\":\\\"הצג את הסטודיו על קידוד שריטות\\\",\\\"tw.feedback\\\":\\\"הצעות ושגיאות\\\",\\\"tw.feedbackButton\\\":\\\"משוב על {APP_NAME}\\\",\\\"tw.fileInput.none\\\":\\\"אף קובץ לא נבחר.\\\",\\\"tw.fileInput.selected\\\":\\\"נבחרו: {names}\\\",\\\"tw.fonts.add\\\":\\\"הוספה\\\",\\\"tw.fonts.list\\\":\\\"פונטים שהוספת:\\\",\\\"tw.fonts.none\\\":\\\"אף פונט לא נוסף עוד.\\\",\\\"tw.fonts.title\\\":\\\"פונטים\\\",\\\"tw.footer.credits\\\":\\\"קרידיטים\\\",\\\"tw.footer.disclaimer\\\":\\\"{APP_NAME} אינו קשור ל-Scratch, לצוות Scratch או לקרן Scratch.\\\",\\\"tw.footer.documentation\\\":\\\"מסמכים\\\",\\\"tw.footer.scratchDisclaimer\\\":\\\"Scratch הוא פרויקט של קרן Scratch. הוא זמין בחינם באתר {scratchDotOrg}.\\\",\\\"tw.fps\\\":\\\"{framerate} פריימים לשנייה\\\",\\\"tw.gui.crashMessage.description\\\":\\\"אנו מתנצלים; נראה שהדף קרס. אנא רענן דף זה כדי לנסות שוב.\\\",\\\"tw.gui.defaultProjectTitle\\\":\\\"פרויקט קידוד\\\",\\\"tw.guiDefaultTitle\\\":\\\"מריץ פרוייקטי Scratch מהר יותר\\\",\\\"tw.home.credit\\\":\\\"מידע וייחוסים\\\",\\\"tw.home.description\\\":\\\"{APP_NAME} הוא מוד Scratch שממיר פרויקטים ל-JavaScript כדי לגרום להם לרוץ מהר מאוד. נסו זאת על ידי הזנת מזהה פרויקט או כתובת אתר למעלה או בחירת פרויקט מומלץ למטה.\\\",\\\"tw.home.instructions\\\":\\\"איך להישתמש\\\",\\\"tw.input.tooltip\\\":\\\"העתק והדבק קישור לפרויקט Scratch כאן!\\\",\\\"tw.invalidParameters.clones\\\":\\\"פרמטר כתובת האתר \\\\\\\"כפול\\\\\\\" אינו חוקי\\\",\\\"tw.invalidParameters.fps\\\":\\\"פרמטר כתובת האתר \\\\\\\"מסגרות לשנייה\\\\\\\" אינו חוקי\\\",\\\"tw.invalidProject.error\\\":\\\"לא הצלחנו לטעון את הפרויקט:\\\",\\\"tw.invalidProject.reportIt\\\":\\\"דווח\\\",\\\"tw.invalidProject.restorePoints\\\":\\\"צפה בנקודות השחזור\\\",\\\"tw.invalidProject.title\\\":\\\"שגיאה\\\",\\\"tw.lightMode\\\":\\\"החלף למצב כהה\\\",\\\"tw.loadExtension.unsandboxed\\\":\\\"הפעל ללא ארגז חול\\\",\\\"tw.loader.downloadingAssets\\\":\\\"הורדה של נכסים({complete}/{total})...\\\",\\\"tw.loader.loadingAssets\\\":\\\"טוען נכסים ({complete} מתוך {total})...\\\",\\\"tw.loader.projectData\\\":\\\"טוען פרויקט...\\\",\\\"tw.menuBar.60off\\\":\\\"כבה את מצב \\\\\\\"מסגרות גבוהות לשנייה\\\\\\\".\\\",\\\"tw.menuBar.60on\\\":\\\"הפעל את מצב \\\\\\\"פריימים גבוהים לשניה\\\\\\\".\\\",\\\"tw.menuBar.addons\\\":\\\"הרחבות\\\",\\\"tw.menuBar.advanced\\\":\\\"מתקדם\\\",\\\"tw.menuBar.blockColors\\\":\\\"צבעי בלוקים\\\",\\\"tw.menuBar.changeUsername\\\":\\\"לשנות את שם המשתמש\\\",\\\"tw.menuBar.cloudOff\\\":\\\"כבה את משתני השרת\\\",\\\"tw.menuBar.cloudOn\\\":\\\"אפשר משתני שרת\\\",\\\"tw.menuBar.cloudUnavailable\\\":\\\"משתני שרת אינם זמינים\\\",\\\"tw.menuBar.cloudUnavailableAlert\\\":\\\"משתני שרת אינם זמינים. אתה כנראה משתמש בעורך הקוד.\\\",\\\"tw.menuBar.compileError\\\":\\\"{sprite}:{error}\\\",\\\"tw.menuBar.moreSettings\\\":\\\"הגדרות מתקדמות\\\",\\\"tw.menuBar.newFramerate\\\":\\\"קצב חדש של מסגרות לשנייה:\\\",\\\"tw.menuBar.newWindow\\\":\\\"חלון חדש\\\",\\\"tw.menuBar.package\\\":\\\"אריזת פרויקט\\\",\\\"tw.menuBar.reportError2\\\":\\\"יש שגיאה. אנא צור איתי קשר בנושא.\\\",\\\"tw.menuBar.restorePoints\\\":\\\"נקודות שחזור\\\",\\\"tw.menuBar.saveAs\\\":\\\"שמור בשם{file}\\\",\\\"tw.menuBar.seeInside\\\":\\\"עיין בקוד המקור\\\",\\\"tw.mono\\\":\\\"מונו\\\",\\\"tw.moreCloud\\\":\\\"למד עוד על משתני ענן.\\\",\\\"tw.opcode.2000\\\":\\\"ימים מאז 2000\\\",\\\"tw.opcode.mousedown\\\":\\\"עכבר נלחץ?\\\",\\\"tw.opcode.mousex\\\":\\\"מיקום עכבר בציר x\\\",\\\"tw.opcode.mousey\\\":\\\"מיקום עכבר בציר y\\\",\\\"tw.openAdvanced\\\":\\\"פתח הגדרות מתקדמות\\\",\\\"tw.paint.alpha\\\":\\\"שקיפות\\\",\\\"tw.paint.fonts.more\\\":\\\"הוסף פונטים נוספים...\\\",\\\"tw.privacy\\\":\\\"מדיניות הפרטיות\\\",\\\"tw.restorePoints.1minute\\\":\\\"כל דקה\\\",\\\"tw.restorePoints.deleteAll\\\":\\\"מחק הכל\\\",\\\"tw.restorePoints.empty\\\":\\\"לא נמצאו נקודות שחזור.\\\",\\\"tw.restorePoints.loading\\\":\\\"טוען...\\\",\\\"tw.restorePoints.minutes\\\":\\\"כל {n} דקות\\\",\\\"tw.restorePoints.never\\\":\\\"לעולם לא\\\",\\\"tw.restorePoints.title\\\":\\\"נקודות שחזור\\\",\\\"tw.sample\\\":\\\"פרויקט דוגמה\\\",\\\"tw.saveAs\\\":\\\"שמור בשם...\\\",\\\"tw.saveTo\\\":\\\"עדכן את {file}\\\",\\\"tw.scratchUnsafeCloud\\\":\\\"אם תיצור את משתנה הענן הזה, הפרויקט יחרוג ממגבלת {number} המשתנים של Scratch, וחלק מהמשתנים לא יפעלו אם תעלה את הפרויקט ל-Scratch.\\\",\\\"tw.securityManager.allow\\\":\\\"אישור\\\",\\\"tw.securityManager.deny\\\":\\\"ביטול\\\",\\\"tw.settingsModal.customStageSize\\\":\\\"גודל במה מותאם אישית:\\\",\\\"tw.settingsModal.help\\\":\\\"לחץ לעזרה\\\",\\\"tw.settingsModal.highQualityPen\\\":\\\"עט באיכות גבוהה\\\",\\\"tw.settingsModal.infiniteClones\\\":\\\"כפילים ללא הגבלה\\\",\\\"tw.settingsModal.infiniteClonesHelp\\\":\\\"מבטל את מגבלת 300 הכפילים של Scratch.\\\",\\\"tw.settingsModal.title\\\":\\\"הגדרות מתקדמות\\\",\\\"tw.spriteSelectorItem.rename\\\":\\\"שינוי שם\\\",\\\"tw.stereo\\\":\\\"סטריאו\\\",\\\"tw.studioview.authorAttribution\\\":\\\"על ידי{author}\\\",\\\"tw.studioview.error\\\":\\\"לא ניתן היה לטעון את העמוד הבא של פרויקטי קוד.\\\",\\\"tw.studioview.hoverText\\\":\\\"{title}נוצר על ידי{author}\\\",\\\"tw.tooLarge\\\":\\\"הצליל הזה אולי יהיה גדול מדי בשביל Scratch.\\\",\\\"tw.unknownPlatform.continue\\\":\\\"אני מבין\\\",\\\"tw.unshared.2\\\":\\\"לעוד מידע, היכנס ל{link}.\\\",\\\"tw.unshared2.1\\\":\\\"פרויקטים לא משותפים לא זמינים יותר לצפייה.\\\",\\\"tw.usernameModal.new\\\":\\\"שם משתמש חדש:\\\",\\\"tw.usernameModal.reset\\\":\\\"אִתחוּל\\\",\\\"tw.usernameModal.title\\\":\\\"לשנות את שם המשתמש\\\",\\\"tw.usesCloudVariables\\\":\\\"פרויקט זה משתמש במשתני ענן.\\\",\\\"tw.usesCloudVariables2\\\":\\\"משתני הענן של {APP_NAME} אינם מקושרים למשתני Scratch. כל אחד יכול {changeTheirUsername} לכל דבר, לכן היזהרו מהתחזות.\\\",\\\"tw.usesCloudVariables2.change\\\":\\\"שינוי שם המשתמש\\\",\\\"tw.viewFeaturedProjects\\\":\\\"לחץ על כפתור זה כדי להציג פרויקטי קוד נבחרים.\\\",\\\"tw.viewOnScratch\\\":\\\"צפה בפרויקט בScratch.\\\"},\\\"hu\\\":{\\\"tw.accent.blue\\\":\\\"Kék\\\",\\\"tw.accent.purple\\\":\\\"Lila\\\",\\\"tw.accent.rainbow\\\":\\\"Szivárvány\\\",\\\"tw.accent.red\\\":\\\"Piros\\\",\\\"tw.alerts.creatingRestorePoint\\\":\\\"Helyreállítási pont készítése...\\\",\\\"tw.alerts.lostPeripheralConnection\\\":\\\"Kapcsolat a(z) {extensionName} nevű bővítményhez elveszítve\\\",\\\"tw.alerts.restorePointError\\\":\\\"Nem lehetett készíteni egy helyreállítási pontot\\\",\\\"tw.alerts.restorePointSuccess\\\":\\\"Helyreállítási pontok a \\\\\\\"Fájl\\\\\\\" menüben vannak\\\",\\\"tw.alerts.savedToDisk\\\":\\\"Mentve a számítógépre.\\\",\\\"tw.backpack.rename\\\":\\\"Új név:\\\",\\\"tw.blockColors.custom\\\":\\\"Testreszabás a kiegészítő-beállításokban\\\",\\\"tw.blockColors.dark\\\":\\\"Sötét (béta)\\\",\\\"tw.blockColors.highContrast\\\":\\\"Magas kontraszt\\\",\\\"tw.blockColors.three\\\":\\\"Eredeti\\\",\\\"tw.blocks.PROCEDURES_DOCS\\\":\\\"Így használd a visszatérést\\\",\\\"tw.blocks.PROCEDURES_RETURN\\\":\\\"{v} visszaadása\\\",\\\"tw.blocks.PROCEDURES_TO_REPORTER\\\":\\\"Értékblokká alakítás\\\",\\\"tw.blocks.PROCEDURES_TO_STATEMENT\\\":\\\"Kirakóelemmé alakítás\\\",\\\"tw.blocks.addons\\\":\\\"Kiegészítők\\\",\\\"tw.blocks.buttonIsDown\\\":\\\"[MOUSE_BUTTON] egérbillentyű lenyomva?\\\",\\\"tw.blocks.lastKeyPressed\\\":\\\"utolsó lenyomott billentyű\\\",\\\"tw.blocks.mouseButton.middle\\\":\\\"(1) középső\\\",\\\"tw.blocks.mouseButton.primary\\\":\\\"(0) elsődleges\\\",\\\"tw.blocks.mouseButton.secondary\\\":\\\"(2) másodlagos\\\",\\\"tw.blocks.openDocs\\\":\\\"Dokumentáció megnyitása\\\",\\\"tw.browserModal.desktopSettings\\\":\\\"Asztali beállítások megnyitása\\\",\\\"tw.browserModal.desktopTitle\\\":\\\"A rendszer nem támogatott\\\",\\\"tw.browserModal.webgl1\\\":\\\"A {APP_NAME} WebGL-t igényel, amit úgy néz ki viszont, hogy az eszközöd nem támogat. Ez sokszor csak egy ideiglenesen fellépő gond, ami a géped újraindításával megszüntethető.\\\",\\\"tw.browserModal.webglBrowser\\\":\\\"Használd a Chrome, Firefox vagy Safari egy friss verzióját és győződj meg róla, hogy a grafikus meghajtók naprakészek. Megpróbálhatod a \\\\\\\"grafikus gyorsítás\\\\\\\" vagy a \\\\\\\"hardveres gyorsítás\\\\\\\" lehetőséget a böngésződ beállításai közt.\\\",\\\"tw.browserModal.webglDesktop\\\":\\\"Megpróbálhatod átkapcsolni a \\\\\\\"grafikus gyorsítás\\\\\\\" opciót az asztali beállításokban:\\\",\\\"tw.cantUseCloud\\\":\\\"Noha képes vagy megosztott változókat létrehozni, nem fognak működni, amíg ez a projekt fel nem töltődik a Scratchre vagy nem kerül sor olyan eszközök használatára, mint a {packager}.\\\",\\\"tw.changeUsername.cannotChangeWhileRunning\\\":\\\"A felhasználónév nem változtatható meg a projekt futása alatt.\\\",\\\"tw.clipboard.danger\\\":\\\"Ha a vágolapod olyan dolgokat, mint jelszavakat tartalmaz, a projekt esetleg megoszthatja másik felhasználókkal vagy szerverekkel.\\\",\\\"tw.clipboard.permission\\\":\\\"A vágólaphoz való hozzáférés, elképzelhető, hogy nem lesz minden böngészőben elérhető. Ha egyszer engedélyezett, későbbi vágólap-olvasások is akadály nélkül megtörténhetnek.\\\",\\\"tw.clipboard.title\\\":\\\"Ez a projekt szeretné a vágólapról adatot olvasni.\\\",\\\"tw.cloudProvider\\\":\\\"A szervert közzéteszi: {name}.\\\",\\\"tw.cloudServers\\\":\\\"Válassz egy nálad közeli lévő szervert:\\\",\\\"tw.code\\\":\\\"Forráskód\\\",\\\"tw.confirmIncompatibleExtension\\\":\\\"Ez a kiegészítés nem kompatibilis a Scratchhel. Ezzel készített projekteket nem lehet feltölteni a Scratch weboldalára. Biztos, hogy mégis engedélyezni szeretnéd őket?\\\",\\\"tw.createdBy\\\":\\\"Készítette:\\\",\\\"tw.customCloudServer\\\":\\\"Egy egyéni megosztott változó-szervert használsz: {server}\\\",\\\"tw.customExtension.description\\\":\\\"Tölts be egyéni bővítményeket URL-böl, fájlokból vagy JavaScript forráskódból.\\\",\\\"tw.customExtension.name\\\":\\\"Egyéni bővítmény\\\",\\\"tw.customExtensionModal.file\\\":\\\"Fájlok\\\",\\\"tw.customExtensionModal.load\\\":\\\"Betöltés\\\",\\\"tw.customExtensionModal.promptFile\\\":\\\"Jelölj ki vagy húzz ide bővítmények JavaScript fájlját:\\\",\\\"tw.customExtensionModal.promptText\\\":\\\"Illeszd be a bővítmény JavaScript forráskódját:\\\",\\\"tw.customExtensionModal.promptURL\\\":\\\"Add meg a bővítmény URL-jét:\\\",\\\"tw.customExtensionModal.text\\\":\\\"Szöveg\\\",\\\"tw.customExtensionModal.title\\\":\\\"Egyéni bővitmény betöltése\\\",\\\"tw.customExtensionModal.trusted\\\":\\\"Ez a bővítmény homokozó nélkül fog betöltődni, mivel egy megbízható forrásból származik.\\\",\\\"tw.customExtensionModal.unsandboxed\\\":\\\"Futtatás homokozó használata nélkül\\\",\\\"tw.customExtensionModal.unsandboxedWarning1\\\":\\\"A bővítmény betöltése homokozó nélkül veszélyes és nem érdemes megpróbálni, ha nem tudod pontosan, mit csinálsz.\\\",\\\"tw.customExtensionModal.unsandboxedWarning2\\\":\\\"A homokozóban nem futtatott bővítmények elronthatják a projektedet, kitörölhetik a beállításaidat, elhalászhatják jelszóidat és más rossz dolgokat is tehetnek. A {APP_NAME} fejlesztői nem felelősek semmilyen okozott kellemetlenségért.\\\",\\\"tw.customExtensionModal.untrusted\\\":\\\"Megbízhatatlan URL-ekből származó bővítmények mindig homokozó használatával kerülnek betöltésre a biztonság érdekében.\\\",\\\"tw.customReporters.description\\\":\\\"Lehetővé teszi a saját blokkoknak, hogy értékeket adjanak vissza és, hogy bemenetként lehessen használni.\\\",\\\"tw.customReporters.name\\\":\\\"Saját értékblokkok\\\",\\\"tw.darkMode\\\":\\\"Átváltás világos módra\\\",\\\"tw.desktopCloud\\\":\\\"Az asztali alkalmazásban a megosztott változók szinkronizálódnak minden e gépen levő ablak között. Töltsd fel a projektet Scratchre, vagy használj egy olyan eszközt mint a {packager}, hogy a felhőben is szinkronizálva legyenek.\\\",\\\"tw.documentation\\\":\\\"Dokumentáció\\\",\\\"tw.download.danger\\\":\\\"Ez a fájl nem lett átvizsgálva a {APP_NAME} fejlesztői által.\\\",\\\"tw.download.executable\\\":\\\"Ez egy futattható fájl formátum ami lehet, hogy rosszindulatú kódot tartalmazhat, ha futtatod.\\\",\\\"tw.download.file\\\":\\\"A projekt fájlt akar letölteni a számítógépedre. {name} néven lesz mentve a letöltés-mappádba.\\\",\\\"tw.embed.persistent\\\":\\\"Engedélyezés esetén a későbbi beágyazások ugyanehhez a weboldalhoz automatikusan el lesznek fogadva.\\\",\\\"tw.embed.risks\\\":\\\"Noha a beágyazandó tartalom homokozóban kerül futtatásra először, továbbra is hozzáférhet információkhoz az eszközödről, mint amilyen az IP-címed és a megközelítő tartózkodási helyed is.\\\",\\\"tw.embed.title1\\\":\\\"A projekt HTML-tartalmat szeretne a színpadra illeszteni.\\\",\\\"tw.embed.title2\\\":\\\"A projekt távoli tartalmat szeretne a színpadra illeszteni.\\\",\\\"tw.extensionGallery.error\\\":\\\"Hiba lépett fel a bővítménykönyvtár betöltésekor. Látogasd meg az extension.turbowarp.org-ot több bővítmény felleléséhez.\\\",\\\"tw.extensionGallery.loading\\\":\\\"Bövítménygaléria betöltése...\\\",\\\"tw.extensionGallery.more\\\":\\\"Tudj többet a bővítményekről a extensions.turbowarp.org weboldalon.\\\",\\\"tw.extensionGallery.name\\\":\\\"{APP_NAME}-bövítménygaléria\\\",\\\"tw.favorite\\\":\\\"Kedvencként jelölés\\\",\\\"tw.featuredProjectsStudio\\\":\\\"Műhely megtekintése a Scratchen.\\\",\\\"tw.feedback\\\":\\\"Visszajelzés és hibák\\\",\\\"tw.feedbackButton\\\":\\\"Visszajelzés a {APP_NAME}-ról\\\",\\\"tw.fetch.title\\\":\\\"A projekt csatlakozni szeretne a következő weboldalhoz:\\\",\\\"tw.fileInput.none\\\":\\\"Nincsenek kiválasztva fájlok.\\\",\\\"tw.fileInput.selected\\\":\\\"Kiválasztva: {names}\\\",\\\"tw.fonts.add\\\":\\\"Hozzáadás\\\",\\\"tw.fonts.custom.file\\\":\\\"Válassz egy betűkészletfájlot a számítógépedről:\\\",\\\"tw.fonts.custom.name\\\":\\\"Adj a betűtípusnak egy nevet:\\\",\\\"tw.fonts.custom1\\\":\\\"Betűtípus hozzáadása fájlból\\\",\\\"tw.fonts.custom2\\\":\\\"Általában nem fog működni a Scratchen. Támogatott formátumok: {formats}.\\\",\\\"tw.fonts.delete\\\":\\\"Biztos, hogy ki szeretnéd törölni a következő betűtípust: „{font}”? Minden vektoros jelmez a tartalék-betűtípust fogja helyette használni.\\\",\\\"tw.fonts.fallback\\\":\\\"Válassz ki egy tartalék-betűtípust, ha a betűtípust nem sikerül betölteni vagy már ki lett törölve:\\\",\\\"tw.fonts.list\\\":\\\"Telepített betűtípusok:\\\",\\\"tw.fonts.none\\\":\\\"Még nincs betűtípus hozzáadva.\\\",\\\"tw.fonts.readError\\\":\\\"Nem sikerült beolvasni a betűtípus-fájlt: {error}\\\",\\\"tw.fonts.system\\\":\\\"Rendszerbetűtípus\\\",\\\"tw.fonts.system.name\\\":\\\"Írd be a nevét bármilyen számítógépeden megtalálható betűtípusnak. A betűtípus nem biztos, hogy mindenkinek megfelelő módon fog megjelenni.\\\",\\\"tw.fonts.system1\\\":\\\"Rendszerbetűtípus hozzáadása\\\",\\\"tw.fonts.system2\\\":\\\"Működhet a Scratch-ben, de nem fog mindenkinek helyesen megjelenni.\\\",\\\"tw.fonts.title\\\":\\\"Betűtípusok\\\",\\\"tw.footer.credits\\\":\\\"Stáblista\\\",\\\"tw.footer.disclaimer\\\":\\\"A {APP_NAME} nem áll hivatalos kapcsolatban a Scratch-vel, a Scratch Csapattal vagy a Scratch Alapítvánnyal.\\\",\\\"tw.footer.documentation\\\":\\\"Dokumentáció\\\",\\\"tw.footer.embed\\\":\\\"Beágyazás\\\",\\\"tw.footer.parameters\\\":\\\"URL paraméterek\\\",\\\"tw.footer.scratchDisclaimer\\\":\\\"A Scratch a Scratch Alapítvány egy projektje, ami elérhető {scratchDotOrg} ingyenesen.\\\",\\\"tw.geolocate.permission\\\":\\\"Amennyiben elfogadod, lehet hogy a böngésző által is meg leszel kérve a helyadatokhoz való hozzáférés engedélyezéséhez.\\\",\\\"tw.geolocate.title\\\":\\\"A projekt hozzá szeretne férni a tartózkodási helyedhez.\\\",\\\"tw.gui.crashMessage.description\\\":\\\"Nagyon sajnáljuk, de úgy tűnik, hogy a projekt összeomlott. Kérjük frissítsd az oldalt, és próbáld újra.\\\",\\\"tw.gui.defaultProjectTitle\\\":\\\"Projekt\\\",\\\"tw.guiDefaultTitle\\\":\\\"Scratch projektek futtatása gyorsabban\\\",\\\"tw.home.credit\\\":\\\"Megjegyzések és stáblista\\\",\\\"tw.home.description\\\":\\\"A {APP_NAME} egy Scratch-modifikáció, ami átfordítja a projekteket JavaScriptbe, így igazán gyorsan lefuttatva őket. Próbáld ki egy projekt azonosítójának (ID) vagy URL-jének a fenti mezőbe történő beillesztésével, illetve egy kiemelt projekt választásával lentről.\\\",\\\"tw.home.instructions\\\":\\\"Utasítások\\\",\\\"tw.input.tooltip\\\":\\\"Másolj, majd illessz be Scratch-projekt linkeket ide!\\\",\\\"tw.interpolationEnabled\\\":\\\"Interpoláció\\\",\\\"tw.invalidParameters.clones\\\":\\\"A \\\\\\\"clone\\\\\\\" URL paraméter érvénytelen\\\",\\\"tw.invalidParameters.fps\\\":\\\"Az \\\\\\\"fps\\\\\\\" URL paraméter érvénytelen\\\",\\\"tw.invalidProject.error\\\":\\\"Nem sikerült betölteni a projektet.\\\",\\\"tw.invalidProject.options\\\":\\\"Lehet, hogy vissza tudod tölteni egy korábbi verzióját a projektnek egy automatikus vagy másmilyen biztonsági mentésből.\\\",\\\"tw.invalidProject.reportIt\\\":\\\"jelentsd\\\",\\\"tw.invalidProject.restorePoints\\\":\\\"Biztonsági mentések megtekintése\\\",\\\"tw.invalidProject.title\\\":\\\"Hiba\\\",\\\"tw.invalidProject.validationError\\\":\\\"Ez a hiba gyakran azt jelenti, hogy egy kis része a projektnek megsérült, de máskülönben szabályos. Ebben az esetben könnyen megjavítható a hiba, így kérlek {reportIt}.\\\",\\\"tw.lightMode\\\":\\\"Átváltás sötét módra\\\",\\\"tw.loadExtension.embedded\\\":\\\"A projekt be szeretne tölteni egy egyedi bővítményt a következő kóddal:\\\",\\\"tw.loadExtension.sandboxed\\\":\\\"A kódnak a homokozóban történő futása közben továbbra is alkalma lesz hozzáférni információkhoz az eszközödről, mint például az IP-címedhez, vagy a körülbelüli tartózkodási helyedhez. Győződj meg róla a továbblépés előtt, hogy bízol-e a bővítmény készítőiben.\\\",\\\"tw.loadExtension.unsandboxed\\\":\\\"Futtatás homokozó használata nélkül\\\",\\\"tw.loadExtension.unsandboxedWarning\\\":\\\"Bővítmények betöltése homokozó nélkül veszélyes. Elronthatják a projektedet, kitörölhetik a beállításaidat, elhalászhatják jelszóidat és más rossz dolgokat is tehetnek. A {APP_NAME} fejlesztői nem felelősek semmilyen okozott kellemetlenségért.\\\",\\\"tw.loadExtension.url\\\":\\\"A projekt be szeretne tölteni egy egyedi bővítményt a következő URL-ből:\\\",\\\"tw.loader.downloadingAssets\\\":\\\"Tartozékok letöltése ({complete}/{total}) …\\\",\\\"tw.loader.loadingAssets\\\":\\\"Tartozékok betöltése ({complete}/{total}) …\\\",\\\"tw.loader.projectData\\\":\\\"Projekt betöltése ...\\\",\\\"tw.menuBar.60off\\\":\\\"60 FPS mód kikapcsolása\\\",\\\"tw.menuBar.60on\\\":\\\"60 FPS mód bekapcsolása\\\",\\\"tw.menuBar.accent\\\":\\\"Kiemelés\\\",\\\"tw.menuBar.addons\\\":\\\"Kiegészítők\\\",\\\"tw.menuBar.advanced\\\":\\\"Haladó\\\",\\\"tw.menuBar.blockColors\\\":\\\"Blokk-színek\\\",\\\"tw.menuBar.changeUsername\\\":\\\"Felhasználónév megváltoztatása\\\",\\\"tw.menuBar.cloudOff\\\":\\\"Megosztott változók kikapcsolása\\\",\\\"tw.menuBar.cloudOn\\\":\\\"Megosztott változók bekapcsolása\\\",\\\"tw.menuBar.cloudUnavailable\\\":\\\"Nem érhetőek el a megosztott változók\\\",\\\"tw.menuBar.cloudUnavailableAlert\\\":\\\"Nem használhatóak a megosztott változók, legvalószínűbben azért, mert megnyitottad a szerkesztőt.\\\",\\\"tw.menuBar.desktopSettings\\\":\\\"Asztali beállítások\\\",\\\"tw.menuBar.moreSettings\\\":\\\"Haladó beállítások\\\",\\\"tw.menuBar.newFramerate\\\":\\\"Új képkockaarány:\\\",\\\"tw.menuBar.newWindow\\\":\\\"Új ablak\\\",\\\"tw.menuBar.package\\\":\\\"Projekt csomagolása\\\",\\\"tw.menuBar.reportError1\\\":\\\"Néhány szkript hibákat észlelt.\\\",\\\"tw.menuBar.reportError2\\\":\\\"Ez egy hiba. Kérjük jelentsd.\\\",\\\"tw.menuBar.restorePoints\\\":\\\"Helyreállítási pontok\\\",\\\"tw.menuBar.saveAs\\\":\\\"Mentés {file}-ként\\\",\\\"tw.menuBar.seeInside\\\":\\\"Megnézem belülről\\\",\\\"tw.mono\\\":\\\"Monó\\\",\\\"tw.moreCloud\\\":\\\"Megosztott változókról több megtudása.\\\",\\\"tw.notify.permission\\\":\\\"Amennyiben engedélyezed, lehet hogy a böngésződ megkér, hogy hagyd jóvá az értesítések megjelenítését, s akkor további értesítések már automatikusan engedélyezve lesznek.\\\",\\\"tw.notify.title\\\":\\\"A projekt értesítéseket szeretne megjeleníteni.\\\",\\\"tw.oldDownload\\\":\\\"Mentés más fájlba...\\\",\\\"tw.opcode.2000\\\":\\\"napok 2000 óta\\\",\\\"tw.opcode.mousedown\\\":\\\"egér lenyomva?\\\",\\\"tw.opcode.mousex\\\":\\\"egér x\\\",\\\"tw.opcode.mousey\\\":\\\"egér y\\\",\\\"tw.openAdvanced\\\":\\\"Haladó beállítások megnyitása\\\",\\\"tw.openWindow.dangerous\\\":\\\"Ez a weboldal nem került ellenőrzésre a {APP_NAME} fejlesztői által. Veszélyes vagy rossz szándékú kódot is tartalmazhat.\\\",\\\"tw.openWindow.title\\\":\\\"A projekt egy új ablakot vagy lapot szeretne megnyitni az alábbi URL-lel:\\\",\\\"tw.paint.alpha\\\":\\\"Áttetszőség\\\",\\\"tw.paint.fonts.more\\\":\\\"Betűtípusok hozzáadása...\\\",\\\"tw.pen.stageSelected\\\":\\\"A színpad van kiválasztva: kevesebb tollblokk\\\",\\\"tw.privacy\\\":\\\"Adatvédelmi Irányelvek\\\",\\\"tw.recordAudio.permission\\\":\\\"Amennyiben engedélyezed, lehet hogy a böngésződ megkér, hogy hagyd jóvá a mikrofonhoz való hozzáférést, s akkor további felvételek a mikrofonnal már automatikusan engedélyezve lesznek.\\\",\\\"tw.recordAudio.title\\\":\\\"A projekt hangot szeretne rögzíteni a mikrofonoddal. Ez magába foglalhatja egy szöveg felolvasását vagy nyers hanganyagot. A projekt lehet, hogy képes megosztani hangfájlokat más felhasználókkal vagy szerverekkel.\\\",\\\"tw.recordVideo.permission\\\":\\\"Amennyiben engedélyezed, lehet hogy a böngésződ megkér, hogy hagyd jóvá a kamerádhoz való hozzáférést, s akkor további felvételek a kamerával már automatikusan engedélyezve lesznek.\\\",\\\"tw.recordVideo.title\\\":\\\"A projekt videót szeretne rögzíteni a kamera segítségével. A projekt lehet, hogy képes megosztani képeket más felhasználókkal vagy szerverekkel.\\\",\\\"tw.redirect.dangerous\\\":\\\"Ez a weboldal nem került ellenőrzésre a {APP_NAME} fejlesztői által. Veszélyes vagy rossz szándékú kódot is tartalmazhat.\\\",\\\"tw.redirect.title\\\":\\\"A projekt a következő URL-hez szeretné irányítani ezt a lapot:\\\",\\\"tw.removedTrademarks\\\":\\\"Néhány elem elkerült innen, amely tartalmazott Scratch védjegyet.\\\",\\\"tw.restorePoints.1minute\\\":\\\"percenként\\\",\\\"tw.restorePoints.assets\\\":\\\"{n} tartozék\\\",\\\"tw.restorePoints.confirmDelete\\\":\\\"Biztos, ki szeretnéd törölni ezt a mentést: „{projectTitle}”? Nem vonható vissza a törlés.\\\",\\\"tw.restorePoints.confirmDeleteAll\\\":\\\"Biztos, hogy MINDEN biztonsági mentést törölni szeretnél? Nem csinálhatod vissza később.\\\",\\\"tw.restorePoints.confirmLoad\\\":\\\"Mentetlen változtatásaid vannak. Le szeretnéd cserélni a projektet mégis?\\\",\\\"tw.restorePoints.deleteAll\\\":\\\"Összes törlése\\\",\\\"tw.restorePoints.description\\\":\\\"A {APP_NAME} időközönként helyreállítási pontokat készít a számtógépeden annak érdekében, hogy könnyebben visszanyerd projektedet abban az esetben, ha elfelejtenél menteni. Azonban a számítógéped szó nélkül ki törölheti ezeket a helyreállítási pontokat bármikor. NE támaszkodj csak erre a funkcióra.\\\",\\\"tw.restorePoints.empty\\\":\\\"Nincsenek helyreállítási pontok.\\\",\\\"tw.restorePoints.error\\\":\\\"Hiba a helyreállítási pont betöltése közben: {error}\\\",\\\"tw.restorePoints.exportError\\\":\\\"Hiba a biztonsági mentés exportálása közben: {error}\\\",\\\"tw.restorePoints.intervalOption\\\":\\\"Helyreállítási pontok {time}vannak készítve.\\\",\\\"tw.restorePoints.loading\\\":\\\"Betöltés...\\\",\\\"tw.restorePoints.minutes\\\":\\\"{n} percenként\\\",\\\"tw.restorePoints.never\\\":\\\"soha\\\",\\\"tw.restorePoints.off\\\":\\\"A helyreállítási pontok letiltása veszélyes.\\\",\\\"tw.restorePoints.size\\\":\\\"Becsült használt tárhely: {size}\\\",\\\"tw.restorePoints.size2\\\":\\\"Több helyreállítási pont által is használt jelmezek és hangokat csak egyszer vannak tárolva.\\\",\\\"tw.restorePoints.title\\\":\\\"Helyreállítási pontok\\\",\\\"tw.sample\\\":\\\"Mintaprojekt\\\",\\\"tw.saveAs\\\":\\\"Mentés másként...\\\",\\\"tw.saveTo\\\":\\\"Mentés ide: {file}\\\",\\\"tw.scratchUnsafeCloud\\\":\\\"Ha létrehozod ezt a megosztott változót, a projekt túllépi a Scratch {number}-es változólimitjét, amik közül néhány nem fog működni, ha feltöltöd a projektet Scratchre.\\\",\\\"tw.securityManager.allow\\\":\\\"Engedélyezés\\\",\\\"tw.securityManager.deny\\\":\\\"Tagadás\\\",\\\"tw.securityManager.title\\\":\\\"Bővítmény-biztonság\\\",\\\"tw.securityManager.trust\\\":\\\"Engedélyezés esetén a későbbi kérelmek ugyanehhez a weboldalhoz automatikusan el lesznek fogadva.\\\",\\\"tw.securityManager.why\\\":\\\"Képek vagy hangok letöltéséhez, többjátékos mód kivitelezéséhez, APIk eléréséhez vagy esetleg rosszindulatú célokra használható. Meg fogja osztani az IP-címedet, megközelítő tartózkodási helyedet és esetlegesen még más adatokat is a weboldallal.\\\",\\\"tw.settingsModal.customStageSize\\\":\\\"Egyedi színpadméret:\\\",\\\"tw.settingsModal.customStageSizeHelp\\\":\\\"Megváltoztatja a méretét a Scratch színpadnak 480×360-ról valami másra. Próbálja ki a 640×360-t, hogy a színpad képernyő méretű legyen. Csak nagyon kevés projekt kezeli ezt megfelelően.\\\",\\\"tw.settingsModal.dangerZone\\\":\\\"Veszélyzóna\\\",\\\"tw.settingsModal.disableCompiler\\\":\\\"Fordítóprogram mellőzése\\\",\\\"tw.settingsModal.disableCompilerHelp\\\":\\\"Kikapcsolja a {APP_NAME} fordítóprogramját. Projektek szerkesztése közben elképzelhető, hogy szükséged lehet rá a szkriptek azonnali frissítése végett. Egyéb helyzetekben sose pipáld be ezt a lehetőséget!\\\",\\\"tw.settingsModal.featured\\\":\\\"Kiemelt\\\",\\\"tw.settingsModal.fps\\\":\\\"60 FPS (Egyéni FPS)\\\",\\\"tw.settingsModal.fpsHelp\\\":\\\"Az utasításokat 30 helyett 60-szor futtatja le másodpercenként. A legtöbb projekt nem fog megfelelően működni ezzel. Ki kell próbálnod az Interpolációt 60 FPS nélkül, ha ez a helyzet. {customFramerate}.\\\",\\\"tw.settingsModal.fpsHelp.customFramerate\\\":\\\"Kattintson 30, vagy 60-tól eltérő képkockaarány használatához\\\",\\\"tw.settingsModal.help\\\":\\\"Kattintson segítségért\\\",\\\"tw.settingsModal.highQualityPen\\\":\\\"Magas Minőségű Toll\\\",\\\"tw.settingsModal.highQualityPenHelp\\\":\\\"Lehetővé teszi a tollal készített projekteket, hogy magasabb felbontásban fussanak, valamint letilt bizonyos koordinátakerekítést is a szerkesztőben. Nem minden projektnek előnyös ez a beállítás, valamint lehet, hogy a teljesítményre is hatással van.\\\",\\\"tw.settingsModal.infiniteClones\\\":\\\"Végtelen másolatszám\\\",\\\"tw.settingsModal.infiniteClonesHelp\\\":\\\"Letiltja a Scratch 300-as másolatkorlátját\\\",\\\"tw.settingsModal.interpolation\\\":\\\"Interpoláció\\\",\\\"tw.settingsModal.interpolationHelp\\\":\\\"Simábban jeleníti meg a projekteket azáltal, hogy interpolálja a szereplők mozgását. Az interpolációt nem szabad 3D projektekre, \\\\\\\"raytracer\\\\\\\"-ekre, tollat használó projektekre és laggolós projektekre alkalmazni, hiszen az interpoláció csak lassabbá fogja tenni a lefuttatásukat, viszont a megjelenésükön nem fog igazítani.\\\",\\\"tw.settingsModal.largeStageWarning\\\":\\\"Egyéni színpadméret használatánál nem ajánlott ilyen nagyot alkalmazni. Helyette használj egy kisebb méretet, de megegyező aránnyal, és bízd rá a teljes képernyőre, hogy felnagyítsa a felhasználó lejátszójának méretéhez.\\\",\\\"tw.settingsModal.removeFencing\\\":\\\"Lekerítés eltávolítása\\\",\\\"tw.settingsModal.removeFencingHelp\\\":\\\"Lehetővé teszi a szereplőket, hogy a színpadon kívülre menjenek, olyan nagyok, vagy kicsik legyenek, amilyenek csak akarnak, valamint az érzékelős blokkokat is működőképessé teszi színpadon kívül is.\\\",\\\"tw.settingsModal.removeLimits\\\":\\\"Korlátok eltávolítása\\\",\\\"tw.settingsModal.removeMiscLimits\\\":\\\"Egyéb Korlátok Eltávolítása\\\",\\\"tw.settingsModal.removeMiscLimitsHelp\\\":\\\"Eltávolítja a hangeffekt limiteket, és a tollméret korlátozottságait.\\\",\\\"tw.settingsModal.storeProjectOptions\\\":\\\"Beállítások eltárolása a projektben.\\\",\\\"tw.settingsModal.storeProjectOptionsHelp\\\":\\\"Eltárolja a kiválasztott beállításokat a projektben, így azonnal alkalmazhatja a TurboWarp őket betöltésnél. A Warp Időzítő és a Fordítóprogram Kikapcsolása nem lesz elmentve.\\\",\\\"tw.settingsModal.title\\\":\\\"Haladó Beállítások\\\",\\\"tw.settingsModal.warpTimer\\\":\\\"Warp Időzítő\\\",\\\"tw.settingsModal.warpTimerHelp\\\":\\\"Leellenőrzi a szkripteket, hogy nem-e ragadtak bele egy hosszú- vagy végtelen-ciklusba, és alacsony képkockaarányban futtatja őket, ahelyett hogy leragadjanak, amíg a ciklus véget ér. Ez tehát megjavítja a legtöbb összeomlást, de cserébe van egy jelentős teljesítménybehatása is, így csak a szerkesztőben van automatikusan bekapcsolva.\\\",\\\"tw.soundEditorNotSupported\\\":\\\"A hangszerkesztő nincs támogatva ebben a böngészőben\\\",\\\"tw.spriteSelectorItem.rename\\\":\\\"átnevezés\\\",\\\"tw.stageHeader.full\\\":\\\"Váltás teljes színpadra\\\",\\\"tw.stereo\\\":\\\"Sztereó\\\",\\\"tw.stereoAlert\\\":\\\"Ennek a sztereóhangfájlnak a szerkesztésekor visszavonhatatlanul monóvá fogja azt alakítani.\\\",\\\"tw.studioview.authorAttribution\\\":\\\"{author} által\\\",\\\"tw.studioview.error\\\":\\\"Hiba történt a projektek következő oldalának betöltése közben.\\\",\\\"tw.studioview.hoverText\\\":\\\"{title}, {author} által\\\",\\\"tw.tooLarge\\\":\\\"Ez a hang túl nagy lehet ahhoz, hogy a Scratchre kerülhessen.\\\",\\\"tw.twExtension.description\\\":\\\"Furcsa új blokkok.\\\",\\\"tw.twExtension.name\\\":\\\"{APP_NAME}-blokkok \\\",\\\"tw.unfavorite\\\":\\\"Kedvencként jelölés eltávolítása\\\",\\\"tw.unknownPlatform.1\\\":\\\"A projekt egy másik felület számára készült:\\\",\\\"tw.unknownPlatform.2\\\":\\\"A {APP_NAME}-val való kompatibilitás nem biztosított. Továbbléphetsz saját felelősségre, de nem feltétlen tudunk segíteni ha nehézségek lépnek fel a használat során.\\\",\\\"tw.unknownPlatform.continue\\\":\\\"Megértettem\\\",\\\"tw.unknownPlatform.title\\\":\\\"Ismeretlen felület\\\",\\\"tw.unshared.2\\\":\\\"Több információért látogass el ide: {link}\\\",\\\"tw.unshared.bug\\\":\\\"Ha ez a projekt igazából meg van osztva, kérjük jelentsd ezt a hibát nekünk.\\\",\\\"tw.unshared.cache\\\":\\\"Ha a projekt nemrég került megosztásra, ez az üzenet pár percig helytelenül jelenhet meg.\\\",\\\"tw.unshared2.1\\\":\\\"A nem megosztott projektek többé nem érhetőek el.\\\",\\\"tw.usernameModal.help\\\":\\\"Ez az érték a böngésződ tárában fog eltárolódni. Lehet, hogy naplózva lesz amikor olyan projektekkel lépsz kapcsolatba, amik tartalmaznak megosztott változókat.\\\",\\\"tw.usernameModal.help2\\\":\\\"Olyan értékeket, amik nem egyeznek meg egy érvényes Scratch fiókkal sem, a megosztott változók szervere elutasít jellemzően. Azt javasoljuk, hogy hagyd, ahogy van, vagy állítsd a Scratch felhasználónevedre.\\\",\\\"tw.usernameModal.mustChange\\\":\\\"Bocsánat, a megosztott változók szervere szerint a felhasználóneved nem lehet föltétlenül biztonságos. Kérjük változtasd meg valami másra, vagy {resetIt}.\\\",\\\"tw.usernameModal.mustChange.resetIt\\\":\\\"állítsd vissza (ajánlott)\\\",\\\"tw.usernameModal.new\\\":\\\"Új felhasználónév\\\",\\\"tw.usernameModal.reset\\\":\\\"Visszaállítás\\\",\\\"tw.usernameModal.title\\\":\\\"Felhasználónév megváltoztatása\\\",\\\"tw.usesCloudVariables\\\":\\\"Ez a projekt megosztott változókat használ.\\\",\\\"tw.usesCloudVariables2\\\":\\\"A {APP_NAME} megosztott változói nem vannak csatlakozva a Scratch-ével. Barki {changeTheirUsername} bármire, ezért légy figyelmes a megszemélyesítésről.\\\",\\\"tw.usesCloudVariables2.change\\\":\\\"megváltoztathatja a felhasználónevét\\\",\\\"tw.viewFeaturedProjects\\\":\\\"Egy kattintás a kiemelt projektek megtekintéséhez.\\\",\\\"tw.viewOnScratch\\\":\\\"Projekt megtekintése a Scratchen.\\\"},\\\"it\\\":{\\\"tw.accent.blue\\\":\\\"Azzurro\\\",\\\"tw.accent.purple\\\":\\\"Viola\\\",\\\"tw.accent.rainbow\\\":\\\"Arcobaleno\\\",\\\"tw.accent.red\\\":\\\"Rosso\\\",\\\"tw.alerts.creatingRestorePoint\\\":\\\"Creazione di un punto di ripristino...\\\",\\\"tw.alerts.lostPeripheralConnection\\\":\\\"Persa la connessione a {extensionName}.\\\",\\\"tw.alerts.restorePointError\\\":\\\"Impossibile creare il punto di ripristino\\\",\\\"tw.alerts.restorePointSuccess\\\":\\\"Puoi accedere ai punti di ripristino nel menu \\\\\\\"File\\\\\\\"\\\",\\\"tw.alerts.savedToDisk\\\":\\\"Salvato sul computer.\\\",\\\"tw.backpack.rename\\\":\\\"Nuovo nome:\\\",\\\"tw.blockColors.custom\\\":\\\"Personalizza nelle Impostazioni degli Addon\\\",\\\"tw.blockColors.dark\\\":\\\"Scura (Beta)\\\",\\\"tw.blockColors.highContrast\\\":\\\"Contrasto Elevato\\\",\\\"tw.blockColors.three\\\":\\\"Originale\\\",\\\"tw.blocks.PROCEDURES_DOCS\\\":\\\"Come usare il blocco Risultato\\\",\\\"tw.blocks.PROCEDURES_RETURN\\\":\\\"risultato {v}\\\",\\\"tw.blocks.PROCEDURES_TO_REPORTER\\\":\\\"Trasforma in Monitor\\\",\\\"tw.blocks.PROCEDURES_TO_STATEMENT\\\":\\\"Trasforma in Comando\\\",\\\"tw.blocks.addons\\\":\\\"Addon\\\",\\\"tw.blocks.buttonIsDown\\\":\\\"pulsante [MOUSE_BUTTON] del mouse premuto\\\",\\\"tw.blocks.lastKeyPressed\\\":\\\"ultimo tasto premuto\\\",\\\"tw.blocks.mouseButton.middle\\\":\\\"(1) centrale\\\",\\\"tw.blocks.mouseButton.primary\\\":\\\"(0) primario\\\",\\\"tw.blocks.mouseButton.secondary\\\":\\\"(2) secondario\\\",\\\"tw.blocks.openDocs\\\":\\\"Apri Documentazione\\\",\\\"tw.browserModal.desktopSettings\\\":\\\"Apri Impostazioni app Desktop\\\",\\\"tw.browserModal.desktopTitle\\\":\\\"Sistema non supportato\\\",\\\"tw.browserModal.webgl1\\\":\\\"{APP_NAME} richiede WebGL, ma il tuo computer sembra non supportarlo. A volte questo errore è temporaneo, e può essere risolto riavviando il computer.\\\",\\\"tw.browserModal.webglBrowser\\\":\\\"Usa una versione recente di Chrome, Firefox o Safari, e assicurati che i driver grafici siano aggiornati. Puoi anche provare ad attivare l'opzione \\\\\\\"accelerazione grafica\\\\\\\" o \\\\\\\"accelerazione hardware\\\\\\\" nelle impostazioni del tuo browser.\\\",\\\"tw.browserModal.webglDesktop\\\":\\\"Puoi anche provare ad attivare l'opzione \\\\\\\"accelerazione grafica\\\\\\\" nelle impostazioni dell'app desktop:\\\",\\\"tw.cantUseCloud\\\":\\\"Sebbene tu possa creare variabili cloud, queste funzioneranno solo quando il progetto è caricato sul sito di Scratch o sarà convertito usando un tool come {packager}.\\\",\\\"tw.changeUsername.cannotChangeWhileRunning\\\":\\\"Non è possibile cambiare lo username mentre il progetto è in esecuzione.\\\",\\\"tw.clipboard.danger\\\":\\\"Se i tuoi appunti contengono delle password, il progetto può condividerle con altri utenti o altri server.\\\",\\\"tw.clipboard.permission\\\":\\\"L'accesso agli appunti potrebbe non funzionare in alcuni browser. Se consentito, accessi futuri agli appunti verranno conserntiti automaticamente.\\\",\\\"tw.clipboard.title\\\":\\\"Il progetto vuole leggere dei dati dai tuoi appunti.\\\",\\\"tw.cloudProvider\\\":\\\"Server fornito da {name}.\\\",\\\"tw.cloudServers\\\":\\\"Scegli un server vicino a te:\\\",\\\"tw.code\\\":\\\"Codice Sorgente\\\",\\\"tw.confirmIncompatibleExtension\\\":\\\"Questa estensione non è compatibile con Scratch. I progetti che vengono creati con essa non possono essere caricati sul sito di Scratch. Sei sicuro di volerla attivare?\\\",\\\"tw.createdBy\\\":\\\"Creato da:\\\",\\\"tw.customCloudServer\\\":\\\"Usare un server personale per le variabili cloud: {server}\\\",\\\"tw.customExtension.description\\\":\\\"Carica estensioni personalizzate da URL, file o codice Javascript.\\\",\\\"tw.customExtension.name\\\":\\\"Estensioni Personalizzate\\\",\\\"tw.customExtensionModal.file\\\":\\\"File\\\",\\\"tw.customExtensionModal.load\\\":\\\"Carica\\\",\\\"tw.customExtensionModal.promptFile\\\":\\\"Seleziona o trascina i file JavaScript dell’estensione:\\\",\\\"tw.customExtensionModal.promptText\\\":\\\"Incolla il codice JavaScript dell'estensione:\\\",\\\"tw.customExtensionModal.promptURL\\\":\\\"Inserisci la URL dell'estensione:\\\",\\\"tw.customExtensionModal.text\\\":\\\"Testo\\\",\\\"tw.customExtensionModal.title\\\":\\\"Carica Estensione Personalizzata\\\",\\\"tw.customExtensionModal.trusted\\\":\\\"L'estensione verrà caricata senza sandbox in quanto proviene da una fonte affidabile.\\\",\\\"tw.customExtensionModal.unsandboxed\\\":\\\"Esegui senza sandbox\\\",\\\"tw.customExtensionModal.unsandboxedWarning1\\\":\\\"Caricare le estensioni senza sandbox è rischioso, non dovresti abilitarlo se non sai esattamente cosa stai facendo.\\\",\\\"tw.customExtensionModal.unsandboxedWarning2\\\":\\\"Le estensioni eseguite senza sandbox possono corrompere il tuo progetto, cancellare le tue impostazioni, rubare le tue password e fare altre cose malevole. Gli sviluppatori di {APP_NAME} non si ritengono responsabili per qualunque problema dovesse verificarsi.\\\",\\\"tw.customExtensionModal.untrusted\\\":\\\"Le estensioni da URL non affidabili saranno sempre caricate con una sandbox per ragioni di sicurezza.\\\",\\\"tw.customReporters.description\\\":\\\"Permette ai blocchi personalizzati di restituire un valore e di essere usati come monitor.\\\",\\\"tw.customReporters.name\\\":\\\"Monitor Personalizzati\\\",\\\"tw.darkMode\\\":\\\"Passa alla Modalità Chiara\\\",\\\"tw.desktopCloud\\\":\\\"Nell'app desktop le variabili cloud vengono sincronizzate tra tutte le finestre dell'app che girano nello stesso computer. Per fare in modo che siano invece sincronizzate globalmente, carica il progetto sul sito di Scratch, oppure usa il {packager}.\\\",\\\"tw.documentation\\\":\\\"Documentazione\\\",\\\"tw.download.danger\\\":\\\"Il file è stato validato dagli sviluppatori di {APP_NAME}.\\\",\\\"tw.download.executable\\\":\\\"Il file è in formato eseguibile. Se lo esegui tieni conto del fatto che potrebbe trattarsi di un malware.\\\",\\\"tw.download.file\\\":\\\"Il progetto sta scaricando un file sul tuo computer. Sarà salvato come {name} nella cartella Download.\\\",\\\"tw.embed.persistent\\\":\\\"Nel caso l'inserimento venga consentito, futuri tentativi di inserimento di contenuti provenienti dallo stesso sito saranno automaticamente consentiti.\\\",\\\"tw.embed.risks\\\":\\\"Anche se il contenuto sarà inserito in una sandbox, avrà comunque accesso alle informazioni sul tuo dispositivo come il tuo indirizzo IP e la tua posizione.\\\",\\\"tw.embed.title1\\\":\\\"Il progetto sta cercando di inserire del contenuto HTML sopra allo Stage:\\\",\\\"tw.embed.title2\\\":\\\"Il progetto sta cercando di inserire contenuto remoto sopra allo Stage:\\\",\\\"tw.extension.faceSensing.description\\\":\\\"Rileva i movimenti del volto usando la webcam.\\\",\\\"tw.extension.faceSensing.name\\\":\\\"Sensore del Volto\\\",\\\"tw.extensionGallery.error\\\":\\\"Errore nel caricamento della galleria delle estensioni. Visita extensions.turbowarp.org per ulteriori informazioni sulle estensioni.\\\",\\\"tw.extensionGallery.loading\\\":\\\"Caricamento galleria estensioni in corso...\\\",\\\"tw.extensionGallery.more\\\":\\\"Ulteriori informazioni sulle estensioni disponibili a extensions.turbowarp.org.\\\",\\\"tw.extensionGallery.name\\\":\\\"Galleria delle Estensioni di {APP_NAME}\\\",\\\"tw.favorite\\\":\\\"Preferito\\\",\\\"tw.featuredProjectsStudio\\\":\\\"Vai alla galleria sul sito di Scratch.\\\",\\\"tw.feedback\\\":\\\"Feedback & Bug\\\",\\\"tw.feedbackButton\\\":\\\"Feedback {APP_NAME}\\\",\\\"tw.fetch.title\\\":\\\"Il progetto vuole collegarsi al sito:\\\",\\\"tw.fileInput.none\\\":\\\"Nessun file selezionato.\\\",\\\"tw.fileInput.selected\\\":\\\"Selezionati: {names}\\\",\\\"tw.fonts.add\\\":\\\"Aggiungi\\\",\\\"tw.fonts.custom.file\\\":\\\"Seleziona un file di caratteri dal tuo computer:\\\",\\\"tw.fonts.custom.name\\\":\\\"Dai un nome la carattere:\\\",\\\"tw.fonts.custom1\\\":\\\"Aggiungi carattere da un file\\\",\\\"tw.fonts.custom2\\\":\\\"Di solito non funziona in Scratch. Formati supportati: {formats}.\\\",\\\"tw.fonts.delete\\\":\\\"Sei sicuro di voler cancellare \\\\\\\"{font}\\\\\\\"? Tutti i costumi vettoriali che lo usano useranno al suo posto il carattere sostitutivo.\\\",\\\"tw.fonts.fallback\\\":\\\"Scegli un carattere sostitutivo da usare se il carattere non può essere caricato o se viene cancellato:\\\",\\\"tw.fonts.list\\\":\\\"Caratteri installati:\\\",\\\"tw.fonts.none\\\":\\\"Ancora nessun carattere aggiunto.\\\",\\\"tw.fonts.readError\\\":\\\"Errore nella lettura del file di caratteri: {error}\\\",\\\"tw.fonts.system\\\":\\\"Carattere di sistema\\\",\\\"tw.fonts.system.name\\\":\\\"Inserisci il nome di un carattere presente nel tuo computer. Il carattere potrebbe non apparire a tutti in modo corretto.\\\",\\\"tw.fonts.system1\\\":\\\"Aggiungi un carattere di sistema\\\",\\\"tw.fonts.system2\\\":\\\"Potrebbe funzionare in Scratch, ma potrebbe non apparire per tutti in modo corretto.\\\",\\\"tw.fonts.title\\\":\\\"Caratteri\\\",\\\"tw.footer.credits\\\":\\\"Crediti\\\",\\\"tw.footer.disclaimer\\\":\\\"{APP_NAME} non è affiliato con Scratch, lo Scratch Team o la Scratch Foundation.\\\",\\\"tw.footer.documentation\\\":\\\"Documentazione\\\",\\\"tw.footer.embed\\\":\\\"Inclusione\\\",\\\"tw.footer.parameters\\\":\\\"Parametri URL\\\",\\\"tw.footer.scratchDisclaimer\\\":\\\"Scratch è un progetto della Scratch Foundation. E’ disponibile gratuitamentesul sito {scratchDotOrg}.\\\",\\\"tw.geolocate.permission\\\":\\\"Se consentito, il tuo browser potrebbe chiederti di consentire l'accesso alla localizzazione.\\\",\\\"tw.geolocate.title\\\":\\\"Il progetto vuole conoscere la tua posizione.\\\",\\\"tw.gui.crashMessage.description\\\":\\\"Ci dispiace, sembra che la pagina abbia avuto un arresto anomalo. Aggiorna la pagina per riprovare.\\\",\\\"tw.gui.defaultProjectTitle\\\":\\\"Progetto\\\",\\\"tw.guiDefaultTitle\\\":\\\"Esegue i progetti Scratch più velocemente\\\",\\\"tw.home.credit\\\":\\\"Note e Crediti\\\",\\\"tw.home.description\\\":\\\"{APP_NAME} è una Modifica di Scratch che compila i progetti in JavaScript per renderli molto più veloci. Provalo, inserisci qui sopra un ID di un progetto o una URL o scegli uno dei progetti in primo piano che trovi qui sotto.\\\",\\\"tw.home.instructions\\\":\\\"Istruzioni\\\",\\\"tw.input.tooltip\\\":\\\"Copia e incolla il link di un progetto Scratch qui!\\\",\\\"tw.interpolationEnabled\\\":\\\"Interpolazione\\\",\\\"tw.invalidParameters.clones\\\":\\\"Il parametro URL \\\\\\\"clone\\\\\\\" non è valido\\\",\\\"tw.invalidParameters.fps\\\":\\\"Il parametro URL \\\\\\\"fps\\\\\\\" non è valido\\\",\\\"tw.invalidProject.error\\\":\\\"Impossibile caricare il progetto:\\\",\\\"tw.invalidProject.options\\\":\\\"Potresti riuscire a recuperare una vecchia versione del progetto dai punti di ripristino automatici, o da un vecchio backup.\\\",\\\"tw.invalidProject.reportIt\\\":\\\"segnalarlo\\\",\\\"tw.invalidProject.restorePoints\\\":\\\"Vai ai Punti di Ripristino\\\",\\\"tw.invalidProject.sb3fix\\\":\\\"ad usare sb3fix per recuperare il progetto\\\",\\\"tw.invalidProject.title\\\":\\\"Errore\\\",\\\"tw.invalidProject.validationError\\\":\\\"Questo errore spesso significa che una piccola parte del progetto si è corrotta, ma che per il resto è valido. Siccome potrebbe essere semplice risolverlo, ti preghiamo di {reportIt}.\\\",\\\"tw.invalidProject.zipCorruption\\\":\\\"Questo errore indica spesso che il file è corrotto, a causa di dispositivo di memorizzazione malfunzionante o all'estrazione di un dispositivo di memorizzazione senza averlo prima espulso. Prova {usingSb3fix}, pensato proprio per risolvere questo tipo di problemi.\\\",\\\"tw.lightMode\\\":\\\"Passa alla Modalità Scura\\\",\\\"tw.loadExtension.embedded\\\":\\\"Il progetto vuole caricare una estensione personalizzata con il seguente codice:\\\",\\\"tw.loadExtension.sandboxed\\\":\\\"Anche se il codice è eseguito in una sandbox, l'estensione avrà comunque accesso a informazioni sul tuo dispositivo come ad esempio il tuo indirizzo IP e la tua localizzazione. Assicurati di fidarti dell'autore dell'estensione prima di continuare.\\\",\\\"tw.loadExtension.unsandboxed\\\":\\\"Esegui senza sandbox\\\",\\\"tw.loadExtension.unsandboxedWarning\\\":\\\"Le estensioni eseguite senza sandbox possono corrompere il tuo progetto, cancellare le tue impostazioni, rubare le tue password e fare altre cose malevole. Gli sviluppatori di {APP_NAME} non si ritengono responsabili per qualunque problema dovesse verificarsi.\\\",\\\"tw.loadExtension.url\\\":\\\"Il progetto vuole caricare una estensione personalizzata dall'URL:\\\",\\\"tw.loader.downloadingAssets\\\":\\\"Scaricamento risorse in corso ({complete}/{total}) ...\\\",\\\"tw.loader.loadingAssets\\\":\\\"Caricamento risorse ({complete}/{total}) …\\\",\\\"tw.loader.projectData\\\":\\\"Caricamento del progetto in corso …\\\",\\\"tw.menuBar.60off\\\":\\\"Disabilita modalità 60 FPS\\\",\\\"tw.menuBar.60on\\\":\\\"Abilita modalità 60 FPS\\\",\\\"tw.menuBar.accent\\\":\\\"Colore di evidenziazione\\\",\\\"tw.menuBar.addons\\\":\\\"Addon\\\",\\\"tw.menuBar.advanced\\\":\\\"Impostazioni Avanzate\\\",\\\"tw.menuBar.blockColors\\\":\\\"Colore dei Blocchi\\\",\\\"tw.menuBar.changeUsername\\\":\\\"Cambia Username\\\",\\\"tw.menuBar.cloudOff\\\":\\\"Disabilita Variabili Cloud\\\",\\\"tw.menuBar.cloudOn\\\":\\\"Abilita Variabili Cloud\\\",\\\"tw.menuBar.cloudUnavailable\\\":\\\"Le Variabili Cloud non sono Disponibili\\\",\\\"tw.menuBar.cloudUnavailableAlert\\\":\\\"Impossibile usare le variabili cloud, probabilmente perché è stato aperto l'editor.\\\",\\\"tw.menuBar.desktopSettings\\\":\\\"Impostazioni Desktop\\\",\\\"tw.menuBar.moreSettings\\\":\\\"Impostazioni Avanzate\\\",\\\"tw.menuBar.newFramerate\\\":\\\"Nuovo framerate:\\\",\\\"tw.menuBar.newWindow\\\":\\\"Nuova finestra\\\",\\\"tw.menuBar.package\\\":\\\"Crea pacchetto\\\",\\\"tw.menuBar.reportError1\\\":\\\"L'esecuzione di alcuni script ha causato errori.\\\",\\\"tw.menuBar.reportError2\\\":\\\"Si è verificato un problema. Ti invitiamo a segnalarlo.\\\",\\\"tw.menuBar.restorePoints\\\":\\\"Punti di ripristino\\\",\\\"tw.menuBar.saveAs\\\":\\\"Salva come {file}\\\",\\\"tw.menuBar.seeInside\\\":\\\"Guarda dentro\\\",\\\"tw.moreCloud\\\":\\\"Ulteriori informazioni sulle variabili cloud\\\",\\\"tw.notify.permission\\\":\\\"Se viene consentito, il tuo browser potrebbe chiederti se vuoi consentire le notifiche e le future notifiche saranno consentite automaticamente.\\\",\\\"tw.notify.title\\\":\\\"Il progetto vuole mostrare delle notifiche.\\\",\\\"tw.oldDownload\\\":\\\"Salve in un file separato...\\\",\\\"tw.opcode.2000\\\":\\\"giorni dal 2000\\\",\\\"tw.opcode.mousedown\\\":\\\"pulsante del mouse premuto\\\",\\\"tw.opcode.mousex\\\":\\\"x del mouse\\\",\\\"tw.opcode.mousey\\\":\\\"y del mouse\\\",\\\"tw.openAdvanced\\\":\\\"Apri impostazioni avanzate\\\",\\\"tw.openWindow.dangerous\\\":\\\"Questo sito web non è stato recensito dagli sviluppatori di {APP_NAME}. Può contenere codice pericoloso o dannoso.\\\",\\\"tw.openWindow.title\\\":\\\"Il progetto richiede di aprire in una nuova finestra o scheda l'URL:\\\",\\\"tw.paint.alpha\\\":\\\"Opacità\\\",\\\"tw.paint.fonts.more\\\":\\\"Aggiungi caratteri...\\\",\\\"tw.pen.stageSelected\\\":\\\"Stage selezionato: blocchi penna ridotti\\\",\\\"tw.privacy\\\":\\\"Politica della Privacy\\\",\\\"tw.recordAudio.permission\\\":\\\"Se viene consentito, il tuo browser potrebbe chiederti se vuoi consentire l'accesso al micrfono e i futuri accessi al microfono saranno consentiti automaticamente.\\\",\\\"tw.recordAudio.title\\\":\\\"Il progetto vuole registrare l'audio del microfono. L'audio includerà una trascrizione testuale o dati audio grezzi. Il progetto potrebbe condividere l'audio con altri utenti o altri server.\\\",\\\"tw.recordVideo.permission\\\":\\\"Se viene consentito, il tuo browser potrebbe chiederti se vuoi consentire l'accesso alla webcam e i futuri accessi alla webcam saranno consentiti automaticamente.\\\",\\\"tw.recordVideo.title\\\":\\\"Il progetto vuole registrare il video della tua webcam. Il progetto potrebbe condividere immagini con altri utenti o altri server.\\\",\\\"tw.redirect.dangerous\\\":\\\"Questo sito web non è stato recensito dagli sviluppatori di {APP_NAME}. Può contenere codice pericoloso o dannoso.\\\",\\\"tw.redirect.title\\\":\\\"Il progetto richiede di aprire in questa scheda l'URL:\\\",\\\"tw.removedTrademarks\\\":\\\"Alcuni elementi che contenevano il marchio di Scratch sono stati rimossi.\\\",\\\"tw.restorePoints.1minute\\\":\\\"ogni minuto\\\",\\\"tw.restorePoints.assets\\\":\\\"{n} risorse\\\",\\\"tw.restorePoints.confirmDelete\\\":\\\"Sei sicuro di voler cancellare \\\\\\\"{projectTitle}\\\\\\\"? Questa operazione non potrà essere annullata.\\\",\\\"tw.restorePoints.confirmDeleteAll\\\":\\\"Sei sicuro di voler cancellare TUTTI i punti di ripristino? Questa operazione non potrà annullata.\\\",\\\"tw.restorePoints.confirmLoad\\\":\\\"Ci sono modifiche non salvate. Rimpiazzare il progetto corrente?\\\",\\\"tw.restorePoints.deleteAll\\\":\\\"Rimuovi Tutto\\\",\\\"tw.restorePoints.description\\\":\\\"{APP_NAME} salva periodicamente dei punti di ripristino sul computer per aiutarti a recuperare il progetto se dimentichi di salvare. Questo sistema fornisce un ultima risorsa per poter recuperare il tuo progetto. il tuo computer potrebbe rimuovere senza preavviso questi punti di interruzione. NON fare affidamento su questa possibilità.\\\",\\\"tw.restorePoints.empty\\\":\\\"Nessun punto di ripristino trovato.\\\",\\\"tw.restorePoints.error\\\":\\\"Errore nel caricamento del punto di ripristino: {error}\\\",\\\"tw.restorePoints.exportError\\\":\\\"Errore nell'esportazione del punto di ripristino: {error}\\\",\\\"tw.restorePoints.intervalOption\\\":\\\"I punti di ripristino vengono creati {time}.\\\",\\\"tw.restorePoints.loading\\\":\\\"Caricamento...\\\",\\\"tw.restorePoints.minutes\\\":\\\"ogni {n} minuti\\\",\\\"tw.restorePoints.never\\\":\\\"mai\\\",\\\"tw.restorePoints.off\\\":\\\"Disabilitare i punti di ripristino è rischioso.\\\",\\\"tw.restorePoints.size\\\":\\\"Spazio di archiviazione usato: {size}\\\",\\\"tw.restorePoints.size2\\\":\\\"Costumi e suoni usati da più punti di ripristino vengono archiviati una sola volta.\\\",\\\"tw.restorePoints.title\\\":\\\"Ripristina Punti di Ripristino\\\",\\\"tw.sample\\\":\\\"Progetto di esempio\\\",\\\"tw.saveAs\\\":\\\"Salva come...\\\",\\\"tw.saveTo\\\":\\\"Salva come {file}\\\",\\\"tw.scratchUnsafeCloud\\\":\\\"Se crei questa variabile cloud, il progetto supererà il limite massimo di {number} variabili previsto da Scratch e alcune variabili non funzioneranno se caricerai il progetto sul sito di Scratch.\\\",\\\"tw.securityManager.allow\\\":\\\"Consenti\\\",\\\"tw.securityManager.deny\\\":\\\"Nega\\\",\\\"tw.securityManager.title\\\":\\\"Sicurezza Estensione\\\",\\\"tw.securityManager.trust\\\":\\\"Se si dà il permesso, richieste future allo stesso sito web verranno permesse automaticamente.\\\",\\\"tw.securityManager.why\\\":\\\"Potrebbe venire utilizzato per scraicare immagini e suoni, implementare funzionalità multiplayer, accedere ad una API, oppure per scopi dannosi. Condividerà con il sito il tuo indirizzo IP, la tua area geografica e potenzialmente anche altri dati.\\\",\\\"tw.settingsModal.customStageSize\\\":\\\"Dimensioni Stage Personalizzate:\\\",\\\"tw.settingsModal.customStageSizeHelp\\\":\\\"Cambia la dimensione dello stage di Scratch da 480x360 a un altro valore. Prova 640x360 per rendere lo stage widescreen. Pochi progetti potranno gestire questa proprietà.\\\",\\\"tw.settingsModal.dangerZone\\\":\\\"Zona Pericolosa\\\",\\\"tw.settingsModal.disableCompiler\\\":\\\"Disabilita Compilatore\\\",\\\"tw.settingsModal.disableCompilerHelp\\\":\\\"Disabilita il compilatore di {APP_NAME}. E' un'opzione che è utile attivare soltanto quando si modificano i progetti, in modo che gli script si aggiornino immediatamente. E' ad esempio utile quando si eseguono gli script passo passo grazie all'addon Debugger. Si sconsiglia di usare questa opzione in altri casi. \\\",\\\"tw.settingsModal.featured\\\":\\\"In Evidenza\\\",\\\"tw.settingsModal.fps\\\":\\\"60 FPS (FPS personalizzato)\\\",\\\"tw.settingsModal.fpsHelp\\\":\\\"Esegue gli script 60 volte al secondo invece di 30. Alcuni progetti potrebbero non funzionare correttamente con questa impostazione abilitata. In questo caso puoi provare ad abilitare l'interpolazione senza abilitare la modalità 60 FPS. {customFramerate}.\\\",\\\"tw.settingsModal.fpsHelp.customFramerate\\\":\\\"Clicca qui per usare un framerate diverso da 30 o 60\\\",\\\"tw.settingsModal.help\\\":\\\"Clicca per aiuto\\\",\\\"tw.settingsModal.highQualityPen\\\":\\\"Penna Alta Qualità\\\",\\\"tw.settingsModal.highQualityPenHelp\\\":\\\"Permette ai progetti di essere visualizzati ad una risoluzione maggiore e disabilita l'arrotondamento delle coordinate fatto dall'editor. Non tutti i progetti si giovano di questa impostazione che può avere impatto sulla performance del progetto.\\\",\\\"tw.settingsModal.infiniteClones\\\":\\\"Cloni Infiniti\\\",\\\"tw.settingsModal.infiniteClonesHelp\\\":\\\"Disabilita il limite di Scratch di 300 cloni.\\\",\\\"tw.settingsModal.interpolation\\\":\\\"Interpolazione\\\",\\\"tw.settingsModal.interpolationHelp\\\":\\\"Fa apparire i progetti più fluidi interpolando il movimento degli sprite. L'interpolazione non dovrebbe essere usata nei progetti 3D, nei raytracer, nei progetti basati sull'uso della penna e nei progetti che laggano in quanto l'interpolazione li farebbe eseguire più lentamente senza farli apparire più fluidi.\\\",\\\"tw.settingsModal.largeStageWarning\\\":\\\"L'uso di uno stage personalizzato così grande non è raccomandato! Ti suggeriamo di usare una dimensione inferiore con le stesse proporzioni e usare poi il fullscreen per portarlo alle dimensioni dello schermo dell'utente.\\\",\\\"tw.settingsModal.removeFencing\\\":\\\"Rimozione Recinto\\\",\\\"tw.settingsModal.removeFencingHelp\\\":\\\"Permette agli sprite di muoversi completamente fuori dallo Stage e di diventare grandi o piccoli quando si desidera e permette ai blocchi sensori che verificano il contatto di funzionare anche quando gli sprite sono completamente fuori dallo Stage.\\\",\\\"tw.settingsModal.removeLimits\\\":\\\"Rimozione Limiti\\\",\\\"tw.settingsModal.removeMiscLimits\\\":\\\"Rimozione Limiti Vari\\\",\\\"tw.settingsModal.removeMiscLimitsHelp\\\":\\\"Rimuove i limiti agli effetti sonori e alla dimensione della penna.\\\",\\\"tw.settingsModal.storeProjectOptions\\\":\\\"Memorizza le impostazioni nel progetto\\\",\\\"tw.settingsModal.storeProjectOptionsHelp\\\":\\\"Memorizza nel progetto le impostazioni selezionate in modo che siano applicate automaticamente quando il progetto viene caricato in TurboWarp. Il warp timer e la disabilitazione del compilatore non verranno memorizzati.\\\",\\\"tw.settingsModal.title\\\":\\\"Impostazioni Avanzate\\\",\\\"tw.settingsModal.warpTimerHelp\\\":\\\"Permette ai progetti di verificare se sono bloccati in un loop molto lungo o infinito e di essere quindi eseguiti ad un framerate più basso invece di apparire bloccati fino a che il loop non termina. Questa opzione risolve molte cause di blocco ma ha un impatto significativo sulla performance, quindi è abilitata come impostazione predeterminata solo all'interno dell'editor.\\\",\\\"tw.soundEditorNotSupported\\\":\\\"L'editor di suoni non è supportato in questo browser.\\\",\\\"tw.spriteSelectorItem.rename\\\":\\\"rinomina\\\",\\\"tw.stageHeader.full\\\":\\\"Passa alla visualizzazione con Stage completo\\\",\\\"tw.stereoAlert\\\":\\\"Modificando questo suono stereo verrà convertito in modo in maniera irreversibile. \\\",\\\"tw.studioview.authorAttribution\\\":\\\"di {author}\\\",\\\"tw.studioview.error\\\":\\\"Si è verificato un errore nel caricamento della pagina di progetti successiva.\\\",\\\"tw.studioview.hoverText\\\":\\\"{title} di {author}\\\",\\\"tw.tooLarge\\\":\\\"Questo suono potrebbe essere troppo pesante per essere caricato su Scratch.\\\",\\\"tw.twExtension.description\\\":\\\"Nuovi blocchi strani.\\\",\\\"tw.twExtension.name\\\":\\\"Blocchi di {APP_NAME}\\\",\\\"tw.unfavorite\\\":\\\"Non preferito\\\",\\\"tw.unknownPlatform.1\\\":\\\"Questo progetto è stato creato per una versione diversa dell'app:\\\",\\\"tw.unknownPlatform.2\\\":\\\"La compatibilità con {APP_NAME} non è garantita. Puoi scegliere di continuare, ma potremmo non riuscire a fornirti supporto nel caso dovessi incontrare dei problemi\\\",\\\"tw.unknownPlatform.continue\\\":\\\"Ho capito\\\",\\\"tw.unknownPlatform.title\\\":\\\"Piattaforma Sconosciuta\\\",\\\"tw.unshared.2\\\":\\\"Per ulteriori informazioni vai a {link}\\\",\\\"tw.unshared.bug\\\":\\\"Se sei certo che questo progetto è condiviso, segnala il problema.\\\",\\\"tw.unshared.cache\\\":\\\"Se il progetto è stato condiviso di recente questo messaggio può apparire erroneamente per alcuni minuti.\\\",\\\"tw.unshared2.1\\\":\\\"I progetti non condivisi non sono più visibili.\\\",\\\"tw.usernameModal.help\\\":\\\"Questo valore verrà archiviato nello spazio di archiviazione del tuo browser. Potrebbe essere loggato quando interagisci con progetti che usano le variabili cloud.\\\",\\\"tw.usernameModal.help2\\\":\\\"Valori che non corrispondono ad un account Scratch valido saranno di solito rifiutati dal server delle variabili cloud. Raccomandiamo di lasciarli così come sono o cambiandolo nel tuo username Scratch.\\\",\\\"tw.usernameModal.mustChange\\\":\\\"Il server delle variabili cloud pensa che il tuo username possa non essere sicuro. Ti preghiamo di cambiarlo con qualcos'altro o di {resetIt}\\\",\\\"tw.usernameModal.mustChange.resetIt\\\":\\\"resettarlo (raccomandato)\\\",\\\"tw.usernameModal.new\\\":\\\"Nuovo username:\\\",\\\"tw.usernameModal.reset\\\":\\\"Resetta\\\",\\\"tw.usernameModal.title\\\":\\\"Cambia Username\\\",\\\"tw.usesCloudVariables\\\":\\\"Questo progetto usa le variabili cloud.\\\",\\\"tw.usesCloudVariables2\\\":\\\"Le variabili cloud di {APP_NAME} non sono collegate a quelle di Scratch. Chiunque può {changeTheirUsername} come preferisce, fai quindi attenzione a chi tenta di spacciarsi per qualcun altro.\\\",\\\"tw.usesCloudVariables2.change\\\":\\\"cambiare il proprio username\\\",\\\"tw.viewFeaturedProjects\\\":\\\"Clicca per vedere i progetti in primo piano.\\\",\\\"tw.viewOnScratch\\\":\\\"Mostra il progetto nel sito di Scratch\\\"},\\\"ja\\\":{\\\"tw.accent.blue\\\":\\\"青\\\",\\\"tw.accent.purple\\\":\\\"紫\\\",\\\"tw.accent.rainbow\\\":\\\"レインボー\\\",\\\"tw.accent.red\\\":\\\"赤\\\",\\\"tw.alerts.creatingRestorePoint\\\":\\\"復元ポイントを作成しています…\\\",\\\"tw.alerts.lostPeripheralConnection\\\":\\\"{extensionName}との接続が切れました。\\\",\\\"tw.alerts.restorePointError\\\":\\\"復元ポイントを作成できませんでした\\\",\\\"tw.alerts.restorePointSuccess\\\":\\\"”ファイル”から復元ポイントにアクセス\\\",\\\"tw.alerts.savedToDisk\\\":\\\"コンピューターに保存する\\\",\\\"tw.backpack.rename\\\":\\\"新しい名前:\\\",\\\"tw.blockColors.custom\\\":\\\"アドオンの設定でカスタマイズする\\\",\\\"tw.blockColors.dark\\\":\\\"ダーク(ベータ版)\\\",\\\"tw.blockColors.highContrast\\\":\\\"ハイコントラスト\\\",\\\"tw.blockColors.three\\\":\\\"オリジナル\\\",\\\"tw.blocks.PROCEDURES_DOCS\\\":\\\"~を返すの使い方\\\",\\\"tw.blocks.PROCEDURES_RETURN\\\":\\\"{v}を返す\\\",\\\"tw.blocks.PROCEDURES_TO_REPORTER\\\":\\\"リポーターへ変更\\\",\\\"tw.blocks.PROCEDURES_TO_STATEMENT\\\":\\\"ステートメントへ変更\\\",\\\"tw.blocks.addons\\\":\\\"アドオン\\\",\\\"tw.blocks.buttonIsDown\\\":\\\"マウスの[MOUSE_BUTTON]が押された\\\",\\\"tw.blocks.lastKeyPressed\\\":\\\"最後に押されたキー\\\",\\\"tw.blocks.mouseButton.middle\\\":\\\"(1) ホイール\\\",\\\"tw.blocks.mouseButton.primary\\\":\\\"(0) 左ボタン\\\",\\\"tw.blocks.mouseButton.secondary\\\":\\\"(2) 右ボタン\\\",\\\"tw.blocks.openDocs\\\":\\\"ドキュメントを開く\\\",\\\"tw.browserModal.desktopSettings\\\":\\\"デスクトップの設定を開く\\\",\\\"tw.browserModal.desktopTitle\\\":\\\"システムはサポートされていません\\\",\\\"tw.browserModal.webgl1\\\":\\\"{APP_NAME}はWebGLを必要としますが、お使いのパソコンはWebGLをサポートしていないようです。これは一時的なエラーであることが多く、コンピュータを再起動することで解決できる場合があります。\\\",\\\"tw.browserModal.webglBrowser\\\":\\\"Chrome、Firefox、またはSafariの最新バージョンを使って、グラフィックドライバーが最新であることを確認してください。ブラウザの設定で「グラフィックアクセラレーション」または「ハードウェアアクセラレーション」の項目を切り替えてみることもできます。\\\",\\\"tw.browserModal.webglDesktop\\\":\\\"デスクトップの設定で「グラフィックアクセラレーション」の項目を切り替えてみることもできます。\\\",\\\"tw.cantUseCloud\\\":\\\"クラウド変数を作成することはできますが、このプロジェクトをScratchにアップロードするか、{packager}などのツールを使用しないと、動作しません。\\\",\\\"tw.changeUsername.cannotChangeWhileRunning\\\":\\\"ユーザー名をプロジェクトの実行中に変えることはできません。\\\",\\\"tw.clipboard.danger\\\":\\\"クリップボードにパスワードなどが含まれている場合、プロジェクトが他のユーザーや、サーバーに共有してしまう可能性があります。\\\",\\\"tw.clipboard.permission\\\":\\\"クリップボードへのアクセスは、ブラウザによって動作しない場合があります。許可されている場合、クリップボードの読み込みは自動で許可されます。\\\",\\\"tw.clipboard.title\\\":\\\"プロジェクトがクリップボードからデータを読み込もうとしています。\\\",\\\"tw.cloudProvider\\\":\\\"サーバーは{name}によって提供されます。\\\",\\\"tw.cloudServers\\\":\\\"近いサーバーを選択:\\\",\\\"tw.code\\\":\\\"ソースコード\\\",\\\"tw.confirmIncompatibleExtension\\\":\\\"この拡張機能はScratchとの互換性がありません。これを使って作ったプロジェクトは、Scratchのウェブサイトにアップロードできません。本当に使用しますか?\\\",\\\"tw.createdBy\\\":\\\"製作者:\\\",\\\"tw.customCloudServer\\\":\\\"使用しているカスタムクラウド変数サーバー : {server}\\\",\\\"tw.customExtension.description\\\":\\\"URL、ファイル、JavaScriptのソースコードからカスタム拡張機能を読み込む。\\\",\\\"tw.customExtension.name\\\":\\\"カスタム拡張機能\\\",\\\"tw.customExtensionModal.file\\\":\\\"ファイル\\\",\\\"tw.customExtensionModal.load\\\":\\\"読み込む\\\",\\\"tw.customExtensionModal.promptFile\\\":\\\"拡張機能のJavaScriptファイルを選択又はドラッグアンドドロップする:\\\",\\\"tw.customExtensionModal.promptText\\\":\\\"拡張機能のJavaScriptのソースコードをペーストする:\\\",\\\"tw.customExtensionModal.promptURL\\\":\\\"拡張機能のURLを入力: \\\",\\\"tw.customExtensionModal.text\\\":\\\"テキスト\\\",\\\"tw.customExtensionModal.title\\\":\\\"カスタム拡張機能を読み込む\\\",\\\"tw.customExtensionModal.trusted\\\":\\\"この拡張機能は信頼できるソースからのものであるため、サンドボックスなしで読み込みます。\\\",\\\"tw.customExtensionModal.unsandboxed\\\":\\\"サンドボックスなしで実行する\\\",\\\"tw.customExtensionModal.unsandboxedWarning1\\\":\\\"サンドボックスなしで拡張機能を読み込むのは危険です。よく分からない場合は無効にしてください。\\\",\\\"tw.customExtensionModal.unsandboxedWarning2\\\":\\\"サンドボックス化していない拡張機能は、プロジェクトを破損させたり、設定を削除したり、パスワードをフィッシングしたり、その他の悪いことをする可能性があります。{APP_NAME}の開発者は、この拡張機能によって生じるいかなる問題にも責任を負いません。\\\",\\\"tw.customExtensionModal.untrusted\\\":\\\"信頼できないURLからの拡張機能は、セキュリティのため常にサンドボックスで読み込みます。\\\",\\\"tw.customReporters.description\\\":\\\"カスタムブロックが値を出力し、入力として使えるようにする。\\\",\\\"tw.customReporters.name\\\":\\\"カスタム定義\\\",\\\"tw.darkMode\\\":\\\"ライトモードに切り替える\\\",\\\"tw.desktopCloud\\\":\\\"デスクトップアプリでは、クラウド変数はこのコンピューター上のすべてのデスクトップアプリのウィンドウ間で同期されます。プロジェクトをScratchにアップロードするか、{packager}などのツールを使用してグローバルに同期してください。\\\",\\\"tw.documentation\\\":\\\"ドキュメント\\\",\\\"tw.download.danger\\\":\\\"このファイルはまだ{APP_NAME}の開発者によって審査されていません。\\\",\\\"tw.download.executable\\\":\\\"このファイルは実行可能ファイルです。実行すると、あなたのコンピュータに危害を加える恐れがあります。\\\",\\\"tw.download.file\\\":\\\"プロジェクトがコンピューターにファイルをダウンロードしようとしています。ファイルはあなたのダウンロードフォルダーに{name}として保存されます。\\\",\\\"tw.embed.persistent\\\":\\\"許可した場合、同じサイトから読み込まれる埋め込みは、自動的に許可されます。\\\",\\\"tw.embed.risks\\\":\\\"埋め込まれるコンテンツはサンドボックス化されますが、IPアドレスや、位置情報といった端末情報にはまだアクセスすることができます。\\\",\\\"tw.embed.title1\\\":\\\"プロジェクトはHTMLコンテンツをステージに埋め込もうとしています:\\\",\\\"tw.embed.title2\\\":\\\"プロジェクトは、リモートのコンテンツをステージに埋め込もうとしています:\\\",\\\"tw.extensionGallery.error\\\":\\\"拡張機能ギャラリーを読み込み中にエラーが発生しました。extensions.turbowarp.org にアクセスしてさらに多くの拡張機能を発見してください\\\",\\\"tw.extensionGallery.loading\\\":\\\"拡張機能ギャラリーを読み込み中…\\\",\\\"tw.extensionGallery.more\\\":\\\"詳しくは、extensions.turbowarp.org をご確認ください。\\\",\\\"tw.extensionGallery.name\\\":\\\"{APP_NAME}拡張機能ギャラリー\\\",\\\"tw.favorite\\\":\\\"お気に入りにする\\\",\\\"tw.featuredProjectsStudio\\\":\\\"Scratchのスタジオで見る\\\",\\\"tw.feedback\\\":\\\"フィードバックとバグ\\\",\\\"tw.feedbackButton\\\":\\\"{APP_NAME}フィードバック\\\",\\\"tw.fetch.title\\\":\\\"プロジェクトがウェブサイトに接続しようとしています:\\\",\\\"tw.fileInput.none\\\":\\\"ファイルが選択されていません。\\\",\\\"tw.fileInput.selected\\\":\\\"選択済み:{names}\\\",\\\"tw.fonts.add\\\":\\\"追加する\\\",\\\"tw.fonts.custom.file\\\":\\\"コンピュータからフォントを選択 : \\\",\\\"tw.fonts.custom.name\\\":\\\"フォントの名前をつける:\\\",\\\"tw.fonts.custom1\\\":\\\"ファイルからフォントを追加\\\",\\\"tw.fonts.custom2\\\":\\\"Scratchでは大抵の場合動きません。サポートされているフォーマット:{formats}\\\",\\\"tw.fonts.delete\\\":\\\"\\\\\\\"{font}\\\\\\\" を削除してもよろしいですか? ベクターコスチュームでは代わりに他のフォントに置き換わります。\\\",\\\"tw.fonts.fallback\\\":\\\"フォントの読み込みに失敗した場合や削除された場合に使用する代わりのフォントを選択します。\\\",\\\"tw.fonts.list\\\":\\\"インストール済みのフォント : \\\",\\\"tw.fonts.none\\\":\\\"フォントが追加されていません。\\\",\\\"tw.fonts.readError\\\":\\\"フォントのファイルを読み込めませんでした: {error}\\\",\\\"tw.fonts.system\\\":\\\"システムフォント\\\",\\\"tw.fonts.system.name\\\":\\\"コンピュータにインストールされているフォントの名前を入力します。フォントはユーザーによって正しく表示されない可能性があります。\\\",\\\"tw.fonts.system1\\\":\\\"フォントを追加\\\",\\\"tw.fonts.system2\\\":\\\"Scratchで動作する可能性がありますが、ユーザーによって正しく表示されない可能性があります。\\\",\\\"tw.fonts.title\\\":\\\"フォント\\\",\\\"tw.footer.credits\\\":\\\"クレジット\\\",\\\"tw.footer.disclaimer\\\":\\\"{APP_NAME}は、Scratch、Scratchチームおよび、Scratch財団と提携していません。\\\",\\\"tw.footer.documentation\\\":\\\"ドキュメント\\\",\\\"tw.footer.embed\\\":\\\"埋め込みコード\\\",\\\"tw.footer.parameters\\\":\\\"URLパラメーター\\\",\\\"tw.footer.scratchDisclaimer\\\":\\\"Scratchは、Scratch財団のプロジェクトです。{scratchDotOrg}で無料で利用できます。\\\",\\\"tw.geolocate.permission\\\":\\\"許可すると、位置情報へのアクセスを許可するようブラウザから促されることがあります。\\\",\\\"tw.geolocate.title\\\":\\\"このプロジェクトはあなたの位置情報を知ろうとしています。\\\",\\\"tw.gui.crashMessage.description\\\":\\\"申し訳ありませんが、ページがクラッシュしたようです。ページを再読み込みしてもう一度やり直してみてください。\\\",\\\"tw.gui.defaultProjectTitle\\\":\\\"プロジェクト\\\",\\\"tw.guiDefaultTitle\\\":\\\"Scratchのプロジェクトを速く動かす\\\",\\\"tw.home.credit\\\":\\\"メモとクレジット\\\",\\\"tw.home.description\\\":\\\"{APP_NAME}は、プロジェクトをJavaScriptにコンパイルし、高速に実行できるようにするScratch modです。プロジェクトのIDまたは、URLを入力するか、下の注目のプロジェクトから選択してみてください。\\\",\\\"tw.home.instructions\\\":\\\"使い方\\\",\\\"tw.input.tooltip\\\":\\\"ScratchのプロジェクトのURLをコピー&ペーストして見ることができます\\\",\\\"tw.interpolationEnabled\\\":\\\"補完機能\\\",\\\"tw.invalidParameters.clones\\\":\\\"「クローン」のURLパラメーターが無効です\\\",\\\"tw.invalidParameters.fps\\\":\\\"「FPS」のURLパラメーターが無効です\\\",\\\"tw.invalidProject.error\\\":\\\"プロジェクトを読み込めませんでした:\\\",\\\"tw.invalidProject.options\\\":\\\"プロジェクトの自動復元ポイント機能もしくは、他のバックアップを使用して、プロジェクトを復元できる場合があります。\\\",\\\"tw.invalidProject.reportIt\\\":\\\"報告してください\\\",\\\"tw.invalidProject.restorePoints\\\":\\\"復元ポイントを見る\\\",\\\"tw.invalidProject.validationError\\\":\\\"このエラーは多くの場合、プロジェクトのごく一部が破損していることを意味していますが、それ以外は問題ありません。このエラーは簡単に修正が可能ですので、{reportIt}\\\",\\\"tw.lightMode\\\":\\\"ダークモードに切り替える\\\",\\\"tw.loadExtension.embedded\\\":\\\"このプロジェクトは、コードと共にカスタム拡張機能を読み込もうとしています:\\\",\\\"tw.loadExtension.sandboxed\\\":\\\"コードは保護されますが、IPや位置などのデバイスに関する情報には引き続きアクセスできます。続行する前に、この拡張機能の作成者が信頼できることを確認してください。\\\",\\\"tw.loadExtension.unsandboxed\\\":\\\"サンドボックスなしで実行する\\\",\\\"tw.loadExtension.unsandboxedWarning\\\":\\\"サンドボックスなしで拡張機能を読み込むことは危険です。プロジェクトを破壊したり、設定を削除したり、パスワードを盗まれたり、その他の悪いことができるようになります。{APP_NAME}の開発者は、これによって生じるいかなる問題にも責任を負いません。\\\",\\\"tw.loadExtension.url\\\":\\\"このプロジェクトは、次のURLからカスタム拡張機能を読み込もうとしています:\\\",\\\"tw.loader.downloadingAssets\\\":\\\"プロジェクトをダウンロード中 ({complete}/{total}) ...\\\",\\\"tw.loader.loadingAssets\\\":\\\"{total}個中{complete}個読み込み完了…\\\",\\\"tw.loader.projectData\\\":\\\"プロジェクトを読み込み中…\\\",\\\"tw.menuBar.60off\\\":\\\"60FPSモードを解除する\\\",\\\"tw.menuBar.60on\\\":\\\"60FPSモードにする\\\",\\\"tw.menuBar.accent\\\":\\\"アクセント\\\",\\\"tw.menuBar.addons\\\":\\\"アドオン\\\",\\\"tw.menuBar.advanced\\\":\\\"高度な設定\\\",\\\"tw.menuBar.blockColors\\\":\\\"ブロックの色\\\",\\\"tw.menuBar.changeUsername\\\":\\\"ユーザー名を変える\\\",\\\"tw.menuBar.cloudOff\\\":\\\"クラウド変数を無効にする\\\",\\\"tw.menuBar.cloudOn\\\":\\\"クラウド変数を有効にする\\\",\\\"tw.menuBar.cloudUnavailable\\\":\\\"クラウド変数は使用できません\\\",\\\"tw.menuBar.cloudUnavailableAlert\\\":\\\"中を見たのでクラウド変数を使用できません。\\\",\\\"tw.menuBar.desktopSettings\\\":\\\"デスクトップの設定\\\",\\\"tw.menuBar.moreSettings\\\":\\\"高度な設定\\\",\\\"tw.menuBar.newFramerate\\\":\\\"新しいフレームレート:\\\",\\\"tw.menuBar.newWindow\\\":\\\"新しいウィンドウ\\\",\\\"tw.menuBar.package\\\":\\\"プロジェクトをパッケージ化する\\\",\\\"tw.menuBar.reportError1\\\":\\\"スクリプトでエラーが発生しました。\\\",\\\"tw.menuBar.reportError2\\\":\\\"これは不具合です。報告してください。\\\",\\\"tw.menuBar.restorePoints\\\":\\\"復元ポイント\\\",\\\"tw.menuBar.saveAs\\\":\\\"{file}として保存する\\\",\\\"tw.menuBar.seeInside\\\":\\\"中を見る\\\",\\\"tw.mono\\\":\\\"モノラル録音\\\",\\\"tw.moreCloud\\\":\\\"クラウド変数の詳細については、こちらをご覧ください。\\\",\\\"tw.notify.permission\\\":\\\"許可した場合、オペレーションシステムからの通知許可の確認が表示され、以降の通知は自動的に許可されます。\\\",\\\"tw.notify.title\\\":\\\"このプロジェクトは通知を表示しようとしています。\\\",\\\"tw.oldDownload\\\":\\\"別ファイルで保存する...\\\",\\\"tw.opcode.2000\\\":\\\"2000年からの日数\\\",\\\"tw.opcode.mousedown\\\":\\\"マウスが押された\\\",\\\"tw.opcode.mousex\\\":\\\"マウス x\\\",\\\"tw.opcode.mousey\\\":\\\"マウス y\\\",\\\"tw.openAdvanced\\\":\\\"高度な設定を開く\\\",\\\"tw.openWindow.dangerous\\\":\\\"このウェブサイトは{APP_NAME}開発者による審査を受けていません。危険または悪意のあるコードが含まれている可能性があります。\\\",\\\"tw.openWindow.title\\\":\\\"プロジェクトは新しいウィンドウまたはタブでURLを開こうとしています:\\\",\\\"tw.paint.alpha\\\":\\\"透明度\\\",\\\"tw.paint.fonts.more\\\":\\\"フォントを追加する…\\\",\\\"tw.pen.stageSelected\\\":\\\"ステージ選択: ペンブロックが足りません。\\\",\\\"tw.privacy\\\":\\\"プライバシーポリシー\\\",\\\"tw.recordAudio.permission\\\":\\\"許可した場合、マイクへのアクセス許可の確認が表示され、以降のマイクへのアクセス許可は自動的に許可されます。\\\",\\\"tw.recordAudio.title\\\":\\\"このプロジェクトは、マイクから録音しようとしています。これには音声認識または、生の音声データが含まれます。このプロジェクトが他のユーザーやサーバーと音声を共有することができる場合があります。\\\",\\\"tw.recordVideo.permission\\\":\\\"許可した場合、カメラへのアクセス許可の確認が表示され、以降のカメラへのアクセス許可は自動的に許可されます。\\\",\\\"tw.recordVideo.title\\\":\\\"このプロジェクトは、カメラから録画しようとしています。このプロジェクトが他のユーザーやサーバーと画像を共有することができる場合があります。\\\",\\\"tw.redirect.dangerous\\\":\\\"このウェブサイトは{APP_NAME}開発者による審査を受けていません。危険または悪意のあるコードが含まれている可能性があります。\\\",\\\"tw.redirect.title\\\":\\\" このプロジェクトは、このタブで次のURLを開こうとしています:\\\",\\\"tw.removedTrademarks\\\":\\\"いくつかのアイテムは、Scratchのトレードマークを含んでいるため、使用できないようになっています。\\\",\\\"tw.restorePoints.1minute\\\":\\\"1分ごと\\\",\\\"tw.restorePoints.assets\\\":\\\"{n}個のアセット\\\",\\\"tw.restorePoints.confirmDelete\\\":\\\"\\\\\\\"{projectTitle}\\\\\\\"を本当に削除しますか? 元に戻すことはできません。\\\",\\\"tw.restorePoints.confirmDeleteAll\\\":\\\"本当に全ての復元ポイントを削除しますか? 元に戻すことはできません。\\\",\\\"tw.restorePoints.confirmLoad\\\":\\\"保存していない変更があります。既存のプロジェクトを置き換えますか?\\\",\\\"tw.restorePoints.deleteAll\\\":\\\"全て消去する\\\",\\\"tw.restorePoints.description\\\":\\\"{APP_NAME}は、保存を忘れた場合にプロジェクトを回復できるように、復元ポイントをコンピュータに定期的に保存します。これは復元のための最後の手段として意図されています。これらの復元ポイントは削除される可能性があります。できるだけこの機能に依存しないでください。\\\",\\\"tw.restorePoints.empty\\\":\\\"復元ポイントはありません。\\\",\\\"tw.restorePoints.error\\\":\\\"復元ポイントを読み込み中のエラー:{error}\\\",\\\"tw.restorePoints.exportError\\\":\\\"復元ポイントのエクスポート中にエラーが発生しました:{error}\\\",\\\"tw.restorePoints.intervalOption\\\":\\\"{time}に復元ポイントを作る\\\",\\\"tw.restorePoints.loading\\\":\\\"読み込み中…\\\",\\\"tw.restorePoints.minutes\\\":\\\"{n}分ごと\\\",\\\"tw.restorePoints.never\\\":\\\"なし\\\",\\\"tw.restorePoints.off\\\":\\\"復元ポイントを無効にするのは危険です。\\\",\\\"tw.restorePoints.size\\\":\\\"推定ストレージ使用量: {size}\\\",\\\"tw.restorePoints.size2\\\":\\\"コスチュームと、サウンドは1回だけの保存ではなく、複数回保存されます。\\\",\\\"tw.restorePoints.title\\\":\\\"復元ポイント\\\",\\\"tw.sample\\\":\\\"サンプルプロジェクト\\\",\\\"tw.saveAs\\\":\\\"…として保存する\\\",\\\"tw.saveTo\\\":\\\"{file}に保存する\\\",\\\"tw.scratchUnsafeCloud\\\":\\\"このクラウド変数を作ると、{number}変数のScratchの上限を超えます。Scratchにこのプロジェクトをアップロードしたとき、一部の変数が機能しなくなります。\\\",\\\"tw.securityManager.allow\\\":\\\"許可\\\",\\\"tw.securityManager.deny\\\":\\\"拒否\\\",\\\"tw.securityManager.title\\\":\\\"拡張機能セキュリティ\\\",\\\"tw.securityManager.trust\\\":\\\"許可した場合、同じサイトへのリクエストは、自動的に許可されます。\\\",\\\"tw.securityManager.why\\\":\\\"これは画像や音声のダウンロード、マルチプレイヤーの実装、APIへのアクセス、または悪意ある目的に使用される可能性があります。これにより、あなたのIPアドレス、位置情報、おそらくその他のデータがウェブサイトと共有されます。\\\",\\\"tw.settingsModal.customStageSize\\\":\\\"ステージの大きさを変える:\\\",\\\"tw.settingsModal.customStageSizeHelp\\\":\\\"ステージのサイズを480x360から他のサイズに変更します。ステージをワイドスクリーンにするには、640x360をお試しください。これを適切に処理できるプロジェクトはほとんどありません。\\\",\\\"tw.settingsModal.dangerZone\\\":\\\"危険区域\\\",\\\"tw.settingsModal.disableCompiler\\\":\\\"コンパイラを無効にする\\\",\\\"tw.settingsModal.disableCompilerHelp\\\":\\\"{APP_NAME}コンパイラを無効化します。プロジェクトを編集中に有効にすると、スクリプトがすぐに更新されるようになります。必要がないときは*絶対に*有効化すべきではありません。\\\",\\\"tw.settingsModal.featured\\\":\\\"おすすめ\\\",\\\"tw.settingsModal.fps\\\":\\\"60 FPS (カスタム FPS)\\\",\\\"tw.settingsModal.fpsHelp\\\":\\\"スクリプトの実行回数を30回/秒から60回/秒に変更します。この機能を有効にすると、ほとんどのプロジェクトが正常に動作しなくなります。そのような場合には、60FPSモードを無効にして補間機能を試してみてください。{customFramerate}.\\\",\\\"tw.settingsModal.fpsHelp.customFramerate\\\":\\\"30または60以外のFPSを設定する\\\",\\\"tw.settingsModal.help\\\":\\\"クリックしてヘルプ\\\",\\\"tw.settingsModal.highQualityPen\\\":\\\"ペンできれいに描画する\\\",\\\"tw.settingsModal.highQualityPenHelp\\\":\\\"ペンのプロジェクトをより高い解像度でレンダリングする代わりに、エディタでの座標丸めを一部無効にします。全てのプロジェクトでこの設定が有効とはいえず、パフォーマンスに影響を与えることがあります。\\\",\\\"tw.settingsModal.infiniteClones\\\":\\\"クローンの制限を解除\\\",\\\"tw.settingsModal.infiniteClonesHelp\\\":\\\"Scratchの、クローンが300個までしか作れない制限を解除します。\\\",\\\"tw.settingsModal.interpolation\\\":\\\"補完機能\\\",\\\"tw.settingsModal.interpolationHelp\\\":\\\"スプライトの動きを補間することで、プロジェクトをより滑らかに見せます。この機能は、3Dのプロジェクト、レイトレーサー、ペンを使ったプロジェクトや、重いプロジェクトには使用しないでください。スムーズではなくなり、動作が遅くなります。\\\",\\\"tw.settingsModal.largeStageWarning\\\":\\\"ステージのサイズを大きくすることはおすすめできません。その代わり、同じアスペクト比の小さなサイズを使用し、フルスクリーンにすることでお使いのディスプレイの大きさに合わせてください。\\\",\\\"tw.settingsModal.removeFencing\\\":\\\"動く範囲と大きさの制限を解除する\\\",\\\"tw.settingsModal.removeFencingHelp\\\":\\\"スプライトを画面の外へ移動させたり、好きなだけ大きさを変えたり、触れたブロックを画面外で作動させたりすることができます。\\\",\\\"tw.settingsModal.removeLimits\\\":\\\"制限を解除する\\\",\\\"tw.settingsModal.removeMiscLimits\\\":\\\"その他の制限を解除\\\",\\\"tw.settingsModal.removeMiscLimitsHelp\\\":\\\"効果音の制限とペンの大きさの制限を解除する\\\",\\\"tw.settingsModal.storeProjectOptions\\\":\\\"高度な設定を保存する\\\",\\\"tw.settingsModal.storeProjectOptionsHelp\\\":\\\"選択した設定をプロジェクトに保存し、TurboWarpがこのプロジェクトを読み込んだときに自動的に適用されるようにします。Warpタイマーとコンパイラの無効化の設定は保存されません。\\\",\\\"tw.settingsModal.title\\\":\\\"高度な設定\\\",\\\"tw.settingsModal.warpTimer\\\":\\\"Warpタイマー\\\",\\\"tw.settingsModal.warpTimerHelp\\\":\\\"スクリプトが長いループや無限ループに陥っているかどうかをチェックし、ループが終了するまで動けないのを避け、低いフレームレートで実行するようにします。これにより、ほとんどのクラッシュが修正されます。しかし、パフォーマンスへの影響が大きいため、デフォルトではエディタでのみ有効になっています。\\\",\\\"tw.soundEditorNotSupported\\\":\\\"このブラウザではサウンドエディタがサポートされていません。\\\",\\\"tw.spriteSelectorItem.rename\\\":\\\"名前を変える\\\",\\\"tw.stageHeader.full\\\":\\\"フルステージに切り替える\\\",\\\"tw.stereo\\\":\\\"ステレオ録音\\\",\\\"tw.stereoAlert\\\":\\\"このステレオサウンドを編集すると、不可逆的にモノラルに変換されます。\\\",\\\"tw.studioview.error\\\":\\\"プロジェクトを次のページで読み込む際にエラーが発生しました。\\\",\\\"tw.tooLarge\\\":\\\"この音は大きすぎてスクラッチにアップロードできないかもしれません。\\\",\\\"tw.twExtension.description\\\":\\\"不思議な新しいブロック\\\",\\\"tw.twExtension.name\\\":\\\"{APP_NAME}ブロック\\\",\\\"tw.unfavorite\\\":\\\"お気に入りを外す\\\",\\\"tw.unknownPlatform.1\\\":\\\"このプロジェクトは別のプラットフォーム向けに作成されました:\\\",\\\"tw.unknownPlatform.2\\\":\\\"{APP_NAME}との互換性はありません。リスクがあることを理解した上で、続けることはできますが、不具合が発生した場合、サポートを受けられない場合があります。\\\",\\\"tw.unknownPlatform.continue\\\":\\\"理解しました\\\",\\\"tw.unknownPlatform.title\\\":\\\"不明なプラットフォーム\\\",\\\"tw.unshared.2\\\":\\\"詳しくはこちらをご覧ください: {link}\\\",\\\"tw.unshared.bug\\\":\\\"このプロジェクトが共有済みにも関わらず読み込めない場合は不具合報告をお願いします。\\\",\\\"tw.unshared.cache\\\":\\\"プロジェクトが最近共有された場合、このメッセージは数分間誤って表示される可能性があります。\\\",\\\"tw.unshared2.1\\\":\\\"非共有のプロジェクトは表示されません。\\\",\\\"tw.usernameModal.help\\\":\\\"この名前は、ブラウザのストレージに保存されます。クラウド変数を含むプロジェクトを見る際に記録されることがあります。\\\",\\\"tw.usernameModal.help2\\\":\\\"有効なScratchのアカウント名に対応していないと、通常はクラウド変数サーバに拒否されます。そのままにしておくか、Scratchのユーザー名に変えることをおすすめします。\\\",\\\"tw.usernameModal.mustChange\\\":\\\"申し訳ありませんが、あなたのユーザー名は適切でない可能性があります。他のユーザー名に変更するか、{resetIt}をしてください。\\\",\\\"tw.usernameModal.mustChange.resetIt\\\":\\\"リセット(おすすめ)\\\",\\\"tw.usernameModal.new\\\":\\\"新しいユーザー名:\\\",\\\"tw.usernameModal.reset\\\":\\\"リセット\\\",\\\"tw.usernameModal.title\\\":\\\"ユーザー名を変える\\\",\\\"tw.usesCloudVariables\\\":\\\"このプロジェクトはクラウド変数を使っています。\\\",\\\"tw.usesCloudVariables2\\\":\\\"{APP_NAME}のクラウド変数はScratchとは接続されていません。\\\\n誰でも{changeTheirUsername}して何でも入力することができるので、気をつけてください。\\\",\\\"tw.usesCloudVariables2.change\\\":\\\"ユーザー名を変更\\\",\\\"tw.viewFeaturedProjects\\\":\\\"クリックしてプロジェクトの特集を見る。\\\",\\\"tw.viewOnScratch\\\":\\\"Scratchでプロジェクトを見る\\\"},\\\"ja-hira\\\":{\\\"tw.alerts.creatingRestorePoint\\\":\\\"ふくげんしています…\\\",\\\"tw.alerts.savedToDisk\\\":\\\"コンピューターに保存(ほぞん)する\\\",\\\"tw.backpack.rename\\\":\\\"あたらしいなまえ : \\\",\\\"tw.blocks.addons\\\":\\\"アドオン\\\",\\\"tw.blocks.buttonIsDown\\\":\\\"マウスの[MOUSE_BUTTON]がおされた\\\",\\\"tw.blocks.lastKeyPressed\\\":\\\"さいごにおされたキー\\\",\\\"tw.blocks.mouseButton.middle\\\":\\\"(1)ホイール\\\",\\\"tw.blocks.mouseButton.primary\\\":\\\"(0)ひだりボタン\\\",\\\"tw.blocks.mouseButton.secondary\\\":\\\"(2)みぎボタン\\\",\\\"tw.blocks.openDocs\\\":\\\"ドキュメントをひらく\\\",\\\"tw.changeUsername.cannotChangeWhileRunning\\\":\\\"ユーザーめいはプロジェクトを実行中(じっこうちゅう)にかえることはできません。\\\",\\\"tw.code\\\":\\\"ソースコード\\\",\\\"tw.customExtension.name\\\":\\\"カスタムかくちょうきのう\\\",\\\"tw.featuredProjectsStudio\\\":\\\"Scratchのスタジオでみる。\\\",\\\"tw.feedback\\\":\\\"フィードバックとバグ\\\",\\\"tw.footer.credits\\\":\\\"クレジット\\\",\\\"tw.footer.embed\\\":\\\"うめこみコード\\\",\\\"tw.footer.parameters\\\":\\\"URLパラメーター\\\",\\\"tw.gui.crashMessage.description\\\":\\\"もうしわけありませんが、ページがクラッシュしたようです。ページをもういちどよみこんでください。\\\",\\\"tw.gui.defaultProjectTitle\\\":\\\"プロジェクト\\\",\\\"tw.guiDefaultTitle\\\":\\\"Scratchのプロジェクトをはやくうごかす\\\",\\\"tw.home.credit\\\":\\\"メモとクレジット\\\",\\\"tw.home.instructions\\\":\\\"つかいかた\\\",\\\"tw.input.tooltip\\\":\\\"ScratchのプロジェクトのURLをコピー&ペーストしてみることができます\\\",\\\"tw.interpolationEnabled\\\":\\\"ほかんきのう\\\",\\\"tw.invalidParameters.clones\\\":\\\"「クローン」のURLパラメーターが無効(むこう)です\\\",\\\"tw.invalidParameters.fps\\\":\\\"「FPS」のURLパラメーターが無効(むこう)です\\\",\\\"tw.invalidProject.title\\\":\\\"エラー\\\",\\\"tw.loader.downloadingAssets\\\":\\\"{total}つのうち{complete}つダウンロードをかんりょう…\\\",\\\"tw.loader.projectData\\\":\\\"プロジェクトをよみこみちゅう…\\\",\\\"tw.menuBar.60off\\\":\\\"60FPSモードをかいじょする\\\",\\\"tw.menuBar.60on\\\":\\\"60FPSモードにする\\\",\\\"tw.menuBar.addons\\\":\\\"アドオン\\\",\\\"tw.menuBar.advanced\\\":\\\"こうどなせってい\\\",\\\"tw.menuBar.changeUsername\\\":\\\"ユーザーめいをかえる\\\",\\\"tw.menuBar.cloudOff\\\":\\\"クラウドへんすうをむこうにする\\\",\\\"tw.menuBar.cloudOn\\\":\\\"クラウドへんすうをゆうこうにする\\\",\\\"tw.menuBar.cloudUnavailable\\\":\\\"クラウドへんすうはつかえません\\\",\\\"tw.menuBar.desktopSettings\\\":\\\"デスクトップのせってい\\\",\\\"tw.menuBar.moreSettings\\\":\\\"こうどなせってい\\\",\\\"tw.menuBar.newFramerate\\\":\\\"あたらしいフレームレート:\\\",\\\"tw.menuBar.package\\\":\\\"プロジェクトをパッケージにする\\\",\\\"tw.menuBar.reportError2\\\":\\\"これはバグです。ほうこくしてください。\\\",\\\"tw.menuBar.saveAs\\\":\\\"{file}としてほぞんする\\\",\\\"tw.menuBar.seeInside\\\":\\\"なかをみる\\\",\\\"tw.mono\\\":\\\"モノラル\\\",\\\"tw.oldDownload\\\":\\\"べつのファイルでほぞんする...\\\",\\\"tw.opcode.mousex\\\":\\\"マウス x\\\",\\\"tw.opcode.mousey\\\":\\\"マウス y\\\",\\\"tw.paint.alpha\\\":\\\"とうめいど\\\",\\\"tw.privacy\\\":\\\"プライバシーポリシー\\\",\\\"tw.saveAs\\\":\\\"…としてほぞんする\\\",\\\"tw.saveTo\\\":\\\"{file}にほぞんする\\\",\\\"tw.settingsModal.customStageSize\\\":\\\"ステージのおおきさをかえる:\\\",\\\"tw.settingsModal.dangerZone\\\":\\\"危険区域(きけんくいき)\\\",\\\"tw.settingsModal.disableCompiler\\\":\\\"コンパイラをつかわない\\\",\\\"tw.settingsModal.featured\\\":\\\"おすすめ\\\",\\\"tw.settingsModal.fps\\\":\\\"60 FPS (カスタム FPS)\\\",\\\"tw.settingsModal.fpsHelp\\\":\\\"通常(つうじょう)FPSが30のところ、60でスクリプトをうごかします。この機能(きのう)を有効(ゆうこう)にすると、ほとんどのプロジェクトがただしく動作(どうさ)しません。そのような場合(ばあい)は、この機能(きのう)を無効(むこう)にして「ほかんきのう」をためしてください。{customFramerate}\\\",\\\"tw.settingsModal.fpsHelp.customFramerate\\\":\\\"クリックして30または60いがいのFPSにせっていする\\\",\\\"tw.settingsModal.help\\\":\\\"クリックしてヘルプ\\\",\\\"tw.settingsModal.highQualityPen\\\":\\\"ペンできれいにびょうがする\\\",\\\"tw.settingsModal.highQualityPenHelp\\\":\\\"ペンのプロジェクトをよりたかい解像度(かいぞうど)でレンダリングするかわりに、エディタでのの座標(ざひょう)まるめを一部無効(いちぶむこう)にします。すべてのプロジェクトでこの設定(せってい)が有効(ゆうこう)とはいえず、パフォーマンスに影響(えいきょう)をあたえることがあります。\\\",\\\"tw.settingsModal.infiniteClones\\\":\\\"クローンの制限(せいげん)を解除(かいじょ)\\\",\\\"tw.settingsModal.infiniteClonesHelp\\\":\\\"Scratchの、クローンが300こまでしかつくれない制限(せいげん)を解除(かいじょ)します。\\\",\\\"tw.settingsModal.interpolation\\\":\\\"ほかんきのう\\\",\\\"tw.settingsModal.interpolationHelp\\\":\\\"スプライトのうごきを補間(ほかん)することで、プロジェクトをよりなめらかにします。このきのうは、3Dのプロジェクト、レイトレーサー、ペンをつかったプロジェクトや、おもいプロジェクトにはつかわないでください。うごきがおそくなります。\\\",\\\"tw.settingsModal.removeFencing\\\":\\\"うごく範囲(はんい)とおおきさの制限(せいげん)を解除(かいじょ)する\\\",\\\"tw.settingsModal.removeFencingHelp\\\":\\\"スプライトを画面(がめん)の外(そと)へ移動(いどう)させたり、すきなだけおおきさをかえたり、ふれたブロックを画面外(がめんがい)でうごかしたりすることができます。\\\",\\\"tw.settingsModal.removeLimits\\\":\\\"せいげんをなくす\\\",\\\"tw.settingsModal.removeMiscLimits\\\":\\\"そのほかのせいげんをなくす\\\",\\\"tw.settingsModal.removeMiscLimitsHelp\\\":\\\"効果音(こうかおん)の制限(せいげん)とペンのおおきさの制限(せいげん)を解除(かいじょ)する\\\",\\\"tw.settingsModal.storeProjectOptions\\\":\\\"こうどなせっていをほぞんする\\\",\\\"tw.settingsModal.title\\\":\\\"こうどなせってい\\\",\\\"tw.settingsModal.warpTimer\\\":\\\"Warpタイマー\\\",\\\"tw.settingsModal.warpTimerHelp\\\":\\\"スクリプトがながいループや無限(むげん)ループにおちいっているかどうかをチェックし、ループが終了(しゅうりょう)するまでうごけないのをさけ、ひくいフレームレートで実行(じっこう)するようにします。これにより、ほとんどのクラッシュが修正(しゅうせい)されます。しかし、パフォーマンスへの影響(えいきょう)がおおきいため、デフォルトではエディタでのみ有効(ゆうこう)になっています。\\\",\\\"tw.spriteSelectorItem.rename\\\":\\\"なまえをかえる\\\",\\\"tw.stereo\\\":\\\"ステレオ\\\",\\\"tw.studioview.error\\\":\\\"プロジェクトをつぎのページでよみこむときにエラーが発生(はっせい)しました。\\\",\\\"tw.twExtension.description\\\":\\\"ふしぎなあたらしいブロック\\\",\\\"tw.usernameModal.mustChange\\\":\\\"もうしわけありません、あなたのユーザーめいが安全(あんぜん)でない可能性(かのうせい)があります。ほかのユーザーめいに変更(へんこう)するか、{resetIt}をしてください。\\\",\\\"tw.usernameModal.mustChange.resetIt\\\":\\\"リセット(おすすめ)\\\",\\\"tw.usernameModal.new\\\":\\\"あたらしいゆーざーめい:\\\",\\\"tw.usernameModal.reset\\\":\\\"リセット\\\",\\\"tw.usernameModal.title\\\":\\\"ユーザーめいをかえる\\\",\\\"tw.viewFeaturedProjects\\\":\\\"クリックしてプロジェクトの特集(とくしゅう)をみる。\\\",\\\"tw.viewOnScratch\\\":\\\"Scratchでプロジェクトをみる\\\"},\\\"ko\\\":{\\\"tw.accent.blue\\\":\\\"푸른색\\\",\\\"tw.accent.purple\\\":\\\"보라색\\\",\\\"tw.accent.rainbow\\\":\\\"무지개색\\\",\\\"tw.accent.red\\\":\\\"붉은색\\\",\\\"tw.alerts.creatingRestorePoint\\\":\\\"복원 지점 생성 중...\\\",\\\"tw.alerts.lostPeripheralConnection\\\":\\\"{extensionName} 확장 기능과 연결이 끊어졌습니다.\\\",\\\"tw.alerts.restorePointError\\\":\\\"복원 지점을 생성할 수 없습니다.\\\",\\\"tw.alerts.restorePointSuccess\\\":\\\"\\\\\\\"파일\\\\\\\" 탭에 복원 지점이 생성되었습니다\\\",\\\"tw.alerts.savedToDisk\\\":\\\"컴퓨터에 저장되었습니다.\\\",\\\"tw.backpack.rename\\\":\\\"새로운 이름:\\\",\\\"tw.blockColors.custom\\\":\\\"애드온 설정에서 사용자 지정하기\\\",\\\"tw.blockColors.dark\\\":\\\"다크 (베타)\\\",\\\"tw.blockColors.highContrast\\\":\\\"고대비\\\",\\\"tw.blockColors.three\\\":\\\"기본\\\",\\\"tw.blocks.PROCEDURES_DOCS\\\":\\\"반환을 사용하는 방법\\\",\\\"tw.blocks.PROCEDURES_RETURN\\\":\\\"{v} 반환하기\\\",\\\"tw.blocks.PROCEDURES_TO_REPORTER\\\":\\\"리포터 블록으로 변경하기\\\",\\\"tw.blocks.PROCEDURES_TO_STATEMENT\\\":\\\"커맨드 블록으로 변경하기\\\",\\\"tw.blocks.addons\\\":\\\"애드온\\\",\\\"tw.blocks.buttonIsDown\\\":\\\"[MOUSE_BUTTON]마우스 버튼을 눌렀는가?\\\",\\\"tw.blocks.lastKeyPressed\\\":\\\"마지막으로 눌린 키\\\",\\\"tw.blocks.mouseButton.middle\\\":\\\"(1) 가운데\\\",\\\"tw.blocks.mouseButton.primary\\\":\\\"(0) 왼쪽\\\",\\\"tw.blocks.mouseButton.secondary\\\":\\\"(2) 오른쪽\\\",\\\"tw.blocks.openDocs\\\":\\\"문서 열기\\\",\\\"tw.browserModal.desktopSettings\\\":\\\"데스크톱 설정 열기\\\",\\\"tw.cantUseCloud\\\":\\\"클라우드 변수를 생성할 수는 있으나, 해당 프로젝트가 Scratch에 업로드 하거나, {packager}와 같은 도구를 통해 변환하지 않는 한 클라우드 변수는 작동하지 않습니다.\\\",\\\"tw.changeUsername.cannotChangeWhileRunning\\\":\\\"'사용자 이름'은 프로젝트가 실행되는 동안 변경할 수 없습니다.\\\",\\\"tw.clipboard.danger\\\":\\\"클립보드에 비밀번호와 같은 민감한 정보가 포함되어 있을 경우, 프로젝트에 의해 해당 정보가 다른 사용자 또는 서버와 공유될 수 있습니다.\\\",\\\"tw.clipboard.permission\\\":\\\"일부 브라우저에서는 클립보드에 접근이 불가능할 수 있습니다. 권한을 허용할 경우, 추가적인 클립보드 읽기 요청이 자동으로 허용됩니다.\\\",\\\"tw.clipboard.title\\\":\\\"프로젝트가 클립보드의 데이터 읽기 권한을 요청합니다.\\\",\\\"tw.cloudProvider\\\":\\\"서버 제공자 : {name}\\\",\\\"tw.cloudServers\\\":\\\"거주지 근처에 있는 서버를 선택하세요 :\\\",\\\"tw.code\\\":\\\"소스코드\\\",\\\"tw.confirmIncompatibleExtension\\\":\\\"이 확장 기능은 스크래치와 호환되지 않습니다.\\\\n해당 확장 기능을 활성화할 경우 프로젝트가 스크래치 웹사이트에 업로드되지 않을 수 있습니다. 계속하시겠습니까?\\\",\\\"tw.createdBy\\\":\\\"제작자 : \\\",\\\"tw.customCloudServer\\\":\\\"사용자 지정 클라우드 변수 서버 사용 중 : {server}\\\",\\\"tw.customExtension.description\\\":\\\"사용자 지정 확장 기능을 URL, 파일 또는 JavaScript 소스코드를 통해 불러옵니다.\\\",\\\"tw.customExtension.name\\\":\\\"사용자 지정 확장 기능\\\",\\\"tw.customExtensionModal.file\\\":\\\"파일\\\",\\\"tw.customExtensionModal.load\\\":\\\"불러오기\\\",\\\"tw.customExtensionModal.promptFile\\\":\\\"JavaScript 파일을 선택하거나 끌어다 놓으세요 :\\\",\\\"tw.customExtensionModal.promptText\\\":\\\"확장 기능의 JavaScript 소스코드를 붙여넣기 하세요 : \\\",\\\"tw.customExtensionModal.promptURL\\\":\\\"확장 기능의 URL을 입력하세요 : \\\",\\\"tw.customExtensionModal.text\\\":\\\"텍스트\\\",\\\"tw.customExtensionModal.title\\\":\\\"사용자 지정 확장 기능 불러오기\\\",\\\"tw.customExtensionModal.trusted\\\":\\\"해당 확장 기능은 신뢰할 수 있는 공급원으로부터 제공받아, 샌드박스하지 않고 불러옵니다.\\\",\\\"tw.customExtensionModal.unsandboxed\\\":\\\"샌드박스하지 않고 실행하기\\\",\\\"tw.customExtensionModal.unsandboxedWarning1\\\":\\\"확장 기능을 샌드박스하지 않고 불러오는 것은 위험하므로, 이로 인한 영향을 명확히 인지하지 못할 경우 활성화하지 마시기 바랍니다.\\\",\\\"tw.customExtensionModal.unsandboxedWarning2\\\":\\\"샌드박스하지 않은 확장 기능은 프로젝트를 망치고, 사용자 설정을 삭제하거나, 비밀번호를 유출하는 등의 악의적 행위의 여지가 있습니다.\\\\n{APP_NAME}의 개발자는 해당 문제로 인해 야기되는 결과에 어떤 책임도 지지 않습니다.\\\",\\\"tw.customExtensionModal.untrusted\\\":\\\"신뢰할 수 없는 URL로부터 제공되는 확장 기능은 보안을 위해 항상 샌드박스하여 불러옵니다.\\\",\\\"tw.customReporters.description\\\":\\\"사용자 정의 블록이 값을 출력하거나 입력으로 사용될 수 있도록 합니다.\\\",\\\"tw.customReporters.name\\\":\\\"사용자 정의 리포터 블록\\\",\\\"tw.darkMode\\\":\\\"밝은 화면으로 전환하기\\\",\\\"tw.desktopCloud\\\":\\\"데스크톱 앱의 경우, 클라우드 변수는 컴퓨터 내에서 실행되는 모든 데스크톱 앱 창에서 동기화됩니다. 해당 프로젝트를 스크래치에 업로드하거나, {packager}와 같은 도구를 사용하여 전역적으로 동기화가 가능합니다. \\\",\\\"tw.documentation\\\":\\\"문서\\\",\\\"tw.download.danger\\\":\\\"해당 파일은 {APP_NAME} 개발진에 의해 검수되지 않았습니다.\\\",\\\"tw.download.executable\\\":\\\"해당 파일은 실행 파일이므로 악의적인 코드가 실행될 여지가 있습니다.\\\",\\\"tw.download.file\\\":\\\"프로젝트가 사용자의 기기에 파일을 다운로드하기를 요청합니다. 파일은 다운로드 폴더에 {name}(으)로 저장됩니다.\\\",\\\"tw.embed.persistent\\\":\\\"해당 권한을 허용할 경우, 현재 웹사이트에서의 추가적인 임베딩이 자동으로 허용됩니다.\\\",\\\"tw.embed.risks\\\":\\\"임베디드 콘텐츠는 샌드박스되지만, 여전히 사용자 기기의 IP 주소 또는 위치 정보와 같은 기기 정보에 접근할 수 있습니다.\\\",\\\"tw.embed.title1\\\":\\\"프로젝트가 무대에 HTML 콘텐츠를 표시하려고 합니다 :\\\",\\\"tw.embed.title2\\\":\\\"프로젝트가 무대에 원격 콘텐츠를 표시하려고 합니다 :\\\",\\\"tw.extension.faceSensing.description\\\":\\\"카메라로 안면을 인식합니다.\\\",\\\"tw.extension.faceSensing.name\\\":\\\"얼굴 인식\\\",\\\"tw.extensionGallery.error\\\":\\\"확장 기능 갤러리를 불러오는 중 문제가 발생했습니다. extensions.turbowarp.org 에서 더 많은 확장 기능을 찾아보세요.\\\",\\\"tw.extensionGallery.loading\\\":\\\"확장 기능 갤러리를 불러오는 중...\\\",\\\"tw.extensionGallery.more\\\":\\\"extensions.turbowarp.org 에서 확장 기능에 대해 자세히 알아보기\\\",\\\"tw.extensionGallery.name\\\":\\\"{APP_NAME} 확장 기능 갤러리\\\",\\\"tw.favorite\\\":\\\"즐겨찾기\\\",\\\"tw.featuredProjectsStudio\\\":\\\"스크래치 스튜디오에서 특집 프로젝트 목록 보기\\\",\\\"tw.feedback\\\":\\\"문의 및 오류 신고\\\",\\\"tw.feedbackButton\\\":\\\"{APP_NAME} 문의하기\\\",\\\"tw.fetch.title\\\":\\\"프로젝트가 웹사이트 연결을 요청합니다 : \\\",\\\"tw.fileInput.none\\\":\\\"선택된 파일 없음.\\\",\\\"tw.fileInput.selected\\\":\\\"선택된 파일 : {names}\\\",\\\"tw.fonts.add\\\":\\\"추가하기\\\",\\\"tw.fonts.custom.file\\\":\\\"컴퓨터에서 글꼴 파일 선택 : \\\",\\\"tw.fonts.custom.name\\\":\\\"글꼴 이름 지정 : \\\",\\\"tw.fonts.custom1\\\":\\\"파일에서 글꼴 추가\\\",\\\"tw.fonts.custom2\\\":\\\"스크래치에서 호환되지 않는 글꼴 확장자입니다. 지원되는 확장자 : {formats}\\\",\\\"tw.fonts.delete\\\":\\\"정말로 \\\\\\\"{font}\\\\\\\" 폰트를 삭제하시겠습니까? 해당 폰트를 사용하는 모든 벡터 그래픽이 대체 글꼴로 변경됩니다.\\\",\\\"tw.fonts.fallback\\\":\\\"글꼴이 삭제되었거나 불러오는 데 실패했을 경우 사용할 대체 글꼴을 선택하세요.\\\",\\\"tw.fonts.list\\\":\\\"설치된 글꼴 : \\\",\\\"tw.fonts.none\\\":\\\"추가된 글꼴 없음\\\",\\\"tw.fonts.readError\\\":\\\"글꼴 파일 읽기에 실패했습니다 : {error}\\\",\\\"tw.fonts.system\\\":\\\"시스템 글꼴\\\",\\\"tw.fonts.system.name\\\":\\\"컴퓨터에 내장된 사용하려는 글꼴의 이름을 입력하세요. 시스템 글꼴은 일부 사용자에게 올바르게 나타나지 않을 수 있습니다.\\\",\\\"tw.fonts.system1\\\":\\\"시스템 글꼴 추가\\\",\\\"tw.fonts.system2\\\":\\\"스크래치에서 작동할 수 있으나, 일부 사용자에게 올바르게 나타나지 않을 수 있습니다.\\\",\\\"tw.fonts.title\\\":\\\"글꼴\\\",\\\"tw.footer.credits\\\":\\\"도움을 준 사람들\\\",\\\"tw.footer.disclaimer\\\":\\\"{APP_NAME}은(는) 스크래치, 스크래치 팀, 스크래치 재단에 소속되어 있지 않습니다.\\\",\\\"tw.footer.documentation\\\":\\\"문서\\\",\\\"tw.footer.embed\\\":\\\"임베딩\\\",\\\"tw.footer.parameters\\\":\\\"URL 파라미터\\\",\\\"tw.footer.scratchDisclaimer\\\":\\\"스크래치는 스크래치 재단의 프로젝트입니다. {scratchDotOrg} 에서 무료로 사용 가능합니다.\\\",\\\"tw.geolocate.permission\\\":\\\"해당 권한을 허용할 경우, 사용자의 브라우저에 따라 위치 권한을 요청하는 알림이 추가적으로 나타날 수 있습니다.\\\",\\\"tw.geolocate.title\\\":\\\"프로젝트가 사용자의 위치 정보에 접근할 수 있는 권한을 요청합니다.\\\",\\\"tw.gui.crashMessage.description\\\":\\\"페이지에 충돌이 발생했습니다.\\\\n페이지를 새로고침한 후에 다시 시도해 주세요.\\\",\\\"tw.gui.defaultProjectTitle\\\":\\\"프로젝트\\\",\\\"tw.guiDefaultTitle\\\":\\\"스크래치 프로젝트를 더 빠르게 실행하기\\\",\\\"tw.home.credit\\\":\\\"참고사항 및 참여자\\\",\\\"tw.home.description\\\":\\\"{APP_NAME}은(는) 스크래치 프로젝트를 JavaScript로 컴파일하여 매우 빠르게 실행할 수 있도록 해주는 스크래치 기반의 Mod입니다. \\\\n프로젝트 ID 또는 프로젝트 URL을 붙여넣거나, 아래의 특집 프로젝트를 선택해서 실행해 보세요.\\\",\\\"tw.home.instructions\\\":\\\"사용 방법\\\",\\\"tw.input.tooltip\\\":\\\"스크래치 프로젝트 주소를 복사한 후 여기에 붙여넣기 하세요!\\\",\\\"tw.interpolationEnabled\\\":\\\"보간법 활성화\\\",\\\"tw.invalidParameters.clones\\\":\\\"\\\\\\\"clone\\\\\\\" URL 파라미터가 유효하지 않습니다\\\",\\\"tw.invalidParameters.fps\\\":\\\"\\\\\\\"fps\\\\\\\" URL 파라미터가 유효하지 않습니다\\\",\\\"tw.invalidProject.error\\\":\\\"프로젝트를 불러올 수 없습니다 :\\\",\\\"tw.invalidProject.options\\\":\\\"자동 복구 지점 또는 그 외의 백업본을 통해 프로젝트의 이전 버전을 복구할 수 있습니다.\\\",\\\"tw.invalidProject.reportIt\\\":\\\"해당 현상을 제보\\\",\\\"tw.invalidProject.restorePoints\\\":\\\"복원 지점 보기\\\",\\\"tw.invalidProject.title\\\":\\\"오류\\\",\\\"tw.invalidProject.validationError\\\":\\\"해당 오류는 프로젝트의 일부분이 손상되었을 경우 자주 발생하며, 쉽게 복구가 가능합니다. 따라서 {reportIt}해주시기를 부탁드립니다.\\\",\\\"tw.lightMode\\\":\\\"어두운 화면으로 전환하기\\\",\\\"tw.loadExtension.embedded\\\":\\\"프로젝트가 코드를 포함한 사용자 지정 확장 기능 불러오기를 요청합니다 : \\\",\\\"tw.loadExtension.sandboxed\\\":\\\"코드가 샌드박스되지만, 여전히 IP 주소나 위치 정보와 같은 사용자 기기 정보에 접근할 수 있습니다.\\\\n계속하기 전에 해당 확장 기능의 제작자를 신뢰할 수 있는지 확인하세요.\\\",\\\"tw.loadExtension.unsandboxed\\\":\\\"샌드박스하지 않고 실행하기\\\",\\\"tw.loadExtension.unsandboxedWarning\\\":\\\"샌드박스 없이 확장 기능을 불러오는 것은 위험합니다. 이는 프로젝트를 망치고, 사용자 설정이 삭제되거나, 비밀번호가 유출되는 등의 악의적 행위의 여지가 있습니다.\\\\n{APP_NAME}의 개발자는 해당 문제로 인해 야기되는 결과에 어떤 책임도 지지 않습니다.\\\",\\\"tw.loadExtension.url\\\":\\\"프로젝트가 URL로부터 사용자 지정 확장 기능 불러오기를 요구합니다 : \\\",\\\"tw.loader.downloadingAssets\\\":\\\"에셋 다운로드 중... ({complete}/{total})\\\",\\\"tw.loader.loadingAssets\\\":\\\"에셋 불러오기 중... ({complete}/{total})\\\",\\\"tw.loader.projectData\\\":\\\"프로젝트를 불러오는 중...\\\",\\\"tw.menuBar.60off\\\":\\\"60 FPS 모드 비활성화\\\",\\\"tw.menuBar.60on\\\":\\\"60 FPS 모드 활성화\\\",\\\"tw.menuBar.accent\\\":\\\"강조 색상\\\",\\\"tw.menuBar.addons\\\":\\\"애드온\\\",\\\"tw.menuBar.advanced\\\":\\\"고급 설정\\\",\\\"tw.menuBar.blockColors\\\":\\\"블록 색상\\\",\\\"tw.menuBar.changeUsername\\\":\\\"사용자 이름 변경하기\\\",\\\"tw.menuBar.cloudOff\\\":\\\"클라우드 변수 비활성화\\\",\\\"tw.menuBar.cloudOn\\\":\\\"클라우드 변수 활성화\\\",\\\"tw.menuBar.cloudUnavailable\\\":\\\"클라우드 변수를 이용할 수 없습니다\\\",\\\"tw.menuBar.cloudUnavailableAlert\\\":\\\"편집기를 여는 동안 클라우드 변수를 사용할 수 없습니다.\\\",\\\"tw.menuBar.desktopSettings\\\":\\\"데스크톱 설정\\\",\\\"tw.menuBar.moreSettings\\\":\\\"고급 설정\\\",\\\"tw.menuBar.newFramerate\\\":\\\"사용할 FPS:\\\",\\\"tw.menuBar.newWindow\\\":\\\"새 창 열기\\\",\\\"tw.menuBar.package\\\":\\\"프로젝트 패키징하기\\\",\\\"tw.menuBar.reportError1\\\":\\\"일부 스크립트에서 오류가 발생했습니다.\\\",\\\"tw.menuBar.reportError2\\\":\\\"오류가 발생했습니다. 해당 오류를 보고해주시길 부탁드립니다.\\\",\\\"tw.menuBar.restorePoints\\\":\\\"복원 지점\\\",\\\"tw.menuBar.saveAs\\\":\\\"{file}(으)로 저장하기\\\",\\\"tw.menuBar.seeInside\\\":\\\"스크립트 보기\\\",\\\"tw.mono\\\":\\\"모노\\\",\\\"tw.moreCloud\\\":\\\"클라우드 변수에 대해 자세히 알아보기\\\",\\\"tw.notify.permission\\\":\\\"해당 권한을 허용할 경우, 브라우저에서 알림 표시 허용 여부를 묻는 알림 창이 나타날 수 있으며, 추가적인 알림 표시 요청이 자동으로 허용됩니다.\\\",\\\"tw.notify.title\\\":\\\"프로젝트가 알림 표시 권한을 요청합니다.\\\",\\\"tw.oldDownload\\\":\\\"다른 파일로 저장하기\\\",\\\"tw.opcode.2000\\\":\\\"2000년 이후 경과 날짜 수\\\",\\\"tw.opcode.mousedown\\\":\\\"마우스가 눌렸는가?\\\",\\\"tw.opcode.mousex\\\":\\\"마우스 x좌표\\\",\\\"tw.opcode.mousey\\\":\\\"마우스 y좌표\\\",\\\"tw.openAdvanced\\\":\\\"고급 설정 열기\\\",\\\"tw.openWindow.dangerous\\\":\\\"해당 웹사이트는 {APP_NAME}의 개발자에 의해 보고된 웹사이트가 아니며, 위험하거나 악의적인 코드를 포함할 여지가 있습니다.\\\",\\\"tw.openWindow.title\\\":\\\"프로젝트가 다음 URL을 새 창이나 탭에서 열기를 요청합니다 : \\\",\\\"tw.paint.alpha\\\":\\\"불투명도\\\",\\\"tw.paint.fonts.more\\\":\\\"글꼴 추가...\\\",\\\"tw.pen.stageSelected\\\":\\\"무대 선택됨: 펜 블록 일부 지원\\\",\\\"tw.privacy\\\":\\\"개인정보 보호 정책\\\",\\\"tw.recordAudio.permission\\\":\\\"해당 권한을 허용할 경우, 브라우저에서 마이크 접근 허용 여부를 묻는 알림 창이 나타날 수 있으며, 추가적인 마이크 접근 요청이 자동으로 허용됩니다.\\\",\\\"tw.recordAudio.title\\\":\\\"프로젝트가 사용자의 마이크를 통한 오디오 녹음 권한을 요청합니다. 여기에는 텍스트 변환 음성이나 원시 오디오 데이터가 포함됩니다.\\\\n녹음된 오디오는 프로젝트에 의해 다른 사용자 또는 서버와 공유될 수 있습니다.\\\",\\\"tw.recordVideo.permission\\\":\\\"해당 권한을 허용할 경우, 브라우저에서 카메라 접근 허용 여부를 묻는 알림 창이 나타날 수 있으며, 추가적인 카메라 접근 요청이 자동으로 허용됩니다.\\\",\\\"tw.recordVideo.title\\\":\\\"프로젝트가 사용자의 카메라를 통한 비디오 녹화 권한을 요청합니다.\\\\n녹화된 데이터는 프로젝트에 의해 다른 사용자 또는 서버와 공유될 수 있습니다.\\\",\\\"tw.redirect.dangerous\\\":\\\"해당 웹사이트는 {APP_NAME}의 개발자가 검수한 웹사이트가 아니며, 위험하거나 악의적인 코드를 포함할 여지가 있습니다.\\\",\\\"tw.redirect.title\\\":\\\"프로젝트가 해당 탭을 다음의 URL로 전환하기를 요청합니다 : \\\",\\\"tw.removedTrademarks\\\":\\\"일부 스크래치 상표를 포함하는 모양들은 제외되었습니다.\\\",\\\"tw.restorePoints.1minute\\\":\\\"1분\\\",\\\"tw.restorePoints.assets\\\":\\\"{n} 에셋\\\",\\\"tw.restorePoints.confirmDelete\\\":\\\"정말로 \\\\\\\"{projectTitle}\\\\\\\" 프로젝트를 삭제하시겠습니까?\\\\n이 작업은 되돌릴 수 없습니다.\\\",\\\"tw.restorePoints.confirmDeleteAll\\\":\\\"정말로 모든 복원 지점을 삭제하시겠습니까?\\\\n이 작업은 되돌릴 수 없습니다.\\\",\\\"tw.restorePoints.confirmLoad\\\":\\\"저장되지 않은 변경 사항이 있습니다. 현재 프로젝트에 덮어쓰기 하시겠습니까?\\\",\\\"tw.restorePoints.deleteAll\\\":\\\"모든 복원 지점 삭제하기\\\",\\\"tw.restorePoints.description\\\":\\\"{APP_NAME}에서는 사용자가 프로젝트를 저장하지 않고 종료할 시를 대비해 주기적으로 복원 지점을 생성합니다.\\\\n해당 기능은 프로젝트를 복구하기 위한 최후의 수단입니다. 저장된 복원 지점은 언제든지 기기의 시스템에 의해 자동으로 삭제될 수 있으므로 절대로 해당 기능에 의존하지 마십시오.\\\",\\\"tw.restorePoints.empty\\\":\\\"복원 지점을 찾을 수 없습니다.\\\",\\\"tw.restorePoints.error\\\":\\\"복원 지점을 불러오는 중 문제가 발생했습니다 : {error}\\\",\\\"tw.restorePoints.exportError\\\":\\\"복원 지점 내보내기 중 오류가 발생했습니다: {error}\\\",\\\"tw.restorePoints.intervalOption\\\":\\\"복원 지점이 {time} 간격으로 생성됩니다.\\\",\\\"tw.restorePoints.loading\\\":\\\"불러오는 중...\\\",\\\"tw.restorePoints.minutes\\\":\\\"{n}분\\\",\\\"tw.restorePoints.never\\\":\\\"없음\\\",\\\"tw.restorePoints.off\\\":\\\"복원 지점을 비활성화하는 것은 위험합니다.\\\",\\\"tw.restorePoints.size\\\":\\\"예상 저장 공간 사용량 : {size}\\\",\\\"tw.restorePoints.size2\\\":\\\"다중 복원 지점에서 사용되는 모양 및 소리 리소스는 한 번만 저장되어 공간을 절약합니다.\\\",\\\"tw.restorePoints.title\\\":\\\"복원 지점\\\",\\\"tw.sample\\\":\\\"예제 프로젝트\\\",\\\"tw.saveAs\\\":\\\"다른 이름으로 저장하기\\\",\\\"tw.saveTo\\\":\\\"{file}(으)로 저장하기\\\",\\\"tw.scratchUnsafeCloud\\\":\\\"만약 이 클라우드 변수를 생성할 경우, 해당 프로젝트는 최대 {number}개인 클라우드 변수의 개수 제한을 초과하게 됩니다.\\\\n이 경우 해당 프로젝트를 Scratch에 업로드할 때, 일부 변수가 정상적으로 작동하지 않을 수 있습니다.\\\",\\\"tw.securityManager.allow\\\":\\\"허용\\\",\\\"tw.securityManager.deny\\\":\\\"거부\\\",\\\"tw.securityManager.title\\\":\\\"확장 기능 보안\\\",\\\"tw.securityManager.trust\\\":\\\"해당 권한을 허용할 경우, 현재 웹사이트에서의 추가적인 요청이 자동으로 허용됩니다.\\\",\\\"tw.securityManager.why\\\":\\\"해당 권한은 이미지 또는 소리 파일 다운로드, 멀티플레이어 구현, API 액세스를 위해 사용될 수 있지만 타인에 의해 악용될 수도 있습니다. 권한을 허용할 시에 내 컴퓨터의 IP 주소, 위치 정보 및 기타 정보를 공유합니다.\\\",\\\"tw.settingsModal.customStageSize\\\":\\\"사용자 지정 무대 크기\\\",\\\"tw.settingsModal.customStageSizeHelp\\\":\\\"무대 크기를 480x360이 아닌 다른 크기로 바꿉니다.\\\\n와이드스크린(16:9) 화면비의 경우 640x360을 추천합니다. 다만 대부분 올바르게 작동하지 않습니다.\\\",\\\"tw.settingsModal.dangerZone\\\":\\\"위험한 기능\\\",\\\"tw.settingsModal.disableCompiler\\\":\\\"컴파일러 비활성화\\\",\\\"tw.settingsModal.disableCompilerHelp\\\":\\\"{APP_NAME} 컴파일러를 비활성화합니다.\\\\n프로젝트 실행 도중에 스크립트의 수정 사항이 즉각적으로 반영되는 것을 원하는 경우가 아니라면, 컴파일러를 비활성화하지 마시기 바랍니다.\\\",\\\"tw.settingsModal.featured\\\":\\\"추천 기능\\\",\\\"tw.settingsModal.fps\\\":\\\"60 FPS (또는 사용자 지정 FPS) 활성화\\\",\\\"tw.settingsModal.fpsHelp\\\":\\\"스크립트를 초당 30회로 실행하는 대신 초당 60회 실행합니다. 대부분의 프로젝트는 이 기능이 활성화된 상태에서 제대로 작동하지 않으며, 이 같은 경우에는 60 FPS모드 대신 보간법을 사용해야 합니다. {customFramerate}\\\",\\\"tw.settingsModal.fpsHelp.customFramerate\\\":\\\"FPS 사용자 정의하기\\\",\\\"tw.settingsModal.help\\\":\\\"클릭하여 도움말 열기\\\",\\\"tw.settingsModal.highQualityPen\\\":\\\"고품질 펜 활성화\\\",\\\"tw.settingsModal.highQualityPenHelp\\\":\\\"펜 중심의 프로젝트를 보다 높은 해상도로 렌더링하고, 편집기에서 적용되는 일부 좌표의 소수점 반올림을 비활성화합니다. 이 옵션은 모든 프로젝트에 이롭지는 않으며 성능에 영향을 미칠 수 있습니다.\\\",\\\"tw.settingsModal.infiniteClones\\\":\\\"무제한 복제본 활성화\\\",\\\"tw.settingsModal.infiniteClonesHelp\\\":\\\"스크래치의 300개 복제본 제한을 비활성화합니다.\\\",\\\"tw.settingsModal.interpolation\\\":\\\"보간법 활성화\\\",\\\"tw.settingsModal.interpolationHelp\\\":\\\"스프라이트의 움직임을 보간해 프로젝트의 동작을 더 부드럽게 만듭니다. 보간법은 3D 프로젝트, 레이트레이싱 프로젝트, 펜 중심 프로젝트, 버벅임이 심한 프로젝트 등에서 사용할 경우 오히려 프로젝트를 더 느려지게 만들 수 있습니다.\\\",\\\"tw.settingsModal.largeStageWarning\\\":\\\"사용자 지정 무대의 크기가 너무 큽니다!\\\\n더 작은 크기의 동일한 화면비를 가진 사용자 지정 무대를 설정하고, 풀스크린 모드로 전환하여 화면이 자동으로 업스케일되도록 하는 것을 권장합니다.\\\",\\\"tw.settingsModal.removeFencing\\\":\\\"무대 밖 동작 활성화\\\",\\\"tw.settingsModal.removeFencingHelp\\\":\\\"스프라이트가 화면 밖으로 나갈 수 있도록 하거나, 스프라이트가 원하는 만큼 커지거나 작아질 수 있도록 하거나, 충돌 감지 블록이 화면 밖에서도 작동할 수 있도록 합니다.\\\",\\\"tw.settingsModal.removeLimits\\\":\\\"제한 해제\\\",\\\"tw.settingsModal.removeMiscLimits\\\":\\\"기타 제한 비활성화\\\",\\\"tw.settingsModal.removeMiscLimitsHelp\\\":\\\"이미지 효과 제한과 펜 굵기 제한을 제거합니다.\\\",\\\"tw.settingsModal.storeProjectOptions\\\":\\\"프로젝트에 고급 설정 저장하기\\\",\\\"tw.settingsModal.storeProjectOptionsHelp\\\":\\\"TurboWarp가 이 프로젝트를 불러올 때 현재 설정이 자동으로 적용되도록 고급 설정을 프로젝트에 저장합니다.\\\\n'워프 타이머 활성화'와 '컴파일러 비활성화'는 저장되지 않습니다.\\\",\\\"tw.settingsModal.title\\\":\\\"고급 설정\\\",\\\"tw.settingsModal.warpTimer\\\":\\\"워프 타이머 활성화\\\",\\\"tw.settingsModal.warpTimerHelp\\\":\\\"스크립트가 긴 반복문 또는 무한 반복문에 갇힌 경우, 반복문이 끝날 때까지 코드가 멈춰 있지 않고 낮은 프레임에서 실행되고 있는지 확인합니다.\\\\n이 기능은 대부분의 충돌을 막을 수 있지만 성능을 확연히 저하시킵니다. 따라서 해당 기능은 편집기에서만 활성화됩니다.\\\",\\\"tw.soundEditorNotSupported\\\":\\\"해당 브라우저에서는 소리 편집기가 지원되지 않습니다.\\\",\\\"tw.spriteSelectorItem.rename\\\":\\\"이름 재설정하기\\\",\\\"tw.stageHeader.full\\\":\\\"전체 화면\\\",\\\"tw.stereo\\\":\\\"스테레오\\\",\\\"tw.stereoAlert\\\":\\\"해당 스테레오 음원을 수정하면 자동으로 모노 음원으로 변환되며, 이 작업은 되돌릴 수 없습니다.\\\",\\\"tw.studioview.authorAttribution\\\":\\\"제작자 : {author}\\\",\\\"tw.studioview.error\\\":\\\"프로젝트의 다음 페이지를 불러오는 도중 오류가 발생했습니다.\\\",\\\"tw.studioview.hoverText\\\":\\\"{author}의 \\\\\\\"{title}\\\\\\\"\\\",\\\"tw.tooLarge\\\":\\\"해당 음원은 파일 용량이 너무 커서 Scratch에 업로드가 불가능할 수 있습니다.\\\",\\\"tw.twExtension.description\\\":\\\"이상하고 새로운 블록들입니다.\\\",\\\"tw.twExtension.name\\\":\\\"{APP_NAME} 블록\\\",\\\"tw.unfavorite\\\":\\\"즐겨찾기 해제\\\",\\\"tw.unknownPlatform.1\\\":\\\"프로젝트가 다른 플랫폼에서 만들어졌습니다:\\\",\\\"tw.unknownPlatform.2\\\":\\\"{APP_NAME}와(과) 호환되지 않습니다. 위험을 감수하고 진행할 수 있으나, 이후 발생하는 어떠한 문제에도 지원을 받을 수 없습니다.\\\",\\\"tw.unknownPlatform.continue\\\":\\\"이해했습니다\\\",\\\"tw.unknownPlatform.title\\\":\\\"알 수 없는 플랫폼\\\",\\\"tw.unshared.2\\\":\\\"더 알아보기를 원하시면, 다음 링크로 접속해 주세요 : {link}\\\",\\\"tw.unshared.bug\\\":\\\"만약 해당 프로젝트가 실제로 공유된 프로젝트인 경우, 오류 신고를 해주실 것을 부탁드립니다.\\\",\\\"tw.unshared.cache\\\":\\\"만약 최근에 공유된 프로젝트일 경우, 이 메시지는 몇 분간 잘못 표시될 수 있습니다.\\\",\\\"tw.unshared2.1\\\":\\\"공유되지 않은 프로젝트는 더 이상 볼 수 없습니다.\\\",\\\"tw.usernameModal.help\\\":\\\"이 값은 브라우저의 저장소에 저장됩니다. 클라우드 변수를 포함하는 프로젝트와 상호 작용할 때 기록될 수 있습니다.\\\",\\\"tw.usernameModal.help2\\\":\\\"Scratch 계정과 일치하지 않는 사용자 이름은 클라우드 변수 서버에서 거부됩니다. 귀하의 Scratch 사용자 이름에 맞게 변경하거나 그대로 두고 변경하지 않는 것을 권장합니다.\\\",\\\"tw.usernameModal.mustChange\\\":\\\"클라우드 변수 서버에서 귀하의 사용자 이름이 안전하지 않다고 판단했습니다. 다른 것으로 변경하거나 {resetIt}해 주세요.\\\",\\\"tw.usernameModal.mustChange.resetIt\\\":\\\"초기화(권장됨)\\\",\\\"tw.usernameModal.new\\\":\\\"새 사용자 이름:\\\",\\\"tw.usernameModal.reset\\\":\\\"초기화하기\\\",\\\"tw.usernameModal.title\\\":\\\"사용자 이름 변경하기\\\",\\\"tw.usesCloudVariables\\\":\\\"해당 프로젝트는 클라우드 변수를 사용합니다.\\\",\\\"tw.usesCloudVariables2\\\":\\\"{APP_NAME} 프로젝트의 클라우드 변수가 스크래치 서버에 연결되지 않았습니다. 모든 사용자가 {changeTheirUsername}을 다른 사용자 이름으로 변경할 수 있으므로 사칭에 주의해야 합니다.\\\",\\\"tw.usesCloudVariables2.change\\\":\\\"자기 자신의 사용자 이름\\\",\\\"tw.viewFeaturedProjects\\\":\\\"클릭하여 특집 프로젝트 보기\\\",\\\"tw.viewOnScratch\\\":\\\"스크래치에서 프로젝트 보기\\\"},\\\"lt\\\":{\\\"tw.alerts.creatingRestorePoint\\\":\\\"Atkuriamas atkūrimo taškas...\\\",\\\"tw.alerts.lostPeripheralConnection\\\":\\\"Prarastas {extensionName} ryšys.\\\",\\\"tw.alerts.savedToDisk\\\":\\\"Išsaugota į jūsų kompiuterį.\\\",\\\"tw.backpack.rename\\\":\\\"Naujas vardas:\\\",\\\"tw.blocks.addons\\\":\\\"Įskiepiai\\\",\\\"tw.blocks.buttonIsDown\\\":\\\"[MOUSE_BUTTON] pelės mygtukas spusteltas?\\\",\\\"tw.blocks.lastKeyPressed\\\":\\\"paskutinis paspaustas mygtukas\\\",\\\"tw.blocks.mouseButton.middle\\\":\\\"(1) vidurys\\\",\\\"tw.blocks.mouseButton.primary\\\":\\\"(0) pagrindinis\\\",\\\"tw.blocks.mouseButton.secondary\\\":\\\"(2) antrasis\\\",\\\"tw.blocks.openDocs\\\":\\\"Atidaryti Dokumentacijas\\\",\\\"tw.changeUsername.cannotChangeWhileRunning\\\":\\\"Naudotojo vardas negali būti pakeistas kol projektas yra paleistas.\\\",\\\"tw.code\\\":\\\"Šaltinio kodas\\\",\\\"tw.confirmIncompatibleExtension\\\":\\\"Šis papildinys nėra suderinamas su Scratch. Projektai sukurti su šiuo papildiniu negali būti įkelti į Scratch svetainę. Ar jūs tikri kad norite jį įjungti?\\\",\\\"tw.customExtension.name\\\":\\\"Pasirinktinis papildinys\\\",\\\"tw.featuredProjectsStudio\\\":\\\"Peržiurėti studiją per Scratch.\\\",\\\"tw.feedback\\\":\\\"Atsiliepimai ir Klaidos\\\",\\\"tw.footer.credits\\\":\\\"Padėkos\\\",\\\"tw.footer.embed\\\":\\\"Įterpimas\\\",\\\"tw.footer.parameters\\\":\\\"URL Parametrai\\\",\\\"tw.gui.crashMessage.description\\\":\\\"Labai atsiprašome, bet atrodo, kad puslapis užstrigo. Prašome perkrauti puslapį ir pabandyti dar kartą.\\\",\\\"tw.gui.defaultProjectTitle\\\":\\\"Projektas\\\",\\\"tw.guiDefaultTitle\\\":\\\"Paleisk Scratch projektus greičiau\\\",\\\"tw.home.credit\\\":\\\"Pastabos ir Padėkos\\\",\\\"tw.home.instructions\\\":\\\"Instrukcijos\\\",\\\"tw.input.tooltip\\\":\\\"Nukopijuokite ir įklijuokite Scratch projekto nuorodą čia!\\\",\\\"tw.interpolationEnabled\\\":\\\"Interpoliacija\\\",\\\"tw.invalidParameters.clones\\\":\\\"\\\\\\\"klono\\\\\\\" URL parametras yra neteisingas\\\",\\\"tw.invalidParameters.fps\\\":\\\"\\\\\\\"fps\\\\\\\" URL parametras yra neteisingas\\\",\\\"tw.invalidProject.title\\\":\\\"Klaida\\\",\\\"tw.loader.downloadingAssets\\\":\\\"atsisiunčiami duomenys ({complete}/{total}) ...\\\",\\\"tw.loader.projectData\\\":\\\"Projektas kraunamas...\\\",\\\"tw.menuBar.60off\\\":\\\"Išjungti 60 FPS režimą\\\",\\\"tw.menuBar.60on\\\":\\\"Įjungti 60 FPS režimą\\\",\\\"tw.menuBar.addons\\\":\\\"Įskiepiai\\\",\\\"tw.menuBar.advanced\\\":\\\"Išplėstiniai\\\",\\\"tw.menuBar.changeUsername\\\":\\\"Pakeisti Naudotojo vardą\\\",\\\"tw.menuBar.cloudOff\\\":\\\"Išjungti Debesies kintamuosius\\\",\\\"tw.menuBar.cloudOn\\\":\\\"Įjungti debesies kintamuosius\\\",\\\"tw.menuBar.cloudUnavailable\\\":\\\"Debesies kintamieji nepasiekiami\\\",\\\"tw.menuBar.cloudUnavailableAlert\\\":\\\"Negalite naudotis debesies kintamaisiais, tikriausia kad jūs įjungėte redaguotoją.\\\",\\\"tw.menuBar.desktopSettings\\\":\\\"Darbalaukio nustatymai\\\",\\\"tw.menuBar.moreSettings\\\":\\\"Išplėstiniai nustatymai\\\",\\\"tw.menuBar.newFramerate\\\":\\\"Naujas kadrų per sekundę greitis:\\\",\\\"tw.menuBar.package\\\":\\\"Supakuoti projektą\\\",\\\"tw.menuBar.reportError2\\\":\\\"Tai klaida. Prašau mums apie ją reportuoti.\\\",\\\"tw.menuBar.saveAs\\\":\\\"Išsaugoti kaip {file}\\\",\\\"tw.menuBar.seeInside\\\":\\\"Peržiurėti vidų\\\",\\\"tw.oldDownload\\\":\\\"Išsaugoti į atskirą failą...\\\",\\\"tw.paint.alpha\\\":\\\"Nepermatomumas\\\",\\\"tw.privacy\\\":\\\"Privatumo politika\\\",\\\"tw.saveAs\\\":\\\"Išsaugoti kaip...\\\",\\\"tw.saveTo\\\":\\\"Išsaugoti į {file}\\\",\\\"tw.settingsModal.customStageSize\\\":\\\"Pasirinktinis Scenos dydis:\\\",\\\"tw.settingsModal.customStageSizeHelp\\\":\\\"Pakeičia Scratch scenos dydį iš 480x360 į kitą. Išbandykite 640x360, kad scena būtų plačiaekranė. Tik nedaugelis projektų su tuo susidoros tinkamai.\\\",\\\"tw.settingsModal.dangerZone\\\":\\\"Pavojinga zona\\\",\\\"tw.settingsModal.disableCompiler\\\":\\\"Išjungti kompiliatorių\\\",\\\"tw.settingsModal.featured\\\":\\\"Rekomenduojama\\\",\\\"tw.settingsModal.fps\\\":\\\"60 FPS (Pasirinktiniai FPS)\\\",\\\"tw.settingsModal.fpsHelp\\\":\\\"Paleidžia kodus 60 kadrų per sekundę greičiu užuot paleidus 30. Daugiausia projektų neveiks su šiuo nustatymu įjungtu. Pabandykite Interpoliaciją su 60 FPS režimu išjungtu jei tai priežastis. {customFramerate}.\\\",\\\"tw.settingsModal.fpsHelp.customFramerate\\\":\\\"Spustelėkite kito nei 30 ar 60 kadrų per sekundę nustatymui\\\",\\\"tw.settingsModal.help\\\":\\\"Spustėlkite dėl pagalbos\\\",\\\"tw.settingsModal.highQualityPen\\\":\\\"Aukštos kokybės pieštukas\\\",\\\"tw.settingsModal.highQualityPenHelp\\\":\\\"Leidžia pieštuko projektams veikti didesne skiriamąja geba ir išjungia kai kurių koordinačių apvalinimą redaktoriuje. Šis nustatymas nėra naudingas visiems projektams ir gali turėti įtakos našumui.\\\",\\\"tw.settingsModal.infiniteClones\\\":\\\"Begaliniai Klonai\\\",\\\"tw.settingsModal.infiniteClonesHelp\\\":\\\"Panaikina Scratch 300 klonų limitą.\\\",\\\"tw.settingsModal.interpolation\\\":\\\"Interpoliacija\\\",\\\"tw.settingsModal.interpolationHelp\\\":\\\"Projektai atrodo sklandžiau, nes interpoliuojamas personažų udėjimas. Interpoliacija neturėtų būti naudojama 3D projektuose, \\\\\\\"Raytracer\\\\\\\" projektuose, piešimo projektuose ir stringančiuose projektuose, nes dėl interpoliacijos jie veiks lėčiau, bet neatrodys sklandžiau.\\\",\\\"tw.settingsModal.largeStageWarning\\\":\\\"Nerekomenduojama naudoti tokio dydžio pasirinktinio scenos dydžio! Vietoj to naudokite mažesnį dydį su tuo pačiu kraštinių santykiu ir leiskite viso ekrano režimui padidinti jo mastelį, kad jis atitiktų naudotojo ekraną.\\\",\\\"tw.settingsModal.removeFencing\\\":\\\"Panaikinti scenos aptvarus\\\",\\\"tw.settingsModal.removeFencingHelp\\\":\\\"Suteikia galimybę personažams judėti už ekrano ribų, tapti tokiais dideliais arba mažais, kokiais jie nori, ir leidžia liesti blokus už ekrano ribų.\\\",\\\"tw.settingsModal.removeLimits\\\":\\\"Pašalinti limitus\\\",\\\"tw.settingsModal.removeMiscLimits\\\":\\\"Pašalinti įvairius limitus.\\\",\\\"tw.settingsModal.removeMiscLimitsHelp\\\":\\\"Pašalina garso efektų limitus bei pieštuko dydžio limitus.\\\",\\\"tw.settingsModal.storeProjectOptions\\\":\\\"Išsaugoti nustatymus projekte.\\\",\\\"tw.settingsModal.storeProjectOptionsHelp\\\":\\\"Įrašo pasirinktus nustatymus į projektą, kad jie būtų automatiškai taikomi, kai TurboWarp įkelia šį projektą. \\\\\\\"Nukreipimo laikmatis\\\\\\\" ir \\\\\\\"išjungti kompiliatorių\\\\\\\" nebus išsaugoti.\\\",\\\"tw.settingsModal.title\\\":\\\"Išplėstiniai nustatymai\\\",\\\"tw.settingsModal.warpTimer\\\":\\\"Nukreipimo laikmatis\\\",\\\"tw.settingsModal.warpTimerHelp\\\":\\\"Kodai tikrina, ar jie nėra įstrigę ilgoje arba begalinėje kilpoje, ir veikia nedideliu kadrų dažniu, užuot įstrigę, kol kilpa baigsis. Tai išsprendžia daugumą gedimų, tačiau turi didelį poveikį našumui, todėl pagal numatytuosius nustatymus ši funkcija įjungta tik redaktoriuje.\\\",\\\"tw.spriteSelectorItem.rename\\\":\\\"pervardinti\\\",\\\"tw.studioview.authorAttribution\\\":\\\"Sukurta {author}\\\",\\\"tw.studioview.error\\\":\\\"Kraunant kitą projektų puslapį įvyko klaida.\\\",\\\"tw.studioview.hoverText\\\":\\\"{title} sukurta {author}\\\",\\\"tw.unshared.2\\\":\\\"Dėl daugiau informacijos, aplankykite: {link}\\\",\\\"tw.usernameModal.help\\\":\\\"Ši vertė bus išsaugota jūsų naršyklės saugykloje. Ji turėtų būti prijungta kai naudojates projektais kurie turi debesies kintamuosius.\\\",\\\"tw.usernameModal.help2\\\":\\\"Vertes, kurios neatitinka galiojančios Scratch paskyros, debesies kintamųjų serveris paprastai atmeta. Rekomenduojame palikti jį tokį, koks yra, arba pakeisti į Scratch naudotojo vardą.\\\",\\\"tw.usernameModal.mustChange\\\":\\\"Atsiprašome, bet debesies kintamųjų serveris mano kad jūsų naudotojo vardas gali būti nesaugus. Prašome jį pakeisti arba {resetIt}.\\\",\\\"tw.usernameModal.mustChange.resetIt\\\":\\\"Iš naujo nustatyti jį (rekomenduojama)\\\",\\\"tw.usernameModal.reset\\\":\\\"nustatyti iš naujo\\\",\\\"tw.usernameModal.title\\\":\\\"Pakeisti Naudotojo vardą\\\",\\\"tw.viewFeaturedProjects\\\":\\\"Spustelkite kad pažiurėtumėte rekomenduojamus projektus.\\\",\\\"tw.viewOnScratch\\\":\\\"Peržiurėti projektą per Scratch\\\"},\\\"nb\\\":{\\\"tw.accent.blue\\\":\\\"Blå\\\",\\\"tw.accent.purple\\\":\\\"Lilla\\\",\\\"tw.accent.red\\\":\\\"Rød\\\",\\\"tw.alerts.creatingRestorePoint\\\":\\\"Oppretter gjenopprettingspunkt...\\\",\\\"tw.alerts.lostPeripheralConnection\\\":\\\"Mistet forbindelsen til {extensionName}.\\\",\\\"tw.alerts.restorePointError\\\":\\\"Kunne ikke opprette gjenopprettingspunkt\\\",\\\"tw.alerts.restorePointSuccess\\\":\\\"Tilgang til gjenopprettingspunkter i \\\\\\\"Fil\\\\\\\"\\\",\\\"tw.alerts.savedToDisk\\\":\\\"Lagret på datamaskinet.\\\",\\\"tw.backpack.rename\\\":\\\"Nytt navn:\\\",\\\"tw.blockColors.custom\\\":\\\"Tilpass i Addon-innstillinger\\\",\\\"tw.blockColors.dark\\\":\\\"Mørk (Beta)\\\",\\\"tw.blockColors.highContrast\\\":\\\"Høykontrast\\\",\\\"tw.blocks.PROCEDURES_DOCS\\\":\\\"Hvordan bruke return\\\",\\\"tw.blocks.PROCEDURES_RETURN\\\":\\\"returnere {v}\\\",\\\"tw.blocks.PROCEDURES_TO_REPORTER\\\":\\\"Endre til Rapportør\\\",\\\"tw.blocks.PROCEDURES_TO_STATEMENT\\\":\\\"Endre til Uttalelse\\\",\\\"tw.blocks.addons\\\":\\\"Utvidelser\\\",\\\"tw.blocks.buttonIsDown\\\":\\\"[MOUSE_BUTTON] mus knappen ned?\\\",\\\"tw.blocks.lastKeyPressed\\\":\\\"sist tast trykket\\\",\\\"tw.blocks.mouseButton.middle\\\":\\\"(1) mellom\\\",\\\"tw.blocks.mouseButton.primary\\\":\\\"(0) primær\\\",\\\"tw.blocks.mouseButton.secondary\\\":\\\"(2) sekundær\\\",\\\"tw.blocks.openDocs\\\":\\\"Åpne dokumentasjon\\\",\\\"tw.cantUseCloud\\\":\\\"Selv om du kan opprette skyvariabler, vil de ikke fungere med mindre dette prosjektet lastes opp til Scratch eller konverteres ved hjelp av et verktøy som {packager}.\\\",\\\"tw.changeUsername.cannotChangeWhileRunning\\\":\\\"Brukernavn kan ikke byttes mens prosjektet er på.\\\",\\\"tw.clipboard.danger\\\":\\\"Hvis utklippstavlen inneholder ting som passord, kan prosjektet kanskje dele dem med andre brukere eller servere.\\\",\\\"tw.clipboard.permission\\\":\\\"Tilgang til utklippstavlen fungerer kanskje ikke i noen nettlesere. Hvis tillatt, vil ytterligere utklippstavlesninger automatisk tillates.\\\",\\\"tw.clipboard.title\\\":\\\"Prosjektet ønsker å lese data fra utklippstavlen.\\\",\\\"tw.cloudProvider\\\":\\\"Server levert av {name}.\\\",\\\"tw.cloudServers\\\":\\\"Velg en server nær deg:\\\",\\\"tw.code\\\":\\\"Kildekode\\\",\\\"tw.confirmIncompatibleExtension\\\":\\\"Denne utvidelsen er ikke kompatibel med Scratch. Prosjekter laget med den kan ikke lastes opp til Scratch-nettstedet. Er du sikker på at du vil aktivere den?\\\",\\\"tw.createdBy\\\":\\\"Lagd av: \\\",\\\"tw.customCloudServer\\\":\\\"Bruk av en tilpasset skyvariabelserver: {server}\\\",\\\"tw.customExtension.description\\\":\\\"Last inn tilpassede utvidelser fra URL-er, filer eller JavaScript kildekode.\\\",\\\"tw.customExtension.name\\\":\\\"Tilpasset Utvidelse\\\",\\\"tw.customExtensionModal.file\\\":\\\"Filer\\\",\\\"tw.customExtensionModal.load\\\":\\\"Last inn\\\",\\\"tw.customExtensionModal.promptFile\\\":\\\"Velg eller dropp JavaScript-filer til utvidelsen:\\\",\\\"tw.customExtensionModal.promptText\\\":\\\"Lim inn kildekoden til utvidelsen sin JavaScript-fil:\\\",\\\"tw.customExtensionModal.promptURL\\\":\\\"Skriv inn URL-en til utvidelsen:\\\",\\\"tw.customExtensionModal.text\\\":\\\"Tekst\\\",\\\"tw.customExtensionModal.title\\\":\\\"Last inn tilpasset utvidelse\\\",\\\"tw.customExtensionModal.trusted\\\":\\\"Denne utvidelsen vil bli lastet uten sandkassen fordi den kommer fra en pålitelig kilde.\\\",\\\"tw.customExtensionModal.unsandboxed\\\":\\\"Kjør uten sandkasse\\\",\\\"tw.customExtensionModal.unsandboxedWarning1\\\":\\\"Å laste inn utvidelser uten sandkassen er farlig og bør ikke aktiveres hvis du ikke vet hva du gjør.\\\",\\\"tw.customExtensionModal.unsandboxedWarning2\\\":\\\"Usikrede utvidelser kan ødelegge prosjektet ditt, slette innstillingene dine, fiske etter passord og gjøre andre dårlige ting. Utviklerne av {APP_NAME} er ikke ansvarlige for eventuelle problemer som oppstår.\\\",\\\"tw.customExtensionModal.untrusted\\\":\\\"Utvidelser fra upålitelige URL-er vil alltid bli lastet med sandkassen for sikkerhet.\\\",\\\"tw.customReporters.description\\\":\\\"Tillat tilpassede blokker å gi ut verdier og bli brukt som inndata.\\\",\\\"tw.customReporters.name\\\":\\\"Tilpassede rapporter\\\",\\\"tw.darkMode\\\":\\\"Bytt Til Lys Modus\\\",\\\"tw.documentation\\\":\\\"Dokumentasjon\\\",\\\"tw.embed.persistent\\\":\\\"Hvis tillatt, vil ytterligere innbygginger på samme nettsted automatisk bli tillatt.\\\",\\\"tw.embed.risks\\\":\\\"Selv om innbyggingen vil være sandkassebeskyttet, vil den fortsatt ha tilgang til informasjon om enheten din, som din IP-adresse og generelle plassering.\\\",\\\"tw.embed.title1\\\":\\\"Prosjektet ønsker å integrere HTML-innhold over scenen.\\\",\\\"tw.embed.title2\\\":\\\"Prosjektet ønsker å integrere eksternt innhold over scenen.\\\",\\\"tw.extensionGallery.error\\\":\\\"Feil ved lasting av utvidelsesgalleri. Besøk extensions.turbowarp.org for å finne flere utvidelser.\\\",\\\"tw.extensionGallery.loading\\\":\\\"Laster inn utvidelsesgalleri...\\\",\\\"tw.extensionGallery.more\\\":\\\"Lær mer om utvidelser på extensions.turbowarp.org.\\\",\\\"tw.extensionGallery.name\\\":\\\"{APP_NAME} Utvidelse-Galleriet\\\",\\\"tw.favorite\\\":\\\"Favoritt\\\",\\\"tw.featuredProjectsStudio\\\":\\\"Se galeriet på Scratch.\\\",\\\"tw.feedback\\\":\\\"Tilbakemelding & feil\\\",\\\"tw.feedbackButton\\\":\\\"{APP_NAME} Tilbakemelding\\\",\\\"tw.fetch.title\\\":\\\"Prosjektet ønsker å koble til nettsiden:\\\",\\\"tw.fileInput.none\\\":\\\"Ingen filer valgt.\\\",\\\"tw.fileInput.selected\\\":\\\"Valgt: {names}\\\",\\\"tw.fonts.add\\\":\\\"Legg til\\\",\\\"tw.fonts.custom.file\\\":\\\"Velg en skriftfil fra datamaskinen din:\\\",\\\"tw.fonts.custom.name\\\":\\\"Gi skrifttypen et navn:\\\",\\\"tw.fonts.custom1\\\":\\\"Legg til skrifttype fra en fil\\\",\\\"tw.fonts.custom2\\\":\\\"Vanligvis vil det ikke fungere i Scratch. Støttede formater: {formats}.\\\",\\\"tw.fonts.delete\\\":\\\"Er du sikker på at du vil slette \\\\\\\"{font}\\\\\\\"? Eventuelle vektor-kostymer vil bruke reserve skrift type i stedet.\\\",\\\"tw.fonts.fallback\\\":\\\"Velg en reservefont som skal brukes hvis skrifttypen ikke lastes inn eller slettes.\\\",\\\"tw.fonts.list\\\":\\\"Installerte skrifttyper:\\\",\\\"tw.fonts.none\\\":\\\"Ingen skrifttyper er lagt til ennå.\\\",\\\"tw.fonts.readError\\\":\\\"Feilet å lese skriftfil: {error}\\\",\\\"tw.fonts.system\\\":\\\"Systemskrift\\\",\\\"tw.fonts.system.name\\\":\\\"Skriv inn navnet på en hvilken som helst skrifttype som er innebygd i datamaskinen din. Skrifttypen kan vises feil for noen.\\\",\\\"tw.fonts.system1\\\":\\\"Legg til en systemskrift\\\",\\\"tw.fonts.system2\\\":\\\"Kan fungere i Scratch, men vil ikke vises riktig for alle.\\\",\\\"tw.fonts.title\\\":\\\"Skrifter\\\",\\\"tw.footer.credits\\\":\\\"Kreditter\\\",\\\"tw.footer.documentation\\\":\\\"Dokumentasjon\\\",\\\"tw.footer.embed\\\":\\\"Innebygging\\\",\\\"tw.footer.parameters\\\":\\\"URL-parametere\\\",\\\"tw.geolocate.permission\\\":\\\"Hvis tillatt, kan du bli bedt om å tillate stedstilgang av nettleseren din.\\\",\\\"tw.geolocate.title\\\":\\\"Prosjektet ønsker å vite din plassering.\\\",\\\"tw.gui.crashMessage.description\\\":\\\"Beklager, det ser ut til at side har kræsjet. Start siden på nytt til å prøve igjen.\\\",\\\"tw.gui.defaultProjectTitle\\\":\\\"Prosjekt\\\",\\\"tw.guiDefaultTitle\\\":\\\"Kjør Scratch prosjekter raskere\\\",\\\"tw.home.credit\\\":\\\"Merknader og bidragsytere\\\",\\\"tw.home.description\\\":\\\"{APP_NAME} er en Scratch-mod som samler prosjekter til JavaScript for å få dem til å kjøre veldig raskt. Prøv det ved å legge inn en prosjekt-ID eller URL ovenfor eller velge et utvalgt prosjekt nedenfor.\\\",\\\"tw.home.instructions\\\":\\\"Hvordan bruke prosjektet\\\",\\\"tw.input.tooltip\\\":\\\"Kopier og lim inn en Scratch-prosjektkobling her!\\\",\\\"tw.interpolationEnabled\\\":\\\"Interpolasjon\\\",\\\"tw.invalidParameters.clones\\\":\\\"\\\\\\\"klon\\\\\\\" Url-parameteren er ugyldig\\\",\\\"tw.invalidParameters.fps\\\":\\\"\\\\\\\"fps\\\\\\\" Url-parameteren er ugyldig\\\",\\\"tw.invalidProject.title\\\":\\\"Feil\\\",\\\"tw.lightMode\\\":\\\"Bytt Til Mørk Modus\\\",\\\"tw.loadExtension.embedded\\\":\\\"Prosjektet ønsker å laste inn en tilpasset utvidelse med koden:\\\",\\\"tw.loadExtension.sandboxed\\\":\\\"Mens koden vil være sandkasse, vil den fortsatt ha tilgang til informasjon om enheten din, som din IP og generelle plassering. Sørg for at du stoler på forfatteren av denne utvidelsen før du fortsetter.\\\",\\\"tw.loadExtension.unsandboxed\\\":\\\"Kjør uten sandkasse\\\",\\\"tw.loadExtension.unsandboxedWarning\\\":\\\"Å laste inn utvidelser uten sandkassen er farlig. Det kan ødelegge prosjektet ditt, slette innstillingene dine, fiske etter passord og gjøre andre dårlige ting. Utviklerne av {APP_NAME} er ikke ansvarlige for eventuelle problemer som oppstår.\\\",\\\"tw.loadExtension.url\\\":\\\"Prosjektet ønsker å laste inn en tilpasset utvidelse fra URL-en:\\\",\\\"tw.loader.downloadingAssets\\\":\\\"Laster ned eiendeler ({complete}/{total}) ...\\\",\\\"tw.loader.loadingAssets\\\":\\\"Laster ned eiendeler ({complete}/{total}) ...\\\",\\\"tw.loader.projectData\\\":\\\"Laster prosjekt ...\\\",\\\"tw.menuBar.60off\\\":\\\"Slå av 60 FPS Modus\\\",\\\"tw.menuBar.60on\\\":\\\"Slå på 60 FPS Modus\\\",\\\"tw.menuBar.accent\\\":\\\"Aksent\\\",\\\"tw.menuBar.addons\\\":\\\"Utvidelser\\\",\\\"tw.menuBar.advanced\\\":\\\"Avansert\\\",\\\"tw.menuBar.blockColors\\\":\\\"Blokk Farger\\\",\\\"tw.menuBar.changeUsername\\\":\\\"Bytt Brukernavn\\\",\\\"tw.menuBar.cloudOff\\\":\\\"Slå av nett-variabler\\\",\\\"tw.menuBar.cloudOn\\\":\\\"Slå på nett-variabler\\\",\\\"tw.menuBar.cloudUnavailable\\\":\\\"Nett-variabler er ikke tilgjengelig\\\",\\\"tw.menuBar.cloudUnavailableAlert\\\":\\\"Kan ikke bruke nett-variabler, det er kanskje fordi du åpnet redigerer\\\",\\\"tw.menuBar.compileError\\\":\\\"{sprite}:{error}\\\",\\\"tw.menuBar.desktopSettings\\\":\\\"Skrivebordsinnstillinger\\\",\\\"tw.menuBar.moreSettings\\\":\\\"Avansert innstillinger\\\",\\\"tw.menuBar.newFramerate\\\":\\\"Nytt bildefrekvens:\\\",\\\"tw.menuBar.newWindow\\\":\\\"Nytt vindu\\\",\\\"tw.menuBar.package\\\":\\\"Pakke prosjekt\\\",\\\"tw.menuBar.reportError1\\\":\\\"Noen skript oppdaget feil.\\\",\\\"tw.menuBar.reportError2\\\":\\\"Dette er en feil. Vennligst meld det.\\\",\\\"tw.menuBar.restorePoints\\\":\\\"Gjenopprettingspunkter\\\",\\\"tw.menuBar.saveAs\\\":\\\"Lagre som {file}\\\",\\\"tw.menuBar.seeInside\\\":\\\"Se inni\\\",\\\"tw.moreCloud\\\":\\\"Lær mer om skyvariabler.\\\",\\\"tw.notify.permission\\\":\\\"Hvis det er tillatt, kan du bli bedt om å aktivere varslinger av nettleseren din, og ytterligere varsler blir automatisk tillatt.\\\",\\\"tw.notify.title\\\":\\\"Prosjektet ønsker å vise varsler.\\\",\\\"tw.oldDownload\\\":\\\"Lagre for å skille fil ...\\\",\\\"tw.opcode.2000\\\":\\\"dager siden 2000\\\",\\\"tw.opcode.mousedown\\\":\\\"mus ned?\\\",\\\"tw.opcode.mousex\\\":\\\"mus x\\\",\\\"tw.opcode.mousey\\\":\\\"mus y\\\",\\\"tw.openAdvanced\\\":\\\"Åpne avanserte innstillinger\\\",\\\"tw.openWindow.dangerous\\\":\\\"Denne nettsiden har ikke blitt gjennomgått av {APP_NAME} utviklerne. Den kan inneholde farlig eller ondsinnet kode.\\\",\\\"tw.openWindow.title\\\":\\\"Prosjektet ønsker å åpne et nytt vindu eller en ny fane med URL-en:\\\",\\\"tw.paint.alpha\\\":\\\"Opasitet\\\",\\\"tw.paint.fonts.more\\\":\\\"Legg til flere skrifter...\\\",\\\"tw.pen.stageSelected\\\":\\\"Valgt scene: færre pennblokker\\\",\\\"tw.privacy\\\":\\\"Personvernregler\\\",\\\"tw.recordAudio.permission\\\":\\\"Hvis tillatt, kan du bli bedt om å aktivere mikrofontilgang av nettleseren din, og videre mikrofontilgang vil bli automatisk tillatt.\\\",\\\"tw.recordAudio.title\\\":\\\"Prosjektet ønsker å ta opp lyd fra mikrofonen din. Dette kan inkludere en teksttranskripsjon eller rå lyddata. Prosjektet kan muligens dele lyd med andre brukere eller servere.\\\",\\\"tw.recordVideo.permission\\\":\\\"Hvis tillatt, kan du bli bedt om å aktivere kameratilgang av nettleseren din, og videre kameratilgang vil bli automatisk tillatt.\\\",\\\"tw.recordVideo.title\\\":\\\"Prosjektet ønsker å ta opp video fra kameraet ditt. Prosjektet kan muligens dele bilder med andre brukere eller servere.\\\",\\\"tw.redirect.dangerous\\\":\\\"Denne nettsiden har ikke blitt gjennomgått av {APP_NAME} utviklerne. Den kan inneholde farlig eller ondsinnet kode.\\\",\\\"tw.redirect.title\\\":\\\"Prosjektet ønsker å navigere denne fanen til URL-en:\\\",\\\"tw.restorePoints.1minute\\\":\\\"hvert minutt\\\",\\\"tw.restorePoints.assets\\\":\\\"{n} eiendeler\\\",\\\"tw.restorePoints.confirmDelete\\\":\\\"Er du sikker på at du vil slette \\\\\\\"{projectTitle}\\\\\\\"? Dette kan ikke angres.\\\",\\\"tw.restorePoints.confirmDeleteAll\\\":\\\"Er du sikker på at du vil slette ALLE gjenopprettingspunkter? Dette kan ikke angres.\\\",\\\"tw.restorePoints.confirmLoad\\\":\\\"Du har ulagrede endringer. Erstatt eksisterende prosjekt?\\\",\\\"tw.restorePoints.deleteAll\\\":\\\"Slett ALT\\\",\\\"tw.restorePoints.description\\\":\\\"{APP_NAME} lagrer regelmessig gjenopprettingspunkter på datamaskinen for å gjenopprette prosjektet hvis du glemmer å lagre. Dette er ment som en siste utvei for utvinning. Datamaskinen kan når som helst slette disse gjenopprettingspunktene stille. IKKE stol på denne funksjonen.\\\",\\\"tw.restorePoints.empty\\\":\\\"Ingen gjenopprettingspunkter funnet.\\\",\\\"tw.restorePoints.error\\\":\\\"Feil ved lasting av gjenopprettingspunkt: {error}\\\",\\\"tw.restorePoints.intervalOption\\\":\\\"Gjenopprettingspunkter opprettes {time}.\\\",\\\"tw.restorePoints.loading\\\":\\\"Laster...\\\",\\\"tw.restorePoints.minutes\\\":\\\"hver {n} minutter\\\",\\\"tw.restorePoints.never\\\":\\\"aldri\\\",\\\"tw.restorePoints.off\\\":\\\"Deaktivering av gjenopprettingspunkter er farlig.\\\",\\\"tw.restorePoints.size\\\":\\\"Estimert lagringsplass brukt: {size}\\\",\\\"tw.restorePoints.size2\\\":\\\"Kostymer eller lyder som brukes av flere gjenopprettingspunkter lagres bare én gang.\\\",\\\"tw.restorePoints.title\\\":\\\"Gjenopprettingspunkter\\\",\\\"tw.sample\\\":\\\"Eksempel på prosjekt\\\",\\\"tw.saveAs\\\":\\\"Lagre som...\\\",\\\"tw.saveTo\\\":\\\"Lagre til {file}\\\",\\\"tw.scratchUnsafeCloud\\\":\\\"Hvis du gjør denne skyvariabelen, vil prosjektet overstige Scratchs grense på {number} variabler, og noen variabler vil ikke fungere hvis du laster opp prosjektet til Scratch.\\\",\\\"tw.securityManager.allow\\\":\\\"Tillat\\\",\\\"tw.securityManager.deny\\\":\\\"Avslå\\\",\\\"tw.securityManager.title\\\":\\\"Utvidelse Sikkerhet\\\",\\\"tw.securityManager.trust\\\":\\\"Hvis tillatt, vil ytterligere forespørsler til samme nettsted automatisk bli tillatt.\\\",\\\"tw.securityManager.why\\\":\\\"Dette kan brukes til å laste ned bilder eller lyder, implementere flerspiller, få tilgang til et API eller til ondsinnede formål. Dette vil dele din IP-adresse, generelle plassering og muligens annen data med nettsiden.\\\",\\\"tw.settingsModal.customStageSize\\\":\\\"Bytt scene størrelse:\\\",\\\"tw.settingsModal.customStageSizeHelp\\\":\\\"Endrer størrelsen på Scratch-scenen fra 480x360 til noe annet. Prøv 640x360 for å gjøre scenen bredskjerm. Svært få prosjekter vil håndtere dette riktig.\\\",\\\"tw.settingsModal.dangerZone\\\":\\\"Faresone\\\",\\\"tw.settingsModal.disableCompiler\\\":\\\"Deaktiver kompilatoren\\\",\\\"tw.settingsModal.disableCompilerHelp\\\":\\\"Deaktiverer {APP_NAME} kompilatoren. Du kan ønske å aktivere dette mens du redigerer prosjekter slik at skriptene oppdateres umiddelbart. Ellers bør du aldri aktivere dette.\\\",\\\"tw.settingsModal.featured\\\":\\\"Anbefalt\\\",\\\"tw.settingsModal.fps\\\":\\\"60 FPS (tilpassede fps)\\\",\\\"tw.settingsModal.fpsHelp\\\":\\\"Kjører skript 60 ganger per sekund i stedet for 30. De fleste prosjekter vil ikke fungere skikkelig med dette aktivert. Du bør prøve interpolasjon med 60 FPS-modus deaktivert hvis det er tilfelle. {customFramerate}.\\\",\\\"tw.settingsModal.fpsHelp.customFramerate\\\":\\\"Klikk her til å velge mellom 30 eller 60 FPS\\\",\\\"tw.settingsModal.help\\\":\\\"Klikk her for hjelp\\\",\\\"tw.settingsModal.highQualityPen\\\":\\\"Høy kvalitet penn \\\",\\\"tw.settingsModal.highQualityPenHelp\\\":\\\"Tillater pennprosjekter å vises med høyere oppløsning og deaktiverer noe av avrunding av koordinater i redigeringsprogrammet. Ikke alle prosjekter har nytte av denne innstillingen, og det kan påvirke ytelsen.\\\",\\\"tw.settingsModal.infiniteClones\\\":\\\"Uendelige kloner\\\",\\\"tw.settingsModal.infiniteClonesHelp\\\":\\\"Den slår av Scratchs 300 klon grense\\\",\\\"tw.settingsModal.interpolation\\\":\\\"Interpolasjon\\\",\\\"tw.settingsModal.interpolationHelp\\\":\\\"Gjør prosjekter mer jevne ved å interpolere bevegelsen til sprite. Interpolasjon bør ikke brukes på 3D-prosjekter, raytracere, penneprosjekter og trege prosjekter, da interpolasjon vil få dem til å kjøre tregere uten å gjøre dem jevnere.\\\",\\\"tw.settingsModal.largeStageWarning\\\":\\\"Å bruke en så stor tilpasset scenestørrelse anbefales ikke! I stedet bør du bruke en mindre størrelse med samme sideforhold og la fullskjermmodus skalere det opp for å passe brukerens skjerm.\\\",\\\"tw.settingsModal.removeFencing\\\":\\\"Fjern gjerde\\\",\\\"tw.settingsModal.removeFencingHelp\\\":\\\"Tillater sprites å bevege seg utenfor skjermen, bli så store eller små som de ønsker, og gjør at berøringsblokker fungerer utenfor skjermen.\\\",\\\"tw.settingsModal.removeLimits\\\":\\\"Fjern grenser\\\",\\\"tw.settingsModal.removeMiscLimits\\\":\\\"Fjern diverse begrensninger\\\",\\\"tw.settingsModal.removeMiscLimitsHelp\\\":\\\"Fjerner begrensninger for lydeffekter og penntykkelse.\\\",\\\"tw.settingsModal.storeProjectOptions\\\":\\\"Lagre innstillinger i prosjektet\\\",\\\"tw.settingsModal.storeProjectOptionsHelp\\\":\\\"Lagrer de valgte innstillingene i prosjektet slik at de automatisk blir brukt når TurboWarp laster inn dette prosjektet. Warp-timeren og deaktivert kompilator vil ikke bli lagret.\\\",\\\"tw.settingsModal.title\\\":\\\"Avansert innstillinger\\\",\\\"tw.settingsModal.warpTimerHelp\\\":\\\"Gjør skript sjekke om de er sittende fast i en lang eller uendelig løkke og kjøre med lav bildefrekvens i stedet for å bli sittende fast til løkken er ferdig. Dette løser de fleste krasjer, men har en betydelig ytelsespåvirkning, så det er bare aktivert som standard i redigeringsprogrammet.\\\",\\\"tw.soundEditorNotSupported\\\":\\\"Lydredigering støttes ikke i denne nettleseren.\\\",\\\"tw.spriteSelectorItem.rename\\\":\\\"endre navn\\\",\\\"tw.stageHeader.full\\\":\\\"Bytt til full scene\\\",\\\"tw.stereoAlert\\\":\\\"Å redigere denne stereolyden vil uopprettelig konvertere den til mono.\\\",\\\"tw.studioview.authorAttribution\\\":\\\"fra {author}\\\",\\\"tw.studioview.error\\\":\\\"Det oppsto en feil under innlasting av neste side av prosjekter.\\\",\\\"tw.studioview.hoverText\\\":\\\"{title} fra {author}\\\",\\\"tw.tooLarge\\\":\\\"Denne lyden kan være for stor til å laste opp til Scratch.\\\",\\\"tw.twExtension.description\\\":\\\"Rare nye blokker.\\\",\\\"tw.twExtension.name\\\":\\\"{APP_NAME} Blokker\\\",\\\"tw.unfavorite\\\":\\\"Ufavoritt\\\",\\\"tw.unknownPlatform.2\\\":\\\"Kompatibilitet med {APP_NAME} kan ikke garanteres. Du kan fortsette på egen risiko, men vi kan kanskje ikke hjelpe deg hvis du støter på problemer.\\\",\\\"tw.unknownPlatform.continue\\\":\\\"Jeg skjønner\\\",\\\"tw.unknownPlatform.title\\\":\\\"Ukjent Plattform\\\",\\\"tw.unshared.2\\\":\\\"For mer informasjon, besøk: {link}\\\",\\\"tw.unshared.bug\\\":\\\"Hvis dette prosjektet faktisk deles, vennligst rapporter en feil.\\\",\\\"tw.unshared.cache\\\":\\\"Hvis prosjektet ble delt nylig, kan denne meldingen vises feilaktig i noen minutter.\\\",\\\"tw.unshared2.1\\\":\\\"Udelte prosjekter er ikke lenger synlige.\\\",\\\"tw.usernameModal.help\\\":\\\"Denne verdien vil bli lagret i nettleserens lagring. Den kan bli logget når du samhandler med prosjekter som inneholder skyvariabler.\\\",\\\"tw.usernameModal.help2\\\":\\\"Verdier som ikke samsvarer med en gyldig Scratch-konto vil vanligvis bli avvist av skyvariabelserveren. Vi anbefaler å la det være som det er eller endre det til ditt Scratch-brukernavn.\\\",\\\"tw.usernameModal.mustChange\\\":\\\"Beklager, Nett-variabel server tror at brukernavnet din er usikre. Bytt brukernavnet eller {resetIt}\\\",\\\"tw.usernameModal.mustChange.resetIt\\\":\\\"nullstille det (anbefales)\\\",\\\"tw.usernameModal.new\\\":\\\"Nytt brukernavn:\\\",\\\"tw.usernameModal.reset\\\":\\\"Nullstille\\\",\\\"tw.usernameModal.title\\\":\\\"Bytt Brukernavn\\\",\\\"tw.usesCloudVariables\\\":\\\"Dette prosjektet bruker skyvariabler.\\\",\\\"tw.usesCloudVariables2\\\":\\\"{APP_NAME}s skyvariabler er ikke koblet til Scratch sine. Alle kan {changeTheirUsername} til hva som helst, så vær forsiktig med å bli utgitt for å være noen andre.\\\",\\\"tw.usesCloudVariables2.change\\\":\\\"bytt ditt brukernavn\\\",\\\"tw.viewFeaturedProjects\\\":\\\"Klikk til å se anbefalte prosjekter.\\\",\\\"tw.viewOnScratch\\\":\\\"Se prosjektet på Scratch\\\"},\\\"nl\\\":{\\\"tw.accent.blue\\\":\\\"Blauw\\\",\\\"tw.accent.purple\\\":\\\"Paars\\\",\\\"tw.accent.rainbow\\\":\\\"Regenboog\\\",\\\"tw.accent.red\\\":\\\"Rood\\\",\\\"tw.alerts.creatingRestorePoint\\\":\\\"Bezig met herstelpunt maken...\\\",\\\"tw.alerts.lostPeripheralConnection\\\":\\\"Verbinding verloren met {extensionName}.\\\",\\\"tw.alerts.restorePointError\\\":\\\"Kon herstelpunt niet maken\\\",\\\"tw.alerts.restorePointSuccess\\\":\\\"Herstelpunten vind je onder \\\\\\\"Bestand\\\\\\\"\\\",\\\"tw.alerts.savedToDisk\\\":\\\"Opgeslagen op je computer.\\\",\\\"tw.backpack.rename\\\":\\\"Nieuwe naam:\\\",\\\"tw.blockColors.custom\\\":\\\"Meer opties in addon-instellingen\\\",\\\"tw.blockColors.dark\\\":\\\"Donker (bèta)\\\",\\\"tw.blockColors.highContrast\\\":\\\"Hoog contrast\\\",\\\"tw.blockColors.three\\\":\\\"Origineel\\\",\\\"tw.blocks.PROCEDURES_DOCS\\\":\\\"Hoe gebruik ik retourneer?\\\",\\\"tw.blocks.PROCEDURES_RETURN\\\":\\\"retourneer {v}\\\",\\\"tw.blocks.PROCEDURES_TO_REPORTER\\\":\\\"Veranderen naar waardeblok\\\",\\\"tw.blocks.PROCEDURES_TO_STATEMENT\\\":\\\"Veranderen naar stapelblok\\\",\\\"tw.blocks.buttonIsDown\\\":\\\"[MOUSE_BUTTON] muisknop ingedrukt?\\\",\\\"tw.blocks.lastKeyPressed\\\":\\\"laatst ingedrukte toets\\\",\\\"tw.blocks.mouseButton.middle\\\":\\\"(1) middelste\\\",\\\"tw.blocks.mouseButton.primary\\\":\\\"(0) primaire\\\",\\\"tw.blocks.mouseButton.secondary\\\":\\\"(2) secundaire\\\",\\\"tw.blocks.openDocs\\\":\\\"Documentatie Openen\\\",\\\"tw.cantUseCloud\\\":\\\"Hoewel je cloudvariabelen kunt maken, zullen ze niet werken, behalve als dit project is geüpload naar Scratch of omgezet d.m.v. een tool zoals de {packager}.\\\",\\\"tw.changeUsername.cannotChangeWhileRunning\\\":\\\"Gebruikersnaam kan niet worden veranderd terwijl het project bezig is.\\\",\\\"tw.clipboard.danger\\\":\\\"Als je klembord dingen zoals wachtwoorden bevat, kan het project deze informatie delen met andere gebruikers of servers.\\\",\\\"tw.clipboard.permission\\\":\\\"Klembordtoegang werkt niet in alle browsers. Indien toegestaan wordt toekomstige klembordtoegang automatisch toegestaan.\\\",\\\"tw.clipboard.title\\\":\\\"Het project wilt toegang krijgen tot gegevens uit je klembord.\\\",\\\"tw.cloudProvider\\\":\\\"Server aangeboden door {name}.\\\",\\\"tw.cloudServers\\\":\\\"Kies een server bij jou in de buurt:\\\",\\\"tw.code\\\":\\\"Broncode\\\",\\\"tw.confirmIncompatibleExtension\\\":\\\"Deze extensie is niet compatibel met Scratch. Projecten die het gebruiken kunnen niet worden geüpload naar de Scratch website. Weet je zeker dat je het in wilt schakelen?\\\",\\\"tw.createdBy\\\":\\\"Gemaakt door:\\\",\\\"tw.customCloudServer\\\":\\\"Een aangepaste server voor cloudvariabelen wordt gebruikt: {server}\\\",\\\"tw.customExtension.description\\\":\\\"Aangepaste extensies laden van URL's, bestanden of JavaScript-broncode.\\\",\\\"tw.customExtension.name\\\":\\\"Aangepaste extensie\\\",\\\"tw.customExtensionModal.file\\\":\\\"Bestanden\\\",\\\"tw.customExtensionModal.load\\\":\\\"Laden\\\",\\\"tw.customExtensionModal.promptFile\\\":\\\"Selecteer of sleep JavaScript-bestanden van extensie hierheen:\\\",\\\"tw.customExtensionModal.promptText\\\":\\\"Plak hier de JavaScript-broncode van de extensie:\\\",\\\"tw.customExtensionModal.promptURL\\\":\\\"Voer de URL van de extensie in:\\\",\\\"tw.customExtensionModal.text\\\":\\\"Tekst\\\",\\\"tw.customExtensionModal.title\\\":\\\"Aangepaste Extensie Laden\\\",\\\"tw.customExtensionModal.trusted\\\":\\\"Deze extensie wordt zonder sandbox geladen omdat het afkomstig is van een vertrouwde bron.\\\",\\\"tw.customExtensionModal.unsandboxed\\\":\\\"Uitvoeren zonder sandbox\\\",\\\"tw.customExtensionModal.unsandboxedWarning1\\\":\\\"Extensies laden zonder sandbox is gevaarlijk, doe dit niet als je niet weet wat je doet.\\\",\\\"tw.customExtensionModal.unsandboxedWarning2\\\":\\\"Extensies die geladen zijn zonder sandbox kunnen je project beschadigen, je instellingen verwijderen, wachtwoorden phishen, en zorgen voor nog andere slechte zaken. De ontwikkelaars van {APP_NAME} zijn niet verantwoordelijk voor eventuele resulterende problemen.\\\",\\\"tw.customExtensionModal.untrusted\\\":\\\"Wegens veiligheidsredenen worden extensies van onbetrouwbare URL's altijd geladen met de sandbox.\\\",\\\"tw.customReporters.description\\\":\\\"Geef zelfgemaakte blokken onder de categorie \\\\\\\"Mijn blokken\\\\\\\" de mogelijkheid om waarden te hebben en te worden gebruikt als invoer.\\\",\\\"tw.customReporters.name\\\":\\\"Aangepaste waardeblokken\\\",\\\"tw.darkMode\\\":\\\"Lichte modus gebruiken\\\",\\\"tw.desktopCloud\\\":\\\"In de desktop-app worden cloudvariabelen gesynchroniseerd tussen alle vensters van de desktop-app op deze computer. Upload het project naar Scratch of gebruik een tool zoals de {packager} om ze globaal te synchroniseren.\\\",\\\"tw.documentation\\\":\\\"Documentatie\\\",\\\"tw.embed.persistent\\\":\\\"Indien toegestaan worden toekomstige invoegingen naar dezelfde website automatisch toegestaan.\\\",\\\"tw.embed.risks\\\":\\\"Hoewel de embed wordt geladen met sandbox, heeft het nog wel toegang tot informatie over je apparaat, zoals je IP-adres en algemene locatie.\\\",\\\"tw.embed.title1\\\":\\\"Het project wilt HTML-inhoud invoegen op het speelveld:\\\",\\\"tw.embed.title2\\\":\\\"Het project wilt inhoud op afstand invoegen op het speelveld:\\\",\\\"tw.extensionGallery.error\\\":\\\"Kon extensiegalerij niet laden. Ga naar extensions.turbowarp.org om meer extensies te vinden.\\\",\\\"tw.extensionGallery.loading\\\":\\\"Bezig met extensiegalerij laden...\\\",\\\"tw.extensionGallery.more\\\":\\\"Ga naar extensions.turbowarp.org om meer te weten te komen over extensies.\\\",\\\"tw.extensionGallery.name\\\":\\\"{APP_NAME}-extensiegalerij\\\",\\\"tw.favorite\\\":\\\"Favoriet Maken\\\",\\\"tw.featuredProjectsStudio\\\":\\\"Deze studio bekijken op Scratch.\\\",\\\"tw.feedbackButton\\\":\\\"{APP_NAME}-feedback geven\\\",\\\"tw.fetch.title\\\":\\\"Het project wilt verbinding maken met de website:\\\",\\\"tw.fileInput.none\\\":\\\"Geen bestanden geselecteerd.\\\",\\\"tw.fileInput.selected\\\":\\\"Geselecteerd: {names}\\\",\\\"tw.fonts.add\\\":\\\"Toevoegen\\\",\\\"tw.fonts.custom.file\\\":\\\"Selecteer een lettertypebestand van je computer:\\\",\\\"tw.fonts.custom.name\\\":\\\"Geef het lettertype een naam:\\\",\\\"tw.fonts.custom1\\\":\\\"Lettertype toevoegen uit een bestand\\\",\\\"tw.fonts.custom2\\\":\\\"Werkt meestal niet in Scratch. Ondersteunde formaten: {formats}\\\",\\\"tw.fonts.delete\\\":\\\"Weet je zeker dat je \\\\\\\"{font}\\\\\\\" wilt verwijderen? Elk vector-uiterlijk zal het terugval-lettertype gebruiken.\\\",\\\"tw.fonts.fallback\\\":\\\"Kies een terugval-lettertype als het lettertype niet kan worden geladen of is verwijderd:\\\",\\\"tw.fonts.list\\\":\\\"Geïnstalleerde lettertypen:\\\",\\\"tw.fonts.none\\\":\\\"Nog geen lettertypen toegevoegd.\\\",\\\"tw.fonts.readError\\\":\\\"Kon lettertypebestand niet lezen: {error}\\\",\\\"tw.fonts.system\\\":\\\"Systeemlettertype\\\",\\\"tw.fonts.system.name\\\":\\\"Typ de naam van een lettertype die in je computer is ingebouwd. Het lettertype wordt misschien niet voor iedereen correct weergegeven.\\\",\\\"tw.fonts.system1\\\":\\\"Een systeemlettertype toevoegen\\\",\\\"tw.fonts.system2\\\":\\\"Werkt misschien in Scratch, maar wordt niet voor iedereen correct weergegeven.\\\",\\\"tw.fonts.title\\\":\\\"Lettertypen\\\",\\\"tw.footer.disclaimer\\\":\\\"{APP_NAME} is niet aangesloten bij Scratch, het Scratch Team of de Scratch Foundation.\\\",\\\"tw.footer.documentation\\\":\\\"Documentatie\\\",\\\"tw.footer.embed\\\":\\\"Invoeging\\\",\\\"tw.footer.parameters\\\":\\\"URL-Parameters\\\",\\\"tw.footer.scratchDisclaimer\\\":\\\"Scratch is een project van de Scratch Foundation en is gratis verkrijgbaar op {scratchDotOrg}.\\\",\\\"tw.geolocate.permission\\\":\\\"Indien toegestaan kan je door je browser worden gevraagd om toegang tot je locatie toe te staan.\\\",\\\"tw.geolocate.title\\\":\\\"Het project wilt toegang tot je locatie.\\\",\\\"tw.gui.crashMessage.description\\\":\\\"Het spijt ons, maar het ziet ernaar uit dat de pagina is gecrasht. Ververs je pagina om het opnieuw te proberen.\\\",\\\"tw.guiDefaultTitle\\\":\\\"Speel Scratch-projecten sneller af\\\",\\\"tw.home.credit\\\":\\\"Opmerkingen en credits\\\",\\\"tw.home.description\\\":\\\"{APP_NAME} is een modificatie van Scratch die projecten omzet naar JavaScript om ze heel snel te laten werken. Probeer het door hierboven een project-ID of URL in te voeren of hieronder een uitgelicht project te kiezen.\\\",\\\"tw.home.instructions\\\":\\\"Instructies\\\",\\\"tw.input.tooltip\\\":\\\"Plak hier een link naar een Scratch-project!\\\",\\\"tw.interpolationEnabled\\\":\\\"Interpolatie\\\",\\\"tw.invalidParameters.clones\\\":\\\"URL-parameter \\\\\\\"clone\\\\\\\" is ongeldig\\\",\\\"tw.invalidParameters.fps\\\":\\\"URL-parameter \\\\\\\"fps\\\\\\\" is ongeldig\\\",\\\"tw.invalidProject.error\\\":\\\"Project laden mislukt:\\\",\\\"tw.invalidProject.options\\\":\\\"Het is misschien mogelijk om een oudere versie van het project te herstellen door middel van automatische herstelpunten of andere back-ups.\\\",\\\"tw.invalidProject.reportIt\\\":\\\"maak een melding\\\",\\\"tw.invalidProject.restorePoints\\\":\\\"Herstelpunten bekijken\\\",\\\"tw.invalidProject.title\\\":\\\"Fout\\\",\\\"tw.invalidProject.validationError\\\":\\\"Deze foutmelding betekent vaak dat een klein deel van het project is beschadigd, maar dat het voor de rest nog wel geldig is. Dit is (meestal) makkelijk op te lossen, dus {reportIt}.\\\",\\\"tw.lightMode\\\":\\\"Donkere modus gebruiken\\\",\\\"tw.loadExtension.embedded\\\":\\\"Het project wilt een aangepaste extensie laden met de code:\\\",\\\"tw.loadExtension.sandboxed\\\":\\\"Hoewel de code wordt gesandboxed heeft het nog steeds toegang tot informatie van je apparaat, zoals je IP-adres en algemene locatie. Ga alleen verder als je de maker van deze extensie vertrouwt.\\\",\\\"tw.loadExtension.unsandboxed\\\":\\\"Uitvoeren zonder sandbox\\\",\\\"tw.loadExtension.unsandboxedWarning\\\":\\\"Extensies laden zonder sandbox is gevaarlijk. De extensie kan je project beschadigen, je instellingen verwijderen, wachtwoorden phishen, en zorgen voor nog andere slechte zaken. De ontwikkelaars van {APP_NAME} zijn niet verantwoordelijk voor eventuele resulterende problemen.\\\",\\\"tw.loadExtension.url\\\":\\\"Het project wilt een aangepaste extensie laden van de URL:\\\",\\\"tw.loader.downloadingAssets\\\":\\\"Bezig met onderdelen downloaden ({complete}/{total}) ...\\\",\\\"tw.loader.loadingAssets\\\":\\\"Bezig met onderdelen laden ({complete}/{total}) ...\\\",\\\"tw.loader.projectData\\\":\\\"Bezig met laden van project ...\\\",\\\"tw.menuBar.60off\\\":\\\"60 FPS-stand uitzetten\\\",\\\"tw.menuBar.60on\\\":\\\"60 FPS-stand aanzetten\\\",\\\"tw.menuBar.advanced\\\":\\\"Geavanceerd\\\",\\\"tw.menuBar.blockColors\\\":\\\"Blokkleuren\\\",\\\"tw.menuBar.changeUsername\\\":\\\"Gebruikersnaam veranderen\\\",\\\"tw.menuBar.cloudOff\\\":\\\"Cloudvariabelen uitschakelen\\\",\\\"tw.menuBar.cloudOn\\\":\\\"Cloudvariabelen inschakelen\\\",\\\"tw.menuBar.cloudUnavailable\\\":\\\"Cloudvariabelen zijn niet beschikbaar\\\",\\\"tw.menuBar.cloudUnavailableAlert\\\":\\\"Kan geen cloudvariabelen gebruiken, waarschijnlijk omdat je de editor hebt geopend.\\\",\\\"tw.menuBar.desktopSettings\\\":\\\"Desktopinstellingen\\\",\\\"tw.menuBar.moreSettings\\\":\\\"Geavanceerde instellingen\\\",\\\"tw.menuBar.newFramerate\\\":\\\"Nieuwe framerate:\\\",\\\"tw.menuBar.newWindow\\\":\\\"Nieuw venster\\\",\\\"tw.menuBar.package\\\":\\\"Project packagen\\\",\\\"tw.menuBar.reportError1\\\":\\\"Bij sommige scripts is een fout opgetreden.\\\",\\\"tw.menuBar.reportError2\\\":\\\"Dit is een bug, meld deze alsjeblieft.\\\",\\\"tw.menuBar.restorePoints\\\":\\\"Herstelpunten\\\",\\\"tw.menuBar.saveAs\\\":\\\"Opslaan als {file}\\\",\\\"tw.menuBar.seeInside\\\":\\\"Bekijk van binnen\\\",\\\"tw.moreCloud\\\":\\\"Meer informatie over cloudvariabelen.\\\",\\\"tw.notify.permission\\\":\\\"Indien toegestaan kan je door je browser worden gevraagd om meldingen in te schakelen en worden toekomstige meldingen automatisch toegestaan.\\\",\\\"tw.notify.title\\\":\\\"Het project wilt meldingen weergeven.\\\",\\\"tw.oldDownload\\\":\\\"Opslaan naar apart bestand...\\\",\\\"tw.opcode.2000\\\":\\\"dagen sinds 2000\\\",\\\"tw.opcode.mousedown\\\":\\\"muis ingedrukt?\\\",\\\"tw.opcode.mousex\\\":\\\"muis x\\\",\\\"tw.opcode.mousey\\\":\\\"muis y\\\",\\\"tw.openAdvanced\\\":\\\"Geavanceerde instellingen openen\\\",\\\"tw.openWindow.dangerous\\\":\\\"Deze website is niet beoordeeld door de ontwikkelaars van {APP_NAME}. Het kan gevaarlijke of kwaadaardige code bevatten.\\\",\\\"tw.openWindow.title\\\":\\\"Het project wilt een nieuw venster of tabblad openen met de URL:\\\",\\\"tw.paint.alpha\\\":\\\"Ondoorzichtigheid\\\",\\\"tw.paint.fonts.more\\\":\\\"Meer lettertypen toevoegen...\\\",\\\"tw.pen.stageSelected\\\":\\\"Speelveld geselecteerd: minder penblokken\\\",\\\"tw.privacy\\\":\\\"Privacybeleid\\\",\\\"tw.recordAudio.permission\\\":\\\"Indien toegestaan kan je door je browser worden gevraagd om microfoontoegang in te schakelen. Ook wordt toekomstige microfoontoegang automatisch toegestaan.\\\",\\\"tw.recordAudio.title\\\":\\\"Het project wilt audio van je microfoon opnemen. Dit kan een tekst-transcript of ruwe audiogegevens inhouden. Het project kan audio delen met andere gebruikers of servers.\\\",\\\"tw.recordVideo.permission\\\":\\\"Indien toegestaan kan je door je browser worden gevraagd om cameratoegang in te schakelen. Ook wordt toekomstige cameratoegang automatisch toegestaan.\\\",\\\"tw.recordVideo.title\\\":\\\"Het project wilt video van je camera opnemen. Het project kan afbeeldingen delen met andere gebruikers of servers.\\\",\\\"tw.redirect.dangerous\\\":\\\"Deze website is niet beoordeeld door de ontwikkelaars van {APP_NAME}. Het kan gevaarlijke of kwaadaardige code bevatten.\\\",\\\"tw.redirect.title\\\":\\\"Het project wil dit tabblad doorsturen naar de URL:\\\",\\\"tw.removedTrademarks\\\":\\\"Een aantal items die handelsmerken van Scratch bevatten zijn verwijderd uit deze lijst.\\\",\\\"tw.restorePoints.1minute\\\":\\\"elke minuut\\\",\\\"tw.restorePoints.assets\\\":\\\"{n} onderdelen\\\",\\\"tw.restorePoints.confirmDelete\\\":\\\"Weet je zeker dat je \\\\\\\"{projectTitle}\\\\\\\" wilt verwijderen? Dit kan niet ongedaan worden gemaakt.\\\",\\\"tw.restorePoints.confirmDeleteAll\\\":\\\"Weet je zeker dat je ALLE herstelpunten wilt verwijderen? Dit kan niet ongedaan worden gemaakt.\\\",\\\"tw.restorePoints.confirmLoad\\\":\\\"Er zijn niet-opgeslagen wijzigingen. Wil je het bestaand project vervangen?\\\",\\\"tw.restorePoints.deleteAll\\\":\\\"Alles Verwijderen\\\",\\\"tw.restorePoints.description\\\":\\\"{APP_NAME} slaat af en toe herstelpunten op je computer op zodat je je project terug kan halen als je vergeet op te slaan. Dit is een laatste redmiddel voor herstel. Je computer kan deze herstelpunten op elk moment verwijderen. Hang NIET af van deze functie.\\\",\\\"tw.restorePoints.empty\\\":\\\"Geen herstelpunten gevonden.\\\",\\\"tw.restorePoints.error\\\":\\\"Er is een fout opgetreden bij het laden van het herstelpunt: {error}\\\",\\\"tw.restorePoints.intervalOption\\\":\\\"Herstelpunten worden {time} gemaakt.\\\",\\\"tw.restorePoints.loading\\\":\\\"Bezig met laden...\\\",\\\"tw.restorePoints.minutes\\\":\\\"elke {n} minuten\\\",\\\"tw.restorePoints.never\\\":\\\"nooit\\\",\\\"tw.restorePoints.off\\\":\\\"Herstelpunten uitschakelen is gevaarlijk.\\\",\\\"tw.restorePoints.size\\\":\\\"Schatting gebruikte opslagruimte: {size}\\\",\\\"tw.restorePoints.size2\\\":\\\"Onderdelen zoals uiterlijken en geluiden die gebruikt worden door meerdere herstelpunten worden maar één keer opgeslagen.\\\",\\\"tw.restorePoints.title\\\":\\\"Herstelpunten\\\",\\\"tw.sample\\\":\\\"Voorbeeldproject\\\",\\\"tw.saveAs\\\":\\\"Opslaan als...\\\",\\\"tw.saveTo\\\":\\\"Opslaan in {file}\\\",\\\"tw.scratchUnsafeCloud\\\":\\\"Als je deze cloudvariabele maakt, zal het project het limiet van {number} variabelen overschrijden, en sommige variabelen zullen niet goed werken als je het project uploadt naar Scratch.\\\",\\\"tw.securityManager.allow\\\":\\\"Toestaan\\\",\\\"tw.securityManager.deny\\\":\\\"Weigeren\\\",\\\"tw.securityManager.title\\\":\\\"Extensiebeveiliging\\\",\\\"tw.securityManager.trust\\\":\\\"Indien toegestaan worden toekomstige verzoeken naar dezelfde website automatisch toegestaan.\\\",\\\"tw.securityManager.why\\\":\\\"Dit kan gebruikt worden om afbeeldingen of geluiden te downloaden, multiplayer mogelijk te maken, toegang te krijgen tot een API, of misschien voor kwaadaardige bedoelingen. Dit zal je IP-adres, je algemene locatie en mogelijk overige gegevens delen met de website.\\\",\\\"tw.settingsModal.customStageSize\\\":\\\"Aangepaste speelveldgrootte:\\\",\\\"tw.settingsModal.customStageSizeHelp\\\":\\\"Verandert de grootte van het Scratch-speelveld van 480x360 naar iets anders. Probeer 640x360 voor een breed beeld. Maar heel weinig projecten zullen hier goed mee werken.\\\",\\\"tw.settingsModal.dangerZone\\\":\\\"Gevarenzone\\\",\\\"tw.settingsModal.disableCompiler\\\":\\\"Compiler uitschakelen\\\",\\\"tw.settingsModal.disableCompilerHelp\\\":\\\"Schakelt de compiler van {APP_NAME} uit. Dit is handig tijdens het bewerken van projecten, omdat scripts dan gelijk updaten. Anders zou je dit nooit aan moeten zetten.\\\",\\\"tw.settingsModal.featured\\\":\\\"Uitgelicht\\\",\\\"tw.settingsModal.fps\\\":\\\"60 FPS (aangepaste FPS)\\\",\\\"tw.settingsModal.fpsHelp\\\":\\\"Voert scripts 60 keer per seconde uit in plaats van 30. De meeste projecten zullen hier niet goed mee werken. Probeer interpolatie zonder 60 FPS als dit het geval is. {customFramerate}.\\\",\\\"tw.settingsModal.fpsHelp.customFramerate\\\":\\\"Klik hier om een andere framerate dan 30 of 60 te gebruiken\\\",\\\"tw.settingsModal.help\\\":\\\"Klik hier voor hulp\\\",\\\"tw.settingsModal.highQualityPen\\\":\\\"Pen met hoge kwaliteit\\\",\\\"tw.settingsModal.highQualityPenHelp\\\":\\\"Geeft pen-tekeningen een hogere resolutie en schakelt een paar gevallen van afronding van coördinaten uit in de editor. Niet alle projecten hebben hier voordeel van en het kan prestaties verminderen.\\\",\\\"tw.settingsModal.infiniteClones\\\":\\\"Kloonlimiet weghalen\\\",\\\"tw.settingsModal.infiniteClonesHelp\\\":\\\"Haalt de limiet van 300 klonen van Scratch weg.\\\",\\\"tw.settingsModal.interpolation\\\":\\\"Interpolatie\\\",\\\"tw.settingsModal.interpolationHelp\\\":\\\"Laat projecten er soepeler uitzien door spritebewegingen te interpoleren. Gebruik dit niet in 3D-projecten, raytracers, penprojecten, en trage projecten. Interpolatie maakt die projecten juist trager, waardoor je het tegenovergestelde resultaat bereikt.\\\",\\\"tw.settingsModal.largeStageWarning\\\":\\\"Het gebruiken van een speelveld van deze grootte is niet aangeraden! Gebruik in plaats daarvan een kleinere grootte met dezelfde beeldverhouding en laat het volledig scherm-modus het vergroten om het op de weergave van de gebruiker af te stemmen.\\\",\\\"tw.settingsModal.removeFencing\\\":\\\"Waarde-limieten van sprites weghalen\\\",\\\"tw.settingsModal.removeFencingHelp\\\":\\\"Geeft sprites de mogelijkheid om van het scherm af te bewegen, zo groot of klein te worden als ze maar willen, en laat blokken voor aanrakingen zelfs buiten het scherm werken.\\\",\\\"tw.settingsModal.removeLimits\\\":\\\"Limieten Weghalen\\\",\\\"tw.settingsModal.removeMiscLimits\\\":\\\"Diverse limieten weghalen\\\",\\\"tw.settingsModal.removeMiscLimitsHelp\\\":\\\"Haalt limieten van o.a. geluidseffecten en pengrootte weg.\\\",\\\"tw.settingsModal.storeProjectOptions\\\":\\\"Instellingen opslaan in project\\\",\\\"tw.settingsModal.storeProjectOptionsHelp\\\":\\\"Slaat de geselecteerde instellingen op in het project zodat ze automatisch worden toegepast wanneer dit project wordt geladen met TurboWarp. Warp timer en compiler uitschakelen worden niet opgeslagen.\\\",\\\"tw.settingsModal.title\\\":\\\"Geavanceerde Instellingen\\\",\\\"tw.settingsModal.warpTimer\\\":\\\"Warp timer\\\",\\\"tw.settingsModal.warpTimerHelp\\\":\\\"Laat scripts controleren of ze vastzitten in een lange of oneindige lus en voor een lage framerate zorgen, in plaats van vast blijven zitten tot de lus eindigt. Dit lost de meeste crashes op, maar heeft een grote invloed op prestaties, dus het is alleen standaard ingeschakeld in de editor.\\\",\\\"tw.soundEditorNotSupported\\\":\\\"De geluidseditor is niet ondersteund in deze browser.\\\",\\\"tw.spriteSelectorItem.rename\\\":\\\"naam wijzigen\\\",\\\"tw.stageHeader.full\\\":\\\"Schakel naar volledig speelveld\\\",\\\"tw.stereoAlert\\\":\\\"Het bewerken van dit stereogeluid zal het onomkeerbaar veranderen naar mono.\\\",\\\"tw.studioview.authorAttribution\\\":\\\"door {author}\\\",\\\"tw.studioview.error\\\":\\\"Er is een fout opgetreden bij het laden van de volgende pagina van projecten.\\\",\\\"tw.studioview.hoverText\\\":\\\"{title} door {author}\\\",\\\"tw.tooLarge\\\":\\\"Dit geluidsbestand is mogelijk te groot voor Scratch.\\\",\\\"tw.twExtension.description\\\":\\\"Gekke nieuwe blokken.\\\",\\\"tw.twExtension.name\\\":\\\"{APP_NAME}-blokken\\\",\\\"tw.unfavorite\\\":\\\"Niet Favoriet Maken\\\",\\\"tw.unknownPlatform.2\\\":\\\"Compatibiliteit met {APP_NAME} is niet gegarandeerd. Je kan doorgaan op eigen risico, maar dan is het voor ons misschien niet mogelijk om te helpen als er iets misgaat.\\\",\\\"tw.unknownPlatform.continue\\\":\\\"Begrepen\\\",\\\"tw.unknownPlatform.title\\\":\\\"Onbekend platform\\\",\\\"tw.unshared.2\\\":\\\"Voor meer informatie, bezoek: {link}\\\",\\\"tw.unshared.bug\\\":\\\"Als dit project wel gedeeld is, meld dan een bug.\\\",\\\"tw.unshared.cache\\\":\\\"Als dit project recentelijk is gedeeld, kan het zijn dat dit bericht een paar minuten lang verkeerd wordt weergegeven.\\\",\\\"tw.unshared2.1\\\":\\\"Niet-gedeelde projecten zijn niet meer zichtbaar.\\\",\\\"tw.usernameModal.help\\\":\\\"Deze waarde wordt opgeslagen in de opslag van je browser. Het kan worden gelogd wanneer je iets doet met projecten die cloudvariabelen bevatten.\\\",\\\"tw.usernameModal.help2\\\":\\\"Waarden die niet corresponderen met een geldig Scratch-account worden normaal gesproken geweigerd door de server voor cloudvariabelen. We raden je aan het zo te laten of het te veranderen naar je Scratch-gebruikersnaam.\\\",\\\"tw.usernameModal.mustChange\\\":\\\"Het spijt ons, maar de server voor cloudvariabelen vermoedt dat je gebruikersnaam onveilig is. Verander het alsjeblieft naar iets anders of {resetIt}.\\\",\\\"tw.usernameModal.mustChange.resetIt\\\":\\\"reset het (aanbevolen)\\\",\\\"tw.usernameModal.new\\\":\\\"Nieuwe gebruikersnaam:\\\",\\\"tw.usernameModal.reset\\\":\\\"Resetten\\\",\\\"tw.usernameModal.title\\\":\\\"Gebruikersnaam veranderen\\\",\\\"tw.usesCloudVariables\\\":\\\"Dit project gebruikt cloudvariabelen.\\\",\\\"tw.usesCloudVariables2\\\":\\\"De cloudvariabelen van {APP_NAME} zijn niet verbonden met die van Scratch. Iedereen kan {changeTheirUsername} naar wat ze maar willen, dus pas op voor imitatie.\\\",\\\"tw.usesCloudVariables2.change\\\":\\\"hun gebruikersnaam veranderen\\\",\\\"tw.viewFeaturedProjects\\\":\\\"Klik hier om uitgelichte projecten te zien.\\\",\\\"tw.viewOnScratch\\\":\\\"Dit project bekijken op Scratch\\\"},\\\"pl\\\":{\\\"tw.alerts.creatingRestorePoint\\\":\\\"Tworzenie punktu przywracania…\\\",\\\"tw.alerts.lostPeripheralConnection\\\":\\\"Utracono połączenie do {extensionName}.\\\",\\\"tw.alerts.savedToDisk\\\":\\\"Zapisano na twoim komputerze.\\\",\\\"tw.backpack.rename\\\":\\\"Nowa nazwa:\\\",\\\"tw.blocks.addons\\\":\\\"Dodatki\\\",\\\"tw.blocks.buttonIsDown\\\":\\\"kliknięto [MOUSE_BUTTON] przycisk myszy?\\\",\\\"tw.blocks.lastKeyPressed\\\":\\\"ostatnio naciśnięty przycisk\\\",\\\"tw.blocks.mouseButton.middle\\\":\\\"(1) środkowy\\\",\\\"tw.blocks.mouseButton.primary\\\":\\\"(0) podstawowy\\\",\\\"tw.blocks.mouseButton.secondary\\\":\\\"(2) dodatkowy\\\",\\\"tw.blocks.openDocs\\\":\\\"Otwórz Dokumentację\\\",\\\"tw.changeUsername.cannotChangeWhileRunning\\\":\\\"Nazwa użytkownika nie może zostać zmieniona, kiedy projekt jest uruchomiony\\\",\\\"tw.code\\\":\\\"Kod Źródłowy\\\",\\\"tw.customExtension.name\\\":\\\"Niestandardowe Rozszerzenie\\\",\\\"tw.customExtensionModal.file\\\":\\\"Pliki\\\",\\\"tw.customExtensionModal.text\\\":\\\"Tekst\\\",\\\"tw.customExtensionModal.title\\\":\\\"Załaduj Niestandardowe Rozszerzenie\\\",\\\"tw.documentation\\\":\\\"Dokumentacja\\\",\\\"tw.featuredProjectsStudio\\\":\\\"Zobacz studio w Scratchu.\\\",\\\"tw.feedback\\\":\\\"Opinie i Błędy\\\",\\\"tw.fetch.title\\\":\\\"Projekt chce połączyć się z:\\\",\\\"tw.footer.credits\\\":\\\"Podziękowania\\\",\\\"tw.footer.documentation\\\":\\\"Dokumentacja\\\",\\\"tw.footer.embed\\\":\\\"Osadzanie\\\",\\\"tw.footer.parameters\\\":\\\"Parametry URL\\\",\\\"tw.gui.defaultProjectTitle\\\":\\\"Projekt\\\",\\\"tw.guiDefaultTitle\\\":\\\"Uruchamiaj projekty Scratch szybciej\\\",\\\"tw.home.credit\\\":\\\"Notatki i Podziękowania\\\",\\\"tw.home.instructions\\\":\\\"Instrukcje\\\",\\\"tw.input.tooltip\\\":\\\"Skopiuj i wklej link do projektu Scratcha tutaj!\\\",\\\"tw.interpolationEnabled\\\":\\\"Interpolacja\\\",\\\"tw.invalidParameters.clones\\\":\\\"Parametr URL \\\\\\\"clone\\\\\\\" jest nieprawidłowy\\\",\\\"tw.invalidParameters.fps\\\":\\\"Parametr URL \\\\\\\"fps\\\\\\\" jest nieprawidłowy\\\",\\\"tw.invalidProject.title\\\":\\\"Błąd\\\",\\\"tw.loader.downloadingAssets\\\":\\\"Pobieranie zasobów ({complete}/{total}) ...\\\",\\\"tw.loader.projectData\\\":\\\"Ładowanie projektu ...\\\",\\\"tw.menuBar.60off\\\":\\\"Wyłącz tryb 60 FPS\\\",\\\"tw.menuBar.60on\\\":\\\"Włącz tryb 60 FPS\\\",\\\"tw.menuBar.addons\\\":\\\"Dodatki\\\",\\\"tw.menuBar.advanced\\\":\\\"Zaawansowane\\\",\\\"tw.menuBar.changeUsername\\\":\\\"Zmień Nazwę Użytkownika\\\",\\\"tw.menuBar.cloudOff\\\":\\\"Wyłącz Zmienne W Chmurze\\\",\\\"tw.menuBar.cloudOn\\\":\\\"Włącz Zmienne W Chmurze\\\",\\\"tw.menuBar.cloudUnavailable\\\":\\\"Zmienne W Chmurze nie są Dostępne\\\",\\\"tw.menuBar.cloudUnavailableAlert\\\":\\\"Nie można użyć zmiennych w chmurze, najprawdopodobniej dlatego, że masz włączony edytor.\\\",\\\"tw.menuBar.desktopSettings\\\":\\\"Ustawienia Wersji na Pulpit\\\",\\\"tw.menuBar.moreSettings\\\":\\\"Zaawansowane Ustawienia\\\",\\\"tw.menuBar.newFramerate\\\":\\\"Nowa liczba klatek na sekundę:\\\",\\\"tw.menuBar.reportError2\\\":\\\"To jest błąd. Proszę zgłoś to.\\\",\\\"tw.menuBar.saveAs\\\":\\\"Zapisz jako {file}\\\",\\\"tw.menuBar.seeInside\\\":\\\"Zajrzyj do środka\\\",\\\"tw.oldDownload\\\":\\\"Zapisz do osobnego pliku...\\\",\\\"tw.opcode.2000\\\":\\\"dni od 2000\\\",\\\"tw.opcode.mousedown\\\":\\\"kliknięto myszką?\\\",\\\"tw.opcode.mousex\\\":\\\"x myszy\\\",\\\"tw.opcode.mousey\\\":\\\"y myszy\\\",\\\"tw.openAdvanced\\\":\\\"Otwórz zaawansowane ustawienia\\\",\\\"tw.openWindow.dangerous\\\":\\\"Ta strona nie została zweryfikowana przez twórców {APP_NAME}. Może zawierać niebezpieczny lub złośliwy kod.\\\",\\\"tw.openWindow.title\\\":\\\"Projekt chce otworzyć nowe okno lub kartę z URL:\\\",\\\"tw.paint.alpha\\\":\\\"Nieprzezroczystość\\\",\\\"tw.privacy\\\":\\\"Polityka Prywatności\\\",\\\"tw.redirect.dangerous\\\":\\\"Ta strona nie została zweryfikowana przez twórców {APP_NAME}. Może zawierać niebezpieczny lub złośliwy kod.\\\",\\\"tw.redirect.title\\\":\\\"Projekt chce przejść na tej karcie do URL:\\\",\\\"tw.saveAs\\\":\\\"Zapisz jako...\\\",\\\"tw.saveTo\\\":\\\"Zapisz do {file}\\\",\\\"tw.securityManager.allow\\\":\\\"Zezwól\\\",\\\"tw.securityManager.title\\\":\\\"Bezpieczeństwo Rozszerzeń\\\",\\\"tw.settingsModal.customStageSize\\\":\\\"Niestandardowy Rozmiar Sceny:\\\",\\\"tw.settingsModal.customStageSizeHelp\\\":\\\"Zmienia wielkość ekranu używanego w Scratchu z 480x360 do jakiejś innej wielkości. Spróbuj 640x360 żeby zrobić ekran szerszy. Bardzo niewiele projektów poradzi sobie z tym prawidłowo.\\\",\\\"tw.settingsModal.dangerZone\\\":\\\"Niebezpieczna Strefa\\\",\\\"tw.settingsModal.disableCompiler\\\":\\\"Wyłącz Kompilator\\\",\\\"tw.settingsModal.featured\\\":\\\"Wyróżnione\\\",\\\"tw.settingsModal.fps\\\":\\\"60 FPS (Niestandardowe FPS)\\\",\\\"tw.settingsModal.fpsHelp\\\":\\\"Uruchamia skrypty 60 razy na sekundę, zamiast 30. Większość projektów nie będzie działać poprawnie z tą opcją włączoną. W takim przypadku spróbuj Interpolację z wyłączonym trybem 60 FPS. {customFramerate}\\\",\\\"tw.settingsModal.fpsHelp.customFramerate\\\":\\\"Kliknij, aby ustawić liczbę klatek na sekundę inną niż 30 lub 60.\\\",\\\"tw.settingsModal.help\\\":\\\"Kliknij po pomoc\\\",\\\"tw.settingsModal.highQualityPen\\\":\\\"Wysokiej Jakości Pióro\\\",\\\"tw.settingsModal.highQualityPenHelp\\\":\\\"Umożliwia renderowanie pisaka z wyższą rozdzielczością, oraz wyłącza zaokrąglanie współrzędnych dla pisaka (większa dokładność). Nie wszystkie projekty pozytywnie skorzystają z tego ustawienia i może ono negatywnie wpłynąć na wydajność.\\\",\\\"tw.settingsModal.infiniteClones\\\":\\\"Nieskończone Klony\\\",\\\"tw.settingsModal.infiniteClonesHelp\\\":\\\"Wyłącza domyślny limit 300 klonów.\\\",\\\"tw.settingsModal.interpolation\\\":\\\"Interpolacja\\\",\\\"tw.settingsModal.removeFencing\\\":\\\"Usuń Ograniczenia\\\",\\\"tw.settingsModal.removeFencingHelp\\\":\\\"Pozwala duszkom poruszać się i wykrywać kolizję poza sceną oraz mieć dowolny rozmiar.\\\",\\\"tw.settingsModal.removeLimits\\\":\\\"Usuń Limity\\\",\\\"tw.settingsModal.removeMiscLimits\\\":\\\"Usuń Różne Limity\\\",\\\"tw.settingsModal.removeMiscLimitsHelp\\\":\\\"Usuwa limity efektów dźwiękowych i rozmiaru pisaka.\\\",\\\"tw.settingsModal.storeProjectOptions\\\":\\\"Przechowaj ustawienia w projekcie\\\",\\\"tw.settingsModal.title\\\":\\\"Zaawansowane Ustawienia\\\",\\\"tw.settingsModal.warpTimer\\\":\\\"Warp Stoper\\\",\\\"tw.spriteSelectorItem.rename\\\":\\\"zmień nazwę\\\",\\\"tw.stereoAlert\\\":\\\"Edytowanie tego dźwięku stereo bezpowrotnie konwertuje go do mono.\\\",\\\"tw.studioview.authorAttribution\\\":\\\"przez {author}\\\",\\\"tw.studioview.error\\\":\\\"Wystąpił błąd przy ładowaniu następnej strony projektów.\\\",\\\"tw.studioview.hoverText\\\":\\\"{title} autorstwa {author}\\\",\\\"tw.tooLarge\\\":\\\"Ten dźwięk może być zbyt duży, aby wczytać go do Scratch.\\\",\\\"tw.twExtension.description\\\":\\\"Dziwne nowe bloki.\\\",\\\"tw.unshared2.1\\\":\\\"Nieudostępnione projekty nie są już widoczne.\\\",\\\"tw.usernameModal.mustChange.resetIt\\\":\\\"zresetuj to (zalecane)\\\",\\\"tw.usernameModal.reset\\\":\\\"Resetuj\\\",\\\"tw.usernameModal.title\\\":\\\"Zmień Nazwę Użytkownika\\\",\\\"tw.viewFeaturedProjects\\\":\\\"Kliknij, aby zobaczyć polecane projekty.\\\",\\\"tw.viewOnScratch\\\":\\\"Zobacz projekt w Scratchu\\\"},\\\"pt\\\":{\\\"tw.alerts.creatingRestorePoint\\\":\\\"Criando ponto de restauração...\\\",\\\"tw.alerts.savedToDisk\\\":\\\"Salvo no seu computador.\\\",\\\"tw.backpack.rename\\\":\\\"Novo nome:\\\",\\\"tw.blocks.buttonIsDown\\\":\\\"botão [MOUSE_BUTTON] do mouse pressionado?\\\",\\\"tw.blocks.lastKeyPressed\\\":\\\"última tecla pressionada\\\",\\\"tw.blocks.mouseButton.middle\\\":\\\"(1) do meio\\\",\\\"tw.blocks.mouseButton.primary\\\":\\\"(0) primário\\\",\\\"tw.blocks.mouseButton.secondary\\\":\\\"(2) secundário\\\",\\\"tw.blocks.openDocs\\\":\\\"Abrir Documentação\\\",\\\"tw.changeUsername.cannotChangeWhileRunning\\\":\\\"O nome de usuário não pode ser alterado enquanto o projeto está em execução.\\\",\\\"tw.code\\\":\\\"Código-fonte\\\",\\\"tw.confirmIncompatibleExtension\\\":\\\"Essa extensão não é compatível com o Scratch. Projetos feitos com ela não funcionarão se você fizer upload no site do Scratch. Tem certeza que quer ativá-la?\\\",\\\"tw.customExtension.name\\\":\\\"Extensão Customizada\\\",\\\"tw.featuredProjectsStudio\\\":\\\"Ver estúdio no Scratch.\\\",\\\"tw.feedback\\\":\\\"Feedback e bugs\\\",\\\"tw.footer.credits\\\":\\\"Créditos\\\",\\\"tw.footer.embed\\\":\\\"Incorporação\\\",\\\"tw.footer.parameters\\\":\\\"Parâmetros de URL\\\",\\\"tw.gui.defaultProjectTitle\\\":\\\"Projeto\\\",\\\"tw.guiDefaultTitle\\\":\\\"Rode projetos do Scratch mais rapidamente\\\",\\\"tw.home.credit\\\":\\\"Notas e Créditos\\\",\\\"tw.home.instructions\\\":\\\"Instruções\\\",\\\"tw.input.tooltip\\\":\\\"Copie e cole um link de um projeto no Scratch aqui!\\\",\\\"tw.interpolationEnabled\\\":\\\"Interpolação\\\",\\\"tw.invalidParameters.clones\\\":\\\"parâmetro de URL \\\\\\\"clone\\\\\\\" é inválido\\\",\\\"tw.invalidParameters.fps\\\":\\\"parâmetro de URL \\\\\\\"fps\\\\\\\" é inválido\\\",\\\"tw.invalidProject.title\\\":\\\"Erro\\\",\\\"tw.loader.downloadingAssets\\\":\\\"Baixando recursos ({complete}/{total}) ...\\\",\\\"tw.loader.loadingAssets\\\":\\\"Carregando recursos ({complete}/{total}) …\\\",\\\"tw.loader.projectData\\\":\\\"Carregando projeto …\\\",\\\"tw.menuBar.60off\\\":\\\"Desativar modo 60 FPS\\\",\\\"tw.menuBar.60on\\\":\\\"Ativar modo 60 FPS\\\",\\\"tw.menuBar.advanced\\\":\\\"Avançado\\\",\\\"tw.menuBar.changeUsername\\\":\\\"Mudar nome de usuário\\\",\\\"tw.menuBar.cloudOff\\\":\\\"Desativar variáveis na nuvem\\\",\\\"tw.menuBar.cloudOn\\\":\\\"Ativar variáveis na nuvem\\\",\\\"tw.menuBar.cloudUnavailable\\\":\\\"Variáveis na nuvem não estão disponíveis\\\",\\\"tw.menuBar.cloudUnavailableAlert\\\":\\\"Não pôde usar variáveis na nuvem, provavelmente porque você abriu o editor.\\\",\\\"tw.menuBar.desktopSettings\\\":\\\"Configurações de área de trabalho\\\",\\\"tw.menuBar.moreSettings\\\":\\\"Configurações Avançadas\\\",\\\"tw.menuBar.newFramerate\\\":\\\"Novo FPS:\\\",\\\"tw.menuBar.reportError2\\\":\\\"Isso é um bug. Por favor, reporte-o.\\\",\\\"tw.menuBar.saveAs\\\":\\\"Salvar como {file}\\\",\\\"tw.menuBar.seeInside\\\":\\\"Ver interior\\\",\\\"tw.oldDownload\\\":\\\"Salvar como arquivo separado...\\\",\\\"tw.paint.alpha\\\":\\\"Opacidade\\\",\\\"tw.privacy\\\":\\\"Política de Privacidade\\\",\\\"tw.saveAs\\\":\\\"Salvar como...\\\",\\\"tw.saveTo\\\":\\\"Salvar como {file}\\\",\\\"tw.settingsModal.customStageSize\\\":\\\"Tamanho Customizado do Palco:\\\",\\\"tw.settingsModal.customStageSizeHelp\\\":\\\"Muda o tamanho do palco do Scratch de 480x360 para outro valor. Tente 640x360 para deixar o palco em widescreen. Quase nenhum projeto irá funcionar direito com essa opção.\\\",\\\"tw.settingsModal.dangerZone\\\":\\\"Zona de Perigo\\\",\\\"tw.settingsModal.disableCompiler\\\":\\\"Desativar Compilador\\\",\\\"tw.settingsModal.featured\\\":\\\"Em destaque\\\",\\\"tw.settingsModal.fps\\\":\\\"60 FPS (FPS customizado)\\\",\\\"tw.settingsModal.fpsHelp\\\":\\\"Roda scripts 60 vezes por segundo ao invés de 30. A maioria dos projetos não vão funcionar adequadamente com isso ativado. Se esse for o caso, você pode tentar usar Interpolação e desligar o modo 60 FPS. {customFramerate}.\\\",\\\"tw.settingsModal.fpsHelp.customFramerate\\\":\\\"Clique para escolher FPS além de 30 ou 60\\\",\\\"tw.settingsModal.help\\\":\\\"Ajuda\\\",\\\"tw.settingsModal.highQualityPen\\\":\\\"Caneta de Alta Qualidade\\\",\\\"tw.settingsModal.highQualityPenHelp\\\":\\\"Permite que projetos renderizem a caneta em uma qualidade melhor e reduz arredondamento de coordenadas no editor. Nem todo projeto se beneficia dessa opção, e ela pode piorar a performance.\\\",\\\"tw.settingsModal.infiniteClones\\\":\\\"Clones Infinitos\\\",\\\"tw.settingsModal.infiniteClonesHelp\\\":\\\"Desativa o limite de 300 clones do Scratch.\\\",\\\"tw.settingsModal.interpolation\\\":\\\"Interpolação\\\",\\\"tw.settingsModal.interpolationHelp\\\":\\\"Faz projetos parecerem rodar em framerates mais altas interpolando o movimento de atores. Interpolação não deve ser usada em projetos 3D, raytracers, projetos que usam caneta e projetos lagados porque a interpolação só vai fazer eles rodarem mais devagar sem deixá-los mais suaves.\\\",\\\"tw.settingsModal.largeStageWarning\\\":\\\"Não é recomendado usar um tamanho de palco tão grande! Ao invés disso, use um tamanho menor com a mesma proporção e o modo tela cheia irá aumentar o palco para preencher a tela do usuário.\\\",\\\"tw.settingsModal.removeFencing\\\":\\\"Remover Borda\\\",\\\"tw.settingsModal.removeFencingHelp\\\":\\\"Deixa atores andarem para fora da tela, ficarem grandes ou pequenos sem limitação de tamanho e permite que os blocos \\\\\\\"tocando\\\\\\\" funcionem fora dos limites do palco.\\\",\\\"tw.settingsModal.removeLimits\\\":\\\"Remover Limites\\\",\\\"tw.settingsModal.removeMiscLimits\\\":\\\"Remover Outros Limites\\\",\\\"tw.settingsModal.removeMiscLimitsHelp\\\":\\\"Remove os limites de efeitos de som e tamanho da caneta.\\\",\\\"tw.settingsModal.storeProjectOptions\\\":\\\"Salvar configurações no projeto\\\",\\\"tw.settingsModal.storeProjectOptionsHelp\\\":\\\"Salva suas configurações no projeto e automaticamente os aplica quando você abrir o projeto no TurboWarp. \\\\\\\"Warp timer\\\\\\\" e \\\\\\\"desativar compilador\\\\\\\" não serão salvos.\\\",\\\"tw.settingsModal.title\\\":\\\"Configurações Avançadas\\\",\\\"tw.settingsModal.warpTimerHelp\\\":\\\"Faz scripts detectarem se estão presos em um loop longo ou infinito e roda a uma framerate baixa ao invés de travar até o loop terminar. Isso conserta a maioria dos crashes mas prejudica muito a performance, então não está ativado por padrão fora do editor.\\\",\\\"tw.spriteSelectorItem.rename\\\":\\\"renomear\\\",\\\"tw.studioview.authorAttribution\\\":\\\"por {author}\\\",\\\"tw.studioview.error\\\":\\\"Erro ao carregar a próxima página de projetos.\\\",\\\"tw.studioview.hoverText\\\":\\\"{title} por {author}\\\",\\\"tw.usernameModal.help\\\":\\\"Esse valor será guardado no armazenamento do seu navegador. Projetos que contenham variáveis na nuvem podem querer registrá-lo.\\\",\\\"tw.usernameModal.help2\\\":\\\"Valores que não correspondem a uma conta válida no Scratch normalmente serão rejeitados pelo servidor de variáveis na nuvem. Recomendamos que você deixe este valor como está ou mude-o para o seu nome de usuário do Scratch.\\\",\\\"tw.usernameModal.mustChange\\\":\\\"Desculpe, o servidor de variáveis na nuvem acha que o seu nome de usuário pode ser inapropriado. Por favor, mude para outra coisa ou {resetIt}.\\\",\\\"tw.usernameModal.mustChange.resetIt\\\":\\\"resete-o (recomendado)\\\",\\\"tw.usernameModal.new\\\":\\\"Novo nome de usuário:\\\",\\\"tw.usernameModal.reset\\\":\\\"Redefinir\\\",\\\"tw.usernameModal.title\\\":\\\"Mudar nome de usuário\\\",\\\"tw.viewFeaturedProjects\\\":\\\"Clique para ver projetos em destaque.\\\",\\\"tw.viewOnScratch\\\":\\\"Ver projeto no Scratch\\\"},\\\"pt-br\\\":{\\\"tw.accent.blue\\\":\\\"Azul\\\",\\\"tw.accent.purple\\\":\\\"Roxo\\\",\\\"tw.accent.red\\\":\\\"Vermelho\\\",\\\"tw.alerts.creatingRestorePoint\\\":\\\"Criando ponto de restauração...\\\",\\\"tw.alerts.lostPeripheralConnection\\\":\\\"Conexão com {extensionName} foi perdida.\\\",\\\"tw.alerts.savedToDisk\\\":\\\"Salvo no seu computador.\\\",\\\"tw.backpack.rename\\\":\\\"Novo nome:\\\",\\\"tw.blockColors.custom\\\":\\\"Customizar em Configurações de Addon\\\",\\\"tw.blockColors.dark\\\":\\\"Escuro (Beta)\\\",\\\"tw.blockColors.highContrast\\\":\\\"Alto Contraste\\\",\\\"tw.blocks.buttonIsDown\\\":\\\"botão [MOUSE_BUTTON] do mouse pressionado?\\\",\\\"tw.blocks.lastKeyPressed\\\":\\\"última tecla pressionada\\\",\\\"tw.blocks.mouseButton.middle\\\":\\\"(1) do meio\\\",\\\"tw.blocks.mouseButton.primary\\\":\\\"(0) primário\\\",\\\"tw.blocks.mouseButton.secondary\\\":\\\"(2) secundário\\\",\\\"tw.blocks.openDocs\\\":\\\"Abrir Documentação\\\",\\\"tw.cantUseCloud\\\":\\\"Embora você possa criar variáveis de nuvem, elas não funcionarão a menos que este projeto seja publicado no Scratch ou convertido usando uma ferramenta como o {packager}.\\\",\\\"tw.changeUsername.cannotChangeWhileRunning\\\":\\\"O nome de usuário não pode ser alterado enquanto o projeto está em execução.\\\",\\\"tw.clipboard.danger\\\":\\\"Se a sua área de transferência conter informações vulneráveis como senhas, este projeto pode compartilhar tais dados com outros usuários ou servidores.\\\",\\\"tw.clipboard.title\\\":\\\"Este projeto quer ler as informações da sua área de transferência.\\\",\\\"tw.cloudProvider\\\":\\\"Servidor providenciado por {name}\\\",\\\"tw.cloudServers\\\":\\\"Selecionar um servidor próximo a você:\\\",\\\"tw.code\\\":\\\"Código-fonte\\\",\\\"tw.confirmIncompatibleExtension\\\":\\\"Essa extensão não é compatível com o Scratch. Projetos feitos com ela não funcionarão se você fizer upload no site do Scratch. Tem certeza que quer ativá-la?\\\",\\\"tw.createdBy\\\":\\\"Criado por:\\\",\\\"tw.customCloudServer\\\":\\\"Usando o servidor de variável em nuvem personalizada: {server}\\\",\\\"tw.customExtension.name\\\":\\\"Extensão Customizada\\\",\\\"tw.customExtensionModal.load\\\":\\\"Carregar\\\",\\\"tw.customExtensionModal.promptText\\\":\\\"Cole o código fonte em JavaScript da extensão:\\\",\\\"tw.customExtensionModal.promptURL\\\":\\\"Insira a URL da extensão:\\\",\\\"tw.customExtensionModal.text\\\":\\\"Texto\\\",\\\"tw.customExtensionModal.title\\\":\\\"Carregar Extensão Customizada\\\",\\\"tw.customExtensionModal.trusted\\\":\\\"Essa extensão será carregada fora do sandbox pois vem de uma fonte confiável.\\\",\\\"tw.customExtensionModal.unsandboxedWarning1\\\":\\\"Carregar extensões fora do sandbox é perigoso e não deve ser ativado a não ser que você seja experiente.\\\",\\\"tw.customExtensionModal.unsandboxedWarning2\\\":\\\"Extensões sem sandbox podem corromper seu projeto, apagar suas configurações, roubar senhas e causar outros tormentos. Os desenvolvedores do aplicativo {APP_NAME} não são responsáveis por qualquer resultado consequente.\\\",\\\"tw.customExtensionModal.untrusted\\\":\\\"Extensões com URLs não confiáveis serão sempre carregadas com sandbox por segurança.\\\",\\\"tw.darkMode\\\":\\\"Alternar para Tema Claro\\\",\\\"tw.documentation\\\":\\\"Documentação\\\",\\\"tw.favorite\\\":\\\"Favoritar\\\",\\\"tw.featuredProjectsStudio\\\":\\\"Ver estúdio no Scratch.\\\",\\\"tw.feedback\\\":\\\"Feedback e bugs\\\",\\\"tw.feedbackButton\\\":\\\"{APP_NAME} Opinar\\\",\\\"tw.fetch.title\\\":\\\"Este projeto quer se conectar ao site: \\\",\\\"tw.fonts.add\\\":\\\"Adicionar\\\",\\\"tw.fonts.custom.file\\\":\\\"Escolha um arquivo de fonte do seu computador:\\\",\\\"tw.fonts.custom.name\\\":\\\"Nomeie a fonte:\\\",\\\"tw.fonts.custom1\\\":\\\"Adicionar fonte por arquivo\\\",\\\"tw.fonts.list\\\":\\\"Fontes instaladas:\\\",\\\"tw.fonts.none\\\":\\\"Nenhuma fonte adicionada.\\\",\\\"tw.fonts.readError\\\":\\\"Falha ao ler o arquivo de fonte: {error}\\\",\\\"tw.fonts.system\\\":\\\"Fonte do sistema operacional\\\",\\\"tw.fonts.system1\\\":\\\"Adicionar uma fonte do sistema operacional\\\",\\\"tw.fonts.title\\\":\\\"Fontes\\\",\\\"tw.footer.credits\\\":\\\"Créditos\\\",\\\"tw.footer.documentation\\\":\\\"Documentação\\\",\\\"tw.footer.embed\\\":\\\"Incorporação\\\",\\\"tw.footer.parameters\\\":\\\"Parâmetros de URL\\\",\\\"tw.gui.crashMessage.description\\\":\\\"Lamentamos, mas parece que a página parou de funcionar. Por favor, renicie-a para tentar novamente.\\\",\\\"tw.gui.defaultProjectTitle\\\":\\\"Projeto\\\",\\\"tw.guiDefaultTitle\\\":\\\"Rode projetos do Scratch mais rapidamente\\\",\\\"tw.home.credit\\\":\\\"Notas e Créditos\\\",\\\"tw.home.instructions\\\":\\\"Instruções\\\",\\\"tw.input.tooltip\\\":\\\"Copie e cole um link de um projeto no Scratch aqui!\\\",\\\"tw.interpolationEnabled\\\":\\\"Interpolação\\\",\\\"tw.invalidParameters.clones\\\":\\\"parâmetro de URL \\\\\\\"clone\\\\\\\" é inválido\\\",\\\"tw.invalidParameters.fps\\\":\\\"parâmetro de URL \\\\\\\"fps\\\\\\\" é inválido\\\",\\\"tw.invalidProject.title\\\":\\\"Erro\\\",\\\"tw.lightMode\\\":\\\"Alternar para Tema Escuro\\\",\\\"tw.loader.downloadingAssets\\\":\\\"Baixando recursos ({complete}/{total}) ...\\\",\\\"tw.loader.loadingAssets\\\":\\\"Carregando recursos ({complete}/{total}) …\\\",\\\"tw.loader.projectData\\\":\\\"Carregando projeto …\\\",\\\"tw.menuBar.60off\\\":\\\"Desativar modo 60 FPS\\\",\\\"tw.menuBar.60on\\\":\\\"Ativar modo 60 FPS\\\",\\\"tw.menuBar.accent\\\":\\\"Destaque\\\",\\\"tw.menuBar.advanced\\\":\\\"Avançado\\\",\\\"tw.menuBar.blockColors\\\":\\\"Cores de Bloco\\\",\\\"tw.menuBar.changeUsername\\\":\\\"Mudar nome de usuário\\\",\\\"tw.menuBar.cloudOff\\\":\\\"Desativar variáveis na nuvem\\\",\\\"tw.menuBar.cloudOn\\\":\\\"Ativar variáveis na nuvem\\\",\\\"tw.menuBar.cloudUnavailable\\\":\\\"Variáveis na nuvem não estão disponíveis\\\",\\\"tw.menuBar.cloudUnavailableAlert\\\":\\\"Não pôde usar variáveis na nuvem, provavelmente porque você abriu o editor.\\\",\\\"tw.menuBar.desktopSettings\\\":\\\"Configurações de área de trabalho\\\",\\\"tw.menuBar.moreSettings\\\":\\\"Configurações Avançadas\\\",\\\"tw.menuBar.newFramerate\\\":\\\"Novo FPS:\\\",\\\"tw.menuBar.newWindow\\\":\\\"Nova janela\\\",\\\"tw.menuBar.package\\\":\\\"Exportar projeto\\\",\\\"tw.menuBar.reportError1\\\":\\\"Alguns scripts apresentaram erros.\\\",\\\"tw.menuBar.reportError2\\\":\\\"Isso é um bug. Por favor, reporte-o.\\\",\\\"tw.menuBar.restorePoints\\\":\\\"Pontos de restauração\\\",\\\"tw.menuBar.saveAs\\\":\\\"Salvar como {file}\\\",\\\"tw.menuBar.seeInside\\\":\\\"Ver interior\\\",\\\"tw.mono\\\":\\\"Monodirecional\\\",\\\"tw.moreCloud\\\":\\\"Saiba mais sobre variáveis na nuvem.\\\",\\\"tw.notify.title\\\":\\\"Este projeto quer mostrar notificações.\\\",\\\"tw.oldDownload\\\":\\\"Salvar como arquivo separado...\\\",\\\"tw.opcode.2000\\\":\\\"dias desde 2000\\\",\\\"tw.opcode.mousedown\\\":\\\"mouse pressionado?\\\",\\\"tw.opcode.mousex\\\":\\\"x do mouse\\\",\\\"tw.opcode.mousey\\\":\\\"y do mouse\\\",\\\"tw.openAdvanced\\\":\\\"Abrir configurações avançadas\\\",\\\"tw.openWindow.dangerous\\\":\\\"Este site não foi revisado pelos desenvolvedores do {APP_NAME}. Pode conter códigos perigosos ou maliciosos.\\\",\\\"tw.openWindow.title\\\":\\\"Este projeto quer abrir uma nova janela ou aba para acessar a seguinte URL:\\\",\\\"tw.paint.alpha\\\":\\\"Opacidade\\\",\\\"tw.paint.fonts.more\\\":\\\"Adicionar mais fontes...\\\",\\\"tw.privacy\\\":\\\"Política de Privacidade\\\",\\\"tw.redirect.dangerous\\\":\\\"Este site não foi revisado pelos desenvolvedores do {APP_NAME}. Pode conter códigos perigosos ou maliciosos.\\\",\\\"tw.redirect.title\\\":\\\"O projeto deseja navegar nesta guia para o URL:\\\",\\\"tw.restorePoints.1minute\\\":\\\"cada minuto\\\",\\\"tw.restorePoints.assets\\\":\\\"{n} arquivos\\\",\\\"tw.restorePoints.deleteAll\\\":\\\"Apagar Todos\\\",\\\"tw.restorePoints.empty\\\":\\\"Nenhum ponto de restauração encontrado.\\\",\\\"tw.restorePoints.loading\\\":\\\"Carregando.\\\",\\\"tw.restorePoints.minutes\\\":\\\"cada {n} minutos\\\",\\\"tw.restorePoints.never\\\":\\\"nunca\\\",\\\"tw.restorePoints.title\\\":\\\"Pontos de restauração\\\",\\\"tw.sample\\\":\\\"Projeto demonstrativo\\\",\\\"tw.saveAs\\\":\\\"Salvar como...\\\",\\\"tw.saveTo\\\":\\\"Salvar como {file}\\\",\\\"tw.scratchUnsafeCloud\\\":\\\"Se você criar essa variável de nuvem, o projeto excederá o limite de {number} variáveis do Scratch e algumas variáveis não funcionarão se você enviar o projeto para o Scratch.\\\",\\\"tw.securityManager.allow\\\":\\\"Permitir\\\",\\\"tw.securityManager.deny\\\":\\\"Negar\\\",\\\"tw.securityManager.title\\\":\\\"Segurança de Extensão\\\",\\\"tw.securityManager.why\\\":\\\"Isso pode ser usado para baixar imagens ou sons, implementar mecânicas de multiplayer, acessar uma API ou para fins maliciosos. Isso compartilhará seu endereço IP, localização geral e possivelmente outros dados com o site.\\\",\\\"tw.settingsModal.customStageSize\\\":\\\"Tamanho Customizado do Palco:\\\",\\\"tw.settingsModal.customStageSizeHelp\\\":\\\"Muda o tamanho do palco do Scratch de 480x360 para outro valor. Tente 640x360 para deixar o palco em widescreen. Quase nenhum projeto irá funcionar direito com essa opção.\\\",\\\"tw.settingsModal.dangerZone\\\":\\\"Zona de Perigo\\\",\\\"tw.settingsModal.disableCompiler\\\":\\\"Desativar compilador\\\",\\\"tw.settingsModal.featured\\\":\\\"Em destaque\\\",\\\"tw.settingsModal.fps\\\":\\\"60 FPS (FPS customizado)\\\",\\\"tw.settingsModal.fpsHelp\\\":\\\"Roda scripts 60 vezes por segundo ao invés de 30. A maioria dos projetos não vão funcionar adequadamente com isso ativado. Se esse for o caso, você pode tentar usar Interpolação e desligar o modo 60 FPS. {customFramerate}.\\\",\\\"tw.settingsModal.fpsHelp.customFramerate\\\":\\\"Clique para escolher FPS além de 30 ou 60\\\",\\\"tw.settingsModal.help\\\":\\\"Ajuda\\\",\\\"tw.settingsModal.highQualityPen\\\":\\\"Caneta de Alta Qualidade\\\",\\\"tw.settingsModal.highQualityPenHelp\\\":\\\"Permite que projetos renderizem a caneta em uma qualidade melhor e reduz arredondamento de coordenadas no editor. Nem todo projeto se beneficia dessa opção, e ela pode piorar a performance.\\\",\\\"tw.settingsModal.infiniteClones\\\":\\\"Clones Infinitos\\\",\\\"tw.settingsModal.infiniteClonesHelp\\\":\\\"Desativa o limite de 300 clones do Scratch.\\\",\\\"tw.settingsModal.interpolation\\\":\\\"Interpolação\\\",\\\"tw.settingsModal.interpolationHelp\\\":\\\"Faz projetos parecerem rodar em framerates mais altas interpolando o movimento de atores. Interpolação não deve ser usada em projetos 3D, raytracers, projetos que usam caneta e projetos lagados porque a interpolação só vai fazer eles rodarem mais devagar sem deixá-los mais suaves.\\\",\\\"tw.settingsModal.largeStageWarning\\\":\\\"Não é recomendado usar um tamanho de palco tão grande! Ao invés disso, use um tamanho menor com a mesma proporção e o modo tela cheia irá aumentar o palco para preencher a tela do usuário.\\\",\\\"tw.settingsModal.removeFencing\\\":\\\"Remover Borda\\\",\\\"tw.settingsModal.removeFencingHelp\\\":\\\"Deixa atores andarem para fora da tela, ficarem grandes ou pequenos sem limitação de tamanho e permite que os blocos \\\\\\\"tocando\\\\\\\" funcionem fora dos limites do palco.\\\",\\\"tw.settingsModal.removeLimits\\\":\\\"Remover Limites\\\",\\\"tw.settingsModal.removeMiscLimits\\\":\\\"Remover Outros Limites\\\",\\\"tw.settingsModal.removeMiscLimitsHelp\\\":\\\"Remove os limites de efeitos de som e tamanho da caneta.\\\",\\\"tw.settingsModal.storeProjectOptions\\\":\\\"Salvar configurações no projeto\\\",\\\"tw.settingsModal.storeProjectOptionsHelp\\\":\\\"Salva suas configurações no projeto e automaticamente os aplica quando você abrir o projeto no TurboWarp. \\\\\\\"Warp timer\\\\\\\" e \\\\\\\"desativar compilador\\\\\\\" não serão salvos.\\\",\\\"tw.settingsModal.title\\\":\\\"Configurações Avançadas\\\",\\\"tw.settingsModal.warpTimerHelp\\\":\\\"Faz scripts detectarem se estão presos em um loop longo ou infinito e roda a uma framerate baixa ao invés de travar até o loop terminar. Isso conserta a maioria dos crashes mas prejudica muito a performance, então não está ativado por padrão fora do editor.\\\",\\\"tw.spriteSelectorItem.rename\\\":\\\"renomear\\\",\\\"tw.stereo\\\":\\\"Estéreo\\\",\\\"tw.stereoAlert\\\":\\\"Editar este som estéreo irá convertê-lo irreversivelmente em mono.\\\",\\\"tw.studioview.authorAttribution\\\":\\\"por {author}\\\",\\\"tw.studioview.error\\\":\\\"Erro ao carregar a próxima página de projetos.\\\",\\\"tw.studioview.hoverText\\\":\\\"{title} por {author}\\\",\\\"tw.tooLarge\\\":\\\"Esse som excede os limites de tamanho de sons do Scratch.\\\",\\\"tw.twExtension.description\\\":\\\"Novos blocos estranhos.\\\",\\\"tw.unfavorite\\\":\\\"Desfavoritar\\\",\\\"tw.unshared.2\\\":\\\"Para mais informações, visite: {link}\\\",\\\"tw.unshared.bug\\\":\\\"Se este projeto estiver compartilhado, por favor denuncie o bug.\\\",\\\"tw.unshared.cache\\\":\\\"Se o projeto foi compartilhado recentemente, esta mensagem pode aparecer indevidamente por alguns minutos.\\\",\\\"tw.unshared2.1\\\":\\\"Projetos descompartilhados não são mais acessíveis.\\\",\\\"tw.usernameModal.help\\\":\\\"Esse valor será guardado no armazenamento do seu navegador. Projetos que contenham variáveis na nuvem podem querer registrá-lo.\\\",\\\"tw.usernameModal.help2\\\":\\\"Valores que não correspondem a uma conta válida no Scratch normalmente serão rejeitados pelo servidor de variáveis na nuvem. Recomendamos que você deixe este valor como está ou mude-o para o seu nome de usuário do Scratch.\\\",\\\"tw.usernameModal.mustChange\\\":\\\"Desculpe, o servidor de variáveis na nuvem acha que o seu nome de usuário possa ser inapropriado. Por favor, mude para outra coisa ou {resetIt}.\\\",\\\"tw.usernameModal.mustChange.resetIt\\\":\\\"resete-o (recomendado)\\\",\\\"tw.usernameModal.reset\\\":\\\"Redefinir\\\",\\\"tw.usernameModal.title\\\":\\\"Mudar nome de usuário\\\",\\\"tw.usesCloudVariables\\\":\\\"Este projeto utiliza variáveis em nuvem.\\\",\\\"tw.usesCloudVariables2\\\":\\\"As variáveis em nuvem do {APP_NAME} não são conectadas ao servidor do Scratch. Qualquer um pode {changeTheirUsername} para qualquer coisa, então tome cuidado pois algumas pessoas podem se fingir de outras.\\\",\\\"tw.usesCloudVariables2.change\\\":\\\"mudar nome de usuário \\\",\\\"tw.viewFeaturedProjects\\\":\\\"Clique para ver projetos em destaque.\\\",\\\"tw.viewOnScratch\\\":\\\"Ver projeto no Scratch\\\"},\\\"ro\\\":{\\\"tw.alerts.creatingRestorePoint\\\":\\\"Se creează punctul de recuperare…\\\",\\\"tw.alerts.savedToDisk\\\":\\\"Salvat pe calculatorul tău.\\\",\\\"tw.blocks.addons\\\":\\\"Extensii\\\",\\\"tw.blocks.buttonIsDown\\\":\\\"butonul mouse-ului [MOUSE_BUTTON] apăsat?\\\",\\\"tw.blocks.lastKeyPressed\\\":\\\"ultima tastă apăsată\\\",\\\"tw.blocks.mouseButton.middle\\\":\\\"(1) mijloc\\\",\\\"tw.blocks.mouseButton.primary\\\":\\\"(0) principal\\\",\\\"tw.blocks.mouseButton.secondary\\\":\\\"(2) secundar\\\",\\\"tw.blocks.openDocs\\\":\\\"Deschide Documentarea\\\",\\\"tw.changeUsername.cannotChangeWhileRunning\\\":\\\"Numele de utilizator nu poate fi schimbat cât timp proiectul rulează.\\\",\\\"tw.code\\\":\\\"Cod sursă\\\",\\\"tw.featuredProjectsStudio\\\":\\\"Vezi atilierul pe Scratch.\\\",\\\"tw.feedback\\\":\\\"Sugestii și Erori\\\",\\\"tw.footer.credits\\\":\\\"Credite\\\",\\\"tw.footer.embed\\\":\\\"Încorporare\\\",\\\"tw.footer.parameters\\\":\\\"Parametri URL\\\",\\\"tw.fps\\\":\\\"{framerate} Cadre Pe Secundă\\\",\\\"tw.gui.defaultProjectTitle\\\":\\\"Proiect\\\",\\\"tw.guiDefaultTitle\\\":\\\"Rulează proiecte Scratch mai rapid\\\",\\\"tw.home.credit\\\":\\\"Observații și Credite\\\",\\\"tw.home.instructions\\\":\\\"Instrucțiuni\\\",\\\"tw.invalidParameters.clones\\\":\\\"parametrul URL „clone” este invalid\\\",\\\"tw.invalidParameters.fps\\\":\\\"parametrul URL „fps” este invalid\\\",\\\"tw.loader.loadingAssets\\\":\\\"Se încarcă blocurile ({complete}/{total}) …\\\",\\\"tw.loader.projectData\\\":\\\"Se încarcă proiectul …\\\",\\\"tw.menuBar.60off\\\":\\\"Oprește modul de 60 Cadre Pe Secundă (FPS)\\\",\\\"tw.menuBar.60on\\\":\\\"Pornește modul de 60 Cadre Pe Secundă (FPS)\\\",\\\"tw.menuBar.addons\\\":\\\"Extensii\\\",\\\"tw.menuBar.advanced\\\":\\\"Avansat\\\",\\\"tw.menuBar.changeUsername\\\":\\\"Schimbă Utilizatorul\\\",\\\"tw.menuBar.cloudOff\\\":\\\"Oprește Variabilele Cloud\\\",\\\"tw.menuBar.cloudOn\\\":\\\"Pornește Variabilele Cloud\\\",\\\"tw.menuBar.cloudUnavailable\\\":\\\"Variabilele Cloud nu sunt valabile\\\",\\\"tw.menuBar.cloudUnavailableAlert\\\":\\\"Nu se pot folosi variabilele cloud, cel mai probabil deoarece ai deschis editorul.\\\",\\\"tw.menuBar.newFramerate\\\":\\\"Cadre Pe Secundă:\\\",\\\"tw.menuBar.reportError2\\\":\\\"Aceasta este o eroare. Vă rugăm s-o raportați.\\\",\\\"tw.menuBar.saveAs\\\":\\\"Salvează ca {file}\\\",\\\"tw.menuBar.seeInside\\\":\\\"Vezi în interior\\\",\\\"tw.privacy\\\":\\\"Politica de Confidențialitate\\\",\\\"tw.settingsModal.disableCompiler\\\":\\\"Oprește Compilerul\\\",\\\"tw.studioview.authorAttribution\\\":\\\"de {author}\\\",\\\"tw.studioview.error\\\":\\\"A apărut o eroare la încărcarea paginii urmatoare cu proiecte.\\\",\\\"tw.studioview.hoverText\\\":\\\"{title} de {author}\\\",\\\"tw.usernameModal.new\\\":\\\"Nume de utilizator nou:\\\",\\\"tw.usernameModal.reset\\\":\\\"Resetează\\\",\\\"tw.usernameModal.title\\\":\\\"Schimbă Utilizatorul\\\",\\\"tw.viewFeaturedProjects\\\":\\\"Vezi proiectele recomandate (dați click).\\\"},\\\"ru\\\":{\\\"tw.accent.blue\\\":\\\"Синий\\\",\\\"tw.accent.purple\\\":\\\"Фиолетовый\\\",\\\"tw.accent.rainbow\\\":\\\"Радуга\\\",\\\"tw.accent.red\\\":\\\"Красный\\\",\\\"tw.alerts.creatingRestorePoint\\\":\\\"Создание точку восстановления...\\\",\\\"tw.alerts.lostPeripheralConnection\\\":\\\"Потеря соединения с {extensionName}.\\\",\\\"tw.alerts.restorePointError\\\":\\\"Не удалось создать точку восстановления\\\",\\\"tw.alerts.restorePointSuccess\\\":\\\"Получите доступ к точкам восстановления в разделе \\\\\\\"Файл\\\\\\\"\\\",\\\"tw.alerts.savedToDisk\\\":\\\"Сохранено на ваш компьютер.\\\",\\\"tw.backpack.rename\\\":\\\"Новое имя:\\\",\\\"tw.blockColors.custom\\\":\\\"Кастомизация в Настройках Аддонов\\\",\\\"tw.blockColors.dark\\\":\\\"Тёмный (Beta)\\\",\\\"tw.blockColors.highContrast\\\":\\\"Высокий Контраст\\\",\\\"tw.blockColors.three\\\":\\\"Оригинал\\\",\\\"tw.blocks.PROCEDURES_DOCS\\\":\\\"Как использовать \\\\\\\"вернуть\\\\\\\"\\\",\\\"tw.blocks.PROCEDURES_RETURN\\\":\\\"вернуть {v}\\\",\\\"tw.blocks.PROCEDURES_TO_REPORTER\\\":\\\"Переключиться на Репортера\\\",\\\"tw.blocks.PROCEDURES_TO_STATEMENT\\\":\\\"Перейти к Заявлению\\\",\\\"tw.blocks.addons\\\":\\\"Аддоны\\\",\\\"tw.blocks.buttonIsDown\\\":\\\"[MOUSE_BUTTON] кнопка мыши нажата?\\\",\\\"tw.blocks.lastKeyPressed\\\":\\\"последняя нажатая клавиша\\\",\\\"tw.blocks.mouseButton.middle\\\":\\\"(1) средняя\\\",\\\"tw.blocks.mouseButton.primary\\\":\\\"(0) основная\\\",\\\"tw.blocks.mouseButton.secondary\\\":\\\"(2) дополнительная\\\",\\\"tw.blocks.openDocs\\\":\\\"Открыть Документацию\\\",\\\"tw.browserModal.desktopSettings\\\":\\\"Открыть Настройки Рабочего стола\\\",\\\"tw.browserModal.desktopTitle\\\":\\\"Система не поддерживается\\\",\\\"tw.browserModal.webgl1\\\":\\\" {APP_NAME} требует WebGL, однако ваш компьютер, похоже, не поддерживает его. Часто это временная ошибка, которую можно устранить, перезагрузив компьютер.\\\",\\\"tw.browserModal.webglBrowser\\\":\\\"Используйте последнюю версию Chrome, Firefox или Safari и убедитесь, что ваши графические драйверы обновлены. Вы также можете попробовать включить опцию \\\\\\\"графическое ускорение\\\\\\\" или \\\\\\\"аппаратное ускорение\\\\\\\" в настройках браузера.\\\",\\\"tw.browserModal.webglDesktop\\\":\\\"Вы также можете попробовать включить опцию \\\\\\\"ускорение графики\\\\\\\" в настройках рабочего стола:\\\",\\\"tw.cantUseCloud\\\":\\\"Хотя вы можете создавать облачные переменные, они не будут работать до тех пор, пока проект не будет загружен в Scratch или преобразован с помощью такого инструмента, как {packager}.\\\",\\\"tw.changeUsername.cannotChangeWhileRunning\\\":\\\"Имя пользователя не может быть изменено, пока проект запущен.\\\",\\\"tw.clipboard.danger\\\":\\\"Если ваш Буфер Обмена содержит такие штуки как пароли, проект сможет иметь к ним доступ чтобы поделиться с другими пользователями или серверами.\\\",\\\"tw.clipboard.permission\\\":\\\"Доступ к Буферу Обмена может не работать в некоторых браузерах. Если это разрешено, дальнейшее чтение из буфера обмена будет разрешено автоматически.\\\",\\\"tw.clipboard.title\\\":\\\"Этот проект хочет прочитать данные из вашего Буфера Обмена.\\\",\\\"tw.cloudProvider\\\":\\\"Сервер, предоставленный от {name}.\\\",\\\"tw.cloudServers\\\":\\\"Выберите сервер рядом с вами:\\\",\\\"tw.code\\\":\\\"Исходный Код\\\",\\\"tw.confirmIncompatibleExtension\\\":\\\"Это дополнение не совместимо со Scratch. Проекты, которые используют это дополнение, не могут быть опубликованы на сайт Scratch. Вы уверены, что хотите включить это дополнение?\\\",\\\"tw.createdBy\\\":\\\"Создано:\\\",\\\"tw.customCloudServer\\\":\\\"Пользование пользовательского сервера облачных переменных: {server}\\\",\\\"tw.customExtension.description\\\":\\\"Загружайте пользовательские расширения из URL-адресов, файлов, или исходного кода JavaScript.\\\",\\\"tw.customExtension.name\\\":\\\"Пользовательское Расширение\\\",\\\"tw.customExtensionModal.file\\\":\\\"Файлы\\\",\\\"tw.customExtensionModal.load\\\":\\\"Загрузить\\\",\\\"tw.customExtensionModal.promptFile\\\":\\\"Выберите или опустите файлы JavaScript расширения:\\\",\\\"tw.customExtensionModal.promptText\\\":\\\"Вставьте исходный код расширения JavaScript:\\\",\\\"tw.customExtensionModal.promptURL\\\":\\\"Введите URL-адрес расширения:\\\",\\\"tw.customExtensionModal.text\\\":\\\"Текст\\\",\\\"tw.customExtensionModal.title\\\":\\\"Загрузить Пользовательское Расширение\\\",\\\"tw.customExtensionModal.trusted\\\":\\\"Это расширение будет загружено без песочницы, поскольку оно получено из доверенного источника.\\\",\\\"tw.customExtensionModal.unsandboxed\\\":\\\"Запустить без песочницы\\\",\\\"tw.customExtensionModal.unsandboxedWarning1\\\":\\\"Загрузка расширений без режима песочницы опасно и не должна быть включена, если вы не знаете, что делаете.\\\",\\\"tw.customExtensionModal.unsandboxedWarning2\\\":\\\"Незашифрованные расширения могут повредить ваш проект, удалить ваши настройки, подделать пароли и другие плохие вещи. Разработчики {APP_NAME} не несут ответственности за любые возникающие проблемы.\\\",\\\"tw.customExtensionModal.untrusted\\\":\\\"Расширения с ненадежных URL-адресов всегда будут загружаться в изолированную среду для обеспечения безопасности.\\\",\\\"tw.customExtensionModal.url\\\":\\\"URL-адрес\\\",\\\"tw.customReporters.description\\\":\\\"Разрешить пользовательским блокам выводить значения и использовать их в качестве входных данных.\\\",\\\"tw.customReporters.name\\\":\\\"Пользовательские Репортеры\\\",\\\"tw.darkMode\\\":\\\"Поменять на Светлый Режим\\\",\\\"tw.desktopCloud\\\":\\\"В настольном приложении облачные переменные синхронизируются между всеми окнами настольного приложения на этом компьютере. Загрузите проект в Scratch или используйте инструмент, подобный {packager}, для их глобальной синхронизации.\\\",\\\"tw.documentation\\\":\\\"Документация\\\",\\\"tw.download.danger\\\":\\\"Этот файл не был рассмотрен разработчиками {APP_NAME}.\\\",\\\"tw.download.executable\\\":\\\"Этот файл выполнимого формата может содержать вредоносный код, если вы его запустите.\\\",\\\"tw.download.file\\\":\\\"Проект хочет скачать файл на ваш компьютер. Он будет сохранён как {name} в вашей папке скачиваний.\\\",\\\"tw.embed.persistent\\\":\\\"Если разрешить, дальнейшие вставки на тот же сайт будут разрешены автоматически.\\\",\\\"tw.embed.risks\\\":\\\"Хотя встраиваемое приложение будет изолировано, оно по-прежнему будет иметь доступ к информации о вашем устройстве, такой как ваш IP-адрес и общее местоположение.\\\",\\\"tw.embed.title1\\\":\\\"Проект хочет вставить HTML контент поверх всей сцены:\\\",\\\"tw.embed.title2\\\":\\\"Проект хочет вставить удаленный контент поверх всей сцены:\\\",\\\"tw.extension.faceSensing.description\\\":\\\"Распознавайте лица с помощью камеры.\\\",\\\"tw.extension.faceSensing.name\\\":\\\"Распознание Лиц\\\",\\\"tw.extensionGallery.error\\\":\\\"Ошибка загрузки галереи расширений. Посетите extensions.turbowarp.org чтобы найти больше расширений.\\\",\\\"tw.extensionGallery.loading\\\":\\\"Загрузка галереи расширений...\\\",\\\"tw.extensionGallery.more\\\":\\\"Почитать подробнее об расширениях на extensions.turbowarp.org.\\\",\\\"tw.extensionGallery.name\\\":\\\"Галерея {APP_NAME} Расширений\\\",\\\"tw.favorite\\\":\\\"Избраннуть\\\",\\\"tw.featuredProjectsStudio\\\":\\\"Посмотреть студию на Scratch.\\\",\\\"tw.feedback\\\":\\\"Обратная связь и Баги\\\",\\\"tw.feedbackButton\\\":\\\"Обратная Связь {APP_NAME}\\\",\\\"tw.fetch.title\\\":\\\"Проект хочет подключиться к сайту:\\\",\\\"tw.fileInput.none\\\":\\\"Нет выбранных файлов.\\\",\\\"tw.fileInput.selected\\\":\\\"Выбрано: {names}\\\",\\\"tw.fonts.add\\\":\\\"Добавить\\\",\\\"tw.fonts.custom.file\\\":\\\"Выберите файл шрифта с вашего компьютера:\\\",\\\"tw.fonts.custom.name\\\":\\\"Дать шрифту название:\\\",\\\"tw.fonts.custom1\\\":\\\"Добавить шрифт из файла\\\",\\\"tw.fonts.custom2\\\":\\\"Обычно не работает для Scratch. Поддерживаемые форматы: {formats}.\\\",\\\"tw.fonts.delete\\\":\\\"Вы уверены, что хотите удалить \\\\\\\"{font}\\\\\\\"? В любых векторных костюмах вместо этого будет использоваться резервный шрифт.\\\",\\\"tw.fonts.fallback\\\":\\\"Выберите резервный шрифт, который будет использоваться, если шрифт не загрузится или будет удален:\\\",\\\"tw.fonts.list\\\":\\\"Скачанные шрифты:\\\",\\\"tw.fonts.none\\\":\\\"Нету добавленных шрифтов\\\",\\\"tw.fonts.readError\\\":\\\"Не удалось прочитать файл шрифта: {error}\\\",\\\"tw.fonts.system\\\":\\\"Системный шрифт\\\",\\\"tw.fonts.system.name\\\":\\\"Введите название любого шрифта, встроенного в ваш компьютер. Шрифт может отображаться неправильно у всех.\\\",\\\"tw.fonts.system1\\\":\\\"Добавить системный шрифт\\\",\\\"tw.fonts.system2\\\":\\\"Может работать в Scratch, но не будет отображаться правильно у всех.\\\",\\\"tw.fonts.title\\\":\\\"Шрифты\\\",\\\"tw.footer.credits\\\":\\\"Благодарности\\\",\\\"tw.footer.disclaimer\\\":\\\"{APP_NAME} не связан со Scratch, командой Scratch или фондом Scratch Foundation.\\\",\\\"tw.footer.documentation\\\":\\\"Документация\\\",\\\"tw.footer.embed\\\":\\\"Встраивание\\\",\\\"tw.footer.parameters\\\":\\\"Параметры URL\\\",\\\"tw.footer.scratchDisclaimer\\\":\\\"Scratch - это проект Фонда Scratch Foundation. Он доступен бесплатно на сайте {scratchDotOrg}.\\\",\\\"tw.geolocate.permission\\\":\\\"Если разрешить, вашему браузеру может быть предложено разрешить доступ к местоположению.\\\",\\\"tw.geolocate.title\\\":\\\"Проект хочет знать ваше местоположение.\\\",\\\"tw.gui.crashMessage.description\\\":\\\"Нам очень жаль, но похоже, что страница дала сбой. Пожалуйста, обновите страницу, чтобы повторить попытку.\\\",\\\"tw.gui.defaultProjectTitle\\\":\\\"Проект\\\",\\\"tw.guiDefaultTitle\\\":\\\"Запускайте проекты Scratch быстрее\\\",\\\"tw.home.credit\\\":\\\"Примечания и Благодарности\\\",\\\"tw.home.description\\\":\\\"{APP_NAME} - это мод на Scratch, который компилирует проекты в JavaScript, чтобы они работали быстрее. Попробуйте ввести ссылку на проект выше или выберете из избранных проектов ниже.\\\",\\\"tw.home.instructions\\\":\\\"Инструкции\\\",\\\"tw.input.tooltip\\\":\\\"Скопируйте ссылку на проект Scratch и вставьте её сюда!\\\",\\\"tw.interpolationEnabled\\\":\\\"Интерполяция\\\",\\\"tw.invalidParameters.clones\\\":\\\"Параметр \\\\\\\"clone\\\\\\\" в URL-адресе некорректен\\\",\\\"tw.invalidParameters.fps\\\":\\\"Параметр \\\\\\\"fps\\\\\\\" в URL-адресе некорректен\\\",\\\"tw.invalidProject.error\\\":\\\"Не удалось загрузить проект:\\\",\\\"tw.invalidProject.options\\\":\\\"Вы возможно не сможете восстановить старые версии проекта из автоматических точек восстановления или других резервных копий.\\\",\\\"tw.invalidProject.reportIt\\\":\\\"сообщите об этом\\\",\\\"tw.invalidProject.restorePoints\\\":\\\"Посмотреть Точки Восстановления\\\",\\\"tw.invalidProject.sb3fix\\\":\\\"использовать sb3fix, чтобы восстановить ваш проект\\\",\\\"tw.invalidProject.title\\\":\\\"Ошибка\\\",\\\"tw.invalidProject.validationError\\\":\\\"Эта ошибка появляется тогда, когда маленькая часть проекта была заражена, но в остальное правильно. Это легко можно починить так, пожалуйста, {reportIt}.\\\",\\\"tw.invalidProject.zipCorruption\\\":\\\"Эта ошибка часто означает, что файл был повреждён, возможно, из-за неисправного устройства хранения данных, отключения питания или извлечения USB-накопителя без предварительного отключения. Попробуйте {usingSb3fix}, так как это может помочь устранить ошибку такого типа.\\\",\\\"tw.lightMode\\\":\\\"Поменять на Тёмный Режим\\\",\\\"tw.loadExtension.embedded\\\":\\\"Проект хочет загрузить пользовательское расширение с кодом:\\\",\\\"tw.loadExtension.sandboxed\\\":\\\"Хотя код будет изолирован, он по-прежнему будет иметь доступ к информации о вашем устройстве, такое как ваш IP адрес и общее местоположение. Прежде чем продолжить, убедитесь, что вы доверяете автору этого расширения.\\\",\\\"tw.loadExtension.unsandboxed\\\":\\\"Запустить без песочницы\\\",\\\"tw.loadExtension.unsandboxedWarning\\\":\\\"Загрузка расширений без песочницы опасна. Это может привести к повреждению вашего проекта, удалению настроек, вымогательству паролей и другим плохим вещам. Разработчики {APP_NAME} не несут ответственности за любые возникающие проблемы.\\\",\\\"tw.loadExtension.url\\\":\\\"Проект хочет загрузить пользовательское расширение из URL-адреса:\\\",\\\"tw.loader.downloadingAssets\\\":\\\"Скачивание ресурсов ({complete} / {total}) ...\\\",\\\"tw.loader.loadingAssets\\\":\\\"Загрузка ресурсов ({complete}/{total})...\\\",\\\"tw.loader.projectData\\\":\\\"Загрузка проекта ...\\\",\\\"tw.menuBar.60off\\\":\\\"Выключить режим 60 FPS\\\",\\\"tw.menuBar.60on\\\":\\\"Включить режим 60 FPS\\\",\\\"tw.menuBar.accent\\\":\\\"Акцент\\\",\\\"tw.menuBar.addons\\\":\\\"Аддоны\\\",\\\"tw.menuBar.advanced\\\":\\\"Дополнительно\\\",\\\"tw.menuBar.blockColors\\\":\\\"Цвета Блоков\\\",\\\"tw.menuBar.changeUsername\\\":\\\"Изменить Имя Пользователя\\\",\\\"tw.menuBar.cloudOff\\\":\\\"Отключить облачные переменные\\\",\\\"tw.menuBar.cloudOn\\\":\\\"Включить облачные переменные\\\",\\\"tw.menuBar.cloudUnavailable\\\":\\\"Облачные переменные Недоступны\\\",\\\"tw.menuBar.cloudUnavailableAlert\\\":\\\"Невозможно использовать облачные переменные, скорее всего, потому, что вы открыли редактор.\\\",\\\"tw.menuBar.desktopSettings\\\":\\\"Настройки Рабочего Места\\\",\\\"tw.menuBar.moreSettings\\\":\\\"Расширенные Настройки\\\",\\\"tw.menuBar.newFramerate\\\":\\\"Новая частота кадров:\\\",\\\"tw.menuBar.newWindow\\\":\\\"Новое окно\\\",\\\"tw.menuBar.package\\\":\\\"Упаковать проект\\\",\\\"tw.menuBar.reportError1\\\":\\\"В некоторых скриптах возникли ошибки.\\\",\\\"tw.menuBar.reportError2\\\":\\\"Это баг. Пожалуйста, сообщите о ней.\\\",\\\"tw.menuBar.restorePoints\\\":\\\"Точки восстановления\\\",\\\"tw.menuBar.saveAs\\\":\\\"Сохранить как {file}\\\",\\\"tw.menuBar.seeInside\\\":\\\"Войти внутрь проекта\\\",\\\"tw.mono\\\":\\\"Моно\\\",\\\"tw.moreCloud\\\":\\\"Узнать побольше об облачных переменных.\\\",\\\"tw.notify.permission\\\":\\\"Если разрешить, ваш браузер может предложить вам включить уведомления, и дальнейшие уведомления будут разрешены автоматически.\\\",\\\"tw.notify.title\\\":\\\"Проект хочет отображать уведомления.\\\",\\\"tw.oldDownload\\\":\\\"Сохранить в отдельный файл...\\\",\\\"tw.opcode.2000\\\":\\\"дни с 2000 года\\\",\\\"tw.opcode.mousedown\\\":\\\"колесо нажато?\\\",\\\"tw.opcode.mousex\\\":\\\"x курсора\\\",\\\"tw.opcode.mousey\\\":\\\"y курсора\\\",\\\"tw.openAdvanced\\\":\\\"Открыть расширенные настройки\\\",\\\"tw.openWindow.dangerous\\\":\\\"Этот веб-сайт не проверялся разработчиками {APP_NAME}. Он может содержать опасный или вредоносный код.\\\",\\\"tw.openWindow.title\\\":\\\"Проект хочет открыть новое окно или вкладку с URL-адресом:\\\",\\\"tw.paint.alpha\\\":\\\"Непрозрачность\\\",\\\"tw.paint.fonts.more\\\":\\\"Добавить больше шрифтов…\\\",\\\"tw.pen.stageSelected\\\":\\\"Выбран этап: меньше блоков пера\\\",\\\"tw.privacy\\\":\\\"Политика Конфиденциальности\\\",\\\"tw.recordAudio.permission\\\":\\\"Если разрешить, вашему браузеру может быть предложено включить доступ к микрофону, и дальнейший доступ к микрофону будет разрешен автоматически.\\\",\\\"tw.recordAudio.title\\\":\\\"Проект хочет записать аудио с вашего микрофона. Это может включать текстовую расшифровку или необработанные аудиоданные. Проект может иметь возможность обмениваться аудио с другими пользователями или серверами.\\\",\\\"tw.recordVideo.permission\\\":\\\"Если разрешить, вам может быть предложено включить доступ к камере в вашем браузере, и дальнейший доступ к камере будет разрешен автоматически.\\\",\\\"tw.recordVideo.title\\\":\\\"Проект хочет записать видео с вашей камеры. Возможно, проект сможет обмениваться изображениями с другими пользователями или серверами.\\\",\\\"tw.redirect.dangerous\\\":\\\"Этот веб-сайт не проверялся разработчиками {APP_NAME}. Он может содержать опасный или вредоносный код.\\\",\\\"tw.redirect.title\\\":\\\"Проект хочет перейти на эту вкладку по URL-адресу:\\\",\\\"tw.removedTrademarks\\\":\\\"Некоторые товары, содержащие товарные знаки Scratch, больше не перечислены здесь.\\\",\\\"tw.restorePoints.1minute\\\":\\\"каждую минуту\\\",\\\"tw.restorePoints.assets\\\":\\\"Ресурсы {n}\\\",\\\"tw.restorePoints.confirmDelete\\\":\\\"Вы уверены, что хотите удалить \\\\\\\"{projectTitle}\\\\\\\"? Это невозможно отменить.\\\",\\\"tw.restorePoints.confirmDeleteAll\\\":\\\"Вы уверены, что хотите удалить ВСЕ точки восстановления? Это невозможно отменить.\\\",\\\"tw.restorePoints.confirmLoad\\\":\\\"У вас есть несохраненные изменения. Заменить проект который сейчас редактируется?\\\",\\\"tw.restorePoints.deleteAll\\\":\\\"Удалить Всё\\\",\\\"tw.restorePoints.description\\\":\\\"{APP_NAME} периодически сохраняет точки восстановления на вашем компьютере, чтобы помочь восстановить ваш проект, если вы забудете сохранить. Это предназначено в качестве последнего средства для восстановления. Ваш компьютер может автоматически удалить эти точки восстановления в любое время. НЕ полагайтесь на эту функцию.\\\",\\\"tw.restorePoints.empty\\\":\\\"Точки восстановления не найдены.\\\",\\\"tw.restorePoints.error\\\":\\\"Ошибка загрузки точки восстановления: {error}\\\",\\\"tw.restorePoints.exportError\\\":\\\"Ошибка при экспорте точки восстановления: {error}\\\",\\\"tw.restorePoints.intervalOption\\\":\\\"Точки восстановления созданы {time}.\\\",\\\"tw.restorePoints.loading\\\":\\\"Загрузка...\\\",\\\"tw.restorePoints.minutes\\\":\\\"каждые {n} минут\\\",\\\"tw.restorePoints.never\\\":\\\"никогда\\\",\\\"tw.restorePoints.off\\\":\\\"Выключать точки восстановления опасно.\\\",\\\"tw.restorePoints.size\\\":\\\"Предполагаемый объем используемого хранилища: {size}\\\",\\\"tw.restorePoints.size2\\\":\\\"Костюмы или звуки, используемые несколькими точками восстановления, сохраняются только один раз.\\\",\\\"tw.restorePoints.title\\\":\\\"Точки Восстановления\\\",\\\"tw.sample\\\":\\\"Пример Проекта\\\",\\\"tw.saveAs\\\":\\\"Сохранить как...\\\",\\\"tw.saveTo\\\":\\\"Сохранить в {file}\\\",\\\"tw.scratchUnsafeCloud\\\":\\\"Если вы сделаете эту облачную переменную, проект превысит лимит Scratch в {number} переменных, и некоторые переменные не будут работать, если вы загрузите проект в Scratch.\\\",\\\"tw.securityManager.allow\\\":\\\"Разрешить\\\",\\\"tw.securityManager.deny\\\":\\\"Запретить\\\",\\\"tw.securityManager.title\\\":\\\"Расширение Безопасности\\\",\\\"tw.securityManager.trust\\\":\\\" Если разрешить, дальнейшие запросы на тот же сайт будут разрешены автоматически.\\\",\\\"tw.securityManager.why\\\":\\\"Это может быть использовано для загрузки изображений или звуков, реализации многопользовательской игры, доступа к API или в злонамеренных целях. При этом веб-сайт получит доступ к вашему IP-адресу, общему местоположению и, возможно, другим данным.\\\",\\\"tw.settingsModal.customStageSize\\\":\\\"Пользовательский размер сцены:\\\",\\\"tw.settingsModal.customStageSizeHelp\\\":\\\"Изменяет размер сцены из 480х360 на что-то другое. Попробуйте использовать 640х360, чтобы сделать сцену широкоэкранной. Лишь некоторые проекты будут работать правильно с этой настройкой.\\\",\\\"tw.settingsModal.dangerZone\\\":\\\"Опасная Зона\\\",\\\"tw.settingsModal.disableCompiler\\\":\\\"Отключить Компилятор\\\",\\\"tw.settingsModal.disableCompilerHelp\\\":\\\"Отключает компилятор {APP_NAME}. Возможно, вы захотите включить это при редактировании проектов, чтобы скрипты обновлялись немедленно. В противном случае вам никогда не следует включать это.\\\",\\\"tw.settingsModal.featured\\\":\\\"Избранное\\\",\\\"tw.settingsModal.fps\\\":\\\"60 FPS (Пользовательское FPS)\\\",\\\"tw.settingsModal.fpsHelp\\\":\\\"Выполняет скрипты 60 раз в секунду вместо 30. Большинство проектов не будут работать должным образом, если этот параметр включен. Если это так, вам следует попробовать интерполяцию с отключенным режимом 60 FPS. {customFramerate}.\\\",\\\"tw.settingsModal.fpsHelp.customFramerate\\\":\\\"Нажмите, чтобы использовать частоту кадров другую, чем 30 или 60\\\",\\\"tw.settingsModal.help\\\":\\\"Нажмите для справки\\\",\\\"tw.settingsModal.highQualityPen\\\":\\\"Перо в Высоком Качестве\\\",\\\"tw.settingsModal.highQualityPenHelp\\\":\\\"Позволяет выполнять рендеринг проектов пера с более высоким разрешением и отключает некоторое округление координат в редакторе. Этот параметр полезен не для всех проектов, и это может повлиять на производительность.\\\",\\\"tw.settingsModal.infiniteClones\\\":\\\"Бесконечные клоны\\\",\\\"tw.settingsModal.infiniteClonesHelp\\\":\\\"Отключает ограничение Scratch в 300 клонов.\\\",\\\"tw.settingsModal.interpolation\\\":\\\"Интерполяция\\\",\\\"tw.settingsModal.interpolationHelp\\\":\\\"Делает, чтобы проекты производились более плавно, интерполируя движение спрайтов. Не используйте интерполяцию в 3D проектах, проектах с трассировкой лучей, проектах, выполненных пером и медленных проектах, интерполяция сделает их медленнее и не сделает их более плавными.\\\",\\\"tw.settingsModal.largeStageWarning\\\":\\\"Использовать настолько большой пользовательский размер сцены не рекомендуется! Лучше, используйте сцену меньшего размера, но с таким же соотношением сторон изображения и дайте полноэкранному режиму увеличить сцену так, чтобы она могла подойти по размерам к дисплею пользователя.\\\",\\\"tw.settingsModal.removeFencing\\\":\\\"Убрать Рамку\\\",\\\"tw.settingsModal.removeFencingHelp\\\":\\\"Позволяет спрайтам выходить за рамки сцены, становится настолько большими или маленькими, насколько они захотят, и делает, чтобы блоки касания работали за рамками сцены.\\\",\\\"tw.settingsModal.removeLimits\\\":\\\"Убрать Ограничения\\\",\\\"tw.settingsModal.removeMiscLimits\\\":\\\"Удалить Разные Ограничения\\\",\\\"tw.settingsModal.removeMiscLimitsHelp\\\":\\\"Убирает лимиты звуков и размера пера.\\\",\\\"tw.settingsModal.storeProjectOptions\\\":\\\"Сохранить настройки проекта\\\",\\\"tw.settingsModal.storeProjectOptionsHelp\\\":\\\"Сохранение выбранных настроек в проекте, чтобы они автоматически применялись при загрузке этого проекта TurboWarp'ом. Warp-таймер и отключение компилятора не будут сохранены.\\\",\\\"tw.settingsModal.title\\\":\\\"Расширенные Настройки\\\",\\\"tw.settingsModal.warpTimer\\\":\\\"Warp Таймер\\\",\\\"tw.settingsModal.warpTimerHelp\\\":\\\"Проверяет, какие скрипты застряли в долгом или бесконечном цикле и понижает частоту кадров, вместо того, чтобы он застыл пока цикл не завершится. Исправляет большую часть критических ошибок, но это негативно отражается на скорости проекта, поэтому он включается по умолчанию только в редакторе.\\\",\\\"tw.soundEditorNotSupported\\\":\\\"Редактор звука не поддерживается в этом браузере.\\\",\\\"tw.spriteSelectorItem.rename\\\":\\\"переименовать\\\",\\\"tw.stageHeader.full\\\":\\\"Поменять на полную сцену\\\",\\\"tw.stereo\\\":\\\"Стерео\\\",\\\"tw.stereoAlert\\\":\\\"Редактирование этого стерео звука необратимо преобразует его в моно звук.\\\",\\\"tw.studioview.authorAttribution\\\":\\\"от {author}\\\",\\\"tw.studioview.error\\\":\\\"Произошла ошибка во время загрузки следующей страницы проектов.\\\",\\\"tw.studioview.hoverText\\\":\\\"{title} от {author}\\\",\\\"tw.tooLarge\\\":\\\"Этот звук может быть слишком большим для загрузки в Scratch.\\\",\\\"tw.twExtension.description\\\":\\\"Новые странные блоки.\\\",\\\"tw.twExtension.name\\\":\\\"Блоки {APP_NAME}\\\",\\\"tw.unfavorite\\\":\\\"Отизбраннуть\\\",\\\"tw.unknownPlatform.1\\\":\\\"Проект был сделан для другой платформы:\\\",\\\"tw.unknownPlatform.2\\\":\\\"Совместимость с {APP_NAME} не гарантирована. Вы можете продолжить на свой страх и риск, но мы не сможем гарантировать помощь при встрече с какими либо проблемами.\\\",\\\"tw.unknownPlatform.continue\\\":\\\"Я понимаю\\\",\\\"tw.unknownPlatform.title\\\":\\\"Неизвестная Платформа\\\",\\\"tw.unshared.2\\\":\\\"Для получения большей информации посетите этот сайт: {link}\\\",\\\"tw.unshared.bug\\\":\\\"Если этот проект вообще является общим, пожалуйста, сообщите об этом.\\\",\\\"tw.unshared.cache\\\":\\\"Если проект был опубликован недавно, то это сообщение может ложно отображаться в течение нескольких минут.\\\",\\\"tw.unshared2.1\\\":\\\"Личные/Приватные проекты больше не видимы.\\\",\\\"tw.usernameModal.help\\\":\\\"Это значение будет сохранено в данных вашего браузера. Оно будет использоваться, когда вы используете проекты, в которых есть облачные переменные.\\\",\\\"tw.usernameModal.help2\\\":\\\"Значения, которые не соответствуют настоящим именам пользователя будут заблокированными сервером облачных переменных. Мы рекомендуем оставлять это значение, которым оно есть или изменять его на своё имя пользователя в Scratch.\\\",\\\"tw.usernameModal.mustChange\\\":\\\"Извините, сервер облачных переменных считает, что ваше имя пользователя может быть небезопасным. Измените имя пользователя на {resetIt} или другое.\\\",\\\"tw.usernameModal.mustChange.resetIt\\\":\\\"сбросить это (рекомендуется)\\\",\\\"tw.usernameModal.new\\\":\\\"Новое имя пользователя:\\\",\\\"tw.usernameModal.reset\\\":\\\"Сбросить\\\",\\\"tw.usernameModal.title\\\":\\\"Изменить Имя Пользователя\\\",\\\"tw.usesCloudVariables\\\":\\\"Этот проект использует облачные переменные.\\\",\\\"tw.usesCloudVariables2\\\":\\\"Облачные переменные {APP_NAME} не подключены к Scratch. Любой может {changeTheirUsername} на что угодно, поэтому остерегайтесь олицетворения.\\\",\\\"tw.usesCloudVariables2.change\\\":\\\"изменить их же имя пользователя\\\",\\\"tw.viewFeaturedProjects\\\":\\\"Нажмите, чтобы посмотреть избранные проекты.\\\",\\\"tw.viewOnScratch\\\":\\\"Посмотреть проект на Scratch\\\"},\\\"sk\\\":{\\\"tw.feedbackButton\\\":\\\"{APP_NAME} Spätná väzba\\\",\\\"tw.interpolationEnabled\\\":\\\"Interpolácia\\\",\\\"tw.menuBar.moreSettings\\\":\\\"Pokročilé Nastavenia\\\",\\\"tw.paint.alpha\\\":\\\"priehľadnosť\\\",\\\"tw.settingsModal.fps\\\":\\\"60 FPS (Vlastné FPS)\\\",\\\"tw.settingsModal.fpsHelp\\\":\\\"Spúšťa scenáre 60 krát za sekundu namiesto 30. Väčšina projektov nefunguje pri použití tohto nastavenia, ak je tak aj v tvojom prípade, skús použiť Interpoláciu s vypnutým módom 60 FPS. {customFramerate}.\\\",\\\"tw.settingsModal.fpsHelp.customFramerate\\\":\\\"Klikni pre použitie rýchlosti snímkov inej ako 30 alebo 60 FPS\\\",\\\"tw.settingsModal.highQualityPen\\\":\\\"Vysoká Kvalita Pera\\\",\\\"tw.settingsModal.highQualityPenHelp\\\":\\\"Umožňuje \\\\\\\"pen\\\\\\\" projektom, aby sa renderovali vo vyšších rozlíšeniach a zabraňuje niektoré zaokrúhľovania súradníc v editore. Nie všetky projekty benefitujú z tohto nastavenia a môže to ovplyvniť výkonnosť.\\\",\\\"tw.settingsModal.interpolation\\\":\\\"Interpolácia\\\",\\\"tw.settingsModal.interpolationHelp\\\":\\\"Spraví projekt plynulejší interpolovaním pohybu postavy. Interpolácia by nemala byť použitá pre 3D projekty, raytracery, \\\\\\\"pen\\\\\\\" projekty a sekajúce projekty, pretože interpolácia ich spomalí bez zlepšenia plynulosti.\\\",\\\"tw.settingsModal.title\\\":\\\"Pokročilé Nastavenia\\\",\\\"tw.stageHeader.full\\\":\\\"Prepni na veľkú scénu\\\"},\\\"sl\\\":{\\\"tw.accent.blue\\\":\\\"Modra\\\",\\\"tw.accent.purple\\\":\\\"Vijolična\\\",\\\"tw.accent.rainbow\\\":\\\"Mavrica\\\",\\\"tw.accent.red\\\":\\\"Rdeča\\\",\\\"tw.alerts.creatingRestorePoint\\\":\\\"Ustvarjanje obnovitvene različice...\\\",\\\"tw.alerts.savedToDisk\\\":\\\"Shranjeno na računalnik.\\\",\\\"tw.backpack.rename\\\":\\\"Novo ime:\\\",\\\"tw.blockColors.custom\\\":\\\"Prilagodi v nastavitvah dodatkov\\\",\\\"tw.blocks.PROCEDURES_DOCS\\\":\\\"Kako uporabljati blok Vrni\\\",\\\"tw.blocks.PROCEDURES_RETURN\\\":\\\"vrni {v}\\\",\\\"tw.blocks.addons\\\":\\\"Dodatki\\\",\\\"tw.blocks.buttonIsDown\\\":\\\"[MOUSE_BUTTON] miškina tipka pritisnjena?\\\",\\\"tw.blocks.lastKeyPressed\\\":\\\"zadnja pritisnjena tipka\\\",\\\"tw.blocks.mouseButton.middle\\\":\\\"(1) srenja\\\",\\\"tw.blocks.mouseButton.primary\\\":\\\"(0) glavna\\\",\\\"tw.blocks.mouseButton.secondary\\\":\\\"(2) sekundarna\\\",\\\"tw.blocks.openDocs\\\":\\\"Odpri dokumentacijo\\\",\\\"tw.changeUsername.cannotChangeWhileRunning\\\":\\\"Uporabniškega imena ni mogoče spremeniti med izvajanjem projekta.\\\",\\\"tw.clipboard.danger\\\":\\\"Če vaše odložišče vsebuje zaupne podatke, kot so gesla, jih bo projekt lahko delil z drugimi uporabniki ali strežniki.\\\",\\\"tw.clipboard.permission\\\":\\\"V nekaterih brskalnikih dostop do odložišča ne deluje. Če dostop dovolite, bo samodejno dovoljeno tudi nadaljnje branje z odložišča.\\\",\\\"tw.clipboard.title\\\":\\\"Ta projekt želi brati podatke z vašega odložišča.\\\",\\\"tw.cloudServers\\\":\\\"Izberite strežni blizu vas:\\\",\\\"tw.code\\\":\\\"Izvirna koda\\\",\\\"tw.confirmIncompatibleExtension\\\":\\\"Ta razširitev ni združljiva s Scratchem. Projektov, narejenih z njo, ni mogoče naložiti na Scratchevo spletno stran. Ste prepričani, da jo želite vključiti?\\\",\\\"tw.createdBy\\\":\\\"Avtorji:\\\",\\\"tw.customExtension.name\\\":\\\"Razširitev po meri\\\",\\\"tw.customExtensionModal.file\\\":\\\"Datoteke\\\",\\\"tw.customExtensionModal.load\\\":\\\"Naloži\\\",\\\"tw.customExtensionModal.promptFile\\\":\\\"Izberite ali povlecite datoteke JavaScript:\\\",\\\"tw.customExtensionModal.promptText\\\":\\\"Prilepite izvirno kodo JavaScript:\\\",\\\"tw.customExtensionModal.promptURL\\\":\\\"Vnesite URL razširitve:\\\",\\\"tw.customExtensionModal.text\\\":\\\"Besedilo\\\",\\\"tw.customExtensionModal.title\\\":\\\"Naloži razširitev po meri\\\",\\\"tw.customExtensionModal.unsandboxedWarning1\\\":\\\"Nalaganje razširitev brez peskovnika je nevarno, zato ga ne vključite, če ne veste, kaj to pomeni.\\\",\\\"tw.customExtensionModal.unsandboxedWarning2\\\":\\\"Razširitve zunaj peskovnika lahko pokvarijo projekt, izbrišejo vaše nastavitve, kradejo gesla in delajo druge slabe stvari. Razvijalci aplikacije {APP_NAME} niso odgovorni za težave, ki jih to povzroči.\\\",\\\"tw.darkMode\\\":\\\"Spremeni v svetli način\\\",\\\"tw.documentation\\\":\\\"Dokumentacija\\\",\\\"tw.download.danger\\\":\\\"Te datoteke razvijalci aplikacije {APP_NAME} niso pregledali.\\\",\\\"tw.download.executable\\\":\\\"To je izvedljiva datoteka, ki lahko vsebuje škodljivo kodo, če jo zaženete.\\\",\\\"tw.download.file\\\":\\\"Ta projekt želi prenesti datoteko na vaš računalnik. Shranjena bo kot {name} v vašo mapo s prenosi.\\\",\\\"tw.extensionGallery.error\\\":\\\"Napaka pri nalaganju galerije razširitev. Za več razširitev obiščite extensions.turbowarp.org.\\\",\\\"tw.extensionGallery.loading\\\":\\\"Nalaganje galerije razširitev...\\\",\\\"tw.extensionGallery.name\\\":\\\"Galerija razširitev za {APP_NAME}\\\",\\\"tw.featuredProjectsStudio\\\":\\\"Ogled studia na Scratchu.\\\",\\\"tw.feedback\\\":\\\"Povratne informacije in napake\\\",\\\"tw.feedbackButton\\\":\\\"Povratne informacije o {APP_NAME}\\\",\\\"tw.fetch.title\\\":\\\"Ta projekt se želi povezati s spletno stranjo:\\\",\\\"tw.fileInput.none\\\":\\\"Nobena datoteka ni izbrana.\\\",\\\"tw.fileInput.selected\\\":\\\"Izbrano: {names}\\\",\\\"tw.fonts.add\\\":\\\"Dodaj\\\",\\\"tw.fonts.custom.file\\\":\\\"Izberite datoteko s pisavo s svojega računalnika:\\\",\\\"tw.fonts.custom.name\\\":\\\"Poimenujte pisavo:\\\",\\\"tw.fonts.custom1\\\":\\\"Dodaj povezavo iz datoteke\\\",\\\"tw.fonts.custom2\\\":\\\"Verjetno ne bo delovala v Scratchu. Podprte oblike: {formats}.\\\",\\\"tw.fonts.list\\\":\\\"Nameščene pisave:\\\",\\\"tw.fonts.none\\\":\\\"Nobena pisava še ni dodana.\\\",\\\"tw.fonts.readError\\\":\\\"Branje datoteke s pisavo ni uspelo: {error}\\\",\\\"tw.fonts.system\\\":\\\"Sistemska pisava\\\",\\\"tw.fonts.system.name\\\":\\\"Vnesite ime katere koli pisave, ki je vgrajena v vaš računalnik. Pisave morda ne bodo vsi videli pravilno.\\\",\\\"tw.fonts.system1\\\":\\\"Dodaj sistemsko pisavo\\\",\\\"tw.fonts.system2\\\":\\\"Morda bo delovala v Scratchu, vendar je ne bodo vsi videli pravilno.\\\",\\\"tw.fonts.title\\\":\\\"Pisave\\\",\\\"tw.footer.credits\\\":\\\"Zasluge\\\",\\\"tw.footer.disclaimer\\\":\\\"{APP_NAME} ni povezan s Scratchem, skupino Scratch ali fundacijo Scratch.\\\",\\\"tw.footer.documentation\\\":\\\"Dokumentacija\\\",\\\"tw.footer.embed\\\":\\\"Vgraditev\\\",\\\"tw.footer.parameters\\\":\\\"URL parametri\\\",\\\"tw.footer.scratchDisclaimer\\\":\\\"Scratch je projekt fundacije Scratch Foundation. Brezplačno je na voljo na {scratchDotOrg}.\\\",\\\"tw.geolocate.permission\\\":\\\"Če to omogočite, vas bo brskalnik morda vprašal, če dovolite dostop do lokacije.\\\",\\\"tw.geolocate.title\\\":\\\"Ta projekt želi uporabljati vašo lokacijo.\\\",\\\"tw.gui.crashMessage.description\\\":\\\"Žal je videti, da je na tej strani prišlo do napake. Prosimo, da znova naložite stran, če želite poskusiti znova.\\\",\\\"tw.gui.defaultProjectTitle\\\":\\\"Projekt\\\",\\\"tw.guiDefaultTitle\\\":\\\"Izvedite Scratcheve projekte hitreje\\\",\\\"tw.home.credit\\\":\\\"Opombe in zasluge\\\",\\\"tw.home.description\\\":\\\"{APP_NAME} je spremenjena različica Scratcha, ki prevede projekte v JavaScript, da delujejo zelo hitro. Preizkusite ga tako, da zgoraj vnesete ID ali URL projekta ali pa spodaj izberete enega od izpostavljenih projektov.\\\",\\\"tw.home.instructions\\\":\\\"Navodila\\\",\\\"tw.input.tooltip\\\":\\\"Prilepite povezavo na Scratchev projekt sem!\\\",\\\"tw.interpolationEnabled\\\":\\\"Interpolacija\\\",\\\"tw.invalidParameters.clones\\\":\\\"Parameter \\\\\\\"clone\\\\\\\" v URL-ju ni veljaven\\\",\\\"tw.invalidParameters.fps\\\":\\\"Parameter \\\\\\\"fps\\\\\\\" v URL-ju ni veljaven\\\",\\\"tw.invalidProject.error\\\":\\\"Nalaganje projekta ni uspelo:\\\",\\\"tw.invalidProject.reportIt\\\":\\\"prijavite\\\",\\\"tw.invalidProject.title\\\":\\\"Napaka\\\",\\\"tw.invalidProject.validationError\\\":\\\"Ta napaka pogosto pomeni, da je majhen del projekta pokvarjen, čeprav sicer ni nič narobe. To je včasih enostavno popraviti, zato prosimo, da napako {reportIt}.\\\",\\\"tw.lightMode\\\":\\\"Spremeni v temni način\\\",\\\"tw.loadExtension.embedded\\\":\\\"Ta projekt želi naložiti razširitev po meri s kodo:\\\",\\\"tw.loadExtension.sandboxed\\\":\\\"Čeprav bo koda v peskovniku, bo imela dostop do podatkov o vaši napravi, kot je IP naslov in približna lokacija. Prepričajte se, da zaupajte avtorju te razširitve, preden nadaljujete.\\\",\\\"tw.loadExtension.unsandboxedWarning\\\":\\\"Nalaganje razširitev brez peskovnika je nevarno. Razširitev lahko pokvari projekt, izbriše vaše nastavitve, krade gesla in dela druge slabe stvari. Razvijalci aplikacije {APP_NAME} niso odgovorni za težave, ki jih to povzroči.\\\",\\\"tw.loadExtension.url\\\":\\\"Ta projekt želi naložiti razširitev po meri z URL-ja:\\\",\\\"tw.loader.downloadingAssets\\\":\\\"Nalaganje projekta ({complete}/{total}) ...\\\",\\\"tw.loader.loadingAssets\\\":\\\"Nalaganje videzov in zvokov ({complete}/{total}) ...\\\",\\\"tw.loader.projectData\\\":\\\"Nalaganje projekta ...\\\",\\\"tw.menuBar.60off\\\":\\\"Izključi 60 FPS način\\\",\\\"tw.menuBar.60on\\\":\\\"Vključi 60 FPS način\\\",\\\"tw.menuBar.accent\\\":\\\"Barva poudarkov\\\",\\\"tw.menuBar.addons\\\":\\\"Dodatki\\\",\\\"tw.menuBar.advanced\\\":\\\"Napredno\\\",\\\"tw.menuBar.blockColors\\\":\\\"Barve blokov\\\",\\\"tw.menuBar.changeUsername\\\":\\\"Spremeni uporabniško ime\\\",\\\"tw.menuBar.cloudOff\\\":\\\"Onemogoči spremenljivke v oblaku\\\",\\\"tw.menuBar.cloudOn\\\":\\\"Omogoči spremenljivke v oblaku\\\",\\\"tw.menuBar.cloudUnavailable\\\":\\\"Spremenljivke v oblaku niso na voljo\\\",\\\"tw.menuBar.cloudUnavailableAlert\\\":\\\"Ni mogoče uporabiti spremenljivk v oblaku, verjetno zato, ker ste odprli urejevalnik\\\",\\\"tw.menuBar.desktopSettings\\\":\\\"Nastavitve namizne različice\\\",\\\"tw.menuBar.moreSettings\\\":\\\"Napredne nastavitve\\\",\\\"tw.menuBar.newFramerate\\\":\\\"Nov FPS:\\\",\\\"tw.menuBar.newWindow\\\":\\\"Novo okno\\\",\\\"tw.menuBar.package\\\":\\\"Zapakiraj projekt\\\",\\\"tw.menuBar.reportError1\\\":\\\"V nekaterih skriptah je prišlo do napake.\\\",\\\"tw.menuBar.reportError2\\\":\\\"To je napaka. Prosimo, da jo prijavite.\\\",\\\"tw.menuBar.saveAs\\\":\\\"Shrani kot {file}\\\",\\\"tw.menuBar.seeInside\\\":\\\"Poglej v\\\",\\\"tw.notify.permission\\\":\\\"Če to dovolite, vas bo brskalnik morda vprašal, ali želite omogočiti obvestila. Nadaljnja obvestila bodo samodejno omogočena.\\\",\\\"tw.notify.title\\\":\\\"Ta projekt želi prikazovati obvestila.\\\",\\\"tw.oldDownload\\\":\\\"Shrani v ločeno datoteko...\\\",\\\"tw.opcode.2000\\\":\\\"dni od leta 2000\\\",\\\"tw.opcode.mousedown\\\":\\\"je miškin gumb pritisnjen?\\\",\\\"tw.opcode.mousex\\\":\\\"miškin x\\\",\\\"tw.opcode.mousey\\\":\\\"miškin y\\\",\\\"tw.openAdvanced\\\":\\\"Odpri napredne nastavitve\\\",\\\"tw.openWindow.dangerous\\\":\\\"Te spletne strani razvijalci aplikacije {APP_NAME} niso pregledali. Lahko vsebuje nevarno ali škodljivo kodo.\\\",\\\"tw.openWindow.title\\\":\\\"Ta projekt želi odpreti novo okno ali zavihek z URL-jem:\\\",\\\"tw.paint.alpha\\\":\\\"Neprosojnost\\\",\\\"tw.paint.fonts.more\\\":\\\"Dodaj več pisav...\\\",\\\"tw.pen.stageSelected\\\":\\\"Izbran oder: manj blokov za svinčnik\\\",\\\"tw.privacy\\\":\\\"Politika zasebnosti\\\",\\\"tw.recordVideo.permission\\\":\\\"Če to dovolite, vas bo brskalnik morda vprašal, ali želite omogočiti dostop do kamere. Nadaljnji dostop bo samodejno dovoljen.\\\",\\\"tw.recordVideo.title\\\":\\\"Ta projekt želi snemati video z vašo kamero. Projekt lahko deli slike z drugimi uporabniki ali strežniki.\\\",\\\"tw.redirect.dangerous\\\":\\\"Te spletne strani razvijalci aplikacije {APP_NAME} niso pregledali. Lahko vsebuje nevarno ali škodljivo kodo.\\\",\\\"tw.redirect.title\\\":\\\"Ta projekt želi v tem zavihku odpreti URL:\\\",\\\"tw.removedTrademarks\\\":\\\"Nekateri predmeti, ki so vsebovali Scratcheve blagovne znamke, niso več na tem seznamu.\\\",\\\"tw.restorePoints.1minute\\\":\\\"vsako minuto\\\",\\\"tw.restorePoints.assets\\\":\\\"{n} slik in zvokov\\\",\\\"tw.restorePoints.deleteAll\\\":\\\"Izbriši vse\\\",\\\"tw.restorePoints.loading\\\":\\\"Nalaganje...\\\",\\\"tw.restorePoints.minutes\\\":\\\"vsakih {n} minut\\\",\\\"tw.restorePoints.never\\\":\\\"nikoli\\\",\\\"tw.restorePoints.size\\\":\\\"Ocena porabljenega prostora: {size}\\\",\\\"tw.sample\\\":\\\"Primer projekta\\\",\\\"tw.saveAs\\\":\\\"Shrani kot...\\\",\\\"tw.saveTo\\\":\\\"Shrani v {file}\\\",\\\"tw.scratchUnsafeCloud\\\":\\\"Če naredite to spremenljivko v oblaku, bo projekt prekoračil Scratchevo omejitev {number} spremenljivk. Nekatere spremenljivke ne bodo delovale, če projekt naložite v Scratch.\\\",\\\"tw.securityManager.allow\\\":\\\"Dovoli\\\",\\\"tw.securityManager.deny\\\":\\\"Ne dovoli\\\",\\\"tw.securityManager.title\\\":\\\"Varnost razširitev\\\",\\\"tw.securityManager.trust\\\":\\\"Če dostop dovolite, bodo nadaljnje povezave z isto stranjo samodejno dovoljene.\\\",\\\"tw.securityManager.why\\\":\\\"To lahko uporablja za prenos slik ali zvokov, igre z več igralci, dostop do programskih vmesnikov ali za škodljive namene. S spletno stranjo bo deljen vaš IP naslov, približna lokacija in morda še drugi podatki.\\\",\\\"tw.settingsModal.customStageSize\\\":\\\"Velikost odra po meri:\\\",\\\"tw.settingsModal.customStageSizeHelp\\\":\\\"Spremeni velikost Scratchevega odra iz običajne 480x360. Poskusite 640x360 za širokozaslonski prikaz. Samo zelo redki projekti se pravilno prilagodijo tej nastavitvi.\\\",\\\"tw.settingsModal.dangerZone\\\":\\\"Nevarno območje\\\",\\\"tw.settingsModal.disableCompiler\\\":\\\"Onemogoči prevajalnik\\\",\\\"tw.settingsModal.disableCompilerHelp\\\":\\\"Izključi prevajalnik {APP_NAME}. Morda boste to potrebovali med urejanjem projektov, da se skripte takoj posodobijo. Sicer je bolje, da te možnosti ne vključite.\\\",\\\"tw.settingsModal.featured\\\":\\\"Izpostavljeno\\\",\\\"tw.settingsModal.fps\\\":\\\"60 FPS (FPS po meri)\\\",\\\"tw.settingsModal.fpsHelp\\\":\\\"Izvede skripte 60-krat na sekundo namesto 30-krat. Večina projektov ne deluje pravilno, če je ta nastavitev omogočena. V tem primeru preizkusite interpolacijo namesto 60 FPS načina. {customFramerate}.\\\",\\\"tw.settingsModal.fpsHelp.customFramerate\\\":\\\"Kliknite, da uporabite hitrost, ki ni 30 ali 60 FPS\\\",\\\"tw.settingsModal.help\\\":\\\"Kliknite za pomoč\\\",\\\"tw.settingsModal.highQualityPen\\\":\\\"Visoka ločljivost svinčnika\\\",\\\"tw.settingsModal.highQualityPenHelp\\\":\\\"Poveča ločljivost projektov, ki uporabljajo razširitev Svinčnik, in odstrani zaokroževanje koordinat v urejevalniku. Ta nastavitev ni primerna za vse projekte in lahko vpliva na hitrost delovanja.\\\",\\\"tw.settingsModal.infiniteClones\\\":\\\"Neskončno klonov\\\",\\\"tw.settingsModal.infiniteClonesHelp\\\":\\\"Odstrani Scratchevo omejitev 300 klonov.\\\",\\\"tw.settingsModal.interpolation\\\":\\\"Interpolacija\\\",\\\"tw.settingsModal.interpolationHelp\\\":\\\"S pomočjo interpolacije naredi gibanje figur bolj tekoče. Interpolacije ne uporabljajte za 3D projekte, projekte, ki uporabljajo svinčnik in počasne projekte. Zaradi interpolacije delovali počasneje, ne da bi izgledali bolje.\\\",\\\"tw.settingsModal.largeStageWarning\\\":\\\"Uporaba tako velikega odra ni priporočena! Namesto tega nastavite manjšo velikost z istim razmerjem stranic, saj jo bo celozaslonski način povečal, da jo prilagodi uporabnikovemu zaslonu.\\\",\\\"tw.settingsModal.removeFencing\\\":\\\"Odstrani omejitve premikanja figur\\\",\\\"tw.settingsModal.removeFencingHelp\\\":\\\"Omogoči figuram, da se premaknejo ven iz odra in postanejo poljubno velike ali majhne ter omogoči uporabo blokov za zaznavanje dotikanja zunaj odra.\\\",\\\"tw.settingsModal.removeLimits\\\":\\\"Odstrani omejitve\\\",\\\"tw.settingsModal.removeMiscLimits\\\":\\\"Odstrani razne omejitve\\\",\\\"tw.settingsModal.removeMiscLimitsHelp\\\":\\\"Odstrani omejitve zvočnih učinkov in velikosti svinčnika.\\\",\\\"tw.settingsModal.storeProjectOptions\\\":\\\"Shrani nastavitve v projektu\\\",\\\"tw.settingsModal.storeProjectOptionsHelp\\\":\\\"Shrani izbrane nastavitve v projektu. TurboWarp jih bo uporabil, ko naslednjič naloži ta projekt. Warp timer in onemogočen prevajalnik ne bosta shranjena.\\\",\\\"tw.settingsModal.title\\\":\\\"Napredne nastavitve\\\",\\\"tw.settingsModal.warpTimerHelp\\\":\\\"Preveri, če pride do dolge ali neskončne zanke, in v tem primeru zmanjša hitrost osveževanja zaslona, namesto da bi skripto zamrznil. To pogosto prepreči sesutje, vendar vpliva na hitrost projekta, zato običajno ni vključeno zunaj urejevalnika.\\\",\\\"tw.soundEditorNotSupported\\\":\\\"Urejanje zvokov v tem brskalniku ni podprto.\\\",\\\"tw.spriteSelectorItem.rename\\\":\\\"preimenuj\\\",\\\"tw.studioview.authorAttribution\\\":\\\"{author}\\\",\\\"tw.studioview.error\\\":\\\"Pri nalaganju naslednje strani projektov je prišlo do napake.\\\",\\\"tw.studioview.hoverText\\\":\\\"{title} avtorja {author}\\\",\\\"tw.twExtension.description\\\":\\\"Čudni novi bloki.\\\",\\\"tw.twExtension.name\\\":\\\"Bloki {APP_NAME}\\\",\\\"tw.unknownPlatform.continue\\\":\\\"Razumem\\\",\\\"tw.unknownPlatform.title\\\":\\\"Neznan urejevalnik\\\",\\\"tw.unshared.2\\\":\\\"Za več informacij obiščite: {link}\\\",\\\"tw.unshared.bug\\\":\\\"Če je projekt v resnici deljen, prosimo, da prijavite napako.\\\",\\\"tw.unshared.cache\\\":\\\"Če je bil projekt deljen pred kratkim, se lahko nekaj minut za tem to sporočilo še prikaže.\\\",\\\"tw.unshared2.1\\\":\\\"Nedeljeni projekti niso več vidni.\\\",\\\"tw.usernameModal.help\\\":\\\"Ta vrednost bo shranjena v vašem brskalniku. Morda bo zapisana med uporabo projektov, ki vsebujejo spremenljivke v oblaku.\\\",\\\"tw.usernameModal.help2\\\":\\\"Vrednosti, ki se ne ujemajo z obstoječim računom na Scratchu, bo strežnik za spremenljivke v oblaku običajno zavrnil. Priporočamo, da te nastavitve ne spreminjate ali pa uporabite svoje uporabniško ime na Scratchu.\\\",\\\"tw.usernameModal.mustChange\\\":\\\"Strežnik za spremenljivke v oblaku misli, da vaše uporabniško ime morda ni varno. Prosimo, daga spremenite ali {resetIt}.\\\",\\\"tw.usernameModal.mustChange.resetIt\\\":\\\"ga ponastavite (priporočeno)\\\",\\\"tw.usernameModal.new\\\":\\\"Novo uporabniško ime:\\\",\\\"tw.usernameModal.reset\\\":\\\"Ponastavi\\\",\\\"tw.usernameModal.title\\\":\\\"Spremeni uporabniško ime\\\",\\\"tw.usesCloudVariables\\\":\\\"Ta projekt uporablja spremenljivke v oblaku.\\\",\\\"tw.viewFeaturedProjects\\\":\\\"Kliknite za ogled izpostavljenih projektov.\\\",\\\"tw.viewOnScratch\\\":\\\"Ogled projekta na Scratchu\\\"},\\\"sr\\\":{\\\"tw.alerts.creatingRestorePoint\\\":\\\"Прављење тачке враћања...\\\",\\\"tw.alerts.savedToDisk\\\":\\\"Сачувано на вашем компјутеру.\\\",\\\"tw.backpack.rename\\\":\\\"Ново име:\\\",\\\"tw.blocks.addons\\\":\\\"Додаци\\\",\\\"tw.blocks.buttonIsDown\\\":\\\"[MOUSE_BUTTON] миш притиснут?\\\",\\\"tw.blocks.lastKeyPressed\\\":\\\"последњи притиснут тастер\\\",\\\"tw.blocks.mouseButton.middle\\\":\\\"(1) средњи\\\",\\\"tw.blocks.mouseButton.primary\\\":\\\"(0) примарни\\\",\\\"tw.blocks.mouseButton.secondary\\\":\\\"(2) секундарни\\\",\\\"tw.blocks.openDocs\\\":\\\"Отвори документацију\\\",\\\"tw.changeUsername.cannotChangeWhileRunning\\\":\\\"Корисничко име се не може мењати док пројекат ради.\\\",\\\"tw.code\\\":\\\"Изворни код\\\",\\\"tw.confirmIncompatibleExtension\\\":\\\"Ово проширење није компатибилно са Scratch-ом. Пројекти са њим се не могу отпремити на Scratch сајт. Да ли сте сигурни да желите да га укључите?\\\",\\\"tw.customExtension.name\\\":\\\"Прилагођена проширења\\\",\\\"tw.featuredProjectsStudio\\\":\\\"Погледај студио на Scratch-у.\\\",\\\"tw.feedback\\\":\\\"Повратне информације и грешке\\\",\\\"tw.footer.credits\\\":\\\"Заслуге\\\",\\\"tw.footer.embed\\\":\\\"Уграђивање\\\",\\\"tw.footer.parameters\\\":\\\"URL параметри\\\",\\\"tw.gui.defaultProjectTitle\\\":\\\"Пројекат\\\",\\\"tw.guiDefaultTitle\\\":\\\"Убрзајте Scratch пројекте\\\",\\\"tw.home.credit\\\":\\\"Белешке и заслуге\\\",\\\"tw.home.instructions\\\":\\\"Упутства\\\",\\\"tw.input.tooltip\\\":\\\"Прекопирај линк Scratch пројекта овде!\\\",\\\"tw.interpolationEnabled\\\":\\\"Интерполација\\\",\\\"tw.invalidParameters.clones\\\":\\\"\\\\\\\"clone\\\\\\\" URL параметар није валидан\\\",\\\"tw.invalidParameters.fps\\\":\\\"\\\\\\\"fps\\\\\\\" URL параметар није валидан\\\",\\\"tw.loader.downloadingAssets\\\":\\\"Преузимање ресурса ({complete}/{total}) ...\\\",\\\"tw.loader.projectData\\\":\\\"Учитавање пројекта ...\\\",\\\"tw.menuBar.60off\\\":\\\"Искључи опцију 60 FPS\\\",\\\"tw.menuBar.60on\\\":\\\"Укључи опцију 60 FPS\\\",\\\"tw.menuBar.addons\\\":\\\"Додаци\\\",\\\"tw.menuBar.advanced\\\":\\\"Напредно\\\",\\\"tw.menuBar.changeUsername\\\":\\\"Промени корисничко име\\\",\\\"tw.menuBar.cloudOff\\\":\\\"Онемогући променљиве у облаку\\\",\\\"tw.menuBar.cloudOn\\\":\\\"Омогући променљиве у облаку\\\",\\\"tw.menuBar.cloudUnavailable\\\":\\\"Променљиве у облаку нису доступне\\\",\\\"tw.menuBar.cloudUnavailableAlert\\\":\\\"Променљиве у облаку се не могу користити, вероватно зато што сте у едитору.\\\",\\\"tw.menuBar.moreSettings\\\":\\\"Напредна подешавања\\\",\\\"tw.menuBar.newFramerate\\\":\\\"Нови FPS:\\\",\\\"tw.menuBar.reportError2\\\":\\\"Ово је грешка. Молимо Вас да је пријавите.\\\",\\\"tw.menuBar.saveAs\\\":\\\"Сачувај као {file}\\\",\\\"tw.menuBar.seeInside\\\":\\\"Погледај изнутра\\\",\\\"tw.oldDownload\\\":\\\"Сачувај у посебну датотеку...\\\",\\\"tw.paint.alpha\\\":\\\"Непровидност\\\",\\\"tw.privacy\\\":\\\"Политика приватности\\\",\\\"tw.saveAs\\\":\\\"Сачувај као...\\\",\\\"tw.saveTo\\\":\\\"Сачувај у {file}\\\",\\\"tw.settingsModal.customStageSize\\\":\\\"Прилагођена величина позорнице:\\\",\\\"tw.settingsModal.customStageSizeHelp\\\":\\\"Мења величину Scratch-ове позорнице са 480x360 на нешто друго. Пробајте 640x360 да би позорница постала широки екран. Мало пројеката ће ово подржати.\\\",\\\"tw.settingsModal.dangerZone\\\":\\\"Опасно\\\",\\\"tw.settingsModal.disableCompiler\\\":\\\"Онемогући преводилац кода\\\",\\\"tw.settingsModal.featured\\\":\\\"Истакнуто\\\",\\\"tw.settingsModal.fps\\\":\\\"60 FPS (Прилагођен FPS)\\\",\\\"tw.settingsModal.fpsHelp\\\":\\\"Покреће код 60 пута у секунди уместо 30. Многи пројекти неће исправно радити са овим подешавањем. Уместо тога онда искористите Интерполацију уместо опције 60 FPS. {customFramerate}.\\\",\\\"tw.settingsModal.fpsHelp.customFramerate\\\":\\\"Кликните за FPS који није 30 или 60\\\",\\\"tw.settingsModal.help\\\":\\\"Кликни за помоћ\\\",\\\"tw.settingsModal.highQualityPen\\\":\\\"Оловка високог квалитета\\\",\\\"tw.settingsModal.highQualityPenHelp\\\":\\\"Црта пројекте са оловком у већој резолуцији и онемогућава заокругљивање координата у едитору. Ово подешавање није најбоље за неке пројекте и може утицати на перформансе.\\\",\\\"tw.settingsModal.infiniteClones\\\":\\\"Бесконачно умножака\\\",\\\"tw.settingsModal.infiniteClonesHelp\\\":\\\"Онемогућава Scratch-ову границу од 300 умножака\\\",\\\"tw.settingsModal.interpolation\\\":\\\"Интерполација\\\",\\\"tw.settingsModal.interpolationHelp\\\":\\\"Чини да пројекти изгледају брже помоћу интерполације кретања ликова. Интерполација се не треба користити за 3D пројекте, пројекте са оловком и пројекте који лагују јер ће радити спорије, а да не изгледају брже.\\\",\\\"tw.settingsModal.largeStageWarning\\\":\\\"Коришћење оволике величине позорнице није препоручљиво! Уместо тога, користите мање величине са истим односом ширине и висине, а онда укључите приказ преко целог екрана да све повећа тако да се поклапа са корисниковим приказом.\\\",\\\"tw.settingsModal.removeFencing\\\":\\\"Уклони границе\\\",\\\"tw.settingsModal.removeFencingHelp\\\":\\\"Дозвољава ликовима да се крећу ван граница екрана, да им величина не буде ограничена, и чини да \\\\\\\"додирује ли\\\\\\\" блокови раде ван екрана.\\\",\\\"tw.settingsModal.removeLimits\\\":\\\"Уклони граничне вредности\\\",\\\"tw.settingsModal.removeMiscLimits\\\":\\\"Уклони различите максималне вредности\\\",\\\"tw.settingsModal.removeMiscLimitsHelp\\\":\\\"Уклања граничне вредности за звучне ефекте и величину оловке.\\\",\\\"tw.settingsModal.storeProjectOptions\\\":\\\"Складишти подешавања у пројекту\\\",\\\"tw.settingsModal.storeProjectOptionsHelp\\\":\\\"Складишти одабрана подешавања у пројекту тако да се аутоматски примене када TurboWarp учита пројекат. Warp тајмер и онемогућавање преводиоца кода се неће сачувати.\\\",\\\"tw.settingsModal.title\\\":\\\"Напредна подешавања\\\",\\\"tw.settingsModal.warpTimer\\\":\\\"Warp тајмер\\\",\\\"tw.settingsModal.warpTimerHelp\\\":\\\"Чини да код проверава да ли је заглављен у дугачкој или бескрајној петљи и смањује квалитет уместо заглављивања док се петља не заврши. Поправља већину кварова, али има значајан утицај на перформансе, па је подразумевано укључен само у едитору.\\\",\\\"tw.spriteSelectorItem.rename\\\":\\\"преименуј\\\",\\\"tw.studioview.authorAttribution\\\":\\\"од {author}\\\",\\\"tw.studioview.error\\\":\\\"Десила се грешка у учитавању следеће странице пројеката.\\\",\\\"tw.studioview.hoverText\\\":\\\"{title} од {author}\\\",\\\"tw.usernameModal.help\\\":\\\"Ова вредност ће бити сачувана у меморији вашег прегледача. Може се сама учитати када користите пројекте са променљивама у облику.\\\",\\\"tw.usernameModal.help2\\\":\\\"Вредности које не одговарају валидном Scratch налогу ће бити одбијене од стране сервера променљивих у облаку. Препоручујемо да га оставите како јесте или га промените у своје Scratch корисничко име.\\\",\\\"tw.usernameModal.mustChange\\\":\\\"Извињавамо се, али сервер променљивих у облаку мисли да је Ваше корисничко име можда небезбедно. Молимо Вас да га промените или {resetIt}.\\\",\\\"tw.usernameModal.mustChange.resetIt\\\":\\\"ресејтујте га (препоручено)\\\",\\\"tw.usernameModal.reset\\\":\\\"Ресетуј\\\",\\\"tw.usernameModal.title\\\":\\\"Промени корисничко име\\\",\\\"tw.viewFeaturedProjects\\\":\\\"Кликни да видиш истакнуте пројекте\\\",\\\"tw.viewOnScratch\\\":\\\"Погледај пројекат на Scratch-у\\\"},\\\"sv\\\":{\\\"tw.alerts.creatingRestorePoint\\\":\\\"Skapar återställningspunkt...\\\",\\\"tw.alerts.lostPeripheralConnection\\\":\\\"Förlorade anslutningen till {extensionName}.\\\",\\\"tw.alerts.savedToDisk\\\":\\\"Sparad på datorn.\\\",\\\"tw.backpack.rename\\\":\\\"Nytt namn: \\\",\\\"tw.blocks.addons\\\":\\\"Tillägg\\\",\\\"tw.blocks.buttonIsDown\\\":\\\"[MOUSE_BUTTON]Musknappen nere?\\\",\\\"tw.blocks.lastKeyPressed\\\":\\\"Sista tangenten nertryckt \\\",\\\"tw.blocks.mouseButton.middle\\\":\\\"(1) mitten\\\",\\\"tw.blocks.mouseButton.primary\\\":\\\"(0) primär\\\",\\\"tw.blocks.mouseButton.secondary\\\":\\\"(2) andra\\\",\\\"tw.blocks.openDocs\\\":\\\"Öppna dokumentation\\\",\\\"tw.cantUseCloud\\\":\\\"Även om du kan skapa molnvariabler så kommer de inte att funka om du inte kommer att ladda upp projektet till Scratch eller att använda ett verktyg som {packager}.\\\",\\\"tw.changeUsername.cannotChangeWhileRunning\\\":\\\"Användarnamn kan inte ändras när projektet är igång.\\\",\\\"tw.clipboard.danger\\\":\\\"Om ditt urklipp har saker som lösenord, kan projektet dela de med andra servrar.\\\",\\\"tw.clipboard.permission\\\":\\\"Tillgång till urklipp kan kanske inte fungera i alla webbläsare. Om tillåtet, senare läsningar från urklippen kommer att vara automatiskt tillåtna.\\\",\\\"tw.clipboard.title\\\":\\\"Projektet vill läsa data från ditt urklipp.\\\",\\\"tw.code\\\":\\\"Källkod\\\",\\\"tw.confirmIncompatibleExtension\\\":\\\"Detta tillägg är inkompatibelt med Scratch. Projekt skapade med det kan inte bli uppladdade till Scratch-webbplatsen. Är du säker att aktivera det?\\\",\\\"tw.customExtension.description\\\":\\\"Ladda in anpassade tillägg från URL:s, filer, eller JavaScript källkod.\\\",\\\"tw.customExtension.name\\\":\\\"Anpassatt tillägg\\\",\\\"tw.customExtensionModal.load\\\":\\\"Ladda in\\\",\\\"tw.customExtensionModal.promptText\\\":\\\"Klistra in tilläggets JavaScript källkod:\\\",\\\"tw.customExtensionModal.promptURL\\\":\\\"Ange tilläggets URL:\\\",\\\"tw.customExtensionModal.title\\\":\\\"Ladda in ett anpassat tillägg\\\",\\\"tw.customExtensionModal.trusted\\\":\\\"Tillägget kan vara laddat in utan sandboxen eftersom den är från en betrodd källa.\\\",\\\"tw.customExtensionModal.unsandboxedWarning1\\\":\\\"Att ladda in anpassade utan sandboxen är farligt och ska inte vara aktiverat om du inte vet vad du gör.\\\",\\\"tw.customExtensionModal.unsandboxedWarning2\\\":\\\"Osandlådade tillägg kan förstöra ditt projekt, ta bort dina inställningar, nätfiska för lösenord, och andra dåliga saker. Utvecklarna för {APP_NAME} är inte ansvariga för resulterade problem.\\\",\\\"tw.customExtensionModal.untrusted\\\":\\\"Tillägg från opålitliga URL:s kommer alltid att vara laddade in med sandboxen för säkerhet.\\\",\\\"tw.documentation\\\":\\\"Dokumentation\\\",\\\"tw.featuredProjectsStudio\\\":\\\"Se studion på Scratch.\\\",\\\"tw.feedback\\\":\\\"Respons & buggar\\\",\\\"tw.fetch.title\\\":\\\"Projektet vill koppa sig till webbsidan: \\\",\\\"tw.fonts.add\\\":\\\"Lägg till\\\",\\\"tw.fonts.custom.name\\\":\\\"Ge teckensnittet ett namn:\\\",\\\"tw.fonts.title\\\":\\\"Teckensnitt\\\",\\\"tw.footer.credits\\\":\\\"Krediter\\\",\\\"tw.footer.documentation\\\":\\\"Dokumentation\\\",\\\"tw.footer.embed\\\":\\\"Inbäddning\\\",\\\"tw.footer.parameters\\\":\\\"URL Parametrar\\\",\\\"tw.gui.crashMessage.description\\\":\\\"Vi är ledsna men det ser ut som sidan har krashat. Ladda om sidan för att försöka igen.\\\",\\\"tw.gui.defaultProjectTitle\\\":\\\"Projekt\\\",\\\"tw.guiDefaultTitle\\\":\\\"Kör scratchprojekt snabbare\\\",\\\"tw.home.credit\\\":\\\"Anteckningar och kerditer\\\",\\\"tw.home.instructions\\\":\\\"Instruktioner\\\",\\\"tw.input.tooltip\\\":\\\"Kopiera och klistra in en Scratch länk här!\\\",\\\"tw.invalidParameters.clones\\\":\\\"\\\\\\\"klon\\\\\\\" URL är ogiltig\\\",\\\"tw.invalidParameters.fps\\\":\\\"\\\\\\\"fps\\\\\\\" URL parameter är ogiltig\\\",\\\"tw.invalidProject.title\\\":\\\"Fel\\\",\\\"tw.loadExtension.embedded\\\":\\\"Projektet vill att ladda in ett anpassat tillägg med koden:\\\",\\\"tw.loadExtension.sandboxed\\\":\\\"Medan koden kommer att bli sandboxad, kommer det att ha tillgång till information om din enhet som till exempel din IP adress och din position. Kontrollera att du litar på författaren av detta tillägg innan du fortsätter.\\\",\\\"tw.loadExtension.unsandboxedWarning\\\":\\\"Att ladda tillägg utan sandboxen är farligt. Det kommer at kunna förstöra ditt projekt, ta bort dina inställningar, nätfiska för lösenord, och andra dåliga saker. Utvecklarna för {APP_NAME} är inte ansvariga för resulterade problem.\\\",\\\"tw.loadExtension.url\\\":\\\"Projektet vill ladda in ett anpassad tillägg från denna URL:\\\",\\\"tw.loader.downloadingAssets\\\":\\\"Hämtar tillgångar ({complete}/{total})...\\\",\\\"tw.loader.projectData\\\":\\\"Laddar projekt...\\\",\\\"tw.menuBar.60off\\\":\\\"Avaktivera 60 FPS\\\",\\\"tw.menuBar.60on\\\":\\\"Aktivera 60 FPS\\\",\\\"tw.menuBar.addons\\\":\\\"Tillägg\\\",\\\"tw.menuBar.advanced\\\":\\\"Avancerat\\\",\\\"tw.menuBar.changeUsername\\\":\\\"Ändra användarnamn\\\",\\\"tw.menuBar.cloudOff\\\":\\\"Avaktivera molnvariabler\\\",\\\"tw.menuBar.cloudOn\\\":\\\"Aktivera molnvariabler\\\",\\\"tw.menuBar.cloudUnavailable\\\":\\\"Molnvariabler är inte tillgängliga\\\",\\\"tw.menuBar.cloudUnavailableAlert\\\":\\\"Kan inte använda molnvariabler, mest troligt att du öppnade editorn.\\\",\\\"tw.menuBar.compileError\\\":\\\"{sprite}:{error}\\\",\\\"tw.menuBar.desktopSettings\\\":\\\"Skrivbordsinställningar\\\",\\\"tw.menuBar.moreSettings\\\":\\\"Avancerade inställningar\\\",\\\"tw.menuBar.newFramerate\\\":\\\"Ny upplösningshastighet:\\\",\\\"tw.menuBar.package\\\":\\\"Packa projektet\\\",\\\"tw.menuBar.reportError2\\\":\\\"Detta är en bugg. Snälla rapportera buggen. \\\",\\\"tw.menuBar.restorePoints\\\":\\\"Återställspunkter\\\",\\\"tw.menuBar.saveAs\\\":\\\"Spara som {file}\\\",\\\"tw.menuBar.seeInside\\\":\\\"Se inuti\\\",\\\"tw.notify.permission\\\":\\\"Om tillåtet, kommer du kanske att bli frågad om att tillåta notifikationer av din webbläsare, och senare notifikationer kommer att bli automatiskt tillåtna. \\\",\\\"tw.notify.title\\\":\\\"Projektet vill visa notifikationer.\\\",\\\"tw.oldDownload\\\":\\\"Spara till separat fil...\\\",\\\"tw.opcode.2000\\\":\\\"dagar från år 2000\\\",\\\"tw.opcode.mousedown\\\":\\\"Musknapp nedtryckt?\\\",\\\"tw.opcode.mousex\\\":\\\"mus x\\\",\\\"tw.opcode.mousey\\\":\\\"mus y\\\",\\\"tw.openAdvanced\\\":\\\"Öppna avancerade inställningar\\\",\\\"tw.openWindow.dangerous\\\":\\\"Denna webbsida har inte granskats av utvecklarna {APP_NAME} . Den kan innehålla farlig eller skadlig kod.\\\",\\\"tw.openWindow.title\\\":\\\"Projektet vill öppna ett fönster eller en flik med länken: \\\",\\\"tw.paint.alpha\\\":\\\"Opacitet\\\",\\\"tw.paint.fonts.more\\\":\\\"Lägg till fler font...\\\",\\\"tw.privacy\\\":\\\"Integritetspolicy\\\",\\\"tw.recordAudio.permission\\\":\\\"Om tillåtet, kommer du kanske att bli frågad om att tillåta tillgång till mikrofonen från din webbläsare, och senare tillgång till mikrofonen kommer att bli automatiskt tillåtet.\\\",\\\"tw.recordAudio.title\\\":\\\"Projektet vill spela in ljud från din mikrofon. Detta kan inkludera ett textutskrift eller rå ljud. Projektet kan dela ljudet med andra personer eller servrar.\\\",\\\"tw.recordVideo.permission\\\":\\\"Om tillåtet, kommer du kanske att bli frågad av din webbläsare att få tillgång till din kamera, och senare tillgång till kameran kommer att bli automatiskt tillåtet.\\\",\\\"tw.recordVideo.title\\\":\\\"Projektet vill spela in video från din kamera. Projektet kan dela bilder med andra användare eller servrar.\\\",\\\"tw.redirect.dangerous\\\":\\\"Denna webbsida har inte granskats av utvecklarna {APP_NAME} . Den kan innehålla farlig eller skadlig kod.\\\",\\\"tw.redirect.title\\\":\\\"Projektet will navigera dig till denna webbsida:\\\",\\\"tw.restorePoints.deleteAll\\\":\\\"Radera allt\\\",\\\"tw.restorePoints.description\\\":\\\"{APP_NAME} sparar återställspunkter med jämna mellanrum på don dator för att hjälpa återställa projekt om du glömde spara. Detta är avsett som sista utvägen för återhämtning. Din dator kan ta bart återställningspunkterna när som helts. Bero INTE på denna funktion.\\\",\\\"tw.restorePoints.error\\\":\\\"Ett fel uppstod under laddningen av återställningspunkten: {error}\\\",\\\"tw.restorePoints.loading\\\":\\\"Laddar...\\\",\\\"tw.restorePoints.title\\\":\\\"Återställspunkter\\\",\\\"tw.saveAs\\\":\\\"Spara som...\\\",\\\"tw.saveTo\\\":\\\"Spara till {file}\\\",\\\"tw.scratchUnsafeCloud\\\":\\\"Om du gör denna molnvariabel så kommer projektet att överskrida Scratchs gräns av {number} variabler och några variabler kommer inte fungera om du kommer ladda upp projektet till Scratch.\\\",\\\"tw.securityManager.allow\\\":\\\"Tillåt\\\",\\\"tw.securityManager.deny\\\":\\\"Avvisa\\\",\\\"tw.securityManager.title\\\":\\\"Tilläggssäkerhet\\\",\\\"tw.securityManager.trust\\\":\\\"Om tillåtet, senare förfrågor till samma websida kommer att automatiskt vara tillåtna.\\\",\\\"tw.securityManager.why\\\":\\\"Detta kan vara använt till att ladda ned bilder eller ljud, implementera multiplayer, få tillgång till API, eller för skadliga syften. Detta kommer att dela din IP adress, allmän plats, och kanske annan data med websidan.\\\",\\\"tw.settingsModal.customStageSize\\\":\\\"Anpassad scenstorlek:\\\",\\\"tw.settingsModal.customStageSizeHelp\\\":\\\"Ändrar storleken av Scratch scenen från 480x360 till något annat. Prova 640x360 för att göra scenen widescreen. Väldigt få projekt funkar rätt med detta\\\",\\\"tw.settingsModal.dangerZone\\\":\\\"Farliga zonen\\\",\\\"tw.settingsModal.disableCompiler\\\":\\\"Avaktivera kompilatorn\\\",\\\"tw.settingsModal.featured\\\":\\\"Utvalda\\\",\\\"tw.settingsModal.fps\\\":\\\"60 FPS (Anpassat FPS)\\\",\\\"tw.settingsModal.fpsHelp\\\":\\\"Kör skripter 60 gånger i sekunden istället för 30. De flesta projekt kommer inte att funka rätt med detta aktiverat. Do kan prova interpolation med 60 FPS läget avaktiverat om så är fallet. {customFramerate}.\\\",\\\"tw.settingsModal.fpsHelp.customFramerate\\\":\\\"Klicka för att använda en hastighet förutom 30 och 60 FPS\\\",\\\"tw.settingsModal.help\\\":\\\"Klicka för hjälp\\\",\\\"tw.settingsModal.highQualityPen\\\":\\\"Högkvalitativ penna\\\",\\\"tw.settingsModal.highQualityPenHelp\\\":\\\"Tillåter att projekt med penna kan rendera med högre kvalité och tar bort några koordinat avrundning i editorn. Inte alla projekt drar nytta av den här inställningen och det kan påverka prestandan.\\\",\\\"tw.settingsModal.infiniteClones\\\":\\\"Oändliga kloner\\\",\\\"tw.settingsModal.infiniteClonesHelp\\\":\\\"Avaktiverar Scratch's 300 klongräns.\\\",\\\"tw.settingsModal.interpolationHelp\\\":\\\"Får projekt att se jämnare ut genom att interpolera sprite-rörelser. Interpolering bör inte användas på 3D-projekt, raytracers, pennprojekt och långsamma projekt eftersom interpolering kommer att göra att de går långsammare utan att få dem att se jämnare ut.\\\",\\\"tw.settingsModal.largeStageWarning\\\":\\\"Att använda en scenstorlek som detta är inte rekomenderat! Istället, använd en mindre storlek med samma sidförhållande och låt fullskärmen att uppskala den så att storleken matchar datorns skärm.\\\",\\\"tw.settingsModal.removeFencing\\\":\\\"Ta bort scengränser\\\",\\\"tw.settingsModal.removeFencingHelp\\\":\\\"Tillåter sprites att flytta utanför skärmen, bli så stora eller så små som de vill, och gör att beröringsblock fungerar utanför skärmen.\\\",\\\"tw.settingsModal.removeLimits\\\":\\\"Ta bort limitationerna\\\",\\\"tw.settingsModal.removeMiscLimits\\\":\\\"Ta bort diverse gränser\\\",\\\"tw.settingsModal.removeMiscLimitsHelp\\\":\\\"Tar bort ljud limitationer och gränser för pennstorlek\\\",\\\"tw.settingsModal.storeProjectOptions\\\":\\\"Spara inställningarna i projektet\\\",\\\"tw.settingsModal.storeProjectOptionsHelp\\\":\\\"Sparar de valda inställningarna i projektet så de kommer bli automatiskt tillämpas när TurboWarp laddar projektet. Warp timer och avaktivera kompilatorn kommer inte vara sparade.\\\",\\\"tw.settingsModal.title\\\":\\\"Avancerade inställningar\\\",\\\"tw.settingsModal.warpTimerHelp\\\":\\\"Ser till så att skript är inte fasta i en lång eller oändlig loop och gör så att de körs på låg hastighet istället för att fastna tills loopen blir klar. Detta fixar de flesta kraschar men har en betydande prestationspåverkan så det är bara aktiverat i editorn som standard.\\\",\\\"tw.spriteSelectorItem.rename\\\":\\\"Döp om\\\",\\\"tw.stereoAlert\\\":\\\"Om du redigerar detta stereoljud konverteras det oåterkalleligt till mono.\\\",\\\"tw.studioview.authorAttribution\\\":\\\"av {author}\\\",\\\"tw.studioview.error\\\":\\\"Det uppstod ett fel när nästa sida med projekt skulle laddas.\\\",\\\"tw.studioview.hoverText\\\":\\\"{title} av {author}\\\",\\\"tw.tooLarge\\\":\\\"Detta ljud kommer att kanske vara för stort för att ladda upp till Scratch.\\\",\\\"tw.twExtension.description\\\":\\\"Konstiga nya block.\\\",\\\"tw.unshared.2\\\":\\\"För mer information se: {link}\\\",\\\"tw.unshared.bug\\\":\\\"Om detta projektet är delat, rapportera en bugg.\\\",\\\"tw.unshared.cache\\\":\\\"Om projektet var delat nyligen så kan detta meddelandet vara ogiltigt i några minuter.\\\",\\\"tw.unshared2.1\\\":\\\"Odelade projekt är inte tillgängliga längre.\\\",\\\"tw.usernameModal.help\\\":\\\"Detta värde kommer att lagras i din webbläsares lagring. Det kan loggas när du interagerar med projekt som innehåller molnvariabler.\\\",\\\"tw.usernameModal.help2\\\":\\\"Värden som inte korresponderar till ett valt Scratch konto kommer vanligtvis att avvisas av molnvariabelservern. Vi rekomenderar att lämna det så som det är eller att ändra det till ditt Scratch användarnamn\\\",\\\"tw.usernameModal.mustChange\\\":\\\"Förlåt, men det ser ut som om att servern tänker att ditt användarnamn är osäkert. Ändra det till något annat eller {resetIt}.\\\",\\\"tw.usernameModal.mustChange.resetIt\\\":\\\"Återställa (Rekomenderat)\\\",\\\"tw.usernameModal.reset\\\":\\\"Starta om\\\",\\\"tw.usernameModal.title\\\":\\\"Ändra användarnamn\\\",\\\"tw.viewFeaturedProjects\\\":\\\"Klicka för att se utvalda projekt\\\",\\\"tw.viewOnScratch\\\":\\\"Se projektet på Scratch\\\"},\\\"th\\\":{\\\"tw.settingsModal.featured\\\":\\\"ได้รับการฟีเจอร์\\\",\\\"tw.usernameModal.reset\\\":\\\"รีเซ็ต\\\"},\\\"tr\\\":{\\\"tw.accent.blue\\\":\\\"Mavi\\\",\\\"tw.accent.purple\\\":\\\"Mor\\\",\\\"tw.accent.red\\\":\\\"Kırmızı\\\",\\\"tw.alerts.creatingRestorePoint\\\":\\\"Yükleme noktası yapılıyor\\\",\\\"tw.alerts.lostPeripheralConnection\\\":\\\"Bağlantı kesildi {extensionName}\\\",\\\"tw.alerts.restorePointError\\\":\\\"Geri yükleme noktası oluşturulamadı\\\",\\\"tw.alerts.restorePointSuccess\\\":\\\"\\\\\\\"Dosya\\\\\\\"daki geri yükleme noktalarına erişin\\\",\\\"tw.alerts.savedToDisk\\\":\\\"Bilgisayarına kaydedilmiştir.\\\",\\\"tw.backpack.rename\\\":\\\"Yeni kullanıcı adı:\\\",\\\"tw.blockColors.custom\\\":\\\"Eklenti Ayarlarında Özelleştir\\\",\\\"tw.blockColors.dark\\\":\\\"Karanlık (Beta)\\\",\\\"tw.blockColors.highContrast\\\":\\\"Yüksek Kontrast\\\",\\\"tw.blockColors.three\\\":\\\"Orijinal\\\",\\\"tw.blocks.PROCEDURES_DOCS\\\":\\\"Return nasıl kullanılır\\\",\\\"tw.blocks.PROCEDURES_RETURN\\\":\\\"{v} geri dön\\\",\\\"tw.blocks.PROCEDURES_TO_REPORTER\\\":\\\"Reporter olarak Değiştir\\\",\\\"tw.blocks.PROCEDURES_TO_STATEMENT\\\":\\\"İfadeye Değiştir\\\",\\\"tw.blocks.addons\\\":\\\"Eklentiler\\\",\\\"tw.blocks.buttonIsDown\\\":\\\"[MOUSE_BUTTON] fare düğmesi basılımı?\\\",\\\"tw.blocks.lastKeyPressed\\\":\\\"basılan son tuş\\\",\\\"tw.blocks.mouseButton.middle\\\":\\\"(1) orta\\\",\\\"tw.blocks.mouseButton.primary\\\":\\\"(0) birincil\\\",\\\"tw.blocks.mouseButton.secondary\\\":\\\"(2) ikincil\\\",\\\"tw.blocks.openDocs\\\":\\\"Belgeyi Aç\\\",\\\"tw.cantUseCloud\\\":\\\"Bulut değişkenleri oluşturabilseniz de, bu proje Scratch'e yüklenmediği veya {packager} gibi bir araç kullanılarak dönüştürülmediği sürece bunlar çalışmayacaktır.\\\",\\\"tw.changeUsername.cannotChangeWhileRunning\\\":\\\"Proje çalışırken kullanıcı adı değiştirilemez.\\\",\\\"tw.clipboard.danger\\\":\\\"Panonuzda şifre gibi şeyler varsa proje bunları diğer kullanıcılarla veya sunucularla paylaşabilir.\\\",\\\"tw.clipboard.permission\\\":\\\"Pano erişimi bazı tarayıcılarda çalışmayabilir. İzin verilirse, daha fazla pano okumasına otomatik olarak izin verilecektir.\\\",\\\"tw.clipboard.title\\\":\\\"Proje panonuzdaki verileri okumak istiyor.\\\",\\\"tw.cloudProvider\\\":\\\"{name} tarafından sağlanan sunucu\\\",\\\"tw.cloudServers\\\":\\\"Yakınınızdaki bir sunucuyu seçin:\\\",\\\"tw.code\\\":\\\"Kaynak Kodu\\\",\\\"tw.confirmIncompatibleExtension\\\":\\\"Bu eklenti Scratch ile kullanamılınıyor. Bununla yapılan projeler Scratch web sitesine yüklenemez. Etkinleştirmek istediğinizden emin misiniz?\\\",\\\"tw.createdBy\\\":\\\"Yazar:\\\",\\\"tw.customCloudServer\\\":\\\"Özel bir bulut değişken sunucusu kullanma:{server}\\\",\\\"tw.customExtension.description\\\":\\\"URL'lerden, dosyalardan veya JavaScript kaynak kodundan özel uzantılar yükleyin.\\\",\\\"tw.customExtension.name\\\":\\\"Görenek Eklenti\\\",\\\"tw.customExtensionModal.load\\\":\\\"Yükle\\\",\\\"tw.customExtensionModal.promptText\\\":\\\"Uzantının JavaScript kaynak kodunu yapıştırın:\\\",\\\"tw.customExtensionModal.promptURL\\\":\\\"Uzantının URL'sini girin:\\\",\\\"tw.customExtensionModal.text\\\":\\\"Metin\\\",\\\"tw.customExtensionModal.title\\\":\\\"Özel Uzantıyı Yükle\\\",\\\"tw.customExtensionModal.trusted\\\":\\\"Bu uzantı, güvenilir bir kaynaktan geldiği için korumalı alan olmadan yüklenecek.\\\",\\\"tw.customExtensionModal.unsandboxedWarning1\\\":\\\"Uzantıları korumalı alan olmadan yüklemek tehlikelidir ve ne yaptığınızı bilmiyorsanız etkinleştirilmemelidir.\\\",\\\"tw.customExtensionModal.unsandboxedWarning2\\\":\\\"Korumalı alanda olmayan uzantılar projenizi bozabilir, ayarlarınızı silebilir, şifreleri ele geçirmek için kimlik avı yapabilir ve diğer kötü şeylere neden olabilir. {APP_NAME} geliştiricileri ortaya çıkan sorunlardan sorumlu değildir.\\\",\\\"tw.customExtensionModal.untrusted\\\":\\\"Güvenilmeyen URL'lerden gelen uzantılar, güvenlik amacıyla her zaman korumalı alanla birlikte yüklenecektir.\\\",\\\"tw.customReporters.description\\\":\\\"Özel blokların değerlerin çıktısını almasına ve girdi olarak kullanılmasına izin verin.\\\",\\\"tw.customReporters.name\\\":\\\"Özel Haberciler\\\",\\\"tw.darkMode\\\":\\\"Işık Moduna Geçiş\\\",\\\"tw.documentation\\\":\\\"Belgesel\\\",\\\"tw.embed.persistent\\\":\\\"İzin verilirse aynı siteye daha fazla yerleştirme yapılmasına otomatik olarak izin verilecektir.\\\",\\\"tw.embed.risks\\\":\\\"Yerleştirme korumalı alana alınsa da, cihazınızla ilgili IP'niz ve genel konumunuz gibi bilgilere erişmeye devam edecektir.\\\",\\\"tw.embed.title1\\\":\\\"Proje, HTML içeriğini sahneye yerleştirmek istiyor:\\\",\\\"tw.embed.title2\\\":\\\"Proje, uzak içeriği sahneye yerleştirmek istiyor:\\\",\\\"tw.extensionGallery.error\\\":\\\"Uzantı galerisi yüklenirken hata oluştu. Daha fazla uzantı bulmak için extensions.turbowarp.org adresini ziyaret edin.\\\",\\\"tw.extensionGallery.loading\\\":\\\"Uzantı galerisi yükleniyor...\\\",\\\"tw.extensionGallery.more\\\":\\\"extensions.turbowarp.org adresinde uzantılar hakkında daha fazla bilgi edinin.\\\",\\\"tw.extensionGallery.name\\\":\\\"{APP_NAME} Uzatma Galerisi\\\",\\\"tw.favorite\\\":\\\"Favori\\\",\\\"tw.featuredProjectsStudio\\\":\\\"Stüdyoyu Scratch'te görüntüleyin.\\\",\\\"tw.feedback\\\":\\\"Geribildirim ve Hatalar\\\",\\\"tw.feedbackButton\\\":\\\"{APP_NAME} Geri bildirim\\\",\\\"tw.fetch.title\\\":\\\"Proje web sitesine bağlanmak istiyor:\\\",\\\"tw.fonts.add\\\":\\\"Ekle\\\",\\\"tw.fonts.custom.file\\\":\\\"Bilgisayarınızdan bir yazı tipi dosyası seçin:\\\",\\\"tw.fonts.custom.name\\\":\\\"Yazı tipine bir ad verin:\\\",\\\"tw.fonts.custom1\\\":\\\"Bir dosyadan yazı tipi ekleme\\\",\\\"tw.fonts.custom2\\\":\\\"Genellikle Scratch'te çalışmaz. Desteklenen formatlar: {formats}.\\\",\\\"tw.fonts.delete\\\":\\\"\\\\\\\"{font}\\\\\\\"i silmek istediğinizden emin misiniz? Herhangi bir vektör kostümü bunun yerine yedek yazı tipini kullanacaktır.\\\",\\\"tw.fonts.fallback\\\":\\\"Yazı tipinin yüklenememesi veya silinmesi durumunda kullanılacak bir yedek yazı tipi seçin:\\\",\\\"tw.fonts.list\\\":\\\"Yüklü yazı tipleri:\\\",\\\"tw.fonts.none\\\":\\\"Henüz yazı tipi eklenmedi.\\\",\\\"tw.fonts.readError\\\":\\\"Yazı tipi dosyası okunamadı: {error}\\\",\\\"tw.fonts.system\\\":\\\"Sistem yazı tipi\\\",\\\"tw.fonts.system.name\\\":\\\"Bilgisayarınızda yerleşik olan herhangi bir yazı tipinin adını yazın. Yazı tipi herkes için doğru görünmeyebilir.\\\",\\\"tw.fonts.system1\\\":\\\"Sistem yazı tipi ekleme\\\",\\\"tw.fonts.system2\\\":\\\"Scratch'te çalışabilir ancak herkes için doğru şekilde görünmeyecektir.\\\",\\\"tw.fonts.title\\\":\\\"Yazı tipleri\\\",\\\"tw.footer.credits\\\":\\\"Krediler\\\",\\\"tw.footer.documentation\\\":\\\"Belgesel\\\",\\\"tw.footer.embed\\\":\\\"Gömmek\\\",\\\"tw.footer.parameters\\\":\\\" URL parametreler\\\",\\\"tw.geolocate.permission\\\":\\\"İzin verilirse tarayıcınız tarafından konum erişimine izin vermeniz istenebilir.\\\",\\\"tw.geolocate.title\\\":\\\"Proje konumunuzu bilmek istiyor.\\\",\\\"tw.gui.crashMessage.description\\\":\\\"Çok üzgünüz ancak sayfanın çökmüş olduğu anlaşılıyor. Tekrar denemek için lütfen sayfanızı yenileyin.\\\",\\\"tw.gui.defaultProjectTitle\\\":\\\"Proje\\\",\\\"tw.guiDefaultTitle\\\":\\\"Scratch Projeleri daha hızlı yapın\\\",\\\"tw.home.credit\\\":\\\"Notlar ve Krediler\\\",\\\"tw.home.description\\\":\\\"{APP_NAME}, projeleri gerçekten hızlı çalışmasını sağlamak için JavaScript'e derleyen bir Scratch modudur. Yukarıda bir proje kimliği veya URL girerek veya aşağıda öne çıkan bir proje seçerek deneyin.\\\",\\\"tw.home.instructions\\\":\\\"Kurallar\\\",\\\"tw.input.tooltip\\\":\\\"Bir Scratch proje linki buraya kopyala ve yapıştır!\\\",\\\"tw.interpolationEnabled\\\":\\\"Enterpolasyon\\\",\\\"tw.invalidParameters.clones\\\":\\\"\\\\\\\"klon\\\\\\\" URL parametresi geçersizdir\\\",\\\"tw.invalidParameters.fps\\\":\\\"\\\\\\\"fps\\\\\\\" URL parametresi geçersizdir\\\",\\\"tw.invalidProject.title\\\":\\\"Hata\\\",\\\"tw.lightMode\\\":\\\"Koyu Moda Geçin\\\",\\\"tw.loadExtension.embedded\\\":\\\"Proje şu kodu içeren özel bir uzantı yüklemek istiyor:\\\",\\\"tw.loadExtension.sandboxed\\\":\\\"Kod korumalı alana alınsa da, cihazınızla ilgili IP'niz ve genel konumunuz gibi bilgilere erişmeye devam edecektir. Devam etmeden önce bu uzantının yazarına güvendiğinizden emin olun.\\\",\\\"tw.loadExtension.unsandboxedWarning\\\":\\\"Korumalı alan olmadan uzantıların yüklenmesi tehlikelidir. Projenizi bozabilir, ayarlarınızı silebilir, şifreleri ele geçirebilir ve diğer kötü şeyleri yapabilir. {APP_NAME}geliştiricileri ortaya çıkan sorunlardan sorumlu değildir.\\\",\\\"tw.loadExtension.url\\\":\\\"Proje, URL'den özel bir uzantı yüklemek istiyor:\\\",\\\"tw.loader.downloadingAssets\\\":\\\"Varlıklar indiriliyor ({complete}/{total}) ...\\\",\\\"tw.loader.loadingAssets\\\":\\\"Varlıklar yükleniyor ({complete}/{total}) ...\\\",\\\"tw.loader.projectData\\\":\\\"Proje yükleniyor ...\\\",\\\"tw.menuBar.60off\\\":\\\"60 FPS modunu kapat\\\",\\\"tw.menuBar.60on\\\":\\\"60 FPS modunu aç\\\",\\\"tw.menuBar.accent\\\":\\\"Aksan\\\",\\\"tw.menuBar.addons\\\":\\\"Eklentiler\\\",\\\"tw.menuBar.advanced\\\":\\\"Gelişmiş\\\",\\\"tw.menuBar.blockColors\\\":\\\"Blok Renkler\\\",\\\"tw.menuBar.changeUsername\\\":\\\"Adını değiştir\\\",\\\"tw.menuBar.cloudOff\\\":\\\"Bulut değişkenleri kapat\\\",\\\"tw.menuBar.cloudOn\\\":\\\"Bulut değişkenleri aç\\\",\\\"tw.menuBar.cloudUnavailable\\\":\\\"Bulut Değişkenleri bulamıyoruz\\\",\\\"tw.menuBar.cloudUnavailableAlert\\\":\\\"Bulut değişkenleri kullanamıyoruz, büyük ihtimalle editörü açtığınız için.\\\",\\\"tw.menuBar.desktopSettings\\\":\\\"Masaüstü Ayarları\\\",\\\"tw.menuBar.moreSettings\\\":\\\"Gelişmiş Ayarlar\\\",\\\"tw.menuBar.newFramerate\\\":\\\"Yeni karehızı:\\\",\\\"tw.menuBar.newWindow\\\":\\\"Yeni Pencere\\\",\\\"tw.menuBar.package\\\":\\\"Projeyi paketle\\\",\\\"tw.menuBar.reportError1\\\":\\\"Bazı komut dosyaları hatalarla karşılaştı.\\\",\\\"tw.menuBar.reportError2\\\":\\\"Bu bir hatadır. Lütfen bildirin.\\\",\\\"tw.menuBar.restorePoints\\\":\\\"Son kayıtlı nokta\\\",\\\"tw.menuBar.saveAs\\\":\\\"{file} olarak kaydet\\\",\\\"tw.menuBar.seeInside\\\":\\\"İçeri bak\\\",\\\"tw.moreCloud\\\":\\\"Bulut değişkenleri hakkında daha fazla bilgi edinin.\\\",\\\"tw.notify.permission\\\":\\\"İzin verilirse, tarayıcınız tarafından bildirimleri etkinleştirmeniz istenebilir ve daha sonraki bildirimlere otomatik olarak izin verilir.\\\",\\\"tw.notify.title\\\":\\\"Proje bildirimleri görüntülemek istiyor.\\\",\\\"tw.oldDownload\\\":\\\"Farklı dosyaya kaydet...\\\",\\\"tw.opcode.2000\\\":\\\"2000'den beri günler\\\",\\\"tw.opcode.mousedown\\\":\\\"fare basılı mı?\\\",\\\"tw.opcode.mousex\\\":\\\"fare x\\\",\\\"tw.opcode.mousey\\\":\\\"fare y\\\",\\\"tw.openAdvanced\\\":\\\"Gelişmiş ayarları aç\\\",\\\"tw.openWindow.dangerous\\\":\\\"Bu web sitesi {APP_NAME} geliştiricileri tarafından incelenmemiştir. Tehlikeli veya kötü amaçlı kod içerebilir.\\\",\\\"tw.openWindow.title\\\":\\\"Proje, URL'yi içeren yeni bir pencere veya sekme açmak istiyor:\\\",\\\"tw.paint.alpha\\\":\\\"Saydamlık\\\",\\\"tw.paint.fonts.more\\\":\\\"Daha fazla yazı tipi ekleyin...\\\",\\\"tw.pen.stageSelected\\\":\\\"Seçilen aşama: daha az kalem bloğu\\\",\\\"tw.privacy\\\":\\\"Gizillik Politikası\\\",\\\"tw.recordAudio.permission\\\":\\\"İzin verilirse, tarayıcınız tarafından mikrofon erişimini etkinleştirmeniz istenebilir ve daha fazla mikrofon erişimine otomatik olarak izin verilecektir.\\\",\\\"tw.recordAudio.title\\\":\\\"Proje mikrofonunuzdan ses kaydetmek istiyor. Bu, bir metin transkriptini veya ham ses verilerini içerebilir. Proje sesi diğer kullanıcılarla veya sunucularla paylaşabilir.\\\",\\\"tw.recordVideo.permission\\\":\\\"İzin verilirse, tarayıcınız tarafından kamera erişimini etkinleştirmeniz istenebilir ve daha fazla kamera erişimine otomatik olarak izin verilecektir.\\\",\\\"tw.recordVideo.title\\\":\\\"Proje kameranızdan video kaydetmek istiyor. Proje, görüntüleri diğer kullanıcılarla veya sunucularla paylaşabilir.\\\",\\\"tw.redirect.dangerous\\\":\\\"Bu web sitesi {APP_NAME} geliştiricileri tarafından incelenmemiştir. Tehlikeli veya kötü amaçlı kod içerebilir.\\\",\\\"tw.redirect.title\\\":\\\"Proje bu sekmeyi şu URL'ye yönlendirmek istiyor:\\\",\\\"tw.restorePoints.1minute\\\":\\\"her dakika\\\",\\\"tw.restorePoints.assets\\\":\\\"{n} varlıklar\\\",\\\"tw.restorePoints.confirmDelete\\\":\\\"\\\\\\\"{projectTitle}\\\\\\\"i silmek istediğinizden emin misiniz? Bu geri alınamaz.\\\",\\\"tw.restorePoints.confirmDeleteAll\\\":\\\"TÜM geri yükleme noktalarını silmek istediğinizden emin misiniz? Bu geri alınamaz.\\\",\\\"tw.restorePoints.confirmLoad\\\":\\\"Kaydedilmemiş değişiklikleriniz var. Mevcut projeyi değiştirmek mi?\\\",\\\"tw.restorePoints.deleteAll\\\":\\\"Hepsini sil\\\",\\\"tw.restorePoints.description\\\":\\\"{APP_NAME}, kaydetmeyi unutursanız projenizi kurtarmanıza yardımcı olmak için periyodik olarak bilgisayarınıza geri yükleme noktaları kaydeder. Bu, iyileşme için son çare olarak tasarlanmıştır. Bilgisayarınız bu geri yükleme noktalarını istediği zaman sessizce silebilir. Bu özelliğe güvenmeyin.\\\",\\\"tw.restorePoints.empty\\\":\\\"Geri yükleme noktası bulunamadı.\\\",\\\"tw.restorePoints.error\\\":\\\"Geri yükleme noktası yüklenirken hata oluştu: {error}\\\",\\\"tw.restorePoints.intervalOption\\\":\\\"{time} geri yükleme noktaları oluşturuldu.\\\",\\\"tw.restorePoints.loading\\\":\\\"Yükleniyor...\\\",\\\"tw.restorePoints.minutes\\\":\\\"her {n} dakikada bir\\\",\\\"tw.restorePoints.never\\\":\\\"Asla\\\",\\\"tw.restorePoints.off\\\":\\\"Geri yükleme noktalarını devre dışı bırakmak tehlikelidir.\\\",\\\"tw.restorePoints.size\\\":\\\"Kullanılan tahmini depolama alanı: {size}\\\",\\\"tw.restorePoints.size2\\\":\\\"Birden çok geri yükleme noktası tarafından kullanılan kostümler veya sesler yalnızca bir kez depolanır.\\\",\\\"tw.restorePoints.title\\\":\\\"Geri Yükleme Noktaları\\\",\\\"tw.sample\\\":\\\"Örnek Proje\\\",\\\"tw.saveAs\\\":\\\"Farklı kaydet...\\\",\\\"tw.saveTo\\\":\\\"{file} dosyasına kaydet\\\",\\\"tw.scratchUnsafeCloud\\\":\\\"Bu bulut değişkenini yaparsanız proje Scratch'in {number} değişkenleri sınırını aşacaktır ve projeyi Scratch'e yüklerseniz bazı değişkenler çalışmayacaktır.\\\",\\\"tw.securityManager.allow\\\":\\\"İzin vermek\\\",\\\"tw.securityManager.deny\\\":\\\"Reddetmek\\\",\\\"tw.securityManager.title\\\":\\\"Uzantı Güvenliği\\\",\\\"tw.securityManager.trust\\\":\\\"İzin verilirse, aynı web sitesine yapılacak başka isteklere de otomatik olarak izin verilecektir.\\\",\\\"tw.securityManager.why\\\":\\\"Bu, görüntüleri veya sesleri indirmek, çok oyunculu modu uygulamak, bir API'ye erişmek veya kötü amaçlarla kullanılabilir. Bu, IP adresinizi, genel konumunuzu ve muhtemelen diğer verilerinizi web sitesiyle paylaşacaktır.\\\",\\\"tw.settingsModal.customStageSize\\\":\\\"Özel Sahne Büyüklüğü:\\\",\\\"tw.settingsModal.customStageSizeHelp\\\":\\\"Scratch'in büyüklüğünü 480x360'den başka büyüklüğe değiştiriyor. Eğer geniş ekran istiyorsanız, 640x360yi deneyin. Sadece bir kaç projeler bunu düzgün bir şekilde halledebilir.\\\",\\\"tw.settingsModal.dangerZone\\\":\\\"Tehlikeli yer\\\",\\\"tw.settingsModal.disableCompiler\\\":\\\"Derlemeyi kapat\\\",\\\"tw.settingsModal.disableCompilerHelp\\\":\\\"{APP_NAME} derleyicisini devre dışı bırakır. Kodların hemen güncellenmesi için projeleri düzenlerken bunu etkinleştirmek isteyebilirsiniz. Aksi takdirde, bunu asla etkinleştirmemelisiniz.\\\",\\\"tw.settingsModal.featured\\\":\\\"Özellikli\\\",\\\"tw.settingsModal.fps\\\":\\\"60 FPS (Özel FPS)\\\",\\\"tw.settingsModal.fpsHelp\\\":\\\"Blokarı 30FPS yerinde 60FPS ile çalıştırır. Çoğu projeler bu mod ile 30FPS gibi çalışamaz. Bu durumda Enterpolasyonu 60 FPS modu devre dışı bırakarak denemelisiniz. {customFramerate}.\\\",\\\"tw.settingsModal.fpsHelp.customFramerate\\\":\\\"30FPS yada 60FPS'den başka kare hızı ile çalıştırmak istiyorsan bunu tıkla.\\\",\\\"tw.settingsModal.help\\\":\\\"Yardım için buraya tıkla\\\",\\\"tw.settingsModal.highQualityPen\\\":\\\"Yüksek kalite kalem\\\",\\\"tw.settingsModal.highQualityPenHelp\\\":\\\"Yüksek Kaliteli Kalem, kalem projelerinin daha yüksek kalitede görüntülemekte sağlar. ve oluşturucudaki bazı yuvarlamaları da görünmemesini sağlar. Bu ayardan tüm projelere bir advantaj veremiyor ve performansı etkileyebilir.\\\",\\\"tw.settingsModal.infiniteClones\\\":\\\"Sonsuz klonlar\\\",\\\"tw.settingsModal.infiniteClonesHelp\\\":\\\"Scratch'in 300 klon limiti çıkarıyor.\\\",\\\"tw.settingsModal.interpolation\\\":\\\"Enterpolasyon\\\",\\\"tw.settingsModal.interpolationHelp\\\":\\\"Enterpolasyon, hareketli grafik hareketini interpolasyon yaparak, projenin davranışını değiştirmeden daha yüksek kare hızlarında çalışıyormuş gibi görünmesini sağlayan deneysel bir özelliktir. Eğer bir projeyi 60 FPS'de çalıştırdıysanız ve çok hızlı çalıştığını fark ettiyseniz, İnterpolasyon bunu çözer. Enterpolasyon 3B projelerde, raytracer ve kalem projelerde kullanmayın çünkü projeleri yavaşlatır ve daha pürüzsüz yapmaz.\\\",\\\"tw.settingsModal.largeStageWarning\\\":\\\"Bu büyüklükte özel bir sahne boyutu kullanılması önerilmez! Bunun yerine, aynı en boy oranına sahip daha düşük bir boyut kullanın ve tam ekran modunun kullanıcının ekranına uyacak şekilde yükseltmesine izin verin.\\\",\\\"tw.settingsModal.removeFencing\\\":\\\"Eskirimi çıkart\\\",\\\"tw.settingsModal.removeFencingHelp\\\":\\\"Kuklaları ekran dışı yerler gitmeyi izin verir ve kuklaların istediği kadar büyük yada küçük olmasını izin verir, ve dokunma blokları ekran dışında kullanılabilir.\\\",\\\"tw.settingsModal.removeLimits\\\":\\\"Limitleri çıkart\\\",\\\"tw.settingsModal.removeMiscLimits\\\":\\\"Çeşitli Limitleri Kaldır\\\",\\\"tw.settingsModal.removeMiscLimitsHelp\\\":\\\"Ses efekti limitleri gibi projeleri bozmaması olmayan çeşitli limitleri kaldırır.\\\",\\\"tw.settingsModal.storeProjectOptions\\\":\\\"Proje ayarlarını kaydet\\\",\\\"tw.settingsModal.storeProjectOptionsHelp\\\":\\\"TurboWarp bu projeyi yüklediğinde, ayarların otomatik olarak uygulanması için seçilmiş ayarları projede kaydeder. Warp zamanlayıcısı ve derleyiciyi devre dışı bırakma ayarları kaydedilmeyecektir.\\\",\\\"tw.settingsModal.title\\\":\\\"Gelişmiş Ayarlar\\\",\\\"tw.settingsModal.warpTimer\\\":\\\"Warp zamanlayıcı\\\",\\\"tw.settingsModal.warpTimerHelp\\\":\\\"Warp zamanlayıcı bloklara uzun veya sonsuz bir döngüde takılıp kalmadıklarını kontrol etmesini sağlar ve çok yavaş bir karehızında yürütüyor, ve bu da çoğu çökmeyi düzeltir. Bunun çok büyük bir performans etkisi vardır, bu nedenle editörün dışında varsayılan olarak etkinleştirilmez.\\\",\\\"tw.soundEditorNotSupported\\\":\\\"Ses düzenleyici bu tarayıcıda desteklenmiyor.\\\",\\\"tw.spriteSelectorItem.rename\\\":\\\"yeniden adlandır\\\",\\\"tw.stageHeader.full\\\":\\\"Tam kademeye geç\\\",\\\"tw.stereo\\\":\\\"Müzik seti\\\",\\\"tw.stereoAlert\\\":\\\"Bu stereo sesi düzenlemek onu geri dönülemez bir şekilde monoya dönüştürecektir.\\\",\\\"tw.studioview.authorAttribution\\\":\\\"{author} tarafından\\\",\\\"tw.studioview.error\\\":\\\"Sonraki proje sayfası yüklenirken hata oluştu.\\\",\\\"tw.studioview.hoverText\\\":\\\"{title} tarafından {author}\\\",\\\"tw.tooLarge\\\":\\\"Bu ses Scratch'e yüklenemeyecek kadar büyük olabilir.\\\",\\\"tw.twExtension.description\\\":\\\"Tuhaf yeni bloklar.\\\",\\\"tw.twExtension.name\\\":\\\"{APP_NAME} Blokları\\\",\\\"tw.unfavorite\\\":\\\"Favori Olmayan\\\",\\\"tw.unshared.2\\\":\\\"Daha fazla bilgi için şu adresi ziyaret edin: {link}\\\",\\\"tw.unshared.bug\\\":\\\"Bu proje gerçekten paylaşılıyorsa lütfen bir hata bildirin.\\\",\\\"tw.unshared.cache\\\":\\\"Proje yakın zamanda paylaşıldıysa bu mesaj birkaç dakika boyunca hatalı görünebilir.\\\",\\\"tw.unshared2.1\\\":\\\"Paylaşılmayan projeler artık görünmez.\\\",\\\"tw.usernameModal.help\\\":\\\"Bu kullanıcı adı web tarayıcının çerezlerinde olacak. Bulut değişkenleri olan projelerle etkileşim kurduğunuzda kaydedilebilir.\\\",\\\"tw.usernameModal.help2\\\":\\\"Geçerli bir Scratch hesabına karşılık gelen değerler genellikle bulut değişken sunucusu tarafından reddedilirecek. Olduğu gibi ybırakmanızı vea Scratch kullanıcı adınızı değiştirmenizi öneririz.\\\",\\\"tw.usernameModal.mustChange\\\":\\\"Üzgünüz, bulut değişken sunucusu kullanıcı adınızın güvensiz olabileceğini düşünüyor. Lütfen başka bir şeyle değiştirin yada {resetIt}.\\\",\\\"tw.usernameModal.mustChange.resetIt\\\":\\\"sıfırlayın (önerildi)\\\",\\\"tw.usernameModal.new\\\":\\\"Yeni kullanıcı adı:\\\",\\\"tw.usernameModal.reset\\\":\\\"Sıfırla\\\",\\\"tw.usernameModal.title\\\":\\\"Adını değiştir\\\",\\\"tw.usesCloudVariables\\\":\\\"Bu proje bulut değişkenlerini kullanıyor.\\\",\\\"tw.usesCloudVariables2\\\":\\\"{APP_NAME}'in bulut değişkenleri Scratch'inkilere bağlı değil. Herkes {changeTheirUsername} herhangi bir şey yapabilir, bu nedenle kimliğe bürünmeye karşı dikkatli olun.\\\",\\\"tw.usesCloudVariables2.change\\\":\\\"kullanıcı adını değiştir\\\",\\\"tw.viewFeaturedProjects\\\":\\\"Özellikli projeleri görmek için buraya tıklayınız.\\\",\\\"tw.viewOnScratch\\\":\\\"Projeyi Scratch'te görüntüleyin.\\\"},\\\"uk\\\":{\\\"tw.accent.blue\\\":\\\"Синій\\\",\\\"tw.accent.purple\\\":\\\"Фіолетовий\\\",\\\"tw.accent.rainbow\\\":\\\"Різнобарвний\\\",\\\"tw.accent.red\\\":\\\"Червоний\\\",\\\"tw.alerts.creatingRestorePoint\\\":\\\"Створення точки відновлення...\\\",\\\"tw.alerts.lostPeripheralConnection\\\":\\\"Втрачено зв'язок з {extensionName}\\\",\\\"tw.alerts.restorePointError\\\":\\\"Не вдалося створити точку відновлення.\\\",\\\"tw.alerts.restorePointSuccess\\\":\\\"Отримайте доступ до точок відновлення у відділі \\\\\\\"Файл\\\\\\\"\\\",\\\"tw.alerts.savedToDisk\\\":\\\"Збережено на ваш комп'ютер.\\\",\\\"tw.backpack.rename\\\":\\\"Нова назва:\\\",\\\"tw.blockColors.custom\\\":\\\"Редагувати в Налаштуваннях Доповнень\\\",\\\"tw.blockColors.dark\\\":\\\"Темні (Бета)\\\",\\\"tw.blockColors.highContrast\\\":\\\"Високий контраст\\\",\\\"tw.blockColors.three\\\":\\\"Оригінальні\\\",\\\"tw.blocks.PROCEDURES_DOCS\\\":\\\"Як використовувати блоки, що повертають значення\\\",\\\"tw.blocks.PROCEDURES_RETURN\\\":\\\"повернути {v}\\\",\\\"tw.blocks.PROCEDURES_TO_REPORTER\\\":\\\"Перетворити На Репортер\\\",\\\"tw.blocks.PROCEDURES_TO_STATEMENT\\\":\\\"Перетворити На Звичайний\\\",\\\"tw.blocks.addons\\\":\\\"Доповнення\\\",\\\"tw.blocks.buttonIsDown\\\":\\\"[MOUSE_BUTTON] кнопку миші натиснуто?\\\",\\\"tw.blocks.lastKeyPressed\\\":\\\"остання клавіша натиснута\\\",\\\"tw.blocks.mouseButton.middle\\\":\\\"(1) середня\\\",\\\"tw.blocks.mouseButton.primary\\\":\\\"(0) основна\\\",\\\"tw.blocks.mouseButton.secondary\\\":\\\"(2) додаткова\\\",\\\"tw.blocks.openDocs\\\":\\\"Відкрити документацію\\\",\\\"tw.browserModal.desktopSettings\\\":\\\"Відкрити Налаштування Програми\\\",\\\"tw.browserModal.desktopTitle\\\":\\\"Система не підтримується\\\",\\\"tw.browserModal.webgl1\\\":\\\"{APP_NAME} потребує WebGL, проте, схоже що ваш комп'ютер цього не підтримує. Зазвичай це тимчасова помилка, якої можна позбавитись перезавантаживши комп'ютер.\\\",\\\"tw.browserModal.webglBrowser\\\":\\\"Використовуйте нову версію Chrome, Firefox, або Safari, і переконайтеся що ваші драйвери сучасні. Ви можете спробувати увімкнути \\\\\\\"апаратне прискорення\\\\\\\" або \\\\\\\"графічне прискорення\\\\\\\" у налаштуваннях вашого браузера.\\\",\\\"tw.browserModal.webglDesktop\\\":\\\"Ви можете спробувати увімкнути \\\\\\\"апаратне прискорення\\\\\\\" у налаштуваннях програми:\\\",\\\"tw.cantUseCloud\\\":\\\"Хоча ви можете створювати хмарні змінні, вони не будуть працювати до тих пір, доки проєкт не буде завантажений на Scratch, або упакований за допомогою {packager}\\\",\\\"tw.changeUsername.cannotChangeWhileRunning\\\":\\\"Неможливо змінити ім'я користувача, поки проєкт працює.\\\",\\\"tw.clipboard.danger\\\":\\\"Якщо у вашому буфері обміну є такі речі, як паролі, можливо, цей проєкт може передавати їх іншим користувачам або серверам.\\\",\\\"tw.clipboard.permission\\\":\\\"Доступ до буферу обміну може не надаватися деякими браузерами. Якщо дозволите, то подальші запити будуть автоматично дозволені.\\\",\\\"tw.clipboard.title\\\":\\\"Цей проєкт хоче бачити вміст вашого буферу обміну.\\\",\\\"tw.cloudProvider\\\":\\\"Сервер надає: {name}.\\\",\\\"tw.cloudServers\\\":\\\"Виберіть сервер біля вас:\\\",\\\"tw.code\\\":\\\"Початковий Код\\\",\\\"tw.confirmIncompatibleExtension\\\":\\\"Це розширення несумісне зі Scratch. Проєкти, створені за допомогою цього розширення, неможливо завантажити на Scratch. Ви дійсно хочете увімкнути це?\\\",\\\"tw.createdBy\\\":\\\"Створено:\\\",\\\"tw.customCloudServer\\\":\\\"Використовується користувальницький сервер хмарних змінних: {server}\\\",\\\"tw.customExtension.description\\\":\\\"Завантажте користувальницьке розширення з URL, файлу або коду JavaScript.\\\",\\\"tw.customExtension.name\\\":\\\"Користувальницьке розширення\\\",\\\"tw.customExtensionModal.file\\\":\\\"Файли\\\",\\\"tw.customExtensionModal.load\\\":\\\"Завантажити\\\",\\\"tw.customExtensionModal.promptFile\\\":\\\"Виберіть або закиньте JavaScript файли розширення:\\\",\\\"tw.customExtensionModal.promptText\\\":\\\"Вставте джерельний JavaScript код розширення:\\\",\\\"tw.customExtensionModal.promptURL\\\":\\\"Введіть URL розширення:\\\",\\\"tw.customExtensionModal.text\\\":\\\"Текст\\\",\\\"tw.customExtensionModal.title\\\":\\\"Завантажити Користувальницьке Розширення\\\",\\\"tw.customExtensionModal.trusted\\\":\\\"Це розширення буде завантажено без пісочниці, оскільки воно з довіреного джерела.\\\",\\\"tw.customExtensionModal.unsandboxed\\\":\\\"Запуск без пісочниці\\\",\\\"tw.customExtensionModal.unsandboxedWarning1\\\":\\\"Завантажувати розширення без пісочниці небезпечно і не має бути дозволено, якщо ви не знаєте що робите.\\\",\\\"tw.customExtensionModal.unsandboxedWarning2\\\":\\\"Розширення, запущені не в пісочниці, можуть псувати ваш проєкт, видаляти налаштування, вимагати паролі або робити інші погані речі. Розробники {APP_NAME} не відповідальні ні за які результативні проблеми.\\\",\\\"tw.customExtensionModal.untrusted\\\":\\\"Для безпеки, розширення з не довірених джерел буде завантажено в пісочниці. \\\",\\\"tw.customReporters.description\\\":\\\"Дозволяє користувальницьким блокам повертати значення а також бути використаними як ввід.\\\",\\\"tw.customReporters.name\\\":\\\"Користувальницькі Репортери\\\",\\\"tw.darkMode\\\":\\\"Увімкнути Світлу Тему\\\",\\\"tw.desktopCloud\\\":\\\"У версії для комп'ютера хмарні змінні синхронізуються між усіма відчиненими вікнами на одному комп'ютері. Завантажте проєкт на Scratch або використайте {packager}, щоб вони синхронізувалися глобально.\\\",\\\"tw.documentation\\\":\\\"Документація\\\",\\\"tw.download.danger\\\":\\\"Цей файл не був перевірений розробниками {APP_NAME}.\\\",\\\"tw.download.executable\\\":\\\"Це формат виконуваного файлу, який може запустити шкідливий код, якщо ви його відкриєте.\\\",\\\"tw.download.file\\\":\\\"Проєкт хоче завантажити файл на ваш комп'ютер. Його буде збережено як {name} у ваших завантаженнях.\\\",\\\"tw.embed.persistent\\\":\\\"Якщо ви дозволите, подальші вставки на такий самий сайт будуть автоматично дозволені.\\\",\\\"tw.embed.risks\\\":\\\"Незважаючи на те, що вставна програма буде ізольована, в неї все одно буде доступ до інформації про ваш пристрій, такої як ваше IP та загальне місцезнаходження.\\\",\\\"tw.embed.title1\\\":\\\"Проєкт хоче вставити HTML контент поверх сцени:\\\",\\\"tw.embed.title2\\\":\\\"Проєкт хоче вставити віддалений контент поверх сцени:\\\",\\\"tw.extensionGallery.error\\\":\\\"Помилка при завантаженні галереї розширень. Перегляньте extensions.turbowarp.org щоб знайти більше розширень.\\\",\\\"tw.extensionGallery.loading\\\":\\\"Завантажуємо галерею розширень...\\\",\\\"tw.extensionGallery.more\\\":\\\"Дізнайтеся більше про розширення на сайті extentions.turbowarp.org.\\\",\\\"tw.extensionGallery.name\\\":\\\"Галерея Розширень {APP_NAME}\\\",\\\"tw.favorite\\\":\\\"Позначити як улюблений\\\",\\\"tw.featuredProjectsStudio\\\":\\\"Переглянути студію на Scratch.\\\",\\\"tw.feedback\\\":\\\"Зв'язок з розробником та помилки\\\",\\\"tw.feedbackButton\\\":\\\"{APP_NAME} Зворотній зв'язок\\\",\\\"tw.fetch.title\\\":\\\"Цей проєкт хоче під'єднатися до вебсайту:\\\",\\\"tw.fileInput.none\\\":\\\"Немає вибраних файлів.\\\",\\\"tw.fileInput.selected\\\":\\\"Вибрано: {names}\\\",\\\"tw.fonts.add\\\":\\\"Додати\\\",\\\"tw.fonts.custom.file\\\":\\\"Виберіть файл з шрифтом зі свого комп'ютера:\\\",\\\"tw.fonts.custom.name\\\":\\\"Назвіть шрифт:\\\",\\\"tw.fonts.custom1\\\":\\\"Додати шрифт з файлу\\\",\\\"tw.fonts.custom2\\\":\\\"Може не працювати на Scratch. Підтримувані формати: {formats}\\\",\\\"tw.fonts.delete\\\":\\\"Ви впевнені, що хочете видалити \\\\\\\"{font}\\\\\\\"? В будь-яких векторних образах замість цього буде використано резервний шрифт.\\\",\\\"tw.fonts.fallback\\\":\\\"Виберіть резервний шрифт, який буде використано, якщо цей шрифт не завантажиться або буде видалено.\\\",\\\"tw.fonts.list\\\":\\\"Встановлені шрифти:\\\",\\\"tw.fonts.none\\\":\\\"Покищо не додано ніяких шрифтів.\\\",\\\"tw.fonts.readError\\\":\\\"Не вдалося прочитати файл шрифту: {error}\\\",\\\"tw.fonts.system\\\":\\\"Системний шрифт\\\",\\\"tw.fonts.system.name\\\":\\\"Введіть назву будь якого шрифту, вбудованого на вашому комп'ютері. Шрифт може не відображатися правильно для всіх.\\\",\\\"tw.fonts.system1\\\":\\\"Додати системний шрифт\\\",\\\"tw.fonts.system2\\\":\\\"Може працювати у Scratch, але не буде відображатися правильно для всіх.\\\",\\\"tw.fonts.title\\\":\\\"Шрифти\\\",\\\"tw.footer.credits\\\":\\\"Подяки\\\",\\\"tw.footer.disclaimer\\\":\\\"{APP_NAME} ніяк не пов'язаний зі Scratch, Scratch Team або Scratch Foundation.\\\",\\\"tw.footer.documentation\\\":\\\"Документація\\\",\\\"tw.footer.embed\\\":\\\"Вбудовування\\\",\\\"tw.footer.parameters\\\":\\\"Параметри URL\\\",\\\"tw.footer.scratchDisclaimer\\\":\\\"Scratch, це проєкт організації Scratch Foundation. Він доступний безкоштовно на {scratchDotOrg}.\\\",\\\"tw.fps\\\":\\\"{framerate}Кадрів у секунду\\\",\\\"tw.geolocate.permission\\\":\\\"Якщо ви дозволите, ваш браузер можуть попросити дозволити доступ до місцеположення.\\\",\\\"tw.geolocate.title\\\":\\\"Цей проєкт хоче знати ваше місцезнаходження.\\\",\\\"tw.gui.crashMessage.description\\\":\\\"Нам дуже шкода, але схоже що сторінка дала збій. Будь ласка, оновіть сторінку, щоб повторити спробу.\\\",\\\"tw.gui.defaultProjectTitle\\\":\\\"Проєкт\\\",\\\"tw.guiDefaultTitle\\\":\\\"Запускайте проєкти Scratch швидше\\\",\\\"tw.home.credit\\\":\\\"Замітки та Подяки\\\",\\\"tw.home.description\\\":\\\"{APP_NAME} - це модифікація на Scratch, що компілює проєкти у JavaScript, заставляючи їх працювати набагато швидше. Спробуйте ввести посилання на проєкт вище або виберіть з обраних проєктів нище.\\\",\\\"tw.home.instructions\\\":\\\"Інструкції\\\",\\\"tw.input.tooltip\\\":\\\"Скопіюйте та вставте URL адресу Scratch проєкту сюди!\\\",\\\"tw.interpolationEnabled\\\":\\\"Інтерполяція\\\",\\\"tw.invalidParameters.clones\\\":\\\"Параметр \\\\\\\"clone\\\\\\\" в URL некоректний\\\",\\\"tw.invalidParameters.fps\\\":\\\"Параметр \\\\\\\"fps\\\\\\\" в URL некоректний\\\",\\\"tw.invalidProject.error\\\":\\\"Не вийшло завантажити проєкт:\\\",\\\"tw.invalidProject.options\\\":\\\"Можливо, ви можете відновити старішу версію проєкту з автоматичних точок відновлення, або з його резервних копій.\\\",\\\"tw.invalidProject.reportIt\\\":\\\"надішліть звіт\\\",\\\"tw.invalidProject.restorePoints\\\":\\\"Переглянути Точки Відновлення\\\",\\\"tw.invalidProject.title\\\":\\\"Помилка\\\",\\\"tw.invalidProject.validationError\\\":\\\"Зазвичай ця помилка означає, що невеличка частина проєкту була пошкоджена, але це може бути не так. Тому {reportIt} про це, будь ласка.\\\",\\\"tw.lightMode\\\":\\\"Увімкнути Темну Тему\\\",\\\"tw.loadExtension.embedded\\\":\\\"Цей проєкт хоче завантажити користувальницьке розширення з кодом:\\\",\\\"tw.loadExtension.sandboxed\\\":\\\"Незважаючи на те, що код буде ізольований, в нього все одно буде доступ до інформації про ваш пристрій, такої як ваше IP та загальне місцезнаходження. Перед тим як продовжити, переконайтеся, що ви довіряєте автору цього розширення.\\\",\\\"tw.loadExtension.unsandboxed\\\":\\\"Запуск без пісочниці\\\",\\\"tw.loadExtension.unsandboxedWarning\\\":\\\"Завантажувати розширення без пісочниці небезпечно. Вони можуть пошкодити ваш проєкт, видалити налаштування, вимагати паролі або робити інші погані речі. Розробники {APP_NAME} не відповідальні ні за які результативні проблеми.\\\",\\\"tw.loadExtension.url\\\":\\\"Цей проєкт хоче завантажити користувальницьке розширення з посилання:\\\",\\\"tw.loader.downloadingAssets\\\":\\\"Завантаження ресурсів ({complete}/{total}) ...\\\",\\\"tw.loader.loadingAssets\\\":\\\"Завантаження ресурсів ({complete}/{total}) ...\\\",\\\"tw.loader.projectData\\\":\\\"Завантаження проєкту...\\\",\\\"tw.menuBar.60off\\\":\\\"Вимкнути режим 60 FPS\\\",\\\"tw.menuBar.60on\\\":\\\"Увімкнути режим 60 FPS\\\",\\\"tw.menuBar.accent\\\":\\\"Акцентний колір\\\",\\\"tw.menuBar.addons\\\":\\\"Доповнення\\\",\\\"tw.menuBar.advanced\\\":\\\"Розширені\\\",\\\"tw.menuBar.blockColors\\\":\\\"Кольори Блоків\\\",\\\"tw.menuBar.changeUsername\\\":\\\"Змінити ім'я користувача\\\",\\\"tw.menuBar.cloudOff\\\":\\\"Вимкнути хмарні змінні\\\",\\\"tw.menuBar.cloudOn\\\":\\\"Увімкнути хмарні змінні\\\",\\\"tw.menuBar.cloudUnavailable\\\":\\\"Хмарні змінні недоступні\\\",\\\"tw.menuBar.cloudUnavailableAlert\\\":\\\"Не вдається використати хмарні змінні, швидше за все, тому що ви відкрили редактор.\\\",\\\"tw.menuBar.desktopSettings\\\":\\\"Налаштування робочого столу\\\",\\\"tw.menuBar.moreSettings\\\":\\\"Розширені Налаштування\\\",\\\"tw.menuBar.newFramerate\\\":\\\"Нова частота кадрів:\\\",\\\"tw.menuBar.newWindow\\\":\\\"Нове вікно\\\",\\\"tw.menuBar.package\\\":\\\"Упакувати проєкт\\\",\\\"tw.menuBar.reportError1\\\":\\\"В деяких скриптах з'явилися помилки.\\\",\\\"tw.menuBar.reportError2\\\":\\\"Це помилка. Будь-ласка, повідомте нам про це.\\\",\\\"tw.menuBar.restorePoints\\\":\\\"Точки відновлення\\\",\\\"tw.menuBar.saveAs\\\":\\\"Зберегти як {file}\\\",\\\"tw.menuBar.seeInside\\\":\\\"Переглянути код\\\",\\\"tw.mono\\\":\\\"Моно\\\",\\\"tw.moreCloud\\\":\\\"Дізнайтеся більше про хмарні змінні.\\\",\\\"tw.notify.permission\\\":\\\"Якщо дозволите, ваш браузер може також пропонувати вам увімкнути сповіщення, тоді подальші запити на показ сповіщень будуть автоматично дозволені.\\\",\\\"tw.notify.title\\\":\\\"Цей проєкт хоче показувати сповіщення.\\\",\\\"tw.oldDownload\\\":\\\"Зберегти як окремий файл...\\\",\\\"tw.opcode.2000\\\":\\\"днів від 2000 року\\\",\\\"tw.opcode.mousedown\\\":\\\"мишку натиснуто?\\\",\\\"tw.opcode.mousex\\\":\\\"вказівник x\\\",\\\"tw.opcode.mousey\\\":\\\"вказівник y\\\",\\\"tw.openAdvanced\\\":\\\"Відкрити розширені налаштування\\\",\\\"tw.openWindow.dangerous\\\":\\\"Цей сайт не був перевірений розробниками {APP_NAME}. Він може містити небезпечний або шкідливий код.\\\",\\\"tw.openWindow.title\\\":\\\"Даний проєкт хоче відкрити нове вікно або вкладку за посиланням:\\\",\\\"tw.paint.alpha\\\":\\\"Непрозорість\\\",\\\"tw.paint.fonts.more\\\":\\\"Додати більше шрифтів...\\\",\\\"tw.pen.stageSelected\\\":\\\"Вибрано сцену: менше блоків для пера\\\",\\\"tw.privacy\\\":\\\"Політика Конфіденсійності\\\",\\\"tw.recordAudio.permission\\\":\\\"Якщо дозволите, ваш браузер може також пропонувати вам надати доступ до мікрофону, тоді подальші запити на доступ до мікрофону будуть автоматично дозволені.\\\",\\\"tw.recordAudio.title\\\":\\\"Проєкт хоче записати аудіо з вашого мікрофону. Це може включати текстову розшифровку або необроблені аудіодані. Він може мати можливість обмінюватися цими даними з іншими користувачами або серверами.\\\",\\\"tw.recordVideo.permission\\\":\\\"Якщо дозволите, ваш браузер може також пропонувати вам надати доступ до камери, тоді подальші запити на доступ до камери будуть автоматично дозволені.\\\",\\\"tw.recordVideo.title\\\":\\\"Проєкт хоче записати відео з вашої камери. Можливо, проєкт зможе обмінюватися зображеннями з іншими користувачами або серверами.\\\",\\\"tw.redirect.dangerous\\\":\\\"Цей сайт не був перевірений розробниками {APP_NAME}. Він може містити небезпечний або шкідливий код.\\\",\\\"tw.redirect.title\\\":\\\"Проєкт хоче перевести цю вкладку за посиланням:\\\",\\\"tw.removedTrademarks\\\":\\\"Деякі спрайти та образи з торговою маркою Scratch більше не відображаються у цьому списку.\\\",\\\"tw.restorePoints.1minute\\\":\\\"кожної хвилини\\\",\\\"tw.restorePoints.assets\\\":\\\"{n} ресурсів\\\",\\\"tw.restorePoints.confirmDelete\\\":\\\"Ви впевнені, що хочете видалити \\\\\\\"{projectTitle}\\\\\\\"? Цю дію не можна відмінити.\\\",\\\"tw.restorePoints.confirmDeleteAll\\\":\\\"Ви впевнені, що хочете видалити ВСІ точки відновлень? Цю дію не можна відмінити.\\\",\\\"tw.restorePoints.confirmLoad\\\":\\\"У вас є незбережені зміни. Замінити поточний проєкт?\\\",\\\"tw.restorePoints.deleteAll\\\":\\\"Видалити все\\\",\\\"tw.restorePoints.description\\\":\\\"{APP_NAME} періодично зберігає точки відновлення на вашому комп'ютері, щоб допомогти вам відновити ваш проєкт, якшо ви забудете зберегти його. Це створено, як остання можливість відновити ваш проєкт. Ваш комп'ютер може автоматично видаляти їх будь-коли. НЕ ПОКЛАДАЙТЕСЯ на цю функцію.\\\",\\\"tw.restorePoints.empty\\\":\\\"Точок відновлення не знайдено.\\\",\\\"tw.restorePoints.error\\\":\\\"Помилка при завантаженні точки відновлення: {error}\\\",\\\"tw.restorePoints.exportError\\\":\\\"Помилка при експортуванні точки відновлення: {error}\\\",\\\"tw.restorePoints.intervalOption\\\":\\\"Точки відновлення буде створювано {time}.\\\",\\\"tw.restorePoints.loading\\\":\\\"Завантаження...\\\",\\\"tw.restorePoints.minutes\\\":\\\"кожні {n} хвилин\\\",\\\"tw.restorePoints.never\\\":\\\"ніколи\\\",\\\"tw.restorePoints.off\\\":\\\"Вимикати точки відновлення небезпечно.\\\",\\\"tw.restorePoints.size\\\":\\\"Використано пам'яті: {size}\\\",\\\"tw.restorePoints.size2\\\":\\\"Образи та звуки, які використовуються кількома точками відновлення одночасно, зберігаються лише один раз.\\\",\\\"tw.restorePoints.title\\\":\\\"Точки Відновлення\\\",\\\"tw.sample\\\":\\\"Проєкт-шаблон\\\",\\\"tw.saveAs\\\":\\\"Зберегти як...\\\",\\\"tw.saveTo\\\":\\\"Зберегти як {file}\\\",\\\"tw.scratchUnsafeCloud\\\":\\\"Якщо ви створите цю хмарну змінну, проєкт перевищить ліміт Scratch в {number} змінних, тому деякі змінні не працюватимуть, якщо завантажити проєкт на Scratch.\\\",\\\"tw.securityManager.allow\\\":\\\"Дозволити\\\",\\\"tw.securityManager.deny\\\":\\\"Відхилити\\\",\\\"tw.securityManager.title\\\":\\\"Система Безпеки\\\",\\\"tw.securityManager.trust\\\":\\\"Якщо ви дозволите, подальші запити на такий самий сайт будуть автоматично дозволені.\\\",\\\"tw.securityManager.why\\\":\\\"Це може бути використано, щоб завантажувати зображення або звуки, реалізації багатокористувальницької гри, доступу до API, або в зловмисних цілях. При цьому сайт отримає доступ до вашої IP адреси, загальному місцеположенню та, можливо, іншим даним.\\\",\\\"tw.settingsModal.customStageSize\\\":\\\"Користувальницький розмір сцени:\\\",\\\"tw.settingsModal.customStageSizeHelp\\\":\\\"Змінює розмір сцени з 480x360 на щось інше. Спробуйте використати 640x360, щоб зробити сцену широкоформатною. Тільки одиниці з проєктів будуть працювати правильно з цим налаштуванням.\\\",\\\"tw.settingsModal.dangerZone\\\":\\\"Небезпечна Зона\\\",\\\"tw.settingsModal.disableCompiler\\\":\\\"Вимкнути Компілятор\\\",\\\"tw.settingsModal.disableCompilerHelp\\\":\\\"Вимикає компілятор {APP_NAME}. Ви можете вмикати цю опцію, коли ви редагуєте проект, щоб скрипти оновлювалися моментально. В інших випадках вам не варто вмикати цю опцію.\\\",\\\"tw.settingsModal.featured\\\":\\\"Обране\\\",\\\"tw.settingsModal.fps\\\":\\\"60 FPS (Користувальницькі FPS)\\\",\\\"tw.settingsModal.fpsHelp\\\":\\\"Виконує скрипти 60 раз в секунду замість 30. Більшість проєктів не будуть працювати належним чином, коли цей параметр увімкнено. Якщо це так, спробуйте інтерполяцію з вимкненим режимом 60 FPS.{customFramerate}.\\\",\\\"tw.settingsModal.fpsHelp.customFramerate\\\":\\\"Натисніть, щоб використати іншу частоту кадрів, замість 30 або 60\\\",\\\"tw.settingsModal.help\\\":\\\"Натисніть, щоб побачити подробиці\\\",\\\"tw.settingsModal.highQualityPen\\\":\\\"Перо Високої Якості\\\",\\\"tw.settingsModal.highQualityPenHelp\\\":\\\"Дозволяє виконувати візуалізацію пера з більш високою якістю, також вимикає деякі округлення координат в редакторі. Цей параметр корисний не для всіх проєктів, і може вплинути на продуктивність.\\\",\\\"tw.settingsModal.infiniteClones\\\":\\\"Безмежна Кількість Клонів\\\",\\\"tw.settingsModal.infiniteClonesHelp\\\":\\\"Вимикає ліміт Scratch на 300 клонів.\\\",\\\"tw.settingsModal.interpolation\\\":\\\"Інтерполяція\\\",\\\"tw.settingsModal.interpolationHelp\\\":\\\"Інтерполює рухи спрайтів, роблячи проєкт більш плавним. Не використовуйте інтерполяцію в 3D проєктах, проєктах з трассуванням променів, проєктах на основі пера та повільних проєктах, оскільки інтерполяція не зробить їх більш плавними, і навіть негативно вплине на їх швидкість.\\\",\\\"tw.settingsModal.largeStageWarning\\\":\\\"Використовувати настільки великий розмір сцени не рекомендується! Краще використовуйте сцену меншого розміру, але з таким самим співвідношенням сторін і дайте повноекранному режиму збільшити сцену так, щоб вона могла підійти по розміру до дисплею користувача.\\\",\\\"tw.settingsModal.removeFencing\\\":\\\"Прибрати Рамку\\\",\\\"tw.settingsModal.removeFencingHelp\\\":\\\"Дозволяє спрайтам виходити за межі сцени, ставати настільки великими або маленькими, наскільки вони захочуть, та робить так, щоб блоки доторкань працювали за межами сцени.\\\",\\\"tw.settingsModal.removeLimits\\\":\\\"Прибрати Обмеження\\\",\\\"tw.settingsModal.removeMiscLimits\\\":\\\"Прибрати Різні Обмеження\\\",\\\"tw.settingsModal.removeMiscLimitsHelp\\\":\\\"Прибирає обмеження звукових еффектів та розміру пера.\\\",\\\"tw.settingsModal.storeProjectOptions\\\":\\\"Зберегти налаштування у проєкті\\\",\\\"tw.settingsModal.storeProjectOptionsHelp\\\":\\\"Зберігає вибрані налаштування в проєкті щоб вони автоматично застосовувалися, коли проєкт відкривається TurboWarp'ом. Warp Таймер і відключення компілятора не буде збережено. \\\",\\\"tw.settingsModal.title\\\":\\\"Розширені Налаштування\\\",\\\"tw.settingsModal.warpTimer\\\":\\\"Warp Таймер\\\",\\\"tw.settingsModal.warpTimerHelp\\\":\\\"Перевіряє, які скрипти застрягли в довгому, або безкінечному циклі та знижує часоту кадрів, замість того щоб проєкт застиг, доки цикл не завершиться. Це виправляє велику частину критичних помилок, але це негативно впливає на швидкість проєкту, тому за умовчанням цей параметр увімкнений тільки в редакторі.\\\",\\\"tw.soundEditorNotSupported\\\":\\\"Редактор звуків не підтримується в цьому браузері.\\\",\\\"tw.spriteSelectorItem.rename\\\":\\\"перейменувати\\\",\\\"tw.stageHeader.full\\\":\\\"На весь екран\\\",\\\"tw.stereo\\\":\\\"Стерео\\\",\\\"tw.stereoAlert\\\":\\\"Редактування цого стерео звуку приведе до його конвертування в моно.\\\",\\\"tw.studioview.authorAttribution\\\":\\\"від {author}\\\",\\\"tw.studioview.error\\\":\\\"При завантаженні наступної сторінки проєктів сталася помилка.\\\",\\\"tw.studioview.hoverText\\\":\\\"{title} від {author}\\\",\\\"tw.tooLarge\\\":\\\"Цей звук може бути занадто великим для експорту на Scratch.\\\",\\\"tw.twExtension.description\\\":\\\"Дивні нові блоки.\\\",\\\"tw.twExtension.name\\\":\\\"Блоки {APP_NAME}\\\",\\\"tw.unfavorite\\\":\\\"Прибрати марку\\\",\\\"tw.unknownPlatform.1\\\":\\\"Цей проєкт був створений для іншої платформи:\\\",\\\"tw.unknownPlatform.2\\\":\\\"Сумісність з {APP_NAME} не гарантована. Якщо ви продовжите, це буде на вашій відповідальності, і ми, можливо, не зможемо вам допомогти, якщо з'являться проблеми.\\\",\\\"tw.unknownPlatform.continue\\\":\\\"Я розумію\\\",\\\"tw.unknownPlatform.title\\\":\\\"Невідома Платформа\\\",\\\"tw.unshared.2\\\":\\\"Перейдіть на {link}, щоб отримати більше інформації\\\",\\\"tw.unshared.bug\\\":\\\"Якщо насправді цей проєкт опубліковано, повідомте нам про помилку.\\\",\\\"tw.unshared.cache\\\":\\\"Якщо проєкт був опублікований нещодавно, це повідомлення може відображатися ще декілька хвилин.\\\",\\\"tw.unshared2.1\\\":\\\"Проєкти, що не опубліковані, більше не є доступними.\\\",\\\"tw.usernameModal.help\\\":\\\"Це значення буде зберігатися в пам'яті вашого браузера. Воно буде використовуватися, коли ви взаємодієте з проєктами, що містять хмарні змінні.\\\",\\\"tw.usernameModal.help2\\\":\\\"Значення, які не відповідають дійсному обліковому запису Scratch, зазвичай відхиляються сервером хмарних змінних. Ми рекомендуємо залишити його як є або змінити його на своє ім'я користувача в Scratch.\\\",\\\"tw.usernameModal.mustChange\\\":\\\"Вибачте, сервер хмарних змінних вважає, що ваше ім'я користувача неприйнятне, Будь-ласка змініть ім'я користувача на щось інше або на {resetIt}\\\",\\\"tw.usernameModal.mustChange.resetIt\\\":\\\"скинути його (рекомендовано)\\\",\\\"tw.usernameModal.new\\\":\\\"Нове ім'я користувача:\\\",\\\"tw.usernameModal.reset\\\":\\\"Скинути\\\",\\\"tw.usernameModal.title\\\":\\\"Змінити ім'я користувача\\\",\\\"tw.usesCloudVariables\\\":\\\"Цей проєкт використовує хмарні змінні.\\\",\\\"tw.usesCloudVariables2\\\":\\\"Хмарні змінні {APP_NAME} не під'єднані до Scratch. Будь хто може {changeTheirUsername}, тому остерігайтеся уособлення.\\\",\\\"tw.usesCloudVariables2.change\\\":\\\"змінити своє ім'я користувача\\\",\\\"tw.viewFeaturedProjects\\\":\\\"Натисніть щоб переглянути обрані проєкти.\\\",\\\"tw.viewOnScratch\\\":\\\"Переглянути проєкт на Scratch\\\"},\\\"vi\\\":{\\\"tw.alerts.creatingRestorePoint\\\":\\\"Đang tạo điiểm khôi phục\\\",\\\"tw.alerts.lostPeripheralConnection\\\":\\\"Mất kết nối từ {extensionName}\\\",\\\"tw.alerts.savedToDisk\\\":\\\"Đã lưu vời máy tính bạn.\\\",\\\"tw.backpack.rename\\\":\\\"Tên mới:\\\",\\\"tw.blocks.openDocs\\\":\\\"Mở tài liệu\\\",\\\"tw.changeUsername.cannotChangeWhileRunning\\\":\\\"Tên người dùng không thể đổi khi dự án đang chạy.\\\",\\\"tw.fps\\\":\\\"{framerate}FPS\\\",\\\"tw.gui.crashMessage.description\\\":\\\"Chúng tôi xin lỗi, nhưng hình như trang có vấn đề. Xin vui lòng tải lại trang của bạn để thử lại.\\\",\\\"tw.home.credit\\\":\\\"Ghi chú và Tín dụng\\\",\\\"tw.home.instructions\\\":\\\"Hướng đẫn\\\",\\\"tw.input.tooltip\\\":\\\"Sao chép và đán một đường dẫn dự án Scratch vào đây!\\\",\\\"tw.loader.projectData\\\":\\\"Đang tải dự án...\\\",\\\"tw.menuBar.60off\\\":\\\"Tắt chế độ 60 FPS\\\",\\\"tw.menuBar.60on\\\":\\\"Bật chế độ 60 FPS\\\",\\\"tw.menuBar.advanced\\\":\\\"Nâng cao\\\",\\\"tw.menuBar.changeUsername\\\":\\\"Đổi tên người dùng\\\",\\\"tw.menuBar.cloudOff\\\":\\\"Vô hiệu hóa biến đám mây\\\",\\\"tw.menuBar.cloudOn\\\":\\\"Kích hoạt biến đám mây\\\",\\\"tw.menuBar.cloudUnavailable\\\":\\\"Biến đám mây không có sẵn\\\",\\\"tw.menuBar.cloudUnavailableAlert\\\":\\\"Không thể dùng biến đám mây, hầu như vì bạn mở phần chỉnh sửa\\\",\\\"tw.menuBar.moreSettings\\\":\\\"Cài đặt nâng cao\\\",\\\"tw.menuBar.newFramerate\\\":\\\"Tỷ lệ mới:\\\",\\\"tw.menuBar.package\\\":\\\"Đóng gói dự án\\\",\\\"tw.menuBar.reportError2\\\":\\\"Đây là một lỗi. Xin vui lòng báo cáo.\\\",\\\"tw.menuBar.saveAs\\\":\\\"Lưu thành {file}\\\",\\\"tw.menuBar.seeInside\\\":\\\"Xem bên trong\\\",\\\"tw.oldDownload\\\":\\\"Lưu để tách tệp tin...\\\",\\\"tw.saveAs\\\":\\\"Lưu thành...\\\",\\\"tw.saveTo\\\":\\\"Lưu về {file}\\\",\\\"tw.settingsModal.customStageSize\\\":\\\"Cỡ sân khấu tùy chỉnh:\\\",\\\"tw.settingsModal.dangerZone\\\":\\\"Vùng nguy hiểm\\\",\\\"tw.settingsModal.disableCompiler\\\":\\\"Vô hiệu hóa biên dịch\\\",\\\"tw.settingsModal.featured\\\":\\\"Đặc sắc\\\",\\\"tw.settingsModal.fps\\\":\\\"60 FPS (FPS tủy chỉnh)\\\",\\\"tw.settingsModal.fpsHelp.customFramerate\\\":\\\"Bấm để dùng một tỷ lệ khung hình từ 30 hoặc 60\\\",\\\"tw.settingsModal.help\\\":\\\"Bấm để hỗ trợ\\\",\\\"tw.settingsModal.highQualityPen\\\":\\\"Bút chất lượng Cao\\\",\\\"tw.settingsModal.infiniteClones\\\":\\\"Bản sao vô hạn\\\",\\\"tw.settingsModal.infiniteClonesHelp\\\":\\\"Vô hiệu hóa giới hạn 300 bản sao của Scratch\\\",\\\"tw.settingsModal.removeLimits\\\":\\\"Xóa giới hạn\\\",\\\"tw.settingsModal.removeMiscLimits\\\":\\\"Xóa các giới hạn khác\\\",\\\"tw.settingsModal.removeMiscLimitsHelp\\\":\\\"Xóa giới hạn hiệu ứng âm thanh và cỡ bút.\\\",\\\"tw.settingsModal.storeProjectOptions\\\":\\\"Lưu trữ cài đặt trong dự án\\\",\\\"tw.settingsModal.title\\\":\\\"Cài đặt nâng cao\\\",\\\"tw.spriteSelectorItem.rename\\\":\\\"đổi tên thành\\\",\\\"tw.studioview.authorAttribution\\\":\\\"bởi {author}\\\",\\\"tw.studioview.error\\\":\\\"Hình như có một lỗi tải trang tiếp theo của dự án\\\",\\\"tw.studioview.hoverText\\\":\\\"{title} bởi {author}\\\",\\\"tw.usernameModal.mustChange.resetIt\\\":\\\"cài lại (khuyến nghị)\\\",\\\"tw.usernameModal.reset\\\":\\\"Cài đặt lại\\\",\\\"tw.usernameModal.title\\\":\\\"Đổi tên người dùng\\\",\\\"tw.viewFeaturedProjects\\\":\\\"Bấm để xem dự án đặc sắc\\\",\\\"tw.viewOnScratch\\\":\\\"Xem dự án trên Scratch\\\"},\\\"zh-cn\\\":{\\\"tw.accent.blue\\\":\\\"蓝色\\\",\\\"tw.accent.purple\\\":\\\"紫色\\\",\\\"tw.accent.rainbow\\\":\\\"彩虹色\\\",\\\"tw.accent.red\\\":\\\"红色\\\",\\\"tw.alerts.creatingRestorePoint\\\":\\\"新建还原点中...\\\",\\\"tw.alerts.lostPeripheralConnection\\\":\\\"与 {extensionName} 的连接中断了。\\\",\\\"tw.alerts.restorePointError\\\":\\\"无法创建还原点\\\",\\\"tw.alerts.restorePointSuccess\\\":\\\"可在“文件”菜单中访问还原点\\\",\\\"tw.alerts.savedToDisk\\\":\\\"已保存至您的计算机。\\\",\\\"tw.backpack.rename\\\":\\\"新名称:\\\",\\\"tw.blockColors.custom\\\":\\\"请在插件设置中自定义\\\",\\\"tw.blockColors.dark\\\":\\\"深色(测试)\\\",\\\"tw.blockColors.highContrast\\\":\\\"高对比度\\\",\\\"tw.blockColors.three\\\":\\\"原样式\\\",\\\"tw.blocks.PROCEDURES_DOCS\\\":\\\"如何使用返回值\\\",\\\"tw.blocks.PROCEDURES_RETURN\\\":\\\"返回 {v}\\\",\\\"tw.blocks.PROCEDURES_TO_REPORTER\\\":\\\"转换为返回值积木\\\",\\\"tw.blocks.PROCEDURES_TO_STATEMENT\\\":\\\"转换为命令积木\\\",\\\"tw.blocks.addons\\\":\\\"插件\\\",\\\"tw.blocks.buttonIsDown\\\":\\\"按下鼠标[MOUSE_BUTTON]键?\\\",\\\"tw.blocks.lastKeyPressed\\\":\\\"最后按下的按键\\\",\\\"tw.blocks.mouseButton.middle\\\":\\\"(1) 中键\\\",\\\"tw.blocks.mouseButton.primary\\\":\\\"(0) 左键\\\",\\\"tw.blocks.mouseButton.secondary\\\":\\\"(2) 右键\\\",\\\"tw.blocks.openDocs\\\":\\\"打开文档\\\",\\\"tw.browserModal.desktopSettings\\\":\\\"打开桌面设置\\\",\\\"tw.browserModal.desktopTitle\\\":\\\"系统不支持\\\",\\\"tw.browserModal.webgl1\\\":\\\"{APP_NAME}需要 WebGL ,但是您的电脑似乎不支持它。这通常是临时性错误,可以通过重启电脑修复\\\",\\\"tw.browserModal.webglBrowser\\\":\\\"使用最新版本的 Chrome、Firefox 或 Safari,并确保您的显卡驱动程序是最新的。您还可以尝试在浏览器设置中切换“图形加速”或“硬件加速”选项。\\\",\\\"tw.browserModal.webglDesktop\\\":\\\"您还可以尝试在桌面设置中切换“图形加速”选项:\\\",\\\"tw.cantUseCloud\\\":\\\"你创建的云变量仅在被上传到有云变量功能的网站或使用 {packager} 这样的工具转换时才生效。\\\",\\\"tw.changeUsername.cannotChangeWhileRunning\\\":\\\"作品运行时无法更改用户名。\\\",\\\"tw.clipboard.danger\\\":\\\"如果你的剪贴板包含像密码之类的内容,此作品可能会共享这些给其他用户或服务器。\\\",\\\"tw.clipboard.permission\\\":\\\"在一些浏览器上,剪贴板可能不允许被访问。如果允许,以后对剪贴板的读取将自动允许。\\\",\\\"tw.clipboard.title\\\":\\\"此作品想要获取你剪贴板的数据。\\\",\\\"tw.cloudProvider\\\":\\\"云变量服务器由 {name} 提供。\\\",\\\"tw.cloudServers\\\":\\\"选择您附近的服务器:\\\",\\\"tw.code\\\":\\\"源代码\\\",\\\"tw.confirmIncompatibleExtension\\\":\\\"此扩展与 Scratch 不兼容。用它制作的作品不能上传到 Scratch 网站。您确定要启用它吗?\\\",\\\"tw.createdBy\\\":\\\"作者:\\\",\\\"tw.customCloudServer\\\":\\\"使用自定义云变量服务器:{server}\\\",\\\"tw.customExtension.description\\\":\\\"从 URL 网址、文件或 JavaScript 源代码加载自定义扩展。\\\",\\\"tw.customExtension.name\\\":\\\"自定义扩展\\\",\\\"tw.customExtensionModal.file\\\":\\\"文件\\\",\\\"tw.customExtensionModal.load\\\":\\\"加载\\\",\\\"tw.customExtensionModal.promptFile\\\":\\\"选择或拖放扩展的JavaScript文件:\\\",\\\"tw.customExtensionModal.promptText\\\":\\\"粘贴扩展的 JavaScript 源代码:\\\",\\\"tw.customExtensionModal.promptURL\\\":\\\"输入扩展的 URL:\\\",\\\"tw.customExtensionModal.text\\\":\\\"文本\\\",\\\"tw.customExtensionModal.title\\\":\\\"加载自定义扩展\\\",\\\"tw.customExtensionModal.trusted\\\":\\\"因为此扩展来自可信任的来源,它将在非沙盒环境下运行。\\\",\\\"tw.customExtensionModal.unsandboxed\\\":\\\"在非沙盒环境下运行\\\",\\\"tw.customExtensionModal.unsandboxedWarning1\\\":\\\"在没有沙盒的情况下加载扩展是危险的,如果你不知道自己在做什么,就不应该启用它。\\\",\\\"tw.customExtensionModal.unsandboxedWarning2\\\":\\\"未被沙盒隔离的扩展可能会使你的作品报错,删除你的设置,盗取你的密码,或造成其他严重后果。{APP_NAME} 开发人员不对由此产生的任何问题负责。\\\",\\\"tw.customExtensionModal.untrusted\\\":\\\"为了保障安全,来自不可信任的 URL 网址的扩展将总是在沙盒环境下运行。\\\",\\\"tw.customReporters.description\\\":\\\"允许自制积木提供返回值。\\\",\\\"tw.customReporters.name\\\":\\\"自定义返回值\\\",\\\"tw.darkMode\\\":\\\"切换到亮色主题\\\",\\\"tw.desktopCloud\\\":\\\"在桌面版应用中,云变量只会在这台电脑上的所有桌面版应用窗口间同步。将作品上传到 Scratch 或使用类似{packager}的工具来让它们在全球范围内同步。\\\",\\\"tw.documentation\\\":\\\"文档\\\",\\\"tw.download.danger\\\":\\\"此文件尚未经由{APP_NAME}的开发者审查。\\\",\\\"tw.download.executable\\\":\\\"此文件为可执行文件,运行可能导致您的电脑受到恶意代码的损害。\\\",\\\"tw.download.file\\\":\\\"此作品想要向您的电脑上下载一个文件。该文件将会在您的下载目录中以{name}的名称被保存。\\\",\\\"tw.embed.persistent\\\":\\\"如果允许,将自动允许后续同一站点的嵌入内容。\\\",\\\"tw.embed.risks\\\":\\\"即使嵌入内容在沙盒中运行,它仍能访问像IP地址或大概位置等设备信息。\\\",\\\"tw.embed.title1\\\":\\\"此作品想要在舞台上嵌入 HTML 内容:\\\",\\\"tw.embed.title2\\\":\\\"此作品想要在舞台上嵌入在线内容:\\\",\\\"tw.extension.faceSensing.description\\\":\\\"使用摄像头侦测人脸。\\\",\\\"tw.extension.faceSensing.name\\\":\\\"人脸侦测\\\",\\\"tw.extensionGallery.error\\\":\\\"加载扩展库时出错。 访问 extensions.turbowarp.org 以查找更多扩展。\\\",\\\"tw.extensionGallery.loading\\\":\\\"正在加载扩展库……\\\",\\\"tw.extensionGallery.more\\\":\\\"要了解有关扩展的更多信息,请访问 extensions.turbowarp.org\\\",\\\"tw.extensionGallery.name\\\":\\\"{APP_NAME}扩展库\\\",\\\"tw.favorite\\\":\\\"收藏\\\",\\\"tw.featuredProjectsStudio\\\":\\\"在 Scratch 上查看工作室\\\",\\\"tw.feedback\\\":\\\"反馈与漏洞提交\\\",\\\"tw.feedbackButton\\\":\\\"{APP_NAME} 反馈\\\",\\\"tw.fetch.title\\\":\\\"此作品想要连接该网站:\\\",\\\"tw.fileInput.none\\\":\\\"未选择文件。\\\",\\\"tw.fileInput.selected\\\":\\\"选中:{names}\\\",\\\"tw.fonts.add\\\":\\\"添加\\\",\\\"tw.fonts.custom.file\\\":\\\"从你的电脑中选择一个字体文件\\\",\\\"tw.fonts.custom.name\\\":\\\"给字体命名:\\\",\\\"tw.fonts.custom1\\\":\\\"从文件添加字体\\\",\\\"tw.fonts.custom2\\\":\\\"通常在 Scratch 中不起作用。支持的格式包括:{formats}\\\",\\\"tw.fonts.delete\\\":\\\"您确定要删除“{font}”吗?所有矢量造型的该字体将使用备用字体代替。\\\",\\\"tw.fonts.fallback\\\":\\\"选择字体加载失败或被删除时的备用字体:\\\",\\\"tw.fonts.list\\\":\\\"已安装字体:\\\",\\\"tw.fonts.none\\\":\\\"尚未添加字体。\\\",\\\"tw.fonts.readError\\\":\\\"读取字体文件失败:{error}\\\",\\\"tw.fonts.system\\\":\\\"系统字体\\\",\\\"tw.fonts.system.name\\\":\\\"输入电脑中的字体名称。这个字体可能无法对所有人正确显示。\\\",\\\"tw.fonts.system1\\\":\\\"添加系统字体\\\",\\\"tw.fonts.system2\\\":\\\"也许能在 Scratch 中运行,但不一定所有人都能正确显示。\\\",\\\"tw.fonts.title\\\":\\\"字体\\\",\\\"tw.footer.credits\\\":\\\"鸣谢\\\",\\\"tw.footer.disclaimer\\\":\\\"{APP_NAME} 不属于 Scratch、Scratch 团队或 Scratch 基金会。\\\",\\\"tw.footer.documentation\\\":\\\"文档\\\",\\\"tw.footer.embed\\\":\\\"将作品嵌入到网站\\\",\\\"tw.footer.parameters\\\":\\\"网址参数\\\",\\\"tw.footer.scratchDisclaimer\\\":\\\"Scratch 是 Scratch 基金会的一个项目。它可在 {scratchDotOrg} 免费使用。\\\",\\\"tw.fps\\\":\\\"{framerate} 帧\\\",\\\"tw.geolocate.permission\\\":\\\"如果允许,浏览器可能会向您获取位置访问权限的许可。\\\",\\\"tw.geolocate.title\\\":\\\"此作品希望知道您的位置。\\\",\\\"tw.gui.crashMessage.description\\\":\\\"抱歉,页面似乎已经崩溃。请刷新页面以重试。\\\",\\\"tw.gui.defaultProjectTitle\\\":\\\"作品\\\",\\\"tw.guiDefaultTitle\\\":\\\"让 Scratch 作品快如闪电\\\",\\\"tw.home.credit\\\":\\\"备注与鸣谢\\\",\\\"tw.home.description\\\":\\\"{APP_NAME} 是一款可以将作品编译成 JavaScript,使其运行速度快如闪电的 Scratch 的修改版。不妨在上面输入一个 Scratch 官网的作品 ID 或网页链接,或者在下面选择一个特色作品。\\\",\\\"tw.home.instructions\\\":\\\"操作说明\\\",\\\"tw.input.tooltip\\\":\\\"在这里粘贴一个 Scratch 作品的链接!\\\",\\\"tw.interpolationEnabled\\\":\\\"补帧\\\",\\\"tw.invalidParameters.clones\\\":\\\"“clone” URL 参数不合法\\\",\\\"tw.invalidParameters.fps\\\":\\\"“fps” URL 参数不合法\\\",\\\"tw.invalidProject.error\\\":\\\"无法加载作品:\\\",\\\"tw.invalidProject.options\\\":\\\"你可以从自动创建的还原点或其他备份中恢复这个作品的旧版本。\\\",\\\"tw.invalidProject.reportIt\\\":\\\"上报\\\",\\\"tw.invalidProject.restorePoints\\\":\\\"查看还原点\\\",\\\"tw.invalidProject.sb3fix\\\":\\\"使用 sb3fix\\\",\\\"tw.invalidProject.title\\\":\\\"错误\\\",\\\"tw.invalidProject.validationError\\\":\\\"这个错误通常意味着作品的一小部分已损坏,但其他部分仍然正常。这很容易修复,所以请{reportIt}。\\\",\\\"tw.invalidProject.zipCorruption\\\":\\\"这个错误通常意味着文件已损坏,例如存储设备故障,电源耗尽或者热插拔 USB 存储器。为了修复这种问题,可以尝试 {usingSb3fix}\\\",\\\"tw.lightMode\\\":\\\"切换到暗色主题\\\",\\\"tw.loadExtension.embedded\\\":\\\"此作品希望通过以下代码加载一个自定义扩展:\\\",\\\"tw.loadExtension.sandboxed\\\":\\\"即使代码在沙盒中运行,它仍能访问像IP地址或大概位置等设备信息。请在继续使用扩展前确保你信任此作者。\\\",\\\"tw.loadExtension.unsandboxed\\\":\\\"在非沙盒环境下运行\\\",\\\"tw.loadExtension.unsandboxedWarning\\\":\\\"未被沙盒隔离的扩展可能会使你的作品报错,删除你的设置,盗取你的密码,或造成其他严重后果。{APP_NAME} 开发人员不对由此产生的任何问题负责。\\\",\\\"tw.loadExtension.url\\\":\\\"此作品想通过此URL网址加载一个自定义扩展:\\\",\\\"tw.loader.downloadingAssets\\\":\\\"下载素材中……(第 {complete} / {total} 个)\\\",\\\"tw.loader.loadingAssets\\\":\\\"加载素材中……(第{complete}/{total}个)\\\",\\\"tw.loader.projectData\\\":\\\"加载作品中……\\\",\\\"tw.menuBar.60off\\\":\\\"关闭 60 帧模式\\\",\\\"tw.menuBar.60on\\\":\\\"打开 60 帧模式\\\",\\\"tw.menuBar.accent\\\":\\\"主题色\\\",\\\"tw.menuBar.addons\\\":\\\"插件\\\",\\\"tw.menuBar.advanced\\\":\\\"高级\\\",\\\"tw.menuBar.blockColors\\\":\\\"积木颜色\\\",\\\"tw.menuBar.changeUsername\\\":\\\"更改用户名\\\",\\\"tw.menuBar.cloudOff\\\":\\\"禁用云变量\\\",\\\"tw.menuBar.cloudOn\\\":\\\"启用云变量\\\",\\\"tw.menuBar.cloudUnavailable\\\":\\\"云变量不可用\\\",\\\"tw.menuBar.cloudUnavailableAlert\\\":\\\"无法使用云变量,可能因为你打开了编辑器。\\\",\\\"tw.menuBar.compileError\\\":\\\"{sprite}:{error}\\\",\\\"tw.menuBar.desktopSettings\\\":\\\"桌面设置\\\",\\\"tw.menuBar.moreSettings\\\":\\\"高级设置\\\",\\\"tw.menuBar.newFramerate\\\":\\\"帧率:\\\",\\\"tw.menuBar.newWindow\\\":\\\"新窗口\\\",\\\"tw.menuBar.package\\\":\\\"打包作品\\\",\\\"tw.menuBar.reportError1\\\":\\\"一些脚本在编译时发生了错误。\\\",\\\"tw.menuBar.reportError2\\\":\\\"这是一个漏洞,请将它报告给开发团队。 \\\",\\\"tw.menuBar.restorePoints\\\":\\\"还原点\\\",\\\"tw.menuBar.saveAs\\\":\\\"另存为 {file}\\\",\\\"tw.menuBar.seeInside\\\":\\\"转到源代码\\\",\\\"tw.mono\\\":\\\"单声道\\\",\\\"tw.moreCloud\\\":\\\"了解有关云变量的更多信息\\\",\\\"tw.notify.permission\\\":\\\"如果允许,浏览器可能会提醒你启用通知,以后对通知的显示将自动允许。\\\",\\\"tw.notify.title\\\":\\\"此作品希望显示通知。\\\",\\\"tw.oldDownload\\\":\\\"保存到文件\\\",\\\"tw.opcode.2000\\\":\\\"2000年至今的天数\\\",\\\"tw.opcode.mousedown\\\":\\\"按下鼠标?\\\",\\\"tw.opcode.mousex\\\":\\\"鼠标的x坐标\\\",\\\"tw.opcode.mousey\\\":\\\"鼠标的y坐标\\\",\\\"tw.openAdvanced\\\":\\\"打开高级设置\\\",\\\"tw.openWindow.dangerous\\\":\\\"该网站未被 {APP_NAME} 开发人员审核。它可能包含危险或恶意的代码。\\\",\\\"tw.openWindow.title\\\":\\\"此作品希望通过此URL网址打开新的窗口或标签页:\\\",\\\"tw.paint.alpha\\\":\\\"不透明度\\\",\\\"tw.paint.fonts.more\\\":\\\"添加更多字体……\\\",\\\"tw.pen.stageSelected\\\":\\\"已选中舞台:仅有限画笔积木可用\\\",\\\"tw.privacy\\\":\\\"隐私政策\\\",\\\"tw.recordAudio.permission\\\":\\\"如果允许,浏览器可能会提醒你启用麦克风,以后对麦克风的访问将自动允许。\\\",\\\"tw.recordAudio.title\\\":\\\"此作品想通过你的麦克风录入音频。这可能包含转文字结果或原始音频。此作品可能会共享这些音频给其他用户或服务器。\\\",\\\"tw.recordVideo.permission\\\":\\\"如果允许,浏览器可能会提醒你启用摄像头,以后对摄像头的访问将自动允许。\\\",\\\"tw.recordVideo.title\\\":\\\"此作品想从你的摄像头录制视频。此作品可能会与其他用户或服务器共享图像。\\\",\\\"tw.redirect.dangerous\\\":\\\"该网站未被 {APP_NAME} 开发人员审核。它可能包含危险或恶意的代码。\\\",\\\"tw.redirect.title\\\":\\\"此作品想跳转至此网址:\\\",\\\"tw.removedTrademarks\\\":\\\"此处不再列出某些包含 Scratch 商标的物品。\\\",\\\"tw.restorePoints.1minute\\\":\\\"每分钟\\\",\\\"tw.restorePoints.assets\\\":\\\"{n} 个素材\\\",\\\"tw.restorePoints.confirmDelete\\\":\\\"您确定要删除\\\\\\\"{projectTitle}\\\\\\\"吗?这将无法恢复。\\\",\\\"tw.restorePoints.confirmDeleteAll\\\":\\\"您确定要删除所有还原点吗?这将无法恢复。\\\",\\\"tw.restorePoints.confirmLoad\\\":\\\"您有未保存的更改。替换现有作品?\\\",\\\"tw.restorePoints.deleteAll\\\":\\\"删除全部\\\",\\\"tw.restorePoints.description\\\":\\\"{APP_NAME} 会定期在计算机上保存还原点,以便在忘记保存时帮助恢复作品。这是恢复的最后手段。您的计算机可能会随时悄悄删除这些还原点。请勿依赖此功能。\\\",\\\"tw.restorePoints.empty\\\":\\\"未找到还原点。\\\",\\\"tw.restorePoints.error\\\":\\\"加载还原点时出错:{error}\\\",\\\"tw.restorePoints.exportError\\\":\\\"导出还原点时出错:{error}\\\",\\\"tw.restorePoints.intervalOption\\\":\\\"{time}创建还原点\\\",\\\"tw.restorePoints.loading\\\":\\\"加载中……\\\",\\\"tw.restorePoints.minutes\\\":\\\"每 {n} 分钟\\\",\\\"tw.restorePoints.never\\\":\\\"永不\\\",\\\"tw.restorePoints.off\\\":\\\"禁用还原点十分危险。\\\",\\\"tw.restorePoints.size\\\":\\\"预计占用空间: {size}\\\",\\\"tw.restorePoints.size2\\\":\\\"多个还原点使用的同一造型或声音只会被存储一次。\\\",\\\"tw.restorePoints.title\\\":\\\"还原点\\\",\\\"tw.sample\\\":\\\"示例作品\\\",\\\"tw.saveAs\\\":\\\"另存为\\\",\\\"tw.saveTo\\\":\\\"保存到 {file}\\\",\\\"tw.scratchUnsafeCloud\\\":\\\"如果你创建这个云变量,作品就会超过 Scratch 的 {number} 个变量的限制,如果你把作品上传到 Scratch,有些云变量就不能正常发挥其作用。\\\",\\\"tw.securityManager.allow\\\":\\\"允许\\\",\\\"tw.securityManager.deny\\\":\\\"拒绝\\\",\\\"tw.securityManager.title\\\":\\\"扩展安全警告\\\",\\\"tw.securityManager.trust\\\":\\\"如果允许,将自动允许后续对同一站点的请求。\\\",\\\"tw.securityManager.why\\\":\\\"这将会被用来下载图片或音频,实现多人游戏,访问API,或者用于恶意目的。这将与网站分享你的IP地址、大概位置和其它可能的数据。\\\",\\\"tw.settingsModal.customStageSize\\\":\\\"自定义舞台大小:\\\",\\\"tw.settingsModal.customStageSizeHelp\\\":\\\"改变 Scratch 的屏幕大小,原大小为 480x360。例如,将分辨率改为 640x360 可实现宽屏作品。但是只有极少作品能在修改尺寸后正常运行。\\\",\\\"tw.settingsModal.dangerZone\\\":\\\"危险功能\\\",\\\"tw.settingsModal.disableCompiler\\\":\\\"禁用编译器\\\",\\\"tw.settingsModal.disableCompilerHelp\\\":\\\"禁用 {APP_NAME} 编译器。您可能在编辑作品时希望启用此项以及时更新脚本。除此之外,您永远不应该启用此项。\\\",\\\"tw.settingsModal.featured\\\":\\\"特色\\\",\\\"tw.settingsModal.fps\\\":\\\"60 帧(自定义帧率)\\\",\\\"tw.settingsModal.fpsHelp\\\":\\\"每秒运行脚本 60 次,而不是 30 次。启用此选项后,大多数作品将无法正常工作。如果是这种情况,您应该尝试在禁用 60 帧模式的情况下使用补帧。{customFramerate}。\\\",\\\"tw.settingsModal.fpsHelp.customFramerate\\\":\\\"点击设置 30 或 60 以外的帧率\\\",\\\"tw.settingsModal.help\\\":\\\"点击查看帮助\\\",\\\"tw.settingsModal.highQualityPen\\\":\\\"高清画笔\\\",\\\"tw.settingsModal.highQualityPenHelp\\\":\\\"允许有画笔的作品以更高的分辨率渲染,并且避免编辑器中的一些坐标精度丢失。该功能可能会影响运行性能,且不是所有作品都适合该功能。\\\",\\\"tw.settingsModal.infiniteClones\\\":\\\"无限克隆\\\",\\\"tw.settingsModal.infiniteClonesHelp\\\":\\\"取消 Scratch 的 300 个克隆体限制。\\\",\\\"tw.settingsModal.interpolation\\\":\\\"补帧\\\",\\\"tw.settingsModal.interpolationHelp\\\":\\\"通过在角色的运动中插入帧使角色运动看起来更平滑。此功能不应该在 3D、光线追踪、纯画笔作品等运算量大的作品中使用,这会使它们运行得更慢而没有明显的平滑效果。\\\",\\\"tw.settingsModal.largeStageWarning\\\":\\\"我们不推荐使用自定义舞台大小!请使用具有相同长宽比的较低尺寸,并让用户开启全屏模式将其放大以匹配显示器来代替它。\\\",\\\"tw.settingsModal.removeFencing\\\":\\\"角色可穿过边缘\\\",\\\"tw.settingsModal.removeFencingHelp\\\":\\\"允许角色移到屏幕之外,根据需要变大或变小,并使触摸块在屏幕外有效。\\\",\\\"tw.settingsModal.removeLimits\\\":\\\"移除限制\\\",\\\"tw.settingsModal.removeMiscLimits\\\":\\\"移除其他限制\\\",\\\"tw.settingsModal.removeMiscLimitsHelp\\\":\\\"取消音效范围限制和画笔大小限制。\\\",\\\"tw.settingsModal.storeProjectOptions\\\":\\\"在作品中保留设置\\\",\\\"tw.settingsModal.storeProjectOptionsHelp\\\":\\\"在作品文件中储存已选择的设置,它们会在 TurboWarp 加载作品文件时自动被应用。循环计时器和不使用编译不会被保存。\\\",\\\"tw.settingsModal.title\\\":\\\"高级设置\\\",\\\"tw.settingsModal.warpTimer\\\":\\\"循环计时器\\\",\\\"tw.settingsModal.warpTimerHelp\\\":\\\"让脚本检查它们是否卡在长循环或无限循环中,并以低帧率运行,从而避免它们在循环结束前使浏览器假死。这会解决大多数崩溃,但对性能有很大负面影响,所以它只在编辑器中默认启用。\\\",\\\"tw.soundEditorNotSupported\\\":\\\"浏览器不支持声音编辑器。\\\",\\\"tw.spriteSelectorItem.rename\\\":\\\"重命名\\\",\\\"tw.stageHeader.full\\\":\\\"完整大小\\\",\\\"tw.stereo\\\":\\\"双声道\\\",\\\"tw.stereoAlert\\\":\\\"编辑立体声音频会将音频永久转换成单声道。\\\",\\\"tw.studioview.authorAttribution\\\":\\\"作者:{author}\\\",\\\"tw.studioview.error\\\":\\\"加载下一页作品出错。\\\",\\\"tw.studioview.hoverText\\\":\\\"{title} 作者:{author}\\\",\\\"tw.tooLarge\\\":\\\"这个音频文件太大了,无法上传到 Scratch。\\\",\\\"tw.twExtension.description\\\":\\\"奇怪的新积木。与 Scratch 不兼容,但可以在 Scratch 加载。\\\",\\\"tw.twExtension.name\\\":\\\"{APP_NAME}积木\\\",\\\"tw.unfavorite\\\":\\\"取消收藏\\\",\\\"tw.unknownPlatform.1\\\":\\\"该项目是为其他平台开发的:\\\",\\\"tw.unknownPlatform.2\\\":\\\"无法保证与{APP_NAME}的兼容性。您可以无视风险继续操作,但如果您遇到任何问题,我们可能无法提供帮助。\\\",\\\"tw.unknownPlatform.continue\\\":\\\"我明白了\\\",\\\"tw.unknownPlatform.title\\\":\\\"未知平台\\\",\\\"tw.unshared.2\\\":\\\"欲知更多,请见 {link}\\\",\\\"tw.unshared.bug\\\":\\\"如果该作品实际上是已发布的,请报告这个漏洞。\\\",\\\"tw.unshared.cache\\\":\\\"新作品发布的数分钟内,可能会错误地显示这个消息。\\\",\\\"tw.unshared2.1\\\":\\\"未发布的作品不可见。\\\",\\\"tw.usernameModal.help\\\":\\\"此变量将存储在浏览器中。当您与包含云变量的作品交互时,它可能会被记录。\\\",\\\"tw.usernameModal.help2\\\":\\\"与有效的 Scratch 帐户不对应的值通常会被云变量服务器拒绝。我们建议保持原样或将其更改为您的 Scratch 用户名。\\\",\\\"tw.usernameModal.mustChange\\\":\\\"抱歉,云变量服务器认为您的用户名可能不安全。请把它改成别的或 {resetIt}。\\\",\\\"tw.usernameModal.mustChange.resetIt\\\":\\\"重置(推荐)\\\",\\\"tw.usernameModal.new\\\":\\\"用户名:\\\",\\\"tw.usernameModal.reset\\\":\\\"重置\\\",\\\"tw.usernameModal.title\\\":\\\"更改用户名\\\",\\\"tw.usesCloudVariables\\\":\\\"本作品使用云变量。\\\",\\\"tw.usesCloudVariables2\\\":\\\"{APP_NAME} 的云变量与 Scratch 的云变量没有关联。任何人都可以把 {changeTheirUsername} 改成任何东西,所以请小心冒名顶替。\\\",\\\"tw.usesCloudVariables2.change\\\":\\\"自己的用户名\\\",\\\"tw.viewFeaturedProjects\\\":\\\"点击以查看特色作品。\\\",\\\"tw.viewOnScratch\\\":\\\"在 Scratch 网站上查看作品\\\"},\\\"zh-tw\\\":{\\\"tw.alerts.lostPeripheralConnection\\\":\\\"與{extensionName}的連線中斷了。\\\",\\\"tw.backpack.rename\\\":\\\"新名稱:\\\",\\\"tw.blocks.addons\\\":\\\"擴充功能\\\",\\\"tw.blocks.buttonIsDown\\\":\\\"[MOUSE_BUTTON] 被按下?\\\",\\\"tw.blocks.lastKeyPressed\\\":\\\"上一次按下的按鍵\\\",\\\"tw.blocks.mouseButton.middle\\\":\\\"(1)中鍵\\\",\\\"tw.blocks.mouseButton.primary\\\":\\\"(0)左鍵\\\",\\\"tw.blocks.mouseButton.secondary\\\":\\\"(2)右鍵\\\",\\\"tw.blocks.openDocs\\\":\\\"開啟文檔\\\",\\\"tw.browserModal.desktopSettings\\\":\\\"開啟桌面設置\\\",\\\"tw.browserModal.desktopTitle\\\":\\\"系統未被支援\\\",\\\"tw.browserModal.webgl1\\\":\\\"{APP_NAME}需要WebGL,但是你的電腦似乎不支援它。這通常是一個暫時性的錯誤,只需要重啟就可以解決。\\\",\\\"tw.browserModal.webglBrowser\\\":\\\"使用最新版本的Chrome, Firebox或者Safari, 並且確保你的圖形驅動程式是最新版本。你也可以嘗試在瀏覽器設置中開啟\\\\\\\"圖形加速\\\\\\\"或者\\\\\\\"硬體加速“。\\\",\\\"tw.browserModal.webglDesktop\\\":\\\"你也可以嘗試在桌面設置開啟\\\\\\\"圖形加速\\\\\\\"設定:\\\",\\\"tw.cantUseCloud\\\":\\\"即使你創建了雲端變量,你也需要把這個項目上傳到Scratch或者使用類似{packager}的工具轉換,才能讓它生效。\\\",\\\"tw.code\\\":\\\"原始碼\\\",\\\"tw.createdBy\\\":\\\"創建者:\\\",\\\"tw.documentation\\\":\\\"文檔\\\",\\\"tw.favorite\\\":\\\"收藏\\\",\\\"tw.featuredProjectsStudio\\\":\\\"在 Scratch 查看該創作坊\\\",\\\"tw.feedback\\\":\\\"回報建議及錯誤\\\",\\\"tw.feedbackButton\\\":\\\"{APP_NAME}反饋\\\",\\\"tw.footer.credits\\\":\\\"感謝\\\",\\\"tw.footer.documentation\\\":\\\"文檔\\\",\\\"tw.footer.embed\\\":\\\"嵌入\\\",\\\"tw.footer.parameters\\\":\\\"網址參數\\\",\\\"tw.gui.crashMessage.description\\\":\\\"我們非常抱歉,但是頁面似乎崩潰了。請刷新你的頁面試試看。\\\",\\\"tw.guiDefaultTitle\\\":\\\"使 Scratch 專案跑得更快\\\",\\\"tw.home.credit\\\":\\\"備註與謝誌\\\",\\\"tw.home.instructions\\\":\\\"操作說明\\\",\\\"tw.input.tooltip\\\":\\\"把 Scratch 專案連結貼在這裡!\\\",\\\"tw.interpolationEnabled\\\":\\\"運動補償\\\",\\\"tw.invalidParameters.clones\\\":\\\"無效的「分身」網址參數\\\",\\\"tw.invalidParameters.fps\\\":\\\"無效的「影格率」網址參數\\\",\\\"tw.invalidProject.title\\\":\\\"錯誤\\\",\\\"tw.loader.downloadingAssets\\\":\\\"下載素材中({complete}/{total})……\\\",\\\"tw.loader.loadingAssets\\\":\\\"加載資源中(第{complete} /{total}個)\\\",\\\"tw.loader.projectData\\\":\\\"載入專案中……\\\",\\\"tw.menuBar.60off\\\":\\\"關閉 60 FPS模式\\\",\\\"tw.menuBar.60on\\\":\\\"開啟 60 FPS模式\\\",\\\"tw.menuBar.addons\\\":\\\"擴充功能\\\",\\\"tw.menuBar.advanced\\\":\\\"進階\\\",\\\"tw.menuBar.changeUsername\\\":\\\"更改用戶名稱\\\",\\\"tw.menuBar.cloudOff\\\":\\\"禁用雲端變數\\\",\\\"tw.menuBar.cloudOn\\\":\\\"啟用雲端變數\\\",\\\"tw.menuBar.cloudUnavailable\\\":\\\"雲端變數不可用\\\",\\\"tw.menuBar.compileError\\\":\\\"{sprite}:{error}\\\",\\\"tw.menuBar.desktopSettings\\\":\\\"桌面設定\\\",\\\"tw.menuBar.moreSettings\\\":\\\"進階設定\\\",\\\"tw.menuBar.newWindow\\\":\\\"新窗口\\\",\\\"tw.menuBar.package\\\":\\\"打包作品\\\",\\\"tw.menuBar.reportError1\\\":\\\"有些代碼在編譯時發生了錯誤\\\",\\\"tw.menuBar.reportError2\\\":\\\"這是個錯誤,請回報。\\\",\\\"tw.menuBar.restorePoints\\\":\\\"還原點\\\",\\\"tw.menuBar.saveAs\\\":\\\"儲存為 {file}\\\",\\\"tw.menuBar.seeInside\\\":\\\"切換到程式頁面\\\",\\\"tw.mono\\\":\\\"單聲道\\\",\\\"tw.oldDownload\\\":\\\"存儲為獨立文件…\\\",\\\"tw.paint.alpha\\\":\\\"不透明度\\\",\\\"tw.paint.fonts.more\\\":\\\"增加更多字體\\\",\\\"tw.privacy\\\":\\\"隱私權政策\\\",\\\"tw.sample\\\":\\\"例子作品\\\",\\\"tw.saveAs\\\":\\\"另存為…\\\",\\\"tw.saveTo\\\":\\\"存儲為{file}\\\",\\\"tw.settingsModal.customStageSize\\\":\\\"自訂舞臺大小:\\\",\\\"tw.settingsModal.customStageSizeHelp\\\":\\\"更改 Scratch 的舞臺大小。你可以試試 640×360,比例會變成 16:9。僅有極少數的專案能在更改後正常運行。\\\",\\\"tw.settingsModal.dangerZone\\\":\\\"危險\\\",\\\"tw.settingsModal.disableCompiler\\\":\\\"停用編譯器\\\",\\\"tw.settingsModal.featured\\\":\\\"精選\\\",\\\"tw.settingsModal.fps\\\":\\\"60 FPS(自訂影格率)\\\",\\\"tw.settingsModal.fpsHelp\\\":\\\"程式運行速度從每秒 30 次改為每秒 60 次,大多數專案都會無法正常運行,你應該試試運動補償。{customFramerate}。\\\",\\\"tw.settingsModal.fpsHelp.customFramerate\\\":\\\"使用30或60以外的其他影格率\\\",\\\"tw.settingsModal.help\\\":\\\"點擊查看幫助\\\",\\\"tw.settingsModal.highQualityPen\\\":\\\"高品質畫筆\\\",\\\"tw.settingsModal.highQualityPenHelp\\\":\\\"使畫筆精度提高,並在編輯器中關閉坐標四捨五入。不是所有專案都適合,且可能影響性能。\\\",\\\"tw.settingsModal.infiniteClones\\\":\\\"無限分身\\\",\\\"tw.settingsModal.infiniteClonesHelp\\\":\\\"移除 300 分身限制。\\\",\\\"tw.settingsModal.interpolation\\\":\\\"運動補償\\\",\\\"tw.settingsModal.interpolationHelp\\\":\\\"在角色移動中進行運動補償以提升流暢度。你不該在 3D 專案、光線追蹤專案、畫筆專案或運算量大的專案啟用它,不僅效果低下,還會影響效能。\\\",\\\"tw.settingsModal.largeStageWarning\\\":\\\"不建議把舞臺調得這麼大!你應當使用同比例但較小的舞臺並讓用戶以全螢幕運行。\\\",\\\"tw.settingsModal.removeFencing\\\":\\\"移除屏障\\\",\\\"tw.settingsModal.removeLimits\\\":\\\"移除限制\\\",\\\"tw.settingsModal.removeMiscLimits\\\":\\\"移除各類限制\\\",\\\"tw.settingsModal.removeMiscLimitsHelp\\\":\\\"移除音效效果限制及畫筆大小限制。\\\",\\\"tw.settingsModal.storeProjectOptions\\\":\\\"將設定存至專案內\\\",\\\"tw.settingsModal.title\\\":\\\"進階設定\\\",\\\"tw.settingsModal.warpTimer\\\":\\\"防卡死\\\",\\\"tw.settingsModal.warpTimerHelp\\\":\\\"程式卡在迴圈裡時會以低幀率運行,以防止卡死。這可以防止崩潰,但會影響性能,僅在編輯器預設啟用。\\\",\\\"tw.spriteSelectorItem.rename\\\":\\\"重新命名\\\",\\\"tw.stereo\\\":\\\"雙聲道\\\",\\\"tw.studioview.authorAttribution\\\":\\\"作者:{author}\\\",\\\"tw.studioview.hoverText\\\":\\\"{title},作者:{author}\\\",\\\"tw.unfavorite\\\":\\\"取消搜藏\\\",\\\"tw.usernameModal.reset\\\":\\\"重設\\\",\\\"tw.usernameModal.title\\\":\\\"更改用戶名稱\\\",\\\"tw.viewFeaturedProjects\\\":\\\"瀏覽精選專案\\\",\\\"tw.viewOnScratch\\\":\\\"在 Scratch 查看該作品\\\"}}\");\n\n/***/ }),\n/* 229 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(626)(\"\")\n\n/***/ }),\n/* 230 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(457);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 231 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(468);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 232 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(476);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 233 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(483);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 234 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(485);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 235 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(491);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 236 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(492);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 237 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/679ce05ac8c35bbf83f596e895ab711b.svg\";\n\n/***/ }),\n/* 238 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(503);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 239 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(509);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 240 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(510);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 241 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+PGRlZnM+PHBhdGggZD0iTTEwIDJjNC40MTggMCA4IDMuNTgyIDggOHMtMy41ODIgOC04IDgtOC0zLjU4Mi04LTggMy41ODItOCA4LTh6bS0uMDcyIDEwLjQyYy0uMjU2IDAtLjQ3Mi4wNzYtLjY0OC4yMjctLjE3Ni4xNTEtLjI2NC4zMzgtLjI2NC41NiAwIC4yNS4wOTEuNDQ1LjI3My41ODQuMTgyLjEzOS4zOTUuMjA5LjYzOS4yMDkuMjM2IDAgLjQ0NC0uMDcuNjI0LS4yMTFzLjI3LS4zMzUuMjctLjU4MWMwLS4yMjItLjA4Ni0uNDA5LS4yNTgtLjU2LS4xNzItLjE1MS0uMzg0LS4yMjctLjYzNi0uMjI3em0uMTQ0LTYuNDJjLS42MjQgMC0xLjE3LjExMy0xLjYzOC4zMzgtLjQ2OC4yMjUtLjgyNC41MS0xLjA2OC44NTMtLjI0NC4zNDMtLjM2Ni42ODMtLjM2NiAxLjAxNyAwIC4xNjIuMDc3LjMxMy4yMzEuNDUyLjE1NC4xMzkuMzQzLjIwOS41NjcuMjA5LjM4IDAgLjYzOC0uMTk5Ljc3NC0uNTk3LjE0NC0uMzguMzItLjY2OC41MjgtLjg2NC4yMDgtLjE5Ni41MzItLjI5My45NzItLjI5My4zNzYgMCAuNjgzLjA5Ny45MjEuMjkxLjIzOC4xOTQuMzU3LjQzMi4zNTcuNzEzIDAgLjE0NC0uMDM5LjI3OC0uMTE3LjQwMi0uMDc4LjEyMy0uMTc0LjIzNS0uMjg4LjMzNi0uMTE0LjEtLjI5OS4yNDktLjU1NS40NDYtLjI5Mi4yMjUtLjUyNC40Mi0uNjk2LjU4NC0uMTcyLjE2NC0uMzEuMzU0LS40MTQuNTcxLS4xMDQuMjE3LS4xNTYuNDczLS4xNTYuNzY5IDAgLjIzNi4wNzEuNDE0LjIxMy41MzQuMTQyLjEyLjMxNy4xOC41MjUuMTguNCAwIC42MzgtLjE4My43MTQtLjU1bC4wOTktLjM2Mi4wOTMtLjIwNi4xODMtLjIyNy4zMjctLjI4OGMuNDkyLS4zODcuODMzLS42NjMgMS4wMjMtLjgyNy4xOS0uMTY0LjM1NC0uMzU4LjQ5Mi0uNTg0LjEzOC0uMjI1LjIwNy0uNDg4LjIwNy0uNzg3IDAtLjM4LS4xMjEtLjczMy0uMzYzLTEuMDU3LS4yNDItLjMyNC0uNTg1LS41OC0xLjAyOS0uNzY5LS40NDQtLjE4OC0uOTU2LS4yODMtMS41MzYtLjI4M3oiIGlkPSJhIi8+PC9kZWZzPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yIC0yKSIgZmlsbD0ibm9uZSI+PG1hc2s+PHVzZSB4bGluazpocmVmPSIjYSIvPjwvbWFzaz48dXNlIGZpbGw9IiNmZmYiIHhsaW5rOmhyZWY9IiNhIi8+PC9nPjwvc3ZnPg==\"\n\n/***/ }),\n/* 242 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(523);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 243 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDQ5LjIgKDUxMTYwKSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5OZXh0PC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGRlZnM+PC9kZWZzPgogICAgPGcgaWQ9Ik5leHQiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxwYXRoIGQ9Ik0xMC4xNTc1OTIyLDE2Ljk5NDEwMyBDOS44NDY1MDAyMSwxNi45OTQxMDMgOS41NTYxNDc2OCwxNi44NzUxOTY3IDkuMzQwNDU3MjMsMTYuNjYwODg4OSBMNC45OTg5OTU1OSwxMi4zMTk0MjcyIEM0LjY2MzAxNjIzLDExLjk2MjcwODQgNC41NzMxNDUyMSwxMS40NjIxOTU5IDQuNzU5ODAwNDEsMTEuMDMyMTk3NyBDNC45NDUwNzI5OCwxMC42MDIxOTk0IDUuMzU0MzMxNzgsMTAuMzM2NzM0MiA1LjgyODU3NDI1LDEwLjMzNjczNDIgTDcuNDc1Mjg3ODgsMTAuMzM2NzM0MiBMOC4zMTQ1NDQ5Niw0LjI5NDYzNjMzIEM4LjQzNDgzMzg2LDMuMzY5NjU2MTMgOS4yMzk1MjUxNiwyLjY2NTg5NjkgMTAuMTg2NjI3NSwyLjY2NTg5NjkgQzEwLjI2ODIwMjcsMi42NjU4OTY5IDEwLjM1MTE2MDYsMi42NzE0Mjc0MiAxMC40MzI3MzU4LDIuNjgxMTA1ODQgQzExLjI4NzIwMTgsMi44MTUyMjEwNiAxMS45NDY3MTY4LDMuNDgxNjQ5MjQgMTIuMDUwNDE0Miw0LjMwMTU0OTQ4IEwxMi45MTE3OTM0LDEwLjMzNjczNDIgTDE0LjQ4NjYxMDIsMTAuMzM2NzM0MiBDMTQuOTY2MzgzMiwxMC4zMzY3MzQyIDE1LjM5MzYxNjIsMTAuNjE4NzkxIDE1LjU3NDc0MDgsMTEuMDU0MzE5OCBDMTUuNzU1ODY1NSwxMS40OTI2MTM4IDE1LjY1NzY5ODcsMTEuOTc3OTE3MyAxNS4zMTYxODg4LDEyLjMxOTQyNzIgTDEwLjk3NDcyNzIsMTYuNjYwODg4OSBDMTAuNzU5MDM2NywxNi44NzUxOTY3IDEwLjQ2ODY4NDIsMTYuOTk0MTAzIDEwLjE1NzU5MjIsMTYuOTk0MTAzIiBpZD0iRmlsbC0xIiBmaWxsPSIjRkZGRkZGIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMC4xNjQxMDMsIDkuODMwMDAwKSByb3RhdGUoLTkwLjAwMDAwMCkgdHJhbnNsYXRlKC0xMC4xNjQxMDMsIC05LjgzMDAwMCkgIj48L3BhdGg+CiAgICA8L2c+Cjwvc3ZnPg==\"\n\n/***/ }),\n/* 244 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDQ5LjIgKDUxMTYwKSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5QcmV2aW91czwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxkZWZzPjwvZGVmcz4KICAgIDxnIGlkPSJQcmV2aW91cyIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPHBhdGggZD0iTTEwLjE1NzU5MjIsMTYuOTk0MTAzIEM5Ljg0NjUwMDIxLDE2Ljk5NDEwMyA5LjU1NjE0NzY4LDE2Ljg3NTE5NjcgOS4zNDA0NTcyMywxNi42NjA4ODg5IEw0Ljk5ODk5NTU5LDEyLjMxOTQyNzIgQzQuNjYzMDE2MjMsMTEuOTYyNzA4NCA0LjU3MzE0NTIxLDExLjQ2MjE5NTkgNC43NTk4MDA0MSwxMS4wMzIxOTc3IEM0Ljk0NTA3Mjk4LDEwLjYwMjE5OTQgNS4zNTQzMzE3OCwxMC4zMzY3MzQyIDUuODI4NTc0MjUsMTAuMzM2NzM0MiBMNy40NzUyODc4OCwxMC4zMzY3MzQyIEw4LjMxNDU0NDk2LDQuMjk0NjM2MzMgQzguNDM0ODMzODYsMy4zNjk2NTYxMyA5LjIzOTUyNTE2LDIuNjY1ODk2OSAxMC4xODY2Mjc1LDIuNjY1ODk2OSBDMTAuMjY4MjAyNywyLjY2NTg5NjkgMTAuMzUxMTYwNiwyLjY3MTQyNzQyIDEwLjQzMjczNTgsMi42ODExMDU4NCBDMTEuMjg3MjAxOCwyLjgxNTIyMTA2IDExLjk0NjcxNjgsMy40ODE2NDkyNCAxMi4wNTA0MTQyLDQuMzAxNTQ5NDggTDEyLjkxMTc5MzQsMTAuMzM2NzM0MiBMMTQuNDg2NjEwMiwxMC4zMzY3MzQyIEMxNC45NjYzODMyLDEwLjMzNjczNDIgMTUuMzkzNjE2MiwxMC42MTg3OTEgMTUuNTc0NzQwOCwxMS4wNTQzMTk4IEMxNS43NTU4NjU1LDExLjQ5MjYxMzggMTUuNjU3Njk4NywxMS45Nzc5MTczIDE1LjMxNjE4ODgsMTIuMzE5NDI3MiBMMTAuOTc0NzI3MiwxNi42NjA4ODg5IEMxMC43NTkwMzY3LDE2Ljg3NTE5NjcgMTAuNDY4Njg0MiwxNi45OTQxMDMgMTAuMTU3NTkyMiwxNi45OTQxMDMiIGlkPSJGaWxsLTEiIGZpbGw9IiNGRkZGRkYiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEwLjE2NDEwMywgOS44MzAwMDApIHJvdGF0ZSgtMjcwLjAwMDAwMCkgdHJhbnNsYXRlKC0xMC4xNjQxMDMsIC05LjgzMDAwMCkgIj48L3BhdGg+CiAgICA8L2c+Cjwvc3ZnPg==\"\n\n/***/ }),\n/* 245 */,\n/* 246 */,\n/* 247 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Symbol = __webpack_require__(248),\n getRawTag = __webpack_require__(584),\n objectToString = __webpack_require__(585);\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n\n\n/***/ }),\n/* 248 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar root = __webpack_require__(583);\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n\n\n/***/ }),\n/* 249 */,\n/* 250 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* eslint-disable vars-on-top, no-var, prefer-template */\nvar isRegExp = __webpack_require__(581);\nvar escapeRegExp = __webpack_require__(588);\nvar isString = __webpack_require__(593);\nvar flatten = __webpack_require__(594);\n\n/**\n * Given a string, replace every substring that is matched by the `match` regex\n * with the result of calling `fn` on matched substring. The result will be an\n * array with all odd indexed elements containing the replacements. The primary\n * use case is similar to using String.prototype.replace except for React.\n *\n * React will happily render an array as children of a react element, which\n * makes this approach very useful for tasks like surrounding certain text\n * within a string with react elements.\n *\n * Example:\n * matchReplace(\n * 'Emphasize all phone numbers like 884-555-4443.',\n * /([\\d|-]+)/g,\n * (number, i) => {number}\n * );\n * // => ['Emphasize all phone numbers like ', 884-555-4443, '.'\n *\n * @param {string} str\n * @param {regexp|str} match Must contain a matching group\n * @param {function} fn\n * @return {array}\n */\nfunction replaceString(str, match, fn) {\n var curCharStart = 0;\n var curCharLen = 0;\n\n if (str === '') {\n return str;\n } else if (!str || !isString(str)) {\n throw new TypeError('First argument to react-string-replace#replaceString must be a string');\n }\n\n var re = match;\n\n if (!isRegExp(re)) {\n re = new RegExp('(' + escapeRegExp(re) + ')', 'gi');\n }\n\n var result = str.split(re);\n\n // Apply fn to all odd elements\n for (var i = 1, length = result.length; i < length; i += 2) {\n curCharLen = result[i].length;\n curCharStart += result[i - 1].length;\n result[i] = fn(result[i], i, curCharStart);\n curCharStart += curCharLen;\n }\n\n return result;\n}\n\nmodule.exports = function reactStringReplace(source, match, fn) {\n if (!Array.isArray(source)) source = [source];\n\n return flatten(source.map(function(x) {\n return isString(x) ? replaceString(x, match, fn) : x;\n }));\n};\n\n\n/***/ }),\n/* 251 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(601);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 252 */,\n/* 253 */,\n/* 254 */,\n/* 255 */,\n/* 256 */,\n/* 257 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* eslint-disable import/no-commonjs */\n\nconst SansSerif = __webpack_require__(444);\nconst Serif = __webpack_require__(445);\nconst Handwriting = __webpack_require__(446);\nconst Marker = __webpack_require__(447);\nconst Curly = __webpack_require__(448);\nconst Pixel = __webpack_require__(449);\nconst Scratch = __webpack_require__(450);\nconst log = __webpack_require__(11).default;\nconst fontSource = {\n 'Sans Serif': SansSerif,\n 'Serif': Serif,\n 'Handwriting': Handwriting,\n 'Marker': Marker,\n 'Curly': Curly,\n 'Pixel': Pixel,\n 'Scratch': Scratch\n};\nconst fontData = {};\nconst fetchFonts = () => {\n const promises = [];\n for (const fontName of Object.keys(fontSource)) {\n promises.push(fetch(fontSource[fontName]).then(res => {\n if (!res.ok) {\n throw new Error(\"Cannot load font: \".concat(fontName, \" (invalid HTTP response)\"));\n }\n return res.blob();\n }).then(blob => new Promise((resolve, reject) => {\n const fr = new FileReader();\n fr.onload = () => resolve(fr.result);\n fr.onerror = () => reject(new Error(\"Cannot load font: \".concat(fontName, \" (could not read)\")));\n fr.readAsDataURL(blob);\n })).then(url => {\n fontData[fontName] = \"@font-face{font-family:\\\"\".concat(fontName, \"\\\";src:url(\\\"\").concat(url, \"\\\");}\");\n }).catch(err => {\n log.error(err);\n }));\n }\n return Promise.all(promises);\n};\nconst addFontsToDocument = () => {\n if (document.getElementById('scratch-font-styles')) {\n return;\n }\n let css = '';\n for (const fontName of Object.keys(fontSource)) {\n const fontCSS = fontData[fontName];\n if (fontCSS) {\n css += fontCSS;\n }\n }\n const documentStyleTag = document.createElement('style');\n documentStyleTag.id = 'scratch-font-styles';\n documentStyleTag.textContent = css;\n document.body.insertBefore(documentStyleTag, document.body.firstChild);\n};\nconst waitForFontsToLoad = () => {\n const promises = [];\n if (document.fonts && document.fonts.load) {\n for (const fontName in fontData) {\n promises.push(document.fonts.load(\"12px \".concat(fontName)));\n }\n }\n return Promise.all(promises);\n};\nconst loadFonts = () => fetchFonts().then(() => {\n addFontsToDocument();\n return waitForFontsToLoad();\n}).catch(err => {\n log.error(err);\n});\nconst getFonts = () => fontData;\n\n// We have to use legacy module.exports as some parts of Scratch expect require('scratch-render-font') to be a function\nmodule.exports = getFonts;\nmodule.exports.loadFonts = loadFonts;\nmodule.exports.FONTS = fontData;\n\n/***/ }),\n/* 258 */,\n/* 259 */,\n/* 260 */,\n/* 261 */,\n/* 262 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PCEtLSBodHRwczovL2ZvbnRzLmdvb2dsZS5jb20vaWNvbnM/c2VsZWN0ZWQ9TWF0ZXJpYWwrU3ltYm9scytPdXRsaW5lZDpjb21wdXRlcjpGSUxMQDA7d2dodEA0MDA7R1JBREAwO29wc3pANDggLS0+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBoZWlnaHQ9IjQ4IiB2aWV3Qm94PSIwIC05NjAgOTYwIDk2MCIgd2lkdGg9IjQ4Ij48cGF0aCBkPSJNNzAtMTIwcS0xMi43NSAwLTIxLjM3NS04LjY3NVE0MC0xMzcuMzUxIDQwLTE1MC4xNzUgNDAtMTYzIDQ4LjYyNS0xNzEuNVQ3MC0xODBoODIwcTEyLjc1IDAgMjEuMzc1IDguNjc1IDguNjI1IDguNjc2IDguNjI1IDIxLjUgMCAxMi44MjUtOC42MjUgMjEuMzI1VDg5MC0xMjBINzBabTcwLTEyMHEtMjQgMC00Mi0xOHQtMTgtNDJ2LTQ4MHEwLTI0IDE4LTQydDQyLTE4aDY4MHEyNCAwIDQyIDE4dDE4IDQydjQ4MHEwIDI0LTE4IDQydC00MiAxOEgxNDBabTAtNjBoNjgwdi00ODBIMTQwdjQ4MFptMCAwdi00ODAgNDgwWiIvPjwvc3ZnPg==\"\n\n/***/ }),\n/* 263 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PCEtLSBodHRwczovL2ZvbnRzLmdvb2dsZS5jb20vaWNvbnM/c2VsZWN0ZWQ9TWF0ZXJpYWwrU3ltYm9scytPdXRsaW5lZDpmaWxlX29wZW46RklMTEAwO3dnaHRANDAwO0dSQURAMDtvcHN6QDQ4IC0tPgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgaGVpZ2h0PSI0OCIgdmlld0JveD0iMCAtOTYwIDk2MCA5NjAiIHdpZHRoPSI0OCI+PHBhdGggZD0iTTIyMC04MHEtMjQgMC00Mi0xOHQtMTgtNDJ2LTY4MHEwLTI0IDE4LTQydDQyLTE4aDM0MGwyNDAgMjQwdjI3MGgtNjB2LTIzMEg1MjB2LTIyMEgyMjB2NjgwaDQxMHY2MEgyMjBabTY1OCAxTDc1MC0yMDd2MTI1aC02MHYtMjI4aDIyOHY2MEg3OTJsMTI4IDEyOC00MiA0M1ptLTY1OC02MXYtNjgwIDY4MFoiLz48L3N2Zz4=\"\n\n/***/ }),\n/* 264 */\n/***/ (function(module, exports) {\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n\n\n/***/ }),\n/* 265 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return dataURItoBlob; });\n/**\n * Utility to convert data URIs to blobs\n * Adapted from https://stackoverflow.com/questions/12168909/blob-from-dataurl\n * @param {string} dataURI the data uri to blobify\n * @return {Blob} a blob representing the data uri\n */\nfunction dataURItoBlob(dataURI) {\n const byteString = atob(dataURI.split(',')[1]);\n const mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];\n const arrayBuffer = new ArrayBuffer(byteString.length);\n const uintArray = new Uint8Array(arrayBuffer);\n for (let i = 0; i < byteString.length; i++) {\n uintArray[i] = byteString.charCodeAt(i);\n }\n const blob = new Blob([arrayBuffer], {\n type: mimeString\n });\n return blob;\n}\n\n/***/ }),\n/* 266 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(0);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(7);\n/* harmony import */ var redux__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(44);\n/* harmony import */ var _connected_intl_provider_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(174);\n/* harmony import */ var _addons_hooks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(53);\n/* harmony import */ var _reducers_locales__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(121);\n/* harmony import */ var _reducers_mode_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(47);\n/* harmony import */ var _turbowarp_scratch_l10n__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(67);\n/* harmony import */ var _detect_locale__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(205);\nconst _excluded = [\"isFullScreen\", \"isPlayerOnly\", \"showTelemetryModal\"];\nfunction _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\n\n\n\n\n\n\nconst composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || redux__WEBPACK_IMPORTED_MODULE_3__[/* compose */ \"d\"];\n\n/*\n * Higher Order Component to provide redux state. If an `intl` prop is provided\n * it will override the internal `intl` redux state\n * @param {React.Component} WrappedComponent - component to provide state for\n * @param {boolean} localesOnly - only provide the locale state, not everything\n * required by the GUI. Used to exclude excess state when\n only rendering modals, not the GUI.\n * @returns {React.Component} component with redux and intl state provided\n */\nconst AppStateHOC = function AppStateHOC(WrappedComponent, localesOnly) {\n class AppStateWrapper extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {\n constructor(props) {\n super(props);\n let initialState = {};\n let reducers = {};\n let enhancer;\n let initializedLocales = _reducers_locales__WEBPACK_IMPORTED_MODULE_6__[/* localesInitialState */ \"c\"];\n const locale = Object(_detect_locale__WEBPACK_IMPORTED_MODULE_9__[/* detectLocale */ \"b\"])(Object.keys(_turbowarp_scratch_l10n__WEBPACK_IMPORTED_MODULE_8__[/* default */ \"a\"]));\n if (locale !== 'en') {\n initializedLocales = Object(_reducers_locales__WEBPACK_IMPORTED_MODULE_6__[/* initLocale */ \"b\"])(initializedLocales, locale);\n }\n if (localesOnly) {\n // Used for instantiating minimal state for the unsupported\n // browser modal\n reducers = {\n locales: _reducers_locales__WEBPACK_IMPORTED_MODULE_6__[/* default */ \"a\"]\n };\n initialState = {\n locales: initializedLocales\n };\n enhancer = composeEnhancers();\n } else {\n // You are right, this is gross. But it's necessary to avoid\n // importing unneeded code that will crash unsupported browsers.\n const guiRedux = __webpack_require__(550);\n const guiReducer = guiRedux.default;\n const {\n guiInitialState,\n guiMiddleware,\n initFullScreen,\n initPlayer,\n initEmbedded,\n initTelemetryModal\n } = guiRedux;\n const {\n ScratchPaintReducer\n } = __webpack_require__(225);\n let initializedGui = guiInitialState;\n if (props.isFullScreen || props.isPlayerOnly) {\n if (props.isFullScreen) {\n initializedGui = initFullScreen(initializedGui);\n }\n if (props.isPlayerOnly) {\n initializedGui = initPlayer(initializedGui);\n }\n } else if (props.showTelemetryModal) {\n initializedGui = initTelemetryModal(initializedGui);\n }\n if (props.isEmbedded) {\n initializedGui = initEmbedded(initializedGui);\n }\n reducers = {\n locales: _reducers_locales__WEBPACK_IMPORTED_MODULE_6__[/* default */ \"a\"],\n scratchGui: guiReducer,\n scratchPaint: ScratchPaintReducer\n };\n initialState = {\n locales: initializedLocales,\n scratchGui: initializedGui\n };\n enhancer = composeEnhancers(guiMiddleware);\n }\n const reducer = Object(redux__WEBPACK_IMPORTED_MODULE_3__[/* combineReducers */ \"c\"])(reducers);\n const reducer2 = (previousState, action) => {\n const nextState = reducer(previousState, action);\n _addons_hooks__WEBPACK_IMPORTED_MODULE_5__[/* default */ \"a\"].appStateReducer(action, previousState, nextState);\n return nextState;\n };\n this.store = Object(redux__WEBPACK_IMPORTED_MODULE_3__[/* createStore */ \"e\"])(reducer2, initialState, enhancer);\n window.ReduxStore = this.store;\n _addons_hooks__WEBPACK_IMPORTED_MODULE_5__[/* default */ \"a\"].appStateStore = this.store;\n }\n componentDidUpdate(prevProps) {\n if (localesOnly) return;\n if (prevProps.isPlayerOnly !== this.props.isPlayerOnly) {\n this.store.dispatch(Object(_reducers_mode_js__WEBPACK_IMPORTED_MODULE_7__[/* setPlayer */ \"d\"])(this.props.isPlayerOnly));\n }\n if (prevProps.isFullScreen !== this.props.isFullScreen) {\n this.store.dispatch(Object(_reducers_mode_js__WEBPACK_IMPORTED_MODULE_7__[/* setFullScreen */ \"c\"])(this.props.isFullScreen));\n }\n }\n render() {\n const _this$props = this.props,\n {\n isFullScreen,\n // eslint-disable-line no-unused-vars\n isPlayerOnly,\n // eslint-disable-line no-unused-vars\n showTelemetryModal // eslint-disable-line no-unused-vars\n } = _this$props,\n componentProps = _objectWithoutProperties(_this$props, _excluded);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_redux__WEBPACK_IMPORTED_MODULE_2__[/* Provider */ \"a\"], {\n store: this.store\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_connected_intl_provider_jsx__WEBPACK_IMPORTED_MODULE_4__[/* default */ \"a\"], null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(WrappedComponent, componentProps)));\n }\n }\n AppStateWrapper.propTypes = {\n isFullScreen: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n isPlayerOnly: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n isTelemetryEnabled: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n showTelemetryModal: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n isEmbedded: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool\n };\n return AppStateWrapper;\n};\n/* harmony default export */ __webpack_exports__[\"a\"] = (AppStateHOC);\n\n/***/ }),\n/* 267 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/9c604018c786598c0f198af5e798cd16.png\";\n\n/***/ }),\n/* 268 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+PHRpdGxlPm11c2ljLWJsb2NrLWljb248L3RpdGxlPjxkZWZzPjxwYXRoIGQ9Ik0zMi4xOCAyNS44NzRDMzIuNjM2IDI4LjE1NyAzMC41MTIgMzAgMjcuNDMzIDMwYy0zLjA3IDAtNS45MjMtMS44NDMtNi4zNzItNC4xMjYtLjQ1OC0yLjI4NSAxLjY2NS00LjEzNiA0Ljc0My00LjEzNi42NDcgMCAxLjI4My4wODQgMS44OS4yMzQuMzM4LjA4Ni42MzcuMTguOTM4LjMwMi44Ny0uMDItLjEwNC0yLjI5NC0xLjgzNS0xMi4yMy0yLjEzNC0xMi4zMDIgMy4wNi0xLjg3IDguNzY4LTIuNzUyIDUuNzA4LS44ODUuMDc2IDQuODItMy42NSAzLjg0NC0zLjcyNC0uOTg3LTQuNjUtNy4xNTMuMjYzIDE0LjczOHptLTE2Ljk5OCA1Ljk5QzE1LjYzIDM0LjE0OCAxMy41MDcgMzYgMTAuNDQgMzZjLTMuMDcgMC01LjkyMi0xLjg1Mi02LjM4LTQuMTM2LS40NDgtMi4yODQgMS42NzQtNC4xMzUgNC43NS00LjEzNSAxLjAwMyAwIDEuOTc1LjE5NiAyLjg1NS41NDMuODIyLS4wNTUtLjE1LTIuMzc3LTEuODYyLTEyLjIyOC0yLjEzMy0xMi4zMDMgMy4wNi0xLjg3IDguNzY0LTIuNzUzIDUuNzA2LS44OTQuMDc2IDQuODItMy42NDggMy44MzQtMy43MjQtLjk4Ny00LjY1LTcuMTUyLjI2MiAxNC43Mzh6IiBpZD0iYSIvPjwvZGVmcz48ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjx1c2UgZmlsbD0iI0ZGRiIgeGxpbms6aHJlZj0iI2EiLz48cGF0aCBzdHJva2Utb3BhY2l0eT0iLjEiIHN0cm9rZT0iIzAwMCIgZD0iTTI4LjQ1NiAyMS42NzVjLS4wMS0uMzEyLS4wODctLjgyNS0uMjU2LTEuNzAyLS4wOTYtLjQ5NS0uNjEyLTMuMDIyLS43NTMtMy43My0uMzk1LTEuOTgtLjc2LTMuOTItMS4xNDItNi4xMTMtLjczMi00LjIyMy0uNjkzLTYuMDUuMzQ0LTYuNTI3LjUtLjIzIDEuMDYtLjA4IDEuODQuMzUuNDE0LjIyNyAyLjE4MiAxLjM2NSAyLjA3IDEuMjk2IDEuOTk0IDEuMjQyIDMuNDY0IDEuNzc0IDQuOTMgMS41NDggMS41MjYtLjIzNyAyLjUwNC0uMDYgMi44NzYuNjE4LjM0OC42MzUuMDE1IDEuNDE2LS43MyAyLjE4LTEuNDcyIDEuNTE2LTMuOTc1IDIuNTE0LTUuODQ4IDIuMDIzLS44MjItLjIyLTEuMjM4LS40NjUtMi4zOC0xLjI2N2wtLjA5NS0uMDY2Yy4wNDcuNTkzLjI2NCAxLjc0LjcxNyAzLjgwMy4yOTQgMS4zMzYgMi4wOCA5LjE4NyAyLjYzNyAxMS42NzRsLjAwMi4wMTJjLjUyOCAyLjYzNy0xLjg3MyA0LjcyNC01LjIzNiA0LjcyNC0zLjI5IDAtNi4zNjMtMS45ODgtNi44NjItNC41MjgtLjUzLTIuNjQgMS44NzMtNC43MzQgNS4yMzMtNC43MzQuNjcyIDAgMS4zNDcuMDg1IDIuMDE0LjI1LjIyNy4wNTcuNDM2LjExOC42MzYuMTg3em0tMTYuOTk2IDUuOTljLS4wMS0uMzE4LS4wOS0uODM4LS4yNjYtMS43MzctLjA5LS40Ni0uNTk1LTIuOTM3LS43NTMtMy43MjctLjM5LTEuOTYtLjc1LTMuODktMS4xMy02LjA3LS43MzItNC4yMjMtLjY5Mi02LjA1LjM0NC02LjUyNi41MDItLjIzIDEuMDYtLjA4MiAxLjg0LjM1LjQxNS4yMjcgMi4xODIgMS4zNjQgMi4wNyAxLjI5NSAxLjk5MyAxLjI0MiAzLjQ2MiAxLjc3NCA0LjkyNiAxLjU0OCAxLjUyNS0uMjQgMi41MDQtLjA2NCAyLjg3Ni42MTQuMzQ4LjYzNS4wMTUgMS40MTUtLjcyOCAyLjE4LTEuNDc0IDEuNTE3LTMuOTc3IDIuNTEzLTUuODQ3IDIuMDE3LS44Mi0uMjItMS4yMzYtLjQ2NC0yLjM3OC0xLjI2N2wtLjA5NS0uMDY1Yy4wNDcuNTkzLjI2NCAxLjc0LjcxNyAzLjgwMi4yOTQgMS4zMzcgMi4wNzggOS4xOSAyLjYzNiAxMS42NzVsLjAwMy4wMTNjLjUxNyAyLjYzOC0xLjg4NCA0LjczMi01LjIzNCA0LjczMi0zLjI4NyAwLTYuMzYtMS45OTMtNi44Ny00LjU0LS41Mi0yLjY0IDEuODg0LTQuNzMgNS4yNC00LjczLjkwNSAwIDEuODAzLjE1IDIuNjUuNDM2eiIvPjwvZz48L3N2Zz4=\"\n\n/***/ }),\n/* 269 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/8969372a821bd2a0170ed9a68a3e238d.png\";\n\n/***/ }),\n/* 270 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+cGVuLWljb248L3RpdGxlPjxnIHN0cm9rZT0iIzU3NUU3NSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik04Ljc1MyAzNC42MDJsLTQuMjUgMS43OCAxLjc4My00LjIzN2MxLjIxOC0yLjg5MiAyLjkwNy01LjQyMyA1LjAzLTcuNTM4TDMxLjA2NiA0LjkzYy44NDYtLjg0MiAyLjY1LS40MSA0LjAzMi45NjcgMS4zOCAxLjM3NSAxLjgxNiAzLjE3My45NyA0LjAxNUwxNi4zMTggMjkuNTljLTIuMTIzIDIuMTE2LTQuNjY0IDMuOC03LjU2NSA1LjAxMiIgZmlsbD0iI0ZGRiIvPjxwYXRoIGQ9Ik0yOS40MSA2LjExcy00LjQ1LTIuMzc4LTguMjAyIDUuNzcyYy0xLjczNCAzLjc2Ni00LjM1IDEuNTQ2LTQuMzUgMS41NDYiLz48cGF0aCBkPSJNMzYuNDIgOC44MjVjMCAuNDYzLS4xNC44NzMtLjQzMiAxLjE2NGwtOS4zMzUgOS4zYy4yODItLjI5LjQxLS42NjguNDEtMS4xMiAwLS44NzQtLjUwNy0xLjk2My0xLjQwNi0yLjg2OC0xLjM2Mi0xLjM1OC0zLjE0Ny0xLjgtNC4wMDItLjk5TDMwLjk5IDUuMDFjLjg0NC0uODQgMi42NS0uNDEgNC4wMzUuOTYuODk4LjkwNCAxLjM5NiAxLjk4MiAxLjM5NiAyLjg1NU0xMC41MTUgMzMuNzc0Yy0uNTczLjMwMi0xLjE1Ny41Ny0xLjc2NC44M0w0LjUgMzYuMzgybDEuNzg2LTQuMjM1Yy4yNTgtLjYwNC41My0xLjE4Ni44MzMtMS43NTcuNjkuMTgzIDEuNDQ4LjYyNSAyLjEwOCAxLjI4Mi42Ni42NTggMS4xMDIgMS40MTIgMS4yODcgMi4xMDIiIGZpbGw9IiM0Qzk3RkYiLz48cGF0aCBkPSJNMzYuNDk4IDguNzQ4YzAgLjQ2NC0uMTQuODc0LS40MzMgMS4xNjVsLTE5Ljc0MiAxOS42OGMtMi4xMyAyLjExLTQuNjczIDMuNzkzLTcuNTcyIDUuMDFMNC41IDM2LjM4bC45NzQtMi4zMTYgMS45MjUtLjgwOGMyLjg5OC0xLjIxOCA1LjQ0LTIuOSA3LjU3LTUuMDFsMTkuNzQzLTE5LjY4Yy4yOTItLjI5Mi40MzItLjcwMi40MzItMS4xNjUgMC0uNjQ2LS4yNy0xLjQtLjc4LTIuMTIyLjI1LjE3Mi41LjM3Ny43MzcuNjE0Ljg5OC45MDUgMS4zOTYgMS45ODMgMS4zOTYgMi44NTYiIGZpbGw9IiM1NzVFNzUiIG9wYWNpdHk9Ii4xNSIvPjxwYXRoIGQ9Ik0xOC40NSAxMi44M2MwIC41LS40MDQuOTA1LS45MDQuOTA1cy0uOTA1LS40MDUtLjkwNS0uOTA0YzAtLjUuNDA3LS45MDMuOTA2LS45MDMuNSAwIC45MDQuNDA0LjkwNC45MDR6IiBmaWxsPSIjNTc1RTc1Ii8+PC9nPjwvc3ZnPg==\"\n\n/***/ }),\n/* 271 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/6e51f9cfc9bfca2f4fb88d1fe1ec2615.png\";\n\n/***/ }),\n/* 272 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNDBweCIgaGVpZ2h0PSI0MHB4IiB2aWV3Qm94PSIwIDAgNDAgNDAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjIgKDY3MTQ1KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5FeHRlbnNpb25zL1NvZnR3YXJlL1ZpZGVvLVNlbnNpbmctQmxvY2s8L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZyBpZD0iRXh0ZW5zaW9ucy9Tb2Z0d2FyZS9WaWRlby1TZW5zaW5nLUJsb2NrIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2Utb3BhY2l0eT0iMC4xNSI+CiAgICAgICAgPGcgaWQ9InZpZGVvLW1vdGlvbiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC4wMDAwMDAsIDEwLjAwMDAwMCkiIGZpbGwtcnVsZT0ibm9uemVybyIgc3Ryb2tlPSIjMDAwMDAwIj4KICAgICAgICAgICAgPGNpcmNsZSBpZD0iT3ZhbC1Db3B5IiBmaWxsPSIjRkZGRkZGIiBvcGFjaXR5PSIwLjI1IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGN4PSIzMiIgY3k9IjE2IiByPSI0LjUiPjwvY2lyY2xlPgogICAgICAgICAgICA8Y2lyY2xlIGlkPSJPdmFsLUNvcHkiIGZpbGw9IiNGRkZGRkYiIG9wYWNpdHk9IjAuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjeD0iMzIiIGN5PSIxMiIgcj0iNC41Ij48L2NpcmNsZT4KICAgICAgICAgICAgPGNpcmNsZSBpZD0iT3ZhbC1Db3B5IiBmaWxsPSIjRkZGRkZGIiBvcGFjaXR5PSIwLjc1IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGN4PSIzMiIgY3k9IjgiIHI9IjQuNSI+PC9jaXJjbGU+CiAgICAgICAgICAgIDxjaXJjbGUgaWQ9Ik92YWwiIGZpbGw9IiNGRkZGRkYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgY3g9IjMyIiBjeT0iNCIgcj0iNC41Ij48L2NpcmNsZT4KICAgICAgICAgICAgPHBhdGggZD0iTTIyLjY3MTk0NzcsNC40MTk1NzY0OSBMMTYuNSw4LjQxOTkxMjk4IEwxNi41LDYuMSBDMTYuNSw0LjA4OTc2NDU0IDE0LjkzNzE4MDYsMi41IDEzLDIuNSBMNC4xLDIuNSBDMi4wNzYxNDIzNywyLjUgMC41LDQuMDc2MTQyMzcgMC41LDYuMSBMMC41LDE0IEMwLjUsMTUuOTI3Mzk4NyAyLjA4NDQ5ODM5LDE3LjUxMTg5NzEgNC4xLDE3LjYgTDEzLDE3LjYgQzE0LjkwMTY2MDIsMTcuNiAxNi41LDE1Ljk0NjU0NSAxNi41LDE0IEwxNi41LDExLjcxNjkwNDggTDIyLjc1NzI0NzksMTUuNDcxMjUzNSBMMjIuODUzNTUzNCwxNS41NDY0NDY2IEMyMi44NzM3ODg2LDE1LjU2NjY4MTggMjIuOTUxNTMxLDE1LjYgMjMsMTUuNiBDMjMuMjY2OTg2NSwxNS42IDIzLjUsMTUuMzgyNTIwNyAyMy41LDE1LjEgTDIzLjUsNC44IEMyMy41LDQuODM2NzY1MzggMjMuNDQzODA1OCw0LjcwNTY0NTYzIDIzLjM3MTI1MzUsNC41NTcyNDc4OCBDMjMuMjI1OTA1Niw0LjMxNTAwMTM5IDIyLjk0MTU5MzcsNC4yNTgxMzg5OSAyMi42NzE5NDc3LDQuNDE5NTc2NDkgWiIgaWQ9InZpZGVvXzM3XyIgZmlsbD0iIzRENEQ0RCI+PC9wYXRoPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+\"\n\n/***/ }),\n/* 273 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/6c0f71990a33b60b81aa09b5eaaa95e2.svg\";\n\n/***/ }),\n/* 274 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/e3a21b920ed4b4c2d9830ec68132c011.svg\";\n\n/***/ }),\n/* 275 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/37954fe300d44f8765b6d48b2836fcf5.png\";\n\n/***/ }),\n/* 276 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNDBweCIgaGVpZ2h0PSI0MHB4IiB2aWV3Qm94PSIwIDAgNDAgNDAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjIgKDY3MTQ1KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5FeHRlbnNpb25zL1NvZnR3YXJlL1RleHQtdG8tU3BlZWNoLUJsb2NrPC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGcgaWQ9IkV4dGVuc2lvbnMvU29mdHdhcmUvVGV4dC10by1TcGVlY2gtQmxvY2siIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZS1vcGFjaXR5PSIwLjE1Ij4KICAgICAgICA8ZyBpZD0idGV4dDJzcGVlY2giIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQuMDAwMDAwLCA0LjAwMDAwMCkiIGZpbGwtcnVsZT0ibm9uemVybyIgc3Ryb2tlPSIjMDAwMDAwIj4KICAgICAgICAgICAgPHBhdGggZD0iTTExLjUsMTcuNjY5MzQzNSBDMTEuNSwxNi42NTM5MjY5IDEwLjAwNjAxNDUsMTYuMDg0NDI3NCA5LjExMjU2MDI0LDE2Ljg4ODMgTDYuNDEyNTYwMjQsMTkuMDUwNzE0IEM1LjM5MzQ2NzU1LDE5Ljg2Njg5OTQgNC4wNzQ5NzM1MSwyMC4zMzE3NTc1IDIuNywyMC4zMzE3NTc1IEwyLjMsMjAuMzMxNzU3NSBDMS4yNjUxOTIzMywyMC4zMzE3NTc1IDAuNSwyMS4wMjEyMDAzIDAuNSwyMS45MDQwNzEgTDAuNSwyNi4xMzg3OTg2IEMwLjUsMjcuMDIxNjY5MyAxLjI2NTE5MjMzLDI3LjcxMTExMiAyLjMsMjcuNzExMTEyIEwyLjcsMjcuNzExMTEyIEM0LjE1NzU1NjgyLDI3LjcxMTExMiA1LjQ1MzcyMzIyLDI4LjEzMzUyNzEgNi41MTk3MjA5OCwyOC45OTggTDkuMTE4NDAyOTMsMzEuMTU5MzIxNiBDMTAuMDI2MTg1NSwzMS45MDkwNzkzIDExLjUsMzEuMzQ3MjY4OSAxMS41LDMwLjI4MzQyNTUgTDExLjUsMTcuNjY5MzQzNSBaIiBpZD0ic3BlYWtlciIgZmlsbD0iIzRENEQ0RCI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBkPSJNMjEuNjQzNjA2NiwxNi41IEMxOS45NzcwMDk5LDE4LjQzNzAyMzQgMTcuMTA1MDI3NSwxOS45Mjg1NzE0IDE1LjY2NjY2NjcsMTkuOTI4NTcxNCBDMTUuNTEyNjM5NywxOS45Mjg1NzE0IDE1LjMxNjYyOTIsMTkuODk1OTAzIDE1LjEwOTcyNjUsMTkuNzkyNDUxNyBDMTQuNzM3NjAzOSwxOS42MDYzOTA0IDE0LjUsMTkuMjQ5OTg0NiAxNC41LDE4Ljc2MTkwNDggQzE0LjUsMTguNjU2ODA0MSAxNC41MTcwNTU1LDE4LjU1NDUwNzYgMTQuNTQ5NDQ2NywxOC40NTQwODQ0IEMxNC42MjU3NTQ1LDE4LjIxNzUwNjMgMTUuMTczNTcyMSwxNy40Njc1MzEgMTUuMjc3MjA3MSwxNy4yODA5ODgxIEMxNS41NDYzNTI2LDE2Ljc5NjUyNjEgMTUuNzM5MDI1LDE2LjIwNjM1NjEgMTUuODQzMjg5MSwxNS40MTYwMDM0IEMxMy4xODk3MDA1LDEzLjkyNjgzNjkgMTEuNSwxMS4xMTM5NjY4IDExLjUsOCBDMTEuNSwzLjMwNTU3OTYzIDE1LjMwNTU3OTYsLTAuNSAyMCwtMC41IEwyNCwtMC41IEMyOC42OTQ0MjA0LC0wLjUgMzIuNSwzLjMwNTU3OTYzIDMyLjUsOCBDMzIuNSwxMi42OTQ0MjA0IDI4LjY5NDQyMDQsMTYuNSAyNCwxNi41IEwyMS42NDM2MDY2LDE2LjUgWiIgaWQ9InNwZWVjaCIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+\"\n\n/***/ }),\n/* 277 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/c6ab79fc9e76cb500fc83b6f1c6437d0.png\";\n\n/***/ }),\n/* 278 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/ff69eb6d9e2044232f0187954982fb3c.png\";\n\n/***/ }),\n/* 279 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/64e4a905e7c3ab32ef03272631c3df75.png\";\n\n/***/ }),\n/* 280 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MCA0MCI+PHN0eWxlPi5zdDJ7ZmlsbDpyZWR9LnN0M3tmaWxsOiNlMGUwZTB9LnN0NHtmaWxsOm5vbmU7c3Ryb2tlOiM2NjY7c3Ryb2tlLXdpZHRoOi41O3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PHBhdGggZD0iTTM1IDI4SDVhMSAxIDAgMCAxLTEtMVYxMmMwLS42LjQtMSAxLTFoMzBjLjUgMCAxIC40IDEgMXYxNWMwIC41LS41IDEtMSAxeiIgZmlsbD0iI2ZmZiIgaWQ9IkxheWVyXzYiLz48ZyBpZD0iTGF5ZXJfNCI+PHBhdGggY2xhc3M9InN0MiIgZD0iTTQgMjVoMzJ2Mi43SDR6TTEzIDI0aC0yLjJhMSAxIDAgMCAxLTEtMXYtOS43YzAtLjYuNC0xIDEtMUgxM2MuNiAwIDEgLjQgMSAxVjIzYzAgLjYtLjUgMS0xIDF6Ii8+PHBhdGggY2xhc3M9InN0MiIgZD0iTTYuMSAxOS4zdi0yLjJjMC0uNS40LTEgMS0xaDkuN2MuNSAwIDEgLjUgMSAxdjIuMmMwIC41LS41IDEtMSAxSDcuMWExIDEgMCAwIDEtMS0xeiIvPjxjaXJjbGUgY2xhc3M9InN0MiIgY3g9IjIyLjgiIGN5PSIxOC4yIiByPSIzLjQiLz48Y2lyY2xlIGNsYXNzPSJzdDIiIGN4PSIzMC42IiBjeT0iMTguMiIgcj0iMy40Ii8+PHBhdGggY2xhc3M9InN0MiIgZD0iTTQuMiAyN2gzMS45di43SDQuMnoiLz48L2c+PGcgaWQ9IkxheWVyXzUiPjxjaXJjbGUgY2xhc3M9InN0MyIgY3g9IjIyLjgiIGN5PSIxOC4yIiByPSIyLjMiLz48Y2lyY2xlIGNsYXNzPSJzdDMiIGN4PSIzMC42IiBjeT0iMTguMiIgcj0iMi4zIi8+PHBhdGggY2xhc3M9InN0MyIgZD0iTTEyLjUgMjIuOWgtMS4yYy0uMyAwLS41LS4yLS41LS41VjE0YzAtLjMuMi0uNS41LS41aDEuMmMuMyAwIC41LjIuNS41djguNGMwIC4zLS4yLjUtLjUuNXoiLz48cGF0aCBjbGFzcz0ic3QzIiBkPSJNNy4yIDE4Ljd2LTEuMmMwLS4zLjItLjUuNS0uNWg4LjRjLjMgMCAuNS4yLjUuNXYxLjJjMCAuMy0uMi41LS41LjVINy43Yy0uMyAwLS41LS4yLS41LS41ek00IDI2aDMydjJINHoiLz48L2c+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGNsYXNzPSJzdDQiIGQ9Ik0zNS4yIDI3LjlINC44YTEgMSAwIDAgMS0xLTFWMTIuMWMwLS42LjUtMSAxLTFoMzAuNWMuNSAwIDEgLjQgMSAxVjI3YTEgMSAwIDAgMS0xLjEuOXoiLz48cGF0aCBjbGFzcz0ic3Q0IiBkPSJNMzUuMiAyNy45SDQuOGExIDEgMCAwIDEtMS0xVjEyLjFjMC0uNi41LTEgMS0xaDMwLjVjLjUgMCAxIC40IDEgMVYyN2ExIDEgMCAwIDEtMS4xLjl6Ii8+PC9nPjwvc3ZnPg==\"\n\n/***/ }),\n/* 281 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/db18366b02c46fdf9033c9a4a13f911b.png\";\n\n/***/ }),\n/* 282 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/d1f14e4e1372d8f9c0908d2f45aa5b54.svg\";\n\n/***/ }),\n/* 283 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/76024aad6524bdf0e8d438f4d024e581.png\";\n\n/***/ }),\n/* 284 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/e6e16daaf665399c8826497dfb888260.svg\";\n\n/***/ }),\n/* 285 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/9d5be1463602fd5ac397d01e8a436eb2.png\";\n\n/***/ }),\n/* 286 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/831a9fd5f488f356a5031c289e4c35fe.svg\";\n\n/***/ }),\n/* 287 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/9c0ac6e5681567da6d6f6004ba107658.svg\";\n\n/***/ }),\n/* 288 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/8505df165b778979791da5caaee96fea.png\";\n\n/***/ }),\n/* 289 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/c3a88fa1746d8e5169db188302979317.svg\";\n\n/***/ }),\n/* 290 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/7bd83c9ad44bff4a20f0c19726adf8be.svg\";\n\n/***/ }),\n/* 291 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/c73619fea5bb43c53a080399a35273be.png\";\n\n/***/ }),\n/* 292 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/adc0b35e696de431abb9dd3ea90a5deb.svg\";\n\n/***/ }),\n/* 293 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/296357261fb7d74c06765aadb0ff1026.svg\";\n\n/***/ }),\n/* 294 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/cf07199bb768b01e6ac2a5c68fd8c3bb.svg\";\n\n/***/ }),\n/* 295 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/89833a109ba5105c76ee1fb007d6811b.svg\";\n\n/***/ }),\n/* 296 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\\n \\n\"\n\n/***/ }),\n/* 297 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"\"\n\n/***/ }),\n/* 298 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(451);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 299 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNDBweCIgaGVpZ2h0PSI0N3B4IiB2aWV3Qm94PSIwIDAgNDAgNDciIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDQ4LjIgKDQ3MzI3KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5SZWxvYWQ8L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZGVmcz48L2RlZnM+CiAgICA8ZyBpZD0iVjItLS1HZW5lcmFsLU9vcHMiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC02MjEuMDAwMDAwLCAtMjI0LjAwMDAwMCkiPgogICAgICAgIDxnIGlkPSJ2MS1XZWxjb21lLU1vZGFsLSIgZmlsbD0iI0ZGRkZGRiI+CiAgICAgICAgICAgIDxnIGlkPSJVbnN1cHBvcnRlZCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNDI4LjAwMDAwMCwgMjE5LjAwMDAwMCkiPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTIzMywzMS44OTY0NjgxIEMyMzMsNDIuOTM2ODgzOSAyMjQuMDM4NjI0LDUxLjg5ODI2MDMgMjEzLjAwMTc5Miw1MS44OTgyNjAzIEMyMDEuOTk3MjIyLDUxLjg5ODI2MDMgMTkzLDQyLjkzNjg4MzkgMTkzLDMxLjg5NjQ2ODEgQzE5MywyMS40Mjk1ODA0IDIwMS4xMzMzNDUsMTIuODI2NjU4OSAyMTEuMzg4NzQ1LDEyLjAwMjIxMjMgTDIxMS4zODg3NDUsNy40ODU2Nzg1NyBDMjExLjM4ODc0NSw1LjUxNDE3NTc1IDIxMy41MzU4OSw0LjMzMTI3NDA1IDIxNS4yMjA2MjksNS40MDY2MzkyMyBMMjI2Ljk3Nzk1NSwxMi45NzAwNDEgQzIyOC41MTkzMTIsMTMuOTM3ODY5NiAyMjguNTE5MzEyLDE2LjE2MDI5MSAyMjYuOTc3OTU1LDE3LjE2Mzk2NTIgTDIxNS4yMjA2MjksMjQuNjkxNTIxNCBDMjEzLjUzNTg5LDI1Ljc2Njg4NjYgMjExLjM4ODc0NSwyNC41ODM5ODQ5IDIxMS4zODg3NDUsMjIuNjEyNDgyIEwyMTEuMzg4NzQ1LDE4LjMxMTAyMTMgQzIwNC41NzQ1MTQsMTkuMDk5NjIyNSAxOTkuMjcyOTY0LDI0Ljg3MDc0ODkgMTk5LjI3Mjk2NCwzMS44OTY0NjgxIEMxOTkuMjcyOTY0LDM5LjQ5NTcxNTMgMjA1LjQzODM5MSw0NS42MjUyOTY4IDIxMy4wMDE3OTIsNDUuNjI1Mjk2OCBDMjIwLjU2MTYwOSw0NS42MjUyOTY4IDIyNi43MjcwMzYsMzkuNDk1NzE1MyAyMjYuNzI3MDM2LDMxLjg5NjQ2ODEgQzIyNi43MjcwMzYsMzAuMTc5NDY4MyAyMjguMTI4NTk2LDI4Ljc3NzkwOTEgMjI5Ljg4MTQ0MSwyOC43Nzc5MDkxIEMyMzEuNjAyMDI1LDI4Ljc3NzkwOTEgMjMzLDMwLjE3OTQ2ODMgMjMzLDMxLjg5NjQ2ODEiIGlkPSJSZWxvYWQiPjwvcGF0aD4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+\"\n\n/***/ }),\n/* 300 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return TWStateManager; });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(0);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(7);\n/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(4);\n/* harmony import */ var lodash_bindall__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash_bindall__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(13);\n/* harmony import */ var scratch_vm__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(scratch_vm__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _log__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(11);\n/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(2);\n/* harmony import */ var _reducers_tw__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(23);\n/* harmony import */ var _reducers_project_state__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(12);\n/* harmony import */ var _reducers_mode__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(47);\n/* harmony import */ var _tw_username__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(182);\n/* harmony import */ var _tw_navigation_utils__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(152);\n/* harmony import */ var _reducers_custom_stage_size__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(83);\nconst _excluded = [\"intl\", \"customStageSize\", \"isFullScreen\", \"isPlayerOnly\", \"isEmbedded\", \"projectChanged\", \"compilerOptions\", \"runtimeOptions\", \"highQualityPen\", \"framerate\", \"interpolation\", \"turbo\", \"onSetIsFullScreen\", \"onSetIsPlayerOnly\", \"onSetProjectId\", \"onSetUsername\", \"reduxProjectId\", \"routingStyle\", \"username\", \"vm\"];\nfunction _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/* eslint-disable no-alert */\n\nconst messages = Object(react_intl__WEBPACK_IMPORTED_MODULE_6__[/* defineMessages */ \"g\"])({\n invalidFPS: {\n \"id\": \"tw.invalidParameters.fps\",\n \"defaultMessage\": \"\\\"fps\\\" URL parameter is invalid\"\n },\n invalidClones: {\n \"id\": \"tw.invalidParameters.clones\",\n \"defaultMessage\": \"\\\"clone\\\" URL parameter is invalid\"\n }\n});\nconst USERNAME_KEY = 'tw:username';\n\n/**\n * The State Manager is responsible for managing persistent state and the URL.\n */\n\nconst setLocalStorage = (key, value) => {\n try {\n localStorage.setItem(key, value);\n } catch (e) {\n // ignore\n }\n};\nconst getLocalStorage = key => {\n try {\n return localStorage.getItem(key);\n } catch (e) {\n // ignore\n }\n return null;\n};\nconst readHashProjectId = () => {\n const match = location.hash.match(/#(\\d+)/);\n return match === null ? null : match[1];\n};\nclass Router {\n constructor(_ref) {\n let {\n onSetProjectId,\n onSetIsPlayerOnly,\n onSetIsFullScreen\n } = _ref;\n this.onSetProjectId = onSetProjectId;\n this.onSetIsPlayerOnly = onSetIsPlayerOnly;\n this.onSetIsFullScreen = onSetIsFullScreen;\n }\n onhashchange() {}\n onpathchange() {}\n generateURL() {\n return '';\n }\n}\nclass HashRouter extends Router {\n onhashchange() {\n this.onSetProjectId(readHashProjectId() || _reducers_project_state__WEBPACK_IMPORTED_MODULE_8__[/* defaultProjectId */ \"e\"]);\n }\n generateURL(_ref2) {\n let {\n projectId\n } = _ref2;\n const hashQuery = location.hash.split('?')[1];\n return \"\".concat(location.pathname).concat(location.search, \"#\").concat(projectId).concat(hashQuery ? \"?\".concat(hashQuery) : '');\n }\n}\nclass FileHashRouter extends HashRouter {\n constructor(callbacks) {\n super(callbacks);\n this.playerPath = location.pathname.substring(0, location.pathname.lastIndexOf('/') + 1);\n this.editorPath = \"\".concat(this.playerPath, \"editor.html\");\n this.fullscreenPath = \"\".concat(this.playerPath, \"fullscreen.html\");\n }\n onpathchange() {\n const pathName = location.pathname;\n if (pathName === this.playerPath) {\n this.onSetIsPlayerOnly(true);\n this.onSetIsFullScreen(false);\n } else if (pathName === this.editorPath) {\n this.onSetIsPlayerOnly(false);\n this.onSetIsFullScreen(false);\n } else if (pathName === this.fullscreenPath) {\n this.onSetIsFullScreen(true);\n }\n }\n generateURL(_ref3) {\n let {\n projectId,\n isPlayerOnly,\n isFullScreen\n } = _ref3;\n let newPathname = '';\n let newHash = '';\n if (projectId !== '0') {\n newHash = projectId;\n }\n const hashQuery = location.hash.split('?')[1];\n if (hashQuery) {\n newHash += \"?\".concat(hashQuery);\n }\n if (isFullScreen) {\n newPathname = this.fullscreenPath;\n } else if (isPlayerOnly) {\n newPathname = this.playerPath;\n } else {\n newPathname = this.editorPath;\n }\n return \"\".concat(newPathname).concat(location.search).concat(newHash ? \"#\".concat(newHash) : '');\n }\n}\nconst getCanonicalLinkElement = () => {\n let el = document.querySelector('link[rel=canonical]');\n if (!el) {\n el = document.createElement('link');\n el.rel = 'canonical';\n document.head.appendChild(el);\n }\n return el;\n};\nclass WildcardRouter extends Router {\n constructor(callbacks) {\n super(callbacks);\n this.root = \"\";\n }\n onhashchange() {\n const hashProjectId = readHashProjectId();\n if (hashProjectId) {\n const ok = this.onSetProjectId(hashProjectId);\n if (ok) {\n // Completely remove the hash\n history.replaceState(null, null, \"\".concat(location.pathname).concat(location.search));\n }\n } else {\n // Do not detect page type here as it is already setup by index.html, editor.html, etc.\n this.parseURL(false);\n }\n }\n onpathchange() {\n this.parseURL(true);\n }\n parseURL(detectPageType) {\n const path = location.pathname.substr(this.root.length);\n const parts = path.split('/');\n const parseProjectId = id => {\n if (id) {\n this.onSetProjectId(id);\n } else {\n this.onSetProjectId(_reducers_project_state__WEBPACK_IMPORTED_MODULE_8__[/* defaultProjectId */ \"e\"]);\n }\n };\n const parsePageType = type => {\n if (!detectPageType) {\n return;\n }\n if (type === 'fullscreen') {\n this.onSetIsFullScreen(true);\n } else if (type === 'editor') {\n this.onSetIsPlayerOnly(false);\n this.onSetIsFullScreen(false);\n } else {\n this.onSetIsPlayerOnly(true);\n this.onSetIsFullScreen(false);\n }\n };\n if (+parts[0] && Number.isFinite(+parts[0])) {\n parseProjectId(parts[0]);\n parsePageType(parts[1]);\n } else {\n this.onSetProjectId(_reducers_project_state__WEBPACK_IMPORTED_MODULE_8__[/* defaultProjectId */ \"e\"]);\n parsePageType(parts[0]);\n }\n }\n generateURL(_ref4) {\n let {\n projectId,\n isPlayerOnly,\n isFullScreen\n } = _ref4;\n const parts = [];\n if (projectId !== '0') {\n parts.push(projectId);\n }\n if (isFullScreen) {\n parts.push('fullscreen');\n } else if (!isPlayerOnly) {\n parts.push('editor');\n }\n const path = \"\".concat(this.root).concat(parts.join('/'));\n const canonical = \"\".concat(location.origin).concat(this.root).concat(projectId === '0' ? '' : projectId);\n getCanonicalLinkElement().href = canonical;\n return \"\".concat(path).concat(location.search).concat(location.hash);\n }\n}\nconst routers = {\n none: Router,\n hash: HashRouter,\n filehash: FileHashRouter,\n wildcard: WildcardRouter\n};\n\n/**\n * Return the optimal Router for the current environment\n * @param {string} style Routing style name\n * @param {*} callbacks Redux callbacks\n * @returns {Router} The optimal router for the current environment\n */\nconst createRouter = (style, callbacks) => {\n const supportedStyles = ['none', 'hash'];\n\n // FileHashRouter is not supported on non-http(s) protocols.\n const isHTTP = location.protocol === 'http:' || location.protocol === 'https:';\n if (isHTTP) {\n supportedStyles.push('filehash');\n }\n\n // WildcardRouter is not supported if ROOT is not set.\n if (false) {}\n if (!supportedStyles.includes(style)) {\n _log__WEBPACK_IMPORTED_MODULE_5__[\"default\"].warn(\"routing style is unknown or not supported: \".concat(style, \", falling back to hash\"));\n style = 'hash';\n }\n if (Object.prototype.hasOwnProperty.call(routers, style)) {\n return new routers[style](callbacks);\n }\n throw new Error(\"unknown router: \".concat(style));\n};\nconst TWStateManager = function TWStateManager(WrappedComponent) {\n class StateManagerComponent extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall__WEBPACK_IMPORTED_MODULE_3___default()(this, ['handleHashChange', 'handlePopState', 'onSetProjectId', 'onSetIsPlayerOnly', 'onSetIsFullScreen']);\n }\n componentDidMount() {\n const urlParams = new URLSearchParams(location.search);\n if (urlParams.has('fps')) {\n const fps = +urlParams.get('fps');\n if (Number.isNaN(fps) || fps < 0) {\n alert(this.props.intl.formatMessage(messages.invalidFPS));\n } else {\n this.props.vm.setFramerate(fps);\n }\n } else if (urlParams.has('60fps')) {\n this.props.vm.setFramerate(60);\n }\n if (urlParams.has('interpolate')) {\n this.props.vm.setInterpolation(true);\n }\n if (urlParams.has('username')) {\n const username = urlParams.get('username');\n // Do not save username when loaded from URL\n this.doNotPersistUsername = username;\n this.props.onSetUsername(username);\n } else {\n const persistentUsername = this.props.isEmbedded ? null : getLocalStorage(USERNAME_KEY);\n if (persistentUsername === null) {\n const randomUsername = Object(_tw_username__WEBPACK_IMPORTED_MODULE_10__[/* generateRandomUsername */ \"a\"])();\n this.props.onSetUsername(randomUsername);\n if (this.props.isEmbedded) {\n this.doNotPersistUsername = randomUsername;\n }\n } else {\n this.props.onSetUsername(persistentUsername);\n }\n }\n if (urlParams.has('hqpen')) {\n this.props.vm.renderer.setUseHighQualityRender(true);\n }\n if (urlParams.has('turbo')) {\n this.props.vm.setTurboMode(true);\n }\n if (urlParams.has('stuck') || urlParams.has('warp_timer')) {\n this.props.vm.setCompilerOptions({\n warpTimer: true\n });\n }\n if (urlParams.has('nocompile')) {\n this.props.vm.setCompilerOptions({\n enabled: false\n });\n }\n if (urlParams.has('clones')) {\n const clones = +urlParams.get('clones');\n if (Number.isNaN(clones) || clones < 0) {\n alert(this.props.intl.formatMessage(messages.invalidClones));\n } else {\n this.props.vm.setRuntimeOptions({\n maxClones: clones\n });\n }\n }\n if (urlParams.has('offscreen')) {\n this.props.vm.setRuntimeOptions({\n fencing: false\n });\n }\n if (urlParams.has('limitless')) {\n this.props.vm.setRuntimeOptions({\n miscLimits: false\n });\n }\n for (const extension of urlParams.getAll('extension')) {\n this.props.vm.extensionManager.loadExtensionURL(extension);\n }\n const routerCallbacks = {\n onSetProjectId: this.onSetProjectId,\n onSetIsPlayerOnly: this.onSetIsPlayerOnly,\n onSetIsFullScreen: this.onSetIsFullScreen\n };\n this.router = createRouter(this.props.routingStyle, routerCallbacks);\n this.router.onhashchange();\n window.addEventListener('hashchange', this.handleHashChange);\n window.addEventListener('popstate', this.handlePopState);\n }\n componentDidUpdate(prevProps) {\n if (this.props.username !== prevProps.username && this.props.username !== this.doNotPersistUsername) {\n // TODO: this always restores the current username once at startup, which is unnecessary\n setLocalStorage(USERNAME_KEY, this.props.username);\n }\n if (this.props.reduxProjectId !== prevProps.reduxProjectId || this.props.isPlayerOnly !== prevProps.isPlayerOnly || this.props.isFullScreen !== prevProps.isFullScreen) {\n const oldPath = \"\".concat(location.pathname).concat(location.search).concat(location.hash);\n const routerState = {\n projectId: this.props.reduxProjectId,\n isPlayerOnly: this.props.isPlayerOnly,\n isFullScreen: this.props.isFullScreen\n };\n const newPath = this.router.generateURL(routerState);\n if (newPath && newPath !== oldPath) {\n history.pushState(null, null, newPath);\n }\n }\n if (this.props.customStageSize !== prevProps.customStageSize || this.props.runtimeOptions !== prevProps.runtimeOptions || this.props.compilerOptions !== prevProps.compilerOptions || this.props.highQualityPen !== prevProps.highQualityPen || this.props.framerate !== prevProps.framerate || this.props.interpolation !== prevProps.interpolation || this.props.turbo !== prevProps.turbo) {\n const searchParams = new URLSearchParams(location.search);\n const runtimeOptions = this.props.runtimeOptions;\n const compilerOptions = this.props.compilerOptions;\n\n // Always remove legacy parameter\n searchParams.delete('60fps');\n const {\n width,\n height\n } = this.props.customStageSize;\n if (width === _reducers_custom_stage_size__WEBPACK_IMPORTED_MODULE_12__[/* defaultStageSize */ \"c\"].width && height === _reducers_custom_stage_size__WEBPACK_IMPORTED_MODULE_12__[/* defaultStageSize */ \"c\"].height) {\n searchParams.delete('size');\n } else {\n searchParams.set('size', \"\".concat(width, \"x\").concat(height));\n }\n if (this.props.framerate === 30) {\n searchParams.delete('fps');\n } else {\n searchParams.set('fps', this.props.framerate);\n }\n if (this.props.interpolation) {\n searchParams.set('interpolate', '');\n } else {\n searchParams.delete('interpolate');\n }\n if (this.props.turbo) {\n searchParams.set('turbo', '');\n } else {\n searchParams.delete('turbo');\n }\n if (this.props.highQualityPen) {\n searchParams.set('hqpen', '');\n } else {\n searchParams.delete('hqpen');\n }\n if (compilerOptions.enabled) {\n searchParams.delete('nocompile');\n }\n if (this.props.isPlayerOnly) {\n if (compilerOptions.warpTimer) {\n searchParams.set('stuck', '');\n } else {\n searchParams.delete('stuck');\n }\n } else {\n // Leave ?stuck as-is when in editor\n }\n if (runtimeOptions.maxClones === 300) {\n searchParams.delete('clones');\n } else {\n searchParams.set('clones', runtimeOptions.maxClones);\n }\n if (runtimeOptions.fencing) {\n searchParams.delete('offscreen');\n } else {\n searchParams.set('offscreen', '');\n }\n if (runtimeOptions.miscLimits) {\n searchParams.delete('limitless');\n } else {\n searchParams.set('limitless', '');\n }\n Object(_tw_navigation_utils__WEBPACK_IMPORTED_MODULE_11__[/* setSearchParams */ \"b\"])(searchParams);\n }\n }\n componentWillUnmount() {\n window.removeEventListener('hashchange', this.handleHashChange);\n window.removeEventListener('popstate', this.handlePopState);\n }\n handleHashChange() {\n this.router.onhashchange();\n }\n handlePopState() {\n this.router.onpathchange();\n }\n onSetProjectId(id) {\n if (\"\".concat(id) === \"\".concat(this.props.reduxProjectId)) {\n return true;\n }\n if (this.props.projectChanged) {\n if (!confirm('Are you sure you want to switch project?')) {\n return false;\n }\n }\n this.props.onSetProjectId(id);\n return true;\n }\n onSetIsPlayerOnly(isPlayerOnly) {\n this.props.onSetIsPlayerOnly(isPlayerOnly);\n }\n onSetIsFullScreen(isFullScreen) {\n this.props.onSetIsFullScreen(isFullScreen);\n }\n render() {\n const _this$props = this.props,\n {\n /* eslint-disable no-unused-vars */\n intl,\n customStageSize,\n isFullScreen,\n isPlayerOnly,\n isEmbedded,\n projectChanged,\n compilerOptions,\n runtimeOptions,\n highQualityPen,\n framerate,\n interpolation,\n turbo,\n onSetIsFullScreen,\n onSetIsPlayerOnly,\n onSetProjectId,\n onSetUsername,\n reduxProjectId,\n routingStyle,\n username,\n vm\n /* eslint-enable no-unused-vars */\n } = _this$props,\n props = _objectWithoutProperties(_this$props, _excluded);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(WrappedComponent, props);\n }\n }\n StateManagerComponent.propTypes = {\n intl: react_intl__WEBPACK_IMPORTED_MODULE_6__[/* intlShape */ \"i\"],\n customStageSize: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({\n width: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n height: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number\n }),\n isFullScreen: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n isPlayerOnly: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n isEmbedded: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n projectChanged: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n projectId: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n compilerOptions: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({\n enabled: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n warpTimer: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool\n }),\n runtimeOptions: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape({\n miscLimits: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n fencing: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n maxClones: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number\n }),\n highQualityPen: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n framerate: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,\n interpolation: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n turbo: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,\n onSetIsFullScreen: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n onSetIsPlayerOnly: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n onSetProjectId: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n onSetUsername: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,\n reduxProjectId: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number]),\n routingStyle: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOf(Object.keys(routers)),\n username: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,\n vm: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.instanceOf(scratch_vm__WEBPACK_IMPORTED_MODULE_4___default.a)\n };\n StateManagerComponent.defaultProps = {\n routingStyle: \"filehash\"\n };\n const mapStateToProps = state => ({\n customStageSize: state.scratchGui.customStageSize,\n isFullScreen: state.scratchGui.mode.isFullScreen,\n isPlayerOnly: state.scratchGui.mode.isPlayerOnly,\n isEmbedded: state.scratchGui.mode.isEmbedded,\n projectChanged: state.scratchGui.projectChanged,\n reduxProjectId: state.scratchGui.projectState.projectId,\n compilerOptions: state.scratchGui.tw.compilerOptions,\n runtimeOptions: state.scratchGui.tw.runtimeOptions,\n highQualityPen: state.scratchGui.tw.highQualityPen,\n framerate: state.scratchGui.tw.framerate,\n interpolation: state.scratchGui.tw.interpolation,\n turbo: state.scratchGui.vmStatus.turbo,\n username: state.scratchGui.tw.username,\n vm: state.scratchGui.vm\n });\n const mapDispatchToProps = dispatch => ({\n onSetIsFullScreen: isFullScreen => dispatch(Object(_reducers_mode__WEBPACK_IMPORTED_MODULE_9__[/* setFullScreen */ \"c\"])(isFullScreen)),\n onSetIsPlayerOnly: isPlayerOnly => dispatch(Object(_reducers_mode__WEBPACK_IMPORTED_MODULE_9__[/* setPlayer */ \"d\"])(isPlayerOnly)),\n onSetProjectId: projectId => dispatch(Object(_reducers_project_state__WEBPACK_IMPORTED_MODULE_8__[/* setProjectId */ \"E\"])(projectId)),\n onSetUsername: username => dispatch(Object(_reducers_tw__WEBPACK_IMPORTED_MODULE_7__[/* setUsername */ \"s\"])(username))\n });\n return Object(react_intl__WEBPACK_IMPORTED_MODULE_6__[/* injectIntl */ \"h\"])(Object(react_redux__WEBPACK_IMPORTED_MODULE_2__[/* connect */ \"b\"])(mapStateToProps, mapDispatchToProps)(StateManagerComponent));\n};\n\n\n/***/ }),\n/* 301 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUxLjMgKDU3NTQ0KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5JY29uPC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGRlZnM+CiAgICAgICAgPHBhdGggZD0iTTE1LjQ2NDkzNSwxNS40NjcyOTcgQzE0Ljc2NDQwNTksMTYuMTc3NzcwNSAxMy42MTg1ODc3LDE2LjE3Nzc3MDUgMTIuOTA4MTE0MiwxNS40NjcyOTcgTDkuOTk4ODE4OTksMTIuNTU4MDAxOCBMNy4wODg0MTg4NSwxNS40NjcyOTcgQzYuMzgyMzY1MDYsMTYuMTczMzUwOCA1LjIzNzY1MTg3LDE2LjE3MzM1MDggNC41MzE1OTgwNywxNS40NjcyOTcgQzQuMTc5MTIzNjQsMTUuMTE0ODIyNiA0LjAwMDEyNDA5LDE0LjY0ODUzOTggNC4wMDAxMjQwOSwxNC4xODg4ODY2IEM0LjAwMDEyNDA5LDEzLjcyODEyODUgNC4xNzkxMjM2NCwxMy4yNjI5NTA2IDQuNTMxNTk4MDcsMTIuOTEwNDc2MiBMNy40NDA4OTMyOCwxMC4wMDExODEgTDQuNTI3MTc4MzMsNy4wODYzNjExMiBDNC4xNzM1OTg5Nyw2LjczMjc4MTc2IDMuOTk0NTk5NDEsNi4yNjc2MDM5MSA0LjAwMDEyNDA5LDUuODAyNDI2MDYgQzQuMDAwMTI0MDksNS4zNDE2Njc5NSA0LjE3MzU5ODk3LDQuODgyMDE0NzcgNC41MjcxNzgzMyw0LjUyOTU0MDM0IEM1LjIzMjEyNzE5LDMuODIzNDg2NTUgNi4zNzY4NDAzOCwzLjgyMzQ4NjU1IDcuMDgzOTk5MTEsNC41Mjk1NDAzNCBMOS45OTg4MTg5OSw3LjQ0MzI1NTI5IEwxMi45MTI1MzM5LDQuNTI5NTQwMzQgQzEzLjYxODU4NzcsMy44MjM0ODY1NSAxNC43NjQ0MDU5LDMuODIzNDg2NTUgMTUuNDcwNDU5Nyw0LjUyOTU0MDM0IEMxNi4xNzY1MTM0LDUuMjM0NDg5MiAxNi4xNzY1MTM0LDYuMzgwMzA3MzMgMTUuNDcwNDU5Nyw3LjA4NjM2MTEyIEwxMi41NTQ1MzQ4LDEwLjAwMTE4MSBMMTUuNDcwNDU5NywxMi45MTQ4OTYgQzE2LjE3NjUxMzQsMTMuNjIwOTQ5NyAxNi4xNzY1MTM0LDE0Ljc1NTcxODUgMTUuNDY0OTM1LDE1LjQ2NzI5NyIgaWQ9InBhdGgtMSI+PC9wYXRoPgogICAgPC9kZWZzPgogICAgPGcgaWQ9Ikljb24iIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJFeHRlbnNpb25zL0Nvbm5lY3Rpb24vQ2xvc2UiPgogICAgICAgICAgICA8bWFzayBpZD0ibWFzay0yIiBmaWxsPSJ3aGl0ZSI+CiAgICAgICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNwYXRoLTEiPjwvdXNlPgogICAgICAgICAgICA8L21hc2s+CiAgICAgICAgICAgIDx1c2UgaWQ9ImNsb3NlIiBmaWxsPSIjRkZGRkZGIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHhsaW5rOmhyZWY9IiNwYXRoLTEiPjwvdXNlPgogICAgICAgICAgICA8ZyBpZD0iQ29sb3IvVGFuZ2VyaW5lLzFfVGFuZ2VyaW5lIiBtYXNrPSJ1cmwoI21hc2stMikiIGZpbGw9IiNGRjhDMUEiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iQ29sb3IiIHg9IjAiIHk9IjAiIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCI+PC9yZWN0PgogICAgICAgICAgICA8L2c+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4=\"\n\n/***/ }),\n/* 302 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUwLjIgKDU1MDQ3KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5oZWxwPC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGRlZnM+PC9kZWZzPgogICAgPGcgaWQ9ImhlbHAiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxwYXRoIGQ9Ik05Ljk5OTA1NDQ5LDE4IEM1LjU4MTYwOTc0LDE4IDIsMTQuNDE3MzQ2MSAyLDEwLjAwMDk0NTMgQzIsNS41ODI2NTM5MSA1LjU4MTYwOTc0LDIgOS45OTkwNTQ0OSwyIEMxNC40MTgzOTAzLDIgMTgsNS41ODI2NTM5MSAxOCwxMC4wMDA5NDUzIEMxOCwxNC40MTczNDYxIDE0LjQxODM5MDMsMTggOS45OTkwNTQ0OSwxOCBaIE05Ljg1MzI1NjEyLDEyLjM2MTUyNjYgQzkuMjY4OTI4MDIsMTIuMzYxNTI2NiA4LjgwNTYyNTgxLDEyLjgzNjA2MjkgOC44MDU2MjU4MSwxMy40MjIxNDM0IEM4LjgwNTYyNTgxLDEzLjk5MzA5OTQgOS4yNjg5MjgwMiwxNC40Njc2MzU2IDkuODUzMjU2MTIsMTQuNDY3NjM1NiBDMTAuNDM5NDc1MiwxNC40Njc2MzU2IDEwLjkxNDEyMzYsMTMuOTkzMDk5NCAxMC45MTQxMjM2LDEzLjQyMjE0MzQgQzEwLjkxNDEyMzYsMTIuODM2MDYyOSAxMC40Mzk0NzUyLDEyLjM2MTUyNjYgOS44NTMyNTYxMiwxMi4zNjE1MjY2IFogTTkuNDYxODEzMDIsMTEuNjQzMTA1MyBMMTAuMTU5NjAyOSwxMS42NDMxMDUzIEMxMC4zNDg3MDU4LDExLjY0MzEwNTMgMTAuNTI0NTcxNiwxMS41MjM5OTg2IDEwLjU2OTk1NjMsMTEuMzQwNjEyMSBDMTAuNjU4ODM0NywxMC45NzAwNTc5IDEwLjkxNDEyMzYsMTAuNzE2NzE5OCAxMS4yNTQ1MDg5LDEwLjQ2MTQ5MTIgTDExLjcxNTkyMDEsMTAuMTIxMTg2MyBDMTIuNDQ1ODU3NSw5LjU3MjkxNzQxIDEyLjg5NzgxMzUsOC45MDU1NDE3NyAxMi44OTc4MTM1LDcuOTMwMDAxMTggQzEyLjg5NzgxMzUsNi43MTQzNTY2MSAxMS45MTA2OTYxLDUuNTMyNzQyNTMgOS45MzgzNTI0NCw1LjUzMjc0MjUzIEM4LjE2MDc4NDc4LDUuNTMyNzQyNTMgNy4xMDE4MDgzLDYuNzM3MDQzNiA3LjEwMTgwODMsOC4xNjA2NTIyNSBDNy4xMDE4MDgzLDguMTk4NDYzOSA3LjEwMzY5OTMzLDguMjM2Mjc1NTUgNy4xMDM2OTkzMyw4LjI3NTk3Nzc5IEM3LjExMzE1NDQ3LDguNDk3MTc1OTQgNy4yODkwMjAyMSw4LjY3ODY3MTg3IDcuNTEwMjcwNjUsOC42ODYyMzQyIEw4LjM4MzkyNjI1LDguNzE2NDgzNTIgQzguNjI0MDg2OTksOC43MjU5MzY0MyA4LjgxODg2MzAyLDguNTMzMDk3MDEgOC44MTg4NjMwMiw4LjI5Mjk5MzAzIEw4LjgxODg2MzAyLDguMjgzNTQwMTIgQzguODE4ODYzMDIsNy43MTI1ODQxOSA5LjIzMjk5ODQ2LDcuMTM5NzM3NjggOS45MzgzNTI0NCw3LjEzOTczNzY4IEMxMC42NzAxODA4LDcuMTM5NzM3NjggMTEuMDIxOTEyMyw3LjYwMTAzOTgyIDExLjAyMTkxMjMsOC4wNzU1NzYwNCBDMTEuMDIxOTEyMyw4LjM5MzE5MzkgMTAuOTE0MTIzNiw4LjY4NjIzNDIgMTAuNTg1MDg0NSw4LjkzMDExOTM0IEw5Ljk2NDgyNjg1LDkuMzkzMzEyMDYgQzkuMjY4OTI4MDIsOS45MTUxMTI4NCA5LjAzNjMzMTQsMTAuNTM1MjIzOSA5LjAzNjMzMTQsMTEuMTA4MDcwNCBDOS4wMzYzMzE0LDExLjE1MTU1MzggOS4wMzgyMjI0MywxMS4xOTUwMzcyIDkuMDM4MjIyNDMsMTEuMjM0NzM5NSBDOS4wNDU3ODY1NSwxMS40NjM0OTk5IDkuMjMyOTk4NDYsMTEuNjQzMTA1MyA5LjQ2MTgxMzAyLDExLjY0MzEwNTMgWiIgaWQ9ImhlbHAtaWNvbiIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPgogICAgPC9nPgo8L3N2Zz4=\"\n\n/***/ }),\n/* 303 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/ed3fe9e11706e76990709ac2e567ada6.svg\";\n\n/***/ }),\n/* 304 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjUycHgiIGhlaWdodD0iNTJweCIgdmlld0JveD0iMCAwIDUyIDUyIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCA0My4yICgzOTA2OSkgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CiAgICA8dGl0bGU+c3RvcC1wbGF5YmFjazwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxkZWZzPgogICAgICAgIDxyZWN0IGlkPSJwYXRoLTEiIHg9IjAiIHk9IjAiIHdpZHRoPSI0NCIgaGVpZ2h0PSI0NCIgcng9IjQiPjwvcmVjdD4KICAgICAgICA8ZmlsdGVyIHg9Ii0xMy42JSIgeT0iLTEzLjYlIiB3aWR0aD0iMTI3LjMlIiBoZWlnaHQ9IjEyNy4zJSIgZmlsdGVyVW5pdHM9Im9iamVjdEJvdW5kaW5nQm94IiBpZD0iZmlsdGVyLTIiPgogICAgICAgICAgICA8ZmVNb3JwaG9sb2d5IHJhZGl1cz0iMiIgb3BlcmF0b3I9ImRpbGF0ZSIgaW49IlNvdXJjZUFscGhhIiByZXN1bHQ9InNoYWRvd1NwcmVhZE91dGVyMSI+PC9mZU1vcnBob2xvZ3k+CiAgICAgICAgICAgIDxmZU9mZnNldCBkeD0iMCIgZHk9IjAiIGluPSJzaGFkb3dTcHJlYWRPdXRlcjEiIHJlc3VsdD0ic2hhZG93T2Zmc2V0T3V0ZXIxIj48L2ZlT2Zmc2V0PgogICAgICAgICAgICA8ZmVDb21wb3NpdGUgaW49InNoYWRvd09mZnNldE91dGVyMSIgaW4yPSJTb3VyY2VBbHBoYSIgb3BlcmF0b3I9Im91dCIgcmVzdWx0PSJzaGFkb3dPZmZzZXRPdXRlcjEiPjwvZmVDb21wb3NpdGU+CiAgICAgICAgICAgIDxmZUNvbG9yTWF0cml4IHZhbHVlcz0iMCAwIDAgMCAwLjI5ODAzOTIxNiAgIDAgMCAwIDAgMC41OTIxNTY4NjMgICAwIDAgMCAwIDEgIDAgMCAwIDAuMSAwIiB0eXBlPSJtYXRyaXgiIGluPSJzaGFkb3dPZmZzZXRPdXRlcjEiPjwvZmVDb2xvck1hdHJpeD4KICAgICAgICA8L2ZpbHRlcj4KICAgIDwvZGVmcz4KICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJEZXNrdG9wLS0tMTI4MHg3MjAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC02MTkuMDAwMDAwLCAtMzQ1LjAwMDAwMCkiPgogICAgICAgICAgICA8ZyBpZD0iU3RlcC00LS0tUGxheWluZy1UcmltIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLjAwMDAwMCwgNDIuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICA8ZyBpZD0iUGxheS0vLVJlY29yZC0vLVN0b3AiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDYyMy4wMDAwMDAsIDMwNy4wMDAwMDApIj4KICAgICAgICAgICAgICAgICAgICA8ZyBpZD0ic3RvcC1wbGF5YmFjayI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx1c2UgZmlsbD0iYmxhY2siIGZpbGwtb3BhY2l0eT0iMSIgZmlsdGVyPSJ1cmwoI2ZpbHRlci0yKSIgeGxpbms6aHJlZj0iI3BhdGgtMSI+PC91c2U+CiAgICAgICAgICAgICAgICAgICAgICAgIDx1c2UgZmlsbD0iI0ZGRkZGRiIgZmlsbC1ydWxlPSJldmVub2RkIiB4bGluazpocmVmPSIjcGF0aC0xIj48L3VzZT4KICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgc3Ryb2tlPSIjRkZGRkZGIiBzdHJva2Utd2lkdGg9IjEiIHg9IjAuNSIgeT0iMC41IiB3aWR0aD0iNDMiIGhlaWdodD0iNDMiIHJ4PSI0Ij48L3JlY3Q+CiAgICAgICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8L2c+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4K\"\n\n/***/ }),\n/* 305 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/79a644579518611a7b397f85a32cfb85.svg\";\n\n/***/ }),\n/* 306 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/e91530fe8f85b7fdc983b48ab3b9885d.svg\";\n\n/***/ }),\n/* 307 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/2501d1b87cf04e00cc3a623fa8b5d95c.svg\";\n\n/***/ }),\n/* 308 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/d1f6af6170e0178514f35fedc62e5eab.svg\";\n\n/***/ }),\n/* 309 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(460);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 310 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(464);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 311 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(465);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 312 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1NyA0OSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtvcGFjaXR5OjAuMzt9LmNscy0ye29wYWNpdHk6MC4xO30uY2xzLTN7ZmlsbDojZmY2NjgwO3N0cm9rZS1taXRlcmxpbWl0OjEwO30uY2xzLTMsLmNscy00e3N0cm9rZTojZjM1O30uY2xzLTR7ZmlsbDojZmY0ZDZhO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDt9PC9zdHlsZT48L2RlZnM+PHRpdGxlPlIxXyBDLlByb2NlZHVyZSBFZGl0YmxlIElucHV0czwvdGl0bGU+PGcgaWQ9ImJvb2xlYW5fYm9vbGVhbl9pbnB1dHMiIGRhdGEtbmFtZT0iYm9vbGVhbiArIGJvb2xlYW4gaW5wdXRzIj48cmVjdCBjbGFzcz0iY2xzLTMiIHg9IjAuNSIgeT0iMC41IiB3aWR0aD0iNTYiIGhlaWdodD0iNDgiIHJ4PSI0IiByeT0iNCIvPjxwYXRoIGNsYXNzPSJjbHMtNCIgZD0iTTMyLjUsNDAuNWgtOGwtMTYtMTZoMGwxNi0xNmg4bDE2LDE2aDBaIi8+PC9nPjwvc3ZnPg==\"\n\n/***/ }),\n/* 313 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1NyA0OSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtvcGFjaXR5OjAuMzt9LmNscy0ye29wYWNpdHk6MC4xO30uY2xzLTN7ZmlsbDojZmY2NjgwO3N0cm9rZS1taXRlcmxpbWl0OjEwO30uY2xzLTMsLmNscy00e3N0cm9rZTojZjM1O30uY2xzLTR7ZmlsbDojZmY0ZDZhO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDt9PC9zdHlsZT48L2RlZnM+PHRpdGxlPlIxXyBDLlByb2NlZHVyZSBFZGl0YmxlIElucHV0czwvdGl0bGU+PGcgaWQ9ImJvb2xlYW5fYm9vbGVhbl9pbnB1dHMiIGRhdGEtbmFtZT0iYm9vbGVhbiArIGJvb2xlYW4gaW5wdXRzIj48cmVjdCBjbGFzcz0iY2xzLTMiIHg9IjAuNSIgeT0iMC41IiB3aWR0aD0iNTYiIGhlaWdodD0iNDgiIHJ4PSI0IiByeT0iNCIvPjxyZWN0IGNsYXNzPSJjbHMtNCIgeD0iOC41IiB5PSI4LjUiIHdpZHRoPSI0MCIgaGVpZ2h0PSIzMiIgcng9IjE2IiByeT0iMTYiLz48L2c+PC9zdmc+\"\n\n/***/ }),\n/* 314 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1NyA0OSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtvcGFjaXR5OjAuMzt9LmNscy0ye29wYWNpdHk6MC4xO30uY2xzLTN7ZmlsbDojZmY2NjgwO3N0cm9rZTojZjM1O3N0cm9rZS1taXRlcmxpbWl0OjEwO30uY2xzLTR7Zm9udC1zaXplOjEycHg7ZmlsbDojZmZmO2ZvbnQtZmFtaWx5OkhlbHZldGljYU5ldWUtQm9sZCwgSGVsdmV0aWNhIE5ldWUsIHNhbnMtc2VyaWY7Zm9udC13ZWlnaHQ6NzAwO2xldHRlci1zcGFjaW5nOjBlbTt9PC9zdHlsZT48L2RlZnM+PHRpdGxlPlIxXyBDLlByb2NlZHVyZSBFZGl0YmxlIElucHV0czwvdGl0bGU+PGcgaWQ9ImJvb2xlYW5fYm9vbGVhbl9pbnB1dHMiIGRhdGEtbmFtZT0iYm9vbGVhbiArIGJvb2xlYW4gaW5wdXRzIj48cmVjdCBjbGFzcz0iY2xzLTMiIHg9IjAuNSIgeT0iMC41IiB3aWR0aD0iNTYiIGhlaWdodD0iNDgiIHJ4PSI0IiByeT0iNCIvPjx0ZXh0IGNsYXNzPSJjbHMtNCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTcuNTcgMjcuNSkiPnRleHQ8L3RleHQ+PC9nPjwvc3ZnPgo=\"\n\n/***/ }),\n/* 315 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/bc0fbf502b38884f440135ddae40016d.svg\";\n\n/***/ }),\n/* 316 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/f6d9f33ec366a89a58b3cf0e125adf97.svg\";\n\n/***/ }),\n/* 317 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/165746cd277a144ddefd62ac5d67b696.svg\";\n\n/***/ }),\n/* 318 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(479);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 319 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjE2cHgiIGhlaWdodD0iMTZweCIgdmlld0JveD0iMCAwIDE2IDE2IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCA0OC4yICg0NzMyNykgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CiAgICA8dGl0bGU+eC1pY29uX1YyPC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGRlZnM+PC9kZWZzPgogICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj4KICAgICAgICA8ZyBpZD0ieC1pY29uX1YyIiBzdHJva2U9IiM1NzVFNzUiIHN0cm9rZS13aWR0aD0iMiI+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0zLDggTDEyLDgiIGlkPSJTdHJva2UtMSI+PC9wYXRoPgogICAgICAgICAgICA8cG9seWxpbmUgaWQ9IlN0cm9rZS01IiBwb2ludHM9IjQgMTAgMiA3Ljk5OTQzNDIzIDQgNiI+PC9wb2x5bGluZT4KICAgICAgICAgICAgPHBvbHlsaW5lIGlkPSJTdHJva2UtNS1Db3B5IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMy4wMDAwMDAsIDguMDAwMDAwKSBzY2FsZSgtMSwgMSkgdHJhbnNsYXRlKC0xMy4wMDAwMDAsIC04LjAwMDAwMCkgIiBwb2ludHM9IjE0IDEwIDEyIDcuOTk5NDM0MjMgMTQgNiI+PC9wb2x5bGluZT4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg==\"\n\n/***/ }),\n/* 320 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjE2cHgiIGhlaWdodD0iMTZweCIgdmlld0JveD0iMCAwIDE2IDE2IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCA0OC4yICg0NzMyNykgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CiAgICA8dGl0bGU+eSBpY29uIFYyPC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGRlZnM+PC9kZWZzPgogICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj4KICAgICAgICA8ZyBpZD0ieS1pY29uLVYyIiBzdHJva2U9IiM1NzVFNzUiIHN0cm9rZS13aWR0aD0iMiI+CiAgICAgICAgICAgIDxnIGlkPSJ5LWljb24iIHRyYW5zZm9ybT0idHJhbnNsYXRlKDguMDAwMDAwLCA4LjAwMDAwMCkgcm90YXRlKDkwLjAwMDAwMCkgdHJhbnNsYXRlKC04LjAwMDAwMCwgLTguMDAwMDAwKSB0cmFuc2xhdGUoMi4wMDAwMDAsIDYuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMSwyIEwxMCwyIiBpZD0iU3Ryb2tlLTEiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDxwb2x5bGluZSBpZD0iU3Ryb2tlLTUiIHBvaW50cz0iMiA0IDAgMS45OTk0MzQyMyAyIDAiPjwvcG9seWxpbmU+CiAgICAgICAgICAgICAgICA8cG9seWxpbmUgaWQ9IlN0cm9rZS01LUNvcHkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDExLjAwMDAwMCwgMi4wMDAwMDApIHNjYWxlKC0xLCAxKSB0cmFuc2xhdGUoLTExLjAwMDAwMCwgLTIuMDAwMDAwKSAiIHBvaW50cz0iMTIgNCAxMCAxLjk5OTQzNDIzIDEyIDAiPjwvcG9seWxpbmU+CiAgICAgICAgICAgIDwvZz4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg==\"\n\n/***/ }),\n/* 321 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/7d2d28d80d4ae06acb4fdbde429448e6.svg\";\n\n/***/ }),\n/* 322 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTAwcHgiIGhlaWdodD0iMTAwcHgiIHZpZXdCb3g9IjAgMCAyMCAyMCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgIDwhLS0gR2VuZXJhdG9yOiBTa2V0Y2ggNDkuMyAoNTExNjcpIC0gaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoIC0tPgogICAgPHRpdGxlPlNvdW5kPC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGRlZnM+PC9kZWZzPgogICAgPGcgaWQ9IlNvdW5kIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8cGF0aCBkPSJNMTIuNDc4NTA1OCwxMi42NjY2NjY3IEMxMi4zMTQ0OTQ3LDEyLjY2NjY2NjcgMTIuMTQ1ODg1MiwxMi42MjcyMDQ0IDExLjk5MjYwMzgsMTIuNTQ0MDUxNyBDMTEuNTM3MzU4LDEyLjI5NjAwMzEgMTEuMzg1NjA5NCwxMS43NTYyMTU2IDExLjY1NTM4NDcsMTEuMzM3NjMzNSBDMTIuMTY4ODc3NCwxMC41MzcxMTMxIDEyLjE2ODg3NzQsOS41NDQ5MTg2NyAxMS42NTUzODQ3LDguNzQ1ODA3NTYgQzExLjM4NTYwOTQsOC4zMjU4MTYxOCAxMS41MzczNTgsNy43ODYwMjg2MSAxMS45OTI2MDM4LDcuNTM3OTgwMDEgQzEyLjQ1MjQ0OCw3LjI5Mjc1MDE0IDEzLjAzNzk4MjksNy40MzA4NjgxMSAxMy4zMDQ2OTI2LDcuODQ4MDQwNzYgQzE0LjE3Mzc5ODEsOS4yMDEwMzMxMSAxNC4xNzM3OTgxLDEwLjg4MDk5ODYgMTMuMzA0NjkyNiwxMi4yMzM5OTEgQzEzLjEyNjg4NjIsMTIuNTEzMDQ1NyAxMi44MDY1MjgsMTIuNjY2NjY2NyAxMi40Nzg1MDU4LDEyLjY2NjY2NjcgWiBNMTUuMzgwNjc4NCwxMy44MzMzMzMzIEMxNS4yNDA4OTAyLDEzLjgzMzMzMzMgMTUuMDk1ODc2MywxMy43OTYyODEgMTQuOTY2NTM5NiwxMy43MTgyMDY0IEMxNC41Nzg1Mjk1LDEzLjQ4NTMwNiAxNC40NDkxOTI4LDEyLjk3ODQ4MjkgMTQuNjc5MTI0NywxMi41ODU0NjM0IEMxNS41OTQ5MzMxLDExLjAxNjAzMjEgMTUuNTk0OTMzMSw5LjA2NTQ5MSAxNC42NzkxMjQ3LDcuNDk3MzgyOTkgQzE0LjQ0OTE5MjgsNy4xMDQzNjM1MiAxNC41Nzg1Mjk1LDYuNTk2MjE3MTIgMTQuOTY2NTM5Niw2LjM2MzMxNjY5IEMxNS4zNTU4NTYyLDYuMTM0Mzg2MTYgMTUuODU0OTEyOSw2LjI2Mjc0NjA1IDE2LjA4NDg0NDgsNi42NTQ0NDIyMyBDMTcuMzA1MDUxNyw4Ljc0MjYwNjMyIDE3LjMwNTA1MTcsMTEuMzM4OTE2OCAxNi4wODQ4NDQ4LDEzLjQyNzA4MDkgQzE1LjkzMTk5MjQsMTMuNjg5MDkzOSAxNS42NjAyNTQ3LDEzLjgzMzMzMzMgMTUuMzgwNjc4NCwxMy44MzMzMzMzIFogTTEwLjMwNDM0NzgsNS42MjUwMTU1NyBMMTAuMzA0MzQ3OCwxMy44NzM2NzUgQzEwLjMwNDM0NzgsMTQuODUwOTM0IDkuMTA5Njk4NDksMTUuMzYyNTEwMSA4LjM2NDc4MzExLDE0LjcwMzgwNTIgTDYuNzU2NjAxMywxMy4yNzk3NjA3IEM2LjE4NzEyMzk0LDEyLjc3NjI4MzQgNS40NDQ5OTMyOSwxMi40OTY4NzM3IDQuNjczNjIyOTcsMTIuNDk2ODczNyBMNC4zOTIzNjUyLDEyLjQ5Njg3MzcgQzMuNjIzNzc5NjEsMTIuNDk2ODczNyAzLDExLjg5MzUxMDggMywxMS4xNDcwNjg2IEwzLDguMzY2NDY5ODkgQzMsNy42MjEzNzc0MyAzLjYyMzc3OTYxLDcuMDE2NjY0NzEgNC4zOTIzNjUyLDcuMDE2NjY0NzEgTDQuNjU4MzA2OTUsNy4wMTY2NjQ3MSBDNS40Mjk2NzcyNyw3LjAxNjY2NDcxIDYuMTcxODA3OTIsNi43MzcyNTUwNCA2Ljc0MTI4NTI5LDYuMjMzNzc3NzEgTDguMzY0NzgzMTEsNC43OTYyMzUxOSBDOS4xMDk2OTg0OSw0LjEzNzUzMDI2IDEwLjMwNDM0NzgsNC42NDkxMDY0MyAxMC4zMDQzNDc4LDUuNjI1MDE1NTcgWiIgaWQ9IkNvbWJpbmVkLVNoYXBlIiBmaWxsPSIjNTc1RTc1Ij48L3BhdGg+CiAgICA8L2c+Cjwvc3ZnPgo=\"\n\n/***/ }),\n/* 323 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/f9a0fb45ee35279e05b6f4e637509777.svg\";\n\n/***/ }),\n/* 324 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/af8e46c9477a8cadeb6c26b4686407a5.svg\";\n\n/***/ }),\n/* 325 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDQ4LjIgKDQ3MzI3KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5yZWNvcmQ8L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZGVmcz48L2RlZnM+CiAgICA8ZyBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0icmVjb3JkIiBmaWxsPSIjRkZGRkZGIj4KICAgICAgICAgICAgPHBhdGggZD0iTTE1LjkzNjUwMDYsMTEuMTQ4MzgxIEMxNS4wMzY5NzA3LDEzLjMzMzIyODUgMTMuMDUxODAxMSwxNC44MjY0Njk3IDEwLjc3MTk1OCwxNS4xMDkzOTk2IEwxMC43NzE5NTgsMTcuMjE0MDgzNiBDMTAuNzcxOTU4LDE3LjY1NTc2ODYgMTAuNDMwNzU3LDE4IDkuOTk2NTAxMTYsMTggQzkuNTYyMjQ1MzMsMTggOS4yMjEwNDQzMiwxNy42NTU3Njg2IDkuMjIxMDQ0MzIsMTcuMjE0MDgzNiBMOS4yMjEwNDQzMiwxNS4xMDkzOTk2IEM2Ljk1NjcxMDMzLDE0LjgyNjQ2OTcgNC45NzMwOTE3MSwxMy4zNDczNzUgNC4wNTY1MDE3MiwxMS4xNzk4MTc3IEMzLjkwMTQxMDM1LDEwLjc4Njg1OTUgNC4wNzM1NjE3NywxMC4zMTUzMDk3IDQuNDc1MjQ4NDIsMTAuMTU4MTI2NCBDNC44NjI5NzY4NCw5Ljk4NTIyNDc3IDUuMzI4MjUwOTUsMTAuMTU4MTI2NCA1LjQ4MzM0MjMyLDEwLjU2NjgwMjkgQzYuMjU4Nzk5MTYsMTIuMzkwMTI4OSA4LjAyNjg0MDc3LDEzLjU4NDcyMTggOS45OTY1MDExNiwxMy41ODQ3MjE4IEMxMS45NjYxNjE2LDEzLjU4NDcyMTggMTMuNzQ5NzEyMywxMi4zOTAxMjg5IDE0LjUwOTY2LDEwLjUzMzc5NDQgQzE0LjY4MDI2MDUsMTAuMTQwODM2MiAxNS4xNDU1MzQ2LDkuOTUzNzg4MTIgMTUuNTMzMjYzLDEwLjEyNjY4OTcgQzE1LjkyMDk5MTUsMTAuMjk5NTkxMyAxNi4xMDcxMDExLDEwLjc1NTQyMjggMTUuOTM2NTAwNiwxMS4xNDgzODEgWiBNNy4yODIyNDcxMSw4LjY0NjkyOTgyIEw3LjI4MjI0NzExLDQuNjg2NDAzNTEgQzcuMjgyMjQ3MTEsMy4xOTczNjg0MiA4LjQ3MDAzNTQ4LDIgOS45MTM0MjM4OCwyIEMxMS4zNzE4NDc2LDIgMTIuNTQ0NjAwNywzLjE5NzM2ODQyIDEyLjU0NDYwMDcsNC42ODY0MDM1MSBMMTIuNTQ0NjAwNyw4LjY0NjkyOTgyIEMxMi41NDQ2MDA3LDEwLjEyMDYxNCAxMS4zNzE4NDc2LDExLjMzMzMzMzMgOS45MTM0MjM4OCwxMS4zMzMzMzMzIEM4LjQ3MDAzNTQ4LDExLjMzMzMzMzMgNy4yODIyNDcxMSwxMC4xMjA2MTQgNy4yODIyNDcxMSw4LjY0NjkyOTgyIFoiIGlkPSJyZWNvcmQtaWNvbiI+PC9wYXRoPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+Cg==\"\n\n/***/ }),\n/* 326 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjUycHgiIGhlaWdodD0iNTJweCIgdmlld0JveD0iMCAwIDUyIDUyIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCA0My4yICgzOTA2OSkgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CiAgICA8dGl0bGU+c3RvcC1yZWNvcmRpbmc8L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZGVmcz4KICAgICAgICA8cmVjdCBpZD0icGF0aC0xIiB4PSIyMCIgeT0iMCIgd2lkdGg9IjQ0IiBoZWlnaHQ9IjQ0IiByeD0iNCI+PC9yZWN0PgogICAgICAgIDxmaWx0ZXIgeD0iLTEzLjYlIiB5PSItMTMuNiUiIHdpZHRoPSIxMjcuMyUiIGhlaWdodD0iMTI3LjMlIiBmaWx0ZXJVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giIGlkPSJmaWx0ZXItMiI+CiAgICAgICAgICAgIDxmZU1vcnBob2xvZ3kgcmFkaXVzPSIyIiBvcGVyYXRvcj0iZGlsYXRlIiBpbj0iU291cmNlQWxwaGEiIHJlc3VsdD0ic2hhZG93U3ByZWFkT3V0ZXIxIj48L2ZlTW9ycGhvbG9neT4KICAgICAgICAgICAgPGZlT2Zmc2V0IGR4PSIwIiBkeT0iMCIgaW49InNoYWRvd1NwcmVhZE91dGVyMSIgcmVzdWx0PSJzaGFkb3dPZmZzZXRPdXRlcjEiPjwvZmVPZmZzZXQ+CiAgICAgICAgICAgIDxmZUNvbXBvc2l0ZSBpbj0ic2hhZG93T2Zmc2V0T3V0ZXIxIiBpbjI9IlNvdXJjZUFscGhhIiBvcGVyYXRvcj0ib3V0IiByZXN1bHQ9InNoYWRvd09mZnNldE91dGVyMSI+PC9mZUNvbXBvc2l0ZT4KICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggdmFsdWVzPSIwIDAgMCAwIDEgICAwIDAgMCAwIDAuNCAgIDAgMCAwIDAgMC4xMDE5NjA3ODQgIDAgMCAwIDAuMSAwIiB0eXBlPSJtYXRyaXgiIGluPSJzaGFkb3dPZmZzZXRPdXRlcjEiPjwvZmVDb2xvck1hdHJpeD4KICAgICAgICA8L2ZpbHRlcj4KICAgIDwvZGVmcz4KICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJEZXNrdG9wLS0tMTI4MHg3MjAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC02MTkuMDAwMDAwLCAtMzQ1LjAwMDAwMCkiPgogICAgICAgICAgICA8ZyBpZD0iU3RlcC0yLS0tUmVjb3JkaW5nIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLjAwMDAwMCwgNDIuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICA8ZyBpZD0iUGxheS0vLVJlY29yZC0vLVN0b3AiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDYwMy4wMDAwMDAsIDMwNy4wMDAwMDApIj4KICAgICAgICAgICAgICAgICAgICA8ZyBpZD0ic3RvcC1yZWNvcmRpbmciPgogICAgICAgICAgICAgICAgICAgICAgICA8dXNlIGZpbGw9ImJsYWNrIiBmaWxsLW9wYWNpdHk9IjEiIGZpbHRlcj0idXJsKCNmaWx0ZXItMikiIHhsaW5rOmhyZWY9IiNwYXRoLTEiPjwvdXNlPgogICAgICAgICAgICAgICAgICAgICAgICA8dXNlIGZpbGw9IiNGRjY2MUEiIGZpbGwtcnVsZT0iZXZlbm9kZCIgeGxpbms6aHJlZj0iI3BhdGgtMSI+PC91c2U+CiAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHN0cm9rZT0iI0U2NEQwMCIgc3Ryb2tlLXdpZHRoPSIxIiB4PSIyMC41IiB5PSIwLjUiIHdpZHRoPSI0MyIgaGVpZ2h0PSI0MyIgcng9IjQiPjwvcmVjdD4KICAgICAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDwvZz4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg==\"\n\n/***/ }),\n/* 327 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjQ5cHgiIGhlaWdodD0iNTJweCIgdmlld0JveD0iLTUgMCA0OSA0OCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgIDwhLS0gR2VuZXJhdG9yOiBTa2V0Y2ggNDMuMiAoMzkwNjkpIC0gaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoIC0tPgogICAgPHRpdGxlPnBsYXk8L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZGVmcz4KICAgICAgICA8cGF0aCBkPSJNMTcuMjIxNDY1MSw4LjM0NDk5NDQzIEMxOS43NzY2NDE5LDQuMDg2MzY2NTMgMjMuOTIzNDA1Nyw0LjA5MzAzOTQ2IDI2LjQ3NDU3ODcsOC4zNDQ5OTQ0MyBMNDAuMTUyMDk3NCwzMS4xNDA4NTkgQzQyLjcwNzI3NDEsMzUuMzk5NDg2OSA0MC43NDg5NjcyLDM4Ljg1MTc4NjkgMzUuNzcyNjYzNywzOC44NTE3ODY5IEw3LjkyMzM4MDA2LDM4Ljg1MTc4NjkgQzIuOTQ5NTA4OSwzOC44NTE3ODY5IDAuOTkyNzczNDI5LDM1LjM5MjgxNCAzLjU0Mzk0NjQxLDMxLjE0MDg1OSBMMTcuMjIxNDY1MSw4LjM0NDk5NDQzIFoiIGlkPSJwYXRoLTEiPjwvcGF0aD4KICAgIDwvZGVmcz4KICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJEZXNrdG9wLS0tMTI4MHg3MjAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC02MjMuMDAwMDAwLCAtMzQ3LjAwMDAwMCkiPgogICAgICAgICAgICA8ZyBpZD0iU3RlcC0zLS0tQWx0ZXJpbmctU3VnZ2VzdGVkLVRyaW0iIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAuMDAwMDAwLCA0Mi4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxnIGlkPSJQbGF5LS8tUmVjb3JkLS8tU3RvcCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNjIzLjAwMDAwMCwgMzA3LjAwMDAwMCkiPgogICAgICAgICAgICAgICAgICAgIDxnIGlkPSJwbGF5IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMS44NDkxMzEsIDIyLjAwMjY1Nikgcm90YXRlKDkwLjAwMDAwMCkgdHJhbnNsYXRlKC0yMS44NDkxMzEsIC0yMi4wMDI2NTYpICI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx1c2Ugc3Ryb2tlPSIjRkZGRkZGIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9IiNGRkZGRkYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgeGxpbms6aHJlZj0iI3BhdGgtMSI+PC91c2U+CiAgICAgICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8L2c+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4K\"\n\n/***/ }),\n/* 328 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjUycHgiIGhlaWdodD0iNTJweCIgdmlld0JveD0iMCAwIDUyIDUyIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCA0My4yICgzOTA2OSkgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CiAgICA8dGl0bGU+c3RvcC1wbGF5YmFjazwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxkZWZzPgogICAgICAgIDxyZWN0IGlkPSJwYXRoLTEiIHg9IjAiIHk9IjAiIHdpZHRoPSI0NCIgaGVpZ2h0PSI0NCIgcng9IjQiPjwvcmVjdD4KICAgIDwvZGVmcz4KICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJEZXNrdG9wLS0tMTI4MHg3MjAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC02MTkuMDAwMDAwLCAtMzQ1LjAwMDAwMCkiPgogICAgICAgICAgICA8ZyBpZD0iU3RlcC00LS0tUGxheWluZy1UcmltIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLjAwMDAwMCwgNDIuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICA8ZyBpZD0iUGxheS0vLVJlY29yZC0vLVN0b3AiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDYyMy4wMDAwMDAsIDMwNy4wMDAwMDApIj4KICAgICAgICAgICAgICAgICAgICA8ZyBpZD0ic3RvcC1wbGF5YmFjayI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx1c2UgZmlsbD0iI0ZGRkZGRiIgZmlsbC1ydWxlPSJldmVub2RkIiB4bGluazpocmVmPSIjcGF0aC0xIj48L3VzZT4KICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgc3Ryb2tlPSIjRkZGRkZGIiBzdHJva2Utd2lkdGg9IjEiIHg9IjAuNSIgeT0iMC41IiB3aWR0aD0iNDMiIGhlaWdodD0iNDMiIHJ4PSI0Ij48L3JlY3Q+CiAgICAgICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8L2c+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4K\"\n\n/***/ }),\n/* 329 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjIwcHgiIGhlaWdodD0iMjBweCIgdmlld0JveD0iMCAwIDIwIDIwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCA0OC4yICg0NzMyNykgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CiAgICA8dGl0bGU+aWNvbi0tZmFzdGVyPC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGRlZnM+PC9kZWZzPgogICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9ImZhc3RlciIgZmlsbD0iI0NGNjNDRiI+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMC40MDMwMTY4LDE1LjMzMDUyMDUgQzkuNjM2MzE4MTgsMTUuODA5MDQzIDguNjc4OTQ0OTYsMTUuMjE1MDE1IDguNjc4OTQ0OTYsMTQuMjg5NTk2NSBMOC42Nzg5NDQ5NiwxMi4zMDUzNzggTDMuNzI0MDcxODQsMTUuMzMwNTIwNSBDMi45NTczNzMyMiwxNS44MDkwNDMgMiwxNS4yMTUwMTUgMiwxNC4yODk1OTY1IEwyLDUuNzE4ODE3OTcgQzIsNC43Nzk2NDg3NSAyLjk1NzM3MzIyLDQuMTk5MzcxNDQgMy43MjQwNzE4NCw0LjY2Mjc2ODI1IEw4LjY3ODk0NDk2LDcuNjg3OTEwNjcgTDguNjc4OTQ0OTYsNS43MTg4MTc5NyBDOC42Nzg5NDQ5Niw0Ljc3OTY0ODc1IDkuNjM2MzE4MTgsNC4xOTkzNzE0NCAxMC40MDMwMTY4LDQuNjYyNzY4MjUgTDE3LjQyNTk3NjEsOC45NDc0Njk5NiBDMTguMTkxMzQxMyw5LjQxMDg2Njc4IDE4LjE5MTM0MTMsMTAuNTgyNDIxOSAxNy40MjU5NzYxLDExLjA2MDk0NDUgTDEwLjQwMzAxNjgsMTUuMzMwNTIwNSBaIj48L3BhdGg+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4=\"\n\n/***/ }),\n/* 330 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjIwcHgiIGhlaWdodD0iMjBweCIgdmlld0JveD0iMCAwIDIwIDIwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCA0OC4yICg0NzMyNykgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CiAgICA8dGl0bGU+aWNvbi0tc2xvd2VyPC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGRlZnM+PC9kZWZzPgogICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9InNsb3dlciIgZmlsbD0iI0NGNjNDRiI+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0yLjU3NCw4LjkzOTM2NDQxIEw5LjU5NjY2NjY3LDQuNjY5OTg5NDEgQzEwLjM2MzMzMzMsNC4xOTE0ODk0MSAxMS4zMjA2NjY3LDQuNzg1NDg5NDEgMTEuMzIwNjY2Nyw1LjcxMDg2NDQxIEwxMS4zMjA2NjY3LDcuNjk0OTg5NDEgTDE2LjI3NTMzMzMsNC42Njk5ODk0MSBDMTcuMDQyLDQuMTkxNDg5NDEgMTcuOTk5MzMzMyw0Ljc4NTQ4OTQxIDE3Ljk5OTMzMzMsNS43MTA4NjQ0MSBMMTcuOTk5MzMzMywxNC4yODEyMzk0IEMxNy45OTkzMzMzLDE1LjIyMDM2NDQgMTcuMDQyLDE1LjgwMDYxNDQgMTYuMjc1MzMzMywxNS4zMzcyMzk0IEwxMS4zMjA2NjY3LDEyLjMxMjIzOTQgTDExLjMyMDY2NjcsMTQuMjgxMjM5NCBDMTEuMzIwNjY2NywxNS4yMjAzNjQ0IDEwLjM2MzMzMzMsMTUuODAwNjE0NCA5LjU5NjY2NjY3LDE1LjMzNzIzOTQgTDIuNTc0LDExLjA1MjczOTQgQzEuODA4NjY2NjcsMTAuNTg5MzY0NCAxLjgwODY2NjY3LDkuNDE3ODY0NDEgMi41NzQsOC45MzkzNjQ0MSI+PC9wYXRoPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+\"\n\n/***/ }),\n/* 331 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjIwcHgiIGhlaWdodD0iMjBweCIgdmlld0JveD0iMCAwIDIwIDIwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCA0OC4yICg0NzMyNykgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CiAgICA8dGl0bGU+bG91bmRlcjwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxkZWZzPjwvZGVmcz4KICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJsb3VuZGVyIj4KICAgICAgICAgICAgPGcgaWQ9ImxvdWRlciIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMi4wMDAwMDAsIDQuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNi43MDQxLDIuMTIyMSBMNi43MDQxLDEwLjUzNjEgQzYuNzA0MSwxMC44ODUxIDYuNDIyMSwxMS4xNjcxIDYuMDc0MSwxMS4xNjcxIEw0Ljg5NzEsMTEuMTY3MSBDNC42MjUxLDExLjE2NzEgNC4zODMxLDEwLjk5MjEgNC4yOTgxLDEwLjczMjEgQzMuODE4MSw5LjI2ODEgMi40NTIxLDguMjc4MSAwLjkxMTEsOC4yNzgxIEwwLjYzMTEsOC4yNzgxIEMwLjI4NDEsOC4yNzgxIDAuMDAwMSw3Ljk5NDEgMC4wMDAxLDcuNjQ3MSBMMC4wMDAxLDUuMDExMSBDMC4wMDAxLDQuNjY0MSAwLjI4NDEsNC4zODAxIDAuNjMxMSw0LjM4MDEgTDAuOTExMSw0LjM4MDEgQzIuNDUyMSw0LjM4MDEgMy44MTgxLDMuMzkwMSA0LjI5ODEsMS45MjYxIEM0LjM4MzEsMS42NjYxIDQuNjI1MSwxLjQ5MTEgNC44OTcxLDEuNDkxMSBMNi4wNzQxLDEuNDkxMSBDNi40MjIxLDEuNDkxMSA2LjcwNDEsMS43NzMxIDYuNzA0MSwyLjEyMjEiIGlkPSJGaWxsLTEiIGZpbGw9IiNDRjYzQ0YiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik05LjExNzIsNS4yMTI5IEM5LjcyOTIsNS44MjU5IDkuNzI5Miw2LjgzMTkgOS4xMTcyLDcuNDQ0OSIgaWQ9IlN0cm9rZS0zIiBzdHJva2U9IiNDRjYzQ0YiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMS4zNDg2LDIuOTgxNSBDMTMuMTk2Niw0LjgyOTUgMTMuMTk2Niw3LjgyOTUgMTEuMzQ4Niw5LjY3NjUiIGlkPSJTdHJva2UtNSIgc3Ryb2tlPSIjQ0Y2M0NGIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTMuNTgsMC43NTAxIEMxNi42NjMsMy44MzIxIDE2LjY2Myw4LjgyNjEgMTMuNTgsMTEuOTA4MSIgaWQ9IlN0cm9rZS03IiBzdHJva2U9IiNDRjYzQ0YiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjwvcGF0aD4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+\"\n\n/***/ }),\n/* 332 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjIwcHgiIGhlaWdodD0iMjBweCIgdmlld0JveD0iMCAwIDIwIDIwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCA0OC4yICg0NzMyNykgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CiAgICA8dGl0bGU+aWNvbi0tc29mdGVyPC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGRlZnM+PC9kZWZzPgogICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9InNvZnRlciI+CiAgICAgICAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDUuMDAwMDAwLCA0LjAwMDAwMCkiPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTcuNTQwMTEyNDYsMS4zODczNjI1IEw3LjU0MDExMjQ2LDEwLjg1MzExMjUgQzcuNTQwMTEyNDYsMTEuMjQ1NzM3NSA3LjIyMjk0NjU5LDExLjU2Mjk4NzUgNi44MzE1NTA0MSwxMS41NjI5ODc1IEw1LjUwNzc3NjU1LDExLjU2Mjk4NzUgQzUuMjAxODU3NywxMS41NjI5ODc1IDQuOTI5Njc5OSwxMS4zNjYxMTI1IDQuODM0MDgwMjYsMTEuMDczNjEyNSBDNC4yOTQyMjM0Niw5LjQyNjYxMjUgMi43NTc4ODA5OCw4LjMxMjg2MjUgMS4wMjQ3MTU3Miw4LjMxMjg2MjUgTDAuNzA5Nzk5MjUxLDguMzEyODYyNSBDMC4zMTk1Mjc3NzMsOC4zMTI4NjI1IDAuMDAwMTEyNSw3Ljk5MzM2MjUgMC4wMDAxMTI1LDcuNjAyOTg3NSBMMC4wMDAxMTI1LDQuNjM3NDg3NSBDMC4wMDAxMTI1LDQuMjQ3MTEyNSAwLjMxOTUyNzc3MywzLjkyNzYxMjUgMC43MDk3OTkyNTEsMy45Mjc2MTI1IEwxLjAyNDcxNTcyLDMuOTI3NjEyNSBDMi43NTc4ODA5OCwzLjkyNzYxMjUgNC4yOTQyMjM0NiwyLjgxMzg2MjUgNC44MzQwODAyNiwxLjE2Njg2MjUgQzQuOTI5Njc5OSwwLjg3NDM2MjUgNS4yMDE4NTc3LDAuNjc3NDg3NSA1LjUwNzc3NjU1LDAuNjc3NDg3NSBMNi44MzE1NTA0MSwwLjY3NzQ4NzUgQzcuMjIyOTQ2NTksMC42Nzc0ODc1IDcuNTQwMTEyNDYsMC45OTQ3Mzc1IDcuNTQwMTEyNDYsMS4zODczNjI1IiBpZD0iRmlsbC0xIiBmaWxsPSIjQ0Y2M0NGIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNOS4yNSw0Ljg2NDUxMjUgQzkuOTM4NSw1LjU1NDEzNzUgOS45Mzg1LDYuNjg1ODg3NSA5LjI1LDcuMzc1NTEyNSIgaWQ9IlN0cm9rZS0zIiBzdHJva2U9IiNDRjYzQ0YiIHN0cm9rZS13aWR0aD0iMS43NSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48L3BhdGg+CiAgICAgICAgICAgIDwvZz4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg==\"\n\n/***/ }),\n/* 333 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/b1f026ce265c0f666e2063ef94b06109.svg\";\n\n/***/ }),\n/* 334 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjIwcHgiIGhlaWdodD0iMjBweCIgdmlld0JveD0iMCAwIDIwIDIwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCA0OC4yICg0NzMyNykgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CiAgICA8dGl0bGU+aWNvbi0tZWNobzwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxkZWZzPjwvZGVmcz4KICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+CiAgICAgICAgPGcgaWQ9ImVjaG8iIHN0cm9rZT0iI0NGNjNDRiI+CiAgICAgICAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDMuMjUwMDAwLCAyLjAwMDAwMCkiPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTMuMzE4NzE4NzUsNi45OTE0NDg3NSBDMy45MDUzNDM3NSw3LjU3OTY5ODc1IDMuOTA1MzQzNzUsOC41MzE5NDg3NSAzLjMxODcxODc1LDkuMTIwMTk4NzUgQzIuNzMyMDkzNzUsOS43MDY4MjM3NSAxLjc3ODIxODc1LDkuNzA2ODIzNzUgMS4xODk5Njg3NSw5LjEyMDE5ODc1IEMwLjYwMzM0Mzc1LDguNTMxOTQ4NzUgMC42MDMzNDM3NSw3LjU3OTY5ODc1IDEuMTg5OTY4NzUsNi45OTE0NDg3NSBDMS43NzgyMTg3NSw2LjQwNDgyMzc1IDIuNzMyMDkzNzUsNi40MDQ4MjM3NSAzLjMxODcxODc1LDYuOTkxNDQ4NzUgWiIgaWQ9IlN0cm9rZS0xIiBzdHJva2Utd2lkdGg9IjEuNSIgZmlsbD0iI0NGNjNDRiI+PC9wYXRoPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTUuMjUsNC44NjY1OTg3NSBDNy4wMjEyNSw2LjYyMTU5ODc1IDcuMDIxMjUsOS40NjUzNDg3NSA1LjI1LDExLjIzNjU5ODgiIGlkPSJTdHJva2UtMyIgc3Ryb2tlLXdpZHRoPSIxLjc1Ij48L3BhdGg+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNy41LDIuNzM4NjYxMjUgQzEwLjQ0MTI1LDUuNjc5OTExMjUgMTAuNDQxMjUsMTAuNDIzMjg2MiA3LjUsMTMuMzY2MTYxMiIgaWQ9IlN0cm9rZS01IiBzdHJva2Utd2lkdGg9IjEuNzUiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik05Ljc1LDAuNjA4OTM2MjUgQzEzLjg2MTI1LDQuNzIwMTg2MjUgMTMuODYxMjUsMTEuMzY2NDM2MiA5Ljc1LDE1LjQ5MzkzNjIiIGlkPSJTdHJva2UtNyIgc3Ryb2tlLXdpZHRoPSIxLjc1Ij48L3BhdGg+CiAgICAgICAgICAgIDwvZz4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg==\"\n\n/***/ }),\n/* 335 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/85f62e9e77bed58778782e6cce58c1f4.svg\";\n\n/***/ }),\n/* 336 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDU2LjIgKDgxNjcyKSAtIGh0dHBzOi8vc2tldGNoLmNvbSAtLT4KICAgIDx0aXRsZT5Tb3VuZC9FZmZlY3RzL0ZhZGUtb3V0PC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGcgaWQ9IlNvdW5kL0VmZmVjdHMvRmFkZS1vdXQiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxwYXRoIGQ9Ik0xMywxMC4yNSBDMTIuNjQ2NzUxNSwxMC4yNSAxMi40MTcyOTkyLDEwLjQ5MTIzNTcgMTIuMDk1NjIwMiwxMS4xMTQ2Mzg5IEwxMS45NTM4Nzk4LDExLjM5MTc3MDggQzExLjY0NDE3NzYsMTEuOTg5Mjg3MyAxMS40MTI4MTg5LDEyLjI1IDExLDEyLjI1IEMxMC42MTIwNTczLDEyLjI1IDEwLjM1MjE2MzgsMTIuMTA0NzgyNCA5Ljk0MzI0MzIyLDExLjc1MjM3OTQgTDkuODcwMDQ1NywxMS42ODkwNjggQzkuNDg5NDc3MjQsMTEuMzU5ODM1IDkuMjk0MTQ3NDMsMTEuMjUgOSwxMS4yNSBDOC44MDAwMzU2MSwxMS4yNSA4LjU5NzQxNTA1LDExLjYwNjc4ODQgOC4yMzQ0MzcxOSwxMi41ODY4Mjg2IEM3Ljc2NDA4MTcxLDEzLjg1Njc4ODQgNy41NDA3NzYzNSwxNC4yNSA3LDE0LjI1IEM2LjU5NzkzODQ1LDE0LjI1IDYuMzY4NTI4MywxNC4xMTAyOTUxIDYuMDg2NjU4MTYsMTMuNzg4NTk1NSBDNi4wMzIwOTMyOSwxMy43MjU3MzY2IDYuMDAyNjI0MTYsMTMuNjkxNzUyIDUuOTc5ODE0MzQsMTMuNjY2MDkxIEM1LjcxNDc5NTM4LDEzLjM2Nzk0NDYgNS40ODc2NDI3NSwxMy4yNSA1LDEzLjI1IEM0LjYyMzQ1NjQyLDEzLjI1IDQuMzA3Mzk4MjQsMTMuODY4Mzc0NyAzLjczNzE3MDgyLDE1LjU3OTA1NjkgQzMuMDU3Mzk4MjQsMTcuNjE4Mzc0NyAyLjczNDU2NzUzLDE4LjI1IDIsMTguMjUgQzEuODYxOTI4ODEsMTguMjUgMS43NSwxOC4xMzgwNzEyIDEuNzUsMTggTDEuNzUsMiBDMS43NSwxLjg2MTkyODgxIDEuODYxOTI4ODEsMS43NSAyLDEuNzUgQzIuNzM0NTY3NTMsMS43NSAzLjA1NzM5ODI0LDIuMzgxNjI1MjkgMy43MzcxNzA4Miw0LjQyMDk0MzA2IEM0LjMwNzM5ODI0LDYuMTMxNjI1MjkgNC42MjM0NTY0Miw2Ljc1IDUsNi43NSBDNS40ODc2NDI3NSw2Ljc1IDUuNzE0Nzk1MzgsNi42MzIwNTUzNyA1Ljk3OTgxNDM0LDYuMzMzOTA5MDQgQzYuMDAyNjI0MTYsNi4zMDgyNDc5OSA2LjAzMjA5MzI5LDYuMjc0MjYzNDIgNi4wODY2NTgxNiw2LjIxMTQwNDUxIEM2LjM2ODUyODMsNS44ODk3MDQ5IDYuNTk3OTM4NDUsNS43NSA3LDUuNzUgQzcuNTQwNzc2MzUsNS43NSA3Ljc2NDA4MTcxLDYuMTQzMjExNjIgOC4yMzQ0MzcxOSw3LjQxMzE3MTQxIEM4LjU5NzQxNTA1LDguMzkzMjExNjIgOC44MDAwMzU2MSw4Ljc1IDksOC43NSBDOS4yOTQxNDc0Myw4Ljc1IDkuNDg5NDc3MjQsOC42NDAxNjQ5NyA5Ljg3MDA0NTcsOC4zMTA5MzE5OSBMOS45NDMyNDMyMiw4LjI0NzYyMDYxIEMxMC4zNTIxNjM4LDcuODk1MjE3NjQgMTAuNjEyMDU3Myw3Ljc1IDExLDcuNzUgQzExLjQxMjgxODksNy43NSAxMS42NDQxNzc2LDguMDEwNzEyNzMgMTEuOTUzODc5OCw4LjYwODIyOTIgTDEyLjA5NTYyMDIsOC44ODUzNjEwNyBDMTIuNDE3Mjk5Miw5LjUwODc2NDI4IDEyLjY0Njc1MTUsOS43NSAxMyw5Ljc1IEwxOCw5Ljc1IEMxOC4xMzgwNzEyLDkuNzUgMTguMjUsOS44NjE5Mjg4MSAxOC4yNSwxMCBDMTguMjUsMTAuMTM4MDcxMiAxOC4xMzgwNzEyLDEwLjI1IDE4LDEwLjI1IEwxMi45OTk5OTk4LDEwLjI1IEwxMywxMC4yNSBaIiBpZD0iUGF0aCIgZmlsbD0iI0NGNjNDRiIgZmlsbC1ydWxlPSJub256ZXJvIj48L3BhdGg+CiAgICA8L2c+Cjwvc3ZnPg==\"\n\n/***/ }),\n/* 337 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDU2LjIgKDgxNjcyKSAtIGh0dHBzOi8vc2tldGNoLmNvbSAtLT4KICAgIDx0aXRsZT5Tb3VuZC9FZmZlY3RzL0ZhZGUtaW48L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZyBpZD0iU291bmQvRWZmZWN0cy9GYWRlLWluIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8cGF0aCBkPSJNMiwxMC4yNSBDMS44NjE5Mjg4MSwxMC4yNSAxLjc1LDEwLjEzODA3MTIgMS43NSwxMCBDMS43NSw5Ljg2MTkyODgxIDEuODYxOTI4ODEsOS43NSAyLDkuNzUgTDcsOS43NSBDNy4zNTMyNDg1MSw5Ljc1IDcuNTgyNzAwNzcsOS41MDg3NjQyOCA3LjkwNDM3OTgxLDguODg1MzYxMDcgTDguMDQ2MTIwMjEsOC42MDgyMjkyIEM4LjM1NTgyMjM1LDguMDEwNzEyNzMgOC41ODcxODExMiw3Ljc1IDksNy43NSBDOS4zODc5NDI3LDcuNzUgOS42NDc4MzYxOCw3Ljg5NTIxNzY0IDEwLjA1Njc1NjgsOC4yNDc2MjA2MSBMMTAuMTI5OTU0Myw4LjMxMDkzMTk5IEMxMC41MTA1MjI4LDguNjQwMTY0OTcgMTAuNzA1ODUyNiw4Ljc1IDExLDguNzUgQzExLjE5OTk2NDQsOC43NSAxMS40MDI1ODUsOC4zOTMyMTE2MiAxMS43NjU1NjI4LDcuNDEzMTcxNDEgQzEyLjIzNTkxODMsNi4xNDMyMTE2MiAxMi40NTkyMjM3LDUuNzUgMTMsNS43NSBDMTMuNDAyMDYxNiw1Ljc1IDEzLjYzMTQ3MTcsNS44ODk3MDQ5IDEzLjkxMzM0MTgsNi4yMTE0MDQ1MSBDMTMuOTY3OTA2Nyw2LjI3NDI2MzQyIDEzLjk5NzM3NTgsNi4zMDgyNDc5OSAxNC4wMjAxODU3LDYuMzMzOTA5MDQgQzE0LjI4NTIwNDYsNi42MzIwNTUzNyAxNC41MTIzNTcyLDYuNzUgMTUsNi43NSBDMTUuMzc2NTQzNiw2Ljc1IDE1LjY5MjYwMTgsNi4xMzE2MjUyOSAxNi4yNjI4MjkyLDQuNDIwOTQzMDYgQzE2Ljk0MjYwMTgsMi4zODE2MjUyOSAxNy4yNjU0MzI1LDEuNzUgMTgsMS43NSBDMTguMTM4MDcxMiwxLjc1IDE4LjI1LDEuODYxOTI4ODEgMTguMjUsMiBMMTguMjUsMTggQzE4LjI1LDE4LjEzODA3MTIgMTguMTM4MDcxMiwxOC4yNSAxOCwxOC4yNSBDMTcuMjY1NDMyNSwxOC4yNSAxNi45NDI2MDE4LDE3LjYxODM3NDcgMTYuMjYyODI5MiwxNS41NzkwNTY5IEMxNS42OTI2MDE4LDEzLjg2ODM3NDcgMTUuMzc2NTQzNiwxMy4yNSAxNSwxMy4yNSBDMTQuNTEyMzU3MiwxMy4yNSAxNC4yODUyMDQ2LDEzLjM2Nzk0NDYgMTQuMDIwMTg1NywxMy42NjYwOTEgQzEzLjk5NzM3NTgsMTMuNjkxNzUyIDEzLjk2NzkwNjcsMTMuNzI1NzM2NiAxMy45MTMzNDE4LDEzLjc4ODU5NTUgQzEzLjYzMTQ3MTcsMTQuMTEwMjk1MSAxMy40MDIwNjE2LDE0LjI1IDEzLDE0LjI1IEMxMi40NTkyMjM3LDE0LjI1IDEyLjIzNTkxODMsMTMuODU2Nzg4NCAxMS43NjU1NjI4LDEyLjU4NjgyODYgQzExLjQwMjU4NSwxMS42MDY3ODg0IDExLjE5OTk2NDQsMTEuMjUgMTEsMTEuMjUgQzEwLjcwNTg1MjYsMTEuMjUgMTAuNTEwNTIyOCwxMS4zNTk4MzUgMTAuMTI5OTU0MywxMS42ODkwNjggTDEwLjA1Njc1NjgsMTEuNzUyMzc5NCBDOS42NDc4MzYxOCwxMi4xMDQ3ODI0IDkuMzg3OTQyNywxMi4yNSA5LDEyLjI1IEM4LjU4NzE4MTEyLDEyLjI1IDguMzU1ODIyMzUsMTEuOTg5Mjg3MyA4LjA0NjEyMDIxLDExLjM5MTc3MDggTDcuOTA0Mzc5ODEsMTEuMTE0NjM4OSBDNy41ODI3MDA3OCwxMC40OTEyMzU3IDcuMzUzMjQ4NTEsMTAuMjUgNy4wMDAwMDAwMSwxMC4yNSBMMiwxMC4yNSBaIiBpZD0iUGF0aCIgZmlsbD0iI0NGNjNDRiIgZmlsbC1ydWxlPSJub256ZXJvIj48L3BhdGg+CiAgICA8L2c+Cjwvc3ZnPg==\"\n\n/***/ }),\n/* 338 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDU1LjIgKDc4MTgxKSAtIGh0dHBzOi8vc2tldGNoYXBwLmNvbSAtLT4KICAgIDx0aXRsZT5Tb3VuZC9FZmZlY3RzL011dGU8L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZyBpZD0iU291bmQvRWZmZWN0cy9NdXRlIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8cGF0aCBmaWxsPSIjQ0Y2M0NGIiBkPSJNMTMuNDU0MTc0OSw1LjA0ODE1MjQzIEwxNS42MjgxMTY4LDIuODc0MjEwNTQgQzE1LjkyMTAxLDIuNTgxMzE3MzIgMTYuMzk1ODgzNywyLjU4MTMxNzMyIDE2LjY4ODc3NywyLjg3NDIxMDU0IEMxNi45ODE2NzAyLDMuMTY3MTAzNzYgMTYuOTgxNjcwMiwzLjY0MTk3NzQ5IDE2LjY4ODc3NywzLjkzNDg3MDcxIEw0LjUzMDMzMDA5LDE2LjA5MzMxNzYgQzQuMjM3NDM2ODcsMTYuMzg2MjEwOCAzLjc2MjU2MzEzLDE2LjM4NjIxMDggMy40Njk2Njk5MSwxNi4wOTMzMTc2IEMzLjE3Njc3NjcsMTUuODAwNDI0NCAzLjE3Njc3NjcsMTUuMzI1NTUwNiAzLjQ2OTY2OTkxLDE1LjAzMjY1NzQgTDYuMzEyMTQ5MzIsMTIuMTkwMTc4IEM2LjEyNDExOTEsMTIuMDYyMTM3OSA2LDExLjg0NjMzMzEgNiwxMS42MDI5ODc1IEw2LDguNjM3NDg3NSBDNiw4LjI0NzExMjUgNi4zMTk0MTUyNyw3LjkyNzYxMjUgNi43MDk2ODY3NSw3LjkyNzYxMjUgTDcuMDI0NjAzMjIsNy45Mjc2MTI1IEM4Ljc1Nzc2ODQ4LDcuOTI3NjEyNSAxMC4yOTQxMTEsNi44MTM4NjI1IDEwLjgzMzk2NzgsNS4xNjY4NjI1IEMxMC45Mjk1Njc0LDQuODc0MzYyNSAxMS4yMDE3NDUyLDQuNjc3NDg3NSAxMS41MDc2NjQxLDQuNjc3NDg3NSBMMTIuODMxNDM3OSw0LjY3NzQ4NzUgQzEzLjEwMDI4NDQsNC42Nzc0ODc1IDEzLjMzNDEwNzUsNC44MjcxNzIwOCAxMy40NTQxNzQ5LDUuMDQ4MTUyNDMgWiBNMTMuNTQsOS4wODM2NDc3MSBMMTMuNTQsMTQuODUzMTEyNSBDMTMuNTQsMTUuMjQ1NzM3NSAxMy4yMjI4MzQxLDE1LjU2Mjk4NzUgMTIuODMxNDM3OSwxNS41NjI5ODc1IEwxMS41MDc2NjQxLDE1LjU2Mjk4NzUgQzExLjIwMTc0NTIsMTUuNTYyOTg3NSAxMC45Mjk1Njc0LDE1LjM2NjExMjUgMTAuODMzOTY3OCwxNS4wNzM2MTI1IEMxMC41NzczNzg1LDE0LjI5MDgwNzcgMTAuMDk1NjgxMywxMy42Mjg0NjUgOS40NzQ3MzUzMSwxMy4xNDg5MTI0IEwxMy41NCw5LjA4MzY0NzcxIFoiIGlkPSJwYXRoLTEiPjwvcGF0aD4KICAgIDwvZz4KPC9zdmc+Cg==\"\n\n/***/ }),\n/* 339 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/32d903cafc72328bd30afce14bfa4c79.svg\";\n\n/***/ }),\n/* 340 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/c14c0c1e852949eff4e6c069772b0015.svg\";\n\n/***/ }),\n/* 341 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(490);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 342 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjEuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCAxNCAxNCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMTQgMTQ7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5zdDB7ZmlsbDojRUM1OTU5O3N0cm9rZTojQjg0ODQ4O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9Cjwvc3R5bGU+Cjxwb2x5Z29uIGNsYXNzPSJzdDAiIHBvaW50cz0iNC4zLDAuNSA5LjcsMC41IDEzLjUsNC4zIDEzLjUsOS43IDkuNywxMy41IDQuMywxMy41IDAuNSw5LjcgMC41LDQuMyAiLz4KPC9zdmc+Cg==\"\n\n/***/ }),\n/* 343 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjE2cHgiIGhlaWdodD0iMTZweCIgdmlld0JveD0iMCAwIDE2IDE2IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCA0My4yICgzOTA2OSkgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CiAgICA8dGl0bGU+dHVyYm8tYm9sdC1pY29uPC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGRlZnM+PC9kZWZzPgogICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9InR1cmJvLWJvbHQtaWNvbiIgc3Ryb2tlPSIjRkY4QzFBIiBmaWxsPSIjRkY4QzFBIj4KICAgICAgICAgICAgPHBhdGggZD0iTTYuMTkxOTI2NSw5Ljk3MDQxMjY3IEM2LjM5ODE3NTc4LDEwLjQ4Mjc5OTMgNi44NDUxMjk2LDEwLjU1MTU0MTggNy4xOTQ1NjA0NCwxMC4xMTg1ODI1IEw3LjQ2MTQ0NDgsOS43ODc5MDE2NyBDNy44MDg5MzQ5Niw5LjM1NzM0Njk0IDguNDM0MjI1NjQsOS4yODU0NTUxNiA4Ljg3MzQ2NjYxLDkuNjM5NzQ1MjEgTDExLjY4NjU2LDExLjkwODc3NTQgQzEyLjExODkwOCwxMi4yNTc1MDU1IDEyLjMwMzA4NTgsMTIuMTI2NTkwMyAxMi4wOTYyNzA1LDExLjYxMjIzNDEgTDkuNzQ5MjE1NzUsNS43NzUwMzQ1MyBDOS41NDMxNDQ2Miw1LjI2MjUyOTEyIDkuMDk1ODQ0NzIsNS4xOTQwMTczOCA4Ljc0NTgwMTIsNS42MjczODUxNSBMOC40Nzg0NDg5LDUuOTU4Mzc3OSBDOC4xMzAzNDk0Nyw2LjM4OTMzODgxIDcuNTA0NTY0ODYsNi40NjE1NTk4NyA3LjA2NTMyMzg5LDYuMTA3MjY5ODIgTDQuMjUyMjMwNDgsMy44MzgyMzk2NyBDMy44MTk4ODI1MiwzLjQ4OTUwOTQ5IDMuNjM1ODQ4NTEsMy42MjAzMjg5MSAzLjg0Mjg0MjYxLDQuMTM0NTY1OTEgTDYuMTkxOTI2NSw5Ljk3MDQxMjY3IFoiIGlkPSJ0dXJiby1ib2x0IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg3Ljk2OTM5NSwgNy44NzM1MDgpIHJvdGF0ZSg2OS4wMDAwMDApIHRyYW5zbGF0ZSgtNy45NjkzOTUsIC03Ljg3MzUwOCkgIj48L3BhdGg+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4=\"\n\n/***/ }),\n/* 344 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(495);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 345 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/61e99f0da6828d62aa9e3761c15ace9f.svg\";\n\n/***/ }),\n/* 346 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iNDgiIHdpZHRoPSI0OCI+PHBhdGggZD0iTTIxLjM1IDQyVjMwLjc1aDN2NC4xNUg0MnYzSDI0LjM1VjQyWk02IDM3Ljl2LTNoMTIuMzV2M1ptOS4zNS04LjN2LTQuMUg2di0zaDkuMzV2LTQuMmgzdjExLjNabTYtNC4xdi0zSDQydjNabTguMy04LjI1VjZoM3Y0LjFINDJ2M2gtOS4zNXY0LjE1Wk02IDEzLjF2LTNoMjAuNjV2M1oiLz48L3N2Zz4=\"\n\n/***/ }),\n/* 347 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(497);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 348 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUxLjIgKDU3NTE5KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5HZW5lcmFsL0NoZWNrPC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGRlZnM+CiAgICAgICAgPHBhdGggZD0iTTcuODYxNDQwNTksMTUuNDAyODc3NiBDNy40MzUyNjg1OSwxNS40MDI4Nzc2IDcuMDA5MDk2NTgsMTUuMjM5NzMzNiA2LjY4NDQ3MzM4LDE0LjkxNTExMDQgTDMuNDg4MTgzMzYsMTEuNzE4ODIwNCBDMi44MzcyNzIyMSwxMS4wNjc5MDkzIDIuODM3MjcyMjEsMTAuMDE1Nzk3MSAzLjQ4ODE4MzM2LDkuMzY0ODg2IEM0LjEzOTA5NDUsOC43MTM5NzQ4NSA1LjE5MTIwNjY0LDguNzEzOTc0ODUgNS44NDIxMTc3OCw5LjM2NDg4NiBMNy44NjE0NDA1OSwxMS4zODQyMDg4IEwxNC4xNTkxMzA4LDUuMDg4MTgzMzYgQzE0LjgwODM3NzIsNC40MzcyNzIyMSAxNS44NjIxNTQsNC40MzcyNzIyMSAxNi41MTMwNjUyLDUuMDg4MTgzMzYgQzE3LjE2MjMxMTYsNS43Mzc0Mjk3NyAxNy4xNjIzMTE2LDYuNzkxMjA2NjQgMTYuNTEzMDY1Miw3LjQ0MjExNzc4IEw5LjAzODQwNzgsMTQuOTE1MTEwNCBDOC43MTM3ODQ2LDE1LjIzOTczMzYgOC4yODc2MTI1OSwxNS40MDI4Nzc2IDcuODYxNDQwNTksMTUuNDAyODc3NiIgaWQ9InBhdGgtMSI+PC9wYXRoPgogICAgPC9kZWZzPgogICAgPGcgaWQ9IkdlbmVyYWwvQ2hlY2siIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxtYXNrIGlkPSJtYXNrLTIiIGZpbGw9IndoaXRlIj4KICAgICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjcGF0aC0xIj48L3VzZT4KICAgICAgICA8L21hc2s+CiAgICAgICAgPHVzZSBpZD0iQ2hlY2siIGZpbGw9IiM1NzVFNzUiIHhsaW5rOmhyZWY9IiNwYXRoLTEiPjwvdXNlPgogICAgICAgIDxnIGlkPSJDb2xvci9XaGl0ZSIgbWFzaz0idXJsKCNtYXNrLTIpIiBmaWxsPSIjRkZGRkZGIj4KICAgICAgICAgICAgPHJlY3QgaWQ9IkNvbG9yIiB4PSIwIiB5PSIwIiB3aWR0aD0iMjAiIGhlaWdodD0iMjAiPjwvcmVjdD4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg==\"\n\n/***/ }),\n/* 349 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(505);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 350 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/a72a652fdc84dc6983d3cc9596c36a26.svg\";\n\n/***/ }),\n/* 351 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/566d73a090e3d42d5bdfee3d92c79d25.svg\";\n\n/***/ }),\n/* 352 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/674db5c2e49df884273ac0f7d221865c.svg\";\n\n/***/ }),\n/* 353 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/7efe82fffae735cd083388badd51b3fa.svg\";\n\n/***/ }),\n/* 354 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/1900166faa9222d0d10c568a12c848a5.png\";\n\n/***/ }),\n/* 355 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/7c410b6c3cd2a9ee41505c5c6951bbf6.png\";\n\n/***/ }),\n/* 356 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(516);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 357 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(517);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 358 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDQ4LjIgKDQ3MzI3KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5MYW5ndWFnZTwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxkZWZzPjwvZGVmcz4KICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+CiAgICAgICAgPGcgaWQ9Ikxhbmd1YWdlIiBzdHJva2U9IiNGRkZGRkYiIHN0cm9rZS13aWR0aD0iMS4yNSI+CiAgICAgICAgICAgIDxnIGlkPSJsYW5ndWFnZSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMi4wMDAwMDAsIDIuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTUuNjM1Miw4LjExMjk0MTE4IEMxNS42MzUyLDEyLjI2ODIzNTMgMTIuMjY2NzI5NCwxNS42MzU3NjQ3IDguMTEyMzc2NDcsMTUuNjM1NzY0NyBDMy45NTcwODIzNSwxNS42MzU3NjQ3IDAuNTg4NjExNzY1LDEyLjI2ODIzNTMgMC41ODg2MTE3NjUsOC4xMTI5NDExOCBDMC41ODg2MTE3NjUsMy45NTc2NDcwNiAzLjk1NzA4MjM1LDAuNTg5MTc2NDcxIDguMTEyMzc2NDcsMC41ODkxNzY0NzEgQzEyLjI2NjcyOTQsMC41ODkxNzY0NzEgMTUuNjM1MiwzLjk1NzY0NzA2IDE1LjYzNTIsOC4xMTI5NDExOCBaIiBpZD0iU3Ryb2tlLTEiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMS45ODA4LDguMTE2NjExNzYgQzExLjk4MDgsOS43NDk1NTI5NCAxMS43MTUzODgyLDExLjI2MDE0MTIgMTEuMjU0MjExOCwxMi40OTIxNDEyIEMxMC41NTU4NTg4LDE0LjM5MzMxNzYgOS40MDc2MjM1MywxNS42MzQ3Mjk0IDguMTEwNjgyMzUsMTUuNjM0NzI5NCBDNi44MTM3NDExOCwxNS42MzQ3Mjk0IDUuNjY5MjcwNTksMTQuMzkzMzE3NiA0Ljk2NzE1Mjk0LDEyLjQ5MjE0MTIgQzQuNTEwNjgyMzUsMTEuMjYwMTQxMiA0LjI0NDMyOTQxLDkuNzQ5NTUyOTQgNC4yNDQzMjk0MSw4LjExNjYxMTc2IEM0LjI0NDMyOTQxLDYuNDgyNzI5NDEgNC41MTA2ODIzNSw0Ljk3MzA4MjM1IDQuOTY3MTUyOTQsMy43NDEwODIzNSBDNS42NjkyNzA1OSwxLjgyOTU1Mjk0IDYuODEzNzQxMTgsMC41ODgxNDExNzYgOC4xMTA2ODIzNSwwLjU4ODE0MTE3NiBDOS40MDc2MjM1MywwLjU4ODE0MTE3NiAxMC41NTU4NTg4LDEuODI5NTUyOTQgMTEuMjU0MjExOCwzLjc0MTA4MjM1IEMxMS43MTUzODgyLDQuOTczMDgyMzUgMTEuOTgwOCw2LjQ4MjcyOTQxIDExLjk4MDgsOC4xMTY2MTE3NiBaIiBpZD0iU3Ryb2tlLTMiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0wLjk1NTAxMTc2NSwxMC4yODExMjk0IEwxNS4yNjg0MjM1LDEwLjI4MTEyOTQiIGlkPSJTdHJva2UtNSI+PC9wYXRoPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTAuOTU1MDExNzY1LDUuOTQ2NjM1MjkgTDE1LjI2ODQyMzUsNS45NDY2MzUyOSIgaWQ9IlN0cm9rZS03Ij48L3BhdGg+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNOC4xMTIxODgyNCwwLjU5MDAyMzUyOSBMOC4xMTIxODgyNCwxNS42Mzc1NTI5IiBpZD0iU3Ryb2tlLTkiPjwvcGF0aD4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+\"\n\n/***/ }),\n/* 359 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/82aa0eba517b9756a9db4e3a9144723e.svg\";\n\n/***/ }),\n/* 360 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0id2hpdGUiIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiPjxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz48cGF0aCBkPSJNMjAgMTUuMzFMMjMuMzEgMTIgMjAgOC42OVY0aC00LjY5TDEyIC42OSA4LjY5IDRINHY0LjY5TC42OSAxMiA0IDE1LjMxVjIwaDQuNjlMMTIgMjMuMzEgMTUuMzEgMjBIMjB2LTQuNjl6TTEyIDE4Yy0zLjMxIDAtNi0yLjY5LTYtNnMyLjY5LTYgNi02IDYgMi42OSA2IDYtMi42OSA2LTYgNnoiLz48L3N2Zz4=\"\n\n/***/ }),\n/* 361 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PCEtLSBodHRwczovL21hdGVyaWFsLmlvL3Jlc291cmNlcy9pY29ucy8/c2VhcmNoPWJyaWdodG5lc3NfMyZpY29uPWJyaWdodG5lc3NfMyZzdHlsZT1iYXNlbGluZSAtLT4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0id2hpdGUiIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiPjxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz48cGF0aCBkPSJNOSAyYy0xLjA1IDAtMi4wNS4xNi0zIC40NiA0LjA2IDEuMjcgNyA1LjA2IDcgOS41NCAwIDQuNDgtMi45NCA4LjI3LTcgOS41NC45NS4zIDEuOTUuNDYgMyAuNDYgNS41MiAwIDEwLTQuNDggMTAtMTBTMTQuNTIgMiA5IDJ6Ii8+PC9zdmc+\"\n\n/***/ }),\n/* 362 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/64e66a9dcf4b42a699f49e5973a4a62e.svg\";\n\n/***/ }),\n/* 363 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/e4dfc45f34b4606356c4c70ba14a96f0.svg\";\n\n/***/ }),\n/* 364 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/3c06b74c80d1e6b1d210ca86c87cd326.svg\";\n\n/***/ }),\n/* 365 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PCEtLSBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL21hdGVyaWFsLWRlc2lnbi1pY29ucyAtLT4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0id2hpdGUiIHdpZHRoPSIxOHB4IiBoZWlnaHQ9IjE4cHgiPjxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz48cGF0aCBkPSJNNyAxNGMtMS42NiAwLTMgMS4zNC0zIDMgMCAxLjMxLTEuMTYgMi0yIDIgLjkyIDEuMjIgMi40OSAyIDQgMiAyLjIxIDAgNC0xLjc5IDQtNCAwLTEuNjYtMS4zNC0zLTMtM3ptMTMuNzEtOS4zN2wtMS4zNC0xLjM0Yy0uMzktLjM5LTEuMDItLjM5LTEuNDEgMEw5IDEyLjI1IDExLjc1IDE1bDguOTYtOC45NmMuMzktLjM5LjM5LTEuMDIgMC0xLjQxeiIvPjwvc3ZnPg==\"\n\n/***/ }),\n/* 366 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzMiIHZpZXdCb3g9IjAgMCAzMiAzMyIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0yNy43NTYyIDMuNzI4NTJIMTkuMzM1NEMxOC41MzM0IDMuNzI4NTIgMTguMTY0OCA0LjY4MzE5IDE4LjcyIDUuMjM4NDFMMjAuNzcxMyA3LjI4OTY0TDE3LjA2OTggMTMuNDg5NkMxNi44MzY5IDEzLjg3NjcgMTYuODIxNSAxNC4zODU3IDE3LjA4NTIgMTQuODAwNUMxNy40NCAxNS40MDIgMTguMjI1IDE1LjYwNDEgMTguODI4IDE1LjI0NzhMMjUuMDI4IDExLjU0NjNMMjcuMTI1NSAxMy42NDM4QzI3LjY4MDcgMTQuMTk5IDI4LjYzNTMgMTMuODMwNCAyOC42MzUzIDEzLjAyODVWNC42MDc2MkMyOC42MzY5IDQuMTEyNTUgMjguMjUxMyAzLjcyNjk4IDI3Ljc1NjIgMy43Mjg1MlpNMTcuNiA2LjQ4NTg0QzE3LjYgNS42MDIxOSAxNi44ODM3IDQuODg1ODQgMTYgNC44ODU4NEg5LjYwMDA1TDkuMzE4MDEgNC44OTM5OUM2Ljc5ODMyIDUuMDM5OTggNC44MDAwNSA3LjEyOTU1IDQuODAwMDUgOS42ODU4NFYyMi40ODU4TDQuODA4MiAyMi43Njc5QzQuOTU0MTkgMjUuMjg3NiA3LjA0Mzc2IDI3LjI4NTggOS42MDAwNSAyNy4yODU4SDIyLjQwMDFMMjIuNjgyMSAyNy4yNzc3QzI1LjIwMTggMjcuMTMxNyAyNy4yMDAxIDI1LjA0MjEgMjcuMjAwMSAyMi40ODU4VjE2LjA4NThMMjcuMTg5MyAxNS44OTkyQzI3LjA5NjkgMTUuMTAzNSAyNi40MjA2IDE0LjQ4NTggMjUuNiAxNC40ODU4QzI0LjcxNjQgMTQuNDg1OCAyNCAxNS4yMDIyIDI0IDE2LjA4NThWMjIuNDg1OEwyMy45ODkzIDIyLjY3MjRDMjMuODk2OSAyMy40NjgyIDIzLjIyMDYgMjQuMDg1OCAyMi40MDAxIDI0LjA4NThIOS42MDAwNUw5LjQxMzQ2IDI0LjA3NTFDOC42MTc3MSAyMy45ODI3IDguMDAwMDUgMjMuMzA2NCA4LjAwMDA1IDIyLjQ4NThWOS42ODU4NEw4LjAxMDgxIDkuNDk5MjVDOC4xMDMyNCA4LjcwMzUxIDguNzc5NTEgOC4wODU4NCA5LjYwMDA1IDguMDg1ODRIMTZMMTYuMTg2NiA4LjA3NTA4QzE2Ljk4MjQgNy45ODI2NSAxNy42IDcuMzA2MzggMTcuNiA2LjQ4NTg0WiIgZmlsbD0iI0ZGRkZGRiIvPgo8L3N2Zz4K\"\n\n/***/ }),\n/* 367 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/e04d8c93cf14ec09031b47d619c04f74.svg\";\n\n/***/ }),\n/* 368 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgMCAyMCAyMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik04LjI3MjA2IDIuNjgzNzdDOC40MDgxOCAyLjI3NTQzIDguNzkwMzIgMiA5LjIyMDc1IDJIMTAuNzc5MkMxMS4yMDk3IDIgMTEuNTkxOCAyLjI3NTQzIDExLjcyNzkgMi42ODM3N0wxMi4zMjE5IDQuNDY1OEMxMi43OTE0IDQuNjYzIDEzLjIzMDQgNC45MTgxOCAxMy42MzAyIDUuMjIyMzhMMTUuNDcyMSA0Ljg0NTQ3QzE1Ljg5MzggNC43NTkxNyAxNi4zMjM0IDQuOTUyNCAxNi41Mzg2IDUuMzI1MTZMMTcuMzE3OCA2LjY3NDg1QzE3LjUzMyA3LjA0NzYxIDE3LjQ4NTYgNy41MTYyNyAxNy4yIDcuODM4MzJMMTUuOTUyOSA5LjI0NDY4QzE1Ljk4NCA5LjQ5MjA4IDE2IDkuNzQ0MTcgMTYgMTBDMTYgMTAuMjU1OCAxNS45ODQgMTAuNTA3OSAxNS45NTI5IDEwLjc1NTNMMTcuMiAxMi4xNjE3QzE3LjQ4NTYgMTIuNDgzNyAxNy41MzMgMTIuOTUyNCAxNy4zMTc4IDEzLjMyNTJMMTYuNTM4NiAxNC42NzQ4QzE2LjMyMzQgMTUuMDQ3NiAxNS44OTM4IDE1LjI0MDggMTUuNDcyMSAxNS4xNTQ1TDEzLjYzMDIgMTQuNzc3NkMxMy4yMzA0IDE1LjA4MTggMTIuNzkxNCAxNS4zMzcgMTIuMzIxOSAxNS41MzQyTDExLjcyNzkgMTcuMzE2MkMxMS41OTE4IDE3LjcyNDYgMTEuMjA5NyAxOCAxMC43NzkyIDE4SDkuMjIwNzVDOC43OTAzMiAxOCA4LjQwODE4IDE3LjcyNDYgOC4yNzIwNiAxNy4zMTYyTDcuNjc4MDUgMTUuNTM0MkM3LjIwODYyIDE1LjMzNyA2Ljc2OTU1IDE1LjA4MTggNi4zNjk4MiAxNC43Nzc2TDQuNTI3OTIgMTUuMTU0NUM0LjEwNjIzIDE1LjI0MDggMy42NzY2MyAxNS4wNDc2IDMuNDYxNDEgMTQuNjc0OEwyLjY4MjE3IDEzLjMyNTJDMi40NjY5NiAxMi45NTI0IDIuNTE0NDIgMTIuNDgzNyAyLjggMTIuMTYxN0w0LjA0NzA4IDEwLjc1NTNDNC4wMTYgMTAuNTA3OSAzLjk5OTk5IDEwLjI1NTggMy45OTk5OSAxMEMzLjk5OTk5IDkuNzQ0MTYgNC4wMTYgOS40OTIwNyA0LjA0NzA3IDkuMjQ0NjZMMi44IDcuODM4MzJDMi41MTQ0MiA3LjUxNjI3IDIuNDY2OTYgNy4wNDc2MSAyLjY4MjE3IDYuNjc0ODVMMy40NjE0MSA1LjMyNTE2QzMuNjc2NjMgNC45NTI0IDQuMTA2MjMgNC43NTkxNyA0LjUyNzkyIDQuODQ1NDdMNi4zNjk4IDUuMjIyMzhDNi43Njk1NCA0LjkxODE4IDcuMjA4NjEgNC42NjMgNy42NzgwNSA0LjQ2NThMOC4yNzIwNiAyLjY4Mzc3Wk05Ljk5OTk5IDhDOC44OTU0MiA4IDcuOTk5OTkgOC44OTU0MyA3Ljk5OTk5IDEwQzcuOTk5OTkgMTEuMTA0NiA4Ljg5NTQyIDEyIDkuOTk5OTkgMTJDMTEuMTA0NiAxMiAxMiAxMS4xMDQ2IDEyIDEwQzEyIDguODk1NDMgMTEuMTA0NiA4IDkuOTk5OTkgOFoiIGZpbGw9IndoaXRlIi8+Cjwvc3ZnPgo=\"\n\n/***/ }),\n/* 369 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/7c67e2601425784a243cd7e0f15c50a3.svg\";\n\n/***/ }),\n/* 370 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgMCAyMCAyMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00Ljk4MTE2IDFIMTUuMDE5NkMxNi40MDQyIDEgMTcuNjE1OCAyLjIxMTU0IDE3LjYxNTggMy41OTYxNVYxMC44NjU0SDEzLjYzNUMxMS4zODUgMTAuODY1NCA5LjY1NDI0IDEyLjc2OTIgOS42NTQyNCAxNC44NDYyVjE4LjgyNjlINC45ODExNkMzLjU5NjU1IDE4LjgyNjkgMi4zODUwMSAxNy42MTU0IDIuMzg1MDEgMTYuMjMwOFYzLjU5NjE1QzIuMzg1MDEgMi4yMTE1NCAzLjU5NjU1IDEgNC45ODExNiAxWk02LjAxOTYzIDkuODI2OTJIOC43ODg4NkM5LjQ4MTE2IDkuODI2OTIgMTAuMDAwNCA5LjQ4MDc3IDEwLjAwMDQgOC43ODg0NkMxMC4wMDA0IDguMDk2MTUgOS40ODExNiA3Ljc1IDguOTYxOTMgNy43NUg2LjAxOTYzQzUuNTAwMzkgNy43NSA0Ljk4MTE2IDguMjY5MjMgNC45ODExNiA4Ljc4ODQ2QzQuOTgxMTYgOS4zMDc2OSA1LjUwMDM5IDkuODI2OTIgNi4wMTk2MyA5LjgyNjkyWk0xNC4xNTQyIDUuODQ2MTVINi4wMTk2M0M1LjMyNzMyIDUuODQ2MTUgNC45ODExNiA1LjMyNjkyIDQuOTgxMTYgNC44MDc2OUM0Ljk4MTE2IDQuMjg4NDYgNS41MDAzOSAzLjc2OTIzIDYuMDE5NjMgMy43NjkyM0gxNC4xNTQyQzE0LjY3MzUgMy43NjkyMyAxNS4xOTI3IDQuMjg4NDYgMTUuMTkyNyA0LjgwNzY5QzE1LjAxOTYgNS4zMjY5MiAxNC42NzM1IDUuODQ2MTUgMTQuMTU0MiA1Ljg0NjE1Wk0xNy40NDI3IDEyLjI1SDEzLjQ2MTlDMTIuMDc3MyAxMi4yNSAxMC44NjU4IDEzLjQ2MTUgMTAuODY1OCAxNS4wMTkyVjE5TDE3LjQ0MjcgMTIuMjVaIiBmaWxsPSJ3aGl0ZSIvPgo8L3N2Zz4K\"\n\n/***/ }),\n/* 371 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgMCAyMSAyMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik05LjY0NDY5IDE0LjUwN0M5LjU1ODYxIDE0LjU5MzEgOS40NjE0NSAxNC42NDg0IDkuMzQ1MjUgMTQuNzAwOEw3LjM3ODczIDE1LjUyNjZDNy4zMDcyOCAxNS4yODMgNy4xMzAzNCAxNC45NzM0IDYuODAzMjkgMTQuNjQ2M0M2LjQ4NzIxIDE0LjMzMDIgNi4xODg1MyAxNC4xNjQzIDUuOTUzNzggMTQuMDgxOUw2Ljc2OTc1IDEyLjEyNTNDNi44MTIxNyAxMS45OTkxIDYuODg4MjggMTEuOTAzMSA2Ljk3MzQ3IDExLjgxNzlDNi45OTMzIDExLjgxOCA3LjAxMjEzIDExLjc5OTIgNy4wMjIgMTEuNzg5M0w3LjA0OTc5IDExLjc2MTVDNy4xODI1MSAxMS42Mjg4IDcuMzY4OTYgMTEuNTQ4IDcuNTg3NDMgMTEuNTE5QzguMTQyNzggMTEuNDUwMiA4Ljc4NjU2IDExLjcxMzggOS4yNzIxNSAxMi4xOTk0QzkuNzU3NzMgMTIuNjg1IDEwLjAyMTMgMTMuMzI4OCA5Ljk0MTU4IDEzLjg3MzFDOS45MDk1NSAxNC4wNTI3IDkuODUwNDEgMTQuMjM3NSA5Ljc1NzU3IDE0LjM3NDJDOS43Mjk4OCAxNC40MjE5IDkuNjkyMjIgMTQuNDU5NSA5LjY1MzY2IDE0LjQ5ODFMOS42NDQ2OSAxNC41MDdaTTEyLjg2ODYgNS45NDI3NEMxMy4xNzUyIDUuNjM2MDYgMTMuNjQ1OCA1LjU3MDM2IDE0LjEyNzQgNS43MTQ4NkMxNC40MDY2IDUuNzk4NTkgMTQuNTIzMiA2LjE0NDcgMTQuMzMyMiA2LjMzNTdMOS43NTE3OSAxMC45MTYxQzkuNjQyMzkgMTEuMDI1NSA5LjQ2NDg4IDExLjA0MzUgOS4zMjEyMiAxMC45NTE4QzkuMTcyNzcgMTAuODU5IDkuMDE5MzQgMTAuNzc5MSA4Ljg2NDczIDEwLjcxMjNDOC42MTI1MiAxMC42MDM2IDguNTI0ODkgMTAuMjg2NCA4LjcwMTU0IDEwLjEwOThMMTIuODY4NiA1Ljk0Mjc0Wk0xNS41Mjg4IDguNjAyOTlMMTEuMzYyNyAxMi43NjkxQzExLjE4OTYgMTIuOTQyMiAxMC44NzEyIDEyLjg2NzcgMTAuNzY1NyAxMi42MjIzQzEwLjY5NzYgMTIuNDU5MSAxMC42MTI3IDEyLjMwMDcgMTAuNTE0OCAxMi4xNDcyQzEwLjQxODEgMTEuOTk2NyAxMC40NDIyIDExLjgwOTEgMTAuNTU2IDExLjY5NTJMMTUuMTI1NyA3LjEyNTZDMTUuMzE0OSA2LjkzNjM5IDE1LjY2MDkgNy4wNTEwNCAxNS43NDY1IDcuMzMwMzZDMTUuODk2IDcuODE3MDEgMTUuODM3MyA4LjI5NDUyIDE1LjUyODggOC42MDI5OVpNMTcuMzQ5NyA0LjEyMTgyQzE2LjE3ODEgMi45NTAyMyAxNC40ODgxIDIuNzM5NzkgMTMuNTc2MiAzLjY1MTc0TDYuMjIwNDQgMTEuMDA3NUM2LjA0MDIgMTEuMTg3NyA1Ljg4MDkgMTEuMzg4OSA1Ljc4NDQxIDExLjYzNDlMNC4yMzMxMiAxNS4zNTk5QzQuMDM4MDQgMTUuODMwMiA0LjE4OTA2IDE2LjQxNyA0LjYyMTggMTYuODQ5N0M1LjA1NDU0IDE3LjI4MjUgNS42NDEzNyAxNy40MzM1IDYuMTExNjUgMTcuMjM4NEw5LjgzNjYxIDE1LjY4NzFDMTAuMDgxNyAxNS41ODk2IDEwLjI4MjggMTUuNDMwMyAxMC40NjMxIDE1LjI1MDFMMTcuODE4OCA3Ljg5NDM4QzE4LjczMDggNi45ODI0MyAxOC41MjEzIDUuMjkzNDEgMTcuMzQ5NyA0LjEyMTgyWiIgZmlsbD0id2hpdGUiLz4KPC9zdmc+Cg==\"\n\n/***/ }),\n/* 372 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PCEtLSBodHRwczovL2ZvbnRzLmdvb2dsZS5jb20vaWNvbnM/c2VsZWN0ZWQ9TWF0ZXJpYWwrU3ltYm9scytPdXRsaW5lZDpleHRlbnNpb246RklMTEAxO3dnaHRANDAwO0dSQURAMDtvcHN6QDI0Jmljb24ucXVlcnk9ZXh0ZW5zaW9uIC0tPgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgaGVpZ2h0PSIyMCIgdmlld0JveD0iMCAtOTYwIDk2MCA5NjAiIHdpZHRoPSIyMCI+PHBhdGggZmlsbD0iI2ZmZmZmZiIgZD0iTTM1Mi0xMjBIMjAwcS0zMyAwLTU2LjUtMjMuNVQxMjAtMjAwdi0xNTJxNDggMCA4NC0zMC41dDM2LTc3LjVxMC00Ny0zNi03Ny41VDEyMC01Njh2LTE1MnEwLTMzIDIzLjUtNTYuNVQyMDAtODAwaDE2MHEwLTQyIDI5LTcxdDcxLTI5cTQyIDAgNzEgMjl0MjkgNzFoMTYwcTMzIDAgNTYuNSAyMy41VDgwMC03MjB2MTYwcTQyIDAgNzEgMjl0MjkgNzFxMCA0Mi0yOSA3MXQtNzEgMjl2MTYwcTAgMzMtMjMuNSA1Ni41VDcyMC0xMjBINTY4cTAtNTAtMzEuNS04NVQ0NjAtMjQwcS00NSAwLTc2LjUgMzVUMzUyLTEyMFoiLz48L3N2Zz4=\"\n\n/***/ }),\n/* 373 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PCEtLSBGcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvbWF0ZXJpYWwtZGVzaWduLWljb25zIC0tPg0KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0id2hpdGUiIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiPjxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz48cGF0aCBkPSJNMSAyMWgyMkwxMiAyIDEgMjF6bTEyLTNoLTJ2LTJoMnYyem0wLTRoLTJ2LTRoMnY0eiIvPjwvc3ZnPg==\"\n\n/***/ }),\n/* 374 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/e04d8c93cf14ec09031b47d619c04f74.svg\";\n\n/***/ }),\n/* 375 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/945297ca77c041c98377f204e1af772e.svg\";\n\n/***/ }),\n/* 376 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/82072226e8cf716289165650c31eeda2.svg\";\n\n/***/ }),\n/* 377 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/98bfc66ce081a3750f3b59ab67d0ac75.svg\";\n\n/***/ }),\n/* 378 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/306ffbcffad0d931fb1d158dd812f3fe.svg\";\n\n/***/ }),\n/* 379 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(524);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 380 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/3a296d85c85a5f222663dad932737c86.svg\";\n\n/***/ }),\n/* 381 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/65715c37a18debd4b44a80c478a3abd7.svg\";\n\n/***/ }),\n/* 382 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUzLjIgKDcyNjQzKSAtIGh0dHBzOi8vc2tldGNoYXBwLmNvbSAtLT4KICAgIDx0aXRsZT5UdXRvcmlhbHMvRXhwYW5kPC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGRlZnM+CiAgICAgICAgPHBhdGggZD0iTTQuNSwyIEwxNS41LDIgQzE2Ljg4MDcxMTksMiAxOCwzLjExOTI4ODEzIDE4LDQuNSBMMTgsNS41IEMxOCw1Ljc3NjE0MjM3IDE3Ljc3NjE0MjQsNiAxNy41LDYgTDIuNSw2IEMyLjIyMzg1NzYzLDYgMiw1Ljc3NjE0MjM3IDIsNS41IEwyLDQuNSBDMiwzLjExOTI4ODEzIDMuMTE5Mjg4MTMsMiA0LjUsMiBaIE0yLjUsNyBMMTcuNSw3IEMxNy43NzYxNDI0LDcgMTgsNy4yMjM4NTc2MyAxOCw3LjUgTDE4LDE1LjUgQzE4LDE2Ljg4MDcxMTkgMTYuODgwNzExOSwxOCAxNS41LDE4IEw0LjUsMTggQzMuMTE5Mjg4MTMsMTggMiwxNi44ODA3MTE5IDIsMTUuNSBMMiw3LjUgQzIsNy4yMjM4NTc2MyAyLjIyMzg1NzYzLDcgMi41LDcgWiBNOS42NTUwOTQ2NiwxNS4xNjM2MTQ2IEM5Ljc0NTQxNiwxNS4yNTMzNTY5IDkuODY3MDAyNDEsMTUuMzAzMTQ5NSA5Ljk5NzI3MzU3LDE1LjMwMzE0OTUgQzEwLjEyNzU0NDcsMTUuMzAzMTQ5NSAxMC4yNDkxMzExLDE1LjI1MzM1NjkgMTAuMzM5NDUyNSwxNS4xNjM2MTQ2IEwxMi4xNTc0NTg4LDEzLjM0NTYwODIgQzEyLjMwMDQ2NzYsMTMuMjAyNTk5NCAxMi4zNDE1NzU0LDEyLjk5OTM3NjQgMTIuMjY1NzI4NiwxMi44MTU4Mzg4IEMxMi4xODk4ODE5LDEyLjYzMzQ1OTIgMTIuMDEwOTc2MiwxMi41MTUzNDY3IDExLjgxMDA2OTEsMTIuNTE1MzQ2NyBMMTEuMTUwNjA3NSwxMi41MTUzNDY3IEwxMC43ODk5MDEyLDkuOTg4MDg2MjUgQzEwLjc0NjQ3NzUsOS42NDQ3NDkzOCAxMC40NzAzMDI2LDkuMzY1Njc5NjEgMTAuMTEyNDkxMiw5LjMwOTUxODI3IEMxMC4wNzgzMzEyLDkuMzA1NDY1MzkgMTAuMDQzNTkyMiw5LjMwMzE0OTQ2IDEwLjAwOTQzMjIsOS4zMDMxNDk0NiBDOS42MTI4Mjg5MSw5LjMwMzE0OTQ2IDkuMjc1ODYwODUsOS41OTc4NTE3NiA5LjIyNTQ4OTMzLDkuOTg1MTkxMzQgTDguODc0MDQ2NywxMi41MTUzNDY3IEw4LjE4NDQ3ODA0LDEyLjUxNTM0NjcgQzcuOTg1ODg2OSwxMi41MTUzNDY3IDcuODE0NTA3OTYsMTIuNjI2NTExNCA3LjczNjkyNDI1LDEyLjgwNjU3NTEgQzcuNjU4NzYxNTUsMTIuOTg2NjM4OCA3LjY5NjM5NTQ0LDEzLjE5NjIzMDYgNy44MzcwODgyOSwxMy4zNDU2MDgyIEw5LjY1NTA5NDY2LDE1LjE2MzYxNDYgWiIgaWQ9InBhdGgtMSI+PC9wYXRoPgogICAgPC9kZWZzPgogICAgPGcgaWQ9IlR1dG9yaWFscy9FeHBhbmQiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxtYXNrIGlkPSJtYXNrLTIiIGZpbGw9IndoaXRlIj4KICAgICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjcGF0aC0xIj48L3VzZT4KICAgICAgICA8L21hc2s+CiAgICAgICAgPGcgaWQ9IkNvbWJpbmVkLVNoYXBlIiBmaWxsLXJ1bGU9Im5vbnplcm8iPjwvZz4KICAgICAgICA8ZyBpZD0iV2hpdGUiIG1hc2s9InVybCgjbWFzay0yKSIgZmlsbD0iI0ZGRkZGRiI+CiAgICAgICAgICAgIDxyZWN0IGlkPSJDb2xvciIgeD0iMCIgeT0iMCIgd2lkdGg9IjIwIiBoZWlnaHQ9IjIwIj48L3JlY3Q+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4=\"\n\n/***/ }),\n/* 383 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUzLjIgKDcyNjQzKSAtIGh0dHBzOi8vc2tldGNoYXBwLmNvbSAtLT4KICAgIDx0aXRsZT5FeHRlbnNpb25zL0Nvbm5lY3Rpb24vQ2xvc2U8L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZGVmcz4KICAgICAgICA8cGF0aCBkPSJNMTUuNDY0OTM1LDE1LjQ2NzI5NyBDMTQuNzY0NDA1OSwxNi4xNzc3NzA1IDEzLjYxODU4NzcsMTYuMTc3NzcwNSAxMi45MDgxMTQyLDE1LjQ2NzI5NyBMOS45OTg4MTg5OSwxMi41NTgwMDE4IEw3LjA4ODQxODg1LDE1LjQ2NzI5NyBDNi4zODIzNjUwNiwxNi4xNzMzNTA4IDUuMjM3NjUxODcsMTYuMTczMzUwOCA0LjUzMTU5ODA3LDE1LjQ2NzI5NyBDNC4xNzkxMjM2NCwxNS4xMTQ4MjI2IDQuMDAwMTI0MDksMTQuNjQ4NTM5OCA0LjAwMDEyNDA5LDE0LjE4ODg4NjYgQzQuMDAwMTI0MDksMTMuNzI4MTI4NSA0LjE3OTEyMzY0LDEzLjI2Mjk1MDYgNC41MzE1OTgwNywxMi45MTA0NzYyIEw3LjQ0MDg5MzI4LDEwLjAwMTE4MSBMNC41MjcxNzgzMyw3LjA4NjM2MTEyIEM0LjE3MzU5ODk3LDYuNzMyNzgxNzYgMy45OTQ1OTk0MSw2LjI2NzYwMzkxIDQuMDAwMTI0MDksNS44MDI0MjYwNiBDNC4wMDAxMjQwOSw1LjM0MTY2Nzk1IDQuMTczNTk4OTcsNC44ODIwMTQ3NyA0LjUyNzE3ODMzLDQuNTI5NTQwMzQgQzUuMjMyMTI3MTksMy44MjM0ODY1NSA2LjM3Njg0MDM4LDMuODIzNDg2NTUgNy4wODM5OTkxMSw0LjUyOTU0MDM0IEw5Ljk5ODgxODk5LDcuNDQzMjU1MjkgTDEyLjkxMjUzMzksNC41Mjk1NDAzNCBDMTMuNjE4NTg3NywzLjgyMzQ4NjU1IDE0Ljc2NDQwNTksMy44MjM0ODY1NSAxNS40NzA0NTk3LDQuNTI5NTQwMzQgQzE2LjE3NjUxMzQsNS4yMzQ0ODkyIDE2LjE3NjUxMzQsNi4zODAzMDczMyAxNS40NzA0NTk3LDcuMDg2MzYxMTIgTDEyLjU1NDUzNDgsMTAuMDAxMTgxIEwxNS40NzA0NTk3LDEyLjkxNDg5NiBDMTYuMTc2NTEzNCwxMy42MjA5NDk3IDE2LjE3NjUxMzQsMTQuNzU1NzE4NSAxNS40NjQ5MzUsMTUuNDY3Mjk3IiBpZD0icGF0aC0xIj48L3BhdGg+CiAgICA8L2RlZnM+CiAgICA8ZyBpZD0iRXh0ZW5zaW9ucy9Db25uZWN0aW9uL0Nsb3NlIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8bWFzayBpZD0ibWFzay0yIiBmaWxsPSJ3aGl0ZSI+CiAgICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI3BhdGgtMSI+PC91c2U+CiAgICAgICAgPC9tYXNrPgogICAgICAgIDx1c2UgaWQ9ImNsb3NlIiBmaWxsPSIjRkZGRkZGIiB4bGluazpocmVmPSIjcGF0aC0xIj48L3VzZT4KICAgICAgICA8ZyBpZD0iV2hpdGUiIG1hc2s9InVybCgjbWFzay0yKSIgZmlsbD0iI0ZGRkZGRiI+CiAgICAgICAgICAgIDxyZWN0IGlkPSJDb2xvciIgeD0iMCIgeT0iMCIgd2lkdGg9IjIwIiBoZWlnaHQ9IjIwIj48L3JlY3Q+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4=\"\n\n/***/ }),\n/* 384 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(529);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 385 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/223d68e7b8769bac1f33291514ce5bac.svg\";\n\n/***/ }),\n/* 386 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/7ad5cc6ed3d0a5fd6a273078fe3999f0.svg\";\n\n/***/ }),\n/* 387 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/cd200d8b59d5c3d4ff3a69a774f5fac3.svg\";\n\n/***/ }),\n/* 388 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIHZpZXdCb3g9Ii0yIC0yIDQ4IDQ4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxjaXJjbGUgY3g9IjIyIiBjeT0iMjIiIHI9IjIzLjUiIGZpbGw9IiM4NTVjZDYiIG9wYWNpdHk9Ii4yNSIvPjxjaXJjbGUgY3g9IjIyIiBjeT0iMjIiIHI9IjE4IiBmaWxsPSIjODU1Y2Q2Ii8+PHBhdGggZD0iTTI1LjQwNCAyMC4xMTFhMy42NiAzLjY2IDAgMCAxIC44OTcgMy4wNjljLS4xOTMgMS4zMDUtMS4xNTggMi41NTEtMi41MDUgMy4wNjhoLS4wMDhhLjkwMS45MDEgMCAwIDAtLjU2IDEuMDUxLjkwOS45MDkgMCAwIDAgMS4wODQuNjc4YzIuMDE1LS40NjYgMy43NzUtMi4wOTMgNC40MS00LjE5NmE2LjQ5NSA2LjQ5NSAwIDAgMCAuMTI4LTMuMjcyIDYuNTE4IDYuNTE4IDAgMCAwLTEuMjM2LTIuNjFsLjg0Ni0uODQ4QS42MTguNjE4IDAgMCAwIDI4LjAyIDE2aC00LjAzN2MtLjM0IDAtLjYxOS4yOC0uNjE5LjYxOXY0LjA0M2MwIC41NTEuNjYxLjgyMiAxLjA1LjQ0em0tNi44MDggMy43NzhhMy42NjIgMy42NjIgMCAwIDEtLjg5Ny0zLjA2OWMuMTk0LTEuMzA1IDEuMTU5LTIuNTUyIDIuNTA1LTMuMDY4aC4wMDhhLjkwMi45MDIgMCAwIDAgLjU1OS0xLjA1MS45MDguOTA4IDAgMCAwLTEuMDgzLS42NzhjLTIuMDE1LjQ2Ni0zLjc3NSAyLjA5My00LjQxIDQuMTk2YTYuNDggNi40OCAwIDAgMC0uMTI3IDMuMjcgNi41MSA2LjUxIDAgMCAwIDEuMjM2IDIuNjExbC0uODQ3Ljg0OGMtLjM4LjM5LS4xMSAxLjA1Mi40NCAxLjA1Mmg0LjAzOGMuMzM4IDAgLjYxOC0uMjguNjE4LS42MnYtNC4wNDJhLjYxNy42MTcgMCAwIDAtMS4wNS0uNDR6IiBmaWxsPSIjZmZmIi8+PC9zdmc+Cg==\"\n\n/***/ }),\n/* 389 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMC40MDQgNC4xMTFhMy42NiAzLjY2IDAgMCAxIC44OTcgMy4wNjljLS4xOTQgMS4zMDUtMS4xNTggMi41NTEtMi41MDUgMy4wNjhoLS4wMDhhLjkwMS45MDEgMCAwIDAtLjU2IDEuMDUxYy4xMTEuNDgzLjYwMi43ODkgMS4wODQuNjc4IDIuMDE1LS40NjYgMy43NzUtMi4wOTMgNC40MS00LjE5NmE2LjQ5NSA2LjQ5NSAwIDAgMCAuMTI4LTMuMjcyIDYuNTE3IDYuNTE3IDAgMCAwLTEuMjM2LTIuNjFsLjg0Ni0uODQ4QS42MTguNjE4IDAgMCAwIDEzLjAyIDBIOC45ODNjLS4zNCAwLS42MTkuMjgtLjYxOS42MTl2NC4wNDNjMCAuNTUxLjY2MS44MjIgMS4wNS40NGwuOTktLjk5ek0zLjU5NiA3Ljg5YTMuNjYzIDMuNjYzIDAgMCAxLS44OTgtMy4wNjljLjE5NS0xLjMwNSAxLjE2LTIuNTUyIDIuNTA2LTMuMDY4aC4wMDhBLjkwMi45MDIgMCAwIDAgNS43NzEuNy45MDguOTA4IDAgMCAwIDQuNjg4LjAyM0MyLjY3My40ODkuOTEzIDIuMTE2LjI3OCA0LjIxOWE2LjQ4MSA2LjQ4MSAwIDAgMC0uMTI3IDMuMjdjLjIwMy45NDIuNjM1IDEuODQgMS4yMzYgMi42MTFsLS44NDcuODQ4Qy4xNiAxMS4zMzguNDMgMTIgLjk4IDEyaDQuMDM4Yy4zMzggMCAuNjE3LS4yOC42MTctLjYyVjcuMzM4YS42MTcuNjE3IDAgMCAwLTEuMDQ5LS40NGwtLjk5Ljk5eiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==\"\n\n/***/ }),\n/* 390 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// This file is generated by scripts/prepublish.mjs\n// Do not edit this file directly\n// This file relies on a loader to turn this `require` into a URL\nmodule.exports = __webpack_require__(533);\n\n\n/***/ }),\n/* 391 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PCEtLSBodHRwczovL21hdGVyaWFsLmlvL3Jlc291cmNlcy9pY29ucy8/c2VhcmNoPWhlbHAmaWNvbj1oZWxwJnN0eWxlPWJhc2VsaW5lIC0tPgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjQiPjxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMSAxN2gtMnYtMmgydjJ6bTIuMDctNy43NWwtLjkuOTJDMTMuNDUgMTIuOSAxMyAxMy41IDEzIDE1aC0ydi0uNWMwLTEuMS40NS0yLjEgMS4xNy0yLjgzbDEuMjQtMS4yNmMuMzctLjM2LjU5LS44Ni41OS0xLjQxIDAtMS4xLS45LTItMi0ycy0yIC45LTIgMkg4YzAtMi4yMSAxLjc5LTQgNC00czQgMS43OSA0IDRjMCAuODgtLjM2IDEuNjgtLjkzIDIuMjV6Ii8+PC9zdmc+\"\n\n/***/ }),\n/* 392 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(539);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 393 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(540);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 394 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar content = __webpack_require__(543);\n\nif(typeof content === 'string') content = [[module.i, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = __webpack_require__(10)(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(false) {}\n\n/***/ }),\n/* 395 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PCEtLSBodHRwczovL2ZvbnRzLmdvb2dsZS5jb20vaWNvbnM/c2VsZWN0ZWQ9TWF0ZXJpYWwrU3ltYm9scytPdXRsaW5lZDpkb3dubG9hZDpGSUxMQDA7d2dodEA0MDA7R1JBREAwO29wc3pANDggLS0+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHZpZXdCb3g9IjAgLTk2MCA5NjAgOTYwIj48cGF0aCBkPSJNNDgwLTI5NC4yMTIgMjY1LjI4Ny01MDguOTI1bDQ3LjgzOC00Ny44MzcgMTMzLjUgMTMzLjVWLTgzNmg2Ni43NXY0MTIuNzM4bDEzMy41LTEzMy41IDQ3LjgzNyA0Ny44Mzd6TTE5MC43NS0xMjRjLTE3LjggMC0zMy4zNzUtNi42NzUtNDYuNzI1LTIwLjAyNUMxMzAuNjc1LTE1Ny4zNzUgMTI0LTE3Mi45NSAxMjQtMTkwLjc1di0xNTkuMDg4aDY2Ljc1djE1OS4wODhoNTc4LjV2LTE1OS4wODdIODM2djE1OS4wODdjMCAxNy44LTYuNjc1IDMzLjM3NS0yMC4wMjUgNDYuNzI1QzgwMi42MjUtMTMwLjY3NSA3ODcuMDUtMTI0IDc2OS4yNS0xMjR6IiBzdHlsZT0iZmlsbDojNTc1ZTc1O2ZpbGwtb3BhY2l0eToxO3N0cm9rZS13aWR0aDoxLjExMjUiLz48L3N2Zz4=\"\n\n/***/ }),\n/* 396 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDQuMjMzIDQuMjMzIj48cmVjdCB3aWR0aD0iLjU3IiBoZWlnaHQ9IjMuNyIgeD0iLTMuMjc4IiB5PSItMS44NSIgcnk9Ii4yODUiIHN0eWxlPSJmaWxsOiM1NzVlNzU7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOi4yMTAzODYiIHRyYW5zZm9ybT0icm90YXRlKC0xMzUpIi8+PHJlY3Qgd2lkdGg9Ii41NyIgaGVpZ2h0PSIzLjciIHg9Ii0uMjg1IiB5PSItNC44NDMiIHJ5PSIuMjg1IiBzdHlsZT0iZmlsbDojNTc1ZTc1O2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDouMjEwMzg2IiB0cmFuc2Zvcm09InJvdGF0ZSgxMzUpIi8+PC9zdmc+\"\n\n/***/ }),\n/* 397 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDQuMjMzIDQuMjMzIj48cmVjdCB3aWR0aD0iLjMxNyIgaGVpZ2h0PSIzLjkyIiB4PSItLjE1OCIgeT0iMS4wMzMiIHJ5PSIuMjMiIHN0eWxlPSJmaWxsOiMxYTFhMWE7c3Ryb2tlLXdpZHRoOi4yOTEzNTUiIHRyYW5zZm9ybT0icm90YXRlKC00NSkiLz48cmVjdCB3aWR0aD0iLjMxNyIgaGVpZ2h0PSIzLjkyIiB4PSItMy4xNTIiIHk9Ii0xLjk2IiByeT0iLjIzIiBzdHlsZT0iZmlsbDojMWExYTFhO3N0cm9rZS13aWR0aDouMjkxMzU1IiB0cmFuc2Zvcm09InNjYWxlKC0xIDEpIHJvdGF0ZSgtNDUpIi8+PC9zdmc+\"\n\n/***/ }),\n/* 398 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"data:image/svg+xml;base64,PCEtLSBodHRwczovL2ZvbnRzLmdvb2dsZS5jb20vaWNvbnM/c2VsZWN0ZWQ9TWF0ZXJpYWwrU3ltYm9scytPdXRsaW5lZDpkb3dubG9hZDpGSUxMQDA7d2dodEA0MDA7R1JBREAwO29wc3pANDggLS0+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBoZWlnaHQ9IjQ4IiB2aWV3Qm94PSIwIC05NjAgOTYwIDk2MCIgd2lkdGg9IjQ4Ij48cGF0aCBkPSJNNDgwLTMxMyAyODctNTA2bDQzLTQzIDEyMCAxMjB2LTM3MWg2MHYzNzFsMTIwLTEyMCA0MyA0My0xOTMgMTkzWk0yMjAtMTYwcS0yNCAwLTQyLTE4dC0xOC00MnYtMTQzaDYwdjE0M2g1MjB2LTE0M2g2MHYxNDNxMCAyNC0xOCA0MnQtNDIgMThIMjIwWiIvPjwvc3ZnPg==\"\n\n/***/ }),\n/* 399 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"static/assets/d259fcbecaa9d2a22d19848daff9d4c6.svg\";\n\n/***/ }),\n/* 400 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nconst runAddons = () => {\n Promise.all(/* import() | addons */[__webpack_require__.e(1), __webpack_require__.e(83)]).then(__webpack_require__.bind(null, 658));\n};\n/* harmony default export */ __webpack_exports__[\"a\"] = (runAddons);\n\n/***/ }),\n/* 401 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// EXTERNAL MODULE: ./node_modules/react/index.js\nvar react = __webpack_require__(1);\nvar react_default = /*#__PURE__*/__webpack_require__.n(react);\n\n// EXTERNAL MODULE: ./node_modules/prop-types/index.js\nvar prop_types = __webpack_require__(0);\nvar prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);\n\n// EXTERNAL MODULE: ./node_modules/redux/es/index.js + 6 modules\nvar es = __webpack_require__(44);\n\n// EXTERNAL MODULE: ./node_modules/react-redux/es/index.js + 14 modules\nvar react_redux_es = __webpack_require__(7);\n\n// EXTERNAL MODULE: ./node_modules/react-modal/lib/index.js\nvar lib = __webpack_require__(96);\nvar lib_default = /*#__PURE__*/__webpack_require__.n(lib);\n\n// EXTERNAL MODULE: ./node_modules/scratch-vm/src/index.js\nvar scratch_vm_src = __webpack_require__(13);\nvar src_default = /*#__PURE__*/__webpack_require__.n(scratch_vm_src);\n\n// EXTERNAL MODULE: ./node_modules/react-intl/lib/index.es.js + 1 modules\nvar index_es = __webpack_require__(2);\n\n// EXTERNAL MODULE: ./src/lib/error-boundary-hoc.jsx + 1 modules\nvar error_boundary_hoc = __webpack_require__(61);\n\n// EXTERNAL MODULE: ./src/reducers/project-state.js\nvar project_state = __webpack_require__(12);\n\n// EXTERNAL MODULE: ./src/reducers/editor-tab.js\nvar editor_tab = __webpack_require__(28);\n\n// EXTERNAL MODULE: ./src/reducers/modals.js\nvar modals = __webpack_require__(14);\n\n// EXTERNAL MODULE: ./node_modules/lodash.omit/index.js\nvar lodash_omit = __webpack_require__(62);\nvar lodash_omit_default = /*#__PURE__*/__webpack_require__.n(lodash_omit);\n\n// EXTERNAL MODULE: ./src/reducers/fonts-loaded.js\nvar fonts_loaded = __webpack_require__(157);\n\n// EXTERNAL MODULE: ./src/lib/tw-scratch-render-fonts/index.js\nvar tw_scratch_render_fonts = __webpack_require__(257);\n\n// CONCATENATED MODULE: ./src/lib/font-loader-hoc.jsx\n\n\n\n\n\n\n\n/* Higher Order Component to provide behavior for loading fonts.\n * @param {React.Component} WrappedComponent component to receive fontsLoaded prop\n * @returns {React.Component} component with font loading behavior\n */\nconst font_loader_hoc_FontLoaderHOC = function FontLoaderHOC(WrappedComponent) {\n class FontLoaderComponent extends react_default.a.Component {\n componentDidMount() {\n if (this.props.fontsLoaded) return;\n Object(tw_scratch_render_fonts[\"loadFonts\"])().then(() => this.props.onSetFontsLoaded());\n }\n render() {\n const componentProps = lodash_omit_default()(this.props, ['onSetFontsLoaded']);\n return /*#__PURE__*/react_default.a.createElement(WrappedComponent, componentProps);\n }\n }\n FontLoaderComponent.propTypes = {\n fontsLoaded: prop_types_default.a.bool.isRequired,\n onSetFontsLoaded: prop_types_default.a.func.isRequired\n };\n const mapStateToProps = state => ({\n fontsLoaded: state.scratchGui.fontsLoaded\n });\n const mapDispatchToProps = dispatch => ({\n onSetFontsLoaded: () => dispatch(Object(fonts_loaded[\"c\" /* setFontsLoaded */])())\n });\n return Object(react_redux_es[\"b\" /* connect */])(mapStateToProps, mapDispatchToProps)(FontLoaderComponent);\n};\n\n// EXTERNAL MODULE: ./src/lib/connected-intl-provider.jsx\nvar connected_intl_provider = __webpack_require__(174);\n\n// CONCATENATED MODULE: ./src/lib/localization-hoc.jsx\nconst _excluded = [\"locale\", \"onSetLanguage\"];\nfunction _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\n\n/*\n * Higher Order Component to provide localiztion state. Creates a nested IntlProvider\n * to handle Gui intl context. The component accepts an onSetLanguage callback that is\n * called when the locale chagnes.\n * @param {React.Component} WrappedComponent - component to provide state for\n * @returns {React.Component} component with intl state provided from redux\n */\nconst localization_hoc_LocalizationHOC = function LocalizationHOC(WrappedComponent) {\n class LocalizationWrapper extends react_default.a.Component {\n componentDidUpdate(prevProps) {\n if (prevProps.locale !== this.props.locale) {\n this.props.onSetLanguage(this.props.locale);\n }\n }\n render() {\n const _this$props = this.props,\n {\n locale,\n // eslint-disable-line no-unused-vars\n onSetLanguage // eslint-disable-line no-unused-vars\n } = _this$props,\n componentProps = _objectWithoutProperties(_this$props, _excluded);\n return /*#__PURE__*/react_default.a.createElement(connected_intl_provider[\"a\" /* default */], null, /*#__PURE__*/react_default.a.createElement(WrappedComponent, componentProps));\n }\n }\n LocalizationWrapper.propTypes = {\n locale: prop_types_default.a.string,\n onSetLanguage: prop_types_default.a.func\n };\n LocalizationWrapper.defaultProps = {\n onSetLanguage: () => {}\n };\n const mapStateToProps = state => ({\n locale: state.locales.locale\n });\n const mapDispatchToProps = () => ({});\n return Object(react_redux_es[\"b\" /* connect */])(mapStateToProps, mapDispatchToProps)(LocalizationWrapper);\n};\n/* harmony default export */ var localization_hoc = (localization_hoc_LocalizationHOC);\n// EXTERNAL MODULE: ./src/lib/sb-file-uploader-hoc.jsx\nvar sb_file_uploader_hoc = __webpack_require__(210);\n\n// EXTERNAL MODULE: ./node_modules/lodash.bindall/index.js\nvar lodash_bindall = __webpack_require__(4);\nvar lodash_bindall_default = /*#__PURE__*/__webpack_require__.n(lodash_bindall);\n\n// EXTERNAL MODULE: ./src/reducers/project-changed.js\nvar project_changed = __webpack_require__(55);\n\n// EXTERNAL MODULE: ./src/lib/log.js\nvar log = __webpack_require__(11);\n\n// EXTERNAL MODULE: ./src/lib/storage.js + 2 modules\nvar lib_storage = __webpack_require__(25);\n\n// EXTERNAL MODULE: ./src/lib/tw-project-meta-fetcher-hoc.jsx\nvar tw_project_meta_fetcher_hoc = __webpack_require__(209);\n\n// CONCATENATED MODULE: ./src/lib/project-fetcher-hoc.jsx\nconst project_fetcher_hoc_excluded = [\"assetHost\", \"intl\", \"isLoadingProject\", \"loadingState\", \"onActivateTab\", \"onError\", \"onFetchedProjectData\", \"onProjectUnchanged\", \"projectHost\", \"projectId\", \"reduxProjectId\", \"setProjectId\", \"isFetchingWithId\"];\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nfunction project_fetcher_hoc_objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = project_fetcher_hoc_objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction project_fetcher_hoc_objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\n\n\n\n\n\n\n\n\n\n// TW: Temporary hack for project tokens\nconst fetchProjectToken = async projectId => {\n if (projectId === '0') {\n return null;\n }\n // Parse ?token=abcdef\n const searchParams = new URLSearchParams(location.search);\n if (searchParams.has('token')) {\n return searchParams.get('token');\n }\n // Parse #1?token=abcdef\n const hashParams = new URLSearchParams(location.hash.split('?')[1]);\n if (hashParams.has('token')) {\n return hashParams.get('token');\n }\n try {\n const metadata = await Object(tw_project_meta_fetcher_hoc[\"b\" /* fetchProjectMeta */])(projectId);\n return metadata.project_token;\n } catch (e) {\n log[\"default\"].error(e);\n throw new Error('Cannot access project token. Project is probably unshared. See https://docs.turbowarp.org/unshared-projects');\n }\n};\n\n/* Higher Order Component to provide behavior for loading projects by id. If\n * there's no id, the default project is loaded.\n * @param {React.Component} WrappedComponent component to receive projectData prop\n * @returns {React.Component} component with project loading behavior\n */\nconst project_fetcher_hoc_ProjectFetcherHOC = function ProjectFetcherHOC(WrappedComponent) {\n class ProjectFetcherComponent extends react_default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['fetchProject']);\n lib_storage[\"a\" /* default */].setProjectHost(props.projectHost);\n lib_storage[\"a\" /* default */].setProjectToken(props.projectToken);\n lib_storage[\"a\" /* default */].setAssetHost(props.assetHost);\n lib_storage[\"a\" /* default */].setTranslatorFunction(props.intl.formatMessage);\n // props.projectId might be unset, in which case we use our default;\n // or it may be set by an even higher HOC, and passed to us.\n // Either way, we now know what the initial projectId should be, so\n // set it in the redux store.\n if (props.projectId !== '' && props.projectId !== null && typeof props.projectId !== 'undefined') {\n this.props.setProjectId(props.projectId.toString());\n }\n }\n componentDidUpdate(prevProps) {\n if (prevProps.projectHost !== this.props.projectHost) {\n lib_storage[\"a\" /* default */].setProjectHost(this.props.projectHost);\n }\n if (prevProps.projectToken !== this.props.projectToken) {\n lib_storage[\"a\" /* default */].setProjectToken(this.props.projectToken);\n }\n if (prevProps.assetHost !== this.props.assetHost) {\n lib_storage[\"a\" /* default */].setAssetHost(this.props.assetHost);\n }\n if (this.props.isFetchingWithId && !prevProps.isFetchingWithId) {\n this.fetchProject(this.props.reduxProjectId, this.props.loadingState);\n }\n if (this.props.isShowingProject && !prevProps.isShowingProject) {\n this.props.onProjectUnchanged();\n }\n if (this.props.isShowingProject && (prevProps.isLoadingProject || prevProps.isCreatingNew)) {\n this.props.onActivateTab(editor_tab[\"a\" /* BLOCKS_TAB_INDEX */]);\n }\n }\n fetchProject(projectId, loadingState) {\n // tw: clear and stop the VM before fetching\n // these will also happen later after the project is fetched, but fetching may take a while and\n // the project shouldn't be running while fetching the new project\n this.props.vm.clear();\n this.props.vm.quit();\n let assetPromise;\n // In case running in node...\n let projectUrl = typeof URLSearchParams === 'undefined' ? null : new URLSearchParams(location.search).get('project_url');\n if (projectUrl) {\n if (!projectUrl.startsWith('http:') && !projectUrl.startsWith('https:') && !projectUrl.startsWith('data:')) {\n projectUrl = \"https://\".concat(projectUrl);\n }\n assetPromise = fetch(projectUrl).then(r => {\n if (!r.ok) {\n throw new Error(\"Request returned status \".concat(r.status));\n }\n return r.arrayBuffer();\n }).then(buffer => ({\n data: buffer\n }));\n } else {\n // TW: Temporary hack for project tokens\n assetPromise = fetchProjectToken(projectId).then(token => {\n lib_storage[\"a\" /* default */].setProjectToken(token);\n return lib_storage[\"a\" /* default */].load(lib_storage[\"a\" /* default */].AssetType.Project, projectId, lib_storage[\"a\" /* default */].DataFormat.JSON);\n });\n }\n return assetPromise.then(projectAsset => {\n if (projectAsset) {\n this.props.onFetchedProjectData(projectAsset.data, loadingState);\n } else {\n // Treat failure to load as an error\n // Throw to be caught by catch later on\n throw new Error('Could not find project');\n }\n }).catch(err => {\n this.props.onError(err);\n log[\"default\"].error(err);\n });\n }\n render() {\n const _this$props = this.props,\n {\n /* eslint-disable no-unused-vars */\n assetHost,\n intl,\n isLoadingProject: isLoadingProjectProp,\n loadingState,\n onActivateTab,\n onError: onErrorProp,\n onFetchedProjectData: onFetchedProjectDataProp,\n onProjectUnchanged,\n projectHost,\n projectId,\n reduxProjectId,\n setProjectId: setProjectIdProp,\n /* eslint-enable no-unused-vars */\n isFetchingWithId: isFetchingWithIdProp\n } = _this$props,\n componentProps = project_fetcher_hoc_objectWithoutProperties(_this$props, project_fetcher_hoc_excluded);\n return /*#__PURE__*/react_default.a.createElement(WrappedComponent, _extends({\n fetchingProject: isFetchingWithIdProp\n }, componentProps));\n }\n }\n ProjectFetcherComponent.propTypes = {\n assetHost: prop_types_default.a.string,\n canSave: prop_types_default.a.bool,\n intl: index_es[\"i\" /* intlShape */].isRequired,\n isCreatingNew: prop_types_default.a.bool,\n isFetchingWithId: prop_types_default.a.bool,\n isLoadingProject: prop_types_default.a.bool,\n isShowingProject: prop_types_default.a.bool,\n loadingState: prop_types_default.a.oneOf(project_state[\"a\" /* LoadingStates */]),\n onActivateTab: prop_types_default.a.func,\n onError: prop_types_default.a.func,\n onFetchedProjectData: prop_types_default.a.func,\n onProjectUnchanged: prop_types_default.a.func,\n projectHost: prop_types_default.a.string,\n projectToken: prop_types_default.a.string,\n projectId: prop_types_default.a.oneOfType([prop_types_default.a.string, prop_types_default.a.number]),\n reduxProjectId: prop_types_default.a.oneOfType([prop_types_default.a.string, prop_types_default.a.number]),\n setProjectId: prop_types_default.a.func,\n vm: prop_types_default.a.instanceOf(src_default.a)\n };\n ProjectFetcherComponent.defaultProps = {\n assetHost: 'https://assets.scratch.mit.edu',\n projectHost: 'https://projects.scratch.mit.edu'\n };\n const mapStateToProps = state => ({\n isCreatingNew: Object(project_state[\"j\" /* getIsCreatingNew */])(state.scratchGui.projectState.loadingState),\n isFetchingWithId: Object(project_state[\"l\" /* getIsFetchingWithId */])(state.scratchGui.projectState.loadingState),\n isLoadingProject: Object(project_state[\"m\" /* getIsLoading */])(state.scratchGui.projectState.loadingState),\n isShowingProject: Object(project_state[\"r\" /* getIsShowingProject */])(state.scratchGui.projectState.loadingState),\n loadingState: state.scratchGui.projectState.loadingState,\n reduxProjectId: state.scratchGui.projectState.projectId,\n vm: state.scratchGui.vm\n });\n const mapDispatchToProps = dispatch => ({\n onActivateTab: tab => dispatch(Object(editor_tab[\"d\" /* activateTab */])(tab)),\n onError: error => dispatch(Object(project_state[\"y\" /* projectError */])(error)),\n onFetchedProjectData: (projectData, loadingState) => dispatch(Object(project_state[\"w\" /* onFetchedProjectData */])(projectData, loadingState)),\n setProjectId: projectId => dispatch(Object(project_state[\"E\" /* setProjectId */])(projectId)),\n onProjectUnchanged: () => dispatch(Object(project_changed[\"d\" /* setProjectUnchanged */])())\n });\n // Allow incoming props to override redux-provided props. Used to mock in tests.\n const mergeProps = (stateProps, dispatchProps, ownProps) => Object.assign({}, stateProps, dispatchProps, ownProps);\n return Object(index_es[\"h\" /* injectIntl */])(Object(react_redux_es[\"b\" /* connect */])(mapStateToProps, mapDispatchToProps, mergeProps)(ProjectFetcherComponent));\n};\n\n// EXTERNAL MODULE: ./src/reducers/project-title.js\nvar project_title = __webpack_require__(56);\n\n// CONCATENATED MODULE: ./src/lib/titled-hoc.jsx\nconst titled_hoc_excluded = [\"intl\", \"isAnyCreatingNewState\", \"isShowingWithoutId\", \"onChangedProjectTitle\", \"onUpdateProjectTitle\", \"projectTitle\", \"reduxProjectTitle\"];\nfunction titled_hoc_objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = titled_hoc_objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction titled_hoc_objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\n\n\nconst titled_hoc_messages = Object(index_es[\"g\" /* defineMessages */])({\n defaultProjectTitle: {\n \"id\": \"tw.gui.defaultProjectTitle\",\n \"defaultMessage\": \"Project\"\n }\n});\n\n/* Higher Order Component to get and set the project title\n * @param {React.Component} WrappedComponent component to receive project title related props\n * @returns {React.Component} component with project loading behavior\n */\nconst titled_hoc_TitledHOC = function TitledHOC(WrappedComponent) {\n class TitledComponent extends react_default.a.Component {\n componentDidMount() {\n this.handleReceivedProjectTitle(this.props.projectTitle);\n }\n componentDidUpdate(prevProps) {\n if (this.props.projectTitle !== prevProps.projectTitle) {\n this.handleReceivedProjectTitle(this.props.projectTitle);\n }\n // if project is a new default project, and has loaded,\n if (this.props.isShowingWithoutId && prevProps.isAnyCreatingNewState) {\n // reset title to default\n const defaultProjectTitle = this.handleReceivedProjectTitle();\n this.props.onUpdateProjectTitle(defaultProjectTitle, true);\n }\n // if the projectTitle hasn't changed, but the reduxProjectTitle\n // HAS changed, we need to report that change to the projectTitle's owner\n if (this.props.reduxProjectTitle !== prevProps.reduxProjectTitle && this.props.reduxProjectTitle !== this.props.projectTitle) {\n const defaultProjectTitle = this.props.intl.formatMessage(titled_hoc_messages.defaultProjectTitle);\n this.props.onUpdateProjectTitle(this.props.reduxProjectTitle, this.props.reduxProjectTitle === defaultProjectTitle);\n }\n }\n handleReceivedProjectTitle(requestedTitle) {\n let newTitle = requestedTitle;\n let isDefault = false;\n if (newTitle === null || typeof newTitle === 'undefined') {\n newTitle = this.props.intl.formatMessage(titled_hoc_messages.defaultProjectTitle);\n isDefault = true;\n }\n this.props.onChangedProjectTitle(newTitle, isDefault);\n return newTitle;\n }\n render() {\n const _this$props = this.props,\n {\n /* eslint-disable no-unused-vars */\n intl,\n isAnyCreatingNewState,\n isShowingWithoutId,\n onChangedProjectTitle,\n // for children, we replace onUpdateProjectTitle with our own\n onUpdateProjectTitle,\n // we don't pass projectTitle prop to children -- they must use\n // redux value\n projectTitle,\n reduxProjectTitle\n /* eslint-enable no-unused-vars */\n } = _this$props,\n componentProps = titled_hoc_objectWithoutProperties(_this$props, titled_hoc_excluded);\n return /*#__PURE__*/react_default.a.createElement(WrappedComponent, componentProps);\n }\n }\n TitledComponent.propTypes = {\n intl: index_es[\"i\" /* intlShape */],\n isAnyCreatingNewState: prop_types_default.a.bool,\n isShowingWithoutId: prop_types_default.a.bool,\n onChangedProjectTitle: prop_types_default.a.func,\n onUpdateProjectTitle: prop_types_default.a.func,\n projectTitle: prop_types_default.a.string,\n reduxProjectTitle: prop_types_default.a.string\n };\n TitledComponent.defaultProps = {\n onUpdateProjectTitle: () => {}\n };\n const mapStateToProps = state => {\n const loadingState = state.scratchGui.projectState.loadingState;\n return {\n isAnyCreatingNewState: Object(project_state[\"h\" /* getIsAnyCreatingNewState */])(loadingState),\n isShowingWithoutId: Object(project_state[\"t\" /* getIsShowingWithoutId */])(loadingState),\n reduxProjectTitle: state.scratchGui.projectTitle\n };\n };\n const mapDispatchToProps = dispatch => ({\n onChangedProjectTitle: title => dispatch(Object(project_title[\"c\" /* setProjectTitle */])(title))\n });\n return Object(index_es[\"h\" /* injectIntl */])(Object(react_redux_es[\"b\" /* connect */])(mapStateToProps, mapDispatchToProps)(TitledComponent));\n};\n\n// EXTERNAL MODULE: ./src/lib/collect-metadata.js\nvar collect_metadata = __webpack_require__(183);\n\n// EXTERNAL MODULE: ./src/lib/data-uri-to-blob.js\nvar data_uri_to_blob = __webpack_require__(265);\n\n// EXTERNAL MODULE: ./node_modules/query-string/index.js\nvar query_string = __webpack_require__(402);\nvar query_string_default = /*#__PURE__*/__webpack_require__.n(query_string);\n\n// EXTERNAL MODULE: ./node_modules/xhr/index.js\nvar xhr = __webpack_require__(130);\nvar xhr_default = /*#__PURE__*/__webpack_require__.n(xhr);\n\n// CONCATENATED MODULE: ./src/lib/save-project-to-server.js\n\n\n\n\n/**\n * Save a project JSON to the project server.\n * This should eventually live in scratch-www.\n * @param {number} projectId the ID of the project, null if a new project.\n * @param {object} vmState the JSON project representation.\n * @param {object} params the request params.\n * @property {?number} params.originalId the original project ID if a copy/remix.\n * @property {?boolean} params.isCopy a flag indicating if this save is creating a copy.\n * @property {?boolean} params.isRemix a flag indicating if this save is creating a remix.\n * @property {?string} params.title the title of the project.\n * @return {Promise} A promise that resolves when the network request resolves.\n */\n/* harmony default export */ var save_project_to_server = (function (projectId, vmState, params) {\n const opts = {\n body: vmState,\n // If we set json:true then the body is double-stringified, so don't\n headers: {\n 'Content-Type': 'application/json'\n },\n withCredentials: true\n };\n const creatingProject = projectId === null || typeof projectId === 'undefined';\n const queryParams = {};\n if (Object.prototype.hasOwnProperty.call(params, 'originalId')) queryParams.original_id = params.originalId;\n if (Object.prototype.hasOwnProperty.call(params, 'isCopy')) queryParams.is_copy = params.isCopy;\n if (Object.prototype.hasOwnProperty.call(params, 'isRemix')) queryParams.is_remix = params.isRemix;\n if (Object.prototype.hasOwnProperty.call(params, 'title')) queryParams.title = params.title;\n let qs = query_string_default.a.stringify(queryParams);\n if (qs) qs = \"?\".concat(qs);\n if (creatingProject) {\n Object.assign(opts, {\n method: 'post',\n url: \"\".concat(lib_storage[\"a\" /* default */].projectHost, \"/\").concat(qs)\n });\n } else {\n Object.assign(opts, {\n method: 'put',\n url: \"\".concat(lib_storage[\"a\" /* default */].projectHost, \"/\").concat(projectId).concat(qs)\n });\n }\n return new Promise((resolve, reject) => {\n xhr_default()(opts, (err, response) => {\n if (err) return reject(err);\n if (response.statusCode !== 200) return reject(response.statusCode);\n let body;\n try {\n // Since we didn't set json: true, we have to parse manually\n body = JSON.parse(response.body);\n } catch (e) {\n return reject(e);\n }\n body.id = projectId;\n if (creatingProject) {\n body.id = body['content-name'];\n }\n resolve(body);\n });\n });\n});\n// EXTERNAL MODULE: ./src/reducers/alerts.js\nvar alerts = __webpack_require__(20);\n\n// EXTERNAL MODULE: ./src/reducers/timeout.js\nvar reducers_timeout = __webpack_require__(158);\n\n// CONCATENATED MODULE: ./src/lib/project-saver-hoc.jsx\nconst project_saver_hoc_excluded = [\"autoSaveTimeoutId\", \"autoSaveIntervalSecs\", \"isCreatingCopy\", \"isCreatingNew\", \"projectChanged\", \"isAnyCreatingNewState\", \"isLoading\", \"isManualUpdating\", \"isRemixing\", \"isShowingSaveable\", \"isShowingWithId\", \"isShowingWithoutId\", \"isUpdating\", \"loadingState\", \"onAutoUpdateProject\", \"onCreatedProject\", \"onCreateProject\", \"onProjectError\", \"onRemixing\", \"onSetProjectUnchanged\", \"onSetProjectThumbnailer\", \"onSetProjectSaver\", \"onShowAlert\", \"onShowCopySuccessAlert\", \"onShowRemixSuccessAlert\", \"onShowCreatingCopyAlert\", \"onShowCreatingRemixAlert\", \"onShowSaveSuccessAlert\", \"onShowSavingAlert\", \"onUpdatedProject\", \"onUpdateProjectData\", \"onUpdateProjectThumbnail\", \"reduxProjectId\", \"reduxProjectTitle\", \"setAutoSaveTimeoutId\"];\nfunction project_saver_hoc_extends() { return project_saver_hoc_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, project_saver_hoc_extends.apply(null, arguments); }\nfunction project_saver_hoc_objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = project_saver_hoc_objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction project_saver_hoc_objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Higher Order Component to provide behavior for saving projects.\n * @param {React.Component} WrappedComponent the component to add project saving functionality to\n * @returns {React.Component} WrappedComponent with project saving functionality added\n *\n * \n * \n * \n */\nconst project_saver_hoc_ProjectSaverHOC = function ProjectSaverHOC(WrappedComponent) {\n class ProjectSaverComponent extends react_default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['getProjectThumbnail', 'leavePageConfirm', 'tryToAutoSave']);\n }\n componentWillMount() {\n if (typeof window === 'object') {\n // Note: it might be better to use a listener instead of assigning onbeforeunload;\n // but then it'd be hard to turn this listening off in our tests\n window.onbeforeunload = e => this.leavePageConfirm(e);\n }\n\n // Allow the GUI consumer to pass in a function to receive a trigger\n // for triggering thumbnail or whole project saves.\n // These functions are called with null on unmount to prevent stale references.\n this.props.onSetProjectThumbnailer(this.getProjectThumbnail);\n this.props.onSetProjectSaver(this.tryToAutoSave);\n }\n componentDidUpdate(prevProps) {\n if (!this.props.isAnyCreatingNewState && prevProps.isAnyCreatingNewState) {\n this.reportTelemetryEvent('projectWasCreated');\n }\n if (!this.props.isLoading && prevProps.isLoading) {\n this.reportTelemetryEvent('projectDidLoad');\n }\n if (this.props.projectChanged && !prevProps.projectChanged) {\n this.scheduleAutoSave();\n }\n if (this.props.isUpdating && !prevProps.isUpdating) {\n this.updateProjectToStorage();\n }\n if (this.props.isCreatingNew && !prevProps.isCreatingNew) {\n this.createNewProjectToStorage();\n }\n if (this.props.isCreatingCopy && !prevProps.isCreatingCopy) {\n this.createCopyToStorage();\n }\n if (this.props.isRemixing && !prevProps.isRemixing) {\n this.props.onRemixing(true);\n this.createRemixToStorage();\n } else if (!this.props.isRemixing && prevProps.isRemixing) {\n this.props.onRemixing(false);\n }\n\n // see if we should \"create\" the current project on the server\n //\n // don't try to create or save immediately after trying to create\n if (prevProps.isCreatingNew) return;\n // if we're newly able to create this project, create it!\n if (this.isShowingCreatable(this.props) && !this.isShowingCreatable(prevProps)) {\n this.props.onCreateProject();\n }\n\n // see if we should save/update the current project on the server\n //\n // don't try to save immediately after trying to save\n if (prevProps.isUpdating) return;\n // if we're newly able to save this project, save it!\n const becameAbleToSave = this.props.canSave && !prevProps.canSave;\n const becameShared = this.props.isShared && !prevProps.isShared;\n if (this.props.isShowingSaveable && (becameAbleToSave || becameShared)) {\n this.props.onAutoUpdateProject();\n }\n }\n componentWillUnmount() {\n this.clearAutoSaveTimeout();\n // Cant unset the beforeunload because it might no longer belong to this component\n // i.e. if another of this component has been mounted before this one gets unmounted\n // which happens when going from project to editor view.\n // window.onbeforeunload = undefined; // eslint-disable-line no-undefined\n // Remove project thumbnailer function since the components are unmounting\n this.props.onSetProjectThumbnailer(null);\n this.props.onSetProjectSaver(null);\n }\n leavePageConfirm(e) {\n if (this.props.projectChanged) {\n // both methods of returning a value may be necessary for browser compatibility\n (e || window.event).returnValue = true;\n return true;\n }\n return; // Returning undefined prevents the prompt from coming up\n }\n clearAutoSaveTimeout() {\n if (this.props.autoSaveTimeoutId !== null) {\n clearTimeout(this.props.autoSaveTimeoutId);\n this.props.setAutoSaveTimeoutId(null);\n }\n }\n scheduleAutoSave() {\n if (this.props.isShowingSaveable && this.props.autoSaveTimeoutId === null) {\n const timeoutId = setTimeout(this.tryToAutoSave, this.props.autoSaveIntervalSecs * 1000);\n this.props.setAutoSaveTimeoutId(timeoutId);\n }\n }\n tryToAutoSave() {\n if (this.props.projectChanged && this.props.isShowingSaveable) {\n this.props.onAutoUpdateProject();\n }\n }\n isShowingCreatable(props) {\n return props.canCreateNew && props.isShowingWithoutId;\n }\n updateProjectToStorage() {\n this.props.onShowSavingAlert();\n return this.storeProject(this.props.reduxProjectId).then(() => {\n // there's an http response object available here, but we don't need to examine\n // it, because there are no values contained in it that we care about\n this.props.onUpdatedProject(this.props.loadingState);\n this.props.onShowSaveSuccessAlert();\n }).catch(err => {\n // Always show the savingError alert because it gives the\n // user the chance to download or retry the save manually.\n this.props.onShowAlert('savingError');\n this.props.onProjectError(err);\n });\n }\n createNewProjectToStorage() {\n return this.storeProject(null).then(response => {\n this.props.onCreatedProject(response.id.toString(), this.props.loadingState);\n }).catch(err => {\n this.props.onShowAlert('creatingError');\n this.props.onProjectError(err);\n });\n }\n createCopyToStorage() {\n this.props.onShowCreatingCopyAlert();\n return this.storeProject(null, {\n originalId: this.props.reduxProjectId,\n isCopy: 1,\n title: this.props.reduxProjectTitle\n }).then(response => {\n this.props.onCreatedProject(response.id.toString(), this.props.loadingState);\n this.props.onShowCopySuccessAlert();\n }).catch(err => {\n this.props.onShowAlert('creatingError');\n this.props.onProjectError(err);\n });\n }\n createRemixToStorage() {\n this.props.onShowCreatingRemixAlert();\n return this.storeProject(null, {\n originalId: this.props.reduxProjectId,\n isRemix: 1,\n title: this.props.reduxProjectTitle\n }).then(response => {\n this.props.onCreatedProject(response.id.toString(), this.props.loadingState);\n this.props.onShowRemixSuccessAlert();\n }).catch(err => {\n this.props.onShowAlert('creatingError');\n this.props.onProjectError(err);\n });\n }\n /**\n * storeProject:\n * @param {number|string|undefined} projectId - defined value will PUT/update; undefined/null will POST/create\n * @return {Promise} - resolves with json object containing project's existing or new id\n * @param {?object} requestParams - object of params to add to request body\n */\n storeProject(projectId, requestParams) {\n requestParams = requestParams || {};\n this.clearAutoSaveTimeout();\n // Serialize VM state now before embarking on\n // the asynchronous journey of storing assets to\n // the server. This ensures that assets don't update\n // while in the process of saving a project (e.g. the\n // serialized project refers to a newer asset than what\n // we just finished saving).\n const savedVMState = this.props.vm.toJSON();\n return Promise.all(this.props.vm.assets.filter(asset => !asset.clean).map(asset => lib_storage[\"a\" /* default */].store(asset.assetType, asset.dataFormat, asset.data, asset.assetId).then(response => {\n // Asset servers respond with {status: ok} for successful POSTs\n if (response.status !== 'ok') {\n // Errors include a `code` property, e.g. \"Forbidden\"\n return Promise.reject(response.code);\n }\n asset.clean = true;\n }))).then(() => this.props.onUpdateProjectData(projectId, savedVMState, requestParams)).then(response => {\n this.props.onSetProjectUnchanged();\n const id = response.id.toString();\n if (id && this.props.onUpdateProjectThumbnail) {\n this.storeProjectThumbnail(id);\n }\n this.reportTelemetryEvent('projectDidSave');\n return response;\n }).catch(err => {\n log[\"default\"].error(err);\n throw err; // pass the error up the chain\n });\n }\n\n /**\n * Store a snapshot of the project once it has been saved/created.\n * Needs to happen _after_ save because the project must have an ID.\n * @param {!string} projectId - id of the project, must be defined.\n */\n storeProjectThumbnail(projectId) {\n try {\n this.getProjectThumbnail(dataURI => {\n this.props.onUpdateProjectThumbnail(projectId, Object(data_uri_to_blob[\"a\" /* default */])(dataURI));\n });\n } catch (e) {\n log[\"default\"].error('Project thumbnail save error', e);\n // This is intentionally fire/forget because a failure\n // to save the thumbnail is not vitally important to the user.\n }\n }\n getProjectThumbnail(callback) {\n this.props.vm.postIOData('video', {\n forceTransparentPreview: true\n });\n this.props.vm.renderer.requestSnapshot(dataURI => {\n this.props.vm.postIOData('video', {\n forceTransparentPreview: false\n });\n callback(dataURI);\n });\n this.props.vm.renderer.draw();\n }\n\n /**\n * Report a telemetry event.\n * @param {string} event - one of `projectWasCreated`, `projectDidLoad`, `projectDidSave`, `projectWasUploaded`\n */\n // TODO make a telemetry HOC and move this stuff there\n reportTelemetryEvent(event) {\n try {\n if (this.props.onProjectTelemetryEvent) {\n const metadata = Object(collect_metadata[\"a\" /* default */])(this.props.vm, this.props.reduxProjectTitle, this.props.locale);\n this.props.onProjectTelemetryEvent(event, metadata);\n }\n } catch (e) {\n log[\"default\"].error('Telemetry error', event, e);\n // This is intentionally fire/forget because a failure\n // to report telemetry should not block saving\n }\n }\n render() {\n const _this$props = this.props,\n {\n /* eslint-disable no-unused-vars */\n autoSaveTimeoutId,\n autoSaveIntervalSecs,\n isCreatingCopy,\n isCreatingNew,\n projectChanged,\n isAnyCreatingNewState,\n isLoading,\n isManualUpdating,\n isRemixing,\n isShowingSaveable,\n isShowingWithId,\n isShowingWithoutId,\n isUpdating,\n loadingState,\n onAutoUpdateProject,\n onCreatedProject,\n onCreateProject,\n onProjectError,\n onRemixing,\n onSetProjectUnchanged,\n onSetProjectThumbnailer,\n onSetProjectSaver,\n onShowAlert,\n onShowCopySuccessAlert,\n onShowRemixSuccessAlert,\n onShowCreatingCopyAlert,\n onShowCreatingRemixAlert,\n onShowSaveSuccessAlert,\n onShowSavingAlert,\n onUpdatedProject,\n onUpdateProjectData,\n onUpdateProjectThumbnail,\n reduxProjectId,\n reduxProjectTitle,\n setAutoSaveTimeoutId: setAutoSaveTimeoutIdProp\n /* eslint-enable no-unused-vars */\n } = _this$props,\n componentProps = project_saver_hoc_objectWithoutProperties(_this$props, project_saver_hoc_excluded);\n return /*#__PURE__*/react_default.a.createElement(WrappedComponent, project_saver_hoc_extends({\n isCreating: isAnyCreatingNewState\n }, componentProps));\n }\n }\n ProjectSaverComponent.propTypes = {\n autoSaveIntervalSecs: prop_types_default.a.number.isRequired,\n autoSaveTimeoutId: prop_types_default.a.number,\n canCreateNew: prop_types_default.a.bool,\n canSave: prop_types_default.a.bool,\n isAnyCreatingNewState: prop_types_default.a.bool,\n isCreatingCopy: prop_types_default.a.bool,\n isCreatingNew: prop_types_default.a.bool,\n isLoading: prop_types_default.a.bool,\n isManualUpdating: prop_types_default.a.bool,\n isRemixing: prop_types_default.a.bool,\n isShared: prop_types_default.a.bool,\n isShowingSaveable: prop_types_default.a.bool,\n isShowingWithId: prop_types_default.a.bool,\n isShowingWithoutId: prop_types_default.a.bool,\n isUpdating: prop_types_default.a.bool,\n loadingState: prop_types_default.a.oneOf(project_state[\"a\" /* LoadingStates */]),\n locale: prop_types_default.a.string.isRequired,\n onAutoUpdateProject: prop_types_default.a.func,\n onCreateProject: prop_types_default.a.func,\n onCreatedProject: prop_types_default.a.func,\n onProjectError: prop_types_default.a.func,\n onProjectTelemetryEvent: prop_types_default.a.func,\n onRemixing: prop_types_default.a.func,\n onSetProjectSaver: prop_types_default.a.func.isRequired,\n onSetProjectThumbnailer: prop_types_default.a.func.isRequired,\n onSetProjectUnchanged: prop_types_default.a.func.isRequired,\n onShowAlert: prop_types_default.a.func,\n onShowCopySuccessAlert: prop_types_default.a.func,\n onShowCreatingCopyAlert: prop_types_default.a.func,\n onShowCreatingRemixAlert: prop_types_default.a.func,\n onShowRemixSuccessAlert: prop_types_default.a.func,\n onShowSaveSuccessAlert: prop_types_default.a.func,\n onShowSavingAlert: prop_types_default.a.func,\n onUpdateProjectData: prop_types_default.a.func.isRequired,\n onUpdateProjectThumbnail: prop_types_default.a.func,\n onUpdatedProject: prop_types_default.a.func,\n projectChanged: prop_types_default.a.bool,\n reduxProjectId: prop_types_default.a.oneOfType([prop_types_default.a.string, prop_types_default.a.number]),\n reduxProjectTitle: prop_types_default.a.string,\n setAutoSaveTimeoutId: prop_types_default.a.func.isRequired,\n vm: prop_types_default.a.instanceOf(src_default.a).isRequired\n };\n ProjectSaverComponent.defaultProps = {\n autoSaveIntervalSecs: 600,\n // 10 minutes = 600 seconds\n onRemixing: () => {},\n onSetProjectThumbnailer: () => {},\n onSetProjectSaver: () => {},\n onUpdateProjectData: save_project_to_server\n };\n const mapStateToProps = (state, ownProps) => {\n const loadingState = state.scratchGui.projectState.loadingState;\n const isShowingWithId = Object(project_state[\"s\" /* getIsShowingWithId */])(loadingState);\n return {\n autoSaveTimeoutId: state.scratchGui.timeout.autoSaveTimeoutId,\n isAnyCreatingNewState: Object(project_state[\"h\" /* getIsAnyCreatingNewState */])(loadingState),\n isLoading: Object(project_state[\"m\" /* getIsLoading */])(loadingState),\n isCreatingCopy: Object(project_state[\"i\" /* getIsCreatingCopy */])(loadingState),\n isCreatingNew: Object(project_state[\"j\" /* getIsCreatingNew */])(loadingState),\n isRemixing: Object(project_state[\"q\" /* getIsRemixing */])(loadingState),\n isShowingSaveable: ownProps.canSave && isShowingWithId,\n isShowingWithId: isShowingWithId,\n isShowingWithoutId: Object(project_state[\"t\" /* getIsShowingWithoutId */])(loadingState),\n isUpdating: Object(project_state[\"u\" /* getIsUpdating */])(loadingState),\n isManualUpdating: Object(project_state[\"p\" /* getIsManualUpdating */])(loadingState),\n loadingState: loadingState,\n locale: state.locales.locale,\n projectChanged: state.scratchGui.projectChanged,\n reduxProjectId: state.scratchGui.projectState.projectId,\n reduxProjectTitle: state.scratchGui.projectTitle,\n vm: state.scratchGui.vm\n };\n };\n const mapDispatchToProps = dispatch => ({\n onAutoUpdateProject: () => dispatch(Object(project_state[\"b\" /* autoUpdateProject */])()),\n onCreatedProject: (projectId, loadingState) => dispatch(Object(project_state[\"f\" /* doneCreatingProject */])(projectId, loadingState)),\n onCreateProject: () => dispatch(Object(project_state[\"c\" /* createProject */])()),\n onProjectError: error => dispatch(Object(project_state[\"y\" /* projectError */])(error)),\n onSetProjectUnchanged: () => dispatch(Object(project_changed[\"d\" /* setProjectUnchanged */])()),\n onShowAlert: alertType => dispatch(Object(alerts[\"i\" /* showStandardAlert */])(alertType)),\n onShowCopySuccessAlert: () => Object(alerts[\"g\" /* showAlertWithTimeout */])(dispatch, 'createCopySuccess'),\n onShowRemixSuccessAlert: () => Object(alerts[\"g\" /* showAlertWithTimeout */])(dispatch, 'createRemixSuccess'),\n onShowCreatingCopyAlert: () => Object(alerts[\"g\" /* showAlertWithTimeout */])(dispatch, 'creatingCopy'),\n onShowCreatingRemixAlert: () => Object(alerts[\"g\" /* showAlertWithTimeout */])(dispatch, 'creatingRemix'),\n onShowSaveSuccessAlert: () => Object(alerts[\"g\" /* showAlertWithTimeout */])(dispatch, 'saveSuccess'),\n onShowSavingAlert: () => Object(alerts[\"g\" /* showAlertWithTimeout */])(dispatch, 'saving'),\n onUpdatedProject: loadingState => dispatch(Object(project_state[\"g\" /* doneUpdatingProject */])(loadingState)),\n setAutoSaveTimeoutId: id => dispatch(Object(reducers_timeout[\"b\" /* setAutoSaveTimeoutId */])(id))\n });\n // Allow incoming props to override redux-provided props. Used to mock in tests.\n const mergeProps = (stateProps, dispatchProps, ownProps) => Object.assign({}, stateProps, dispatchProps, ownProps);\n return Object(react_redux_es[\"b\" /* connect */])(mapStateToProps, mapDispatchToProps, mergeProps)(ProjectSaverComponent);\n};\n\n// EXTERNAL MODULE: ./src/reducers/targets.js\nvar targets = __webpack_require__(119);\n\n// EXTERNAL MODULE: ./src/reducers/block-drag.js\nvar block_drag = __webpack_require__(154);\n\n// EXTERNAL MODULE: ./src/reducers/monitors.js\nvar monitors = __webpack_require__(156);\n\n// EXTERNAL MODULE: ./src/reducers/vm-status.js\nvar vm_status = __webpack_require__(73);\n\n// EXTERNAL MODULE: ./src/reducers/mic-indicator.js\nvar mic_indicator = __webpack_require__(155);\n\n// EXTERNAL MODULE: ./src/reducers/tw.js\nvar tw = __webpack_require__(23);\n\n// EXTERNAL MODULE: ./src/reducers/custom-stage-size.js\nvar custom_stage_size = __webpack_require__(83);\n\n// EXTERNAL MODULE: ./src/lib/tw-lazy-scratch-blocks.js\nvar tw_lazy_scratch_blocks = __webpack_require__(57);\n\n// EXTERNAL MODULE: ./src/addons/hooks.js\nvar hooks = __webpack_require__(53);\n\n// CONCATENATED MODULE: ./src/lib/tw-extension-gui-api.js\n\n\n\n/**\n * Implements Scratch.gui API for unsandboxed extensions.\n * @param {any} Scratch window.Scratch, mutated in place.\n */\nconst implementGuiAPI = Scratch => {\n Scratch.gui = {\n /**\n * Lazily get the internal ScratchBlocks object when it becomes available. It may never be\n * available if, for example, the user never enters the editor.\n *\n * You should not assume that ScratchBlocks becoming available means the user is actually\n * in the editor or that a workspace has been created already.\n *\n * @returns {Promise} Promise that may eventually resolve to ScratchBlocks\n */\n getBlockly: () => {\n if (hooks[\"a\" /* default */].blockly) {\n return Promise.resolve(hooks[\"a\" /* default */].blockly);\n }\n return new Promise(resolve => {\n hooks[\"a\" /* default */].blocklyCallbacks.push(() => resolve(hooks[\"a\" /* default */].blockly));\n });\n },\n /**\n * Get the internal ScratchBlocks object as soon as possible. This lets you access it even\n * if the user never enters the editor.\n *\n * This method is VERY SLOW and will cause A LOT OF CPU AND NETWORK ACTIVITY because it\n * downloads and evaluates all of scratch-blocks, a multi-megabyte JavaScript bundle.\n *\n * @returns {Promise} Promise that will resolve to ScratchBlocks.\n */\n getBlocklyEagerly: () => tw_lazy_scratch_blocks[\"a\" /* default */].load()\n };\n};\n/* harmony default export */ var tw_extension_gui_api = (implementGuiAPI);\n// CONCATENATED MODULE: ./src/lib/vm-listener-hoc.jsx\nconst vm_listener_hoc_excluded = [\"attachKeyboardEvents\", \"isEditorObscured\", \"isEditorUsable\", \"projectChanged\", \"shouldUpdateTargets\", \"shouldUpdateProjectChanged\", \"onBlockDragUpdate\", \"onGreenFlag\", \"onKeyDown\", \"onKeyUp\", \"onMicListeningUpdate\", \"onMonitorsUpdate\", \"onTargetsUpdate\", \"onProjectChanged\", \"onProjectRunStart\", \"onProjectRunStop\", \"onProjectSaved\", \"onRuntimeStarted\", \"onRuntimeStopped\", \"onTurboModeOff\", \"onTurboModeOn\", \"hasCloudVariables\", \"onHasCloudVariablesChanged\", \"onFramerateChanged\", \"onInterpolationChanged\", \"onCompilerOptionsChanged\", \"onPlatformMismatch\", \"onRuntimeOptionsChanged\", \"onStageSizeChanged\", \"onCompileError\", \"onClearCompileErrors\", \"onShowExtensionAlert\"];\nfunction vm_listener_hoc_objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = vm_listener_hoc_objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction vm_listener_hoc_objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nlet compileErrorCounter = 0;\n\n/*\n * Higher Order Component to manage events emitted by the VM\n * @param {React.Component} WrappedComponent component to manage VM events for\n * @returns {React.Component} connected component with vm events bound to redux\n */\nconst vm_listener_hoc_vmListenerHOC = function vmListenerHOC(WrappedComponent) {\n class VMListener extends react_default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['handleKeyDown', 'handleKeyUp', 'handleProjectChanged', 'handleTargetsUpdate', 'handleCloudDataUpdate', 'handleCompileError']);\n // We have to start listening to the vm here rather than in\n // componentDidMount because the HOC mounts the wrapped component,\n // so the HOC componentDidMount triggers after the wrapped component\n // mounts.\n // If the wrapped component uses the vm in componentDidMount, then\n // we need to start listening before mounting the wrapped component.\n this.props.vm.on('targetsUpdate', this.handleTargetsUpdate);\n this.props.vm.on('MONITORS_UPDATE', this.props.onMonitorsUpdate);\n this.props.vm.on('BLOCK_DRAG_UPDATE', this.props.onBlockDragUpdate);\n this.props.vm.on('TURBO_MODE_ON', this.props.onTurboModeOn);\n this.props.vm.on('TURBO_MODE_OFF', this.props.onTurboModeOff);\n this.props.vm.on('PROJECT_RUN_START', this.props.onProjectRunStart);\n this.props.vm.on('PROJECT_RUN_STOP', this.props.onProjectRunStop);\n this.props.vm.on('PROJECT_CHANGED', this.handleProjectChanged);\n this.props.vm.on('RUNTIME_STARTED', this.props.onRuntimeStarted);\n this.props.vm.on('RUNTIME_STOPPED', this.props.onRuntimeStopped);\n this.props.vm.on('PROJECT_START', this.props.onGreenFlag);\n this.props.vm.on('PERIPHERAL_CONNECTION_LOST_ERROR', this.props.onShowExtensionAlert);\n this.props.vm.on('MIC_LISTENING', this.props.onMicListeningUpdate);\n this.props.vm.on('MIC_LISTENING', this.props.onMicListeningUpdate);\n // tw: add handlers for our events\n this.props.vm.on('HAS_CLOUD_DATA_UPDATE', this.handleCloudDataUpdate);\n this.props.vm.on('COMPILER_OPTIONS_CHANGED', this.props.onCompilerOptionsChanged);\n this.props.vm.on('RUNTIME_OPTIONS_CHANGED', this.props.onRuntimeOptionsChanged);\n this.props.vm.on('FRAMERATE_CHANGED', this.props.onFramerateChanged);\n this.props.vm.on('INTERPOLATION_CHANGED', this.props.onInterpolationChanged);\n this.props.vm.on('COMPILE_ERROR', this.handleCompileError);\n this.props.vm.on('RUNTIME_STARTED', this.props.onClearCompileErrors);\n this.props.vm.on('STAGE_SIZE_CHANGED', this.props.onStageSizeChanged);\n this.props.vm.on('CREATE_UNSANDBOXED_EXTENSION_API', tw_extension_gui_api);\n this.props.vm.runtime.on('PLATFORM_MISMATCH', this.props.onPlatformMismatch);\n }\n componentDidMount() {\n if (this.props.attachKeyboardEvents) {\n document.addEventListener('keydown', this.handleKeyDown);\n document.addEventListener('keyup', this.handleKeyUp);\n }\n this.props.vm.postIOData('userData', {\n username: this.props.username\n });\n }\n componentDidUpdate(prevProps) {\n if (prevProps.username !== this.props.username) {\n this.props.vm.postIOData('userData', {\n username: this.props.username\n });\n }\n\n // Re-request a targets update when the shouldUpdateTargets state changes to true\n // i.e. when the editor transitions out of fullscreen/player only modes\n if (this.props.shouldUpdateTargets && !prevProps.shouldUpdateTargets) {\n this.props.vm.emitTargetsUpdate(false /* Emit the event, but do not trigger project change */);\n }\n }\n componentWillUnmount() {\n if (this.props.attachKeyboardEvents) {\n document.removeEventListener('keydown', this.handleKeyDown);\n document.removeEventListener('keyup', this.handleKeyUp);\n }\n this.props.vm.off('targetsUpdate', this.handleTargetsUpdate);\n this.props.vm.off('MONITORS_UPDATE', this.props.onMonitorsUpdate);\n this.props.vm.off('BLOCK_DRAG_UPDATE', this.props.onBlockDragUpdate);\n this.props.vm.off('TURBO_MODE_ON', this.props.onTurboModeOn);\n this.props.vm.off('TURBO_MODE_OFF', this.props.onTurboModeOff);\n this.props.vm.off('PROJECT_RUN_START', this.props.onProjectRunStart);\n this.props.vm.off('PROJECT_RUN_STOP', this.props.onProjectRunStop);\n this.props.vm.off('PROJECT_CHANGED', this.handleProjectChanged);\n this.props.vm.off('RUNTIME_STARTED', this.props.onRuntimeStarted);\n this.props.vm.off('RUNTIME_STOPPED', this.props.onRuntimeStopped);\n this.props.vm.off('PROJECT_START', this.props.onGreenFlag);\n this.props.vm.off('PERIPHERAL_CONNECTION_LOST_ERROR', this.props.onShowExtensionAlert);\n this.props.vm.off('MIC_LISTENING', this.props.onMicListeningUpdate);\n this.props.vm.off('MIC_LISTENING', this.props.onMicListeningUpdate);\n this.props.vm.off('HAS_CLOUD_DATA_UPDATE', this.handleCloudDataUpdate);\n this.props.vm.off('COMPILER_OPTIONS_CHANGED', this.props.onCompilerOptionsChanged);\n this.props.vm.off('RUNTIME_OPTIONS_CHANGED', this.props.onRuntimeOptionsChanged);\n this.props.vm.off('FRAMERATE_CHANGED', this.props.onFramerateChanged);\n this.props.vm.off('INTERPOLATION_CHANGED', this.props.onInterpolationChanged);\n this.props.vm.off('COMPILE_ERROR', this.handleCompileError);\n this.props.vm.off('RUNTIME_STARTED', this.props.onClearCompileErrors);\n this.props.vm.off('STAGE_SIZE_CHANGED', this.props.onStageSizeChanged);\n this.props.vm.off('CREATE_UNSANDBOXED_EXTENSION_API', tw_extension_gui_api);\n this.props.vm.runtime.off('PLATFORM_MISMATCH', this.props.onPlatformMismatch);\n }\n handleCloudDataUpdate(hasCloudVariables) {\n if (this.props.hasCloudVariables !== hasCloudVariables) {\n this.props.onHasCloudVariablesChanged(hasCloudVariables);\n }\n }\n // tw: handling for compile errors\n handleCompileError(target, error) {\n const errorMessage = \"\".concat(error);\n // Ignore intentonal errors\n if (errorMessage.includes('Script explicitly disables compilation')) {\n return;\n }\n this.props.onCompileError({\n sprite: target.getName(),\n error: errorMessage,\n id: compileErrorCounter++\n });\n }\n handleProjectChanged() {\n if (this.props.shouldUpdateProjectChanged && !this.props.projectChanged) {\n this.props.onProjectChanged();\n }\n }\n handleTargetsUpdate(data) {\n if (this.props.shouldUpdateTargets) {\n this.props.onTargetsUpdate(data);\n }\n }\n handleKeyDown(e) {\n // Don't capture keys intended for Blockly inputs.\n if (e.target !== document && e.target !== document.body) return;\n const key = !e.key || e.key === 'Dead' ? e.keyCode : e.key;\n this.props.vm.postIOData('keyboard', {\n key: key,\n keyCode: e.keyCode,\n isDown: true\n });\n\n // Prevent space/arrow key from scrolling the page.\n if (e.keyCode === 32 ||\n // 32=space\n e.keyCode >= 37 && e.keyCode <= 40) {\n // 37, 38, 39, 40 are arrows\n e.preventDefault();\n }\n\n // tw: prevent backspace from going back\n if (e.keyCode === 8) {\n e.preventDefault();\n }\n\n // TW: prevent delete and backspace from deleting blocks in the editor while in fullscreen\n // or in the editor too if the project has been using these keys for something\n const blockEditorDeleteOperation = scratchKey => this.props.isEditorObscured || this.props.isEditorUsable && this.props.vm.runtime.ioDevices.keyboard.hasUsedKey(scratchKey);\n if (e.keyCode === 8 && blockEditorDeleteOperation('backspace') || e.keyCode === 46 && blockEditorDeleteOperation('delete')) {\n e.stopPropagation();\n e.stopImmediatePropagation();\n }\n\n // tw: prevent ' and / from opening quick find in Firefox\n if (e.keyCode === 222 || e.keyCode === 191) {\n e.preventDefault();\n }\n }\n handleKeyUp(e) {\n // Always capture up events,\n // even those that have switched to other targets.\n const key = !e.key || e.key === 'Dead' ? e.keyCode : e.key;\n this.props.vm.postIOData('keyboard', {\n key: key,\n keyCode: e.keyCode,\n isDown: false\n });\n\n // E.g., prevent scroll.\n if (e.target !== document && e.target !== document.body) {\n e.preventDefault();\n }\n }\n render() {\n const _this$props = this.props,\n {\n /* eslint-disable no-unused-vars */\n attachKeyboardEvents,\n isEditorObscured,\n isEditorUsable,\n projectChanged,\n shouldUpdateTargets,\n shouldUpdateProjectChanged,\n onBlockDragUpdate,\n onGreenFlag,\n onKeyDown,\n onKeyUp,\n onMicListeningUpdate,\n onMonitorsUpdate,\n onTargetsUpdate,\n onProjectChanged,\n onProjectRunStart,\n onProjectRunStop,\n onProjectSaved,\n onRuntimeStarted,\n onRuntimeStopped,\n onTurboModeOff,\n onTurboModeOn,\n hasCloudVariables,\n onHasCloudVariablesChanged,\n onFramerateChanged,\n onInterpolationChanged,\n onCompilerOptionsChanged,\n onPlatformMismatch,\n onRuntimeOptionsChanged,\n onStageSizeChanged,\n onCompileError,\n onClearCompileErrors,\n onShowExtensionAlert\n /* eslint-enable no-unused-vars */\n } = _this$props,\n props = vm_listener_hoc_objectWithoutProperties(_this$props, vm_listener_hoc_excluded);\n return /*#__PURE__*/react_default.a.createElement(WrappedComponent, props);\n }\n }\n VMListener.propTypes = {\n attachKeyboardEvents: prop_types_default.a.bool,\n isEditorObscured: prop_types_default.a.bool.isRequired,\n isEditorUsable: prop_types_default.a.bool.isRequired,\n onBlockDragUpdate: prop_types_default.a.func.isRequired,\n onGreenFlag: prop_types_default.a.func,\n onKeyDown: prop_types_default.a.func,\n onKeyUp: prop_types_default.a.func,\n onMicListeningUpdate: prop_types_default.a.func.isRequired,\n onMonitorsUpdate: prop_types_default.a.func.isRequired,\n onProjectChanged: prop_types_default.a.func.isRequired,\n onProjectRunStart: prop_types_default.a.func.isRequired,\n onProjectRunStop: prop_types_default.a.func.isRequired,\n onProjectSaved: prop_types_default.a.func.isRequired,\n onRuntimeStarted: prop_types_default.a.func.isRequired,\n onRuntimeStopped: prop_types_default.a.func.isRequired,\n onShowExtensionAlert: prop_types_default.a.func.isRequired,\n onTargetsUpdate: prop_types_default.a.func.isRequired,\n onTurboModeOff: prop_types_default.a.func.isRequired,\n onTurboModeOn: prop_types_default.a.func.isRequired,\n hasCloudVariables: prop_types_default.a.bool,\n onHasCloudVariablesChanged: prop_types_default.a.func.isRequired,\n onFramerateChanged: prop_types_default.a.func.isRequired,\n onInterpolationChanged: prop_types_default.a.func.isRequired,\n onCompilerOptionsChanged: prop_types_default.a.func.isRequired,\n onPlatformMismatch: prop_types_default.a.func.isRequired,\n onRuntimeOptionsChanged: prop_types_default.a.func.isRequired,\n onStageSizeChanged: prop_types_default.a.func,\n onCompileError: prop_types_default.a.func,\n onClearCompileErrors: prop_types_default.a.func,\n projectChanged: prop_types_default.a.bool,\n shouldUpdateTargets: prop_types_default.a.bool,\n shouldUpdateProjectChanged: prop_types_default.a.bool,\n username: prop_types_default.a.string,\n vm: prop_types_default.a.instanceOf(src_default.a).isRequired\n };\n VMListener.defaultProps = {\n attachKeyboardEvents: true,\n onGreenFlag: () => ({})\n };\n const mapStateToProps = state => ({\n hasCloudVariables: state.scratchGui.tw.hasCloudVariables,\n isEditorObscured: !state.scratchGui.mode.isPlayerOnly && state.scratchGui.mode.isFullScreen,\n isEditorUsable: !state.scratchGui.mode.isPlayerOnly && !state.scratchGui.mode.isFullScreen && state.scratchGui.editorTab.activeTabIndex === editor_tab[\"a\" /* BLOCKS_TAB_INDEX */],\n projectChanged: state.scratchGui.projectChanged,\n // Do not emit target or project updates in fullscreen or player only mode\n // or when recording sounds (it leads to garbled recordings on low-power machines)\n shouldUpdateTargets: !state.scratchGui.mode.isFullScreen && !state.scratchGui.mode.isPlayerOnly && !state.scratchGui.modals.soundRecorder,\n // Do not update the projectChanged state in fullscreen or player only mode\n shouldUpdateProjectChanged: !state.scratchGui.mode.isFullScreen && !state.scratchGui.mode.isPlayerOnly,\n vm: state.scratchGui.vm,\n username: state.session && state.session.session && state.session.session.user ? state.session.session.user.username : state.scratchGui.tw ? state.scratchGui.tw.username : ''\n });\n const mapDispatchToProps = dispatch => ({\n onTargetsUpdate: data => {\n dispatch(Object(targets[\"d\" /* updateTargets */])(data.targetList, data.editingTarget));\n },\n onMonitorsUpdate: monitorList => {\n dispatch(Object(monitors[\"c\" /* updateMonitors */])(monitorList));\n },\n onBlockDragUpdate: areBlocksOverGui => {\n dispatch(Object(block_drag[\"c\" /* updateBlockDrag */])(areBlocksOverGui));\n },\n onProjectRunStart: () => dispatch(Object(vm_status[\"b\" /* setRunningState */])(true)),\n onProjectRunStop: () => dispatch(Object(vm_status[\"b\" /* setRunningState */])(false)),\n onProjectChanged: () => dispatch(Object(project_changed[\"c\" /* setProjectChanged */])()),\n onProjectSaved: () => dispatch(Object(project_changed[\"d\" /* setProjectUnchanged */])()),\n onRuntimeStarted: () => dispatch(Object(vm_status[\"c\" /* setStartedState */])(true)),\n onRuntimeStopped: () => dispatch(Object(vm_status[\"c\" /* setStartedState */])(false)),\n onTurboModeOn: () => dispatch(Object(vm_status[\"d\" /* setTurboState */])(true)),\n onTurboModeOff: () => dispatch(Object(vm_status[\"d\" /* setTurboState */])(false)),\n onHasCloudVariablesChanged: hasCloudVariables => dispatch(Object(tw[\"l\" /* setHasCloudVariables */])(hasCloudVariables)),\n onFramerateChanged: framerate => dispatch(Object(tw[\"k\" /* setFramerateState */])(framerate)),\n onInterpolationChanged: interpolation => dispatch(Object(tw[\"n\" /* setInterpolationState */])(interpolation)),\n onCompilerOptionsChanged: options => dispatch(Object(tw[\"g\" /* setCompilerOptionsState */])(options)),\n onPlatformMismatch: (platform, callback) => {\n dispatch(Object(tw[\"p\" /* setPlatformMismatchDetails */])(platform, callback));\n dispatch(Object(modals[\"H\" /* openUnknownPlatformModal */])());\n },\n onRuntimeOptionsChanged: options => dispatch(Object(tw[\"r\" /* setRuntimeOptionsState */])(options)),\n onStageSizeChanged: (width, height) => dispatch(Object(custom_stage_size[\"d\" /* setCustomStageSize */])(width, height)),\n onCompileError: errors => dispatch(Object(tw[\"a\" /* addCompileError */])(errors)),\n onClearCompileErrors: () => dispatch(Object(tw[\"b\" /* clearCompileErrors */])()),\n onShowExtensionAlert: data => {\n dispatch(Object(alerts[\"h\" /* showExtensionAlert */])(data));\n },\n onMicListeningUpdate: listening => {\n dispatch(Object(mic_indicator[\"c\" /* updateMicIndicator */])(listening));\n }\n });\n return Object(react_redux_es[\"b\" /* connect */])(mapStateToProps, mapDispatchToProps)(VMListener);\n};\n/* harmony default export */ var vm_listener_hoc = (vm_listener_hoc_vmListenerHOC);\n// EXTERNAL MODULE: ./node_modules/scratch-audio/src/index.js\nvar scratch_audio_src = __webpack_require__(217);\nvar scratch_audio_src_default = /*#__PURE__*/__webpack_require__.n(scratch_audio_src);\n\n// CONCATENATED MODULE: ./src/lib/vm-manager-hoc.jsx\nconst vm_manager_hoc_excluded = [\"fontsLoaded\", \"loadingState\", \"locale\", \"messages\", \"isStarted\", \"onError\", \"onLoadedProject\", \"onSetProjectUnchanged\", \"projectData\", \"isLoadingWithId\", \"vm\"];\nfunction vm_manager_hoc_extends() { return vm_manager_hoc_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, vm_manager_hoc_extends.apply(null, arguments); }\nfunction vm_manager_hoc_objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = vm_manager_hoc_objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction vm_manager_hoc_objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\n\n\n\n\n\n\n/**\n * List of fonts that could be used by security prompts.\n */\nconst SECURITY_CRITICAL_FONTS = ['Helvetica Neue', 'Helvetica', 'Arial'];\n\n/*\n * Higher Order Component to manage events emitted by the VM\n * @param {React.Component} WrappedComponent component to manage VM events for\n * @returns {React.Component} connected component with vm events bound to redux\n */\nconst vm_manager_hoc_vmManagerHOC = function vmManagerHOC(WrappedComponent) {\n class VMManager extends react_default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['loadProject']);\n }\n componentDidMount() {\n if (!this.props.vm.initialized) {\n window.vm = this.props.vm;\n try {\n this.audioEngine = new scratch_audio_src_default.a();\n this.props.vm.attachAudioEngine(this.audioEngine);\n } catch (e) {\n log[\"default\"].error('could not create scratch-audio', e);\n }\n for (const font of SECURITY_CRITICAL_FONTS) {\n this.props.vm.runtime.fontManager.restrictFont(font);\n }\n this.props.vm.initialized = true;\n this.props.vm.setLocale(this.props.locale, this.props.messages);\n }\n if (!this.props.isPlayerOnly && !this.props.isStarted) {\n this.props.vm.start();\n }\n }\n componentDidUpdate(prevProps) {\n // if project is in loading state, AND fonts are loaded,\n // and they weren't both that way until now... load project!\n if (this.props.isLoadingWithId && this.props.fontsLoaded && (!prevProps.isLoadingWithId || !prevProps.fontsLoaded)) {\n this.loadProject();\n }\n // Start the VM if entering editor mode with an unstarted vm\n if (!this.props.isPlayerOnly && !this.props.isStarted) {\n this.props.vm.start();\n }\n }\n loadProject() {\n // tw: stop when loading new project\n this.props.vm.quit();\n return this.props.vm.loadProject(this.props.projectData).then(() => {\n this.props.onLoadedProject(this.props.loadingState, this.props.canSave);\n // Wrap in a setTimeout because skin loading in\n // the renderer can be async.\n setTimeout(() => this.props.onSetProjectUnchanged());\n\n // If the vm is not running, call draw on the renderer manually\n // This draws the state of the loaded project with no blocks running\n // which closely matches the 2.0 behavior, except for monitors–\n // 2.0 runs monitors and shows updates (e.g. timer monitor)\n // before the VM starts running other hat blocks.\n if (!this.props.isStarted) {\n // Wrap in a setTimeout because skin loading in\n // the renderer can be async.\n setTimeout(() => this.props.vm.renderer.draw());\n }\n }).catch(e => {\n this.props.onError(e);\n });\n }\n render() {\n const _this$props = this.props,\n {\n /* eslint-disable no-unused-vars */\n fontsLoaded,\n loadingState,\n locale,\n messages,\n isStarted,\n onError: onErrorProp,\n onLoadedProject: onLoadedProjectProp,\n onSetProjectUnchanged,\n projectData,\n /* eslint-enable no-unused-vars */\n isLoadingWithId: isLoadingWithIdProp,\n vm\n } = _this$props,\n componentProps = vm_manager_hoc_objectWithoutProperties(_this$props, vm_manager_hoc_excluded);\n return /*#__PURE__*/react_default.a.createElement(WrappedComponent, vm_manager_hoc_extends({\n isLoading: isLoadingWithIdProp,\n vm: vm\n }, componentProps));\n }\n }\n VMManager.propTypes = {\n canSave: prop_types_default.a.bool,\n cloudHost: prop_types_default.a.string,\n fontsLoaded: prop_types_default.a.bool,\n isLoadingWithId: prop_types_default.a.bool,\n isPlayerOnly: prop_types_default.a.bool,\n isStarted: prop_types_default.a.bool,\n loadingState: prop_types_default.a.oneOf(project_state[\"a\" /* LoadingStates */]),\n locale: prop_types_default.a.string,\n messages: prop_types_default.a.objectOf(prop_types_default.a.string),\n onError: prop_types_default.a.func,\n onLoadedProject: prop_types_default.a.func,\n onSetProjectUnchanged: prop_types_default.a.func,\n projectData: prop_types_default.a.oneOfType([prop_types_default.a.object, prop_types_default.a.string]),\n projectId: prop_types_default.a.oneOfType([prop_types_default.a.string, prop_types_default.a.number]),\n username: prop_types_default.a.string,\n vm: prop_types_default.a.instanceOf(src_default.a).isRequired\n };\n const mapStateToProps = state => {\n const loadingState = state.scratchGui.projectState.loadingState;\n return {\n fontsLoaded: state.scratchGui.fontsLoaded,\n isLoadingWithId: Object(project_state[\"o\" /* getIsLoadingWithId */])(loadingState),\n locale: state.locales.locale,\n messages: state.locales.messages,\n projectData: state.scratchGui.projectState.projectData,\n projectId: state.scratchGui.projectState.projectId,\n loadingState: loadingState,\n isPlayerOnly: state.scratchGui.mode.isPlayerOnly,\n isStarted: state.scratchGui.vmStatus.started\n };\n };\n const mapDispatchToProps = dispatch => ({\n onError: error => dispatch(Object(project_state[\"y\" /* projectError */])(error)),\n onLoadedProject: (loadingState, canSave) => dispatch(Object(project_state[\"x\" /* onLoadedProject */])(loadingState, canSave, true)),\n onSetProjectUnchanged: () => dispatch(Object(project_changed[\"d\" /* setProjectUnchanged */])())\n });\n\n // Allow incoming props to override redux-provided props. Used to mock in tests.\n const mergeProps = (stateProps, dispatchProps, ownProps) => Object.assign({}, stateProps, dispatchProps, ownProps);\n return Object(react_redux_es[\"b\" /* connect */])(mapStateToProps, mapDispatchToProps, mergeProps)(VMManager);\n};\n/* harmony default export */ var vm_manager_hoc = (vm_manager_hoc_vmManagerHOC);\n// EXTERNAL MODULE: ./node_modules/lodash.throttle/index.js\nvar lodash_throttle = __webpack_require__(412);\nvar lodash_throttle_default = /*#__PURE__*/__webpack_require__.n(lodash_throttle);\n\n// CONCATENATED MODULE: ./src/lib/cloud-provider.js\n\n\nconst anonymizeUsername = username => {\n if (/^player\\d{2,7}$/i.test(username)) {\n return 'player';\n }\n return username;\n};\nclass cloud_provider_CloudProvider {\n /**\n * A cloud data provider which creates and manages a web socket connection\n * to the Scratch cloud data server. This provider is responsible for\n * interfacing with the VM's cloud io device.\n * @param {string} cloudHost The url for the cloud data server\n * @param {VirtualMachine} vm The Scratch virtual machine to interface with\n * @param {string} username The username to associate cloud data updates with\n * @param {string} projectId The id associated with the project containing\n * cloud data.\n */\n constructor(cloudHost, vm, username, projectId) {\n this.vm = vm;\n this.username = anonymizeUsername(username);\n this.projectId = projectId;\n this.cloudHost = cloudHost;\n this.connectionAttempts = 0;\n\n // A queue of messages to send which were received before the\n // connection was ready\n this.queuedData = [];\n this.openConnection();\n\n // Send a message to the cloud server at a rate of no more\n // than 10 messages/sec.\n // tw: we let cloud variables change at a greater rate\n this.sendCloudData = lodash_throttle_default()(this._sendCloudData, 50);\n }\n\n /**\n * Open a new websocket connection to the clouddata server.\n * @param {string} cloudHost The cloud data server to connect to.\n */\n openConnection() {\n this.connectionAttempts += 1;\n try {\n // tw: only add ws:// or wss:// if it not already present in the cloudHost\n if (!this.cloudHost || !this.cloudHost.includes('ws://') && !this.cloudHost.includes('wss://')) {\n this.cloudHost = (location.protocol === 'http:' ? 'ws://' : 'wss://') + this.cloudHost;\n }\n this.connection = new WebSocket(this.cloudHost);\n } catch (e) {\n log[\"default\"].warn('Websocket support is not available in this browser', e);\n this.connection = null;\n return;\n }\n this.connection.onerror = this.onError.bind(this);\n this.connection.onmessage = this.onMessage.bind(this);\n this.connection.onopen = this.onOpen.bind(this);\n this.connection.onclose = this.onClose.bind(this);\n }\n onError(event) {\n log[\"default\"].error(\"Websocket connection error: \".concat(JSON.stringify(event)));\n // Error is always followed by close, which handles reconnect logic.\n }\n onMessage(event) {\n const messageString = event.data;\n // Multiple commands can be received, newline separated\n messageString.split('\\n').forEach(message => {\n if (message) {\n // .split can also contain '' in the array it returns\n const parsedData = this.parseMessage(JSON.parse(message));\n this.vm.postIOData('cloud', parsedData);\n }\n });\n }\n onOpen() {\n // Reset connection attempts to 1 to make sure any subsequent reconnects\n // use connectionAttempts=1 to calculate timeout\n this.connectionAttempts = 1;\n this.writeToServer('handshake');\n log[\"default\"].info(\"Successfully connected to clouddata server.\");\n\n // Go through the queued data and send off messages that we weren't\n // ready to send before\n this.queuedData.forEach(data => {\n this.sendCloudData(data);\n });\n // Reset the queue\n this.queuedData = [];\n }\n onClose(e) {\n // Code 4002 is \"Username Error\" -- do not try to reconnect\n if (e && e.code === 4002) {\n log[\"default\"].info('Cloud username is invalid. Not reconnecting.');\n this.onInvalidUsername();\n return;\n }\n // Code 4003 is \"Overloaded\" -- do not try to reconnect\n if (e && e.code === 4003) {\n log[\"default\"].info('The server is full. Not reconnecting.');\n return;\n }\n // Code 4004 is \"Project Unavailable\" -- do not try to reconnect\n if (e && e.code === 4004) {\n log[\"default\"].info('Cloud variables are disabled for this project. Not reconnecting.');\n return;\n }\n log[\"default\"].info(\"WebSocket connection closed with code \".concat(e && e.code));\n const randomizedTimeout = this.randomizeDuration(this.exponentialTimeout());\n this.setTimeout(this.openConnection.bind(this), randomizedTimeout);\n }\n\n // tw: method called when username is invalid\n onInvalidUsername() {/* no-op */}\n exponentialTimeout() {\n return (Math.pow(2, Math.min(this.connectionAttempts, 5)) - 1) * 1000;\n }\n randomizeDuration(t) {\n return Math.random() * t;\n }\n setTimeout(fn, time) {\n log[\"default\"].info(\"Reconnecting in \".concat((time / 1000).toFixed(1), \"s, attempt \").concat(this.connectionAttempts));\n this._connectionTimeout = window.setTimeout(fn, time);\n }\n parseMessage(message) {\n const varData = {};\n switch (message.method) {\n case 'set':\n {\n varData.varUpdate = {\n name: message.name,\n value: message.value\n };\n break;\n }\n }\n return varData;\n }\n\n /**\n * Format and send a message to the cloud data server.\n * @param {string} methodName The message method, indicating the action to perform.\n * @param {string} dataName The name of the cloud variable this message pertains to\n * @param {string | number} dataValue The value to set the cloud variable to\n * @param {string} dataNewName The new name for the cloud variable (if renaming)\n */\n writeToServer(methodName, dataName, dataValue, dataNewName) {\n const msg = {};\n msg.method = methodName;\n msg.user = this.username;\n msg.project_id = this.projectId;\n\n // Optional string params can use simple falsey undefined check\n if (dataName) msg.name = dataName;\n if (dataNewName) msg.new_name = dataNewName;\n\n // Optional number params need different undefined check\n if (typeof dataValue !== 'undefined' && dataValue !== null) msg.value = dataValue;\n const dataToWrite = JSON.stringify(msg);\n if (this.connection && this.connection.readyState === WebSocket.OPEN) {\n this.sendCloudData(dataToWrite);\n } else if (msg.method === 'create' || msg.method === 'delete' || msg.method === 'rename') {\n // Save data for sending when connection is open, iff the data\n // is a create, rename, or delete\n this.queuedData.push(dataToWrite);\n }\n }\n\n /**\n * Send a formatted message to the cloud data server.\n * @param {string} data The formatted message to send.\n */\n _sendCloudData(data) {\n this.connection.send(\"\".concat(data, \"\\n\"));\n }\n\n /**\n * Provides an API for the VM's cloud IO device to create\n * a new cloud variable on the server.\n * @param {string} name The name of the variable to create\n * @param {string | number} value The value of the new cloud variable.\n */\n createVariable(name, value) {\n this.writeToServer('create', name, value);\n }\n\n /**\n * Provides an API for the VM's cloud IO device to update\n * a cloud variable on the server.\n * @param {string} name The name of the variable to update\n * @param {string | number} value The new value for the variable\n */\n updateVariable(name, value) {\n this.writeToServer('set', name, value);\n }\n\n /**\n * Provides an API for the VM's cloud IO device to rename\n * a cloud variable on the server.\n * @param {string} oldName The old name of the variable to rename\n * @param {string} newName The new name for the cloud variable.\n */\n renameVariable(oldName, newName) {\n this.writeToServer('rename', oldName, null, newName);\n }\n\n /**\n * Provides an API for the VM's cloud IO device to delete\n * a cloud variable on the server.\n * @param {string} name The name of the variable to delete\n */\n deleteVariable(name) {\n this.writeToServer('delete', name);\n }\n\n /**\n * Closes the connection to the web socket and clears the cloud\n * provider of references related to the cloud data project.\n */\n requestCloseConnection() {\n if (this.connection && this.connection.readyState !== WebSocket.CLOSING && this.connection.readyState !== WebSocket.CLOSED) {\n log[\"default\"].info('Request close cloud connection without reconnecting');\n // Remove listeners, after this point we do not want to react to connection updates\n this.connection.onclose = () => {};\n this.connection.onerror = () => {};\n this.connection.close();\n }\n this.clear();\n }\n\n /**\n * Clear this provider of references related to the project\n * and current state.\n */\n clear() {\n this.connection = null;\n this.vm = null;\n this.username = null;\n this.projectId = null;\n if (this._connectionTimeout) {\n clearTimeout(this._connectionTimeout);\n this._connectionTimeout = null;\n }\n this.connectionAttempts = 0;\n }\n}\n/* harmony default export */ var cloud_provider = (cloud_provider_CloudProvider);\n// CONCATENATED MODULE: ./src/lib/cloud-manager-hoc.jsx\nconst cloud_manager_hoc_excluded = [\"canModifyCloudData\", \"cloudHost\", \"reduxCloudHost\", \"cloudVariablesDisabledByUser\", \"onSetReduxCloudHost\", \"projectId\", \"username\", \"hasCloudPermission\", \"isShowingWithId\", \"onShowCloudInfo\", \"onInvalidUsername\", \"vm\"];\nfunction cloud_manager_hoc_extends() { return cloud_manager_hoc_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, cloud_manager_hoc_extends.apply(null, arguments); }\nfunction cloud_manager_hoc_objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = cloud_manager_hoc_objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction cloud_manager_hoc_objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\n\n\n\n\n\n\n\n/**\n * TW: Our scratch-vm has an alternative fix to the cloud variable and video sensing privacy concerns.\n */\nconst DISABLE_WITH_VIDEO_SENSING = false;\n\n/*\n * Higher Order Component to manage the connection to the cloud server.\n * @param {React.Component} WrappedComponent component to manage VM events for\n * @returns {React.Component} connected component with vm events bound to redux\n */\nconst cloud_manager_hoc_cloudManagerHOC = function cloudManagerHOC(WrappedComponent) {\n class CloudManager extends react_default.a.Component {\n constructor(props) {\n super(props);\n this.cloudProvider = null;\n lodash_bindall_default()(this, ['handleCloudDataUpdate', 'handleExtensionAdded']);\n this.props.vm.on('HAS_CLOUD_DATA_UPDATE', this.handleCloudDataUpdate);\n this.props.vm.on('EXTENSION_ADDED', this.handleExtensionAdded);\n }\n componentDidMount() {\n if (this.shouldConnect(this.props)) {\n this.connectToCloud();\n }\n }\n componentWillReceiveProps(nextProps) {\n if (this.props.reduxCloudHost !== nextProps.cloudHost) {\n this.props.onSetReduxCloudHost(nextProps.cloudHost);\n }\n }\n componentDidUpdate(prevProps) {\n // TODO need to add cloud provider disconnection logic and cloud data clearing logic\n // when loading a new project e.g. via file upload\n // (and eventually move it out of the vm.clear function)\n\n if (this.shouldReconnect(this.props, prevProps)) {\n this.disconnectFromCloud();\n if (this.shouldConnect(this.props)) {\n this.connectToCloud();\n }\n return;\n }\n if (this.shouldConnect(this.props) && !this.shouldConnect(prevProps)) {\n this.connectToCloud();\n }\n if (this.shouldDisconnect(this.props, prevProps)) {\n this.disconnectFromCloud();\n }\n }\n componentWillUnmount() {\n this.props.vm.off('HAS_CLOUD_DATA_UPDATE', this.handleCloudDataUpdate);\n this.props.vm.off('EXTENSION_ADDED', this.handleExtensionAdded);\n this.disconnectFromCloud();\n }\n canUseCloud(props) {\n return !!(props.reduxCloudHost && props.username && props.vm && props.projectId && props.hasCloudPermission && !props.cloudVariablesDisabledByUser);\n }\n shouldConnect(props) {\n return !this.isConnected() && this.canUseCloud(props) && props.isShowingWithId && props.vm.runtime.hasCloudData() && props.canModifyCloudData;\n }\n shouldDisconnect(props, prevProps) {\n return this.isConnected() && (\n // Can no longer use cloud or cloud provider info is now stale\n !this.canUseCloud(props) || !props.vm.runtime.hasCloudData() || props.projectId !== prevProps.projectId ||\n // tw: username changes are handled in \"reconnect\"\n // (props.username !== prevProps.username) ||\n // Editing someone else's project\n !props.canModifyCloudData);\n }\n shouldReconnect(props, prevProps) {\n return this.isConnected() && (props.username !== prevProps.username || props.reduxCloudHost !== prevProps.reduxCloudHost);\n }\n isConnected() {\n return this.cloudProvider && !!this.cloudProvider.connection;\n }\n connectToCloud() {\n this.cloudProvider = new cloud_provider(this.props.reduxCloudHost, this.props.vm, this.props.username, this.props.projectId);\n this.cloudProvider.onInvalidUsername = this.props.onInvalidUsername;\n this.props.vm.setCloudProvider(this.cloudProvider);\n }\n disconnectFromCloud() {\n if (this.cloudProvider) {\n this.cloudProvider.requestCloseConnection();\n this.cloudProvider = null;\n this.props.vm.setCloudProvider(null);\n }\n }\n handleCloudDataUpdate(projectHasCloudData) {\n if (this.isConnected() && !projectHasCloudData) {\n this.disconnectFromCloud();\n } else if (this.shouldConnect(this.props)) {\n this.props.onShowCloudInfo();\n this.connectToCloud();\n }\n }\n handleExtensionAdded(categoryInfo) {\n // Note that props.vm.extensionManager.isExtensionLoaded('videoSensing') is still false\n // at the point of this callback, so it is difficult to reuse the canModifyCloudData logic.\n if (DISABLE_WITH_VIDEO_SENSING && categoryInfo.id === 'videoSensing' && this.isConnected()) {\n this.disconnectFromCloud();\n }\n }\n render() {\n const _this$props = this.props,\n {\n /* eslint-disable no-unused-vars */\n canModifyCloudData,\n cloudHost,\n reduxCloudHost,\n cloudVariablesDisabledByUser,\n onSetReduxCloudHost,\n projectId,\n username,\n hasCloudPermission,\n isShowingWithId,\n onShowCloudInfo,\n onInvalidUsername,\n /* eslint-enable no-unused-vars */\n vm\n } = _this$props,\n componentProps = cloud_manager_hoc_objectWithoutProperties(_this$props, cloud_manager_hoc_excluded);\n return /*#__PURE__*/react_default.a.createElement(WrappedComponent, cloud_manager_hoc_extends({\n canUseCloud: this.canUseCloud(this.props),\n vm: vm\n }, componentProps));\n }\n }\n CloudManager.propTypes = {\n canModifyCloudData: prop_types_default.a.bool.isRequired,\n cloudHost: prop_types_default.a.string,\n reduxCloudHost: prop_types_default.a.string,\n cloudVariablesDisabledByUser: prop_types_default.a.bool.isRequired,\n onSetReduxCloudHost: prop_types_default.a.func,\n hasCloudPermission: prop_types_default.a.bool,\n isShowingWithId: prop_types_default.a.bool.isRequired,\n onInvalidUsername: prop_types_default.a.func,\n onShowCloudInfo: prop_types_default.a.func,\n projectId: prop_types_default.a.oneOfType([prop_types_default.a.string, prop_types_default.a.number]),\n username: prop_types_default.a.string,\n vm: prop_types_default.a.instanceOf(src_default.a).isRequired\n };\n CloudManager.defaultProps = {\n cloudHost: null,\n onShowCloudInfo: () => {},\n username: null\n };\n const mapStateToProps = (state, ownProps) => {\n const loadingState = state.scratchGui.projectState.loadingState;\n return {\n reduxCloudHost: state.scratchGui.tw.cloudHost,\n cloudVariablesDisabledByUser: !state.scratchGui.tw.cloud,\n isShowingWithId: Object(project_state[\"s\" /* getIsShowingWithId */])(loadingState),\n projectId: state.scratchGui.projectState.projectId,\n // if you're editing someone else's project, you can't modify cloud data\n canModifyCloudData: (!state.scratchGui.mode.hasEverEnteredEditor || ownProps.canSave) &&\n // possible security concern if the program attempts to encode webcam data over cloud variables\n !(DISABLE_WITH_VIDEO_SENSING && ownProps.vm.extensionManager.isExtensionLoaded('videoSensing'))\n };\n };\n const mapDispatchToProps = dispatch => ({\n onSetReduxCloudHost: cloudHost => dispatch(Object(tw[\"f\" /* setCloudHost */])(cloudHost)),\n onShowCloudInfo: () => Object(alerts[\"g\" /* showAlertWithTimeout */])(dispatch, 'cloudInfo'),\n onInvalidUsername: () => {\n dispatch(Object(tw[\"t\" /* setUsernameInvalid */])(true));\n dispatch(Object(modals[\"I\" /* openUsernameModal */])());\n }\n });\n\n // Allow incoming props to override redux-provided props. Used to mock in tests.\n const mergeProps = (stateProps, dispatchProps, ownProps) => Object.assign({}, stateProps, dispatchProps, ownProps);\n return Object(react_redux_es[\"b\" /* connect */])(mapStateToProps, mapDispatchToProps, mergeProps)(CloudManager);\n};\n/* harmony default export */ var cloud_manager_hoc = (cloud_manager_hoc_cloudManagerHOC);\n// EXTERNAL MODULE: ./node_modules/classnames/index.js\nvar classnames = __webpack_require__(3);\nvar classnames_default = /*#__PURE__*/__webpack_require__.n(classnames);\n\n// EXTERNAL MODULE: ./node_modules/react-responsive/dist/react-responsive.js\nvar react_responsive = __webpack_require__(253);\nvar react_responsive_default = /*#__PURE__*/__webpack_require__.n(react_responsive);\n\n// EXTERNAL MODULE: ./node_modules/react-tabs/esm/index.js + 10 modules\nvar esm = __webpack_require__(102);\n\n// EXTERNAL MODULE: ./node_modules/react-tabs/style/react-tabs.css\nvar react_tabs = __webpack_require__(150);\nvar react_tabs_default = /*#__PURE__*/__webpack_require__.n(react_tabs);\n\n// EXTERNAL MODULE: ./node_modules/lodash.debounce/index.js\nvar lodash_debounce = __webpack_require__(413);\nvar lodash_debounce_default = /*#__PURE__*/__webpack_require__.n(lodash_debounce);\n\n// EXTERNAL MODULE: ./node_modules/lodash.defaultsdeep/index.js\nvar lodash_defaultsdeep = __webpack_require__(143);\nvar lodash_defaultsdeep_default = /*#__PURE__*/__webpack_require__.n(lodash_defaultsdeep);\n\n// EXTERNAL MODULE: ./src/lib/make-toolbox-xml.js\nvar make_toolbox_xml = __webpack_require__(180);\n\n// CONCATENATED MODULE: ./src/lib/blocks.js\n\n\n/**\n * Connect scratch blocks with the vm\n * @param {VirtualMachine} vm - The scratch vm\n * @return {ScratchBlocks} ScratchBlocks connected with the vm\n */\n/* harmony default export */ var lib_blocks = (function (vm) {\n const ScratchBlocks = tw_lazy_scratch_blocks[\"a\" /* default */].get();\n const jsonForMenuBlock = function jsonForMenuBlock(name, menuOptionsFn, colors, start) {\n return {\n message0: '%1',\n args0: [{\n type: 'field_dropdown',\n name: name,\n options: function options() {\n return start.concat(menuOptionsFn());\n }\n }],\n inputsInline: true,\n output: 'String',\n colour: colors.secondary,\n colourSecondary: colors.secondary,\n colourTertiary: colors.tertiary,\n colourQuaternary: colors.quaternary,\n outputShape: ScratchBlocks.OUTPUT_SHAPE_ROUND\n };\n };\n const jsonForHatBlockMenu = function jsonForHatBlockMenu(hatName, name, menuOptionsFn, colors, start) {\n return {\n message0: hatName,\n args0: [{\n type: 'field_dropdown',\n name: name,\n options: function options() {\n return start.concat(menuOptionsFn());\n }\n }],\n colour: colors.primary,\n colourSecondary: colors.secondary,\n colourTertiary: colors.tertiary,\n colourQuaternary: colors.quaternary,\n extensions: ['shape_hat']\n };\n };\n const jsonForSensingMenus = function jsonForSensingMenus(menuOptionsFn) {\n return {\n message0: ScratchBlocks.Msg.SENSING_OF,\n args0: [{\n type: 'field_dropdown',\n name: 'PROPERTY',\n options: function options() {\n return menuOptionsFn();\n }\n }, {\n type: 'input_value',\n name: 'OBJECT'\n }],\n output: true,\n colour: ScratchBlocks.Colours.sensing.primary,\n colourSecondary: ScratchBlocks.Colours.sensing.secondary,\n colourTertiary: ScratchBlocks.Colours.sensing.tertiary,\n colourQuaternary: ScratchBlocks.Colours.sensing.quaternary,\n outputShape: ScratchBlocks.OUTPUT_SHAPE_ROUND\n };\n };\n const soundsMenu = function soundsMenu() {\n let menu = [['', '']];\n if (vm.editingTarget && vm.editingTarget.sprite.sounds.length > 0) {\n menu = vm.editingTarget.sprite.sounds.map(sound => [sound.name, sound.name]);\n }\n menu.push([ScratchBlocks.ScratchMsgs.translate('SOUND_RECORD', 'record...'), ScratchBlocks.recordSoundCallback]);\n return menu;\n };\n const costumesMenu = function costumesMenu() {\n if (vm.editingTarget && vm.editingTarget.getCostumes().length > 0) {\n return vm.editingTarget.getCostumes().map(costume => [costume.name, costume.name]);\n }\n return [['', '']];\n };\n const backdropsMenu = function backdropsMenu() {\n const next = ScratchBlocks.ScratchMsgs.translate('LOOKS_NEXTBACKDROP', 'next backdrop');\n const previous = ScratchBlocks.ScratchMsgs.translate('LOOKS_PREVIOUSBACKDROP', 'previous backdrop');\n const random = ScratchBlocks.ScratchMsgs.translate('LOOKS_RANDOMBACKDROP', 'random backdrop');\n if (vm.runtime.targets[0] && vm.runtime.targets[0].getCostumes().length > 0) {\n return vm.runtime.targets[0].getCostumes().map(costume => [costume.name, costume.name]).concat([[next, 'next backdrop'], [previous, 'previous backdrop'], [random, 'random backdrop']]);\n }\n return [['', '']];\n };\n const backdropNamesMenu = function backdropNamesMenu() {\n const stage = vm.runtime.getTargetForStage();\n if (stage && stage.getCostumes().length > 0) {\n return stage.getCostumes().map(costume => [costume.name, costume.name]);\n }\n return [['', '']];\n };\n const spriteMenu = function spriteMenu() {\n const sprites = [];\n for (const targetId in vm.runtime.targets) {\n if (!Object.prototype.hasOwnProperty.call(vm.runtime.targets, targetId)) continue;\n if (vm.runtime.targets[targetId].isOriginal) {\n if (!vm.runtime.targets[targetId].isStage) {\n if (vm.runtime.targets[targetId] === vm.editingTarget) {\n continue;\n }\n sprites.push([vm.runtime.targets[targetId].sprite.name, vm.runtime.targets[targetId].sprite.name]);\n }\n }\n }\n return sprites;\n };\n const cloneMenu = function cloneMenu() {\n if (vm.editingTarget && vm.editingTarget.isStage) {\n const menu = spriteMenu();\n if (menu.length === 0) {\n return [['', '']]; // Empty menu matches Scratch 2 behavior\n }\n return menu;\n }\n const myself = ScratchBlocks.ScratchMsgs.translate('CONTROL_CREATECLONEOF_MYSELF', 'myself');\n return [[myself, '_myself_']].concat(spriteMenu());\n };\n const soundColors = ScratchBlocks.Colours.sounds;\n const looksColors = ScratchBlocks.Colours.looks;\n const motionColors = ScratchBlocks.Colours.motion;\n const sensingColors = ScratchBlocks.Colours.sensing;\n const controlColors = ScratchBlocks.Colours.control;\n const eventColors = ScratchBlocks.Colours.event;\n ScratchBlocks.Blocks.sound_sounds_menu.init = function () {\n const json = jsonForMenuBlock('SOUND_MENU', soundsMenu, soundColors, []);\n this.jsonInit(json);\n };\n ScratchBlocks.Blocks.looks_costume.init = function () {\n const json = jsonForMenuBlock('COSTUME', costumesMenu, looksColors, []);\n this.jsonInit(json);\n };\n ScratchBlocks.Blocks.looks_backdrops.init = function () {\n const json = jsonForMenuBlock('BACKDROP', backdropsMenu, looksColors, []);\n this.jsonInit(json);\n };\n ScratchBlocks.Blocks.event_whenbackdropswitchesto.init = function () {\n const json = jsonForHatBlockMenu(ScratchBlocks.Msg.EVENT_WHENBACKDROPSWITCHESTO, 'BACKDROP', backdropNamesMenu, eventColors, []);\n this.jsonInit(json);\n };\n ScratchBlocks.Blocks.motion_pointtowards_menu.init = function () {\n const random = ScratchBlocks.ScratchMsgs.translate('MOTION_POINTTOWARDS_RANDOM', 'random direction');\n const mouse = ScratchBlocks.ScratchMsgs.translate('MOTION_POINTTOWARDS_POINTER', 'mouse-pointer');\n const json = jsonForMenuBlock('TOWARDS', spriteMenu, motionColors, [[mouse, '_mouse_'], [random, '_random_']]);\n this.jsonInit(json);\n };\n ScratchBlocks.Blocks.motion_goto_menu.init = function () {\n const random = ScratchBlocks.ScratchMsgs.translate('MOTION_GOTO_RANDOM', 'random position');\n const mouse = ScratchBlocks.ScratchMsgs.translate('MOTION_GOTO_POINTER', 'mouse-pointer');\n const json = jsonForMenuBlock('TO', spriteMenu, motionColors, [[random, '_random_'], [mouse, '_mouse_']]);\n this.jsonInit(json);\n };\n ScratchBlocks.Blocks.motion_glideto_menu.init = function () {\n const random = ScratchBlocks.ScratchMsgs.translate('MOTION_GLIDETO_RANDOM', 'random position');\n const mouse = ScratchBlocks.ScratchMsgs.translate('MOTION_GLIDETO_POINTER', 'mouse-pointer');\n const json = jsonForMenuBlock('TO', spriteMenu, motionColors, [[random, '_random_'], [mouse, '_mouse_']]);\n this.jsonInit(json);\n };\n ScratchBlocks.Blocks.sensing_of_object_menu.init = function () {\n const stage = ScratchBlocks.ScratchMsgs.translate('SENSING_OF_STAGE', 'Stage');\n const json = jsonForMenuBlock('OBJECT', spriteMenu, sensingColors, [[stage, '_stage_']]);\n this.jsonInit(json);\n };\n ScratchBlocks.Blocks.sensing_of.init = function () {\n const blockId = this.id;\n const blockType = this.type;\n\n // Get the sensing_of block from vm.\n let defaultSensingOfBlock;\n const blocks = vm.runtime.flyoutBlocks._blocks;\n Object.keys(blocks).forEach(id => {\n const block = blocks[id];\n if (id === blockType || block && block.opcode === blockType) {\n defaultSensingOfBlock = block;\n }\n });\n\n // Function that fills in menu for the first input in the sensing block.\n // Called every time it opens since it depends on the values in the other block input.\n const menuFn = function menuFn() {\n const stageOptions = [[ScratchBlocks.Msg.SENSING_OF_BACKDROPNUMBER, 'backdrop #'], [ScratchBlocks.Msg.SENSING_OF_BACKDROPNAME, 'backdrop name'], [ScratchBlocks.Msg.SENSING_OF_VOLUME, 'volume']];\n const spriteOptions = [[ScratchBlocks.Msg.SENSING_OF_XPOSITION, 'x position'], [ScratchBlocks.Msg.SENSING_OF_YPOSITION, 'y position'], [ScratchBlocks.Msg.SENSING_OF_DIRECTION, 'direction'], [ScratchBlocks.Msg.SENSING_OF_COSTUMENUMBER, 'costume #'], [ScratchBlocks.Msg.SENSING_OF_COSTUMENAME, 'costume name'], [ScratchBlocks.Msg.SENSING_OF_SIZE, 'size'], [ScratchBlocks.Msg.SENSING_OF_VOLUME, 'volume']];\n if (vm.editingTarget) {\n let lookupBlocks = vm.editingTarget.blocks;\n let sensingOfBlock = lookupBlocks.getBlock(blockId);\n\n // The block doesn't exist, but should be in the flyout. Look there.\n if (!sensingOfBlock) {\n sensingOfBlock = vm.runtime.flyoutBlocks.getBlock(blockId) || defaultSensingOfBlock;\n // If we still don't have a block, just return an empty list . This happens during\n // scratch blocks construction.\n if (!sensingOfBlock) {\n return [['', '']];\n }\n // The block was in the flyout so look up future block info there.\n lookupBlocks = vm.runtime.flyoutBlocks;\n }\n const sort = function sort(options) {\n options.sort(ScratchBlocks.scratchBlocksUtils.compareStrings);\n };\n // Get all the stage variables (no lists) so we can add them to menu when the stage is selected.\n const stageVariableOptions = vm.runtime.getTargetForStage().getAllVariableNamesInScopeByType('');\n sort(stageVariableOptions);\n const stageVariableMenuItems = stageVariableOptions.map(variable => [variable, variable]);\n if (sensingOfBlock.inputs.OBJECT.shadow !== sensingOfBlock.inputs.OBJECT.block) {\n // There's a block dropped on top of the menu. It'd be nice to evaluate it and\n // return the correct list, but that is tricky. Scratch2 just returns stage options\n // so just do that here too.\n return stageOptions.concat(stageVariableMenuItems);\n }\n const menuBlock = lookupBlocks.getBlock(sensingOfBlock.inputs.OBJECT.shadow);\n const selectedItem = menuBlock.fields.OBJECT.value;\n if (selectedItem === '_stage_') {\n return stageOptions.concat(stageVariableMenuItems);\n }\n // Get all the local variables (no lists) and add them to the menu.\n const target = vm.runtime.getSpriteTargetByName(selectedItem);\n let spriteVariableOptions = [];\n // The target should exist, but there are ways for it not to (e.g. #4203).\n if (target) {\n spriteVariableOptions = target.getAllVariableNamesInScopeByType('', true);\n sort(spriteVariableOptions);\n }\n const spriteVariableMenuItems = spriteVariableOptions.map(variable => [variable, variable]);\n return spriteOptions.concat(spriteVariableMenuItems);\n }\n return [['', '']];\n };\n const json = jsonForSensingMenus(menuFn);\n this.jsonInit(json);\n };\n ScratchBlocks.Blocks.sensing_distancetomenu.init = function () {\n const mouse = ScratchBlocks.ScratchMsgs.translate('SENSING_DISTANCETO_POINTER', 'mouse-pointer');\n const json = jsonForMenuBlock('DISTANCETOMENU', spriteMenu, sensingColors, [[mouse, '_mouse_']]);\n this.jsonInit(json);\n };\n ScratchBlocks.Blocks.sensing_touchingobjectmenu.init = function () {\n const mouse = ScratchBlocks.ScratchMsgs.translate('SENSING_TOUCHINGOBJECT_POINTER', 'mouse-pointer');\n const edge = ScratchBlocks.ScratchMsgs.translate('SENSING_TOUCHINGOBJECT_EDGE', 'edge');\n const json = jsonForMenuBlock('TOUCHINGOBJECTMENU', spriteMenu, sensingColors, [[mouse, '_mouse_'], [edge, '_edge_']]);\n this.jsonInit(json);\n };\n ScratchBlocks.Blocks.control_create_clone_of_menu.init = function () {\n const json = jsonForMenuBlock('CLONE_OPTION', cloneMenu, controlColors, []);\n this.jsonInit(json);\n };\n ScratchBlocks.VerticalFlyout.getCheckboxState = function (blockId) {\n const monitoredBlock = vm.runtime.monitorBlocks._blocks[blockId];\n return monitoredBlock ? monitoredBlock.isMonitored : false;\n };\n ScratchBlocks.FlyoutExtensionCategoryHeader.getExtensionState = function (extensionId) {\n if (vm.getPeripheralIsConnected(extensionId)) {\n return ScratchBlocks.StatusButtonState.READY;\n }\n return ScratchBlocks.StatusButtonState.NOT_READY;\n };\n ScratchBlocks.FieldNote.playNote_ = function (noteNum, extensionId) {\n vm.runtime.emit('PLAY_NOTE', noteNum, extensionId);\n };\n\n // Use a collator's compare instead of localeCompare which internally\n // creates a collator. Using this is a lot faster in browsers that create a\n // collator for every localeCompare call.\n const collator = new Intl.Collator([], {\n sensitivity: 'base',\n numeric: true\n });\n ScratchBlocks.scratchBlocksUtils.compareStrings = function (str1, str2) {\n return collator.compare(str1, str2);\n };\n\n // Blocks wants to know if 3D CSS transforms are supported. The cross\n // section of browsers Scratch supports and browsers that support 3D CSS\n // transforms will make the return always true.\n //\n // Shortcutting to true lets us skip an expensive style recalculation when\n // first loading the Scratch editor.\n ScratchBlocks.utils.is3dSupported = function () {\n return true;\n };\n return ScratchBlocks;\n});\n// EXTERNAL MODULE: ./src/components/box/box.jsx\nvar box = __webpack_require__(5);\n\n// EXTERNAL MODULE: ./src/components/button/button.jsx\nvar button_button = __webpack_require__(36);\n\n// EXTERNAL MODULE: ./src/components/close-button/close-button.jsx\nvar close_button = __webpack_require__(92);\n\n// EXTERNAL MODULE: ./src/lib/assets/icon--back.svg\nvar icon_back = __webpack_require__(184);\nvar icon_back_default = /*#__PURE__*/__webpack_require__.n(icon_back);\n\n// EXTERNAL MODULE: ./src/lib/assets/icon--help.svg\nvar icon_help = __webpack_require__(302);\nvar icon_help_default = /*#__PURE__*/__webpack_require__.n(icon_help);\n\n// EXTERNAL MODULE: ./src/components/modal/modal.css\nvar modal = __webpack_require__(58);\nvar modal_default = /*#__PURE__*/__webpack_require__.n(modal);\n\n// CONCATENATED MODULE: ./src/components/modal/modal.jsx\n\n\n\n\n\n\n\n\n\n\n\nconst ModalComponent = props => /*#__PURE__*/react_default.a.createElement(lib_default.a, {\n isOpen: true,\n className: classnames_default()(modal_default.a.modalContent, props.className, {\n [modal_default.a.fullScreen]: props.fullScreen\n }),\n contentLabel: props.contentLabel,\n overlayClassName: modal_default.a.modalOverlay,\n onRequestClose: props.onRequestClose\n}, /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n dir: props.isRtl ? 'rtl' : 'ltr',\n direction: \"column\",\n grow: 1\n}, /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: classnames_default()(modal_default.a.header, props.headerClassName)\n}, props.onHelp ? /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: classnames_default()(modal_default.a.headerItem, modal_default.a.headerItemHelp)\n}, /*#__PURE__*/react_default.a.createElement(button_button[\"a\" /* default */], {\n className: modal_default.a.helpButton,\n iconSrc: icon_help_default.a,\n onClick: props.onHelp\n}, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Help\",\n id: \"gui.modal.help\"\n}))) : null, /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: classnames_default()(modal_default.a.headerItem, modal_default.a.headerItemTitle)\n}, props.headerImage ? /*#__PURE__*/react_default.a.createElement(\"img\", {\n className: modal_default.a.headerImage,\n src: props.headerImage,\n draggable: false\n}) : null, props.contentLabel), /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: classnames_default()(modal_default.a.headerItem, modal_default.a.headerItemClose)\n}, props.fullScreen ? /*#__PURE__*/react_default.a.createElement(button_button[\"a\" /* default */], {\n className: modal_default.a.backButton,\n iconSrc: icon_back_default.a,\n onClick: props.onRequestClose\n}, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Back\",\n id: \"gui.modal.back\"\n})) : /*#__PURE__*/react_default.a.createElement(close_button[\"a\" /* default */], {\n size: close_button[\"a\" /* default */].SIZE_LARGE,\n onClick: props.onRequestClose\n}))), props.children));\nModalComponent.propTypes = {\n children: prop_types_default.a.node,\n className: prop_types_default.a.string,\n contentLabel: prop_types_default.a.oneOfType([prop_types_default.a.string, prop_types_default.a.object]).isRequired,\n fullScreen: prop_types_default.a.bool,\n headerClassName: prop_types_default.a.string,\n headerImage: prop_types_default.a.string,\n isRtl: prop_types_default.a.bool,\n onHelp: prop_types_default.a.func,\n onRequestClose: prop_types_default.a.func\n};\n/* harmony default export */ var modal_modal = (ModalComponent);\n// CONCATENATED MODULE: ./src/containers/modal.jsx\n\n\n\n\n\nclass modal_Modal extends react_default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['addEventListeners', 'removeEventListeners', 'handlePopState', 'pushHistory']);\n this.addEventListeners();\n }\n componentDidMount() {\n // Add a history event only if it's not currently for our modal. This\n // avoids polluting the history with many entries. We only need one.\n this.pushHistory(this.id, history.state === null || history.state !== this.id);\n }\n componentWillUnmount() {\n this.removeEventListeners();\n }\n addEventListeners() {\n window.addEventListener('popstate', this.handlePopState);\n }\n removeEventListeners() {\n window.removeEventListener('popstate', this.handlePopState);\n }\n handlePopState() {\n // Whenever someone navigates, we want to be closed\n this.props.onRequestClose();\n }\n get id() {\n return \"modal-\".concat(this.props.id);\n }\n pushHistory(state, push) {\n if (push) return history.pushState(state, this.id, null);\n history.replaceState(state, this.id, null);\n }\n render() {\n return /*#__PURE__*/react_default.a.createElement(modal_modal, this.props);\n }\n}\nmodal_Modal.propTypes = {\n id: prop_types_default.a.string.isRequired,\n isRtl: prop_types_default.a.bool,\n onRequestClose: prop_types_default.a.func,\n onRequestOpen: prop_types_default.a.func\n};\nconst modal_mapStateToProps = state => ({\n isRtl: state.locales.isRtl\n});\n/* harmony default export */ var containers_modal = (Object(react_redux_es[\"b\" /* connect */])(modal_mapStateToProps)(modal_Modal));\n// EXTERNAL MODULE: ./src/components/prompt/prompt.css\nvar prompt_prompt = __webpack_require__(51);\nvar prompt_default = /*#__PURE__*/__webpack_require__.n(prompt_prompt);\n\n// EXTERNAL MODULE: ./src/lib/tw-cloud-limits.js\nvar tw_cloud_limits = __webpack_require__(131);\n\n// EXTERNAL MODULE: ./src/lib/isScratchDesktop.js\nvar lib_isScratchDesktop = __webpack_require__(37);\n\n// CONCATENATED MODULE: ./src/components/prompt/prompt.jsx\n\n\n\n\n\n\n\n\n\nconst prompt_messages = Object(index_es[\"g\" /* defineMessages */])({\n forAllSpritesMessage: {\n \"id\": \"gui.gui.variableScopeOptionAllSprites\",\n \"defaultMessage\": \"For all sprites\"\n },\n forThisSpriteMessage: {\n \"id\": \"gui.gui.variableScopeOptionSpriteOnly\",\n \"defaultMessage\": \"For this sprite only\"\n },\n cloudVarOptionMessage: {\n \"id\": \"gui.gui.cloudVariableOption\",\n \"defaultMessage\": \"Cloud variable (stored on server)\"\n },\n availableToAllSpritesMessage: {\n \"id\": \"gui.gui.variablePromptAllSpritesMessage\",\n \"defaultMessage\": \"This variable will be available to all sprites.\"\n },\n listAvailableToAllSpritesMessage: {\n \"id\": \"gui.gui.listPromptAllSpritesMessage\",\n \"defaultMessage\": \"This list will be available to all sprites.\"\n }\n});\nconst Packager = () => /*#__PURE__*/react_default.a.createElement(\"a\", {\n href: \"https://packager.turbowarp.org\",\n target: \"_blank\",\n rel: \"noopener noreferrer\"\n}, 'TurboWarp Packager');\nconst PromptComponent = props => /*#__PURE__*/react_default.a.createElement(containers_modal, {\n className: prompt_default.a.modalContent,\n contentLabel: props.title,\n onRequestClose: props.onCancel,\n id: \"promptModal\"\n}, /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: prompt_default.a.body\n}, /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: prompt_default.a.label\n}, props.label), /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], null, /*#__PURE__*/react_default.a.createElement(\"input\", {\n autoFocus: true,\n className: prompt_default.a.variableNameTextInput,\n defaultValue: props.defaultValue,\n name: props.label,\n onChange: props.onChange,\n onFocus: props.onFocus,\n onKeyPress: props.onKeyPress\n})), props.showVariableOptions ? /*#__PURE__*/react_default.a.createElement(\"div\", null, props.isStage ? /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: prompt_default.a.infoMessage\n}, props.showListMessage ? /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], prompt_messages.listAvailableToAllSpritesMessage) : /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], prompt_messages.availableToAllSpritesMessage)) : /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: prompt_default.a.optionsRow\n}, /*#__PURE__*/react_default.a.createElement(\"label\", null, /*#__PURE__*/react_default.a.createElement(\"input\", {\n checked: props.globalSelected,\n name: \"variableScopeOption\",\n type: \"radio\",\n value: \"global\",\n onChange: props.onScopeOptionSelection\n}), /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], prompt_messages.forAllSpritesMessage)), /*#__PURE__*/react_default.a.createElement(\"label\", {\n className: classnames_default()({\n [prompt_default.a.disabledLabel]: props.cloudSelected\n })\n}, /*#__PURE__*/react_default.a.createElement(\"input\", {\n checked: !props.globalSelected,\n disabled: props.cloudSelected,\n name: \"variableScopeOption\",\n type: \"radio\",\n value: \"local\",\n onChange: props.onScopeOptionSelection\n}), /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], prompt_messages.forThisSpriteMessage))), props.showCloudOption ? /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: classnames_default()(prompt_default.a.cloudOption)\n}, /*#__PURE__*/react_default.a.createElement(\"label\", {\n className: classnames_default()({\n [prompt_default.a.disabledLabel]: !props.canAddCloudVariable\n })\n}, /*#__PURE__*/react_default.a.createElement(\"input\", {\n checked: props.cloudSelected && props.canAddCloudVariable,\n disabled: !props.canAddCloudVariable,\n type: \"checkbox\",\n onChange: props.onCloudVarOptionChange\n}), /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], prompt_messages.cloudVarOptionMessage))) : null) : null, props.cloudSelected && !props.isAddingCloudVariableScratchSafe && /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: prompt_default.a.infoMessage\n}, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */]\n// eslint-disable-next-line max-len\n, {\n defaultMessage: \"If you make this cloud variable, the project will exceed Scratch's limit of {number} variables, and some variables will not function if you upload the project to Scratch.\"\n // eslint-disable-next-line max-len\n ,\n\n id: \"tw.scratchUnsafeCloud\",\n values: {\n number: tw_cloud_limits[\"b\" /* SCRATCH_MAX_CLOUD_VARIABLES */]\n }\n})), props.cloudSelected && props.canAddCloudVariable && /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: prompt_default.a.infoMessage\n}, Object(lib_isScratchDesktop[\"a\" /* default */])() ? /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */]\n// eslint-disable-next-line max-len\n, {\n defaultMessage: \"In the desktop app, cloud variables sync between all desktop app windows on this computer. Upload the project to Scratch or use a tool like the {packager} for them to sync globally.\",\n values: {\n packager: /*#__PURE__*/react_default.a.createElement(Packager, null)\n },\n id: \"tw.desktopCloud\"\n}) : /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */]\n/* eslint-disable-next-line max-len */, {\n defaultMessage: \"Although you can create cloud variables, they won't work unless this project is uploaded to Scratch or converted using a tool like the {packager}.\"\n // eslint-disable-next-line max-len\n ,\n\n values: {\n packager: /*#__PURE__*/react_default.a.createElement(Packager, null)\n },\n id: \"tw.cantUseCloud\"\n})), /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: prompt_default.a.buttonRow\n}, /*#__PURE__*/react_default.a.createElement(\"button\", {\n className: prompt_default.a.cancelButton,\n onClick: props.onCancel\n}, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Cancel\",\n id: \"gui.prompt.cancel\"\n})), /*#__PURE__*/react_default.a.createElement(\"button\", {\n className: prompt_default.a.okButton,\n onClick: props.onOk\n}, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"OK\",\n id: \"gui.prompt.ok\"\n})))));\nPromptComponent.propTypes = {\n isAddingCloudVariableScratchSafe: prop_types_default.a.bool.isRequired,\n canAddCloudVariable: prop_types_default.a.bool.isRequired,\n cloudSelected: prop_types_default.a.bool.isRequired,\n defaultValue: prop_types_default.a.string,\n globalSelected: prop_types_default.a.bool.isRequired,\n isStage: prop_types_default.a.bool.isRequired,\n showListMessage: prop_types_default.a.bool.isRequired,\n label: prop_types_default.a.string.isRequired,\n onCancel: prop_types_default.a.func.isRequired,\n onChange: prop_types_default.a.func.isRequired,\n onCloudVarOptionChange: prop_types_default.a.func,\n onFocus: prop_types_default.a.func.isRequired,\n onKeyPress: prop_types_default.a.func.isRequired,\n onOk: prop_types_default.a.func.isRequired,\n onScopeOptionSelection: prop_types_default.a.func.isRequired,\n showCloudOption: prop_types_default.a.bool.isRequired,\n showVariableOptions: prop_types_default.a.bool.isRequired,\n title: prop_types_default.a.string.isRequired\n};\n/* harmony default export */ var components_prompt_prompt = (PromptComponent);\n// CONCATENATED MODULE: ./src/containers/prompt.jsx\n\n\n\n\n\n\nclass prompt_Prompt extends react_default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['handleOk', 'handleScopeOptionSelection', 'handleCancel', 'handleChange', 'handleKeyPress', 'handleCloudVariableOptionChange']);\n this.state = {\n isAddingCloudVariableScratchSafe: props.vm && props.vm.runtime.getNumberOfCloudVariables() < tw_cloud_limits[\"b\" /* SCRATCH_MAX_CLOUD_VARIABLES */] || false,\n inputValue: '',\n globalSelected: true,\n cloudSelected: false,\n canAddCloudVariable: props.vm && props.vm.runtime.canAddCloudVariable() || false\n };\n }\n handleKeyPress(event) {\n if (event.key === 'Enter') this.handleOk();\n }\n handleFocus(event) {\n event.target.select();\n }\n handleOk() {\n this.props.onOk(this.state.inputValue, {\n scope: this.state.globalSelected ? 'global' : 'local',\n isCloud: this.state.cloudSelected\n });\n }\n handleCancel() {\n this.props.onCancel();\n }\n handleChange(e) {\n this.setState({\n inputValue: e.target.value\n });\n }\n handleScopeOptionSelection(e) {\n this.setState({\n globalSelected: e.target.value === 'global'\n });\n }\n handleCloudVariableOptionChange(e) {\n if (!this.props.showCloudOption) return;\n const checked = e.target.checked;\n this.setState({\n cloudSelected: checked\n });\n if (checked) {\n this.setState({\n globalSelected: true\n });\n }\n }\n render() {\n return /*#__PURE__*/react_default.a.createElement(components_prompt_prompt, {\n isAddingCloudVariableScratchSafe: this.state.isAddingCloudVariableScratchSafe,\n canAddCloudVariable: this.state.canAddCloudVariable,\n cloudSelected: this.state.cloudSelected,\n defaultValue: this.props.defaultValue,\n globalSelected: this.state.globalSelected,\n isStage: this.props.isStage,\n showListMessage: this.props.showListMessage,\n label: this.props.label,\n showCloudOption: this.props.showCloudOption,\n showVariableOptions: this.props.showVariableOptions,\n title: this.props.title,\n onCancel: this.handleCancel,\n onChange: this.handleChange,\n onCloudVarOptionChange: this.handleCloudVariableOptionChange,\n onFocus: this.handleFocus,\n onKeyPress: this.handleKeyPress,\n onOk: this.handleOk,\n onScopeOptionSelection: this.handleScopeOptionSelection\n });\n }\n}\nprompt_Prompt.propTypes = {\n defaultValue: prop_types_default.a.string,\n isStage: prop_types_default.a.bool.isRequired,\n showListMessage: prop_types_default.a.bool.isRequired,\n label: prop_types_default.a.string.isRequired,\n onCancel: prop_types_default.a.func.isRequired,\n onOk: prop_types_default.a.func.isRequired,\n showCloudOption: prop_types_default.a.bool.isRequired,\n showVariableOptions: prop_types_default.a.bool.isRequired,\n title: prop_types_default.a.string.isRequired,\n vm: prop_types_default.a.instanceOf(src_default.a)\n};\n/* harmony default export */ var containers_prompt = (prompt_Prompt);\n// EXTERNAL MODULE: ./src/components/blocks/blocks.css\nvar blocks_blocks = __webpack_require__(230);\nvar blocks_default = /*#__PURE__*/__webpack_require__.n(blocks_blocks);\n\n// CONCATENATED MODULE: ./src/components/blocks/blocks.jsx\nconst blocks_excluded = [\"containerRef\", \"dragOver\"];\nfunction blocks_extends() { return blocks_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, blocks_extends.apply(null, arguments); }\nfunction blocks_objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = blocks_objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction blocks_objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\n\nconst BlocksComponent = props => {\n const {\n containerRef,\n dragOver\n } = props,\n componentProps = blocks_objectWithoutProperties(props, blocks_excluded);\n return /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], blocks_extends({\n className: classnames_default()(blocks_default.a.blocks, {\n [blocks_default.a.dragOver]: dragOver\n })\n }, componentProps, {\n componentRef: containerRef\n }));\n};\nBlocksComponent.propTypes = {\n containerRef: prop_types_default.a.func,\n dragOver: prop_types_default.a.bool\n};\n/* harmony default export */ var components_blocks_blocks = (BlocksComponent);\n// EXTERNAL MODULE: ./src/lib/libraries/extensions/index.jsx\nvar extensions = __webpack_require__(82);\n\n// EXTERNAL MODULE: ./src/lib/brand.js\nvar brand = __webpack_require__(24);\n\n// CONCATENATED MODULE: ./src/lib/libraries/tw-extension-tags.js\n\n\n// Because there are all brand names, it is unnecessary for them to be translatable.\n/* harmony default export */ var tw_extension_tags = ([{\n tag: 'scratch',\n intlLabel: 'Scratch'\n}, {\n tag: 'tw',\n intlLabel: brand[\"APP_NAME\"]\n}]);\n// EXTERNAL MODULE: ./src/components/play-button/play-button.css\nvar play_button = __webpack_require__(196);\nvar play_button_default = /*#__PURE__*/__webpack_require__.n(play_button);\n\n// EXTERNAL MODULE: ./src/components/play-button/icon--play.svg\nvar icon_play = __webpack_require__(303);\nvar icon_play_default = /*#__PURE__*/__webpack_require__.n(icon_play);\n\n// EXTERNAL MODULE: ./src/components/play-button/icon--stop.svg\nvar icon_stop = __webpack_require__(304);\nvar icon_stop_default = /*#__PURE__*/__webpack_require__.n(icon_stop);\n\n// CONCATENATED MODULE: ./src/components/play-button/play-button.jsx\nconst play_button_excluded = [\"className\", \"intl\", \"isPlaying\", \"onClick\", \"onMouseDown\", \"onMouseEnter\", \"onMouseLeave\", \"setButtonRef\"];\nfunction play_button_extends() { return play_button_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, play_button_extends.apply(null, arguments); }\nfunction play_button_objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = play_button_objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction play_button_objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\n\n\n\nconst play_button_messages = Object(index_es[\"g\" /* defineMessages */])({\n play: {\n \"id\": \"gui.playButton.play\",\n \"defaultMessage\": \"Play\"\n },\n stop: {\n \"id\": \"gui.playButton.stop\",\n \"defaultMessage\": \"Stop\"\n }\n});\nconst PlayButtonComponent = _ref => {\n let {\n className,\n intl,\n isPlaying,\n onClick,\n onMouseDown,\n onMouseEnter,\n onMouseLeave,\n setButtonRef\n } = _ref,\n props = play_button_objectWithoutProperties(_ref, play_button_excluded);\n const label = isPlaying ? intl.formatMessage(play_button_messages.stop) : intl.formatMessage(play_button_messages.play);\n return /*#__PURE__*/react_default.a.createElement(\"div\", play_button_extends({\n \"aria-label\": label,\n className: classnames_default()(play_button_default.a.playButton, className, {\n [play_button_default.a.playing]: isPlaying\n }),\n onClick: onClick,\n onMouseDown: onMouseDown,\n onMouseEnter: onMouseEnter,\n onMouseLeave: onMouseLeave,\n ref: setButtonRef\n }, props), /*#__PURE__*/react_default.a.createElement(\"img\", {\n className: play_button_default.a.playIcon,\n draggable: false,\n src: isPlaying ? icon_stop_default.a : icon_play_default.a\n }));\n};\nPlayButtonComponent.propTypes = {\n className: prop_types_default.a.string,\n intl: index_es[\"i\" /* intlShape */],\n isPlaying: prop_types_default.a.bool.isRequired,\n onClick: prop_types_default.a.func.isRequired,\n onMouseDown: prop_types_default.a.func.isRequired,\n onMouseEnter: prop_types_default.a.func.isRequired,\n onMouseLeave: prop_types_default.a.func.isRequired,\n setButtonRef: prop_types_default.a.func.isRequired\n};\n/* harmony default export */ var play_button_play_button = (Object(index_es[\"h\" /* injectIntl */])(PlayButtonComponent));\n// CONCATENATED MODULE: ./src/containers/play-button.jsx\n\n\n\n\nclass play_button_PlayButton extends react_default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['handleClick', 'handleMouseDown', 'handleMouseEnter', 'handleMouseLeave', 'handleTouchStart', 'setButtonRef']);\n this.state = {\n touchStarted: false\n };\n }\n getDerivedStateFromProps(props, state) {\n // if touchStarted is true and it's not playing, the sound must have ended.\n // reset the touchStarted state to allow the sound to be replayed\n if (state.touchStarted && !props.isPlaying) {\n return {\n touchStarted: false\n };\n }\n return null; // nothing changed\n }\n componentDidMount() {\n // Touch start\n this.buttonRef.addEventListener('touchstart', this.handleTouchStart);\n }\n componentWillUnmount() {\n this.buttonRef.removeEventListener('touchstart', this.handleTouchStart);\n }\n handleClick(e) {\n // stop the click from propagating out of the button\n e.stopPropagation();\n }\n handleMouseDown(e) {\n // prevent default (focus) on mouseDown\n e.preventDefault();\n if (this.props.isPlaying) {\n // stop sound and reset touch state\n this.props.onStop();\n if (this.state.touchstarted) this.setState({\n touchStarted: false\n });\n } else {\n this.props.onPlay();\n if (this.state.touchstarted) {\n // started on touch, but now clicked mouse\n this.setState({\n touchStarted: false\n });\n }\n }\n }\n handleTouchStart(e) {\n if (this.props.isPlaying) {\n // If playing, stop sound, and reset touch state\n e.preventDefault();\n this.setState({\n touchStarted: false\n });\n this.props.onStop();\n } else {\n // otherwise start playing, and set touch state\n e.preventDefault();\n this.setState({\n touchStarted: true\n });\n this.props.onPlay();\n }\n }\n handleMouseEnter(e) {\n // start the sound if it's not already playing\n e.preventDefault();\n if (!this.props.isPlaying) {\n this.props.onPlay();\n }\n }\n handleMouseLeave() {\n // stop the sound unless it was started by touch\n if (this.props.isPlaying && !this.state.touchstarted) {\n this.props.onStop();\n }\n }\n setButtonRef(ref) {\n this.buttonRef = ref;\n }\n render() {\n const {\n className,\n isPlaying,\n onPlay,\n // eslint-disable-line no-unused-vars\n onStop // eslint-disable-line no-unused-vars\n } = this.props;\n return /*#__PURE__*/react_default.a.createElement(play_button_play_button, {\n className: className,\n isPlaying: isPlaying,\n onClick: this.handleClick,\n onMouseDown: this.handleMouseDown,\n onMouseEnter: this.handleMouseEnter,\n onMouseLeave: this.handleMouseLeave,\n setButtonRef: this.setButtonRef\n });\n }\n}\nplay_button_PlayButton.propTypes = {\n className: prop_types_default.a.string,\n isPlaying: prop_types_default.a.bool.isRequired,\n onPlay: prop_types_default.a.func.isRequired,\n onStop: prop_types_default.a.func.isRequired\n};\n/* harmony default export */ var containers_play_button = (play_button_PlayButton);\n// EXTERNAL MODULE: ./src/components/library-item/library-item.css\nvar library_item = __webpack_require__(30);\nvar library_item_default = /*#__PURE__*/__webpack_require__.n(library_item);\n\n// EXTERNAL MODULE: ./src/components/library-item/bluetooth.svg\nvar bluetooth = __webpack_require__(305);\nvar bluetooth_default = /*#__PURE__*/__webpack_require__.n(bluetooth);\n\n// EXTERNAL MODULE: ./src/components/library-item/internet-connection.svg\nvar internet_connection = __webpack_require__(306);\nvar internet_connection_default = /*#__PURE__*/__webpack_require__.n(internet_connection);\n\n// EXTERNAL MODULE: ./src/components/library-item/favorite-inactive.svg\nvar favorite_inactive = __webpack_require__(307);\nvar favorite_inactive_default = /*#__PURE__*/__webpack_require__.n(favorite_inactive);\n\n// EXTERNAL MODULE: ./src/components/library-item/favorite-active.svg\nvar favorite_active = __webpack_require__(308);\nvar favorite_active_default = /*#__PURE__*/__webpack_require__.n(favorite_active);\n\n// CONCATENATED MODULE: ./src/components/library-item/library-item.jsx\n\n\n\n\n\n\n\n\n\n\n\nconst library_item_messages = Object(index_es[\"g\" /* defineMessages */])({\n favorite: {\n \"id\": \"tw.favorite\",\n \"defaultMessage\": \"Favorite\"\n },\n unfavorite: {\n \"id\": \"tw.unfavorite\",\n \"defaultMessage\": \"Unfavorite\"\n }\n});\n\n/* eslint-disable react/prefer-stateless-function */\nclass library_item_LibraryItemComponent extends react_default.a.PureComponent {\n render() {\n const favoriteMessage = this.props.intl.formatMessage(this.props.favorite ? library_item_messages.unfavorite : library_item_messages.favorite);\n const favorite = /*#__PURE__*/react_default.a.createElement(\"button\", {\n className: classnames_default()(library_item_default.a.favoriteContainer, {\n [library_item_default.a.active]: this.props.favorite\n }),\n onClick: this.props.onFavorite\n }, /*#__PURE__*/react_default.a.createElement(\"img\", {\n src: this.props.favorite ? favorite_active_default.a : favorite_inactive_default.a,\n className: library_item_default.a.favoriteIcon,\n draggable: false,\n alt: favoriteMessage,\n title: favoriteMessage\n }));\n return this.props.featured ? /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: classnames_default()(library_item_default.a.libraryItem, library_item_default.a.featuredItem, {\n [library_item_default.a.disabled]: this.props.disabled\n }, typeof this.props.extensionId === 'string' ? library_item_default.a.libraryItemExtension : null, this.props.hidden ? library_item_default.a.hidden : null),\n onClick: this.props.onClick\n }, /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: library_item_default.a.featuredImageContainer\n }, this.props.disabled ? /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: library_item_default.a.comingSoonText\n }, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Coming Soon\",\n id: \"gui.extensionLibrary.comingSoon\"\n })) : null, /*#__PURE__*/react_default.a.createElement(\"img\", {\n className: library_item_default.a.featuredImage,\n loading: \"lazy\",\n draggable: false,\n src: this.props.iconURL\n })), this.props.insetIconURL ? /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: library_item_default.a.libraryItemInsetImageContainer\n }, /*#__PURE__*/react_default.a.createElement(\"img\", {\n className: library_item_default.a.libraryItemInsetImage,\n src: this.props.insetIconURL,\n draggable: false\n })) : null, /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: typeof this.props.extensionId === 'string' ? classnames_default()(library_item_default.a.featuredExtensionText, library_item_default.a.featuredText) : library_item_default.a.featuredText\n }, /*#__PURE__*/react_default.a.createElement(\"span\", {\n className: library_item_default.a.libraryItemName\n }, this.props.name), /*#__PURE__*/react_default.a.createElement(\"br\", null), /*#__PURE__*/react_default.a.createElement(\"span\", {\n className: library_item_default.a.featuredDescription\n }, this.props.description)), (this.props.docsURI || this.props.samples) && /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: library_item_default.a.extensionLinks\n }, this.props.docsURI && /*#__PURE__*/react_default.a.createElement(\"a\", {\n href: this.props.docsURI,\n target: \"_blank\",\n rel: \"noreferrer\"\n }, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Documentation\"\n // eslint-disable-next-line max-len\n ,\n\n id: \"tw.documentation\"\n })), this.props.samples && /*#__PURE__*/react_default.a.createElement(\"a\", {\n href: this.props.samples[0].href,\n target: \"_blank\",\n rel: \"noreferrer\"\n }, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Sample project\"\n // eslint-disable-next-line max-len\n ,\n\n id: \"tw.sample\"\n }))), this.props.credits && this.props.credits.length > 0 && /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: library_item_default.a.extensionLinks\n }, /*#__PURE__*/react_default.a.createElement(\"div\", null, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Created by:\",\n id: \"tw.createdBy\"\n }), ' ', this.props.credits.map((credit, index) => /*#__PURE__*/react_default.a.createElement(react_default.a.Fragment, {\n key: index\n }, credit, index !== this.props.credits.length - 1 && ', ')))), this.props.bluetoothRequired || this.props.internetConnectionRequired || this.props.collaborator ? /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: library_item_default.a.featuredExtensionMetadata\n }, /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: library_item_default.a.featuredExtensionRequirement\n }, this.props.bluetoothRequired || this.props.internetConnectionRequired ? /*#__PURE__*/react_default.a.createElement(\"div\", null, /*#__PURE__*/react_default.a.createElement(\"div\", null, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Requires\",\n id: \"gui.extensionLibrary.requires\"\n })), /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: library_item_default.a.featuredExtensionMetadataDetail\n }, this.props.bluetoothRequired ? /*#__PURE__*/react_default.a.createElement(\"img\", {\n src: bluetooth_default.a,\n draggable: false\n }) : null, this.props.internetConnectionRequired ? /*#__PURE__*/react_default.a.createElement(\"img\", {\n src: internet_connection_default.a,\n draggable: false\n }) : null)) : null), /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: library_item_default.a.featuredExtensionCollaboration\n }, this.props.collaborator ? /*#__PURE__*/react_default.a.createElement(\"div\", null, /*#__PURE__*/react_default.a.createElement(\"div\", null, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Collaboration with\",\n id: \"gui.extensionLibrary.collaboration\"\n })), /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: library_item_default.a.featuredExtensionMetadataDetail\n }, this.props.collaborator)) : null)) : null, favorite) : /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: classnames_default()(library_item_default.a.libraryItem, {\n [library_item_default.a.hidden]: this.props.hidden\n }),\n role: \"button\",\n tabIndex: \"0\",\n onBlur: this.props.onBlur,\n onClick: this.props.onClick,\n onFocus: this.props.onFocus,\n onKeyPress: this.props.onKeyPress,\n onMouseEnter: this.props.showPlayButton ? null : this.props.onMouseEnter,\n onMouseLeave: this.props.showPlayButton ? null : this.props.onMouseLeave\n }, /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: library_item_default.a.libraryItemImageContainerWrapper\n }, /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: library_item_default.a.libraryItemImageContainer,\n onMouseEnter: this.props.showPlayButton ? this.props.onMouseEnter : null,\n onMouseLeave: this.props.showPlayButton ? this.props.onMouseLeave : null\n }, /*#__PURE__*/react_default.a.createElement(\"img\", {\n className: library_item_default.a.libraryItemImage,\n loading: \"lazy\",\n src: this.props.iconURL,\n draggable: false\n }))), /*#__PURE__*/react_default.a.createElement(\"span\", {\n className: library_item_default.a.libraryItemName\n }, this.props.name), this.props.showPlayButton ? /*#__PURE__*/react_default.a.createElement(containers_play_button, {\n isPlaying: this.props.isPlaying,\n onPlay: this.props.onPlay,\n onStop: this.props.onStop\n }) : null, favorite);\n }\n}\n/* eslint-enable react/prefer-stateless-function */\n\nlibrary_item_LibraryItemComponent.propTypes = {\n intl: index_es[\"i\" /* intlShape */],\n bluetoothRequired: prop_types_default.a.bool,\n collaborator: prop_types_default.a.string,\n description: prop_types_default.a.oneOfType([prop_types_default.a.string, prop_types_default.a.node]),\n disabled: prop_types_default.a.bool,\n extensionId: prop_types_default.a.string,\n featured: prop_types_default.a.bool,\n hidden: prop_types_default.a.bool,\n iconURL: prop_types_default.a.string,\n insetIconURL: prop_types_default.a.string,\n internetConnectionRequired: prop_types_default.a.bool,\n isPlaying: prop_types_default.a.bool,\n name: prop_types_default.a.oneOfType([prop_types_default.a.string, prop_types_default.a.node]),\n credits: prop_types_default.a.arrayOf(prop_types_default.a.oneOfType([prop_types_default.a.string, prop_types_default.a.node])),\n docsURI: prop_types_default.a.string,\n samples: prop_types_default.a.arrayOf(prop_types_default.a.shape({\n href: prop_types_default.a.string,\n text: prop_types_default.a.string\n })),\n favorite: prop_types_default.a.bool,\n onFavorite: prop_types_default.a.func,\n onBlur: prop_types_default.a.func.isRequired,\n onClick: prop_types_default.a.func.isRequired,\n onFocus: prop_types_default.a.func.isRequired,\n onKeyPress: prop_types_default.a.func.isRequired,\n onMouseEnter: prop_types_default.a.func.isRequired,\n onMouseLeave: prop_types_default.a.func.isRequired,\n onPlay: prop_types_default.a.func.isRequired,\n onStop: prop_types_default.a.func.isRequired,\n showPlayButton: prop_types_default.a.bool\n};\nlibrary_item_LibraryItemComponent.defaultProps = {\n disabled: false,\n showPlayButton: false\n};\n/* harmony default export */ var library_item_library_item = (library_item_LibraryItemComponent);\n// CONCATENATED MODULE: ./src/containers/library-item.jsx\n\n\n\n\n\nconst containers_library_item_messages = Object(index_es[\"g\" /* defineMessages */])({\n incompatible: {\n \"id\": \"tw.confirmIncompatibleExtension\",\n \"defaultMessage\": \"This extension is incompatible with Scratch. Projects made with it cannot be uploaded to the Scratch website. Are you sure you want to enable it?\"\n }\n});\nclass library_item_LibraryItem extends react_default.a.PureComponent {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['handleBlur', 'handleClick', 'handleFavorite', 'handleFocus', 'handleKeyPress', 'handleMouseEnter', 'handleMouseLeave', 'handlePlay', 'handleStop', 'rotateIcon', 'startRotatingIcons', 'stopRotatingIcons']);\n this.state = {\n iconIndex: 0,\n isRotatingIcon: false\n };\n }\n componentWillUnmount() {\n clearInterval(this.intervalId);\n }\n handleBlur(id) {\n this.handleMouseLeave(id);\n }\n handleClick(e) {\n if (e.target.closest('a')) {\n // Allow clicking on links inside the item\n return;\n }\n if (!this.props.favorite && this.props.incompatibleWithScratch && !e.shiftKey &&\n // eslint-disable-next-line no-alert\n !confirm(this.props.intl.formatMessage(containers_library_item_messages.incompatible))) {\n return;\n }\n if (!this.props.disabled) {\n if (this.props.href) {\n window.open(this.props.href);\n } else {\n this.props.onSelect(this.props.id);\n }\n }\n e.preventDefault();\n }\n handleFavorite(e) {\n e.stopPropagation();\n this.props.onFavorite(this.props.id);\n }\n handleFocus(id) {\n if (!this.props.showPlayButton) {\n this.handleMouseEnter(id);\n }\n }\n handleKeyPress(e) {\n if (e.key === ' ' || e.key === 'Enter') {\n e.preventDefault();\n this.props.onSelect(this.props.id);\n }\n }\n handleMouseEnter() {\n // only show hover effects on the item if not showing a play button\n if (!this.props.showPlayButton) {\n this.props.onMouseEnter(this.props.id);\n if (this.props.icons && this.props.icons.length) {\n this.stopRotatingIcons();\n this.setState({\n isRotatingIcon: true\n }, this.startRotatingIcons);\n }\n }\n }\n handleMouseLeave() {\n // only show hover effects on the item if not showing a play button\n if (!this.props.showPlayButton) {\n this.props.onMouseLeave(this.props.id);\n if (this.props.icons && this.props.icons.length) {\n this.setState({\n isRotatingIcon: false\n }, this.stopRotatingIcons);\n }\n }\n }\n handlePlay() {\n this.props.onMouseEnter(this.props.id);\n }\n handleStop() {\n this.props.onMouseLeave(this.props.id);\n }\n startRotatingIcons() {\n this.rotateIcon();\n this.intervalId = setInterval(this.rotateIcon, 300);\n }\n stopRotatingIcons() {\n if (this.intervalId) {\n this.intervalId = clearInterval(this.intervalId);\n }\n }\n rotateIcon() {\n const nextIconIndex = (this.state.iconIndex + 1) % this.props.icons.length;\n this.setState({\n iconIndex: nextIconIndex\n });\n }\n curIconMd5() {\n const iconMd5Prop = this.props.iconMd5;\n if (this.props.icons && this.state.isRotatingIcon && this.state.iconIndex < this.props.icons.length) {\n const icon = this.props.icons[this.state.iconIndex] || {};\n return icon.md5ext ||\n // 3.0 library format\n icon.baseLayerMD5 ||\n // 2.0 library format, TODO GH-5084\n iconMd5Prop;\n }\n return iconMd5Prop;\n }\n render() {\n const iconMd5 = this.curIconMd5();\n const iconURL = iconMd5 ? \"https://cdn.assets.scratch.mit.edu/internalapi/asset/\".concat(iconMd5, \"/get/\") : this.props.iconRawURL;\n return /*#__PURE__*/react_default.a.createElement(library_item_library_item, {\n intl: this.props.intl,\n bluetoothRequired: this.props.bluetoothRequired,\n collaborator: this.props.collaborator,\n description: this.props.description,\n disabled: this.props.disabled,\n extensionId: this.props.extensionId,\n featured: this.props.featured,\n hidden: this.props.hidden,\n iconURL: iconURL,\n icons: this.props.icons,\n id: this.props.id,\n insetIconURL: this.props.insetIconURL,\n internetConnectionRequired: this.props.internetConnectionRequired,\n isPlaying: this.props.isPlaying,\n name: this.props.name,\n credits: this.props.credits,\n docsURI: this.props.docsURI,\n samples: this.props.samples,\n favorite: this.props.favorite,\n onFavorite: this.handleFavorite,\n showPlayButton: this.props.showPlayButton,\n onBlur: this.handleBlur,\n onClick: this.handleClick,\n onFocus: this.handleFocus,\n onKeyPress: this.handleKeyPress,\n onMouseEnter: this.handleMouseEnter,\n onMouseLeave: this.handleMouseLeave,\n onPlay: this.handlePlay,\n onStop: this.handleStop\n });\n }\n}\nlibrary_item_LibraryItem.propTypes = {\n intl: index_es[\"i\" /* intlShape */],\n bluetoothRequired: prop_types_default.a.bool,\n collaborator: prop_types_default.a.string,\n description: prop_types_default.a.oneOfType([prop_types_default.a.string, prop_types_default.a.node]),\n disabled: prop_types_default.a.bool,\n extensionId: prop_types_default.a.string,\n href: prop_types_default.a.string,\n featured: prop_types_default.a.bool,\n hidden: prop_types_default.a.bool,\n iconMd5: prop_types_default.a.string,\n iconRawURL: prop_types_default.a.string,\n icons: prop_types_default.a.arrayOf(prop_types_default.a.shape({\n baseLayerMD5: prop_types_default.a.string,\n // 2.0 library format, TODO GH-5084\n md5ext: prop_types_default.a.string // 3.0 library format\n })),\n id: prop_types_default.a.number.isRequired,\n incompatibleWithScratch: prop_types_default.a.bool,\n insetIconURL: prop_types_default.a.string,\n internetConnectionRequired: prop_types_default.a.bool,\n isPlaying: prop_types_default.a.bool,\n name: prop_types_default.a.oneOfType([prop_types_default.a.string, prop_types_default.a.node]),\n credits: prop_types_default.a.arrayOf(prop_types_default.a.oneOfType([prop_types_default.a.string, prop_types_default.a.node])),\n docsURI: prop_types_default.a.string,\n samples: prop_types_default.a.arrayOf(prop_types_default.a.shape({\n href: prop_types_default.a.string,\n text: prop_types_default.a.string\n })),\n favorite: prop_types_default.a.bool,\n onFavorite: prop_types_default.a.func,\n onMouseEnter: prop_types_default.a.func.isRequired,\n onMouseLeave: prop_types_default.a.func.isRequired,\n onSelect: prop_types_default.a.func.isRequired,\n showPlayButton: prop_types_default.a.bool\n};\n/* harmony default export */ var containers_library_item = (Object(index_es[\"h\" /* injectIntl */])(library_item_LibraryItem));\n// EXTERNAL MODULE: ./src/components/divider/divider.jsx\nvar divider = __webpack_require__(185);\n\n// CONCATENATED MODULE: ./src/lib/tw-recolor/render.jsx\nconst render_excluded = [\"src\"];\nfunction render_extends() { return render_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, render_extends.apply(null, arguments); }\nfunction render_objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = render_objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction render_objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\n// This is a wrapper around that forces re-render when theme state updates.\n\nconst TWRenderRecoloredImage = _ref => {\n let {\n src\n } = _ref,\n props = render_objectWithoutProperties(_ref, render_excluded);\n return /*#__PURE__*/react_default.a.createElement(\"img\", render_extends({\n src: typeof src === 'function' ? src() : src\n }, props));\n};\nTWRenderRecoloredImage.propTypes = {\n src: prop_types_default.a.oneOfType([prop_types_default.a.string, prop_types_default.a.func])\n};\nconst render_mapStateToProps = state => ({\n theme: state.scratchGui.theme.theme\n});\nconst render_mapDispatchToProps = () => ({});\n/* harmony default export */ var render = (Object(react_redux_es[\"b\" /* connect */])(render_mapStateToProps, render_mapDispatchToProps)(TWRenderRecoloredImage));\n// CONCATENATED MODULE: ./src/lib/tw-recolor/build.js!./src/components/filter/icon--filter.svg\n\n const original = \"\\n \\n\\n\";\n\n const getSRC = () => {\n const recolored = typeof Recolor === 'object' ? (\n original.replace(/#855cd6/gi, Recolor.primary)\n ) : original;\n return 'data:image/svg+xml;,' + encodeURIComponent(recolored);\n };\n\n /* harmony default export */ var icon_filter = (getSRC);\n\n// CONCATENATED MODULE: ./src/lib/tw-recolor/build.js!./src/components/filter/icon--x.svg\n\n const icon_x_original = \"\\n \\n\\n\";\n\n const icon_x_getSRC = () => {\n const recolored = typeof Recolor === 'object' ? (\n icon_x_original.replace(/#855cd6/gi, Recolor.primary)\n ) : icon_x_original;\n return 'data:image/svg+xml;,' + encodeURIComponent(recolored);\n };\n\n /* harmony default export */ var icon_x = (icon_x_getSRC);\n\n// EXTERNAL MODULE: ./src/components/filter/filter.css\nvar filter = __webpack_require__(123);\nvar filter_default = /*#__PURE__*/__webpack_require__.n(filter);\n\n// CONCATENATED MODULE: ./src/components/filter/filter.jsx\n\n\n\n\n\n\n\nconst FilterComponent = props => {\n const {\n className,\n onChange,\n onClear,\n placeholderText,\n filterQuery,\n inputClassName\n } = props;\n return /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: classnames_default()(className, filter_default.a.filter, {\n [filter_default.a.isActive]: filterQuery.length > 0\n })\n }, /*#__PURE__*/react_default.a.createElement(render, {\n className: filter_default.a.filterIcon,\n src: icon_filter\n }), /*#__PURE__*/react_default.a.createElement(\"input\", {\n className: classnames_default()(filter_default.a.filterInput, inputClassName),\n placeholder: placeholderText,\n type: \"text\",\n value: filterQuery,\n onChange: onChange\n }), /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: filter_default.a.xIconWrapper,\n onClick: onClear\n }, /*#__PURE__*/react_default.a.createElement(render, {\n className: filter_default.a.xIcon,\n src: icon_x\n })));\n};\nFilterComponent.propTypes = {\n className: prop_types_default.a.string,\n filterQuery: prop_types_default.a.string,\n inputClassName: prop_types_default.a.string,\n onChange: prop_types_default.a.func,\n onClear: prop_types_default.a.func,\n placeholderText: prop_types_default.a.string\n};\nFilterComponent.defaultProps = {\n placeholderText: 'Search'\n};\n/* harmony default export */ var filter_filter = (FilterComponent);\n// EXTERNAL MODULE: ./src/components/tag-button/tag-button.css\nvar tag_button = __webpack_require__(197);\nvar tag_button_default = /*#__PURE__*/__webpack_require__.n(tag_button);\n\n// CONCATENATED MODULE: ./src/components/tag-button/tag-button.jsx\nconst tag_button_excluded = [\"active\", \"iconClassName\", \"className\", \"tag\", \"intlLabel\"];\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction tag_button_extends() { return tag_button_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, tag_button_extends.apply(null, arguments); }\nfunction tag_button_objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = tag_button_objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction tag_button_objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\n\n\nconst TagButtonComponent = _ref => {\n let {\n active,\n iconClassName,\n className,\n tag,\n // eslint-disable-line no-unused-vars\n intlLabel\n } = _ref,\n props = tag_button_objectWithoutProperties(_ref, tag_button_excluded);\n return /*#__PURE__*/react_default.a.createElement(button_button[\"a\" /* default */], tag_button_extends({\n className: classnames_default()(tag_button_default.a.tagButton, className, {\n [tag_button_default.a.active]: active\n }),\n iconClassName: classnames_default()(tag_button_default.a.tagButtonIcon, iconClassName)\n }, props), typeof intlLabel === 'string' ? intlLabel : /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], intlLabel));\n};\nTagButtonComponent.propTypes = _objectSpread(_objectSpread({}, button_button[\"a\" /* default */].propTypes), {}, {\n active: prop_types_default.a.bool,\n intlLabel: prop_types_default.a.oneOfType([prop_types_default.a.shape({\n defaultMessage: prop_types_default.a.string,\n description: prop_types_default.a.string,\n id: prop_types_default.a.string\n }), prop_types_default.a.string]).isRequired,\n tag: prop_types_default.a.string.isRequired\n});\nTagButtonComponent.defaultProps = {\n active: false\n};\n/* harmony default export */ var tag_button_tag_button = (TagButtonComponent);\n// CONCATENATED MODULE: ./src/containers/tag-button.jsx\nfunction tag_button_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction tag_button_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? tag_button_ownKeys(Object(t), !0).forEach(function (r) { tag_button_defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : tag_button_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction tag_button_defineProperty(e, r, t) { return (r = tag_button_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction tag_button_toPropertyKey(t) { var i = tag_button_toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction tag_button_toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction containers_tag_button_extends() { return containers_tag_button_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, containers_tag_button_extends.apply(null, arguments); }\n\n\n\n\nclass tag_button_TagButton extends react_default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['handleClick']);\n }\n handleClick() {\n this.props.onClick(this.props.tag);\n }\n render() {\n return /*#__PURE__*/react_default.a.createElement(tag_button_tag_button, containers_tag_button_extends({}, this.props, {\n onClick: this.handleClick\n }));\n }\n}\ntag_button_TagButton.propTypes = tag_button_objectSpread(tag_button_objectSpread({}, tag_button_tag_button.propTypes), {}, {\n onClick: prop_types_default.a.func\n});\n/* harmony default export */ var containers_tag_button = (tag_button_TagButton);\n// EXTERNAL MODULE: ./src/components/spinner/spinner.jsx\nvar spinner = __webpack_require__(132);\n\n// EXTERNAL MODULE: ./src/components/tw-extension-separator/separator.css\nvar separator = __webpack_require__(310);\nvar separator_default = /*#__PURE__*/__webpack_require__.n(separator);\n\n// CONCATENATED MODULE: ./src/components/tw-extension-separator/separator.jsx\n\n\nconst Separator = () => /*#__PURE__*/react_default.a.createElement(\"hr\", {\n className: separator_default.a.separator\n});\n/* harmony default export */ var tw_extension_separator_separator = (Separator);\n// EXTERNAL MODULE: ./src/components/tw-removed-trademarks/removed-trademarks.css\nvar removed_trademarks = __webpack_require__(311);\nvar removed_trademarks_default = /*#__PURE__*/__webpack_require__.n(removed_trademarks);\n\n// CONCATENATED MODULE: ./src/components/tw-removed-trademarks/removed-trademarks.jsx\n\n\n\nconst RemovedTrademarks = () => /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: removed_trademarks_default.a.removedTrademarks\n}, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */]\n// eslint-disable-next-line max-len\n, {\n defaultMessage: \"Some items that contained Scratch trademarks are no longer listed here.\"\n // eslint-disable-next-line max-len\n ,\n\n id: \"tw.removedTrademarks\"\n}));\n/* harmony default export */ var tw_removed_trademarks_removed_trademarks = (RemovedTrademarks);\n// EXTERNAL MODULE: ./src/components/library/library.css\nvar library_library = __webpack_require__(65);\nvar library_default = /*#__PURE__*/__webpack_require__.n(library_library);\n\n// CONCATENATED MODULE: ./src/components/library/library.jsx\nfunction library_extends() { return library_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, library_extends.apply(null, arguments); }\nfunction library_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction library_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? library_ownKeys(Object(t), !0).forEach(function (r) { library_defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : library_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction library_defineProperty(e, r, t) { return (r = library_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction library_toPropertyKey(t) { var i = library_toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction library_toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst library_messages = Object(index_es[\"g\" /* defineMessages */])({\n filterPlaceholder: {\n \"id\": \"gui.library.filterPlaceholder\",\n \"defaultMessage\": \"Search\"\n },\n allTag: {\n \"id\": \"gui.library.allTag\",\n \"defaultMessage\": \"All\"\n }\n});\nconst ALL_TAG = {\n tag: 'all',\n intlLabel: library_messages.allTag\n};\nconst tagListPrefix = [ALL_TAG];\nclass library_LibraryComponent extends react_default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['handleClose', 'handleFilterChange', 'handleFilterClear', 'handleMouseEnter', 'handleMouseLeave', 'handlePlayingEnd', 'handleSelect', 'handleFavorite', 'handleTagClick', 'setFilteredDataRef']);\n const favorites = this.readFavoritesFromStorage();\n this.state = {\n playingItem: null,\n filterQuery: '',\n selectedTag: ALL_TAG.tag,\n canDisplay: false,\n favorites,\n initialFavorites: favorites\n };\n }\n componentDidMount() {\n // Rendering all the items in the library can take a bit, so we'll always\n // show one frame with a loading spinner.\n setTimeout(() => {\n this.setState({\n canDisplay: true\n });\n });\n if (this.props.setStopHandler) this.props.setStopHandler(this.handlePlayingEnd);\n }\n componentDidUpdate(prevProps, prevState) {\n if (prevState.filterQuery !== this.state.filterQuery || prevState.selectedTag !== this.state.selectedTag) {\n this.scrollToTop();\n }\n if (this.state.favorites !== prevState.favorites) {\n try {\n localStorage.setItem(this.getFavoriteStorageKey(), JSON.stringify(this.state.favorites));\n } catch (error) {\n // ignore\n }\n }\n }\n handleSelect(id) {\n this.handleClose();\n this.props.onItemSelected(this.getFilteredData()[id]);\n }\n readFavoritesFromStorage() {\n let data;\n try {\n data = JSON.parse(localStorage.getItem(this.getFavoriteStorageKey()));\n } catch (error) {\n // ignore\n }\n if (!Array.isArray(data)) {\n data = [];\n }\n return data;\n }\n getFavoriteStorageKey() {\n return \"tw:library-favorites:\".concat(this.props.id);\n }\n handleFavorite(id) {\n const data = this.getFilteredData()[id];\n const key = data[this.props.persistableKey];\n this.setState(oldState => ({\n favorites: oldState.favorites.includes(key) ? oldState.favorites.filter(i => i !== key) : [...oldState.favorites, key]\n }));\n }\n handleClose() {\n this.props.onRequestClose();\n }\n handleTagClick(tag) {\n if (this.state.playingItem === null) {\n this.setState({\n filterQuery: '',\n selectedTag: tag.toLowerCase()\n });\n } else {\n this.props.onItemMouseLeave(this.getFilteredData()[[this.state.playingItem]]);\n this.setState({\n filterQuery: '',\n playingItem: null,\n selectedTag: tag.toLowerCase()\n });\n }\n }\n handleMouseEnter(id) {\n // don't restart if mouse over already playing item\n if (this.props.onItemMouseEnter && this.state.playingItem !== id) {\n this.props.onItemMouseEnter(this.getFilteredData()[id]);\n this.setState({\n playingItem: id\n });\n }\n }\n handleMouseLeave(id) {\n if (this.props.onItemMouseLeave) {\n this.props.onItemMouseLeave(this.getFilteredData()[id]);\n this.setState({\n playingItem: null\n });\n }\n }\n handlePlayingEnd() {\n if (this.state.playingItem !== null) {\n this.setState({\n playingItem: null\n });\n }\n }\n handleFilterChange(event) {\n if (this.state.playingItem === null) {\n this.setState({\n filterQuery: event.target.value,\n selectedTag: ALL_TAG.tag\n });\n } else {\n this.props.onItemMouseLeave(this.getFilteredData()[[this.state.playingItem]]);\n this.setState({\n filterQuery: event.target.value,\n playingItem: null,\n selectedTag: ALL_TAG.tag\n });\n }\n }\n handleFilterClear() {\n this.setState({\n filterQuery: ''\n });\n }\n getFilteredData() {\n // When no filtering, favorites get their own section\n if (this.state.selectedTag === 'all' && !this.state.filterQuery) {\n const favoriteItems = this.props.data.filter(dataItem => this.state.initialFavorites.includes(dataItem[this.props.persistableKey])).map(dataItem => library_objectSpread(library_objectSpread({}, dataItem), {}, {\n key: \"favorite-\".concat(dataItem[this.props.persistableKey])\n }));\n if (favoriteItems.length) {\n favoriteItems.push('---');\n }\n return [...favoriteItems, ...this.props.data];\n }\n\n // When filtering, favorites are just listed first, not in a separate section.\n const favoriteItems = [];\n const nonFavoriteItems = [];\n for (const dataItem of this.props.data) {\n if (dataItem === '---') {\n // ignore\n } else if (this.state.initialFavorites.includes(dataItem[this.props.persistableKey])) {\n favoriteItems.push(dataItem);\n } else {\n nonFavoriteItems.push(dataItem);\n }\n }\n let filteredItems = favoriteItems.concat(nonFavoriteItems);\n if (this.state.selectedTag !== 'all') {\n filteredItems = filteredItems.filter(dataItem => dataItem.tags && dataItem.tags.map(i => i.toLowerCase()).includes(this.state.selectedTag));\n }\n if (this.state.filterQuery) {\n filteredItems = filteredItems.filter(dataItem => {\n const search = [...dataItem.tags];\n if (dataItem.name) {\n // Use the name if it is a string, else use formatMessage to get the translated name\n if (typeof dataItem.name === 'string') {\n search.push(dataItem.name);\n } else {\n search.push(this.props.intl.formatMessage(dataItem.name.props, {\n APP_NAME: brand[\"APP_NAME\"]\n }));\n }\n }\n if (dataItem.description) {\n if (typeof dataItem.description === 'string') {\n search.push(dataItem.description);\n } else {\n search.push(this.props.intl.formatMessage(dataItem.description.props, {\n APP_NAME: brand[\"APP_NAME\"]\n }));\n }\n }\n return search.join('\\n').toLowerCase().includes(this.state.filterQuery.toLowerCase());\n });\n }\n return filteredItems;\n }\n scrollToTop() {\n this.filteredDataRef.scrollTop = 0;\n }\n setFilteredDataRef(ref) {\n this.filteredDataRef = ref;\n }\n render() {\n const filteredData = this.state.canDisplay && this.props.data && this.getFilteredData();\n return /*#__PURE__*/react_default.a.createElement(containers_modal, {\n fullScreen: true,\n contentLabel: this.props.title,\n id: this.props.id,\n onRequestClose: this.handleClose\n }, (this.props.filterable || this.props.tags) && /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: library_default.a.filterBar\n }, this.props.filterable && /*#__PURE__*/react_default.a.createElement(filter_filter, {\n className: classnames_default()(library_default.a.filterBarItem, library_default.a.filter),\n filterQuery: this.state.filterQuery,\n inputClassName: library_default.a.filterInput,\n placeholderText: this.props.intl.formatMessage(library_messages.filterPlaceholder),\n onChange: this.handleFilterChange,\n onClear: this.handleFilterClear\n }), this.props.filterable && this.props.tags && /*#__PURE__*/react_default.a.createElement(divider[\"a\" /* default */], {\n className: classnames_default()(library_default.a.filterBarItem, library_default.a.divider)\n }), this.props.tags && /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: library_default.a.tagWrapper\n }, tagListPrefix.concat(this.props.tags).map((tagProps, id) => /*#__PURE__*/react_default.a.createElement(containers_tag_button, library_extends({\n active: this.state.selectedTag === tagProps.tag.toLowerCase(),\n className: classnames_default()(library_default.a.filterBarItem, library_default.a.tagButton, tagProps.className),\n key: \"tag-button-\".concat(id),\n onClick: this.handleTagClick\n }, tagProps))))), /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: classnames_default()(library_default.a.libraryScrollGrid, {\n [library_default.a.withFilterBar]: this.props.filterable || this.props.tags\n }),\n ref: this.setFilteredDataRef\n }, filteredData && this.getFilteredData().map((dataItem, index) => dataItem === '---' ? /*#__PURE__*/react_default.a.createElement(tw_extension_separator_separator, {\n key: index\n }) : /*#__PURE__*/react_default.a.createElement(containers_library_item, {\n bluetoothRequired: dataItem.bluetoothRequired,\n collaborator: dataItem.collaborator,\n description: dataItem.description,\n disabled: dataItem.disabled,\n extensionId: dataItem.extensionId,\n href: dataItem.href,\n featured: dataItem.featured,\n hidden: dataItem.hidden,\n iconMd5: dataItem.costumes ? dataItem.costumes[0].md5ext : dataItem.md5ext,\n iconRawURL: dataItem.rawURL,\n icons: dataItem.costumes,\n id: index,\n incompatibleWithScratch: dataItem.incompatibleWithScratch,\n favorite: this.state.favorites.includes(dataItem[this.props.persistableKey]),\n onFavorite: this.handleFavorite,\n insetIconURL: dataItem.insetIconURL,\n internetConnectionRequired: dataItem.internetConnectionRequired,\n isPlaying: this.state.playingItem === index,\n key: dataItem.key || (typeof dataItem.name === 'string' ? dataItem.name : dataItem.rawURL),\n name: dataItem.name,\n credits: dataItem.credits,\n samples: dataItem.samples,\n docsURI: dataItem.docsURI,\n showPlayButton: this.props.showPlayButton,\n onMouseEnter: this.handleMouseEnter,\n onMouseLeave: this.handleMouseLeave,\n onSelect: this.handleSelect\n })), filteredData && this.props.removedTrademarks && /*#__PURE__*/react_default.a.createElement(react_default.a.Fragment, null, filteredData.length > 0 && /*#__PURE__*/react_default.a.createElement(tw_extension_separator_separator, null), /*#__PURE__*/react_default.a.createElement(tw_removed_trademarks_removed_trademarks, null)), !filteredData && /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: library_default.a.spinnerWrapper\n }, /*#__PURE__*/react_default.a.createElement(spinner[\"a\" /* default */], {\n large: true,\n level: \"primary\"\n }))));\n }\n}\nlibrary_LibraryComponent.propTypes = {\n data: prop_types_default.a.oneOfType([prop_types_default.a.arrayOf(prop_types_default.a.oneOfType([/* eslint-disable react/no-unused-prop-types, lines-around-comment */\n // An item in the library\n prop_types_default.a.shape({\n // @todo remove md5/rawURL prop from library, refactor to use storage\n md5: prop_types_default.a.string,\n name: prop_types_default.a.oneOfType([prop_types_default.a.string, prop_types_default.a.node]),\n rawURL: prop_types_default.a.string\n }), prop_types_default.a.string\n /* eslint-enable react/no-unused-prop-types, lines-around-comment */])), prop_types_default.a.instanceOf(Promise)]),\n filterable: prop_types_default.a.bool,\n id: prop_types_default.a.string.isRequired,\n persistableKey: prop_types_default.a.string,\n intl: index_es[\"i\" /* intlShape */].isRequired,\n onItemMouseEnter: prop_types_default.a.func,\n onItemMouseLeave: prop_types_default.a.func,\n onItemSelected: prop_types_default.a.func,\n onRequestClose: prop_types_default.a.func,\n setStopHandler: prop_types_default.a.func,\n showPlayButton: prop_types_default.a.bool,\n tags: prop_types_default.a.arrayOf(prop_types_default.a.shape(containers_tag_button.propTypes)),\n title: prop_types_default.a.string.isRequired,\n removedTrademarks: prop_types_default.a.bool\n};\nlibrary_LibraryComponent.defaultProps = {\n filterable: true,\n persistableKey: 'name',\n showPlayButton: false\n};\n/* harmony default export */ var components_library_library = (Object(index_es[\"h\" /* injectIntl */])(library_LibraryComponent));\n// EXTERNAL MODULE: ./src/components/action-menu/icon--sprite.svg\nvar icon_sprite = __webpack_require__(186);\nvar icon_sprite_default = /*#__PURE__*/__webpack_require__.n(icon_sprite);\n\n// CONCATENATED MODULE: ./src/containers/extension-library.jsx\nfunction extension_library_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction extension_library_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? extension_library_ownKeys(Object(t), !0).forEach(function (r) { extension_library_defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : extension_library_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction extension_library_defineProperty(e, r, t) { return (r = extension_library_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction extension_library_toPropertyKey(t) { var i = extension_library_toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction extension_library_toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\n\n\n\n\n\n\n\n\n\nconst extension_library_messages = Object(index_es[\"g\" /* defineMessages */])({\n extensionTitle: {\n \"id\": \"gui.extensionLibrary.chooseAnExtension\",\n \"defaultMessage\": \"Choose an Extension\"\n }\n});\nconst toLibraryItem = extension => {\n if (typeof extension === 'object') {\n return extension_library_objectSpread({\n rawURL: extension.iconURL || icon_sprite_default.a\n }, extension);\n }\n return extension;\n};\nconst translateGalleryItem = (extension, locale) => extension_library_objectSpread(extension_library_objectSpread({}, extension), {}, {\n name: extension.nameTranslations[locale] || extension.name,\n description: extension.descriptionTranslations[locale] || extension.description\n});\nlet cachedGallery = null;\nconst fetchLibrary = async () => {\n const res = await fetch('https://extensions.turbowarp.org/generated-metadata/extensions-v0.json');\n if (!res.ok) {\n throw new Error(\"HTTP status \".concat(res.status));\n }\n const data = await res.json();\n return data.extensions.map(extension => ({\n name: extension.name,\n nameTranslations: extension.nameTranslations || {},\n description: extension.description,\n descriptionTranslations: extension.descriptionTranslations || {},\n extensionId: extension.id,\n extensionURL: \"https://extensions.turbowarp.org/\".concat(extension.slug, \".js\"),\n iconURL: \"https://extensions.turbowarp.org/\".concat(extension.image || 'images/unknown.svg'),\n tags: ['tw'],\n credits: [...(extension.original || []), ...(extension.by || [])].map(credit => {\n if (credit.link) {\n return /*#__PURE__*/react_default.a.createElement(\"a\", {\n href: credit.link,\n target: \"_blank\",\n rel: \"noreferrer\",\n key: credit.name\n }, credit.name);\n }\n return credit.name;\n }),\n docsURI: extension.docs ? \"https://extensions.turbowarp.org/\".concat(extension.slug) : null,\n samples: extension.samples ? extension.samples.map(sample => ({\n href: \"\".concat(\"\", \"editor?project_url=https://extensions.turbowarp.org/samples/\").concat(encodeURIComponent(sample), \".sb3\"),\n text: sample\n })) : null,\n incompatibleWithScratch: !extension.scratchCompatible,\n featured: true\n }));\n};\nclass extension_library_ExtensionLibrary extends react_default.a.PureComponent {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['handleItemSelect']);\n this.state = {\n gallery: cachedGallery,\n galleryError: null,\n galleryTimedOut: false\n };\n }\n componentDidMount() {\n if (!this.state.gallery) {\n const timeout = setTimeout(() => {\n this.setState({\n galleryTimedOut: true\n });\n }, 750);\n fetchLibrary().then(gallery => {\n cachedGallery = gallery;\n this.setState({\n gallery\n });\n clearTimeout(timeout);\n }).catch(error => {\n log[\"default\"].error(error);\n this.setState({\n galleryError: error\n });\n clearTimeout(timeout);\n });\n }\n }\n handleItemSelect(item) {\n if (item.href) {\n return;\n }\n const extensionId = item.extensionId;\n if (extensionId === 'custom_extension') {\n this.props.onOpenCustomExtensionModal();\n return;\n }\n if (extensionId === 'procedures_enable_return') {\n this.props.onEnableProcedureReturns();\n this.props.onCategorySelected('myBlocks');\n return;\n }\n const url = item.extensionURL ? item.extensionURL : extensionId;\n if (!item.disabled) {\n if (this.props.vm.extensionManager.isExtensionLoaded(extensionId)) {\n this.props.onCategorySelected(extensionId);\n } else {\n this.props.vm.extensionManager.loadExtensionURL(url).then(() => {\n this.props.onCategorySelected(extensionId);\n }).catch(err => {\n log[\"default\"].error(err);\n // eslint-disable-next-line no-alert\n alert(err);\n });\n }\n }\n }\n render() {\n let library = null;\n if (this.state.gallery || this.state.galleryError || this.state.galleryTimedOut) {\n library = extensions[\"a\" /* default */].map(toLibraryItem);\n library.push('---');\n if (this.state.gallery) {\n library.push(toLibraryItem(extensions[\"d\" /* galleryMore */]));\n const locale = this.props.intl.locale;\n library.push(...this.state.gallery.filter(i => i.extensionId !== 'faceSensing').map(i => translateGalleryItem(i, locale)).map(toLibraryItem));\n } else if (this.state.galleryError) {\n library.push(toLibraryItem(extensions[\"b\" /* galleryError */]));\n } else {\n library.push(toLibraryItem(extensions[\"c\" /* galleryLoading */]));\n }\n }\n return /*#__PURE__*/react_default.a.createElement(components_library_library, {\n data: library,\n filterable: true,\n persistableKey: \"extensionId\",\n id: \"extensionLibrary\",\n tags: tw_extension_tags,\n title: this.props.intl.formatMessage(extension_library_messages.extensionTitle),\n visible: this.props.visible,\n onItemSelected: this.handleItemSelect,\n onRequestClose: this.props.onRequestClose\n });\n }\n}\nextension_library_ExtensionLibrary.propTypes = {\n intl: index_es[\"i\" /* intlShape */].isRequired,\n onCategorySelected: prop_types_default.a.func,\n onEnableProcedureReturns: prop_types_default.a.func,\n onOpenCustomExtensionModal: prop_types_default.a.func,\n onRequestClose: prop_types_default.a.func,\n visible: prop_types_default.a.bool,\n vm: prop_types_default.a.instanceOf(src_default.a).isRequired // eslint-disable-line react/no-unused-prop-types\n};\n/* harmony default export */ var extension_library = (Object(index_es[\"h\" /* injectIntl */])(extension_library_ExtensionLibrary));\n// EXTERNAL MODULE: ./src/components/custom-procedures/icon--boolean-input.svg\nvar icon_boolean_input = __webpack_require__(312);\nvar icon_boolean_input_default = /*#__PURE__*/__webpack_require__.n(icon_boolean_input);\n\n// EXTERNAL MODULE: ./src/components/custom-procedures/icon--text-input.svg\nvar icon_text_input = __webpack_require__(313);\nvar icon_text_input_default = /*#__PURE__*/__webpack_require__.n(icon_text_input);\n\n// EXTERNAL MODULE: ./src/components/custom-procedures/icon--label.svg\nvar icon_label = __webpack_require__(314);\nvar icon_label_default = /*#__PURE__*/__webpack_require__.n(icon_label);\n\n// EXTERNAL MODULE: ./src/components/custom-procedures/custom-procedures.css\nvar custom_procedures = __webpack_require__(38);\nvar custom_procedures_default = /*#__PURE__*/__webpack_require__.n(custom_procedures);\n\n// CONCATENATED MODULE: ./src/components/custom-procedures/custom-procedures.jsx\n\n\n\n\n\n\n\n\n\nconst custom_procedures_messages = Object(index_es[\"g\" /* defineMessages */])({\n myblockModalTitle: {\n \"id\": \"gui.customProcedures.myblockModalTitle\",\n \"defaultMessage\": \"Make a Block\"\n }\n});\nconst custom_procedures_CustomProcedures = props => /*#__PURE__*/react_default.a.createElement(containers_modal, {\n className: custom_procedures_default.a.modalContent,\n contentLabel: props.intl.formatMessage(custom_procedures_messages.myblockModalTitle),\n onRequestClose: props.onCancel,\n id: \"customProceduresModal\"\n}, /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: custom_procedures_default.a.workspace,\n componentRef: props.componentRef\n}), /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: custom_procedures_default.a.body\n}, /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: custom_procedures_default.a.optionsRow\n}, /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: custom_procedures_default.a.optionCard,\n role: \"button\",\n tabIndex: \"0\",\n onClick: props.onAddTextNumber\n}, /*#__PURE__*/react_default.a.createElement(\"img\", {\n className: custom_procedures_default.a.optionIcon,\n src: icon_text_input_default.a,\n draggable: false\n}), /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: custom_procedures_default.a.optionTitle\n}, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Add an input\",\n id: \"gui.customProcedures.addAnInputNumberText\"\n})), /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: custom_procedures_default.a.optionDescription\n}, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"number or text\",\n id: \"gui.customProcedures.numberTextType\"\n}))), /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: custom_procedures_default.a.optionCard,\n role: \"button\",\n tabIndex: \"0\",\n onClick: props.onAddBoolean\n}, /*#__PURE__*/react_default.a.createElement(\"img\", {\n className: custom_procedures_default.a.optionIcon,\n src: icon_boolean_input_default.a,\n draggable: false\n}), /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: custom_procedures_default.a.optionTitle\n}, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Add an input\",\n id: \"gui.customProcedures.addAnInputBoolean\"\n})), /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: custom_procedures_default.a.optionDescription\n}, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"boolean\",\n id: \"gui.customProcedures.booleanType\"\n}))), /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: custom_procedures_default.a.optionCard,\n role: \"button\",\n tabIndex: \"0\",\n onClick: props.onAddLabel\n}, /*#__PURE__*/react_default.a.createElement(\"img\", {\n className: custom_procedures_default.a.optionIcon,\n src: icon_label_default.a,\n draggable: false\n}), /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: custom_procedures_default.a.optionTitle\n}, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Add a label\",\n id: \"gui.customProcedures.addALabel\"\n})))), /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: custom_procedures_default.a.checkboxRow\n}, /*#__PURE__*/react_default.a.createElement(\"label\", null, /*#__PURE__*/react_default.a.createElement(\"input\", {\n checked: props.warp,\n type: \"checkbox\",\n onChange: props.onToggleWarp\n}), /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Run without screen refresh\",\n id: \"gui.customProcedures.runWithoutScreenRefresh\"\n}))), /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: custom_procedures_default.a.buttonRow\n}, /*#__PURE__*/react_default.a.createElement(\"button\", {\n className: custom_procedures_default.a.cancelButton,\n onClick: props.onCancel\n}, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Cancel\",\n id: \"gui.customProcedures.cancel\"\n})), /*#__PURE__*/react_default.a.createElement(\"button\", {\n className: custom_procedures_default.a.okButton,\n onClick: props.onOk\n}, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"OK\",\n id: \"gui.customProcedures.ok\"\n})))));\ncustom_procedures_CustomProcedures.propTypes = {\n componentRef: prop_types_default.a.func.isRequired,\n intl: index_es[\"i\" /* intlShape */],\n onAddBoolean: prop_types_default.a.func.isRequired,\n onAddLabel: prop_types_default.a.func.isRequired,\n onAddTextNumber: prop_types_default.a.func.isRequired,\n onCancel: prop_types_default.a.func.isRequired,\n onOk: prop_types_default.a.func.isRequired,\n onToggleWarp: prop_types_default.a.func.isRequired,\n warp: prop_types_default.a.bool.isRequired\n};\n/* harmony default export */ var custom_procedures_custom_procedures = (Object(index_es[\"h\" /* injectIntl */])(custom_procedures_CustomProcedures));\n// CONCATENATED MODULE: ./src/containers/custom-procedures.jsx\n\n\n\n\n\n\n\nclass containers_custom_procedures_CustomProcedures extends react_default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['handleAddLabel', 'handleAddBoolean', 'handleAddTextNumber', 'handleToggleWarp', 'handleCancel', 'handleOk', 'setBlocks']);\n this.state = {\n rtlOffset: 0,\n warp: false\n };\n }\n componentWillUnmount() {\n if (this.workspace) {\n this.workspace.dispose();\n }\n }\n setBlocks(blocksRef) {\n if (!blocksRef) return;\n this.blocks = blocksRef;\n const workspaceConfig = lodash_defaultsdeep_default()({}, containers_custom_procedures_CustomProcedures.defaultOptions, this.props.options, {\n rtl: this.props.isRtl\n });\n const ScratchBlocks = tw_lazy_scratch_blocks[\"a\" /* default */].get();\n // @todo This is a hack to make there be no toolbox.\n const oldDefaultToolbox = ScratchBlocks.Blocks.defaultToolbox;\n ScratchBlocks.Blocks.defaultToolbox = null;\n this.workspace = ScratchBlocks.inject(this.blocks, workspaceConfig);\n ScratchBlocks.Blocks.defaultToolbox = oldDefaultToolbox;\n\n // Create the procedure declaration block for editing the mutation.\n this.mutationRoot = this.workspace.newBlock('procedures_declaration');\n // Make the declaration immovable, undeletable and have no context menu\n this.mutationRoot.setMovable(false);\n this.mutationRoot.setDeletable(false);\n this.mutationRoot.contextMenu = false;\n this.workspace.addChangeListener(() => {\n this.mutationRoot.onChangeFn();\n // Keep the block centered on the workspace\n const metrics = this.workspace.getMetrics();\n const {\n x,\n y\n } = this.mutationRoot.getRelativeToSurfaceXY();\n const dy = metrics.viewHeight / 2 - this.mutationRoot.height / 2 - y;\n let dx;\n if (this.props.isRtl) {\n // // TODO: https://github.com/LLK/scratch-gui/issues/2838\n // This is temporary until we can figure out what's going on width\n // block positioning on the workspace for RTL.\n // Workspace is always origin top-left, with x increasing to the right\n // Calculate initial starting offset and save it, every other move\n // has to take the original offset into account.\n // Calculate a new left postion based on new width\n // Convert current x position into LTR (mirror) x position (uses original offset)\n // Use the difference between ltrX and mirrorX as the amount to move\n const ltrX = metrics.viewWidth / 2 - this.mutationRoot.width / 2 + 25;\n const mirrorX = x - (x - this.state.rtlOffset) * 2;\n if (mirrorX === ltrX) {\n return;\n }\n dx = mirrorX - ltrX;\n const midPoint = metrics.viewWidth / 2;\n if (x === 0) {\n // if it's the first time positioning, it should always move right\n if (this.mutationRoot.width < midPoint) {\n dx = ltrX;\n } else if (this.mutationRoot.width < metrics.viewWidth) {\n dx = midPoint - (metrics.viewWidth - this.mutationRoot.width) / 2;\n } else {\n dx = midPoint + (this.mutationRoot.width - metrics.viewWidth);\n }\n this.mutationRoot.moveBy(dx, dy);\n this.setState({\n rtlOffset: this.mutationRoot.getRelativeToSurfaceXY().x\n });\n return;\n }\n if (this.mutationRoot.width > metrics.viewWidth) {\n dx = dx + this.mutationRoot.width - metrics.viewWidth;\n }\n } else {\n dx = metrics.viewWidth / 2 - this.mutationRoot.width / 2 - x;\n // If the procedure declaration is wider than the view width,\n // keep the right-hand side of the procedure in view.\n if (this.mutationRoot.width > metrics.viewWidth) {\n dx = metrics.viewWidth - this.mutationRoot.width - x;\n }\n }\n this.mutationRoot.moveBy(dx, dy);\n });\n this.mutationRoot.domToMutation(this.props.mutator);\n this.mutationRoot.initSvg();\n this.mutationRoot.render();\n this.setState({\n warp: this.mutationRoot.getWarp()\n });\n // Allow the initial events to run to position this block, then focus.\n setTimeout(() => {\n this.mutationRoot.focusLastEditor_();\n });\n }\n handleCancel() {\n this.props.onRequestClose();\n }\n handleOk() {\n const newMutation = this.mutationRoot ? this.mutationRoot.mutationToDom(true) : null;\n this.props.onRequestClose(newMutation);\n }\n handleAddLabel() {\n if (this.mutationRoot) {\n this.mutationRoot.addLabelExternal();\n }\n }\n handleAddBoolean() {\n if (this.mutationRoot) {\n this.mutationRoot.addBooleanExternal();\n }\n }\n handleAddTextNumber() {\n if (this.mutationRoot) {\n this.mutationRoot.addStringNumberExternal();\n }\n }\n handleToggleWarp() {\n if (this.mutationRoot) {\n const newWarp = !this.mutationRoot.getWarp();\n this.mutationRoot.setWarp(newWarp);\n this.setState({\n warp: newWarp\n });\n }\n }\n render() {\n return /*#__PURE__*/react_default.a.createElement(custom_procedures_custom_procedures, {\n componentRef: this.setBlocks,\n warp: this.state.warp,\n onAddBoolean: this.handleAddBoolean,\n onAddLabel: this.handleAddLabel,\n onAddTextNumber: this.handleAddTextNumber,\n onCancel: this.handleCancel,\n onOk: this.handleOk,\n onToggleWarp: this.handleToggleWarp\n });\n }\n}\ncontainers_custom_procedures_CustomProcedures.propTypes = {\n isRtl: prop_types_default.a.bool,\n mutator: prop_types_default.a.instanceOf(Element),\n onRequestClose: prop_types_default.a.func.isRequired,\n options: prop_types_default.a.shape({\n media: prop_types_default.a.string,\n zoom: prop_types_default.a.shape({\n controls: prop_types_default.a.bool,\n wheel: prop_types_default.a.bool,\n startScale: prop_types_default.a.number\n }),\n comments: prop_types_default.a.bool,\n collapse: prop_types_default.a.bool\n })\n};\ncontainers_custom_procedures_CustomProcedures.defaultOptions = {\n zoom: {\n controls: false,\n wheel: false,\n startScale: 0.9\n },\n comments: false,\n collapse: false,\n scrollbars: true\n};\ncontainers_custom_procedures_CustomProcedures.defaultProps = {\n options: containers_custom_procedures_CustomProcedures.defaultOptions\n};\nconst custom_procedures_mapStateToProps = state => ({\n isRtl: state.locales.isRtl,\n mutator: state.scratchGui.customProcedures.mutator\n});\n/* harmony default export */ var containers_custom_procedures = (Object(react_redux_es[\"b\" /* connect */])(custom_procedures_mapStateToProps)(containers_custom_procedures_CustomProcedures));\n// EXTERNAL MODULE: ./src/lib/layout-constants.js\nvar layout_constants = __webpack_require__(16);\n\n// CONCATENATED MODULE: ./src/lib/drop-area-hoc.jsx\nfunction drop_area_hoc_extends() { return drop_area_hoc_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, drop_area_hoc_extends.apply(null, arguments); }\n\n\n\n\n\n\n/**\n * Higher Order Component to give components the ability to react to drag overs\n * and drops of objects stored in the assetDrag redux state.\n *\n * Example: You want to enable MyComponent to receive drops from a drag type\n * Wrapped = DropAreaHOC([...dragTypes])(\n * \n * )\n *\n * MyComponent now receives 2 new props\n * containerRef: a ref that must be set on the container element\n * dragOver: boolean if an asset is being dragged above the component\n *\n * Use the wrapped component:\n * \n *\n * NB: This HOC _only_ works with objects that drag using the assetDrag reducer.\n * This _does not_ handle drags for blocks coming from the workspace.\n *\n * @param {Array.} dragTypes Types to respond to, from DragConstants\n * @returns {function} The HOC, specialized for those drag types\n */\nconst drop_area_hoc_DropAreaHOC = function DropAreaHOC(dragTypes) {\n /**\n * Return the HOC, specialized for the dragTypes\n * @param {React.Component} WrappedComponent component to receive drop behaviors\n * @returns {React.Component} component with drag over/drop behavior\n */\n return function (WrappedComponent) {\n class DropAreaWrapper extends react_default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['setRef']);\n this.state = {\n dragOver: false\n };\n this.ref = null;\n this.containerBox = null;\n }\n componentWillReceiveProps(newProps) {\n // If `dragging` becomes true, record the drop area rectangle\n if (newProps.dragInfo.dragging && !this.props.dragInfo.dragging) {\n this.dropAreaRect = this.ref && this.ref.getBoundingClientRect();\n // If `dragging` becomes false, call the drop handler\n } else if (!newProps.dragInfo.dragging && this.props.dragInfo.dragging && this.state.dragOver) {\n this.props.onDrop(this.props.dragInfo);\n this.setState({\n dragOver: false\n });\n }\n\n // If a drag is in progress (currentOffset) and it matches the relevant drag types,\n // test if the drag is within the drop area rect and set the state accordingly.\n if (this.dropAreaRect && newProps.dragInfo.currentOffset && dragTypes.includes(newProps.dragInfo.dragType)) {\n const {\n x,\n y\n } = newProps.dragInfo.currentOffset;\n const {\n top,\n right,\n bottom,\n left\n } = this.dropAreaRect;\n if (x > left && x < right && y > top && y < bottom) {\n this.setState({\n dragOver: true\n });\n } else {\n this.setState({\n dragOver: false\n });\n }\n }\n }\n setRef(el) {\n this.ref = el;\n if (this.props.componentRef) {\n this.props.componentRef(this.ref);\n }\n }\n render() {\n const componentProps = lodash_omit_default()(this.props, ['onDrop', 'dragInfo', 'componentRef']);\n return /*#__PURE__*/react_default.a.createElement(WrappedComponent, drop_area_hoc_extends({\n containerRef: this.setRef,\n dragOver: this.state.dragOver\n }, componentProps));\n }\n }\n DropAreaWrapper.propTypes = {\n componentRef: prop_types_default.a.func,\n dragInfo: prop_types_default.a.shape({\n currentOffset: prop_types_default.a.shape({\n x: prop_types_default.a.number,\n y: prop_types_default.a.number\n }),\n dragType: prop_types_default.a.string,\n dragging: prop_types_default.a.bool,\n index: prop_types_default.a.number\n }),\n onDrop: prop_types_default.a.func\n };\n const mapStateToProps = state => ({\n dragInfo: state.scratchGui.assetDrag\n });\n const mapDispatchToProps = () => ({});\n return Object(react_redux_es[\"b\" /* connect */])(mapStateToProps, mapDispatchToProps)(DropAreaWrapper);\n };\n};\n/* harmony default export */ var drop_area_hoc = (drop_area_hoc_DropAreaHOC);\n// CONCATENATED MODULE: ./src/lib/drag-constants.js\n/* harmony default export */ var drag_constants = ({\n SOUND: 'SOUND',\n COSTUME: 'COSTUME',\n SPRITE: 'SPRITE',\n CODE: 'CODE',\n BACKPACK_SOUND: 'BACKPACK_SOUND',\n BACKPACK_COSTUME: 'BACKPACK_COSTUME',\n BACKPACK_SPRITE: 'BACKPACK_SPRITE',\n BACKPACK_CODE: 'BACKPACK_CODE'\n});\n// EXTERNAL MODULE: ./node_modules/scratch-vm/src/extension-support/argument-type.js\nvar argument_type = __webpack_require__(129);\nvar argument_type_default = /*#__PURE__*/__webpack_require__.n(argument_type);\n\n// EXTERNAL MODULE: ./node_modules/scratch-vm/src/extension-support/block-type.js\nvar block_type = __webpack_require__(70);\nvar block_type_default = /*#__PURE__*/__webpack_require__.n(block_type);\n\n// EXTERNAL MODULE: ./src/lib/themes/index.js + 10 modules\nvar themes = __webpack_require__(15);\n\n// CONCATENATED MODULE: ./src/lib/themes/blockHelpers.js\nfunction blockHelpers_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction blockHelpers_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? blockHelpers_ownKeys(Object(t), !0).forEach(function (r) { blockHelpers_defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : blockHelpers_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction blockHelpers_defineProperty(e, r, t) { return (r = blockHelpers_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction blockHelpers_toPropertyKey(t) { var i = blockHelpers_toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction blockHelpers_toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\nconst getBlockIconURI = extensionIcons => {\n if (!extensionIcons) return null;\n return extensionIcons.blockIconURI || extensionIcons.menuIconURI;\n};\nconst getCategoryIconURI = extensionIcons => {\n if (!extensionIcons) return null;\n return extensionIcons.menuIconURI || extensionIcons.blockIconURI;\n};\n\n// scratch-blocks colours has a pen property that scratch-gui uses for all extensions\nconst getExtensionColors = theme => theme.getBlockColors().pen;\nconst DEFAULT_EXTENSION_PRIMARY = '#0fbd8c';\n\n/**\n * Applies extension color theme to categories.\n * No changes are applied if called with the default theme, allowing extensions to provide their own colors.\n * These colors are not seen if the category provides a blockIconURI.\n * @param {Array.} dynamicBlockXML - XML for each category of extension blocks, returned from getBlocksXML\n * in the vm runtime.\n * @param {Theme} theme - Theme name\n * @returns {Array.} Dynamic block XML updated with colors.\n */\nconst injectExtensionCategoryTheme = (dynamicBlockXML, theme) => {\n // Minor optimization -- don't do anything at all for the default theme.\n if (theme.blocks === themes[\"j\" /* BLOCKS_THREE */]) return dynamicBlockXML;\n const extensionColors = getExtensionColors(theme);\n const extensionIcons = theme.getExtensions();\n const parser = new DOMParser();\n const serializer = new XMLSerializer();\n return dynamicBlockXML.map(extension => {\n const dom = parser.parseFromString(extension.xml, 'text/xml');\n const primaryColor = dom.documentElement.getAttribute('colour');\n const usesCustomColors = primaryColor.toLowerCase() !== DEFAULT_EXTENSION_PRIMARY;\n if (usesCustomColors) {\n const converters = theme.getCustomExtensionColors();\n dom.documentElement.setAttribute('colour', converters.categoryIconBackground(primaryColor));\n dom.documentElement.setAttribute('secondaryColour', converters.categoryIconBorder(primaryColor));\n } else {\n dom.documentElement.setAttribute('colour', extensionColors.primary);\n // Note: the category's secondaryColour matches up with the blocks' tertiary color,\n // both used for border color.\n dom.documentElement.setAttribute('secondaryColour', extensionColors.tertiary);\n }\n const categoryIconURI = getCategoryIconURI(extensionIcons[extension.id]);\n if (categoryIconURI) {\n dom.documentElement.setAttribute('iconURI', categoryIconURI);\n }\n return blockHelpers_objectSpread(blockHelpers_objectSpread({}, extension), {}, {\n xml: serializer.serializeToString(dom)\n });\n });\n};\nconst injectBlockIcons = (blockInfoJson, theme) => {\n // Block icons are the first element of `args0`\n if (!blockInfoJson.args0 || blockInfoJson.args0.length < 1 || blockInfoJson.args0[0].type !== 'field_image') return blockInfoJson;\n const extensionIcons = theme.getExtensions();\n const extensionId = blockInfoJson.type.substring(0, blockInfoJson.type.indexOf('_'));\n const blockIconURI = getBlockIconURI(extensionIcons[extensionId]);\n if (!blockIconURI) return blockInfoJson;\n return blockHelpers_objectSpread(blockHelpers_objectSpread({}, blockInfoJson), {}, {\n args0: blockInfoJson.args0.map((value, index) => {\n if (index !== 0) return value;\n return blockHelpers_objectSpread(blockHelpers_objectSpread({}, value), {}, {\n src: blockIconURI\n });\n })\n });\n};\n\n/**\n * Applies extension color theme to static block json.\n * No changes are applied if called with the default theme, allowing extensions to provide their own colors.\n * @param {object} blockInfoJson - Static block json\n * @param {Theme} theme - Theme name\n * @returns {object} Block info json with updated colors. The original blockInfoJson is not modified.\n */\nconst injectExtensionBlockTheme = (blockInfoJson, theme) => {\n var _blockInfoJson$extens;\n // Minor optimization -- don't do anything at all for the default theme.\n if (theme.blocks === themes[\"j\" /* BLOCKS_THREE */]) return blockInfoJson;\n if (!((_blockInfoJson$extens = blockInfoJson.extensions) !== null && _blockInfoJson$extens !== void 0 && _blockInfoJson$extens.includes('default_extension_colors'))) {\n const converters = theme.getCustomExtensionColors();\n return blockHelpers_objectSpread(blockHelpers_objectSpread({}, blockInfoJson), {}, {\n colour: converters.primary(blockInfoJson.colour),\n colourSecondary: converters.secondary(blockInfoJson.colour),\n colourTertiary: converters.tertiary(blockInfoJson.colour),\n colourQuaternary: converters.quaternary(blockInfoJson.colour)\n });\n }\n const extensionColors = getExtensionColors(theme);\n return blockHelpers_objectSpread(blockHelpers_objectSpread({}, injectBlockIcons(blockInfoJson, theme)), {}, {\n colour: extensionColors.primary,\n colourSecondary: extensionColors.secondary,\n colourTertiary: extensionColors.tertiary,\n colourQuaternary: extensionColors.quaternary\n });\n};\n\n// CONCATENATED MODULE: ./src/lib/define-dynamic-block.js\n// TODO: access `BlockType` and `ArgumentType` without reaching into VM\n// Should we move these into a new extension support module or something?\n\n\n\n\n/**\n * Define a block using extension info which has the ability to dynamically determine (and update) its layout.\n * This functionality is used for extension blocks which can change its properties based on different state\n * information. For example, the `control_stop` block changes its shape based on which menu item is selected\n * and a variable block changes its text to reflect the variable name without using an editable field.\n * @param {object} ScratchBlocks - The ScratchBlocks name space.\n * @param {object} categoryInfo - Information about this block's extension category, including any menus and icons.\n * @param {object} staticBlockInfo - The base block information before any dynamic changes.\n * @param {string} extendedOpcode - The opcode for the block (including the extension ID).\n * @param {Theme} theme - the current theme\n */\n// TODO: grow this until it can fully replace `_convertForScratchBlocks` in the VM runtime\nconst defineDynamicBlock = (ScratchBlocks, categoryInfo, staticBlockInfo, extendedOpcode, theme) => ({\n init: function init() {\n const colors = injectExtensionBlockTheme(staticBlockInfo.json, theme);\n const blockJson = {\n type: extendedOpcode,\n inputsInline: true,\n category: categoryInfo.name,\n colour: colors.colour,\n colourSecondary: colors.colourSecondary,\n colourTertiary: colors.colourTertiary,\n colourQuaternary: colors.colourQuaternary\n };\n // There is a scratch-blocks / Blockly extension called \"scratch_extension\" which adjusts the styling of\n // blocks to allow for an icon, a feature of Scratch extension blocks. However, Scratch \"core\" extension\n // blocks don't have icons and so they should not use 'scratch_extension'. Adding a scratch-blocks / Blockly\n // extension after `jsonInit` isn't fully supported (?), so we decide now whether there will be an icon.\n if (staticBlockInfo.blockIconURI || categoryInfo.blockIconURI) {\n blockJson.extensions = ['scratch_extension'];\n }\n // initialize the basics of the block, to be overridden & extended later by `domToMutation`\n this.jsonInit(blockJson);\n // initialize the cached block info used to carry block info from `domToMutation` to `mutationToDom`\n this.blockInfoText = '{}';\n // we need a block info update (through `domToMutation`) before we have a completely initialized block\n this.needsBlockInfoUpdate = true;\n },\n mutationToDom: function mutationToDom() {\n const container = document.createElement('mutation');\n container.setAttribute('blockInfo', this.blockInfoText);\n return container;\n },\n domToMutation: function domToMutation(xmlElement) {\n const blockInfoText = xmlElement.getAttribute('blockInfo');\n if (!blockInfoText) return;\n if (!this.needsBlockInfoUpdate) {\n throw new Error('Attempted to update block info twice');\n }\n delete this.needsBlockInfoUpdate;\n this.blockInfoText = blockInfoText;\n const blockInfo = JSON.parse(blockInfoText);\n switch (blockInfo.blockType) {\n case block_type_default.a.COMMAND:\n case block_type_default.a.CONDITIONAL:\n case block_type_default.a.LOOP:\n this.setOutputShape(ScratchBlocks.OUTPUT_SHAPE_SQUARE);\n this.setPreviousStatement(true);\n this.setNextStatement(!blockInfo.isTerminal);\n break;\n case block_type_default.a.REPORTER:\n this.setOutput(true);\n this.setOutputShape(ScratchBlocks.OUTPUT_SHAPE_ROUND);\n if (!blockInfo.disableMonitor) {\n this.setCheckboxInFlyout(true);\n }\n break;\n case block_type_default.a.BOOLEAN:\n this.setOutput(true);\n this.setOutputShape(ScratchBlocks.OUTPUT_SHAPE_HEXAGONAL);\n break;\n case block_type_default.a.HAT:\n case block_type_default.a.EVENT:\n this.setOutputShape(ScratchBlocks.OUTPUT_SHAPE_SQUARE);\n this.setNextStatement(true);\n break;\n }\n if (blockInfo.color1 || blockInfo.color2 || blockInfo.color3) {\n // `setColour` handles undefined parameters by adjusting defined colors\n this.setColour(blockInfo.color1, blockInfo.color2, blockInfo.color3);\n }\n\n // Layout block arguments\n // TODO handle E/C Blocks\n const blockText = blockInfo.text;\n const args = [];\n let argCount = 0;\n const scratchBlocksStyleText = blockText.replace(/\\[(.+?)]/g, (match, argName) => {\n const arg = blockInfo.arguments[argName];\n switch (arg.type) {\n case argument_type_default.a.STRING:\n args.push({\n type: 'input_value',\n name: argName\n });\n break;\n case argument_type_default.a.BOOLEAN:\n args.push({\n type: 'input_value',\n name: argName,\n check: 'Boolean'\n });\n break;\n }\n return \"%\".concat(++argCount);\n });\n this.interpolate_(scratchBlocksStyleText, args);\n }\n});\n/* harmony default export */ var define_dynamic_block = (defineDynamicBlock);\n// EXTERNAL MODULE: ./src/reducers/toolbox.js\nvar toolbox = __webpack_require__(159);\n\n// EXTERNAL MODULE: ./src/reducers/color-picker.js\nvar color_picker = __webpack_require__(109);\n\n// EXTERNAL MODULE: ./src/reducers/custom-procedures.js\nvar reducers_custom_procedures = __webpack_require__(136);\n\n// EXTERNAL MODULE: ./src/reducers/connection-modal.js\nvar connection_modal = __webpack_require__(118);\n\n// EXTERNAL MODULE: ./src/reducers/workspace-metrics.js\nvar workspace_metrics = __webpack_require__(160);\n\n// EXTERNAL MODULE: ./src/reducers/time-travel.js\nvar time_travel = __webpack_require__(72);\n\n// EXTERNAL MODULE: ./src/components/tw-loading-spinner/spinner.css\nvar tw_loading_spinner_spinner = __webpack_require__(231);\nvar spinner_default = /*#__PURE__*/__webpack_require__.n(tw_loading_spinner_spinner);\n\n// CONCATENATED MODULE: ./src/components/tw-loading-spinner/spinner.jsx\n\n\nconst Loading = () => /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: spinner_default.a.container\n}, /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: spinner_default.a.spinner\n}));\n/* harmony default export */ var components_tw_loading_spinner_spinner = (Loading);\n// EXTERNAL MODULE: ./src/components/crash-message/crash-message.jsx\nvar crash_message = __webpack_require__(181);\n\n// CONCATENATED MODULE: ./src/lib/tw-load-scratch-blocks-hoc.jsx\n\n\n\n\n\nconst tw_load_scratch_blocks_hoc_LoadScratchBlocksHOC = function LoadScratchBlocksHOC(WrappedComponent) {\n class LoadScratchBlocks extends react_default.a.Component {\n constructor(props) {\n super(props);\n this.state = {\n loaded: tw_lazy_scratch_blocks[\"a\" /* default */].isLoaded(),\n error: null\n };\n if (!this.state.loaded) {\n tw_lazy_scratch_blocks[\"a\" /* default */].load().then(() => {\n this.setState({\n loaded: true\n });\n }).catch(e => {\n log[\"default\"].error(e);\n this.setState({\n error: e\n });\n });\n }\n }\n handleReload() {\n location.reload();\n }\n render() {\n if (this.state.error !== null) {\n return /*#__PURE__*/react_default.a.createElement(crash_message[\"a\" /* default */], {\n errorMessage: \"lazy scratch-blocks: \".concat(this.state.error),\n onReload: this.handleReload\n });\n }\n if (!this.state.loaded) {\n return /*#__PURE__*/react_default.a.createElement(components_tw_loading_spinner_spinner, null);\n }\n return /*#__PURE__*/react_default.a.createElement(WrappedComponent, this.props);\n }\n }\n return LoadScratchBlocks;\n};\n/* harmony default export */ var tw_load_scratch_blocks_hoc = (tw_load_scratch_blocks_hoc_LoadScratchBlocksHOC);\n// EXTERNAL MODULE: ./node_modules/computed-style-to-inline-style/dist/index.js\nvar dist = __webpack_require__(429);\nvar dist_default = /*#__PURE__*/__webpack_require__.n(dist);\n\n// CONCATENATED MODULE: ./src/lib/backpack/block-to-image.js\n\n\n\n/**\n * Given a blockId, return a data-uri image that can be used to create a thumbnail.\n * @param {string} blockId the ID of the block to imagify\n * @return {Promise} resolves to a data-url of a picture of the blocks\n */\n/* harmony default export */ var block_to_image = (function (blockId) {\n // Not sure any better way to access the scratch-blocks workspace than this...\n const ScratchBlocks = tw_lazy_scratch_blocks[\"a\" /* default */].get();\n const block = ScratchBlocks.getMainWorkspace().getBlockById(blockId);\n const blockSvg = block.getSvgRoot().cloneNode(true /* deep */);\n\n // Once we have the cloned SVG, do the rest in a setTimeout to prevent\n // blocking the drag end from finishing promptly.\n return new Promise(resolve => {\n setTimeout(() => {\n // TW: Fixes issues caused by scratch-blocks block hiding\n blockSvg.style.display = '';\n\n // Strip   entities that cannot be inlined\n blockSvg.innerHTML = blockSvg.innerHTML.replace(/ /g, ' ');\n\n // Create an element to put the cloned blockSvg inside\n const NS = 'http://www.w3.org/2000/svg';\n const svg = document.createElementNS(NS, 'svg');\n svg.appendChild(blockSvg);\n\n // Needs to be on the DOM to get CSS properties and correct sizing\n document.body.appendChild(svg);\n const padding = 10;\n const extraHatPadding = 16;\n const topPadding = padding + (blockSvg.getAttribute('data-shapes') === 'hat' ? extraHatPadding : 0);\n const leftPadding = padding;\n blockSvg.setAttribute('transform', \"translate(\".concat(leftPadding, \" \").concat(topPadding, \")\"));\n const bounds = blockSvg.getBoundingClientRect();\n svg.setAttribute('width', bounds.width + 2 * padding);\n svg.setAttribute('height', bounds.height + 2 * padding);\n\n // We need to inline the styles set by CSS rules because\n // not all the styles are set directly on the SVG. This makes the\n // image styled the same way the block actually appears.\n // TODO this doesn't handle images that are xlink:href in the SVG\n dist_default()(svg, {\n recursive: true,\n // Enumerate the specific properties we need to inline.\n // Specifically properties that are set from CSS in scratch-blocks\n properties: ['fill', 'font-family', 'font-size', 'font-weight']\n });\n const svgString = new XMLSerializer().serializeToString(svg);\n\n // Once we have the svg as a string, remove it from the DOM\n svg.parentNode.removeChild(svg);\n resolve(\"data:image/svg+xml;utf-8,\".concat(encodeURIComponent(svgString)));\n }, 10);\n });\n});\n// CONCATENATED MODULE: ./src/lib/backpack/thumbnail.js\nconst jpegThumbnail = dataUrl => new Promise((resolve, reject) => {\n const image = new Image();\n image.onload = () => {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n const maxDimension = 96; // 3x the maximum displayed size of 32px\n\n // TW: After setting canvas width/height, the canvas is automatically cleared.\n\n if (image.height < 1 || image.width < 1) {\n canvas.width = canvas.height = maxDimension;\n // drawImage can fail if image height/width is less than 1\n // Use blank image; the costume is too small to render anyway\n } else {\n if (image.height > image.width) {\n canvas.height = maxDimension;\n canvas.width = maxDimension / image.height * image.width;\n } else {\n canvas.width = maxDimension;\n canvas.height = maxDimension / image.width * image.height;\n }\n ctx.drawImage(image, 0, 0, canvas.width, canvas.height);\n }\n\n // TW: PNG allows using transparency while JPEG does not.\n // A white background looks quite ugly in dark mode.\n const dataURL = canvas.toDataURL('image/png').replace('data:image/png;base64,', '');\n resolve(dataURL);\n };\n image.onerror = err => {\n reject(err);\n };\n image.src = dataUrl;\n});\n/* harmony default export */ var backpack_thumbnail = (jpegThumbnail);\n// EXTERNAL MODULE: ./node_modules/js-base64/base64.js\nvar js_base64_base64 = __webpack_require__(430);\n\n// CONCATENATED MODULE: ./src/lib/backpack/code-payload.js\n\n\n\n\nconst codePayload = _ref => {\n let {\n blockObjects,\n topBlockId\n } = _ref;\n const payload = {\n type: 'script',\n // Needs to match backpack-server type name\n name: 'code',\n // All code currently gets the same name\n mime: 'application/json',\n // Backpack expects a base64 encoded string to store. Cannot use btoa because\n // the code can contain characters outside the 0-255 code-point range supported by btoa\n body: js_base64_base64[\"Base64\"].encode(JSON.stringify(blockObjects)) // Base64 encode the json\n };\n return block_to_image(topBlockId).then(backpack_thumbnail).then(thumbnail => {\n payload.thumbnail = thumbnail;\n return payload;\n });\n};\nconst findTopBlock = payload => {\n const blocks = payload.extensionURLs ? payload.blocks : payload;\n return blocks.find(i => i.topLevel);\n};\nconst placeInViewport = (payload, workspaceMetrics, isRtl) => {\n const topBlock = findTopBlock(payload);\n if (topBlock) {\n const {\n scrollX,\n scrollY,\n scale\n } = workspaceMetrics || {\n scrollX: 0,\n scrollY: 0,\n scale: layout_constants[\"a\" /* BLOCKS_DEFAULT_SCALE */]\n };\n const posY = -scrollY + 30;\n let posX;\n if (isRtl) {\n posX = scrollX + 30;\n } else {\n posX = -scrollX + 30;\n }\n topBlock.x = posX / scale;\n topBlock.y = posY / scale;\n }\n return payload;\n};\n\n// CONCATENATED MODULE: ./src/lib/tw-persistent-storage.js\n/**\n * Forcibly asks the browser to grant persistent storage. May show a permission dialog from the browser.\n */\nconst requestPersistentStorage = () => {\n if (navigator.storage && navigator.storage.persist) {\n navigator.storage.persist();\n\n // We don't really care about the result.\n // Safari auto-denies. Chrome auto-approves. That's not very useful information.\n // Even if we think we have persistent storage, browsers are known to just delete it anyways.\n // Don't want to give users false trust in the browser-provided storage.\n }\n};\n\n/**\n * In browsers that are known to not have a permission dialog, will request persistent storage.\n * In browsers that are not to have a permission dialog, will not do anything.\n */\nconst gentlyRequestPersistentStorage = () => {\n if (!navigator.userAgent.includes('Firefox')) {\n requestPersistentStorage();\n }\n};\n\n// CONCATENATED MODULE: ./src/containers/blocks.jsx\nconst containers_blocks_excluded = [\"anyModalVisible\", \"canUseCloud\", \"customStageSize\", \"customProceduresVisible\", \"extensionLibraryVisible\", \"options\", \"stageSize\", \"vm\", \"isRtl\", \"isVisible\", \"onActivateColorPicker\", \"onOpenConnectionModal\", \"onOpenSoundRecorder\", \"onOpenCustomExtensionModal\", \"reduxOnOpenCustomExtensionModal\", \"updateToolboxState\", \"onActivateCustomProcedures\", \"onRequestCloseExtensionLibrary\", \"onRequestCloseCustomProcedures\", \"toolboxXML\", \"updateMetrics\", \"useCatBlocks\", \"workspaceMetrics\"];\nfunction containers_blocks_extends() { return containers_blocks_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, containers_blocks_extends.apply(null, arguments); }\nfunction containers_blocks_objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = containers_blocks_objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction containers_blocks_objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// TW: Strings we add to scratch-blocks are localized here\nconst blocks_messages = Object(index_es[\"g\" /* defineMessages */])({\n PROCEDURES_RETURN: {\n \"id\": \"tw.blocks.PROCEDURES_RETURN\",\n \"defaultMessage\": \"return {v}\"\n },\n PROCEDURES_TO_REPORTER: {\n \"id\": \"tw.blocks.PROCEDURES_TO_REPORTER\",\n \"defaultMessage\": \"Change To Reporter\"\n },\n PROCEDURES_TO_STATEMENT: {\n \"id\": \"tw.blocks.PROCEDURES_TO_STATEMENT\",\n \"defaultMessage\": \"Change To Statement\"\n },\n PROCEDURES_DOCS: {\n \"id\": \"tw.blocks.PROCEDURES_DOCS\",\n \"defaultMessage\": \"How to use return\"\n }\n});\nconst addFunctionListener = (object, property, callback) => {\n const oldFn = object[property];\n object[property] = function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n const result = oldFn.apply(this, args);\n callback.apply(this, result);\n return result;\n };\n};\nconst DroppableBlocks = drop_area_hoc([drag_constants.BACKPACK_CODE])(components_blocks_blocks);\nclass blocks_Blocks extends react_default.a.Component {\n constructor(props) {\n super(props);\n this.ScratchBlocks = lib_blocks(props.vm, false);\n window.ScratchBlocks = this.ScratchBlocks;\n hooks[\"a\" /* default */].blockly = this.ScratchBlocks;\n hooks[\"a\" /* default */].blocklyCallbacks.forEach(i => i());\n hooks[\"a\" /* default */].blocklyCallbacks.length = [];\n lodash_bindall_default()(this, ['attachVM', 'detachVM', 'getToolboxXML', 'handleCategorySelected', 'handleConnectionModalStart', 'handleDrop', 'handleStatusButtonUpdate', 'handleOpenSoundRecorder', 'handlePromptStart', 'handlePromptCallback', 'handlePromptClose', 'handleCustomProceduresClose', 'onScriptGlowOn', 'onScriptGlowOff', 'onBlockGlowOn', 'onBlockGlowOff', 'handleMonitorsUpdate', 'handleExtensionAdded', 'handleBlocksInfoUpdate', 'onTargetsUpdate', 'onVisualReport', 'onWorkspaceUpdate', 'onWorkspaceMetricsChange', 'setBlocks', 'setLocale', 'handleEnableProcedureReturns']);\n this.ScratchBlocks.prompt = this.handlePromptStart;\n this.ScratchBlocks.statusButtonCallback = this.handleConnectionModalStart;\n this.ScratchBlocks.recordSoundCallback = this.handleOpenSoundRecorder;\n this.state = {\n prompt: null\n };\n this.onTargetsUpdate = lodash_debounce_default()(this.onTargetsUpdate, 100);\n this.toolboxUpdateQueue = [];\n }\n componentDidMount() {\n this.ScratchBlocks = lib_blocks(this.props.vm, this.props.useCatBlocks);\n this.ScratchBlocks.prompt = this.handlePromptStart;\n this.ScratchBlocks.statusButtonCallback = this.handleConnectionModalStart;\n this.ScratchBlocks.recordSoundCallback = this.handleOpenSoundRecorder;\n this.ScratchBlocks.FieldColourSlider.activateEyedropper_ = this.props.onActivateColorPicker;\n this.ScratchBlocks.Procedures.externalProcedureDefCallback = this.props.onActivateCustomProcedures;\n this.ScratchBlocks.ScratchMsgs.setLocale(this.props.locale);\n const Msg = this.ScratchBlocks.Msg;\n Msg.PROCEDURES_RETURN = this.props.intl.formatMessage(blocks_messages.PROCEDURES_RETURN, {\n v: '%1'\n });\n Msg.PROCEDURES_TO_REPORTER = this.props.intl.formatMessage(blocks_messages.PROCEDURES_TO_REPORTER);\n Msg.PROCEDURES_TO_STATEMENT = this.props.intl.formatMessage(blocks_messages.PROCEDURES_TO_STATEMENT);\n Msg.PROCEDURES_DOCS = this.props.intl.formatMessage(blocks_messages.PROCEDURES_DOCS);\n const workspaceConfig = lodash_defaultsdeep_default()({}, this.props.options, {\n rtl: this.props.isRtl,\n toolbox: this.props.toolboxXML,\n colours: this.props.theme.getBlockColors(),\n grid: {\n colour: this.props.theme.getBlockColors().gridColor\n }\n }, blocks_Blocks.defaultOptions);\n this.workspace = this.ScratchBlocks.inject(this.blocks, workspaceConfig);\n hooks[\"a\" /* default */].blocklyWorkspace = this.workspace;\n\n // Register buttons under new callback keys for creating variables,\n // lists, and procedures from extensions.\n\n const toolboxWorkspace = this.workspace.getFlyout().getWorkspace();\n const varListButtonCallback = type => () => this.ScratchBlocks.Variables.createVariable(this.workspace, null, type);\n const procButtonCallback = () => {\n this.ScratchBlocks.Procedures.createProcedureDefCallback_(this.workspace);\n };\n toolboxWorkspace.registerButtonCallback('MAKE_A_VARIABLE', varListButtonCallback(''));\n toolboxWorkspace.registerButtonCallback('MAKE_A_LIST', varListButtonCallback('list'));\n toolboxWorkspace.registerButtonCallback('MAKE_A_PROCEDURE', procButtonCallback);\n toolboxWorkspace.registerButtonCallback('EXTENSION_CALLBACK', block => {\n this.props.vm.handleExtensionButtonPress(block.callbackData_);\n });\n toolboxWorkspace.registerButtonCallback('OPEN_EXTENSION_DOCS', block => {\n const docsURI = block.callbackData_;\n const url = new URL(docsURI);\n if (url.protocol === 'http:' || url.protocol === 'https:') {\n window.open(docsURI, '_blank');\n }\n });\n toolboxWorkspace.registerButtonCallback('OPEN_RETURN_DOCS', () => {\n window.open('https://docs.turbowarp.org/return', '_blank');\n });\n\n // Store the xml of the toolbox that is actually rendered.\n // This is used in componentDidUpdate instead of prevProps, because\n // the xml can change while e.g. on the costumes tab.\n this._renderedToolboxXML = this.props.toolboxXML;\n\n // we actually never want the workspace to enable \"refresh toolbox\" - this basically re-renders the\n // entire toolbox every time we reset the workspace. We call updateToolbox as a part of\n // componentDidUpdate so the toolbox will still correctly be updated\n this.setToolboxRefreshEnabled = this.workspace.setToolboxRefreshEnabled.bind(this.workspace);\n this.workspace.setToolboxRefreshEnabled = () => {\n this.setToolboxRefreshEnabled(false);\n };\n\n // @todo change this when blockly supports UI events\n addFunctionListener(this.workspace, 'translate', this.onWorkspaceMetricsChange);\n addFunctionListener(this.workspace, 'zoom', this.onWorkspaceMetricsChange);\n this.props.vm.setCompilerOptions({\n warpTimer: true\n });\n this.attachVM();\n // Only update blocks/vm locale when visible to avoid sizing issues\n // If locale changes while not visible it will get handled in didUpdate\n if (this.props.isVisible) {\n this.setLocale();\n }\n\n // tw: Handle when extensions are added when Blocks isn't mounted\n for (const category of this.props.vm.runtime._blockInfo) {\n this.handleExtensionAdded(category);\n }\n gentlyRequestPersistentStorage();\n }\n shouldComponentUpdate(nextProps, nextState) {\n return this.state.prompt !== nextState.prompt || this.props.isVisible !== nextProps.isVisible || this._renderedToolboxXML !== nextProps.toolboxXML || this.props.extensionLibraryVisible !== nextProps.extensionLibraryVisible || this.props.customProceduresVisible !== nextProps.customProceduresVisible || this.props.locale !== nextProps.locale || this.props.anyModalVisible !== nextProps.anyModalVisible || this.props.stageSize !== nextProps.stageSize || this.props.customStageSize !== nextProps.customStageSize;\n }\n componentDidUpdate(prevProps) {\n // If any modals are open, call hideChaff to close z-indexed field editors\n if (this.props.anyModalVisible && !prevProps.anyModalVisible) {\n this.ScratchBlocks.hideChaff();\n }\n\n // Only rerender the toolbox when the blocks are visible and the xml is\n // different from the previously rendered toolbox xml.\n // Do not check against prevProps.toolboxXML because that may not have been rendered.\n if (this.props.isVisible && this.props.toolboxXML !== this._renderedToolboxXML) {\n this.requestToolboxUpdate();\n }\n if (this.props.isVisible === prevProps.isVisible) {\n if (this.props.stageSize !== prevProps.stageSize || this.props.customStageSize !== prevProps.customStageSize) {\n // force workspace to redraw for the new stage size\n window.dispatchEvent(new Event('resize'));\n }\n return;\n }\n // @todo hack to resize blockly manually in case resize happened while hidden\n // @todo hack to reload the workspace due to gui bug #413\n if (this.props.isVisible) {\n // Scripts tab\n this.workspace.setVisible(true);\n if (prevProps.locale !== this.props.locale || this.props.locale !== this.props.vm.getLocale()) {\n // call setLocale if the locale has changed, or changed while the blocks were hidden.\n // vm.getLocale() will be out of sync if locale was changed while not visible\n this.setLocale();\n } else {\n this.props.vm.refreshWorkspace();\n this.requestToolboxUpdate();\n }\n window.dispatchEvent(new Event('resize'));\n } else {\n this.workspace.setVisible(false);\n }\n }\n componentWillUnmount() {\n this.detachVM();\n this.unmounted = true;\n this.workspace.dispose();\n clearTimeout(this.toolboxUpdateTimeout);\n\n // Clear the flyout blocks so that they can be recreated on mount.\n this.props.vm.clearFlyoutBlocks();\n hooks[\"a\" /* default */].blocklyWorkspace = null;\n }\n requestToolboxUpdate() {\n clearTimeout(this.toolboxUpdateTimeout);\n this.toolboxUpdateTimeout = setTimeout(() => {\n this.updateToolbox();\n }, 0);\n }\n setLocale() {\n this.ScratchBlocks.ScratchMsgs.setLocale(this.props.locale);\n this.props.vm.setLocale(this.props.locale, this.props.messages).then(() => {\n if (this.unmounted) return;\n this.workspace.getFlyout().setRecyclingEnabled(false);\n this.props.vm.refreshWorkspace();\n this.requestToolboxUpdate();\n this.withToolboxUpdates(() => {\n this.workspace.getFlyout().setRecyclingEnabled(true);\n });\n });\n }\n updateToolbox() {\n this.toolboxUpdateTimeout = false;\n const categoryId = this.workspace.toolbox_.getSelectedCategoryId();\n const offset = this.workspace.toolbox_.getCategoryScrollOffset();\n this.workspace.updateToolbox(this.props.toolboxXML);\n this._renderedToolboxXML = this.props.toolboxXML;\n\n // In order to catch any changes that mutate the toolbox during \"normal runtime\"\n // (variable changes/etc), re-enable toolbox refresh.\n // Using the setter function will rerender the entire toolbox which we just rendered.\n this.workspace.toolboxRefreshEnabled_ = true;\n const currentCategoryPos = this.workspace.toolbox_.getCategoryPositionById(categoryId);\n const currentCategoryLen = this.workspace.toolbox_.getCategoryLengthById(categoryId);\n if (offset < currentCategoryLen) {\n this.workspace.toolbox_.setFlyoutScrollPos(currentCategoryPos + offset);\n } else {\n this.workspace.toolbox_.setFlyoutScrollPos(currentCategoryPos);\n }\n const queue = this.toolboxUpdateQueue;\n this.toolboxUpdateQueue = [];\n queue.forEach(fn => fn());\n }\n withToolboxUpdates(fn) {\n // if there is a queued toolbox update, we need to wait\n if (this.toolboxUpdateTimeout) {\n this.toolboxUpdateQueue.push(fn);\n } else {\n fn();\n }\n }\n attachVM() {\n this.workspace.addChangeListener(this.props.vm.blockListener);\n this.flyoutWorkspace = this.workspace.getFlyout().getWorkspace();\n this.flyoutWorkspace.addChangeListener(this.props.vm.flyoutBlockListener);\n this.flyoutWorkspace.addChangeListener(this.props.vm.monitorBlockListener);\n this.props.vm.addListener('SCRIPT_GLOW_ON', this.onScriptGlowOn);\n this.props.vm.addListener('SCRIPT_GLOW_OFF', this.onScriptGlowOff);\n this.props.vm.addListener('BLOCK_GLOW_ON', this.onBlockGlowOn);\n this.props.vm.addListener('BLOCK_GLOW_OFF', this.onBlockGlowOff);\n this.props.vm.addListener('VISUAL_REPORT', this.onVisualReport);\n this.props.vm.addListener('workspaceUpdate', this.onWorkspaceUpdate);\n this.props.vm.addListener('targetsUpdate', this.onTargetsUpdate);\n this.props.vm.addListener('MONITORS_UPDATE', this.handleMonitorsUpdate);\n this.props.vm.addListener('EXTENSION_ADDED', this.handleExtensionAdded);\n this.props.vm.addListener('BLOCKSINFO_UPDATE', this.handleBlocksInfoUpdate);\n this.props.vm.addListener('PERIPHERAL_CONNECTED', this.handleStatusButtonUpdate);\n this.props.vm.addListener('PERIPHERAL_DISCONNECTED', this.handleStatusButtonUpdate);\n }\n detachVM() {\n this.props.vm.removeListener('SCRIPT_GLOW_ON', this.onScriptGlowOn);\n this.props.vm.removeListener('SCRIPT_GLOW_OFF', this.onScriptGlowOff);\n this.props.vm.removeListener('BLOCK_GLOW_ON', this.onBlockGlowOn);\n this.props.vm.removeListener('BLOCK_GLOW_OFF', this.onBlockGlowOff);\n this.props.vm.removeListener('VISUAL_REPORT', this.onVisualReport);\n this.props.vm.removeListener('workspaceUpdate', this.onWorkspaceUpdate);\n this.props.vm.removeListener('targetsUpdate', this.onTargetsUpdate);\n this.props.vm.removeListener('MONITORS_UPDATE', this.handleMonitorsUpdate);\n this.props.vm.removeListener('EXTENSION_ADDED', this.handleExtensionAdded);\n this.props.vm.removeListener('BLOCKSINFO_UPDATE', this.handleBlocksInfoUpdate);\n this.props.vm.removeListener('PERIPHERAL_CONNECTED', this.handleStatusButtonUpdate);\n this.props.vm.removeListener('PERIPHERAL_DISCONNECTED', this.handleStatusButtonUpdate);\n }\n updateToolboxBlockValue(id, value) {\n this.withToolboxUpdates(() => {\n const block = this.workspace.getFlyout().getWorkspace().getBlockById(id);\n if (block) {\n block.inputList[0].fieldRow[0].setValue(value);\n }\n });\n }\n onTargetsUpdate() {\n if (this.props.vm.editingTarget && this.workspace.getFlyout()) {\n ['glide', 'move', 'set'].forEach(prefix => {\n this.updateToolboxBlockValue(\"\".concat(prefix, \"x\"), Math.round(this.props.vm.editingTarget.x).toString());\n this.updateToolboxBlockValue(\"\".concat(prefix, \"y\"), Math.round(this.props.vm.editingTarget.y).toString());\n });\n }\n }\n onWorkspaceMetricsChange() {\n const target = this.props.vm.editingTarget;\n if (target && target.id) {\n // Dispatch updateMetrics later, since onWorkspaceMetricsChange may be (very indirectly)\n // called from a reducer, i.e. when you create a custom procedure.\n // TODO: Is this a vehement hack?\n setTimeout(() => {\n this.props.updateMetrics({\n targetID: target.id,\n scrollX: this.workspace.scrollX,\n scrollY: this.workspace.scrollY,\n scale: this.workspace.scale\n });\n }, 0);\n }\n }\n onScriptGlowOn(data) {\n this.workspace.glowStack(data.id, true);\n }\n onScriptGlowOff(data) {\n this.workspace.glowStack(data.id, false);\n }\n onBlockGlowOn(data) {\n this.workspace.glowBlock(data.id, true);\n }\n onBlockGlowOff(data) {\n this.workspace.glowBlock(data.id, false);\n }\n onVisualReport(data) {\n this.workspace.reportValue(data.id, data.value);\n }\n getToolboxXML() {\n // Use try/catch because this requires digging pretty deep into the VM\n // Code inside intentionally ignores several error situations (no stage, etc.)\n // Because they would get caught by this try/catch\n try {\n let {\n editingTarget: target,\n runtime\n } = this.props.vm;\n const stage = runtime.getTargetForStage();\n if (!target) target = stage; // If no editingTarget, use the stage\n\n const stageCostumes = stage.getCostumes();\n const targetCostumes = target.getCostumes();\n const targetSounds = target.getSounds();\n const dynamicBlocksXML = injectExtensionCategoryTheme(this.props.vm.runtime.getBlocksXML(target), this.props.theme);\n return Object(make_toolbox_xml[\"a\" /* default */])(false, target.isStage, target.id, dynamicBlocksXML, targetCostumes[targetCostumes.length - 1].name, stageCostumes[stageCostumes.length - 1].name, targetSounds.length > 0 ? targetSounds[targetSounds.length - 1].name : '', this.props.theme.getBlockColors());\n } catch (_unused) {\n return null;\n }\n }\n onWorkspaceUpdate(data) {\n // When we change sprites, update the toolbox to have the new sprite's blocks\n const toolboxXML = this.getToolboxXML();\n if (toolboxXML) {\n this.props.updateToolboxState(toolboxXML);\n }\n if (this.props.vm.editingTarget && !this.props.workspaceMetrics.targets[this.props.vm.editingTarget.id]) {\n this.onWorkspaceMetricsChange();\n }\n\n // Remove and reattach the workspace listener (but allow flyout events)\n this.workspace.removeChangeListener(this.props.vm.blockListener);\n const dom = this.ScratchBlocks.Xml.textToDom(data.xml);\n try {\n this.ScratchBlocks.Xml.clearWorkspaceAndLoadFromXml(dom, this.workspace);\n } catch (error) {\n // The workspace is likely incomplete. What did update should be\n // functional.\n //\n // Instead of throwing the error, by logging it and continuing as\n // normal lets the other workspace update processes complete in the\n // gui and vm, which lets the vm run even if the workspace is\n // incomplete. Throwing the error would keep things like setting the\n // correct editing target from happening which can interfere with\n // some blocks and processes in the vm.\n if (error.message) {\n error.message = \"Workspace Update Error: \".concat(error.message);\n }\n log[\"default\"].error(error);\n }\n this.workspace.addChangeListener(this.props.vm.blockListener);\n if (this.props.vm.editingTarget && this.props.workspaceMetrics.targets[this.props.vm.editingTarget.id]) {\n const {\n scrollX,\n scrollY,\n scale\n } = this.props.workspaceMetrics.targets[this.props.vm.editingTarget.id];\n this.workspace.scrollX = scrollX;\n this.workspace.scrollY = scrollY;\n this.workspace.scale = scale;\n this.workspace.resize();\n }\n\n // Clear the undo state of the workspace since this is a\n // fresh workspace and we don't want any changes made to another sprites\n // workspace to be 'undone' here.\n this.workspace.clearUndo();\n }\n handleMonitorsUpdate(monitors) {\n // Update the checkboxes of the relevant monitors.\n // TODO: What about monitors that have fields? See todo in scratch-vm blocks.js changeBlock:\n // https://github.com/LLK/scratch-vm/blob/2373f9483edaf705f11d62662f7bb2a57fbb5e28/src/engine/blocks.js#L569-L576\n const flyout = this.workspace.getFlyout();\n for (const monitor of monitors.values()) {\n const blockId = monitor.get('id');\n const isVisible = monitor.get('visible');\n flyout.setCheckboxState(blockId, isVisible);\n // We also need to update the isMonitored flag for this block on the VM, since it's used to determine\n // whether the checkbox is activated or not when the checkbox is re-displayed (e.g. local variables/blocks\n // when switching between sprites).\n const block = this.props.vm.runtime.monitorBlocks.getBlock(blockId);\n if (block) {\n block.isMonitored = isVisible;\n }\n }\n }\n handleExtensionAdded(categoryInfo) {\n const defineBlocks = blockInfoArray => {\n if (blockInfoArray && blockInfoArray.length > 0) {\n const staticBlocksJson = [];\n const dynamicBlocksInfo = [];\n blockInfoArray.forEach(blockInfo => {\n if (blockInfo.info && blockInfo.info.isDynamic) {\n dynamicBlocksInfo.push(blockInfo);\n } else if (blockInfo.json) {\n staticBlocksJson.push(injectExtensionBlockTheme(blockInfo.json, this.props.theme));\n }\n // otherwise it's a non-block entry such as '---'\n });\n this.ScratchBlocks.defineBlocksWithJsonArray(staticBlocksJson);\n dynamicBlocksInfo.forEach(blockInfo => {\n // This is creating the block factory / constructor -- NOT a specific instance of the block.\n // The factory should only know static info about the block: the category info and the opcode.\n // Anything else will be picked up from the XML attached to the block instance.\n const extendedOpcode = \"\".concat(categoryInfo.id, \"_\").concat(blockInfo.info.opcode);\n const blockDefinition = define_dynamic_block(this.ScratchBlocks, categoryInfo, blockInfo, extendedOpcode, this.props.theme);\n this.ScratchBlocks.Blocks[extendedOpcode] = blockDefinition;\n });\n }\n };\n\n // scratch-blocks implements a menu or custom field as a special kind of block (\"shadow\" block)\n // these actually define blocks and MUST run regardless of the UI state\n defineBlocks(Object.getOwnPropertyNames(categoryInfo.customFieldTypes).map(fieldTypeName => categoryInfo.customFieldTypes[fieldTypeName].scratchBlocksDefinition));\n defineBlocks(categoryInfo.menus);\n defineBlocks(categoryInfo.blocks);\n\n // Update the toolbox with new blocks if possible\n const toolboxXML = this.getToolboxXML();\n if (toolboxXML) {\n this.props.updateToolboxState(toolboxXML);\n }\n }\n handleBlocksInfoUpdate(categoryInfo) {\n // @todo Later we should replace this to avoid all the warnings from redefining blocks.\n this.handleExtensionAdded(categoryInfo);\n }\n handleCategorySelected(categoryId) {\n const extension = extensions[\"a\" /* default */].find(ext => ext.extensionId === categoryId);\n if (extension && extension.launchPeripheralConnectionFlow) {\n this.handleConnectionModalStart(categoryId);\n }\n this.withToolboxUpdates(() => {\n this.workspace.toolbox_.setSelectedCategoryById(categoryId);\n });\n }\n setBlocks(blocks) {\n this.blocks = blocks;\n }\n handlePromptStart(message, defaultValue, callback, optTitle, optVarType) {\n const p = {\n prompt: {\n callback,\n message,\n defaultValue\n }\n };\n p.prompt.title = optTitle ? optTitle : this.ScratchBlocks.Msg.VARIABLE_MODAL_TITLE;\n p.prompt.varType = typeof optVarType === 'string' ? optVarType : this.ScratchBlocks.SCALAR_VARIABLE_TYPE;\n p.prompt.showVariableOptions =\n // This flag means that we should show variable/list options about scope\n optVarType !== this.ScratchBlocks.BROADCAST_MESSAGE_VARIABLE_TYPE && p.prompt.title !== this.ScratchBlocks.Msg.RENAME_VARIABLE_MODAL_TITLE && p.prompt.title !== this.ScratchBlocks.Msg.RENAME_LIST_MODAL_TITLE;\n p.prompt.showCloudOption = optVarType === this.ScratchBlocks.SCALAR_VARIABLE_TYPE && this.props.canUseCloud;\n this.setState(p);\n }\n handleConnectionModalStart(extensionId) {\n this.props.onOpenConnectionModal(extensionId);\n }\n handleStatusButtonUpdate() {\n this.ScratchBlocks.refreshStatusButtons(this.workspace);\n }\n handleOpenSoundRecorder() {\n this.props.onOpenSoundRecorder();\n }\n\n /*\n * Pass along information about proposed name and variable options (scope and isCloud)\n * and additional potentially conflicting variable names from the VM\n * to the variable validation prompt callback used in scratch-blocks.\n */\n handlePromptCallback(input, variableOptions) {\n this.state.prompt.callback(input, this.props.vm.runtime.getAllVarNamesOfType(this.state.prompt.varType), variableOptions);\n this.handlePromptClose();\n }\n handlePromptClose() {\n this.setState({\n prompt: null\n });\n }\n handleCustomProceduresClose(data) {\n this.props.onRequestCloseCustomProcedures(data);\n const ws = this.workspace;\n ws.refreshToolboxSelection_();\n ws.toolbox_.scrollToCategoryById('myBlocks');\n }\n handleDrop(dragInfo) {\n fetch(dragInfo.payload.bodyUrl).then(response => response.json()).then(payload => {\n // based on https://github.com/ScratchAddons/ScratchAddons/pull/7028\n const topBlock = findTopBlock(payload);\n if (topBlock) {\n const metrics = this.props.workspaceMetrics.targets[this.props.vm.editingTarget.id];\n if (metrics) {\n const {\n x,\n y\n } = dragInfo.currentOffset;\n const {\n left,\n right\n } = this.workspace.scrollbar.hScroll.outerSvg_.getBoundingClientRect();\n const {\n top\n } = this.workspace.scrollbar.vScroll.outerSvg_.getBoundingClientRect();\n topBlock.x = (this.props.isRtl ? metrics.scrollX - x + right : -metrics.scrollX + x - left) / metrics.scale;\n topBlock.y = (-metrics.scrollY - top + y) / metrics.scale;\n }\n }\n return this.props.vm.shareBlocksToTarget(payload, this.props.vm.editingTarget.id);\n }).then(() => {\n this.props.vm.refreshWorkspace();\n this.updateToolbox(); // To show new variables/custom blocks\n });\n }\n handleEnableProcedureReturns() {\n this.workspace.enableProcedureReturns();\n this.requestToolboxUpdate();\n }\n render() {\n /* eslint-disable no-unused-vars */\n const _this$props = this.props,\n {\n anyModalVisible,\n canUseCloud,\n customStageSize,\n customProceduresVisible,\n extensionLibraryVisible,\n options,\n stageSize,\n vm,\n isRtl,\n isVisible,\n onActivateColorPicker,\n onOpenConnectionModal,\n onOpenSoundRecorder,\n onOpenCustomExtensionModal,\n reduxOnOpenCustomExtensionModal,\n updateToolboxState,\n onActivateCustomProcedures,\n onRequestCloseExtensionLibrary,\n onRequestCloseCustomProcedures,\n toolboxXML,\n updateMetrics: updateMetricsProp,\n useCatBlocks,\n workspaceMetrics\n } = _this$props,\n props = containers_blocks_objectWithoutProperties(_this$props, containers_blocks_excluded);\n /* eslint-enable no-unused-vars */\n return /*#__PURE__*/react_default.a.createElement(react_default.a.Fragment, null, /*#__PURE__*/react_default.a.createElement(DroppableBlocks, containers_blocks_extends({\n componentRef: this.setBlocks,\n onDrop: this.handleDrop\n }, props)), this.state.prompt ? /*#__PURE__*/react_default.a.createElement(containers_prompt, {\n defaultValue: this.state.prompt.defaultValue,\n isStage: vm.runtime.getEditingTarget().isStage,\n showListMessage: this.state.prompt.varType === this.ScratchBlocks.LIST_VARIABLE_TYPE,\n label: this.state.prompt.message,\n showCloudOption: this.state.prompt.showCloudOption,\n showVariableOptions: this.state.prompt.showVariableOptions,\n title: this.state.prompt.title,\n vm: vm,\n onCancel: this.handlePromptClose,\n onOk: this.handlePromptCallback\n }) : null, extensionLibraryVisible ? /*#__PURE__*/react_default.a.createElement(extension_library, {\n vm: vm,\n onCategorySelected: this.handleCategorySelected,\n onEnableProcedureReturns: this.handleEnableProcedureReturns,\n onRequestClose: onRequestCloseExtensionLibrary,\n onOpenCustomExtensionModal: onOpenCustomExtensionModal || reduxOnOpenCustomExtensionModal\n }) : null, customProceduresVisible ? /*#__PURE__*/react_default.a.createElement(containers_custom_procedures, {\n options: {\n media: options.media\n },\n onRequestClose: this.handleCustomProceduresClose\n }) : null);\n }\n}\nblocks_Blocks.propTypes = {\n intl: index_es[\"i\" /* intlShape */],\n anyModalVisible: prop_types_default.a.bool,\n canUseCloud: prop_types_default.a.bool,\n customStageSize: prop_types_default.a.shape({\n width: prop_types_default.a.number,\n height: prop_types_default.a.number\n }),\n customProceduresVisible: prop_types_default.a.bool,\n extensionLibraryVisible: prop_types_default.a.bool,\n isRtl: prop_types_default.a.bool,\n isVisible: prop_types_default.a.bool,\n locale: prop_types_default.a.string.isRequired,\n messages: prop_types_default.a.objectOf(prop_types_default.a.string),\n onActivateColorPicker: prop_types_default.a.func,\n onActivateCustomProcedures: prop_types_default.a.func,\n onOpenConnectionModal: prop_types_default.a.func,\n onOpenSoundRecorder: prop_types_default.a.func,\n onOpenCustomExtensionModal: prop_types_default.a.func,\n reduxOnOpenCustomExtensionModal: prop_types_default.a.func,\n onRequestCloseCustomProcedures: prop_types_default.a.func,\n onRequestCloseExtensionLibrary: prop_types_default.a.func,\n options: prop_types_default.a.shape({\n media: prop_types_default.a.string,\n zoom: prop_types_default.a.shape({\n controls: prop_types_default.a.bool,\n wheel: prop_types_default.a.bool,\n startScale: prop_types_default.a.number\n }),\n comments: prop_types_default.a.bool,\n collapse: prop_types_default.a.bool\n }),\n stageSize: prop_types_default.a.oneOf(Object.keys(layout_constants[\"d\" /* STAGE_DISPLAY_SIZES */])).isRequired,\n theme: prop_types_default.a.instanceOf(themes[\"m\" /* Theme */]),\n toolboxXML: prop_types_default.a.string,\n updateMetrics: prop_types_default.a.func,\n updateToolboxState: prop_types_default.a.func,\n useCatBlocks: prop_types_default.a.bool,\n vm: prop_types_default.a.instanceOf(src_default.a).isRequired,\n workspaceMetrics: prop_types_default.a.shape({\n targets: prop_types_default.a.objectOf(prop_types_default.a.object)\n })\n};\nblocks_Blocks.defaultOptions = {\n zoom: {\n controls: true,\n wheel: true,\n startScale: layout_constants[\"a\" /* BLOCKS_DEFAULT_SCALE */]\n },\n grid: {\n spacing: 40,\n length: 2,\n colour: '#ddd'\n },\n comments: true,\n collapse: false,\n sounds: false\n};\nblocks_Blocks.defaultProps = {\n isVisible: true,\n options: blocks_Blocks.defaultOptions,\n theme: themes[\"m\" /* Theme */].light\n};\nconst blocks_mapStateToProps = state => ({\n anyModalVisible: Object.keys(state.scratchGui.modals).some(key => state.scratchGui.modals[key]) || state.scratchGui.mode.isFullScreen,\n customStageSize: state.scratchGui.customStageSize,\n extensionLibraryVisible: state.scratchGui.modals.extensionLibrary,\n isRtl: state.locales.isRtl,\n locale: state.locales.locale,\n messages: state.locales.messages,\n toolboxXML: state.scratchGui.toolbox.toolboxXML,\n customProceduresVisible: state.scratchGui.customProcedures.active,\n workspaceMetrics: state.scratchGui.workspaceMetrics,\n useCatBlocks: Object(time_travel[\"d\" /* isTimeTravel2020 */])(state)\n});\nconst blocks_mapDispatchToProps = dispatch => ({\n onActivateColorPicker: callback => dispatch(Object(color_picker[\"a\" /* activateColorPicker */])(callback)),\n onActivateCustomProcedures: (data, callback) => dispatch(Object(reducers_custom_procedures[\"a\" /* activateCustomProcedures */])(data, callback)),\n onOpenConnectionModal: id => {\n dispatch(Object(connection_modal[\"c\" /* setConnectionModalExtensionId */])(id));\n dispatch(Object(modals[\"u\" /* openConnectionModal */])());\n },\n onOpenSoundRecorder: () => {\n dispatch(Object(editor_tab[\"d\" /* activateTab */])(editor_tab[\"c\" /* SOUNDS_TAB_INDEX */]));\n dispatch(Object(modals[\"E\" /* openSoundRecorder */])());\n },\n reduxOnOpenCustomExtensionModal: () => dispatch(Object(modals[\"w\" /* openCustomExtensionModal */])()),\n onRequestCloseExtensionLibrary: () => {\n dispatch(Object(modals[\"e\" /* closeExtensionLibrary */])());\n },\n onRequestCloseCustomProcedures: data => {\n dispatch(Object(reducers_custom_procedures[\"c\" /* deactivateCustomProcedures */])(data));\n },\n updateToolboxState: toolboxXML => {\n dispatch(Object(toolbox[\"c\" /* updateToolbox */])(toolboxXML));\n },\n updateMetrics: metrics => {\n dispatch(Object(workspace_metrics[\"b\" /* updateMetrics */])(metrics));\n }\n});\n/* harmony default export */ var containers_blocks = (Object(index_es[\"h\" /* injectIntl */])(Object(error_boundary_hoc[\"a\" /* default */])('Blocks')(Object(react_redux_es[\"b\" /* connect */])(blocks_mapStateToProps, blocks_mapDispatchToProps)(tw_load_scratch_blocks_hoc(blocks_Blocks)))));\n// EXTERNAL MODULE: ./src/reducers/hovered-target.js\nvar hovered_target = __webpack_require__(98);\n\n// EXTERNAL MODULE: ./src/reducers/asset-drag.js\nvar asset_drag = __webpack_require__(153);\n\n// EXTERNAL MODULE: ./node_modules/@turbowarp/scratch-svg-renderer/src/index.js\nvar scratch_svg_renderer_src = __webpack_require__(81);\n\n// CONCATENATED MODULE: ./src/lib/get-costume-url.js\n\n\n\n// Contains 'font-family', but doesn't only contain 'font-family=\"none\"'\nconst HAS_FONT_REGEXP = 'font-family(?!=\"none\")';\nconst getCostumeUrl = function () {\n let cachedAssetId;\n let cachedUrl;\n return function (asset) {\n if (cachedAssetId === asset.assetId) {\n return cachedUrl;\n }\n cachedAssetId = asset.assetId;\n\n // If the SVG refers to fonts, they must be inlined in order to display correctly in the img tag.\n // Avoid parsing the SVG when possible, since it's expensive.\n if (asset.assetType === lib_storage[\"a\" /* default */].AssetType.ImageVector) {\n const svgString = asset.decodeText();\n if (svgString.match(HAS_FONT_REGEXP)) {\n const svgText = Object(scratch_svg_renderer_src[\"inlineSvgFonts\"])(svgString);\n cachedUrl = \"data:image/svg+xml;utf8,\".concat(encodeURIComponent(svgText));\n } else {\n cachedUrl = asset.encodeDataURI();\n }\n } else {\n cachedUrl = asset.encodeDataURI();\n }\n return cachedUrl;\n };\n}();\n\n// CONCATENATED MODULE: ./src/lib/touch-utils.js\nconst getEventXY = e => {\n if (e.touches && e.touches[0]) {\n return {\n x: e.touches[0].clientX,\n y: e.touches[0].clientY\n };\n } else if (e.changedTouches && e.changedTouches[0]) {\n return {\n x: e.changedTouches[0].clientX,\n y: e.changedTouches[0].clientY\n };\n }\n return {\n x: e.clientX,\n y: e.clientY\n };\n};\n\n// CONCATENATED MODULE: ./src/lib/drag-recognizer.js\n\n\nclass drag_recognizer_DragRecognizer {\n /* Gesture states */\n static get STATE_UNIDENTIFIED() {\n return 'unidentified';\n }\n static get STATE_SCROLL() {\n return 'scroll';\n }\n static get STATE_DRAG() {\n return 'drag';\n }\n constructor(_ref) {\n let {\n onDrag = () => {},\n onDragEnd = () => {},\n touchDragAngle = 70,\n // Angle and distance thresholds are the same as scratch-blocks\n distanceThreshold = 3\n } = _ref;\n this._onDrag = onDrag;\n this._onDragEnd = onDragEnd;\n this._touchDragAngle = touchDragAngle;\n this._distanceThreshold = distanceThreshold;\n this._initialOffset = null;\n this._gestureState = drag_recognizer_DragRecognizer.STATE_UNIDENTIFIED;\n lodash_bindall_default()(this, ['start', 'gestureInProgress', 'reset', '_handleMove', '_handleEnd']);\n }\n start(event) {\n if (typeof event.button === 'number' && event.button !== 0) {\n return;\n }\n this._initialOffset = getEventXY(event);\n this._bindListeners();\n }\n gestureInProgress() {\n return this._gestureState !== drag_recognizer_DragRecognizer.STATE_UNIDENTIFIED;\n }\n reset() {\n this._unbindListeners();\n this._initialOffset = null;\n this._gestureState = drag_recognizer_DragRecognizer.STATE_UNIDENTIFIED;\n }\n\n //\n // Internal functions\n //\n\n _bindListeners() {\n window.addEventListener('mouseup', this._handleEnd);\n window.addEventListener('mousemove', this._handleMove);\n window.addEventListener('touchend', this._handleEnd);\n // touchmove must be marked as non-passive, or else it cannot prevent scrolling\n window.addEventListener('touchmove', this._handleMove, {\n passive: false\n });\n }\n _unbindListeners() {\n window.removeEventListener('mouseup', this._handleEnd);\n window.removeEventListener('mousemove', this._handleMove);\n window.removeEventListener('touchend', this._handleEnd);\n window.removeEventListener('touchmove', this._handleMove, {\n passive: false\n });\n }\n _handleMove(event) {\n // For gestures identified as vertical scrolls, do not process movement events\n if (this._isScroll()) return;\n const currentOffset = getEventXY(event);\n\n // Try to identify this gesture if it hasn't been identified already\n if (!this.gestureInProgress()) {\n const dx = currentOffset.x - this._initialOffset.x;\n const dy = currentOffset.y - this._initialOffset.y;\n const dragDistance = Math.sqrt(dx * dx + dy * dy);\n if (dragDistance < this._distanceThreshold) return;\n\n // For touch moves, additionally check if the angle suggests drag vs. scroll\n if (event.type === 'touchmove') {\n // Direction goes from -180 to 180, with 0 toward the right.\n let angle = Math.atan2(dy, dx) / Math.PI * 180;\n // Fold over horizontal axis, range now 0 to 180\n angle = Math.abs(angle);\n // Fold over vertical axis, range now 0 to 90\n if (angle > 90) angle = 180 - angle;\n if (angle > this._touchDragAngle) {\n this._gestureState = drag_recognizer_DragRecognizer.STATE_SCROLL;\n } else {\n this._gestureState = drag_recognizer_DragRecognizer.STATE_DRAG;\n }\n } else {\n // Mouse moves are always considered drags\n this._gestureState = drag_recognizer_DragRecognizer.STATE_DRAG;\n }\n }\n if (this._isDrag()) {\n this._onDrag(currentOffset, this._initialOffset);\n event.preventDefault();\n }\n }\n _handleEnd() {\n this.reset();\n // Call the callback after reset to make sure if gestureInProgress()\n // is used in response, it get the correct value (i.e. no gesture in progress)\n this._onDragEnd();\n }\n _isDrag() {\n return this._gestureState === drag_recognizer_DragRecognizer.STATE_DRAG;\n }\n _isScroll() {\n return this._gestureState === drag_recognizer_DragRecognizer.STATE_SCROLL;\n }\n}\n/* harmony default export */ var drag_recognizer = (drag_recognizer_DragRecognizer);\n// EXTERNAL MODULE: ./src/components/delete-button/delete-button.css\nvar delete_button = __webpack_require__(198);\nvar delete_button_default = /*#__PURE__*/__webpack_require__.n(delete_button);\n\n// EXTERNAL MODULE: ./src/components/delete-button/icon--delete.svg\nvar icon_delete = __webpack_require__(315);\nvar icon_delete_default = /*#__PURE__*/__webpack_require__.n(icon_delete);\n\n// CONCATENATED MODULE: ./src/components/delete-button/delete-button.jsx\n\n\n\n\n\nconst DeleteButton = props => /*#__PURE__*/react_default.a.createElement(\"div\", {\n \"aria-label\": \"Delete\",\n className: classnames_default()(delete_button_default.a.deleteButton, props.className),\n role: \"button\",\n tabIndex: props.tabIndex,\n onClick: props.onClick\n}, /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: delete_button_default.a.deleteButtonVisible\n}, /*#__PURE__*/react_default.a.createElement(\"img\", {\n className: delete_button_default.a.deleteIcon,\n src: icon_delete_default.a,\n draggable: false\n})));\nDeleteButton.propTypes = {\n className: prop_types_default.a.string,\n onClick: prop_types_default.a.func.isRequired,\n tabIndex: prop_types_default.a.number\n};\nDeleteButton.defaultProps = {\n tabIndex: 0\n};\n/* harmony default export */ var delete_button_delete_button = (DeleteButton);\n// EXTERNAL MODULE: ./src/components/sprite-selector-item/sprite-selector-item.css\nvar sprite_selector_item = __webpack_require__(86);\nvar sprite_selector_item_default = /*#__PURE__*/__webpack_require__.n(sprite_selector_item);\n\n// EXTERNAL MODULE: ./node_modules/react-contextmenu/es6/index.js + 9 modules\nvar es6 = __webpack_require__(101);\n\n// EXTERNAL MODULE: ./src/components/context-menu/context-menu.css\nvar context_menu = __webpack_require__(112);\nvar context_menu_default = /*#__PURE__*/__webpack_require__.n(context_menu);\n\n// CONCATENATED MODULE: ./src/components/context-menu/context-menu.jsx\nfunction context_menu_extends() { return context_menu_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, context_menu_extends.apply(null, arguments); }\n\n\n\n\nconst StyledContextMenu = props => /*#__PURE__*/react_default.a.createElement(es6[\"a\" /* ContextMenu */], context_menu_extends({}, props, {\n className: context_menu_default.a.contextMenu\n}));\nconst StyledMenuItem = props => /*#__PURE__*/react_default.a.createElement(es6[\"c\" /* MenuItem */], context_menu_extends({}, props, {\n attributes: {\n className: context_menu_default.a.menuItem\n }\n}));\nconst BorderedMenuItem = props => /*#__PURE__*/react_default.a.createElement(es6[\"c\" /* MenuItem */], context_menu_extends({}, props, {\n attributes: {\n className: classnames_default()(context_menu_default.a.menuItem, context_menu_default.a.menuItemBordered)\n }\n}));\nconst DangerousMenuItem = props => /*#__PURE__*/react_default.a.createElement(es6[\"c\" /* MenuItem */], context_menu_extends({}, props, {\n attributes: {\n className: classnames_default()(context_menu_default.a.menuItem, context_menu_default.a.menuItemBordered, context_menu_default.a.menuItemDanger)\n }\n}));\n\n// CONCATENATED MODULE: ./src/components/sprite-selector-item/sprite-selector-item.jsx\n\n\n\n\n\n\n\n\n\n// react-contextmenu requires unique id to match trigger and context menu\nlet contextMenuId = 0;\nconst sprite_selector_item_SpriteSelectorItem = props => /*#__PURE__*/react_default.a.createElement(es6[\"b\" /* ContextMenuTrigger */], {\n attributes: {\n className: classnames_default()(props.className, sprite_selector_item_default.a.spriteSelectorItem, {\n [sprite_selector_item_default.a.isSelected]: props.selected\n }),\n onClick: props.onClick,\n onMouseEnter: props.onMouseEnter,\n onMouseLeave: props.onMouseLeave,\n onMouseDown: props.onMouseDown,\n onTouchStart: props.onMouseDown\n },\n disable: props.preventContextMenu,\n id: \"\".concat(props.name, \"-\").concat(contextMenuId),\n ref: props.componentRef\n}, typeof props.number === 'undefined' ? null : /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: sprite_selector_item_default.a.number\n}, props.number), props.costumeURL ? /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: sprite_selector_item_default.a.spriteImageOuter\n}, /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: sprite_selector_item_default.a.spriteImageInner\n}, /*#__PURE__*/react_default.a.createElement(\"img\", {\n className: sprite_selector_item_default.a.spriteImage,\n draggable: false,\n loading: \"lazy\",\n src: props.costumeURL\n}))) : null, /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: sprite_selector_item_default.a.spriteInfo\n}, /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: sprite_selector_item_default.a.spriteName\n}, props.name), props.details ? /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: sprite_selector_item_default.a.spriteDetails\n}, props.details) : null), props.selected && props.onDeleteButtonClick ? /*#__PURE__*/react_default.a.createElement(delete_button_delete_button, {\n className: sprite_selector_item_default.a.deleteButton,\n onClick: props.onDeleteButtonClick\n}) : null, props.onDuplicateButtonClick || props.onDeleteButtonClick || props.onExportButtonClick ? /*#__PURE__*/react_default.a.createElement(StyledContextMenu, {\n id: \"\".concat(props.name, \"-\").concat(contextMenuId++)\n}, props.onDuplicateButtonClick ? /*#__PURE__*/react_default.a.createElement(StyledMenuItem, {\n onClick: props.onDuplicateButtonClick\n}, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"duplicate\",\n id: \"gui.spriteSelectorItem.contextMenuDuplicate\"\n})) : null, props.onExportButtonClick ? /*#__PURE__*/react_default.a.createElement(StyledMenuItem, {\n onClick: props.onExportButtonClick\n}, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"export\",\n id: \"gui.spriteSelectorItem.contextMenuExport\"\n})) : null, props.onRenameButtonClick ? /*#__PURE__*/react_default.a.createElement(StyledMenuItem, {\n onClick: props.onRenameButtonClick\n}, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"rename\",\n id: \"tw.spriteSelectorItem.rename\"\n})) : null, props.onDeleteButtonClick ? /*#__PURE__*/react_default.a.createElement(DangerousMenuItem, {\n onClick: props.onDeleteButtonClick\n}, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"delete\",\n id: \"gui.spriteSelectorItem.contextMenuDelete\"\n})) : null) : null);\nsprite_selector_item_SpriteSelectorItem.propTypes = {\n className: prop_types_default.a.string,\n componentRef: prop_types_default.a.func,\n costumeURL: prop_types_default.a.string,\n details: prop_types_default.a.string,\n // eslint-disable-next-line react/forbid-prop-types\n name: prop_types_default.a.any,\n number: prop_types_default.a.number,\n onClick: prop_types_default.a.func,\n onDeleteButtonClick: prop_types_default.a.func,\n onDuplicateButtonClick: prop_types_default.a.func,\n onExportButtonClick: prop_types_default.a.func,\n onRenameButtonClick: prop_types_default.a.func,\n onMouseDown: prop_types_default.a.func,\n onMouseEnter: prop_types_default.a.func,\n onMouseLeave: prop_types_default.a.func,\n preventContextMenu: prop_types_default.a.bool,\n selected: prop_types_default.a.bool.isRequired\n};\n/* harmony default export */ var sprite_selector_item_sprite_selector_item = (sprite_selector_item_SpriteSelectorItem);\n// CONCATENATED MODULE: ./src/containers/sprite-selector-item.jsx\nconst sprite_selector_item_excluded = [\"asset\", \"id\", \"index\", \"onClick\", \"onDeleteButtonClick\", \"onDuplicateButtonClick\", \"onExportButtonClick\", \"onRenameButtonClick\", \"dragPayload\", \"receivedBlocks\", \"costumeURL\", \"vm\"];\nfunction sprite_selector_item_extends() { return sprite_selector_item_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, sprite_selector_item_extends.apply(null, arguments); }\nfunction sprite_selector_item_objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = sprite_selector_item_objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction sprite_selector_item_objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\n\n\n\n\n\n\n\nclass containers_sprite_selector_item_SpriteSelectorItem extends react_default.a.PureComponent {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['getCostumeData', 'setRef', 'handleClick', 'handleDelete', 'handleDuplicate', 'handleExport', 'handleRename', 'handleMouseEnter', 'handleMouseLeave', 'handleMouseDown', 'handleDragEnd', 'handleDrag', 'handleTouchEnd']);\n this.dragRecognizer = new drag_recognizer({\n onDrag: this.handleDrag,\n onDragEnd: this.handleDragEnd\n });\n }\n componentDidMount() {\n document.addEventListener('touchend', this.handleTouchEnd);\n }\n componentWillUnmount() {\n document.removeEventListener('touchend', this.handleTouchEnd);\n this.dragRecognizer.reset();\n }\n getCostumeData() {\n if (this.props.costumeURL) return this.props.costumeURL;\n if (!this.props.asset) return null;\n return getCostumeUrl(this.props.asset);\n }\n handleDragEnd() {\n if (this.props.dragging) {\n this.props.onDrag({\n img: null,\n currentOffset: null,\n dragging: false,\n dragType: null,\n index: null\n });\n }\n setTimeout(() => {\n this.noClick = false;\n });\n }\n handleDrag(currentOffset) {\n this.props.onDrag({\n img: this.getCostumeData(),\n currentOffset: currentOffset,\n dragging: true,\n dragType: this.props.dragType,\n index: this.props.index,\n payload: this.props.dragPayload\n });\n this.noClick = true;\n }\n handleTouchEnd(e) {\n const {\n x,\n y\n } = getEventXY(e);\n const {\n top,\n left,\n bottom,\n right\n } = this.ref.getBoundingClientRect();\n if (x >= left && x <= right && y >= top && y <= bottom) {\n this.handleMouseEnter();\n }\n }\n handleMouseDown(e) {\n this.dragRecognizer.start(e);\n }\n handleClick(e) {\n e.preventDefault();\n if (!this.noClick) {\n this.props.onClick(this.props.id);\n }\n }\n handleDelete(e) {\n e.stopPropagation(); // To prevent from bubbling back to handleClick\n this.props.onDeleteButtonClick(this.props.id);\n }\n handleDuplicate(e) {\n e.stopPropagation(); // To prevent from bubbling back to handleClick\n this.props.onDuplicateButtonClick(this.props.id);\n }\n handleExport(e) {\n e.stopPropagation();\n this.props.onExportButtonClick(this.props.id);\n }\n handleRename(e) {\n e.stopPropagation();\n this.props.onRenameButtonClick(this.props.id);\n }\n handleMouseLeave() {\n this.props.dispatchSetHoveredSprite(null);\n }\n handleMouseEnter() {\n this.props.dispatchSetHoveredSprite(this.props.id);\n }\n setRef(component) {\n // Access the DOM node using .elem because it is going through ContextMenuTrigger\n this.ref = component && component.elem;\n }\n render() {\n const _this$props = this.props,\n {\n /* eslint-disable no-unused-vars */\n asset,\n id,\n index,\n onClick,\n onDeleteButtonClick,\n onDuplicateButtonClick,\n onExportButtonClick,\n onRenameButtonClick,\n dragPayload,\n receivedBlocks,\n costumeURL,\n vm\n /* eslint-enable no-unused-vars */\n } = _this$props,\n props = sprite_selector_item_objectWithoutProperties(_this$props, sprite_selector_item_excluded);\n return /*#__PURE__*/react_default.a.createElement(sprite_selector_item_sprite_selector_item, sprite_selector_item_extends({\n componentRef: this.setRef,\n costumeURL: this.getCostumeData(),\n preventContextMenu: this.dragRecognizer.gestureInProgress(),\n onClick: this.handleClick,\n onDeleteButtonClick: onDeleteButtonClick ? this.handleDelete : null,\n onDuplicateButtonClick: onDuplicateButtonClick ? this.handleDuplicate : null,\n onExportButtonClick: onExportButtonClick ? this.handleExport : null,\n onRenameButtonClick: onRenameButtonClick ? this.handleRename : null,\n onMouseDown: this.handleMouseDown,\n onMouseEnter: this.handleMouseEnter,\n onMouseLeave: this.handleMouseLeave\n }, props));\n }\n}\ncontainers_sprite_selector_item_SpriteSelectorItem.propTypes = {\n // eslint-disable-next-line react/forbid-prop-types\n asset: prop_types_default.a.any,\n costumeURL: prop_types_default.a.string,\n dispatchSetHoveredSprite: prop_types_default.a.func.isRequired,\n // eslint-disable-next-line react/forbid-prop-types\n dragPayload: prop_types_default.a.any,\n dragType: prop_types_default.a.string,\n dragging: prop_types_default.a.bool,\n // eslint-disable-next-line react/forbid-prop-types\n id: prop_types_default.a.any,\n index: prop_types_default.a.number,\n // eslint-disable-next-line react/forbid-prop-types\n name: prop_types_default.a.any,\n onClick: prop_types_default.a.func,\n onDeleteButtonClick: prop_types_default.a.func,\n onRenameButtonClick: prop_types_default.a.func,\n onDrag: prop_types_default.a.func.isRequired,\n onDuplicateButtonClick: prop_types_default.a.func,\n onExportButtonClick: prop_types_default.a.func,\n receivedBlocks: prop_types_default.a.bool.isRequired,\n selected: prop_types_default.a.bool,\n vm: prop_types_default.a.instanceOf(src_default.a).isRequired\n};\nconst sprite_selector_item_mapStateToProps = (state, _ref) => {\n let {\n id\n } = _ref;\n return {\n dragging: state.scratchGui.assetDrag.dragging,\n receivedBlocks: state.scratchGui.hoveredTarget.receivedBlocks && state.scratchGui.hoveredTarget.sprite === id,\n vm: state.scratchGui.vm\n };\n};\nconst sprite_selector_item_mapDispatchToProps = dispatch => ({\n dispatchSetHoveredSprite: spriteId => {\n dispatch(Object(hovered_target[\"c\" /* setHoveredSprite */])(spriteId));\n },\n onDrag: data => dispatch(Object(asset_drag[\"c\" /* updateAssetDrag */])(data))\n});\nconst ConnectedComponent = Object(react_redux_es[\"b\" /* connect */])(sprite_selector_item_mapStateToProps, sprite_selector_item_mapDispatchToProps)(containers_sprite_selector_item_SpriteSelectorItem);\n/* harmony default export */ var containers_sprite_selector_item = (ConnectedComponent);\n// EXTERNAL MODULE: ./node_modules/react-tooltip/dist/index.js\nvar react_tooltip_dist = __webpack_require__(97);\nvar react_tooltip_dist_default = /*#__PURE__*/__webpack_require__.n(react_tooltip_dist);\n\n// EXTERNAL MODULE: ./src/components/action-menu/action-menu.css\nvar action_menu = __webpack_require__(43);\nvar action_menu_default = /*#__PURE__*/__webpack_require__.n(action_menu);\n\n// CONCATENATED MODULE: ./src/components/action-menu/action-menu.jsx\n\n\n\n\n\n\nconst CLOSE_DELAY = 300; // ms\n\nclass action_menu_ActionMenu extends react_default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['clickDelayer', 'handleClosePopover', 'handleToggleOpenState', 'handleTouchStart', 'handleTouchOutside', 'setButtonRef', 'setContainerRef']);\n this.state = {\n isOpen: false,\n forceHide: false\n };\n this.mainTooltipId = \"tooltip-\".concat(Math.random());\n }\n componentDidMount() {\n // Touch start on the main button is caught to trigger open and not click\n this.buttonRef.addEventListener('touchstart', this.handleTouchStart);\n // Touch start on document is used to trigger close if it is outside\n document.addEventListener('touchstart', this.handleTouchOutside);\n }\n shouldComponentUpdate(newProps, newState) {\n // This check prevents re-rendering while the project is updating.\n // @todo check only the state and the title because it is enough to know\n // if anything substantial has changed\n // This is needed because of the sloppy way the props are passed as a new object,\n // which should be refactored.\n return newState.isOpen !== this.state.isOpen || newState.forceHide !== this.state.forceHide || newProps.title !== this.props.title;\n }\n componentWillUnmount() {\n this.buttonRef.removeEventListener('touchstart', this.handleTouchStart);\n document.removeEventListener('touchstart', this.handleTouchOutside);\n }\n handleClosePopover() {\n this.closeTimeoutId = setTimeout(() => {\n this.setState({\n isOpen: false\n });\n this.closeTimeoutId = null;\n }, CLOSE_DELAY);\n }\n handleToggleOpenState() {\n // Mouse enter back in after timeout was started prevents it from closing.\n if (this.closeTimeoutId) {\n clearTimeout(this.closeTimeoutId);\n this.closeTimeoutId = null;\n } else if (!this.state.isOpen) {\n this.setState({\n isOpen: true,\n forceHide: false\n });\n }\n }\n handleTouchOutside(e) {\n if (this.state.isOpen && !this.containerRef.contains(e.target)) {\n this.setState({\n isOpen: false\n });\n react_tooltip_dist_default.a.hide();\n }\n }\n clickDelayer(fn) {\n // Return a wrapped action that manages the menu closing.\n // @todo we may be able to use react-transition for this in the future\n // for now all this work is to ensure the menu closes BEFORE the\n // (possibly slow) action is started.\n return event => {\n react_tooltip_dist_default.a.hide();\n if (fn) fn(event);\n // Blur the button so it does not keep focus after being clicked\n // This prevents keyboard events from triggering the button\n this.buttonRef.blur();\n this.setState({\n forceHide: true,\n isOpen: false\n }, () => {\n setTimeout(() => this.setState({\n forceHide: false\n }));\n });\n };\n }\n handleTouchStart(e) {\n // Prevent this touch from becoming a click if menu is closed\n if (!this.state.isOpen) {\n e.preventDefault();\n this.handleToggleOpenState();\n }\n }\n setButtonRef(ref) {\n this.buttonRef = ref;\n }\n setContainerRef(ref) {\n this.containerRef = ref;\n }\n render() {\n const {\n className,\n img: mainImg,\n title: mainTitle,\n moreButtons,\n tooltipPlace,\n onClick\n } = this.props;\n return /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: classnames_default()(action_menu_default.a.menuContainer, className, {\n [action_menu_default.a.expanded]: this.state.isOpen,\n [action_menu_default.a.forceHidden]: this.state.forceHide\n }),\n ref: this.setContainerRef,\n onMouseEnter: this.handleToggleOpenState,\n onMouseLeave: this.handleClosePopover\n }, /*#__PURE__*/react_default.a.createElement(\"button\", {\n \"aria-label\": mainTitle,\n className: classnames_default()(action_menu_default.a.button, action_menu_default.a.mainButton),\n \"data-for\": this.mainTooltipId,\n \"data-tip\": mainTitle,\n ref: this.setButtonRef,\n onClick: this.clickDelayer(onClick)\n }, /*#__PURE__*/react_default.a.createElement(\"img\", {\n className: action_menu_default.a.mainIcon,\n draggable: false,\n src: mainImg\n })), /*#__PURE__*/react_default.a.createElement(react_tooltip_dist_default.a, {\n className: action_menu_default.a.tooltip,\n effect: \"solid\",\n id: this.mainTooltipId,\n place: tooltipPlace || 'left'\n }), /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: action_menu_default.a.moreButtonsOuter\n }, /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: action_menu_default.a.moreButtons\n }, (moreButtons || []).map((_ref, keyId) => {\n let {\n img,\n title,\n onClick: handleClick,\n fileAccept,\n fileChange,\n fileInput,\n fileMultiple\n } = _ref;\n const isComingSoon = !handleClick;\n const hasFileInput = fileInput;\n const tooltipId = \"\".concat(this.mainTooltipId, \"-\").concat(title);\n return /*#__PURE__*/react_default.a.createElement(\"div\", {\n key: \"\".concat(tooltipId, \"-\").concat(keyId)\n }, /*#__PURE__*/react_default.a.createElement(\"button\", {\n \"aria-label\": title,\n className: classnames_default()(action_menu_default.a.button, action_menu_default.a.moreButton, {\n [action_menu_default.a.comingSoon]: isComingSoon\n }),\n \"data-for\": tooltipId,\n \"data-tip\": title,\n onClick: hasFileInput ? handleClick : this.clickDelayer(handleClick)\n }, /*#__PURE__*/react_default.a.createElement(\"img\", {\n className: action_menu_default.a.moreIcon,\n draggable: false,\n src: img\n }), hasFileInput ? /*#__PURE__*/react_default.a.createElement(\"input\", {\n accept: fileAccept,\n className: action_menu_default.a.fileInput,\n multiple: fileMultiple,\n ref: fileInput,\n type: \"file\",\n onChange: fileChange\n }) : null), /*#__PURE__*/react_default.a.createElement(react_tooltip_dist_default.a, {\n className: classnames_default()(action_menu_default.a.tooltip, {\n [action_menu_default.a.comingSoonTooltip]: isComingSoon\n }),\n effect: \"solid\",\n id: tooltipId,\n place: tooltipPlace || 'left'\n }));\n }))));\n }\n}\naction_menu_ActionMenu.propTypes = {\n className: prop_types_default.a.string,\n img: prop_types_default.a.string,\n moreButtons: prop_types_default.a.arrayOf(prop_types_default.a.shape({\n img: prop_types_default.a.string,\n title: prop_types_default.a.node.isRequired,\n onClick: prop_types_default.a.func,\n // Optional, \"coming soon\" if no callback provided\n fileAccept: prop_types_default.a.string,\n // Optional, only for file upload\n fileChange: prop_types_default.a.func,\n // Optional, only for file upload\n fileInput: prop_types_default.a.func,\n // Optional, only for file upload\n fileMultiple: prop_types_default.a.bool // Optional, only for file upload\n })),\n onClick: prop_types_default.a.func.isRequired,\n title: prop_types_default.a.node.isRequired,\n tooltipPlace: prop_types_default.a.string\n};\n/* harmony default export */ var action_menu_action_menu = (action_menu_ActionMenu);\n// CONCATENATED MODULE: ./src/components/asset-panel/sortable-asset.jsx\n\n\n\nclass sortable_asset_SortableAsset extends react_default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['setRef']);\n }\n componentDidMount() {\n this.props.onAddSortable(this.ref);\n }\n componentWillUnmount() {\n this.props.onRemoveSortable(this.ref);\n }\n setRef(ref) {\n this.ref = ref;\n }\n render() {\n return /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: this.props.className,\n ref: this.setRef,\n style: {\n order: this.props.index\n }\n }, this.props.children);\n }\n}\nsortable_asset_SortableAsset.propTypes = {\n children: prop_types_default.a.node.isRequired,\n className: prop_types_default.a.string,\n index: prop_types_default.a.number.isRequired,\n onAddSortable: prop_types_default.a.func.isRequired,\n onRemoveSortable: prop_types_default.a.func.isRequired\n};\n/* harmony default export */ var sortable_asset = (sortable_asset_SortableAsset);\n// CONCATENATED MODULE: ./src/lib/drag-utils.js\n/**\n * @fileoverview\n * Utility functions for drag interactions, e.g. sorting items in a grid/list.\n */\n\n/**\n * From an xy position and a list of boxes {top, left, bottom, right}, return there\n * corresponding box index the position is over. The boxes are in a (possibly wrapped)\n * list, the only requirement being all boxes are flush against the edges, that is,\n * if they are along an outer edge, the position of that edge is identical.\n * This functionality works for a single column of items, a wrapped list with\n * many rows, or a single row of items.\n * @param {{x: number, y: number}} position The xy coordinates to retreive the corresponding index of.\n * @param {Array.} boxes The rects of the items, returned from `getBoundingClientRect`\n * @param {bool} isRtl are the boxes in RTL order.\n * @return {?number} index of the corresponding box, or null if one could not be found.\n */\nconst indexForPositionOnList = (_ref, boxes, isRtl) => {\n let {\n x,\n y\n } = _ref;\n if (boxes.length === 0) return null;\n let index = null;\n const leftEdge = Math.min.apply(null, boxes.map(b => b.left));\n const rightEdge = Math.max.apply(null, boxes.map(b => b.right));\n const topEdge = Math.min.apply(null, boxes.map(b => b.top));\n const bottomEdge = Math.max.apply(null, boxes.map(b => b.bottom));\n for (let n = 0; n < boxes.length; n++) {\n const box = boxes[n];\n // Construct an \"extended\" box for each, extending out to infinity if\n // the box is along a boundary.\n let minX = box.left === leftEdge ? -Infinity : box.left;\n let maxX = box.right === rightEdge ? Infinity : box.right;\n const minY = box.top === topEdge ? -Infinity : box.top;\n const maxY = box.bottom === bottomEdge ? Infinity : box.bottom;\n // The last item in the wrapped list gets a right edge at infinity, even\n // if it isn't the farthest right, in RTL mode. In LTR mode, it gets a\n // left edge at infinity.\n if (n === boxes.length - 1) {\n if (isRtl) {\n minX = -Infinity;\n } else {\n maxX = Infinity;\n }\n }\n\n // Check if the point is in the bounds.\n if (x >= minX && x <= maxX && y >= minY && y <= maxY) {\n index = n;\n break; // No need to keep looking.\n }\n }\n return index;\n};\n\n// CONCATENATED MODULE: ./src/lib/sortable-hoc.jsx\nfunction sortable_hoc_extends() { return sortable_hoc_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, sortable_hoc_extends.apply(null, arguments); }\n\n\n\n\n\nconst sortable_hoc_SortableHOC = function SortableHOC(WrappedComponent) {\n class SortableWrapper extends react_default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['setRef', 'handleAddSortable', 'handleRemoveSortable']);\n this.sortableRefs = [];\n this.boxes = null;\n this.ref = null;\n this.containerBox = null;\n }\n componentWillReceiveProps(newProps) {\n if (newProps.dragInfo.dragging && !this.props.dragInfo.dragging) {\n // Drag just started, snapshot the sorted bounding boxes for sortables.\n this.boxes = this.sortableRefs.map(el => el && el.getBoundingClientRect());\n this.boxes.sort((a, b) => {\n // Sort top-to-bottom, left-to-right (in LTR) / right-to-left (in RTL).\n if (a.top === b.top) return (a.left - b.left) * (this.props.isRtl ? -1 : 1);\n return a.top - b.top;\n });\n if (!this.ref) {\n throw new Error('The containerRef must be assigned to the sortable area');\n }\n this.containerBox = this.ref.getBoundingClientRect();\n } else if (!newProps.dragInfo.dragging && this.props.dragInfo.dragging) {\n const newIndex = this.getMouseOverIndex();\n if (newIndex !== null) {\n this.props.onDrop(Object.assign({}, this.props.dragInfo, {\n newIndex\n }));\n }\n }\n }\n handleAddSortable(node) {\n this.sortableRefs.push(node);\n }\n handleRemoveSortable(node) {\n const index = this.sortableRefs.indexOf(node);\n this.sortableRefs = this.sortableRefs.slice(0, index).concat(this.sortableRefs.slice(index + 1));\n }\n getOrdering(items, draggingIndex, newIndex) {\n // An \"Ordering\" is an array of indices, where the position array value corresponds\n // to the position of the item in props.items, and the index of the value\n // is the index at which the item should appear.\n // That is, if props.items is ['a', 'b', 'c', 'd'], and we want the GUI to display\n // ['b', 'c', 'a, 'd'], the value of \"ordering\" would be [1, 2, 0, 3].\n // This mapping is used because it is easy to translate to flexbox ordering,\n // the `order` property for item N is ordering.indexOf(N).\n // If the user-facing order matches props.items, the ordering is just [0, 1, 2, ...]\n let ordering = Array(this.props.items.length).fill(0).map((_, i) => i);\n const isNumber = v => typeof v === 'number' && !isNaN(v);\n if (isNumber(draggingIndex) && isNumber(newIndex)) {\n ordering = ordering.slice(0, draggingIndex).concat(ordering.slice(draggingIndex + 1));\n ordering.splice(newIndex, 0, draggingIndex);\n }\n return ordering;\n }\n getMouseOverIndex() {\n // MouseOverIndex is the index that the current drag wants to place the\n // the dragging object. Obviously only exists if there is a drag (i.e. currentOffset).\n // Return null if outside the container, zero if there are no boxes.\n let mouseOverIndex = null;\n if (this.props.dragInfo.currentOffset) {\n const {\n x,\n y\n } = this.props.dragInfo.currentOffset;\n const {\n top,\n left,\n bottom,\n right\n } = this.containerBox;\n if (x >= left && x <= right && y >= top && y <= bottom) {\n if (this.boxes.length === 0) {\n mouseOverIndex = 0;\n } else {\n mouseOverIndex = indexForPositionOnList(this.props.dragInfo.currentOffset, this.boxes, this.props.isRtl);\n }\n }\n }\n return mouseOverIndex;\n }\n setRef(el) {\n this.ref = el;\n }\n render() {\n const {\n dragInfo: {\n index: dragIndex,\n dragType\n },\n items\n } = this.props;\n const mouseOverIndex = this.getMouseOverIndex();\n const ordering = this.getOrdering(items, dragIndex, mouseOverIndex);\n return /*#__PURE__*/react_default.a.createElement(WrappedComponent, sortable_hoc_extends({\n containerRef: this.setRef,\n draggingIndex: dragIndex,\n draggingType: dragType,\n mouseOverIndex: mouseOverIndex,\n ordering: ordering,\n onAddSortable: this.handleAddSortable,\n onRemoveSortable: this.handleRemoveSortable\n }, this.props));\n }\n }\n SortableWrapper.propTypes = {\n dragInfo: prop_types_default.a.shape({\n currentOffset: prop_types_default.a.shape({\n x: prop_types_default.a.number,\n y: prop_types_default.a.number\n }),\n dragType: prop_types_default.a.string,\n dragging: prop_types_default.a.bool,\n index: prop_types_default.a.number\n }),\n items: prop_types_default.a.arrayOf(prop_types_default.a.shape({\n url: prop_types_default.a.string,\n name: prop_types_default.a.string.isRequired\n })),\n onClose: prop_types_default.a.func,\n onDrop: prop_types_default.a.func,\n isRtl: prop_types_default.a.bool\n };\n const mapStateToProps = state => ({\n dragInfo: state.scratchGui.assetDrag,\n isRtl: state.locales.isRtl\n });\n const mapDispatchToProps = () => ({});\n return Object(react_redux_es[\"b\" /* connect */])(mapStateToProps, mapDispatchToProps)(SortableWrapper);\n};\n/* harmony default export */ var sortable_hoc = (sortable_hoc_SortableHOC);\n// EXTERNAL MODULE: ./src/components/asset-panel/selector.css\nvar selector = __webpack_require__(137);\nvar selector_default = /*#__PURE__*/__webpack_require__.n(selector);\n\n// CONCATENATED MODULE: ./src/components/asset-panel/selector.jsx\n\n\n\n\n\n\n\n\n\n\nconst Selector = props => {\n const {\n buttons,\n containerRef,\n dragType,\n isRtl,\n items,\n selectedItemIndex,\n draggingIndex,\n draggingType,\n ordering,\n onAddSortable,\n onRemoveSortable,\n onDeleteClick,\n onDuplicateClick,\n onExportClick,\n onItemClick\n } = props;\n const isRelevantDrag = draggingType === dragType;\n let newButtonSection = null;\n if (buttons.length > 0) {\n const {\n img,\n title,\n onClick\n } = buttons[0];\n const moreButtons = buttons.slice(1);\n newButtonSection = /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: selector_default.a.newButtons\n }, /*#__PURE__*/react_default.a.createElement(action_menu_action_menu, {\n img: img,\n moreButtons: moreButtons,\n title: title,\n tooltipPlace: isRtl ? 'left' : 'right',\n onClick: onClick\n }));\n }\n return /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: selector_default.a.wrapper,\n componentRef: containerRef\n }, /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: selector_default.a.listArea\n }, items.map((item, index) => /*#__PURE__*/react_default.a.createElement(sortable_asset, {\n id: item.name,\n index: isRelevantDrag ? ordering.indexOf(index) : index,\n key: item.name,\n onAddSortable: onAddSortable,\n onRemoveSortable: onRemoveSortable\n }, /*#__PURE__*/react_default.a.createElement(containers_sprite_selector_item, {\n asset: item.asset,\n className: classnames_default()(selector_default.a.listItem, {\n [selector_default.a.placeholder]: isRelevantDrag && index === draggingIndex\n }),\n costumeURL: item.url,\n details: item.details,\n dragPayload: item.dragPayload,\n dragType: dragType,\n id: index,\n index: index,\n name: item.name,\n number: index + 1 /* 1-indexed */,\n selected: index === selectedItemIndex,\n onClick: onItemClick,\n onDeleteButtonClick: onDeleteClick,\n onDuplicateButtonClick: onDuplicateClick,\n onExportButtonClick: onExportClick\n })))), newButtonSection);\n};\nSelector.propTypes = {\n buttons: prop_types_default.a.arrayOf(prop_types_default.a.shape({\n title: prop_types_default.a.string.isRequired,\n img: prop_types_default.a.string.isRequired,\n onClick: prop_types_default.a.func\n })),\n containerRef: prop_types_default.a.func,\n dragType: prop_types_default.a.oneOf(Object.keys(drag_constants)),\n draggingIndex: prop_types_default.a.number,\n draggingType: prop_types_default.a.oneOf(Object.keys(drag_constants)),\n isRtl: prop_types_default.a.bool,\n items: prop_types_default.a.arrayOf(prop_types_default.a.shape({\n url: prop_types_default.a.string,\n name: prop_types_default.a.any // modified by folders addon\n })),\n onAddSortable: prop_types_default.a.func,\n onDeleteClick: prop_types_default.a.func,\n onDuplicateClick: prop_types_default.a.func,\n onExportClick: prop_types_default.a.func,\n onItemClick: prop_types_default.a.func.isRequired,\n onRemoveSortable: prop_types_default.a.func,\n ordering: prop_types_default.a.arrayOf(prop_types_default.a.number),\n selectedItemIndex: prop_types_default.a.number.isRequired\n};\n/* harmony default export */ var asset_panel_selector = (sortable_hoc(Selector));\n// EXTERNAL MODULE: ./src/components/asset-panel/asset-panel.css\nvar asset_panel = __webpack_require__(199);\nvar asset_panel_default = /*#__PURE__*/__webpack_require__.n(asset_panel);\n\n// CONCATENATED MODULE: ./src/components/asset-panel/asset-panel.jsx\nfunction asset_panel_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction asset_panel_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? asset_panel_ownKeys(Object(t), !0).forEach(function (r) { asset_panel_defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : asset_panel_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction asset_panel_defineProperty(e, r, t) { return (r = asset_panel_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction asset_panel_toPropertyKey(t) { var i = asset_panel_toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction asset_panel_toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction asset_panel_extends() { return asset_panel_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, asset_panel_extends.apply(null, arguments); }\n\n\n\n\nconst AssetPanel = props => /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: asset_panel_default.a.wrapper\n}, /*#__PURE__*/react_default.a.createElement(asset_panel_selector, asset_panel_extends({\n className: asset_panel_default.a.selector\n}, props)), /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: asset_panel_default.a.detailArea\n}, props.children));\nAssetPanel.propTypes = asset_panel_objectSpread({}, asset_panel_selector.propTypes);\n/* harmony default export */ var asset_panel_asset_panel = (AssetPanel);\n// EXTERNAL MODULE: ./src/lib/tw-scratch-paint.js\nvar tw_scratch_paint = __webpack_require__(225);\n\n// CONCATENATED MODULE: ./src/containers/paint-editor-wrapper.jsx\nconst paint_editor_wrapper_excluded = [\"selectedCostumeIndex\", \"vm\"];\nfunction paint_editor_wrapper_extends() { return paint_editor_wrapper_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, paint_editor_wrapper_extends.apply(null, arguments); }\nfunction paint_editor_wrapper_objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = paint_editor_wrapper_objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction paint_editor_wrapper_objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\n\n\n\n\n\n\nclass paint_editor_wrapper_PaintEditorWrapper extends react_default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['handleUpdateImage', 'handleUpdateName', 'handleUpdateFonts', 'fontInlineFn']);\n this.state = {\n fonts: this.props.vm.runtime.fontManager.getFonts()\n };\n }\n componentDidMount() {\n this.props.vm.runtime.fontManager.on('change', this.handleUpdateFonts);\n }\n shouldComponentUpdate(nextProps, nextState) {\n return this.props.imageId !== nextProps.imageId || this.props.rtl !== nextProps.rtl || this.props.name !== nextProps.name || this.props.theme !== nextProps.theme || this.props.customStageSize !== nextProps.customStageSize || this.state.fonts !== nextState.fonts;\n }\n componentWillUnmount() {\n this.props.vm.runtime.fontManager.off('change', this.handleUpdateFonts);\n }\n handleUpdateFonts() {\n this.setState({\n fonts: this.props.vm.runtime.fontManager.getFonts()\n });\n }\n handleUpdateName(name) {\n this.props.vm.renameCostume(this.props.selectedCostumeIndex, name);\n }\n handleUpdateImage(isVector, image, rotationCenterX, rotationCenterY) {\n if (isVector) {\n this.props.vm.updateSvg(this.props.selectedCostumeIndex, image, rotationCenterX, rotationCenterY);\n } else {\n this.props.vm.updateBitmap(this.props.selectedCostumeIndex, image, rotationCenterX, rotationCenterY, 2 /* bitmapResolution */);\n }\n }\n fontInlineFn(svgString) {\n return Object(scratch_svg_renderer_src[\"inlineSvgFonts\"])(svgString, this.props.vm.renderer.customFonts);\n }\n render() {\n if (!this.props.imageId) return null;\n const _this$props = this.props,\n {\n selectedCostumeIndex,\n vm\n } = _this$props,\n componentProps = paint_editor_wrapper_objectWithoutProperties(_this$props, paint_editor_wrapper_excluded);\n const costume = vm.getCostume(selectedCostumeIndex);\n return /*#__PURE__*/react_default.a.createElement(tw_scratch_paint[\"default\"], paint_editor_wrapper_extends({}, componentProps, {\n image: this.props.imageFormat === 'svg' ? scratch_svg_renderer_src[\"sanitizeSvg\"].sanitizeSvgText(costume) : costume,\n onUpdateImage: this.handleUpdateImage,\n onUpdateName: this.handleUpdateName,\n fontInlineFn: this.fontInlineFn,\n theme: this.props.theme.isDark() ? 'dark' : 'light',\n customFonts: this.state.fonts,\n width: this.props.customStageSize.width,\n height: this.props.customStageSize.height\n }));\n }\n}\npaint_editor_wrapper_PaintEditorWrapper.propTypes = {\n customStageSize: prop_types_default.a.shape({\n width: prop_types_default.a.number,\n height: prop_types_default.a.number\n }),\n onManageFonts: prop_types_default.a.func.isRequired,\n imageFormat: prop_types_default.a.string.isRequired,\n imageId: prop_types_default.a.string.isRequired,\n theme: prop_types_default.a.instanceOf(themes[\"m\" /* Theme */]),\n name: prop_types_default.a.string,\n rotationCenterX: prop_types_default.a.number,\n rotationCenterY: prop_types_default.a.number,\n rtl: prop_types_default.a.bool,\n selectedCostumeIndex: prop_types_default.a.number.isRequired,\n vm: prop_types_default.a.instanceOf(src_default.a)\n};\nconst paint_editor_wrapper_mapStateToProps = (state, _ref) => {\n let {\n selectedCostumeIndex\n } = _ref;\n const targetId = state.scratchGui.vm.editingTarget.id;\n const sprite = state.scratchGui.vm.editingTarget.sprite;\n // Make sure the costume index doesn't go out of range.\n const index = selectedCostumeIndex < sprite.costumes.length ? selectedCostumeIndex : sprite.costumes.length - 1;\n const costume = state.scratchGui.vm.editingTarget.sprite.costumes[index];\n return {\n customStageSize: state.scratchGui.customStageSize,\n name: costume && costume.name,\n rotationCenterX: costume && costume.rotationCenterX,\n rotationCenterY: costume && costume.rotationCenterY,\n imageFormat: costume && costume.dataFormat,\n imageId: targetId && \"\".concat(targetId).concat(costume.skinId),\n rtl: state.locales.isRtl,\n selectedCostumeIndex: index,\n theme: state.scratchGui.theme.theme,\n vm: state.scratchGui.vm,\n zoomLevelId: targetId\n };\n};\nconst paint_editor_wrapper_mapDispatchToProps = dispatch => ({\n onManageFonts: () => dispatch(Object(modals[\"y\" /* openFontsModal */])())\n});\n/* harmony default export */ var paint_editor_wrapper = (Object(error_boundary_hoc[\"a\" /* default */])('paint')(Object(react_redux_es[\"b\" /* connect */])(paint_editor_wrapper_mapStateToProps, paint_editor_wrapper_mapDispatchToProps)(paint_editor_wrapper_PaintEditorWrapper)));\n// CONCATENATED MODULE: ./src/lib/randomize-sprite-position.js\nconst randomizeSpritePosition = spriteObject => {\n // https://github.com/LLK/scratch-flash/blob/689f3c79a7e8b2e98f5be80056d877f303a8d8ba/src/Scratch.as#L1385\n spriteObject.x = Math.floor(200 * Math.random() - 100);\n spriteObject.y = Math.floor(100 * Math.random() - 50);\n};\n/* harmony default export */ var randomize_sprite_position = (randomizeSpritePosition);\n// CONCATENATED MODULE: ./src/lib/bmp-converter.js\n/* harmony default export */ var bmp_converter = (function (bmpImage) {\n let type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'image/bmp';\n return new Promise(resolve => {\n // If the input is an ArrayBuffer, we need to convert it to a `Blob` and give it a URL so we can use it as an \n // `src`. If it's a data URI, we can use it as-is.\n const imageUrl = bmpImage instanceof String ? bmpImage : window.URL.createObjectURL(new Blob([bmpImage], {\n type\n }));\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n const image = document.createElement('img');\n image.addEventListener('load', () => {\n canvas.width = image.naturalWidth;\n canvas.height = image.naturalHeight;\n ctx.drawImage(image, 0, 0);\n const dataUrl = canvas.toDataURL('image/png');\n\n // Revoke URL. If a blob URL was generated earlier, this allows the blob to be GC'd and prevents a memory leak.\n window.URL.revokeObjectURL(imageUrl);\n resolve(dataUrl);\n });\n image.setAttribute('src', imageUrl);\n });\n});\n// EXTERNAL MODULE: ./node_modules/omggif/omggif.js\nvar omggif = __webpack_require__(431);\n\n// CONCATENATED MODULE: ./src/lib/gif-decoder.js\n\n/* harmony default export */ var gif_decoder = ((arrayBuffer, onFrame) => {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n const gifReader = new omggif[\"GifReader\"](new Uint8Array(arrayBuffer));\n const numFrames = gifReader.numFrames();\n canvas.width = gifReader.width;\n canvas.height = gifReader.height;\n let imageData = ctx.createImageData(canvas.width, canvas.height);\n let previousData = ctx.createImageData(canvas.width, canvas.height);\n const loadFrame = i => {\n const framePixels = [];\n gifReader.decodeAndBlitFrameRGBA(i, framePixels);\n const {\n x,\n y,\n width,\n height,\n disposal\n } = gifReader.frameInfo(i);\n for (let row = 0; row < height; row++) {\n for (let column = 0; column < width; column++) {\n const indexOffset = 4 * (x + y * canvas.width);\n const j = indexOffset + 4 * (column + row * canvas.width);\n if (framePixels[j + 3]) {\n imageData.data[j + 0] = framePixels[j + 0];\n imageData.data[j + 1] = framePixels[j + 1];\n imageData.data[j + 2] = framePixels[j + 2];\n imageData.data[j + 3] = framePixels[j + 3];\n }\n }\n }\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.putImageData(imageData, 0, 0);\n const dataUrl = canvas.toDataURL();\n switch (disposal) {\n case 2:\n // \"Return to background\", blank out the current frame\n ctx.clearRect(x, y, width, height);\n imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);\n break;\n case 3:\n // \"Restore to previous\", copy previous data to current\n imageData = ctx.createImageData(canvas.width, canvas.height);\n imageData.data.set(previousData.data);\n break;\n default:\n // 0 and 1, as well as 4+ modes = do-not-dispose, so cache frame\n previousData = ctx.getImageData(0, 0, canvas.width, canvas.height);\n break;\n }\n onFrame(i, dataUrl, numFrames);\n if (i < numFrames - 1) {\n setTimeout(() => {\n loadFrame(i + 1);\n });\n }\n };\n loadFrame(0);\n});\n// EXTERNAL MODULE: ./node_modules/@turbowarp/startaudiocontext/index.js\nvar startaudiocontext = __webpack_require__(414);\nvar startaudiocontext_default = /*#__PURE__*/__webpack_require__.n(startaudiocontext);\n\n// EXTERNAL MODULE: ./node_modules/bowser/src/bowser.js\nvar bowser = __webpack_require__(218);\nvar bowser_default = /*#__PURE__*/__webpack_require__.n(bowser);\n\n// CONCATENATED MODULE: ./src/lib/audio/shared-audio-context.js\n\n\n\nlet AUDIO_CONTEXT;\nif (!bowser_default.a.msie) {\n /**\n * AudioContext can be initialized only when user interaction event happens\n */\n const event = typeof document.ontouchstart === 'undefined' ? 'mousedown' : 'touchstart';\n const initAudioContext = () => {\n document.removeEventListener(event, initAudioContext);\n try {\n AUDIO_CONTEXT = new (window.AudioContext || window.webkitAudioContext)();\n startaudiocontext_default()(AUDIO_CONTEXT);\n } catch (e) {\n log[\"default\"].error('could not create shared audio context; sound-related features will not be available', e);\n }\n };\n document.addEventListener(event, initAudioContext);\n}\n\n/**\n * Wrap browser AudioContext because we shouldn't create more than one\n * @return {AudioContext} The singleton AudioContext\n */\n/* harmony default export */ var shared_audio_context = (function () {\n return AUDIO_CONTEXT;\n});\n// EXTERNAL MODULE: ./node_modules/wav-encoder/index.js\nvar wav_encoder = __webpack_require__(149);\nvar wav_encoder_default = /*#__PURE__*/__webpack_require__.n(wav_encoder);\n\n// CONCATENATED MODULE: ./src/lib/tw-convert-audio-wav.js\n\n\nconst convertAudioToWav = fileData => {\n /** @type {AudioContext} */\n const audioContext = new shared_audio_context();\n return audioContext.decodeAudioData(fileData).then(decodedData => {\n const channels = [];\n for (let i = 0; i < decodedData.numberOfChannels; i++) {\n channels.push(decodedData.getChannelData(i));\n }\n return wav_encoder_default.a.encode({\n sampleRate: decodedData.sampleRate,\n channelData: channels\n });\n });\n};\n/* harmony default export */ var tw_convert_audio_wav = (convertAudioToWav);\n// CONCATENATED MODULE: ./src/lib/file-uploader.js\n\n\n\n\n\n\n\n/**\n * Extract the file name given a string of the form fileName + ext\n * @param {string} nameExt File name + extension (e.g. 'my_image.png')\n * @return {string} The name without the extension, or the full name if\n * there was no '.' in the string (e.g. 'my_image')\n */\nconst extractFileName = function extractFileName(nameExt) {\n // There could be multiple dots, but get the stuff before the first .\n const nameParts = nameExt.split('.', 1); // we only care about the first .\n return nameParts[0];\n};\n\n/**\n * Handle a file upload given the input element that contains the file,\n * and a function to handle loading the file.\n * @param {Input} fileInput The element that contains the file being loaded\n * @param {Function} onload The function that handles loading the file\n * @param {Function} onerror The function that handles any error loading the file\n */\nconst handleFileUpload = function handleFileUpload(fileInput, onload, onerror) {\n const readFile = (i, files) => {\n if (i === files.length) {\n // Reset the file input value now that we have everything we need\n // so that the user can upload the same sound multiple times if\n // they choose\n fileInput.value = null;\n return;\n }\n const file = files[i];\n const reader = new FileReader();\n reader.onload = () => {\n const fileType = file.type;\n const fileName = extractFileName(file.name);\n onload(reader.result, fileType, fileName, i, files.length);\n readFile(i + 1, files);\n };\n reader.onerror = onerror;\n reader.readAsArrayBuffer(file);\n };\n readFile(0, fileInput.files);\n};\n\n/**\n * @typedef VMAsset\n * @property {string} name The user-readable name of this asset - This will\n * automatically get translated to a fresh name if this one already exists in the\n * scope of this vm asset (e.g. if a sound already exists with the same name for\n * the same target)\n * @property {string} dataFormat The data format of this asset, typically\n * the extension to be used for that particular asset, e.g. 'svg' for vector images\n * @property {string} md5 The md5 hash of the asset data, followed by '.'' and dataFormat\n * @property {string} The md5 hash of the asset data // TODO remove duplication....\n */\n\n/**\n * Create an asset (costume, sound) with storage and return an object representation\n * of the asset to track in the VM.\n * @param {ScratchStorage} storage The storage to cache the asset in\n * @param {AssetType} assetType A ScratchStorage AssetType indicating what kind of\n * asset this is.\n * @param {string} dataFormat The format of this data (typically the file extension)\n * @param {UInt8Array} data The asset data buffer\n * @return {VMAsset} An object representing this asset and relevant information\n * which can be used to look up the data in storage\n */\nconst createVMAsset = function createVMAsset(storage, assetType, dataFormat, data) {\n const asset = storage.createAsset(assetType, dataFormat, data, null, true // generate md5\n );\n return {\n name: null,\n // Needs to be set by caller\n dataFormat: dataFormat,\n asset: asset,\n md5: \"\".concat(asset.assetId, \".\").concat(dataFormat),\n assetId: asset.assetId\n };\n};\n\n/**\n * Handles loading a costume or a backdrop using the provided, context-relevant information.\n * @param {ArrayBuffer | string} fileData The costume data to load (this can be a base64 string\n * iff the image is a bitmap)\n * @param {string} fileType The MIME type of this file\n * @param {VM} vm The ScratchStorage instance to cache the costume data\n * @param {Function} handleCostume The function to execute on the costume object returned after\n * caching this costume in storage - This function should be responsible for\n * adding the costume to the VM and handling other UI flow that should come after adding the costume\n * @param {Function} handleError The function to execute if there is an error parsing the costume\n */\nconst _costumeUpload = function costumeUpload(fileData, fileType, vm, handleCostume) {\n let handleError = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : () => {};\n const storage = vm.runtime.storage;\n let costumeFormat = null;\n let assetType = null;\n switch (fileType) {\n case 'image/svg+xml':\n {\n // fix any vanilla compatibility issues in the SVG first\n try {\n fileData = Object(scratch_svg_renderer_src[\"fixForVanilla\"])(fileData);\n } catch (e) {\n log[\"default\"].error('fixForVanilla error', e);\n }\n\n // run svg bytes through scratch-svg-renderer's sanitization code\n fileData = scratch_svg_renderer_src[\"sanitizeSvg\"].sanitizeByteStream(fileData);\n costumeFormat = storage.DataFormat.SVG;\n assetType = storage.AssetType.ImageVector;\n break;\n }\n case 'image/jpeg':\n {\n costumeFormat = storage.DataFormat.JPG;\n assetType = storage.AssetType.ImageBitmap;\n break;\n }\n case 'image/bmp':\n {\n // Convert .bmp files to .png to compress them. .bmps are completely uncompressed,\n // and would otherwise take up a lot of storage space and take much longer to upload and download.\n bmp_converter(fileData).then(dataUrl => {\n _costumeUpload(dataUrl, 'image/png', vm, handleCostume);\n });\n return; // Return early because we're triggering another proper costumeUpload\n }\n case 'image/png':\n {\n costumeFormat = storage.DataFormat.PNG;\n assetType = storage.AssetType.ImageBitmap;\n break;\n }\n case 'image/webp':\n {\n // Scratch does not natively support webp, so convert to png\n // see image/bmp logic above\n bmp_converter(fileData, 'image/webp').then(dataUrl => {\n _costumeUpload(dataUrl, 'image/png', vm, handleCostume);\n });\n return;\n }\n case 'image/gif':\n {\n let costumes = [];\n gif_decoder(fileData, (frameNumber, dataUrl, numFrames) => {\n _costumeUpload(dataUrl, 'image/png', vm, costumes_ => {\n costumes = costumes.concat(costumes_);\n if (frameNumber === numFrames - 1) {\n handleCostume(costumes);\n }\n }, handleError);\n });\n return; // Abandon this load, do not try to load gif itself\n }\n default:\n handleError(\"Encountered unexpected file type: \".concat(fileType));\n return;\n }\n const bitmapAdapter = new scratch_svg_renderer_src[\"BitmapAdapter\"]();\n if (bitmapAdapter.setStageSize) {\n const width = vm.runtime.stageWidth;\n const height = vm.runtime.stageHeight;\n bitmapAdapter.setStageSize(width, height);\n }\n const addCostumeFromBuffer = function addCostumeFromBuffer(dataBuffer) {\n const vmCostume = createVMAsset(storage, assetType, costumeFormat, dataBuffer);\n handleCostume([vmCostume]);\n };\n if (costumeFormat === storage.DataFormat.SVG) {\n // Must pass in file data as a Uint8Array,\n // passing in an array buffer causes the sprite/costume\n // thumbnails to not display because the data URI for the costume\n // is invalid\n addCostumeFromBuffer(new Uint8Array(fileData));\n } else {\n // otherwise it's a bitmap\n bitmapAdapter.importBitmap(fileData, fileType).then(addCostumeFromBuffer).catch(handleError);\n }\n};\n\n/**\n * Handles loading a sound using the provided, context-relevant information.\n * @param {ArrayBuffer} fileData The sound data to load\n * @param {string} fileType The MIME type of this file; This function will exit\n * early if the fileType is unexpected.\n * @param {ScratchStorage} storage The ScratchStorage instance to cache the sound data\n * @param {Function} handleSound The function to execute on the sound object of type VMAsset\n * This function should be responsible for adding the sound to the VM\n * as well as handling other UI flow that should come after adding the sound\n * @param {Function} handleError The function to execute if there is an error parsing the sound\n */\nconst _soundUpload = function soundUpload(fileData, fileType, storage, handleSound, handleError) {\n let soundFormat;\n switch (fileType) {\n case 'audio/mp3':\n case 'audio/mpeg':\n {\n soundFormat = storage.DataFormat.MP3;\n break;\n }\n case 'audio/wav':\n case 'audio/wave':\n case 'audio/x-wav':\n case 'audio/x-pn-wav':\n {\n soundFormat = storage.DataFormat.WAV;\n break;\n }\n default:\n tw_convert_audio_wav(fileData).then(fixed => {\n _soundUpload(fixed, 'audio/wav', storage, handleSound, handleError);\n }).catch(handleError);\n return;\n }\n const vmSound = createVMAsset(storage, storage.AssetType.Sound, soundFormat, new Uint8Array(fileData));\n handleSound(vmSound);\n};\nconst file_uploader_spriteUpload = function spriteUpload(fileData, fileType, spriteName, vm, handleSprite) {\n let handleError = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : () => {};\n switch (fileType) {\n case '':\n // scratch-vm specifies application/x.scratch.sprite3 for sprite3 files. Real packages in the\n // wild use hyphens instead of periods. We'll just support all of the reasonable variations.\n case 'application/x-scratch2-sprite':\n case 'application/x-scratch3-sprite':\n case 'application/x.scratch2.sprite':\n case 'application/x.scratch3.sprite':\n case 'application/zip':\n {\n // We think this is a .sprite2 or .sprite3 file\n handleSprite(new Uint8Array(fileData));\n return;\n }\n case 'image/svg+xml':\n case 'image/png':\n case 'image/bmp':\n case 'image/jpeg':\n case 'image/webp':\n case 'image/gif':\n {\n // Make a sprite from an image by making it a costume first\n _costumeUpload(fileData, fileType, vm, vmCostumes => {\n vmCostumes.forEach((costume, i) => {\n costume.name = \"\".concat(spriteName).concat(i ? i + 1 : '');\n });\n const newSprite = {\n name: spriteName,\n isStage: false,\n x: 0,\n // x/y will be randomized below\n y: 0,\n visible: true,\n size: 100,\n rotationStyle: 'all around',\n direction: 90,\n draggable: false,\n currentCostume: 0,\n blocks: {},\n variables: {},\n costumes: vmCostumes,\n sounds: [] // TODO are all of these necessary?\n };\n randomize_sprite_position(newSprite);\n // TODO probably just want sprite upload to handle this object directly\n handleSprite(JSON.stringify(newSprite));\n }, handleError);\n return;\n }\n default:\n {\n handleError(\"Encountered unexpected file type: \".concat(fileType));\n return;\n }\n }\n};\n\n// CONCATENATED MODULE: ./src/lib/empty-assets.js\n/**\n * @fileoverview\n * Utility functions to return json corresponding to default empty assets.\n */\n\n/**\n * Generate a blank costume object for vm.addCostume with the provided name.\n * @param {string} name the name to use for the costume, caller should localize\n * @return {object} vm costume object\n */\nconst emptyCostume = name => ({\n name: name,\n md5: 'cd21514d0531fdffb22204e0ec5ed84a.svg',\n rotationCenterX: 0,\n rotationCenterY: 0,\n bitmapResolution: 1,\n skinId: null\n});\n\n/**\n * Generate a new empty sprite. The caller should provide localized versions of the\n * default names.\n * @param {string} name the name to use for the sprite\n * @param {string} soundName the name to use for the default sound\n * @param {string} costumeName the name to use for the default costume\n * @return {object} object expected by vm.addSprite\n */\nconst emptySprite = (name, soundName, costumeName) => ({\n objName: name,\n sounds: [],\n costumes: [{\n costumeName: costumeName,\n baseLayerID: -1,\n baseLayerMD5: 'cd21514d0531fdffb22204e0ec5ed84a.svg',\n bitmapResolution: 1,\n rotationCenterX: 0,\n rotationCenterY: 0\n }],\n currentCostumeIndex: 0,\n scratchX: 36,\n scratchY: 28,\n scale: 1,\n direction: 90,\n rotationStyle: 'normal',\n isDraggable: false,\n visible: true,\n spriteInfo: {}\n});\n\n// EXTERNAL MODULE: ./src/lib/shared-messages.js\nvar shared_messages = __webpack_require__(49);\n\n// EXTERNAL MODULE: ./src/lib/download-blob.js\nvar download_blob = __webpack_require__(60);\n\n// EXTERNAL MODULE: ./src/reducers/restore-deletion.js\nvar restore_deletion = __webpack_require__(79);\n\n// EXTERNAL MODULE: ./src/components/asset-panel/icon--add-backdrop-lib.svg\nvar icon_add_backdrop_lib = __webpack_require__(316);\nvar icon_add_backdrop_lib_default = /*#__PURE__*/__webpack_require__.n(icon_add_backdrop_lib);\n\n// EXTERNAL MODULE: ./src/components/asset-panel/icon--add-costume-lib.svg\nvar icon_add_costume_lib = __webpack_require__(317);\nvar icon_add_costume_lib_default = /*#__PURE__*/__webpack_require__.n(icon_add_costume_lib);\n\n// EXTERNAL MODULE: ./src/components/action-menu/icon--file-upload.svg\nvar icon_file_upload = __webpack_require__(103);\nvar icon_file_upload_default = /*#__PURE__*/__webpack_require__.n(icon_file_upload);\n\n// EXTERNAL MODULE: ./src/components/action-menu/icon--paint.svg\nvar icon_paint = __webpack_require__(133);\nvar icon_paint_default = /*#__PURE__*/__webpack_require__.n(icon_paint);\n\n// EXTERNAL MODULE: ./src/components/action-menu/icon--surprise.svg\nvar icon_surprise = __webpack_require__(104);\nvar icon_surprise_default = /*#__PURE__*/__webpack_require__.n(icon_surprise);\n\n// EXTERNAL MODULE: ./src/components/action-menu/icon--search.svg\nvar icon_search = __webpack_require__(105);\nvar icon_search_default = /*#__PURE__*/__webpack_require__.n(icon_search);\n\n// CONCATENATED MODULE: ./src/lib/libraries/tw-async-libraries.js\nconst asyncLibrary = callback => {\n let data = null;\n return () => {\n if (data) return data;\n return callback().then(mod => data = mod.default);\n };\n};\nconst getBackdropLibrary = asyncLibrary(() => __webpack_require__.e(/* import() | library-backdrops */ 89).then(__webpack_require__.t.bind(null, 1593, 3)));\nconst getCostumeLibrary = asyncLibrary(() => __webpack_require__.e(/* import() | library-costumes */ 90).then(__webpack_require__.t.bind(null, 1594, 3)));\nconst getSoundLibrary = asyncLibrary(() => __webpack_require__.e(/* import() | library-sounds */ 91).then(__webpack_require__.t.bind(null, 1595, 3)));\nconst getSpriteLibrary = asyncLibrary(() => __webpack_require__.e(/* import() | library-sprites */ 92).then(__webpack_require__.t.bind(null, 1596, 3)));\n// CONCATENATED MODULE: ./src/containers/costume-tab.jsx\nfunction costume_tab_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction costume_tab_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? costume_tab_ownKeys(Object(t), !0).forEach(function (r) { costume_tab_defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : costume_tab_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction costume_tab_defineProperty(e, r, t) { return (r = costume_tab_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction costume_tab_toPropertyKey(t) { var i = costume_tab_toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction costume_tab_toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nlet costume_tab_messages = Object(index_es[\"g\" /* defineMessages */])({\n addLibraryBackdropMsg: {\n \"id\": \"gui.costumeTab.addBackdropFromLibrary\",\n \"defaultMessage\": \"Choose a Backdrop\"\n },\n addLibraryCostumeMsg: {\n \"id\": \"gui.costumeTab.addCostumeFromLibrary\",\n \"defaultMessage\": \"Choose a Costume\"\n },\n addBlankCostumeMsg: {\n \"id\": \"gui.costumeTab.addBlankCostume\",\n \"defaultMessage\": \"Paint\"\n },\n addSurpriseCostumeMsg: {\n \"id\": \"gui.costumeTab.addSurpriseCostume\",\n \"defaultMessage\": \"Surprise\"\n },\n addFileBackdropMsg: {\n \"id\": \"gui.costumeTab.addFileBackdrop\",\n \"defaultMessage\": \"Upload Backdrop\"\n },\n addFileCostumeMsg: {\n \"id\": \"gui.costumeTab.addFileCostume\",\n \"defaultMessage\": \"Upload Costume\"\n }\n});\ncostume_tab_messages = costume_tab_objectSpread(costume_tab_objectSpread({}, costume_tab_messages), shared_messages[\"a\" /* default */]);\nclass costume_tab_CostumeTab extends react_default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['handleSelectCostume', 'handleDeleteCostume', 'handleDuplicateCostume', 'handleExportCostume', 'handleNewCostume', 'handleNewBlankCostume', 'handleSurpriseCostume', 'handleSurpriseBackdrop', 'handleFileUploadClick', 'handleCostumeUpload', 'handleDrop', 'setFileInput']);\n const {\n editingTarget,\n sprites,\n stage\n } = props;\n const target = editingTarget && sprites[editingTarget] ? sprites[editingTarget] : stage;\n if (target && target.currentCostume) {\n this.state = {\n selectedCostumeIndex: target.currentCostume\n };\n } else {\n this.state = {\n selectedCostumeIndex: 0\n };\n }\n }\n componentWillReceiveProps(nextProps) {\n const {\n editingTarget,\n sprites,\n stage\n } = nextProps;\n const target = editingTarget && sprites[editingTarget] ? sprites[editingTarget] : stage;\n if (!target || !target.costumes) {\n return;\n }\n if (this.props.editingTarget === editingTarget) {\n // If costumes have been added or removed, change costumes to the editing target's\n // current costume.\n const oldTarget = this.props.sprites[editingTarget] ? this.props.sprites[editingTarget] : this.props.stage;\n // @todo: Find and switch to the index of the costume that is new. This is blocked by\n // https://github.com/LLK/scratch-vm/issues/967\n // Right now, you can land on the wrong costume if a costume changing script is running.\n if (oldTarget.costumeCount !== target.costumeCount) {\n this.setState({\n selectedCostumeIndex: target.currentCostume\n });\n }\n } else {\n // If switching editing targets, update the costume index\n this.setState({\n selectedCostumeIndex: target.currentCostume\n });\n }\n }\n handleSelectCostume(costumeIndex) {\n this.props.vm.editingTarget.setCostume(costumeIndex);\n this.setState({\n selectedCostumeIndex: costumeIndex\n });\n }\n handleDeleteCostume(costumeIndex) {\n const restoreCostumeFun = this.props.vm.deleteCostume(costumeIndex);\n this.props.dispatchUpdateRestore({\n restoreFun: restoreCostumeFun,\n deletedItem: 'Costume'\n });\n }\n handleDuplicateCostume(costumeIndex) {\n this.props.vm.duplicateCostume(costumeIndex);\n }\n handleExportCostume(costumeIndex) {\n const item = this.props.vm.editingTarget.sprite.costumes[costumeIndex];\n const blob = new Blob([this.props.vm.getExportedCostume(item)], {\n type: item.asset.assetType.contentType\n });\n Object(download_blob[\"a\" /* default */])(\"\".concat(item.name, \".\").concat(item.asset.dataFormat), blob);\n }\n handleNewCostume(costume, fromCostumeLibrary, targetId) {\n const costumes = Array.isArray(costume) ? costume : [costume];\n return Promise.all(costumes.map(c => {\n if (fromCostumeLibrary) {\n return this.props.vm.addCostumeFromLibrary(c.md5, c);\n }\n // If targetId is falsy, VM should default it to editingTarget.id\n // However, targetId should be provided to prevent #5876,\n // if making new costume takes a while\n return this.props.vm.addCostume(c.md5, c, targetId);\n }));\n }\n handleNewBlankCostume() {\n const name = this.props.vm.editingTarget.isStage ? this.props.intl.formatMessage(costume_tab_messages.backdrop, {\n index: 1\n }) : this.props.intl.formatMessage(costume_tab_messages.costume, {\n index: 1\n });\n this.handleNewCostume(emptyCostume(name));\n }\n async handleSurpriseCostume() {\n const costumeLibraryContent = await getCostumeLibrary();\n const item = costumeLibraryContent[Math.floor(Math.random() * costumeLibraryContent.length)];\n const vmCostume = {\n name: item.name,\n md5: item.md5ext,\n rotationCenterX: item.rotationCenterX,\n rotationCenterY: item.rotationCenterY,\n bitmapResolution: item.bitmapResolution,\n skinId: null\n };\n this.handleNewCostume(vmCostume, true /* fromCostumeLibrary */);\n }\n async handleSurpriseBackdrop() {\n const backdropLibraryContent = await getBackdropLibrary();\n const item = backdropLibraryContent[Math.floor(Math.random() * backdropLibraryContent.length)];\n const vmCostume = {\n name: item.name,\n md5: item.md5ext,\n rotationCenterX: item.rotationCenterX,\n rotationCenterY: item.rotationCenterY,\n bitmapResolution: item.bitmapResolution,\n skinId: null\n };\n this.handleNewCostume(vmCostume);\n }\n handleCostumeUpload(e) {\n const vm = this.props.vm;\n const targetId = this.props.vm.editingTarget.id;\n this.props.onShowImporting();\n handleFileUpload(e.target, (buffer, fileType, fileName, fileIndex, fileCount) => {\n _costumeUpload(buffer, fileType, vm, vmCostumes => {\n vmCostumes.forEach((costume, i) => {\n costume.name = \"\".concat(fileName).concat(i ? i + 1 : '');\n });\n this.handleNewCostume(vmCostumes, false, targetId).then(() => {\n if (fileIndex === fileCount - 1) {\n this.props.onCloseImporting();\n }\n });\n }, this.props.onCloseImporting);\n }, this.props.onCloseImporting);\n }\n handleFileUploadClick() {\n this.fileInput.click();\n }\n handleDrop(dropInfo) {\n if (dropInfo.dragType === drag_constants.COSTUME) {\n const sprite = this.props.vm.editingTarget.sprite;\n const activeCostume = sprite.costumes[this.state.selectedCostumeIndex];\n this.props.vm.reorderCostume(this.props.vm.editingTarget.id, dropInfo.index, dropInfo.newIndex);\n this.setState({\n selectedCostumeIndex: sprite.costumes.indexOf(activeCostume)\n });\n } else if (dropInfo.dragType === drag_constants.BACKPACK_COSTUME) {\n this.props.vm.addCostume(dropInfo.payload.body, {\n name: dropInfo.payload.name\n });\n } else if (dropInfo.dragType === drag_constants.BACKPACK_SOUND) {\n this.props.onActivateSoundsTab();\n this.props.vm.addSound({\n md5: dropInfo.payload.body,\n name: dropInfo.payload.name\n });\n }\n }\n setFileInput(input) {\n this.fileInput = input;\n }\n formatCostumeDetails(size, optResolution) {\n // If no resolution is given, assume that the costume is an SVG\n const resolution = optResolution ? optResolution : 1;\n // Convert size to stage units by dividing by resolution\n // Round up width and height for scratch-flash compatibility\n // https://github.com/LLK/scratch-flash/blob/9fbac92ef3d09ceca0c0782f8a08deaa79e4df69/src/ui/media/MediaInfo.as#L224-L237\n return \"\".concat(Math.ceil(size[0] / resolution), \" x \").concat(Math.ceil(size[1] / resolution));\n }\n render() {\n const {\n dispatchUpdateRestore,\n // eslint-disable-line no-unused-vars\n intl,\n isRtl,\n onNewLibraryBackdropClick,\n onNewLibraryCostumeClick,\n vm\n } = this.props;\n if (!vm.editingTarget) {\n return null;\n }\n const isStage = vm.editingTarget.isStage;\n const target = vm.editingTarget.sprite;\n const addLibraryMessage = isStage ? costume_tab_messages.addLibraryBackdropMsg : costume_tab_messages.addLibraryCostumeMsg;\n const addFileMessage = isStage ? costume_tab_messages.addFileBackdropMsg : costume_tab_messages.addFileCostumeMsg;\n const addSurpriseFunc = isStage ? this.handleSurpriseBackdrop : this.handleSurpriseCostume;\n const addLibraryFunc = isStage ? onNewLibraryBackdropClick : onNewLibraryCostumeClick;\n const addLibraryIcon = isStage ? icon_add_backdrop_lib_default.a : icon_add_costume_lib_default.a;\n const costumeData = target.costumes ? target.costumes.map(costume => ({\n name: costume.name,\n asset: costume.asset,\n details: costume.size ? this.formatCostumeDetails(costume.size, costume.bitmapResolution) : null,\n dragPayload: costume\n })) : [];\n return /*#__PURE__*/react_default.a.createElement(asset_panel_asset_panel, {\n buttons: [{\n title: intl.formatMessage(addLibraryMessage),\n img: addLibraryIcon,\n onClick: addLibraryFunc\n }, {\n title: intl.formatMessage(addFileMessage),\n img: icon_file_upload_default.a,\n onClick: this.handleFileUploadClick,\n fileAccept: '.svg, .png, .bmp, .jpg, .jpeg, .jfif, .webp, .gif',\n fileChange: this.handleCostumeUpload,\n fileInput: this.setFileInput,\n fileMultiple: true\n }, {\n title: intl.formatMessage(costume_tab_messages.addSurpriseCostumeMsg),\n img: icon_surprise_default.a,\n onClick: addSurpriseFunc\n }, {\n title: intl.formatMessage(costume_tab_messages.addBlankCostumeMsg),\n img: icon_paint_default.a,\n onClick: this.handleNewBlankCostume\n }, {\n title: intl.formatMessage(addLibraryMessage),\n img: icon_search_default.a,\n onClick: addLibraryFunc\n }],\n dragType: drag_constants.COSTUME,\n isRtl: isRtl,\n items: costumeData,\n selectedItemIndex: this.state.selectedCostumeIndex,\n onDeleteClick: target && target.costumes && target.costumes.length > 1 ? this.handleDeleteCostume : null,\n onDrop: this.handleDrop,\n onDuplicateClick: this.handleDuplicateCostume,\n onExportClick: this.handleExportCostume,\n onItemClick: this.handleSelectCostume\n }, target.costumes ? /*#__PURE__*/react_default.a.createElement(paint_editor_wrapper, {\n selectedCostumeIndex: this.state.selectedCostumeIndex\n }) : null);\n }\n}\ncostume_tab_CostumeTab.propTypes = {\n dispatchUpdateRestore: prop_types_default.a.func,\n editingTarget: prop_types_default.a.string,\n intl: index_es[\"i\" /* intlShape */],\n isRtl: prop_types_default.a.bool,\n onActivateSoundsTab: prop_types_default.a.func.isRequired,\n onCloseImporting: prop_types_default.a.func.isRequired,\n onNewLibraryBackdropClick: prop_types_default.a.func.isRequired,\n onNewLibraryCostumeClick: prop_types_default.a.func.isRequired,\n onShowImporting: prop_types_default.a.func.isRequired,\n sprites: prop_types_default.a.shape({\n id: prop_types_default.a.shape({\n costumes: prop_types_default.a.arrayOf(prop_types_default.a.shape({\n url: prop_types_default.a.string,\n name: prop_types_default.a.string.isRequired,\n skinId: prop_types_default.a.number\n }))\n })\n }),\n stage: prop_types_default.a.shape({\n sounds: prop_types_default.a.arrayOf(prop_types_default.a.shape({\n name: prop_types_default.a.string.isRequired\n }))\n }),\n vm: prop_types_default.a.instanceOf(src_default.a)\n};\nconst costume_tab_mapStateToProps = state => ({\n editingTarget: state.scratchGui.targets.editingTarget,\n isRtl: state.locales.isRtl,\n sprites: state.scratchGui.targets.sprites,\n stage: state.scratchGui.targets.stage,\n dragging: state.scratchGui.assetDrag.dragging\n});\nconst costume_tab_mapDispatchToProps = dispatch => ({\n onActivateSoundsTab: () => dispatch(Object(editor_tab[\"d\" /* activateTab */])(editor_tab[\"c\" /* SOUNDS_TAB_INDEX */])),\n onNewLibraryBackdropClick: e => {\n e.preventDefault();\n dispatch(Object(modals[\"t\" /* openBackdropLibrary */])());\n },\n onNewLibraryCostumeClick: e => {\n e.preventDefault();\n dispatch(Object(modals[\"v\" /* openCostumeLibrary */])());\n },\n dispatchUpdateRestore: restoreState => {\n dispatch(Object(restore_deletion[\"c\" /* setRestore */])(restoreState));\n },\n onCloseImporting: () => dispatch(Object(alerts[\"c\" /* closeAlertWithId */])('importingAsset')),\n onShowImporting: () => dispatch(Object(alerts[\"i\" /* showStandardAlert */])('importingAsset'))\n});\n/* harmony default export */ var costume_tab = (Object(error_boundary_hoc[\"a\" /* default */])('Costume Tab')(Object(index_es[\"h\" /* injectIntl */])(Object(react_redux_es[\"b\" /* connect */])(costume_tab_mapStateToProps, costume_tab_mapDispatchToProps)(costume_tab_CostumeTab))));\n// CONCATENATED MODULE: ./src/lib/libraries/tag-messages.js\n\n/* harmony default export */ var tag_messages = (Object(index_es[\"g\" /* defineMessages */])({\n all: {\n \"id\": \"gui.libraryTags.all\",\n \"defaultMessage\": \"All\"\n },\n animals: {\n \"id\": \"gui.libraryTags.animals\",\n \"defaultMessage\": \"Animals\"\n },\n dance: {\n \"id\": \"gui.libraryTags.dance\",\n \"defaultMessage\": \"Dance\"\n },\n effects: {\n \"id\": \"gui.libraryTags.effects\",\n \"defaultMessage\": \"Effects\"\n },\n fantasy: {\n \"id\": \"gui.libraryTags.fantasy\",\n \"defaultMessage\": \"Fantasy\"\n },\n fashion: {\n \"id\": \"gui.libraryTags.fashion\",\n \"defaultMessage\": \"Fashion\"\n },\n food: {\n \"id\": \"gui.libraryTags.food\",\n \"defaultMessage\": \"Food\"\n },\n indoors: {\n \"id\": \"gui.libraryTags.indoors\",\n \"defaultMessage\": \"Indoors\"\n },\n loops: {\n \"id\": \"gui.libraryTags.loops\",\n \"defaultMessage\": \"Loops\"\n },\n music: {\n \"id\": \"gui.libraryTags.music\",\n \"defaultMessage\": \"Music\"\n },\n notes: {\n \"id\": \"gui.libraryTags.notes\",\n \"defaultMessage\": \"Notes\"\n },\n outdoors: {\n \"id\": \"gui.libraryTags.outdoors\",\n \"defaultMessage\": \"Outdoors\"\n },\n patterns: {\n \"id\": \"gui.libraryTags.patterns\",\n \"defaultMessage\": \"Patterns\"\n },\n people: {\n \"id\": \"gui.libraryTags.people\",\n \"defaultMessage\": \"People\"\n },\n percussion: {\n \"id\": \"gui.libraryTags.percussion\",\n \"defaultMessage\": \"Percussion\"\n },\n space: {\n \"id\": \"gui.libraryTags.space\",\n \"defaultMessage\": \"Space\"\n },\n sports: {\n \"id\": \"gui.libraryTags.sports\",\n \"defaultMessage\": \"Sports\"\n },\n underwater: {\n \"id\": \"gui.libraryTags.underwater\",\n \"defaultMessage\": \"Underwater\"\n },\n voice: {\n \"id\": \"gui.libraryTags.voice\",\n \"defaultMessage\": \"Voice\"\n },\n wacky: {\n \"id\": \"gui.libraryTags.wacky\",\n \"defaultMessage\": \"Wacky\"\n },\n animation: {\n \"id\": \"gui.libraryTags.animation\",\n \"defaultMessage\": \"Animation\"\n },\n art: {\n \"id\": \"gui.libraryTags.art\",\n \"defaultMessage\": \"Art\"\n },\n games: {\n \"id\": \"gui.libraryTags.games\",\n \"defaultMessage\": \"Games\"\n },\n stories: {\n \"id\": \"gui.libraryTags.stories\",\n \"defaultMessage\": \"Stories\"\n },\n letters: {\n \"id\": \"gui.libraryTags.letters\",\n \"defaultMessage\": \"Letters\"\n }\n}));\n// CONCATENATED MODULE: ./src/lib/libraries/sprite-tags.js\n\n/* harmony default export */ var sprite_tags = ([{\n tag: 'animals',\n intlLabel: tag_messages.animals\n}, {\n tag: 'people',\n intlLabel: tag_messages.people\n}, {\n tag: 'fantasy',\n intlLabel: tag_messages.fantasy\n}, {\n tag: 'dance',\n intlLabel: tag_messages.dance\n}, {\n tag: 'music',\n intlLabel: tag_messages.music\n}, {\n tag: 'sports',\n intlLabel: tag_messages.sports\n}, {\n tag: 'food',\n intlLabel: tag_messages.food\n}, {\n tag: 'fashion',\n intlLabel: tag_messages.fashion\n}, {\n tag: 'letters',\n intlLabel: tag_messages.letters\n}]);\n// CONCATENATED MODULE: ./src/containers/sprite-library.jsx\n\n\n\n\n\n\n\n\n\nconst sprite_library_messages = Object(index_es[\"g\" /* defineMessages */])({\n libraryTitle: {\n \"id\": \"gui.spriteLibrary.chooseASprite\",\n \"defaultMessage\": \"Choose a Sprite\"\n }\n});\nclass sprite_library_SpriteLibrary extends react_default.a.PureComponent {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['handleItemSelect']);\n this.state = {\n data: getSpriteLibrary()\n };\n }\n componentDidMount() {\n if (this.state.data.then) {\n this.state.data.then(data => this.setState({\n data\n }));\n }\n }\n handleItemSelect(item) {\n // Randomize position of library sprite\n randomize_sprite_position(item);\n this.props.vm.addSprite(JSON.stringify(item)).then(() => {\n this.props.onActivateBlocksTab();\n });\n }\n render() {\n return /*#__PURE__*/react_default.a.createElement(components_library_library, {\n data: this.state.data.then ? null : this.state.data,\n id: \"spriteLibrary\",\n tags: sprite_tags,\n title: this.props.intl.formatMessage(sprite_library_messages.libraryTitle),\n removedTrademarks: true,\n onItemSelected: this.handleItemSelect,\n onRequestClose: this.props.onRequestClose\n });\n }\n}\nsprite_library_SpriteLibrary.propTypes = {\n intl: index_es[\"i\" /* intlShape */].isRequired,\n onActivateBlocksTab: prop_types_default.a.func.isRequired,\n onRequestClose: prop_types_default.a.func,\n vm: prop_types_default.a.instanceOf(src_default.a).isRequired\n};\n/* harmony default export */ var sprite_library = (Object(index_es[\"h\" /* injectIntl */])(sprite_library_SpriteLibrary));\n// EXTERNAL MODULE: ./src/components/forms/label.css\nvar forms_label = __webpack_require__(164);\nvar label_default = /*#__PURE__*/__webpack_require__.n(forms_label);\n\n// CONCATENATED MODULE: ./src/components/forms/label.jsx\n\n\n\nconst Label = props => /*#__PURE__*/react_default.a.createElement(\"label\", {\n className: props.above ? label_default.a.inputGroupColumn : label_default.a.inputGroup\n}, /*#__PURE__*/react_default.a.createElement(\"span\", {\n className: props.secondary ? label_default.a.inputLabelSecondary : label_default.a.inputLabel\n}, props.text), props.children);\nLabel.propTypes = {\n above: prop_types_default.a.bool,\n children: prop_types_default.a.node,\n secondary: prop_types_default.a.bool,\n text: prop_types_default.a.oneOfType([prop_types_default.a.string, prop_types_default.a.node]).isRequired\n};\nLabel.defaultProps = {\n above: false,\n secondary: false\n};\n/* harmony default export */ var components_forms_label = (Label);\n// EXTERNAL MODULE: ./src/components/forms/input.jsx\nvar forms_input = __webpack_require__(69);\n\n// EXTERNAL MODULE: ./src/components/forms/buffered-input-hoc.jsx\nvar buffered_input_hoc = __webpack_require__(91);\n\n// EXTERNAL MODULE: ./node_modules/react-popover/index.js\nvar react_popover = __webpack_require__(259);\nvar react_popover_default = /*#__PURE__*/__webpack_require__.n(react_popover);\n\n// EXTERNAL MODULE: ./src/components/toggle-buttons/toggle-buttons.css\nvar toggle_buttons = __webpack_require__(200);\nvar toggle_buttons_default = /*#__PURE__*/__webpack_require__.n(toggle_buttons);\n\n// CONCATENATED MODULE: ./src/components/toggle-buttons/toggle-buttons.jsx\n\n\n\n\n\nconst ToggleButtons = _ref => {\n let {\n buttons,\n className,\n disabled\n } = _ref;\n return /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: classnames_default()(className, toggle_buttons_default.a.row, {\n [toggle_buttons_default.a.disabled]: disabled\n })\n }, buttons.map((button, index) => /*#__PURE__*/react_default.a.createElement(\"button\", {\n key: \"toggle-\".concat(index),\n className: toggle_buttons_default.a.button,\n title: button.title,\n \"aria-label\": button.title,\n \"aria-pressed\": button.isSelected,\n onClick: button.handleClick,\n disabled: disabled\n }, /*#__PURE__*/react_default.a.createElement(render, {\n src: button.icon,\n \"aria-hidden\": \"true\",\n className: button.iconClassName,\n draggable: false\n }))));\n};\nToggleButtons.propTypes = {\n buttons: prop_types_default.a.arrayOf(prop_types_default.a.shape({\n title: prop_types_default.a.string.isRequired,\n handleClick: prop_types_default.a.func.isRequired,\n icon: prop_types_default.a.oneOfType([prop_types_default.a.string, prop_types_default.a.func]),\n iconClassName: prop_types_default.a.string,\n isSelected: prop_types_default.a.bool\n })),\n className: prop_types_default.a.string,\n disabled: prop_types_default.a.bool\n};\nToggleButtons.defaultProps = {\n disabled: false\n};\n/* harmony default export */ var toggle_buttons_toggle_buttons = (ToggleButtons);\n// EXTERNAL MODULE: ./src/components/direction-picker/dial.css\nvar dial = __webpack_require__(124);\nvar dial_default = /*#__PURE__*/__webpack_require__.n(dial);\n\n// CONCATENATED MODULE: ./src/lib/tw-recolor/build.js!./src/components/direction-picker/icon--dial.svg\n\n const icon_dial_original = \"\";\n\n const icon_dial_getSRC = () => {\n const recolored = typeof Recolor === 'object' ? (\n icon_dial_original.replace(/#855cd6/gi, Recolor.primary)\n ) : icon_dial_original;\n return 'data:image/svg+xml;,' + encodeURIComponent(recolored);\n };\n\n /* harmony default export */ var icon_dial = (icon_dial_getSRC);\n\n// CONCATENATED MODULE: ./src/lib/tw-recolor/build.js!./src/components/direction-picker/icon--handle.svg\n\n const icon_handle_original = \"01_Dial Elements\\n\";\n\n const icon_handle_getSRC = () => {\n const recolored = typeof Recolor === 'object' ? (\n icon_handle_original.replace(/#855cd6/gi, Recolor.primary)\n ) : icon_handle_original;\n return 'data:image/svg+xml;,' + encodeURIComponent(recolored);\n };\n\n /* harmony default export */ var icon_handle = (icon_handle_getSRC);\n\n// CONCATENATED MODULE: ./src/components/direction-picker/dial.jsx\n\n\n\n\n\n\n\nclass dial_Dial extends react_default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['handleMouseDown', 'handleMouseMove', 'containerRef', 'handleRef', 'unbindMouseEvents']);\n }\n componentDidMount() {\n // Manually add touch/mouse handlers so that preventDefault can be used\n // to prevent scrolling on touch.\n // Tracked as a react issue https://github.com/facebook/react/issues/6436\n this.handleElement.addEventListener('mousedown', this.handleMouseDown);\n this.handleElement.addEventListener('touchstart', this.handleMouseDown);\n }\n componentWillUnmount() {\n this.unbindMouseEvents();\n this.handleElement.removeEventListener('mousedown', this.handleMouseDown);\n this.handleElement.removeEventListener('touchstart', this.handleMouseDown);\n }\n\n /**\n * Get direction from dial center to mouse move event.\n * @param {Event} e - Mouse move event.\n * @returns {number} Direction in degrees, clockwise, 90=horizontal.\n */\n directionToMouseEvent(e) {\n const {\n x: mx,\n y: my\n } = getEventXY(e);\n const bbox = this.containerElement.getBoundingClientRect();\n const cy = bbox.top + bbox.height / 2;\n const cx = bbox.left + bbox.width / 2;\n const angle = Math.atan2(my - cy, mx - cx);\n const degrees = angle * (180 / Math.PI);\n return degrees + 90; // To correspond with scratch coordinate system\n }\n\n /**\n * Create SVG path data string for the dial \"gauge\", the overlaid arc slice.\n * @param {number} radius - The radius of the dial.\n * @param {number} direction - Direction in degrees, clockwise, 90=horizontal.\n * @returns {string} Path data string for the gauge.\n */\n gaugePath(radius, direction) {\n const rads = direction * (Math.PI / 180);\n const path = [];\n path.push(\"M \".concat(radius, \" 0\"));\n path.push(\"L \".concat(radius, \" \").concat(radius));\n path.push(\"L \".concat(radius + radius * Math.sin(rads), \" \").concat(radius - radius * Math.cos(rads)));\n path.push(\"A \".concat(radius, \" \").concat(radius, \" 0 0 \").concat(direction < 0 ? 1 : 0, \" \").concat(radius, \" 0\"));\n path.push(\"Z\");\n return path.join(' ');\n }\n handleMouseMove(e) {\n this.props.onChange(this.directionToMouseEvent(e) + this.directionOffset);\n e.preventDefault();\n }\n unbindMouseEvents() {\n window.removeEventListener('mousemove', this.handleMouseMove);\n window.removeEventListener('mouseup', this.unbindMouseEvents);\n window.removeEventListener('touchmove', this.handleMouseMove);\n window.removeEventListener('touchend', this.unbindMouseEvents);\n }\n handleMouseDown(e) {\n // Because the drag handle is not a single point, there is some initial\n // difference between the current sprite direction and the direction to the mouse\n // Store this offset to prevent jumping when the mouse is moved.\n this.directionOffset = this.props.direction - this.directionToMouseEvent(e);\n window.addEventListener('mousemove', this.handleMouseMove);\n window.addEventListener('mouseup', this.unbindMouseEvents);\n window.addEventListener('touchmove', this.handleMouseMove);\n window.addEventListener('touchend', this.unbindMouseEvents);\n e.preventDefault();\n }\n containerRef(el) {\n this.containerElement = el;\n }\n handleRef(el) {\n this.handleElement = el;\n }\n render() {\n const {\n direction,\n radius\n } = this.props;\n return /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: dial_default.a.container\n }, /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: dial_default.a.dialContainer,\n ref: this.containerRef,\n style: {\n width: \"\".concat(radius * 2, \"px\"),\n height: \"\".concat(radius * 2, \"px\")\n }\n }, /*#__PURE__*/react_default.a.createElement(\"img\", {\n className: dial_default.a.dialFace,\n draggable: false,\n src: icon_dial()\n }), /*#__PURE__*/react_default.a.createElement(\"svg\", {\n className: dial_default.a.gauge,\n height: radius * 2,\n width: radius * 2\n }, /*#__PURE__*/react_default.a.createElement(\"path\", {\n className: dial_default.a.gaugePath,\n d: this.gaugePath(radius, direction)\n })), /*#__PURE__*/react_default.a.createElement(\"img\", {\n className: dial_default.a.dialHandle,\n draggable: false,\n ref: this.handleRef,\n src: icon_handle(),\n style: {\n top: \"\".concat(radius - radius * Math.cos(direction * (Math.PI / 180)), \"px\"),\n left: \"\".concat(radius + radius * Math.sin(direction * (Math.PI / 180)), \"px\"),\n transform: \"rotate(\".concat(direction, \"deg)\")\n }\n })));\n }\n}\ndial_Dial.propTypes = {\n direction: prop_types_default.a.number,\n onChange: prop_types_default.a.func.isRequired,\n radius: prop_types_default.a.number\n};\ndial_Dial.defaultProps = {\n direction: 90,\n // degrees\n radius: 56 // px\n};\n/* harmony default export */ var direction_picker_dial = (dial_Dial);\n// EXTERNAL MODULE: ./src/components/direction-picker/direction-picker.css\nvar direction_picker = __webpack_require__(318);\nvar direction_picker_default = /*#__PURE__*/__webpack_require__.n(direction_picker);\n\n// CONCATENATED MODULE: ./src/lib/tw-recolor/build.js!./src/components/direction-picker/icon--all-around.svg\n\n const icon_all_around_original = \"\\n\\n \\n all-around-active\\n Created with Sketch.\\n \\n \\n \\n \\n\\n\";\n\n const icon_all_around_getSRC = () => {\n const recolored = typeof Recolor === 'object' ? (\n icon_all_around_original.replace(/#855cd6/gi, Recolor.primary)\n ) : icon_all_around_original;\n return 'data:image/svg+xml;,' + encodeURIComponent(recolored);\n };\n\n /* harmony default export */ var icon_all_around = (icon_all_around_getSRC);\n\n// CONCATENATED MODULE: ./src/lib/tw-recolor/build.js!./src/components/direction-picker/icon--left-right.svg\n\n const icon_left_right_original = \"\\n\\n \\n left-right-active\\n Created with Sketch.\\n \\n \\n \\n \\n \\n \\n\\n\";\n\n const icon_left_right_getSRC = () => {\n const recolored = typeof Recolor === 'object' ? (\n icon_left_right_original.replace(/#855cd6/gi, Recolor.primary)\n ) : icon_left_right_original;\n return 'data:image/svg+xml;,' + encodeURIComponent(recolored);\n };\n\n /* harmony default export */ var icon_left_right = (icon_left_right_getSRC);\n\n// CONCATENATED MODULE: ./src/lib/tw-recolor/build.js!./src/components/direction-picker/icon--dont-rotate.svg\n\n const icon_dont_rotate_original = \"\\n\\n \\n dont-rotate-active\\n Created with Sketch.\\n \\n \\n \\n \\n\\n\";\n\n const icon_dont_rotate_getSRC = () => {\n const recolored = typeof Recolor === 'object' ? (\n icon_dont_rotate_original.replace(/#855cd6/gi, Recolor.primary)\n ) : icon_dont_rotate_original;\n return 'data:image/svg+xml;,' + encodeURIComponent(recolored);\n };\n\n /* harmony default export */ var icon_dont_rotate = (icon_dont_rotate_getSRC);\n\n// CONCATENATED MODULE: ./src/components/direction-picker/direction-picker.jsx\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst BufferedInput = Object(buffered_input_hoc[\"a\" /* default */])(forms_input[\"a\" /* default */]);\nconst directionLabel = /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Direction\",\n id: \"gui.SpriteInfo.direction\"\n});\nconst RotationStyles = {\n ALL_AROUND: 'all around',\n LEFT_RIGHT: 'left-right',\n DONT_ROTATE: \"don't rotate\"\n};\nconst direction_picker_messages = Object(index_es[\"g\" /* defineMessages */])({\n allAround: {\n \"id\": \"gui.directionPicker.rotationStyles.allAround\",\n \"defaultMessage\": \"All Around\"\n },\n leftRight: {\n \"id\": \"gui.directionPicker.rotationStyles.leftRight\",\n \"defaultMessage\": \"Left/Right\"\n },\n dontRotate: {\n \"id\": \"gui.directionPicker.rotationStyles.dontRotate\",\n \"defaultMessage\": \"Do not rotate\"\n }\n});\nconst direction_picker_DirectionPicker = props => /*#__PURE__*/react_default.a.createElement(components_forms_label, {\n secondary: true,\n above: props.labelAbove,\n text: directionLabel\n}, /*#__PURE__*/react_default.a.createElement(react_popover_default.a, {\n body: /*#__PURE__*/react_default.a.createElement(\"div\", null, /*#__PURE__*/react_default.a.createElement(direction_picker_dial, {\n direction: props.direction,\n onChange: props.onChangeDirection\n }), /*#__PURE__*/react_default.a.createElement(toggle_buttons_toggle_buttons, {\n className: direction_picker_default.a.buttonRow,\n buttons: [{\n handleClick: props.onClickAllAround,\n icon: icon_all_around,\n isSelected: props.rotationStyle === RotationStyles.ALL_AROUND,\n title: props.intl.formatMessage(direction_picker_messages.allAround)\n }, {\n handleClick: props.onClickLeftRight,\n icon: icon_left_right,\n isSelected: props.rotationStyle === RotationStyles.LEFT_RIGHT,\n title: props.intl.formatMessage(direction_picker_messages.leftRight)\n }, {\n handleClick: props.onClickDontRotate,\n icon: icon_dont_rotate,\n isSelected: props.rotationStyle === RotationStyles.DONT_ROTATE,\n title: props.intl.formatMessage(direction_picker_messages.dontRotate)\n }]\n })),\n isOpen: props.popoverOpen,\n preferPlace: \"above\",\n onOuterAction: props.onClosePopover\n}, /*#__PURE__*/react_default.a.createElement(BufferedInput, {\n small: true,\n disabled: props.disabled,\n label: directionLabel,\n tabIndex: \"0\",\n type: \"number\",\n value: props.disabled ? '' : props.direction,\n onFocus: props.onOpenPopover,\n onSubmit: props.onChangeDirection\n})));\ndirection_picker_DirectionPicker.propTypes = {\n direction: prop_types_default.a.number,\n disabled: prop_types_default.a.bool.isRequired,\n intl: index_es[\"i\" /* intlShape */],\n labelAbove: prop_types_default.a.bool,\n onChangeDirection: prop_types_default.a.func.isRequired,\n onClickAllAround: prop_types_default.a.func.isRequired,\n onClickDontRotate: prop_types_default.a.func.isRequired,\n onClickLeftRight: prop_types_default.a.func.isRequired,\n onClosePopover: prop_types_default.a.func.isRequired,\n onOpenPopover: prop_types_default.a.func.isRequired,\n popoverOpen: prop_types_default.a.bool.isRequired,\n rotationStyle: prop_types_default.a.string\n};\ndirection_picker_DirectionPicker.defaultProps = {\n labelAbove: false\n};\nconst WrappedDirectionPicker = Object(index_es[\"h\" /* injectIntl */])(direction_picker_DirectionPicker);\n\n// CONCATENATED MODULE: ./src/containers/direction-picker.jsx\n\n\n\n\nclass containers_direction_picker_DirectionPicker extends react_default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['handleOpenPopover', 'handleClosePopover', 'handleClickLeftRight', 'handleClickDontRotate', 'handleClickAllAround']);\n this.state = {\n popoverOpen: false\n };\n }\n handleOpenPopover() {\n this.setState({\n popoverOpen: true\n });\n }\n handleClosePopover() {\n this.setState({\n popoverOpen: false\n });\n }\n handleClickAllAround() {\n this.props.onChangeRotationStyle(RotationStyles.ALL_AROUND);\n }\n handleClickLeftRight() {\n this.props.onChangeRotationStyle(RotationStyles.LEFT_RIGHT);\n }\n handleClickDontRotate() {\n this.props.onChangeRotationStyle(RotationStyles.DONT_ROTATE);\n }\n render() {\n return /*#__PURE__*/react_default.a.createElement(WrappedDirectionPicker, {\n direction: this.props.direction,\n disabled: this.props.disabled,\n labelAbove: this.props.labelAbove,\n popoverOpen: this.state.popoverOpen && !this.props.disabled,\n rotationStyle: this.props.rotationStyle,\n onChangeDirection: this.props.onChangeDirection,\n onClickAllAround: this.handleClickAllAround,\n onClickDontRotate: this.handleClickDontRotate,\n onClickLeftRight: this.handleClickLeftRight,\n onClosePopover: this.handleClosePopover,\n onOpenPopover: this.handleOpenPopover\n });\n }\n}\ncontainers_direction_picker_DirectionPicker.propTypes = {\n direction: prop_types_default.a.number,\n disabled: prop_types_default.a.bool,\n labelAbove: prop_types_default.a.bool,\n onChangeDirection: prop_types_default.a.func,\n onChangeRotationStyle: prop_types_default.a.func,\n rotationStyle: prop_types_default.a.string\n};\n/* harmony default export */ var containers_direction_picker = (containers_direction_picker_DirectionPicker);\n// CONCATENATED MODULE: ./src/lib/locale-utils.js\n/**\n * @fileoverview\n * Utility functions related to localization specific to the GUI\n */\n\nconst wideLocales = ['ab', 'ca', 'de', 'el', 'it', 'ja', 'ja-Hira', 'ko', 'hu', 'ru', 'vi'];\n\n/**\n * Identify the languages where translations are too long to fit in fixed width parts of the gui.\n * @param {string} locale The current locale.\n * @return {bool} true if translations in this language are too long\n */\n\nconst isWideLocale = locale => wideLocales.indexOf(locale) !== -1;\n\n// EXTERNAL MODULE: ./src/components/sprite-info/sprite-info.css\nvar sprite_info = __webpack_require__(31);\nvar sprite_info_default = /*#__PURE__*/__webpack_require__.n(sprite_info);\n\n// EXTERNAL MODULE: ./src/components/sprite-info/icon--x.svg\nvar sprite_info_icon_x = __webpack_require__(319);\nvar icon_x_default = /*#__PURE__*/__webpack_require__.n(sprite_info_icon_x);\n\n// EXTERNAL MODULE: ./src/components/sprite-info/icon--y.svg\nvar icon_y = __webpack_require__(320);\nvar icon_y_default = /*#__PURE__*/__webpack_require__.n(icon_y);\n\n// CONCATENATED MODULE: ./src/lib/tw-recolor/build.js!./src/components/sprite-info/icon--show.svg\n\n const icon_show_original = \"\\n\\n \\n show-icon-active\\n Created with Sketch.\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n\\n\";\n\n const icon_show_getSRC = () => {\n const recolored = typeof Recolor === 'object' ? (\n icon_show_original.replace(/#855cd6/gi, Recolor.primary)\n ) : icon_show_original;\n return 'data:image/svg+xml;,' + encodeURIComponent(recolored);\n };\n\n /* harmony default export */ var icon_show = (icon_show_getSRC);\n\n// CONCATENATED MODULE: ./src/lib/tw-recolor/build.js!./src/components/sprite-info/icon--hide.svg\n\n const icon_hide_original = \"\\n\\n \\n hide-icon-active\\n Created with Sketch.\\n \\n \\n \\n \\n \\n \\n \\n \\n\\n\";\n\n const icon_hide_getSRC = () => {\n const recolored = typeof Recolor === 'object' ? (\n icon_hide_original.replace(/#855cd6/gi, Recolor.primary)\n ) : icon_hide_original;\n return 'data:image/svg+xml;,' + encodeURIComponent(recolored);\n };\n\n /* harmony default export */ var icon_hide = (icon_hide_getSRC);\n\n// CONCATENATED MODULE: ./src/components/sprite-info/sprite-info.jsx\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst sprite_info_BufferedInput = Object(buffered_input_hoc[\"a\" /* default */])(forms_input[\"a\" /* default */]);\nconst sprite_info_messages = Object(index_es[\"g\" /* defineMessages */])({\n spritePlaceholder: {\n \"id\": \"gui.SpriteInfo.spritePlaceholder\",\n \"defaultMessage\": \"Name\"\n },\n showSpriteAction: {\n \"id\": \"gui.SpriteInfo.showSpriteAction\",\n \"defaultMessage\": \"Show sprite\"\n },\n hideSpriteAction: {\n \"id\": \"gui.SpriteInfo.hideSpriteAction\",\n \"defaultMessage\": \"Hide sprite\"\n }\n});\nclass sprite_info_SpriteInfo extends react_default.a.Component {\n shouldComponentUpdate(nextProps) {\n return this.props.rotationStyle !== nextProps.rotationStyle || this.props.disabled !== nextProps.disabled || this.props.name !== nextProps.name || this.props.stageSize !== nextProps.stageSize || this.props.visible !== nextProps.visible ||\n // Only update these if rounded value has changed\n Math.round(this.props.direction) !== Math.round(nextProps.direction) || Math.round(this.props.size) !== Math.round(nextProps.size) || Math.round(this.props.x) !== Math.round(nextProps.x) || Math.round(this.props.y) !== Math.round(nextProps.y);\n }\n render() {\n const {\n stageSize\n } = this.props;\n const sprite = /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Sprite\",\n id: \"gui.SpriteInfo.sprite\"\n });\n const showLabel = /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Show\",\n id: \"gui.SpriteInfo.show\"\n });\n const sizeLabel = /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Size\",\n id: \"gui.SpriteInfo.size\"\n });\n const labelAbove = isWideLocale(this.props.intl.locale);\n const spriteNameInput = /*#__PURE__*/react_default.a.createElement(sprite_info_BufferedInput, {\n className: classnames_default()(sprite_info_default.a.spriteInput, {\n [sprite_info_default.a.columnInput]: labelAbove\n }),\n disabled: this.props.disabled,\n placeholder: this.props.intl.formatMessage(sprite_info_messages.spritePlaceholder),\n tabIndex: \"0\",\n type: \"text\",\n value: this.props.disabled ? '' : this.props.name,\n onSubmit: this.props.onChangeName\n });\n const xPosition = /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: sprite_info_default.a.group\n }, stageSize === layout_constants[\"d\" /* STAGE_DISPLAY_SIZES */].full || stageSize === layout_constants[\"d\" /* STAGE_DISPLAY_SIZES */].large ? /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: sprite_info_default.a.iconWrapper\n }, /*#__PURE__*/react_default.a.createElement(\"img\", {\n \"aria-hidden\": \"true\",\n className: classnames_default()(sprite_info_default.a.xIcon, sprite_info_default.a.icon),\n src: icon_x_default.a,\n draggable: false\n })) : null, /*#__PURE__*/react_default.a.createElement(components_forms_label, {\n text: \"x\"\n }, /*#__PURE__*/react_default.a.createElement(sprite_info_BufferedInput, {\n small: true,\n disabled: this.props.disabled,\n placeholder: \"x\",\n tabIndex: \"0\",\n type: \"number\",\n value: this.props.disabled ? '' : Math.round(this.props.x),\n onSubmit: this.props.onChangeX\n })));\n const yPosition = /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: sprite_info_default.a.group\n }, stageSize === layout_constants[\"d\" /* STAGE_DISPLAY_SIZES */].full || stageSize === layout_constants[\"d\" /* STAGE_DISPLAY_SIZES */].large ? /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: sprite_info_default.a.iconWrapper\n }, /*#__PURE__*/react_default.a.createElement(\"img\", {\n \"aria-hidden\": \"true\",\n className: classnames_default()(sprite_info_default.a.yIcon, sprite_info_default.a.icon),\n src: icon_y_default.a,\n draggable: false\n })) : null, /*#__PURE__*/react_default.a.createElement(components_forms_label, {\n text: \"y\"\n }, /*#__PURE__*/react_default.a.createElement(sprite_info_BufferedInput, {\n small: true,\n disabled: this.props.disabled,\n placeholder: \"y\",\n tabIndex: \"0\",\n type: \"number\",\n value: this.props.disabled ? '' : Math.round(this.props.y),\n onSubmit: this.props.onChangeY\n })));\n if (stageSize === layout_constants[\"d\" /* STAGE_DISPLAY_SIZES */].small) {\n return /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: sprite_info_default.a.spriteInfo\n }, /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: classnames_default()(sprite_info_default.a.row, sprite_info_default.a.rowPrimary)\n }, /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: sprite_info_default.a.group\n }, spriteNameInput)), /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: classnames_default()(sprite_info_default.a.row, sprite_info_default.a.rowSecondary)\n }, xPosition, yPosition));\n }\n return /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: sprite_info_default.a.spriteInfo\n }, /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: classnames_default()(sprite_info_default.a.row, sprite_info_default.a.rowPrimary)\n }, /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: sprite_info_default.a.group\n }, /*#__PURE__*/react_default.a.createElement(components_forms_label, {\n above: labelAbove,\n text: sprite\n }, spriteNameInput)), xPosition, yPosition), /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: classnames_default()(sprite_info_default.a.row, sprite_info_default.a.rowSecondary)\n }, /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: labelAbove ? sprite_info_default.a.column : sprite_info_default.a.group\n }, stageSize === layout_constants[\"d\" /* STAGE_DISPLAY_SIZES */].full || stageSize === layout_constants[\"d\" /* STAGE_DISPLAY_SIZES */].large ? /*#__PURE__*/react_default.a.createElement(components_forms_label, {\n secondary: true,\n text: showLabel\n }) : null, /*#__PURE__*/react_default.a.createElement(toggle_buttons_toggle_buttons, {\n buttons: [{\n handleClick: this.props.onClickVisible,\n icon: icon_show,\n isSelected: this.props.visible && !this.props.disabled,\n title: this.props.intl.formatMessage(sprite_info_messages.showSpriteAction)\n }, {\n handleClick: this.props.onClickNotVisible,\n icon: icon_hide,\n isSelected: !this.props.visible && !this.props.disabled,\n title: this.props.intl.formatMessage(sprite_info_messages.hideSpriteAction)\n }],\n disabled: this.props.disabled\n })), /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: classnames_default()(sprite_info_default.a.group, sprite_info_default.a.largerInput)\n }, /*#__PURE__*/react_default.a.createElement(components_forms_label, {\n secondary: true,\n above: labelAbove,\n text: sizeLabel\n }, /*#__PURE__*/react_default.a.createElement(sprite_info_BufferedInput, {\n small: true,\n disabled: this.props.disabled,\n label: sizeLabel,\n tabIndex: \"0\",\n type: \"number\",\n value: this.props.disabled ? '' : Math.round(this.props.size),\n onSubmit: this.props.onChangeSize\n }))), /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: classnames_default()(sprite_info_default.a.group, sprite_info_default.a.largerInput)\n }, /*#__PURE__*/react_default.a.createElement(containers_direction_picker, {\n direction: Math.round(this.props.direction),\n disabled: this.props.disabled,\n labelAbove: labelAbove,\n rotationStyle: this.props.rotationStyle,\n onChangeDirection: this.props.onChangeDirection,\n onChangeRotationStyle: this.props.onChangeRotationStyle\n }))));\n }\n}\nsprite_info_SpriteInfo.propTypes = {\n direction: prop_types_default.a.oneOfType([prop_types_default.a.string, prop_types_default.a.number]),\n disabled: prop_types_default.a.bool,\n intl: index_es[\"i\" /* intlShape */],\n name: prop_types_default.a.string,\n onChangeDirection: prop_types_default.a.func,\n onChangeName: prop_types_default.a.func,\n onChangeRotationStyle: prop_types_default.a.func,\n onChangeSize: prop_types_default.a.func,\n onChangeX: prop_types_default.a.func,\n onChangeY: prop_types_default.a.func,\n onClickNotVisible: prop_types_default.a.func,\n onClickVisible: prop_types_default.a.func,\n rotationStyle: prop_types_default.a.string,\n size: prop_types_default.a.oneOfType([prop_types_default.a.string, prop_types_default.a.number]),\n stageSize: prop_types_default.a.oneOf(Object.keys(layout_constants[\"d\" /* STAGE_DISPLAY_SIZES */])).isRequired,\n visible: prop_types_default.a.bool,\n x: prop_types_default.a.oneOfType([prop_types_default.a.string, prop_types_default.a.number]),\n y: prop_types_default.a.oneOfType([prop_types_default.a.string, prop_types_default.a.number])\n};\n/* harmony default export */ var sprite_info_sprite_info = (Object(index_es[\"h\" /* injectIntl */])(sprite_info_SpriteInfo));\n// CONCATENATED MODULE: ./src/containers/sprite-info.jsx\nfunction sprite_info_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction sprite_info_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? sprite_info_ownKeys(Object(t), !0).forEach(function (r) { sprite_info_defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : sprite_info_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction sprite_info_defineProperty(e, r, t) { return (r = sprite_info_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction sprite_info_toPropertyKey(t) { var i = sprite_info_toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction sprite_info_toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction sprite_info_extends() { return sprite_info_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, sprite_info_extends.apply(null, arguments); }\n\n\n\n\nclass containers_sprite_info_SpriteInfo extends react_default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['handleClickVisible', 'handleClickNotVisible']);\n }\n handleClickVisible(e) {\n e.preventDefault();\n this.props.onChangeVisibility(true);\n }\n handleClickNotVisible(e) {\n e.preventDefault();\n this.props.onChangeVisibility(false);\n }\n render() {\n return /*#__PURE__*/react_default.a.createElement(sprite_info_sprite_info, sprite_info_extends({}, this.props, {\n onClickNotVisible: this.handleClickNotVisible,\n onClickVisible: this.handleClickVisible\n }));\n }\n}\ncontainers_sprite_info_SpriteInfo.propTypes = sprite_info_objectSpread(sprite_info_objectSpread({}, sprite_info_sprite_info.propTypes), {}, {\n onChangeDirection: prop_types_default.a.func,\n onChangeName: prop_types_default.a.func,\n onChangeSize: prop_types_default.a.func,\n onChangeVisibility: prop_types_default.a.func,\n onChangeX: prop_types_default.a.func,\n onChangeY: prop_types_default.a.func,\n x: prop_types_default.a.number,\n y: prop_types_default.a.number\n});\n/* harmony default export */ var containers_sprite_info = (containers_sprite_info_SpriteInfo);\n// CONCATENATED MODULE: ./src/lib/throttled-property-hoc.jsx\n\n\n/* Higher Order Component to throttle updates to specific props.\n * Why? Because certain prop updates are expensive, and need to be throttled.\n * This allows renders when other properties change, and will use the last\n * rendered value of a prop for comparison.\n * @param {string} propName the name of the prop to throttle updates from.\n * @param {string} throttleTime the minimum time between updates to that specific property.\n * @returns {function} a function that accepts a component to wrap.\n */\nconst throttled_property_hoc_ThrottledPropertyHOC = function ThrottledPropertyHOC(propName, throttleTime) {\n /**\n * The function to be called with a React component to wrap it.\n * @param {React.Component} WrappedComponent - Component to wrap with throttler.\n * @returns {React.Component} the component wrapped with the throttler.\n */\n return function (WrappedComponent) {\n class ThrottledPropertyWrapper extends react_default.a.Component {\n shouldComponentUpdate(nextProps) {\n for (const property in nextProps) {\n if (property !== propName && this.props[property] !== nextProps[property]) {\n return true; // Always update if another property has changed\n }\n }\n\n // If only that prop has changed, allow update to go to render based\n // on _lastRenderedTime and _lastRenderTime are updated in render\n if (nextProps[propName] !== this._lastRenderedValue && Date.now() - this._lastRenderTime > throttleTime) {\n return true; // Allow this update to go to render\n }\n return false;\n }\n render() {\n this._lastRenderTime = Date.now();\n this._lastRenderedValue = this.props[propName];\n return /*#__PURE__*/react_default.a.createElement(WrappedComponent, this.props);\n }\n }\n return ThrottledPropertyWrapper;\n };\n};\n/* harmony default export */ var throttled_property_hoc = (throttled_property_hoc_ThrottledPropertyHOC);\n// EXTERNAL MODULE: ./src/components/sprite-selector/sprite-selector.css\nvar sprite_selector = __webpack_require__(74);\nvar sprite_selector_default = /*#__PURE__*/__webpack_require__.n(sprite_selector);\n\n// CONCATENATED MODULE: ./src/components/sprite-selector/sprite-list.jsx\n\n\n\n\n\n\n\n\n\n\nconst ThrottledSpriteSelectorItem = throttled_property_hoc('asset', 500)(containers_sprite_selector_item);\nconst sprite_list_SpriteList = function SpriteList(props) {\n const {\n containerRef,\n editingTarget,\n draggingIndex,\n draggingType,\n hoveredTarget,\n onDeleteSprite,\n onDuplicateSprite,\n onExportSprite,\n onSelectSprite,\n onAddSortable,\n onRemoveSortable,\n ordering,\n raised,\n selectedId,\n items\n } = props;\n const isSpriteDrag = draggingType === drag_constants.SPRITE;\n return /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: classnames_default()(sprite_selector_default.a.scrollWrapper, {\n [sprite_selector_default.a.scrollWrapperDragging]: draggingType === drag_constants.BACKPACK_SPRITE\n }),\n componentRef: containerRef\n }, /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: sprite_selector_default.a.itemsWrapper\n }, items.map((sprite, index) => {\n // If the sprite has just received a block drop, used for green highlight\n const receivedBlocks = hoveredTarget.sprite === sprite.id && sprite.id !== editingTarget && hoveredTarget.receivedBlocks;\n\n // If the sprite is indicating it can receive block dropping, used for blue highlight\n let isRaised = !receivedBlocks && raised && sprite.id !== editingTarget;\n\n // A sprite is also raised if a costume or sound is being dragged.\n // Note the absence of the self-sharing check: a sprite can share assets with itself.\n // This is a quirk of 2.0, but seems worth leaving possible, it\n // allows quick (albeit unusual) duplication of assets.\n isRaised = isRaised || [drag_constants.COSTUME, drag_constants.SOUND, drag_constants.BACKPACK_COSTUME, drag_constants.BACKPACK_SOUND, drag_constants.BACKPACK_CODE].includes(draggingType);\n return /*#__PURE__*/react_default.a.createElement(sortable_asset, {\n className: classnames_default()(sprite_selector_default.a.spriteWrapper, {\n [sprite_selector_default.a.placeholder]: isSpriteDrag && index === draggingIndex\n }),\n index: isSpriteDrag ? ordering.indexOf(index) : index,\n key: sprite.name,\n onAddSortable: onAddSortable,\n onRemoveSortable: onRemoveSortable\n }, /*#__PURE__*/react_default.a.createElement(ThrottledSpriteSelectorItem, {\n asset: sprite.costume && sprite.costume.asset,\n className: classnames_default()(sprite_selector_default.a.sprite, {\n [sprite_selector_default.a.raised]: isRaised,\n [sprite_selector_default.a.receivedBlocks]: receivedBlocks\n }),\n dragPayload: sprite.id,\n dragType: drag_constants.SPRITE,\n id: sprite.id,\n index: index,\n key: sprite.id,\n name: sprite.name,\n selected: sprite.id === selectedId,\n onClick: onSelectSprite,\n onDeleteButtonClick: onDeleteSprite,\n onDuplicateButtonClick: onDuplicateSprite,\n onExportButtonClick: onExportSprite\n }));\n })));\n};\nsprite_list_SpriteList.propTypes = {\n containerRef: prop_types_default.a.func,\n draggingIndex: prop_types_default.a.number,\n draggingType: prop_types_default.a.oneOf(Object.keys(drag_constants)),\n editingTarget: prop_types_default.a.string,\n hoveredTarget: prop_types_default.a.shape({\n hoveredSprite: prop_types_default.a.string,\n receivedBlocks: prop_types_default.a.bool,\n sprite: prop_types_default.a.string\n }),\n items: prop_types_default.a.arrayOf(prop_types_default.a.shape({\n costume: prop_types_default.a.shape({\n url: prop_types_default.a.string,\n name: prop_types_default.a.string.isRequired,\n bitmapResolution: prop_types_default.a.number.isRequired,\n rotationCenterX: prop_types_default.a.number.isRequired,\n rotationCenterY: prop_types_default.a.number.isRequired\n }),\n name: prop_types_default.a.any,\n // modified by folders addon\n order: prop_types_default.a.number.isRequired\n })),\n onAddSortable: prop_types_default.a.func,\n onDeleteSprite: prop_types_default.a.func,\n onDuplicateSprite: prop_types_default.a.func,\n onExportSprite: prop_types_default.a.func,\n onRemoveSortable: prop_types_default.a.func,\n onSelectSprite: prop_types_default.a.func,\n ordering: prop_types_default.a.arrayOf(prop_types_default.a.number),\n raised: prop_types_default.a.bool,\n selectedId: prop_types_default.a.string\n};\n/* harmony default export */ var sprite_list = (sortable_hoc(sprite_list_SpriteList));\n// EXTERNAL MODULE: ./node_modules/@turbowarp/scratch-l10n/src/index.js + 2 modules\nvar scratch_l10n_src = __webpack_require__(67);\n\n// CONCATENATED MODULE: ./src/components/sprite-selector/sprite-selector.jsx\nconst sprite_selector_excluded = [\"editingTarget\", \"hoveredTarget\", \"intl\", \"onChangeSpriteDirection\", \"onChangeSpriteName\", \"onChangeSpriteRotationStyle\", \"onChangeSpriteSize\", \"onChangeSpriteVisibility\", \"onChangeSpriteX\", \"onChangeSpriteY\", \"onDrop\", \"onDeleteSprite\", \"onDuplicateSprite\", \"onExportSprite\", \"onFileUploadClick\", \"onNewSpriteClick\", \"onPaintSpriteClick\", \"onSelectSprite\", \"onSpriteUpload\", \"onSurpriseSpriteClick\", \"raised\", \"selectedId\", \"spriteFileInput\", \"sprites\", \"stageSize\"];\nfunction sprite_selector_extends() { return sprite_selector_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, sprite_selector_extends.apply(null, arguments); }\nfunction sprite_selector_objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = sprite_selector_objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction sprite_selector_objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst sprite_selector_messages = Object(index_es[\"g\" /* defineMessages */])({\n addSpriteFromLibrary: {\n \"id\": \"gui.spriteSelector.addSpriteFromLibrary\",\n \"defaultMessage\": \"Choose a Sprite\"\n },\n addSpriteFromPaint: {\n \"id\": \"gui.spriteSelector.addSpriteFromPaint\",\n \"defaultMessage\": \"Paint\"\n },\n addSpriteFromSurprise: {\n \"id\": \"gui.spriteSelector.addSpriteFromSurprise\",\n \"defaultMessage\": \"Surprise\"\n },\n addSpriteFromFile: {\n \"id\": \"gui.spriteSelector.addSpriteFromFile\",\n \"defaultMessage\": \"Upload Sprite\"\n }\n});\nconst sprite_selector_SpriteSelectorComponent = function SpriteSelectorComponent(props) {\n const {\n editingTarget,\n hoveredTarget,\n intl,\n onChangeSpriteDirection,\n onChangeSpriteName,\n onChangeSpriteRotationStyle,\n onChangeSpriteSize,\n onChangeSpriteVisibility,\n onChangeSpriteX,\n onChangeSpriteY,\n onDrop,\n onDeleteSprite,\n onDuplicateSprite,\n onExportSprite,\n onFileUploadClick,\n onNewSpriteClick,\n onPaintSpriteClick,\n onSelectSprite,\n onSpriteUpload,\n onSurpriseSpriteClick,\n raised,\n selectedId,\n spriteFileInput,\n sprites,\n stageSize\n } = props,\n componentProps = sprite_selector_objectWithoutProperties(props, sprite_selector_excluded);\n let selectedSprite = sprites[selectedId];\n let spriteInfoDisabled = false;\n if (typeof selectedSprite === 'undefined') {\n selectedSprite = {};\n spriteInfoDisabled = true;\n }\n return /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], sprite_selector_extends({\n className: sprite_selector_default.a.spriteSelector\n }, componentProps), /*#__PURE__*/react_default.a.createElement(containers_sprite_info, {\n direction: selectedSprite.direction,\n disabled: spriteInfoDisabled,\n name: selectedSprite.name,\n rotationStyle: selectedSprite.rotationStyle,\n size: selectedSprite.size,\n stageSize: stageSize,\n visible: selectedSprite.visible,\n x: selectedSprite.x,\n y: selectedSprite.y,\n onChangeDirection: onChangeSpriteDirection,\n onChangeName: onChangeSpriteName,\n onChangeRotationStyle: onChangeSpriteRotationStyle,\n onChangeSize: onChangeSpriteSize,\n onChangeVisibility: onChangeSpriteVisibility,\n onChangeX: onChangeSpriteX,\n onChangeY: onChangeSpriteY\n }), /*#__PURE__*/react_default.a.createElement(sprite_list, {\n editingTarget: editingTarget,\n hoveredTarget: hoveredTarget,\n items: Object.keys(sprites).map(id => sprites[id]),\n raised: raised,\n selectedId: selectedId,\n onDeleteSprite: onDeleteSprite,\n onDrop: onDrop,\n onDuplicateSprite: onDuplicateSprite,\n onExportSprite: onExportSprite,\n onSelectSprite: onSelectSprite\n }), /*#__PURE__*/react_default.a.createElement(action_menu_action_menu, {\n className: sprite_selector_default.a.addButton,\n img: icon_sprite_default.a,\n moreButtons: [{\n title: intl.formatMessage(sprite_selector_messages.addSpriteFromFile),\n img: icon_file_upload_default.a,\n onClick: onFileUploadClick,\n fileAccept: '.svg, .png, .bmp, .jpg, .jpeg, .jfif, .webp, .sprite2, .sprite3, .gif',\n fileChange: onSpriteUpload,\n fileInput: spriteFileInput,\n fileMultiple: true\n }, {\n title: intl.formatMessage(sprite_selector_messages.addSpriteFromSurprise),\n img: icon_surprise_default.a,\n onClick: onSurpriseSpriteClick // TODO need real function for this\n }, {\n title: intl.formatMessage(sprite_selector_messages.addSpriteFromPaint),\n img: icon_paint_default.a,\n onClick: onPaintSpriteClick // TODO need real function for this\n }, {\n title: intl.formatMessage(sprite_selector_messages.addSpriteFromLibrary),\n img: icon_search_default.a,\n onClick: onNewSpriteClick\n }],\n title: intl.formatMessage(sprite_selector_messages.addSpriteFromLibrary),\n tooltipPlace: Object(scratch_l10n_src[\"b\" /* isRtl */])(intl.locale) ? 'right' : 'left',\n onClick: onNewSpriteClick\n }));\n};\nsprite_selector_SpriteSelectorComponent.propTypes = {\n editingTarget: prop_types_default.a.string,\n hoveredTarget: prop_types_default.a.shape({\n hoveredSprite: prop_types_default.a.string,\n receivedBlocks: prop_types_default.a.bool\n }),\n intl: index_es[\"i\" /* intlShape */].isRequired,\n onChangeSpriteDirection: prop_types_default.a.func,\n onChangeSpriteName: prop_types_default.a.func,\n onChangeSpriteRotationStyle: prop_types_default.a.func,\n onChangeSpriteSize: prop_types_default.a.func,\n onChangeSpriteVisibility: prop_types_default.a.func,\n onChangeSpriteX: prop_types_default.a.func,\n onChangeSpriteY: prop_types_default.a.func,\n onDeleteSprite: prop_types_default.a.func,\n onDrop: prop_types_default.a.func,\n onDuplicateSprite: prop_types_default.a.func,\n onExportSprite: prop_types_default.a.func,\n onFileUploadClick: prop_types_default.a.func,\n onNewSpriteClick: prop_types_default.a.func,\n onPaintSpriteClick: prop_types_default.a.func,\n onSelectSprite: prop_types_default.a.func,\n onSpriteUpload: prop_types_default.a.func,\n onSurpriseSpriteClick: prop_types_default.a.func,\n raised: prop_types_default.a.bool,\n selectedId: prop_types_default.a.string,\n spriteFileInput: prop_types_default.a.func,\n sprites: prop_types_default.a.shape({\n id: prop_types_default.a.shape({\n costume: prop_types_default.a.shape({\n url: prop_types_default.a.string,\n name: prop_types_default.a.string.isRequired,\n bitmapResolution: prop_types_default.a.number.isRequired,\n rotationCenterX: prop_types_default.a.number.isRequired,\n rotationCenterY: prop_types_default.a.number.isRequired\n }),\n name: prop_types_default.a.string.isRequired,\n order: prop_types_default.a.number.isRequired\n })\n }),\n stageSize: prop_types_default.a.oneOf(Object.keys(layout_constants[\"d\" /* STAGE_DISPLAY_SIZES */])).isRequired\n};\n/* harmony default export */ var sprite_selector_sprite_selector = (Object(index_es[\"h\" /* injectIntl */])(sprite_selector_SpriteSelectorComponent));\n// CONCATENATED MODULE: ./src/lib/backpack/costume-payload.js\n\n\nconst costumePayload = (costume, vm) => {\n // TODO is it ok to base64 encode SVGs? What about unicode text inside them?\n const assetDataUrl = vm.getExportedCostumeBase64(costume);\n const assetDataFormat = costume.dataFormat;\n const payload = {\n type: 'costume',\n name: costume.name,\n // Params to be filled in below\n mime: '',\n body: '',\n thumbnail: ''\n };\n switch (assetDataFormat) {\n case 'svg':\n payload.mime = 'image/svg+xml';\n payload.body = assetDataUrl;\n break;\n case 'png':\n payload.mime = 'image/png';\n payload.body = assetDataUrl;\n break;\n case 'jpg':\n payload.mime = 'image/jpeg';\n payload.body = assetDataUrl;\n break;\n default:\n alert(\"Cannot serialize for format: \".concat(assetDataFormat));\n // eslint-disable-line\n }\n\n // Do not generate the thumbnail from the raw asset. Instead use the getCostumeUrl\n // utility which inlines the fonts to make the thumbnail show the right fonts.\n const inlinedFontDataUrl = getCostumeUrl(costume.asset);\n return backpack_thumbnail(inlinedFontDataUrl).then(thumbnail => {\n payload.thumbnail = thumbnail;\n return payload;\n });\n};\n/* harmony default export */ var costume_payload = (costumePayload);\n// EXTERNAL MODULE: ./node_modules/base64-loader!./src/lib/backpack/sound-thumbnail.png\nvar sound_thumbnail = __webpack_require__(226);\nvar sound_thumbnail_default = /*#__PURE__*/__webpack_require__.n(sound_thumbnail);\n\n// CONCATENATED MODULE: ./src/lib/backpack/sound-payload.js\n// eslint-disable-next-line import/no-unresolved\n\nconst soundPayload = sound => {\n const assetDataUrl = sound.asset.encodeDataURI();\n const assetDataFormat = sound.dataFormat;\n const payload = {\n type: 'sound',\n name: sound.name,\n thumbnail: sound_thumbnail_default.a,\n // Params to be filled in below\n mime: '',\n body: ''\n };\n switch (assetDataFormat) {\n case 'wav':\n payload.mime = 'audio/x-wav';\n payload.body = assetDataUrl.replace('data:audio/x-wav;base64,', '');\n break;\n case 'mp3':\n payload.mime = 'audio/mp3';\n // TODO scratch-storage should be fixed so that encodeDataURI does not\n // always prepend the wave format header; Once that is fixed, the following\n // line will have to change.\n payload.body = assetDataUrl.replace('data:audio/x-wav;base64,', '');\n break;\n default:\n alert(\"Cannot serialize for format: \".concat(assetDataFormat));\n // eslint-disable-line\n }\n\n // Return a promise to make it consistent with other payload constructors like costume-payload\n return new Promise(resolve => resolve(payload));\n};\n\n// CONCATENATED MODULE: ./src/lib/backpack/sprite-payload.js\n\nconst spritePayload = (id, vm) => {\n const target = vm.runtime.getTargetById(id);\n if (!target) return null;\n return vm.exportSprite(id, 'base64').then(zippedSprite => {\n const payload = {\n type: 'sprite',\n name: target.sprite.name,\n mime: 'application/zip',\n body: zippedSprite,\n // Filled in below\n thumbnail: ''\n };\n const costumeDataUrl = target.sprite.costumes[target.currentCostume].asset.encodeDataURI();\n return backpack_thumbnail(costumeDataUrl).then(thumbnail => {\n payload.thumbnail = thumbnail;\n return payload;\n });\n });\n};\n/* harmony default export */ var sprite_payload = (spritePayload);\n// EXTERNAL MODULE: ./node_modules/js-md5/src/md5.js\nvar md5 = __webpack_require__(258);\nvar md5_default = /*#__PURE__*/__webpack_require__.n(md5);\n\n// CONCATENATED MODULE: ./src/lib/tw-base64-utils.js\nconst base64ToArrayBuffer = base64 => {\n const binaryString = atob(base64);\n const len = binaryString.length;\n const array = new Uint8Array(len);\n for (let i = 0; i < len; i++) {\n array[i] = binaryString.charCodeAt(i);\n }\n return array.buffer;\n};\nconst arrayBufferToBase64 = buffer => {\n let binary = '';\n const bytes = new Uint8Array(buffer);\n const len = bytes.byteLength;\n for (let i = 0; i < len; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n};\n// CONCATENATED MODULE: ./src/lib/tw-local-backpack-api.js\nfunction tw_local_backpack_api_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction tw_local_backpack_api_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? tw_local_backpack_api_ownKeys(Object(t), !0).forEach(function (r) { tw_local_backpack_api_defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : tw_local_backpack_api_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction tw_local_backpack_api_defineProperty(e, r, t) { return (r = tw_local_backpack_api_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction tw_local_backpack_api_toPropertyKey(t) { var i = tw_local_backpack_api_toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction tw_local_backpack_api_toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\n\n\n\n\n\n// Special constants -- do not change without care.\nconst DATABASE_NAME = 'TW_Backpack';\nconst DATABASE_VERSION = 1;\nconst STORE_NAME = 'backpack';\nconst idbItemToBackpackItem = item => {\n // convert id to string\n item.id = \"\".concat(item.id);\n if (item.type === 'sound') {\n // For sounds, use the local thumbnail instead of what was stored in the backpack.\n // The thumbnail was updated and it doesn't make sense for already backpacked sounds to\n // use the old icon instead of the new one.\n item.thumbnailUrl = \"data:;base64,\".concat(sound_thumbnail_default.a);\n } else {\n // Thumbnail could be any image format. The browser will figure out which format it is.\n item.thumbnailUrl = \"data:;base64,\".concat(arrayBufferToBase64(item.thumbnailData));\n }\n let assetType;\n if (item.type === 'script') {\n item.bodyUrl = \"data:application/json;base64,\".concat(arrayBufferToBase64(item.bodyData));\n } else if (item.type === 'sprite') {\n item.bodyUrl = \"data:application/zip;base64,\".concat(arrayBufferToBase64(item.bodyData));\n } else if (item.type === 'costume') {\n if (item.mime === 'image/svg+xml') {\n assetType = lib_storage[\"a\" /* default */].AssetType.ImageVector;\n } else if (item.mime === 'image/png' || item.mime === 'image/jpeg') {\n assetType = lib_storage[\"a\" /* default */].AssetType.ImageBitmap;\n }\n } else if (item.type === 'sound') {\n assetType = lib_storage[\"a\" /* default */].AssetType.Sound;\n }\n if (assetType) {\n const extension = assetType.runtimeFormat;\n const itemMD5 = item.bodyMD5;\n const md5ext = \"\".concat(itemMD5, \".\").concat(extension);\n item.body = md5ext;\n lib_storage[\"a\" /* default */].builtinHelper._store(assetType, extension, new Uint8Array(item.bodyData), itemMD5);\n }\n return item;\n};\nlet _db;\nconst openDB = () => new Promise((resolve, reject) => {\n if (_db) {\n resolve(_db);\n return;\n }\n if (!window.indexedDB) {\n reject(new Error('indexedDB is not supported'));\n return;\n }\n const request = indexedDB.open(DATABASE_NAME, DATABASE_VERSION);\n request.onupgradeneeded = event => {\n const db = event.target.result;\n db.createObjectStore(STORE_NAME, {\n keyPath: 'id',\n autoIncrement: true\n });\n };\n request.onsuccess = event => {\n _db = event.target.result;\n resolve(_db);\n };\n request.onerror = event => {\n reject(new Error(\"DB error: \".concat(event.target.error)));\n };\n});\nconst getBackpackContents = async _ref => {\n let {\n limit,\n offset\n } = _ref;\n const db = await openDB();\n return new Promise((resolve, reject) => {\n const transaction = db.transaction(STORE_NAME, 'readonly');\n transaction.onerror = event => {\n reject(new Error(\"Getting contents: \".concat(event.target.error)));\n };\n const store = transaction.objectStore(STORE_NAME);\n const items = [];\n const request = store.openCursor(null, 'prev');\n let first = true;\n request.onsuccess = e => {\n const cursor = e.target.result;\n if (first) {\n first = false;\n if (cursor && offset !== 0) {\n cursor.advance(offset);\n return;\n }\n }\n if (cursor && items.length < limit) {\n items.push(idbItemToBackpackItem(cursor.value));\n cursor.continue();\n } else {\n resolve(items);\n }\n };\n });\n};\nconst saveBackpackObject = async _ref2 => {\n let {\n type,\n mime,\n name,\n body,\n thumbnail\n } = _ref2;\n // User interaction -- fine to show a permission dialog\n requestPersistentStorage();\n const db = await openDB();\n return new Promise((resolve, reject) => {\n const transaction = db.transaction(STORE_NAME, 'readwrite');\n transaction.onerror = event => {\n reject(new Error(\"Sving object: \".concat(event.target.error)));\n };\n const store = transaction.objectStore(STORE_NAME);\n const bodyData = base64ToArrayBuffer(body);\n const bodyMD5 = md5_default()(bodyData);\n const idbItem = {\n type,\n mime,\n name,\n bodyData,\n bodyMD5,\n thumbnailData: base64ToArrayBuffer(thumbnail)\n };\n const putRequest = store.put(idbItem);\n putRequest.onsuccess = () => {\n idbItem.id = putRequest.result;\n resolve(idbItemToBackpackItem(idbItem));\n };\n });\n};\nconst deleteBackpackObject = async _ref3 => {\n let {\n id\n } = _ref3;\n id = +id;\n const db = await openDB();\n return new Promise((resolve, reject) => {\n const transaction = db.transaction(STORE_NAME, 'readwrite');\n transaction.onerror = event => {\n reject(new Error(\"Deleting object: \".concat(event.target.error)));\n };\n const store = transaction.objectStore(STORE_NAME);\n // Convert string IDs to number IDs\n const deleteRequest = store.delete(id);\n deleteRequest.onsuccess = () => {\n resolve();\n };\n });\n};\nconst updateBackpackObject = async _ref4 => {\n let {\n id,\n name\n } = _ref4;\n id = +id;\n const db = await openDB();\n return new Promise((resolve, reject) => {\n const transaction = db.transaction(STORE_NAME, 'readwrite');\n transaction.onerror = event => {\n reject(new Error(\"Updating object: \".concat(event.target.error)));\n };\n const store = transaction.objectStore(STORE_NAME);\n const getRequest = store.get(id);\n getRequest.onsuccess = () => {\n const newItem = tw_local_backpack_api_objectSpread(tw_local_backpack_api_objectSpread({}, getRequest.result), {}, {\n name: name\n });\n const putRequest = store.put(newItem);\n putRequest.onsuccess = () => {\n resolve(idbItemToBackpackItem(newItem));\n };\n };\n });\n};\n/* harmony default export */ var tw_local_backpack_api = ({\n getBackpackContents,\n saveBackpackObject,\n deleteBackpackObject,\n updateBackpackObject\n});\n// CONCATENATED MODULE: ./src/lib/backpack-api.js\n\n\n\n\n\n\nconst LOCAL_API = '_local_';\n\n// Add a new property for the full thumbnail url, which includes the host.\n// Also include a full body url for loading sprite zips\n// TODO retreiving the images through storage would allow us to remove this.\nconst includeFullUrls = (item, host) => Object.assign({}, item, {\n thumbnailUrl: \"\".concat(host, \"/\").concat(item.thumbnail),\n bodyUrl: \"\".concat(host, \"/\").concat(item.body)\n});\nconst backpack_api_getBackpackContents = _ref => {\n let {\n host,\n username,\n token,\n limit,\n offset\n } = _ref;\n return new Promise((resolve, reject) => {\n if (host === LOCAL_API) {\n return resolve(tw_local_backpack_api.getBackpackContents({\n limit,\n offset\n }));\n }\n xhr_default()({\n method: 'GET',\n uri: \"\".concat(host, \"/\").concat(username, \"?limit=\").concat(limit, \"&offset=\").concat(offset),\n headers: {\n 'x-token': token\n },\n json: true\n }, (error, response) => {\n if (error || response.statusCode !== 200) {\n return reject(new Error(response.status));\n }\n return resolve(response.body.map(item => includeFullUrls(item, host)));\n });\n });\n};\nconst backpack_api_saveBackpackObject = _ref2 => {\n let {\n host,\n username,\n token,\n type,\n // Type of object being saved to the backpack\n mime,\n // Mime-type of the object being saved\n name,\n // User-facing name of the object being saved\n body,\n // Base64-encoded body of the object being saved\n thumbnail // Base64-encoded JPEG thumbnail of the object being saved\n } = _ref2;\n return new Promise((resolve, reject) => {\n if (host === LOCAL_API) {\n return resolve(tw_local_backpack_api.saveBackpackObject({\n type,\n mime,\n name,\n body,\n thumbnail\n }));\n }\n xhr_default()({\n method: 'POST',\n uri: \"\".concat(host, \"/\").concat(username),\n headers: {\n 'x-token': token\n },\n json: {\n type,\n mime,\n name,\n body,\n thumbnail\n }\n }, (error, response) => {\n if (error || response.statusCode !== 200) {\n return reject(new Error(response.status));\n }\n return resolve(includeFullUrls(response.body, host));\n });\n });\n};\nconst backpack_api_deleteBackpackObject = _ref3 => {\n let {\n host,\n username,\n token,\n id\n } = _ref3;\n return new Promise((resolve, reject) => {\n if (host === LOCAL_API) {\n return resolve(tw_local_backpack_api.deleteBackpackObject({\n id\n }));\n }\n xhr_default()({\n method: 'DELETE',\n uri: \"\".concat(host, \"/\").concat(username, \"/\").concat(id),\n headers: {\n 'x-token': token\n }\n }, (error, response) => {\n if (error || response.statusCode !== 200) {\n return reject(new Error(response.status));\n }\n return resolve(response.body);\n });\n });\n};\nconst backpack_api_updateBackpackObject = _ref4 => {\n let {\n host,\n id,\n name\n } = _ref4;\n return new Promise((resolve, reject) => {\n if (host === LOCAL_API) {\n return resolve(tw_local_backpack_api.updateBackpackObject({\n id,\n name\n }));\n }\n reject(new Error('updateBackpackObject not supported'));\n });\n};\n\n// Two types of backpack items are not retreivable through storage\n// code, as json and sprite3 as arraybuffer zips.\nconst fetchAs = (responseType, uri) => new Promise((resolve, reject) => {\n xhr_default()({\n uri,\n responseType\n }, (error, response) => {\n if (error || response.statusCode !== 200) {\n return reject(new Error(response.status));\n }\n return resolve(response.body);\n });\n});\n\n// These two helpers allow easy fetching of backpack code and sprite zips\n// Use the curried fetchAs here so the consumer does not worry about XHR responseTypes\nconst fetchCode = fetchAs.bind(null, 'json');\nconst fetchSprite = fetchAs.bind(null, 'arraybuffer');\n\n// EXTERNAL MODULE: ./src/components/stage-selector/stage-selector.css\nvar stage_selector = __webpack_require__(87);\nvar stage_selector_default = /*#__PURE__*/__webpack_require__.n(stage_selector);\n\n// EXTERNAL MODULE: ./src/components/action-menu/icon--backdrop.svg\nvar icon_backdrop = __webpack_require__(321);\nvar icon_backdrop_default = /*#__PURE__*/__webpack_require__.n(icon_backdrop);\n\n// CONCATENATED MODULE: ./src/components/stage-selector/stage-selector.jsx\nconst stage_selector_excluded = [\"backdropCount\", \"containerRef\", \"dragOver\", \"fileInputRef\", \"intl\", \"selected\", \"raised\", \"receivedBlocks\", \"url\", \"onBackdropFileUploadClick\", \"onBackdropFileUpload\", \"onClick\", \"onMouseEnter\", \"onMouseLeave\", \"onNewBackdropClick\", \"onSurpriseBackdropClick\", \"onEmptyBackdropClick\"];\nfunction stage_selector_extends() { return stage_selector_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, stage_selector_extends.apply(null, arguments); }\nfunction stage_selector_objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = stage_selector_objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction stage_selector_objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst stage_selector_messages = Object(index_es[\"g\" /* defineMessages */])({\n addBackdropFromLibrary: {\n \"id\": \"gui.spriteSelector.addBackdropFromLibrary\",\n \"defaultMessage\": \"Choose a Backdrop\"\n },\n addBackdropFromPaint: {\n \"id\": \"gui.stageSelector.addBackdropFromPaint\",\n \"defaultMessage\": \"Paint\"\n },\n addBackdropFromSurprise: {\n \"id\": \"gui.stageSelector.addBackdropFromSurprise\",\n \"defaultMessage\": \"Surprise\"\n },\n addBackdropFromFile: {\n \"id\": \"gui.stageSelector.addBackdropFromFile\",\n \"defaultMessage\": \"Upload Backdrop\"\n }\n});\nconst stage_selector_StageSelector = props => {\n const {\n backdropCount,\n containerRef,\n dragOver,\n fileInputRef,\n intl,\n selected,\n raised,\n receivedBlocks,\n url,\n onBackdropFileUploadClick,\n onBackdropFileUpload,\n onClick,\n onMouseEnter,\n onMouseLeave,\n onNewBackdropClick,\n onSurpriseBackdropClick,\n onEmptyBackdropClick\n } = props,\n componentProps = stage_selector_objectWithoutProperties(props, stage_selector_excluded);\n return /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], stage_selector_extends({\n className: classnames_default()(stage_selector_default.a.stageSelector, {\n [stage_selector_default.a.isSelected]: selected,\n [stage_selector_default.a.raised]: raised || dragOver,\n [stage_selector_default.a.receivedBlocks]: receivedBlocks\n }),\n componentRef: containerRef,\n onClick: onClick,\n onMouseEnter: onMouseEnter,\n onMouseLeave: onMouseLeave\n }, componentProps), /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: stage_selector_default.a.header\n }, /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: stage_selector_default.a.headerTitle\n }, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Stage\",\n id: \"gui.stageSelector.stage\"\n }))), url ? /*#__PURE__*/react_default.a.createElement(\"img\", {\n className: stage_selector_default.a.costumeCanvas,\n src: url,\n draggable: false\n }) : null, /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: stage_selector_default.a.label\n }, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Backdrops\",\n id: \"gui.stageSelector.backdrops\"\n })), /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: stage_selector_default.a.count\n }, backdropCount), /*#__PURE__*/react_default.a.createElement(action_menu_action_menu, {\n className: stage_selector_default.a.addButton,\n img: icon_backdrop_default.a,\n moreButtons: [{\n title: intl.formatMessage(stage_selector_messages.addBackdropFromFile),\n img: icon_file_upload_default.a,\n onClick: onBackdropFileUploadClick,\n fileAccept: '.svg, .png, .bmp, .jpg, .jpeg, .jfif, .webp, .gif',\n fileChange: onBackdropFileUpload,\n fileInput: fileInputRef,\n fileMultiple: true\n }, {\n title: intl.formatMessage(stage_selector_messages.addBackdropFromSurprise),\n img: icon_surprise_default.a,\n onClick: onSurpriseBackdropClick\n }, {\n title: intl.formatMessage(stage_selector_messages.addBackdropFromPaint),\n img: icon_paint_default.a,\n onClick: onEmptyBackdropClick\n }, {\n title: intl.formatMessage(stage_selector_messages.addBackdropFromLibrary),\n img: icon_search_default.a,\n onClick: onNewBackdropClick\n }],\n title: intl.formatMessage(stage_selector_messages.addBackdropFromLibrary),\n tooltipPlace: Object(scratch_l10n_src[\"b\" /* isRtl */])(intl.locale) ? 'right' : 'left',\n onClick: onNewBackdropClick\n }));\n};\nstage_selector_StageSelector.propTypes = {\n backdropCount: prop_types_default.a.number.isRequired,\n containerRef: prop_types_default.a.func,\n dragOver: prop_types_default.a.bool,\n fileInputRef: prop_types_default.a.func,\n intl: index_es[\"i\" /* intlShape */].isRequired,\n onBackdropFileUpload: prop_types_default.a.func,\n onBackdropFileUploadClick: prop_types_default.a.func,\n onClick: prop_types_default.a.func,\n onEmptyBackdropClick: prop_types_default.a.func,\n onMouseEnter: prop_types_default.a.func,\n onMouseLeave: prop_types_default.a.func,\n onNewBackdropClick: prop_types_default.a.func,\n onSurpriseBackdropClick: prop_types_default.a.func,\n raised: prop_types_default.a.bool.isRequired,\n receivedBlocks: prop_types_default.a.bool.isRequired,\n selected: prop_types_default.a.bool.isRequired,\n url: prop_types_default.a.string\n};\n/* harmony default export */ var stage_selector_stage_selector = (Object(index_es[\"h\" /* injectIntl */])(stage_selector_StageSelector));\n// CONCATENATED MODULE: ./src/containers/stage-selector.jsx\nfunction stage_selector_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction stage_selector_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? stage_selector_ownKeys(Object(t), !0).forEach(function (r) { stage_selector_defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : stage_selector_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction stage_selector_defineProperty(e, r, t) { return (r = stage_selector_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction stage_selector_toPropertyKey(t) { var i = stage_selector_toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction stage_selector_toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction containers_stage_selector_extends() { return containers_stage_selector_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, containers_stage_selector_extends.apply(null, arguments); }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst stage_selector_dragTypes = [drag_constants.COSTUME, drag_constants.SOUND, drag_constants.BACKPACK_COSTUME, drag_constants.BACKPACK_SOUND, drag_constants.BACKPACK_CODE];\nconst DroppableThrottledStage = drop_area_hoc(stage_selector_dragTypes)(throttled_property_hoc('url', 500)(stage_selector_stage_selector));\nclass containers_stage_selector_StageSelector extends react_default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['handleClick', 'handleNewBackdrop', 'handleSurpriseBackdrop', 'handleEmptyBackdrop', 'addBackdropFromLibraryItem', 'handleFileUploadClick', 'handleBackdropUpload', 'handleMouseEnter', 'handleMouseLeave', 'handleTouchEnd', 'handleDrop', 'setFileInput', 'setRef']);\n }\n componentDidMount() {\n document.addEventListener('touchend', this.handleTouchEnd);\n }\n componentWillUnmount() {\n document.removeEventListener('touchend', this.handleTouchEnd);\n }\n handleTouchEnd(e) {\n const {\n x,\n y\n } = getEventXY(e);\n const {\n top,\n left,\n bottom,\n right\n } = this.ref.getBoundingClientRect();\n if (x >= left && x <= right && y >= top && y <= bottom) {\n this.handleMouseEnter();\n }\n }\n addBackdropFromLibraryItem(item) {\n let shouldActivateTab = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n const vmBackdrop = {\n name: item.name,\n md5: item.md5ext,\n rotationCenterX: item.rotationCenterX,\n rotationCenterY: item.rotationCenterY,\n bitmapResolution: item.bitmapResolution,\n skinId: null\n };\n this.handleNewBackdrop(vmBackdrop, shouldActivateTab);\n }\n handleClick() {\n this.props.onSelect(this.props.id);\n }\n handleNewBackdrop(backdrops_) {\n let shouldActivateTab = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n const backdrops = Array.isArray(backdrops_) ? backdrops_ : [backdrops_];\n return Promise.all(backdrops.map(backdrop => this.props.vm.addBackdrop(backdrop.md5, backdrop))).then(() => {\n if (shouldActivateTab) {\n return this.props.onActivateTab(editor_tab[\"b\" /* COSTUMES_TAB_INDEX */]);\n }\n });\n }\n async handleSurpriseBackdrop(e) {\n e.stopPropagation(); // Prevent click from falling through to selecting stage.\n const backdropLibraryContent = await getBackdropLibrary();\n // @todo should this not add a backdrop you already have?\n const item = backdropLibraryContent[Math.floor(Math.random() * backdropLibraryContent.length)];\n this.addBackdropFromLibraryItem(item, false);\n }\n handleEmptyBackdrop(e) {\n e.stopPropagation(); // Prevent click from falling through to stage selector, select it manually below\n this.props.vm.setEditingTarget(this.props.id);\n this.handleNewBackdrop(emptyCostume(this.props.intl.formatMessage(shared_messages[\"a\" /* default */].backdrop, {\n index: 1\n })));\n }\n handleBackdropUpload(e) {\n const vm = this.props.vm;\n this.props.onShowImporting();\n handleFileUpload(e.target, (buffer, fileType, fileName, fileIndex, fileCount) => {\n _costumeUpload(buffer, fileType, vm, vmCostumes => {\n this.props.vm.setEditingTarget(this.props.id);\n vmCostumes.forEach((costume, i) => {\n costume.name = \"\".concat(fileName).concat(i ? i + 1 : '');\n });\n this.handleNewBackdrop(vmCostumes).then(() => {\n if (fileIndex === fileCount - 1) {\n this.props.onCloseImporting();\n }\n });\n }, this.props.onCloseImporting);\n }, this.props.onCloseImporting);\n }\n handleFileUploadClick(e) {\n e.stopPropagation(); // Prevent click from selecting the stage, that is handled manually in backdrop upload\n this.fileInput.click();\n }\n handleMouseEnter() {\n this.props.dispatchSetHoveredSprite(this.props.id);\n }\n handleMouseLeave() {\n this.props.dispatchSetHoveredSprite(null);\n }\n handleDrop(dragInfo) {\n if (dragInfo.dragType === drag_constants.COSTUME) {\n this.props.vm.shareCostumeToTarget(dragInfo.index, this.props.id);\n } else if (dragInfo.dragType === drag_constants.SOUND) {\n this.props.vm.shareSoundToTarget(dragInfo.index, this.props.id);\n } else if (dragInfo.dragType === drag_constants.BACKPACK_COSTUME) {\n this.props.vm.addCostume(dragInfo.payload.body, {\n name: dragInfo.payload.name\n }, this.props.id);\n } else if (dragInfo.dragType === drag_constants.BACKPACK_SOUND) {\n this.props.vm.addSound({\n md5: dragInfo.payload.body,\n name: dragInfo.payload.name\n }, this.props.id);\n } else if (dragInfo.dragType === drag_constants.BACKPACK_CODE) {\n fetchCode(dragInfo.payload.bodyUrl).then(payload => {\n const centered = placeInViewport(payload, this.props.workspaceMetrics.targets[this.props.id], this.props.isRtl);\n this.props.vm.shareBlocksToTarget(centered, this.props.id);\n this.props.vm.refreshWorkspace();\n });\n }\n }\n setFileInput(input) {\n this.fileInput = input;\n }\n setRef(ref) {\n this.ref = ref;\n }\n render() {\n const componentProps = lodash_omit_default()(this.props, ['asset', 'dispatchSetHoveredSprite', 'id', 'intl', 'onActivateTab', 'onSelect', 'onShowImporting', 'onCloseImporting', 'isRtl', 'workspaceMetrics']);\n return /*#__PURE__*/react_default.a.createElement(DroppableThrottledStage, containers_stage_selector_extends({\n componentRef: this.setRef,\n fileInputRef: this.setFileInput,\n onBackdropFileUpload: this.handleBackdropUpload,\n onBackdropFileUploadClick: this.handleFileUploadClick,\n onClick: this.handleClick,\n onDrop: this.handleDrop,\n onEmptyBackdropClick: this.handleEmptyBackdrop,\n onMouseEnter: this.handleMouseEnter,\n onMouseLeave: this.handleMouseLeave,\n onSurpriseBackdropClick: this.handleSurpriseBackdrop\n }, componentProps));\n }\n}\ncontainers_stage_selector_StageSelector.propTypes = stage_selector_objectSpread(stage_selector_objectSpread({}, stage_selector_stage_selector.propTypes), {}, {\n id: prop_types_default.a.string,\n intl: index_es[\"i\" /* intlShape */].isRequired,\n isRtl: prop_types_default.a.bool,\n onCloseImporting: prop_types_default.a.func,\n onSelect: prop_types_default.a.func,\n onShowImporting: prop_types_default.a.func,\n workspaceMetrics: prop_types_default.a.shape({\n targets: prop_types_default.a.object\n })\n});\nconst stage_selector_mapStateToProps = (state, _ref) => {\n let {\n asset,\n id\n } = _ref;\n return {\n isRtl: state.locales.isRtl,\n url: asset && asset.encodeDataURI(),\n vm: state.scratchGui.vm,\n receivedBlocks: state.scratchGui.hoveredTarget.receivedBlocks && state.scratchGui.hoveredTarget.sprite === id,\n raised: state.scratchGui.blockDrag,\n workspaceMetrics: state.scratchGui.workspaceMetrics\n };\n};\nconst stage_selector_mapDispatchToProps = dispatch => ({\n onNewBackdropClick: e => {\n e.stopPropagation();\n dispatch(Object(modals[\"t\" /* openBackdropLibrary */])());\n },\n onActivateTab: tabIndex => {\n dispatch(Object(editor_tab[\"d\" /* activateTab */])(tabIndex));\n },\n dispatchSetHoveredSprite: spriteId => {\n dispatch(Object(hovered_target[\"c\" /* setHoveredSprite */])(spriteId));\n },\n onCloseImporting: () => dispatch(Object(alerts[\"c\" /* closeAlertWithId */])('importingAsset')),\n onShowImporting: () => dispatch(Object(alerts[\"i\" /* showStandardAlert */])('importingAsset'))\n});\n/* harmony default export */ var containers_stage_selector = (Object(index_es[\"h\" /* injectIntl */])(Object(react_redux_es[\"b\" /* connect */])(stage_selector_mapStateToProps, stage_selector_mapDispatchToProps)(containers_stage_selector_StageSelector)));\n// EXTERNAL MODULE: ./src/components/target-pane/target-pane.css\nvar target_pane = __webpack_require__(233);\nvar target_pane_default = /*#__PURE__*/__webpack_require__.n(target_pane);\n\n// CONCATENATED MODULE: ./src/components/target-pane/target-pane.jsx\nconst target_pane_excluded = [\"editingTarget\", \"fileInputRef\", \"hoveredTarget\", \"spriteLibraryVisible\", \"onActivateBlocksTab\", \"onChangeSpriteDirection\", \"onChangeSpriteName\", \"onChangeSpriteRotationStyle\", \"onChangeSpriteSize\", \"onChangeSpriteVisibility\", \"onChangeSpriteX\", \"onChangeSpriteY\", \"onDeleteSprite\", \"onDrop\", \"onDuplicateSprite\", \"onExportSprite\", \"onFileUploadClick\", \"onNewSpriteClick\", \"onPaintSpriteClick\", \"onRequestCloseSpriteLibrary\", \"onSelectSprite\", \"onSpriteUpload\", \"onSurpriseSpriteClick\", \"raiseSprites\", \"stage\", \"stageSize\", \"sprites\", \"vm\"];\nfunction target_pane_extends() { return target_pane_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, target_pane_extends.apply(null, arguments); }\nfunction target_pane_objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = target_pane_objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction target_pane_objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\n\n\n\n\n\n/*\n * Pane that contains the sprite selector, sprite info, stage selector,\n * and the new sprite, costume and backdrop buttons\n * @param {object} props Props for the component\n * @returns {React.Component} rendered component\n */\nconst target_pane_TargetPane = _ref => {\n let {\n editingTarget,\n fileInputRef,\n hoveredTarget,\n spriteLibraryVisible,\n onActivateBlocksTab,\n onChangeSpriteDirection,\n onChangeSpriteName,\n onChangeSpriteRotationStyle,\n onChangeSpriteSize,\n onChangeSpriteVisibility,\n onChangeSpriteX,\n onChangeSpriteY,\n onDeleteSprite,\n onDrop,\n onDuplicateSprite,\n onExportSprite,\n onFileUploadClick,\n onNewSpriteClick,\n onPaintSpriteClick,\n onRequestCloseSpriteLibrary,\n onSelectSprite,\n onSpriteUpload,\n onSurpriseSpriteClick,\n raiseSprites,\n stage,\n stageSize,\n sprites,\n vm\n } = _ref,\n componentProps = target_pane_objectWithoutProperties(_ref, target_pane_excluded);\n return /*#__PURE__*/react_default.a.createElement(\"div\", target_pane_extends({\n className: target_pane_default.a.targetPane\n }, componentProps), /*#__PURE__*/react_default.a.createElement(sprite_selector_sprite_selector, {\n editingTarget: editingTarget,\n hoveredTarget: hoveredTarget,\n raised: raiseSprites,\n selectedId: editingTarget,\n spriteFileInput: fileInputRef,\n sprites: sprites,\n stageSize: stageSize,\n onChangeSpriteDirection: onChangeSpriteDirection,\n onChangeSpriteName: onChangeSpriteName,\n onChangeSpriteRotationStyle: onChangeSpriteRotationStyle,\n onChangeSpriteSize: onChangeSpriteSize,\n onChangeSpriteVisibility: onChangeSpriteVisibility,\n onChangeSpriteX: onChangeSpriteX,\n onChangeSpriteY: onChangeSpriteY,\n onDeleteSprite: onDeleteSprite,\n onDrop: onDrop,\n onDuplicateSprite: onDuplicateSprite,\n onExportSprite: onExportSprite,\n onFileUploadClick: onFileUploadClick,\n onNewSpriteClick: onNewSpriteClick,\n onPaintSpriteClick: onPaintSpriteClick,\n onSelectSprite: onSelectSprite,\n onSpriteUpload: onSpriteUpload,\n onSurpriseSpriteClick: onSurpriseSpriteClick\n }), /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: target_pane_default.a.stageSelectorWrapper\n }, stage.id && /*#__PURE__*/react_default.a.createElement(containers_stage_selector, {\n asset: stage.costume && stage.costume.asset,\n backdropCount: stage.costumeCount,\n id: stage.id,\n selected: stage.id === editingTarget,\n onSelect: onSelectSprite\n }), /*#__PURE__*/react_default.a.createElement(\"div\", null, spriteLibraryVisible ? /*#__PURE__*/react_default.a.createElement(sprite_library, {\n vm: vm,\n onActivateBlocksTab: onActivateBlocksTab,\n onRequestClose: onRequestCloseSpriteLibrary\n }) : null)));\n};\nconst spriteShape = prop_types_default.a.shape({\n costume: prop_types_default.a.shape({\n // asset is defined in scratch-storage's Asset.js\n asset: prop_types_default.a.object,\n // eslint-disable-line react/forbid-prop-types\n url: prop_types_default.a.string,\n name: prop_types_default.a.string.isRequired,\n // The following are optional because costumes uploaded from disk\n // will not have these properties available\n bitmapResolution: prop_types_default.a.number,\n rotationCenterX: prop_types_default.a.number,\n rotationCenterY: prop_types_default.a.number\n }),\n costumeCount: prop_types_default.a.number,\n direction: prop_types_default.a.number,\n id: prop_types_default.a.string,\n name: prop_types_default.a.string,\n order: prop_types_default.a.number,\n size: prop_types_default.a.number,\n visibility: prop_types_default.a.bool,\n x: prop_types_default.a.number,\n y: prop_types_default.a.number\n});\ntarget_pane_TargetPane.propTypes = {\n editingTarget: prop_types_default.a.string,\n extensionLibraryVisible: prop_types_default.a.bool,\n fileInputRef: prop_types_default.a.func,\n hoveredTarget: prop_types_default.a.shape({\n hoveredSprite: prop_types_default.a.string,\n receivedBlocks: prop_types_default.a.bool\n }),\n onActivateBlocksTab: prop_types_default.a.func.isRequired,\n onChangeSpriteDirection: prop_types_default.a.func,\n onChangeSpriteName: prop_types_default.a.func,\n onChangeSpriteRotationStyle: prop_types_default.a.func,\n onChangeSpriteSize: prop_types_default.a.func,\n onChangeSpriteVisibility: prop_types_default.a.func,\n onChangeSpriteX: prop_types_default.a.func,\n onChangeSpriteY: prop_types_default.a.func,\n onDeleteSprite: prop_types_default.a.func,\n onDrop: prop_types_default.a.func,\n onDuplicateSprite: prop_types_default.a.func,\n onExportSprite: prop_types_default.a.func,\n onFileUploadClick: prop_types_default.a.func,\n onNewSpriteClick: prop_types_default.a.func,\n onPaintSpriteClick: prop_types_default.a.func,\n onRequestCloseExtensionLibrary: prop_types_default.a.func,\n onRequestCloseSpriteLibrary: prop_types_default.a.func,\n onSelectSprite: prop_types_default.a.func,\n onSpriteUpload: prop_types_default.a.func,\n onSurpriseSpriteClick: prop_types_default.a.func,\n raiseSprites: prop_types_default.a.bool,\n spriteLibraryVisible: prop_types_default.a.bool,\n sprites: prop_types_default.a.objectOf(spriteShape),\n stage: spriteShape,\n stageSize: prop_types_default.a.oneOf(Object.keys(layout_constants[\"d\" /* STAGE_DISPLAY_SIZES */])).isRequired,\n vm: prop_types_default.a.instanceOf(src_default.a)\n};\n/* harmony default export */ var target_pane_target_pane = (target_pane_TargetPane);\n// CONCATENATED MODULE: ./src/containers/target-pane.jsx\nconst containers_target_pane_excluded = [\"dispatchUpdateRestore\", \"isRtl\", \"onActivateTab\", \"onCloseImporting\", \"onHighlightTarget\", \"onReceivedBlocks\", \"onShowImporting\", \"workspaceMetrics\"];\nfunction target_pane_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction target_pane_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? target_pane_ownKeys(Object(t), !0).forEach(function (r) { target_pane_defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : target_pane_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction target_pane_defineProperty(e, r, t) { return (r = target_pane_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction target_pane_toPropertyKey(t) { var i = target_pane_toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction target_pane_toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction containers_target_pane_extends() { return containers_target_pane_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, containers_target_pane_extends.apply(null, arguments); }\nfunction containers_target_pane_objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = containers_target_pane_objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction containers_target_pane_objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass containers_target_pane_TargetPane extends react_default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['handleActivateBlocksTab', 'handleBlockDragEnd', 'handleChangeSpriteRotationStyle', 'handleChangeSpriteDirection', 'handleChangeSpriteName', 'handleChangeSpriteSize', 'handleChangeSpriteVisibility', 'handleChangeSpriteX', 'handleChangeSpriteY', 'handleDeleteSprite', 'handleDrop', 'handleDuplicateSprite', 'handleExportSprite', 'handleNewSprite', 'handleSelectSprite', 'handleSurpriseSpriteClick', 'handlePaintSpriteClick', 'handleFileUploadClick', 'handleSpriteUpload', 'setFileInput']);\n }\n componentDidMount() {\n this.props.vm.addListener('BLOCK_DRAG_END', this.handleBlockDragEnd);\n }\n componentWillUnmount() {\n this.props.vm.removeListener('BLOCK_DRAG_END', this.handleBlockDragEnd);\n }\n handleChangeSpriteDirection(direction) {\n this.props.vm.postSpriteInfo({\n direction\n });\n }\n handleChangeSpriteRotationStyle(rotationStyle) {\n this.props.vm.postSpriteInfo({\n rotationStyle\n });\n }\n handleChangeSpriteName(name) {\n this.props.vm.renameSprite(this.props.editingTarget, name);\n }\n handleChangeSpriteSize(size) {\n this.props.vm.postSpriteInfo({\n size\n });\n }\n handleChangeSpriteVisibility(visible) {\n this.props.vm.postSpriteInfo({\n visible\n });\n }\n handleChangeSpriteX(x) {\n this.props.vm.postSpriteInfo({\n x\n });\n }\n handleChangeSpriteY(y) {\n this.props.vm.postSpriteInfo({\n y\n });\n }\n handleDeleteSprite(id) {\n const restoreSprite = this.props.vm.deleteSprite(id);\n const restoreFun = () => restoreSprite().then(this.handleActivateBlocksTab);\n this.props.dispatchUpdateRestore({\n restoreFun: restoreFun,\n deletedItem: 'Sprite'\n });\n }\n handleDuplicateSprite(id) {\n this.props.vm.duplicateSprite(id);\n }\n handleExportSprite(id) {\n const spriteName = this.props.vm.runtime.getTargetById(id).getName();\n const saveLink = document.createElement('a');\n document.body.appendChild(saveLink);\n this.props.vm.exportSprite(id).then(content => {\n Object(download_blob[\"a\" /* default */])(\"\".concat(spriteName, \".sprite3\"), content);\n });\n }\n handleSelectSprite(id) {\n this.props.vm.setEditingTarget(id);\n if (this.props.stage && id !== this.props.stage.id) {\n this.props.onHighlightTarget(id);\n }\n }\n async handleSurpriseSpriteClick() {\n const spriteLibraryContent = await getSpriteLibrary();\n const surpriseSprites = spriteLibraryContent.filter(sprite => sprite.tags.indexOf('letters') === -1 && sprite.tags.indexOf('numbers') === -1);\n const item = surpriseSprites[Math.floor(Math.random() * surpriseSprites.length)];\n randomize_sprite_position(item);\n this.props.vm.addSprite(JSON.stringify(item)).then(this.handleActivateBlocksTab);\n }\n handlePaintSpriteClick() {\n const formatMessage = this.props.intl.formatMessage;\n const emptyItem = emptySprite(formatMessage(shared_messages[\"a\" /* default */].sprite, {\n index: 1\n }), formatMessage(shared_messages[\"a\" /* default */].pop), formatMessage(shared_messages[\"a\" /* default */].costume, {\n index: 1\n }));\n this.props.vm.addSprite(JSON.stringify(emptyItem)).then(() => {\n setTimeout(() => {\n // Wait for targets update to propagate before tab switching\n this.props.onActivateTab(editor_tab[\"b\" /* COSTUMES_TAB_INDEX */]);\n });\n });\n }\n handleActivateBlocksTab() {\n this.props.onActivateTab(editor_tab[\"a\" /* BLOCKS_TAB_INDEX */]);\n }\n handleNewSprite(spriteJSONString) {\n return this.props.vm.addSprite(spriteJSONString).then(this.handleActivateBlocksTab).catch(err => {\n log[\"default\"].error(err);\n });\n }\n handleFileUploadClick() {\n this.fileInput.click();\n }\n handleSpriteUpload(e) {\n const vm = this.props.vm;\n this.props.onShowImporting();\n handleFileUpload(e.target, (buffer, fileType, fileName, fileIndex, fileCount) => {\n file_uploader_spriteUpload(buffer, fileType, fileName, vm, newSprite => {\n this.handleNewSprite(newSprite).then(() => {\n if (fileIndex === fileCount - 1) {\n this.props.onCloseImporting();\n }\n }).catch(this.props.onCloseImporting);\n }, this.props.onCloseImporting);\n }, this.props.onCloseImporting);\n }\n setFileInput(input) {\n this.fileInput = input;\n }\n handleBlockDragEnd(blocks) {\n if (this.props.hoveredTarget.sprite && this.props.hoveredTarget.sprite !== this.props.editingTarget) {\n this.shareBlocks(blocks, this.props.hoveredTarget.sprite, this.props.editingTarget);\n this.props.onReceivedBlocks(true);\n }\n }\n shareBlocks(payload, targetId, optFromTargetId) {\n // Position the top-level block based on the scroll position.\n const centered = placeInViewport(payload, this.props.workspaceMetrics.targets[targetId], this.props.isRtl);\n return this.props.vm.shareBlocksToTarget(centered, targetId, optFromTargetId);\n }\n handleDrop(dragInfo) {\n const {\n sprite: targetId\n } = this.props.hoveredTarget;\n if (dragInfo.dragType === drag_constants.SPRITE) {\n // Add one to both new and target index because we are not counting/moving the stage\n this.props.vm.reorderTarget(dragInfo.index + 1, dragInfo.newIndex + 1);\n } else if (dragInfo.dragType === drag_constants.BACKPACK_SPRITE) {\n // TODO storage does not have a way of loading zips right now, and may never need it.\n // So for now just grab the zip manually.\n fetchSprite(dragInfo.payload.bodyUrl).then(sprite3Zip => this.props.vm.addSprite(sprite3Zip));\n } else if (targetId) {\n // Something is being dragged over one of the sprite tiles or the backdrop.\n // Dropping assets like sounds and costumes duplicate the asset on the\n // hovered target. Shared costumes also become the current costume on that target.\n // However, dropping does not switch the editing target or activate that editor tab.\n // This is based on 2.0 behavior, but seems like it keeps confusing switching to a minimum.\n // it allows the user to share multiple things without switching back and forth.\n if (dragInfo.dragType === drag_constants.COSTUME) {\n this.props.vm.shareCostumeToTarget(dragInfo.index, targetId);\n } else if (targetId && dragInfo.dragType === drag_constants.SOUND) {\n this.props.vm.shareSoundToTarget(dragInfo.index, targetId);\n } else if (dragInfo.dragType === drag_constants.BACKPACK_COSTUME) {\n // In scratch 2, this only creates a new sprite from the costume.\n // We may be able to handle both kinds of drops, depending on where\n // the drop happens. For now, just add the costume.\n this.props.vm.addCostume(dragInfo.payload.body, {\n name: dragInfo.payload.name\n }, targetId);\n } else if (dragInfo.dragType === drag_constants.BACKPACK_SOUND) {\n this.props.vm.addSound({\n md5: dragInfo.payload.body,\n name: dragInfo.payload.name\n }, targetId);\n } else if (dragInfo.dragType === drag_constants.BACKPACK_CODE) {\n fetchCode(dragInfo.payload.bodyUrl).then(blocks => this.shareBlocks(blocks, targetId)).then(() => this.props.vm.refreshWorkspace());\n }\n }\n }\n render() {\n /* eslint-disable no-unused-vars */\n const _this$props = this.props,\n {\n dispatchUpdateRestore,\n isRtl,\n onActivateTab,\n onCloseImporting,\n onHighlightTarget,\n onReceivedBlocks,\n onShowImporting,\n workspaceMetrics\n } = _this$props,\n componentProps = containers_target_pane_objectWithoutProperties(_this$props, containers_target_pane_excluded);\n /* eslint-enable no-unused-vars */\n return /*#__PURE__*/react_default.a.createElement(target_pane_target_pane, containers_target_pane_extends({}, componentProps, {\n fileInputRef: this.setFileInput,\n onActivateBlocksTab: this.handleActivateBlocksTab,\n onChangeSpriteDirection: this.handleChangeSpriteDirection,\n onChangeSpriteName: this.handleChangeSpriteName,\n onChangeSpriteRotationStyle: this.handleChangeSpriteRotationStyle,\n onChangeSpriteSize: this.handleChangeSpriteSize,\n onChangeSpriteVisibility: this.handleChangeSpriteVisibility,\n onChangeSpriteX: this.handleChangeSpriteX,\n onChangeSpriteY: this.handleChangeSpriteY,\n onDeleteSprite: this.handleDeleteSprite,\n onDrop: this.handleDrop,\n onDuplicateSprite: this.handleDuplicateSprite,\n onExportSprite: this.handleExportSprite,\n onFileUploadClick: this.handleFileUploadClick,\n onPaintSpriteClick: this.handlePaintSpriteClick,\n onSelectSprite: this.handleSelectSprite,\n onSpriteUpload: this.handleSpriteUpload,\n onSurpriseSpriteClick: this.handleSurpriseSpriteClick\n }));\n }\n}\nconst _TargetPaneComponent$ = target_pane_target_pane.propTypes,\n {\n onSelectSprite: target_pane_onSelectSprite,\n // eslint-disable-line no-unused-vars\n onActivateBlocksTab: target_pane_onActivateBlocksTab // eslint-disable-line no-unused-vars\n } = _TargetPaneComponent$,\n targetPaneProps = containers_target_pane_objectWithoutProperties(_TargetPaneComponent$, [\"onSelectSprite\", \"onActivateBlocksTab\"]);\ncontainers_target_pane_TargetPane.propTypes = target_pane_objectSpread({\n intl: index_es[\"i\" /* intlShape */].isRequired,\n onCloseImporting: prop_types_default.a.func,\n onShowImporting: prop_types_default.a.func\n}, targetPaneProps);\nconst target_pane_mapStateToProps = state => ({\n editingTarget: state.scratchGui.targets.editingTarget,\n hoveredTarget: state.scratchGui.hoveredTarget,\n isRtl: state.locales.isRtl,\n spriteLibraryVisible: state.scratchGui.modals.spriteLibrary,\n sprites: state.scratchGui.targets.sprites,\n stage: state.scratchGui.targets.stage,\n raiseSprites: state.scratchGui.blockDrag,\n workspaceMetrics: state.scratchGui.workspaceMetrics\n});\nconst target_pane_mapDispatchToProps = dispatch => ({\n onNewSpriteClick: e => {\n e.preventDefault();\n dispatch(Object(modals[\"F\" /* openSpriteLibrary */])());\n },\n onRequestCloseSpriteLibrary: () => {\n dispatch(Object(modals[\"m\" /* closeSpriteLibrary */])());\n },\n onActivateTab: tabIndex => {\n dispatch(Object(editor_tab[\"d\" /* activateTab */])(tabIndex));\n },\n onReceivedBlocks: receivedBlocks => {\n dispatch(Object(hovered_target[\"d\" /* setReceivedBlocks */])(receivedBlocks));\n },\n dispatchUpdateRestore: restoreState => {\n dispatch(Object(restore_deletion[\"c\" /* setRestore */])(restoreState));\n },\n onHighlightTarget: id => {\n dispatch(Object(targets[\"b\" /* highlightTarget */])(id));\n },\n onCloseImporting: () => dispatch(Object(alerts[\"c\" /* closeAlertWithId */])('importingAsset')),\n onShowImporting: () => dispatch(Object(alerts[\"i\" /* showStandardAlert */])('importingAsset'))\n});\n/* harmony default export */ var containers_target_pane = (Object(index_es[\"h\" /* injectIntl */])(Object(react_redux_es[\"b\" /* connect */])(target_pane_mapStateToProps, target_pane_mapDispatchToProps)(containers_target_pane_TargetPane)));\n// EXTERNAL MODULE: ./src/components/asset-panel/icon--sound.svg\nvar icon_sound = __webpack_require__(322);\nvar icon_sound_default = /*#__PURE__*/__webpack_require__.n(icon_sound);\n\n// EXTERNAL MODULE: ./src/components/asset-panel/icon--sound-rtl.svg\nvar icon_sound_rtl = __webpack_require__(323);\nvar icon_sound_rtl_default = /*#__PURE__*/__webpack_require__.n(icon_sound_rtl);\n\n// EXTERNAL MODULE: ./src/components/asset-panel/icon--add-sound-lib.svg\nvar icon_add_sound_lib = __webpack_require__(324);\nvar icon_add_sound_lib_default = /*#__PURE__*/__webpack_require__.n(icon_add_sound_lib);\n\n// EXTERNAL MODULE: ./src/components/asset-panel/icon--add-sound-record.svg\nvar icon_add_sound_record = __webpack_require__(325);\nvar icon_add_sound_record_default = /*#__PURE__*/__webpack_require__.n(icon_add_sound_record);\n\n// CONCATENATED MODULE: ./src/lib/audio/audio-util.js\n\nconst SOUND_BYTE_LIMIT = 10 * 1000 * 1000; // 10mb\n\nconst _computeRMS = function _computeRMS(samples, start, end) {\n let scaling = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0.55;\n const length = end - start;\n if (length === 0) return 0;\n // Calculate RMS, adapted from https://github.com/Tonejs/Tone.js/blob/master/Tone/component/Meter.js#L88\n let sum = 0;\n for (let i = start; i < end; i++) {\n const sample = samples[i];\n sum += sample ** 2;\n }\n const rms = Math.sqrt(sum / length);\n const val = rms / scaling;\n return Math.sqrt(val);\n};\nconst computeRMS = (samples, scaling) => _computeRMS(samples, 0, samples.length, scaling);\nconst computeChunkedRMS = function computeChunkedRMS(samples) {\n let chunkSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1024;\n const sampleCount = samples.length;\n const chunkLevels = [];\n for (let i = 0; i < sampleCount; i += chunkSize) {\n const maxIndex = Math.min(sampleCount, i + chunkSize);\n chunkLevels.push(_computeRMS(samples, i, maxIndex));\n }\n return chunkLevels;\n};\nconst audio_util_encodeAndAddSoundToVM = function encodeAndAddSoundToVM(vm, samples, sampleRate, name, callback) {\n wav_encoder_default.a.encode({\n sampleRate: sampleRate,\n channelData: [samples]\n }).then(wavBuffer => {\n const vmSound = {\n format: '',\n dataFormat: 'wav',\n rate: sampleRate,\n sampleCount: samples.length\n };\n\n // Create an asset from the encoded .wav and get resulting md5\n const storage = vm.runtime.storage;\n vmSound.asset = storage.createAsset(storage.AssetType.Sound, storage.DataFormat.WAV, new Uint8Array(wavBuffer), null, true // generate md5\n );\n vmSound.assetId = vmSound.asset.assetId;\n\n // update vmSound object with md5 property\n vmSound.md5 = \"\".concat(vmSound.assetId, \".\").concat(vmSound.dataFormat);\n // The VM will update the sound name to a fresh name\n vmSound.name = name;\n vm.addSound(vmSound).then(() => {\n if (callback) callback();\n });\n });\n};\n\n/**\n @typedef SoundBuffer\n @type {Object}\n @property {Float32Array} samples Array of audio samples\n @property {number} sampleRate Audio sample rate\n */\n\n/**\n * Downsample the given buffer to try to reduce file size below SOUND_BYTE_LIMIT\n * @param {SoundBuffer} buffer - Buffer to resample\n * @param {function(SoundBuffer):Promise} resampler - resampler function\n * @returns {SoundBuffer} Downsampled buffer with half the sample rate\n */\nconst downsampleIfNeeded = (buffer, resampler) => {\n const {\n samples,\n sampleRate\n } = buffer;\n const encodedByteLength = samples.length * 2; /* bitDepth 16 bit */\n // Resolve immediately if already within byte limit\n if (encodedByteLength < SOUND_BYTE_LIMIT) {\n return Promise.resolve({\n samples,\n sampleRate\n });\n }\n // TW: Don't check if the sound will still fit at this reduced sample rate.\n // Instead the GUI will show a warning if it's too large.\n return resampler({\n samples,\n sampleRate\n }, 22050);\n};\n\n/**\n * Drop every other sample of an audio buffer as a last-resort way of downsampling.\n * @param {SoundBuffer} buffer - Buffer to resample\n * @returns {SoundBuffer} Downsampled buffer with half the sample rate\n */\nconst dropEveryOtherSample = buffer => {\n const newLength = Math.floor(buffer.samples.length / 2);\n const newSamples = new Float32Array(newLength);\n for (let i = 0; i < newLength; i++) {\n newSamples[i] = buffer.samples[i * 2];\n }\n return {\n samples: newSamples,\n sampleRate: buffer.sampleRate / 2\n };\n};\n\n// EXTERNAL MODULE: ./src/components/meter/meter.css\nvar meter = __webpack_require__(125);\nvar meter_default = /*#__PURE__*/__webpack_require__.n(meter);\n\n// CONCATENATED MODULE: ./src/components/meter/meter.jsx\n\n\n\nconst Meter = props => {\n const {\n level,\n width,\n height\n } = props;\n const nGreen = 11;\n const nYellow = 5;\n const nRed = 3;\n const nBars = nGreen + nYellow + nRed;\n const barSpacing = 2.5;\n const barRounding = 3;\n const barHeight = (height - barSpacing * (nBars + 1)) / nBars;\n const nBarsToMask = nBars - Math.floor(level * nBars);\n const scale = (nBarsToMask * (barHeight + barSpacing) + barSpacing / 2) / height;\n return /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: meter_default.a.maskContainer,\n style: {\n height: \"\".concat(height, \"px\")\n }\n }, /*#__PURE__*/react_default.a.createElement(\"svg\", {\n className: meter_default.a.container,\n height: height,\n width: width\n }, Array(nBars).fill(0).map((value, index) => /*#__PURE__*/react_default.a.createElement(\"rect\", {\n className: index < nGreen ? meter_default.a.green : index < nGreen + nYellow ? meter_default.a.yellow : meter_default.a.red,\n height: barHeight,\n key: index,\n rx: barRounding,\n ry: barRounding,\n width: width - 2,\n x: 1,\n y: height - (barSpacing + barHeight) * (index + 1)\n }))), /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: meter_default.a.mask,\n style: {\n transform: \"scaleY(\".concat(scale, \")\")\n }\n }));\n};\nMeter.propTypes = {\n height: prop_types_default.a.number,\n level: prop_types_default.a.number,\n width: prop_types_default.a.number\n};\n/* harmony default export */ var meter_meter = (Meter);\n// EXTERNAL MODULE: ./src/components/waveform/waveform.css\nvar waveform = __webpack_require__(234);\nvar waveform_default = /*#__PURE__*/__webpack_require__.n(waveform);\n\n// CONCATENATED MODULE: ./src/components/waveform/waveform.jsx\n\n\n\n\n// Waveform is expensive to compute, make sure it only updates when data does\n// by using PureComponent. In future can be changed back to function with React.memo\n// eslint-disable-next-line react/prefer-stateless-function\nclass waveform_Waveform extends react_default.a.PureComponent {\n render() {\n const {\n width,\n height,\n data\n } = this.props;\n\n // Never want a density of points higher than the number of pixels\n // This is very conservative, could be far fewer points because of curve smoothing.\n // Drawing too many points seems to cause an explosion in browser\n // composite time when animating the playhead\n const takeEveryN = Math.ceil(data.length / width);\n const filteredData = takeEveryN === 1 ? data.slice(0) : data.filter((_, i) => i % takeEveryN === 0);\n\n // Need at least two points to render waveform.\n if (filteredData.length === 1) {\n filteredData.push(filteredData[0]);\n }\n const maxIndex = filteredData.length - 1;\n const points = [...filteredData.map((v, i) => [width * (i / maxIndex), height * v / 2]), ...filteredData.reverse().map((v, i) => [width * (1 - i / maxIndex), -height * v / 2])];\n const pathComponents = points.map((_ref, i) => {\n let [x, y] = _ref;\n const [nx, ny] = points[i < points.length - 1 ? i + 1 : 0];\n return \"Q\".concat(x, \" \").concat(y, \" \").concat((x + nx) / 2, \" \").concat((y + ny) / 2);\n });\n return /*#__PURE__*/react_default.a.createElement(\"svg\", {\n className: waveform_default.a.container,\n viewBox: \"0 0 \".concat(width, \" \").concat(height)\n }, /*#__PURE__*/react_default.a.createElement(\"g\", {\n transform: \"scale(1, -1) translate(0, -\".concat(height / 2, \")\")\n }, /*#__PURE__*/react_default.a.createElement(\"path\", {\n className: waveform_default.a.waveformPath,\n d: \"M0 0\".concat(pathComponents.join(' '), \"Z\"),\n strokeLinejoin: 'round',\n strokeWidth: 1\n })));\n }\n}\nwaveform_Waveform.propTypes = {\n data: prop_types_default.a.arrayOf(prop_types_default.a.number),\n height: prop_types_default.a.number,\n width: prop_types_default.a.number\n};\n/* harmony default export */ var waveform_waveform = (waveform_Waveform);\n// EXTERNAL MODULE: ./src/components/record-modal/record-modal.css\nvar record_modal = __webpack_require__(32);\nvar record_modal_default = /*#__PURE__*/__webpack_require__.n(record_modal);\n\n// EXTERNAL MODULE: ./src/components/record-modal/icon--stop-recording.svg\nvar icon_stop_recording = __webpack_require__(326);\nvar icon_stop_recording_default = /*#__PURE__*/__webpack_require__.n(icon_stop_recording);\n\n// CONCATENATED MODULE: ./src/components/record-modal/recording-step.jsx\n\n\n\n\n\n\n\n\nconst recording_step_messages = Object(index_es[\"g\" /* defineMessages */])({\n beginRecord: {\n \"id\": \"gui.recordingStep.beginRecord\",\n \"defaultMessage\": \"Begin recording by clicking the button below\"\n },\n permission: {\n \"id\": \"gui.recordingStep.permission\",\n \"defaultMessage\": \"{arrow}We need your permission to use your microphone\"\n },\n stop: {\n \"id\": \"gui.recordingStep.stop\",\n \"defaultMessage\": \"Stop recording\"\n },\n record: {\n \"id\": \"gui.recordingStep.record\",\n \"defaultMessage\": \"Record\"\n }\n});\nconst recording_step_RecordingStep = props => /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], null, /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: record_modal_default.a.visualizationContainer\n}, /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: record_modal_default.a.meterContainer\n}, /*#__PURE__*/react_default.a.createElement(meter_meter, {\n height: 172,\n level: props.level,\n width: 20\n})), /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: record_modal_default.a.waveformContainer\n}, props.levels ? /*#__PURE__*/react_default.a.createElement(waveform_waveform, {\n data: props.levels,\n height: 150,\n level: 0,\n width: 440\n}) : /*#__PURE__*/react_default.a.createElement(\"span\", {\n className: record_modal_default.a.helpText\n}, props.listening ? props.intl.formatMessage(recording_step_messages.beginRecord) : props.intl.formatMessage(recording_step_messages.permission, {\n arrow: props.isRtl ? '↗️ \\u00A0' : '↖️ \\u00A0'\n})))), /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: record_modal_default.a.mainButtonRow\n}, /*#__PURE__*/react_default.a.createElement(\"button\", {\n className: record_modal_default.a.mainButton,\n disabled: !props.listening,\n onClick: props.recording ? props.onStopRecording : props.onRecord\n}, props.recording ? /*#__PURE__*/react_default.a.createElement(\"img\", {\n draggable: false,\n src: icon_stop_recording_default.a\n}) : /*#__PURE__*/react_default.a.createElement(\"svg\", {\n className: record_modal_default.a.recordButton,\n height: \"52\",\n width: \"52\"\n}, /*#__PURE__*/react_default.a.createElement(\"circle\", {\n className: record_modal_default.a.recordButtonCircle,\n cx: \"26\",\n cy: \"26\",\n r: \"25\"\n}), /*#__PURE__*/react_default.a.createElement(\"circle\", {\n className: record_modal_default.a.recordButtonCircleOutline,\n cx: \"26\",\n cy: \"26\",\n r: 27 + props.level * 5\n})), /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: record_modal_default.a.helpText\n}, /*#__PURE__*/react_default.a.createElement(\"span\", {\n className: record_modal_default.a.recordingText\n}, props.recording ? props.intl.formatMessage(recording_step_messages.stop) : props.intl.formatMessage(recording_step_messages.record))))));\nrecording_step_RecordingStep.propTypes = {\n intl: index_es[\"i\" /* intlShape */].isRequired,\n isRtl: prop_types_default.a.bool,\n level: prop_types_default.a.number,\n levels: prop_types_default.a.arrayOf(prop_types_default.a.number),\n listening: prop_types_default.a.bool,\n onRecord: prop_types_default.a.func.isRequired,\n onStopRecording: prop_types_default.a.func.isRequired,\n recording: prop_types_default.a.bool\n};\n/* harmony default export */ var recording_step = (Object(index_es[\"h\" /* injectIntl */])(recording_step_RecordingStep));\n// EXTERNAL MODULE: ./node_modules/get-float-time-domain-data/lib/get-float-time-domain-data.js\nvar get_float_time_domain_data = __webpack_require__(631);\n\n// EXTERNAL MODULE: ./node_modules/get-user-media-promise/lib/get-user-media-promise.js\nvar get_user_media_promise = __webpack_require__(219);\nvar get_user_media_promise_default = /*#__PURE__*/__webpack_require__.n(get_user_media_promise);\n\n// CONCATENATED MODULE: ./src/lib/audio/audio-recorder.js\n\n\n\n\nclass audio_recorder_AudioRecorder {\n constructor() {\n this.audioContext = new shared_audio_context();\n this.bufferLength = 8192;\n this.userMediaStream = null;\n this.mediaStreamSource = null;\n this.sourceNode = null;\n this.scriptProcessorNode = null;\n this.recordedSamples = 0;\n this.recording = false;\n this.started = false;\n this.buffers = [];\n this.disposed = false;\n }\n startListening(onStarted, onUpdate, onError) {\n try {\n get_user_media_promise_default()({\n audio: true\n }).then(userMediaStream => {\n if (!this.disposed) {\n this.started = true;\n onStarted();\n this.attachUserMediaStream(userMediaStream, onUpdate);\n }\n }).catch(e => {\n if (!this.disposed) {\n onError(e);\n }\n });\n } catch (e) {\n if (!this.disposed) {\n onError(e);\n }\n }\n }\n startRecording() {\n this.recording = true;\n }\n attachUserMediaStream(userMediaStream, onUpdate) {\n this.userMediaStream = userMediaStream;\n this.mediaStreamSource = this.audioContext.createMediaStreamSource(userMediaStream);\n this.sourceNode = this.audioContext.createGain();\n this.scriptProcessorNode = this.audioContext.createScriptProcessor(this.bufferLength, 1, 1);\n this.scriptProcessorNode.onaudioprocess = processEvent => {\n if (this.recording && !this.disposed) {\n this.buffers.push(new Float32Array(processEvent.inputBuffer.getChannelData(0)));\n }\n };\n this.analyserNode = this.audioContext.createAnalyser();\n this.analyserNode.fftSize = 2048;\n const bufferLength = this.analyserNode.frequencyBinCount;\n const dataArray = new Float32Array(bufferLength);\n const update = () => {\n if (this.disposed) return;\n this.analyserNode.getFloatTimeDomainData(dataArray);\n onUpdate(computeRMS(dataArray));\n requestAnimationFrame(update);\n };\n requestAnimationFrame(update);\n\n // Wire everything together, ending in the destination\n this.mediaStreamSource.connect(this.sourceNode);\n this.sourceNode.connect(this.analyserNode);\n this.analyserNode.connect(this.scriptProcessorNode);\n this.scriptProcessorNode.connect(this.audioContext.destination);\n }\n stop() {\n const buffer = new Float32Array(this.buffers.length * this.bufferLength);\n let offset = 0;\n for (let i = 0; i < this.buffers.length; i++) {\n const bufferChunk = this.buffers[i];\n buffer.set(bufferChunk, offset);\n offset += bufferChunk.length;\n }\n const chunkLevels = computeChunkedRMS(buffer);\n const maxRMS = Math.max.apply(null, chunkLevels);\n const threshold = maxRMS / 8;\n let firstChunkAboveThreshold = null;\n let lastChunkAboveThreshold = null;\n for (let i = 0; i < chunkLevels.length; i++) {\n if (chunkLevels[i] > threshold) {\n if (firstChunkAboveThreshold === null) firstChunkAboveThreshold = i + 1;\n lastChunkAboveThreshold = i + 1;\n }\n }\n let trimStart = Math.max(2, firstChunkAboveThreshold - 2) / this.buffers.length;\n let trimEnd = Math.min(this.buffers.length - 2, lastChunkAboveThreshold + 2) / this.buffers.length;\n\n // With very few samples, the automatic trimming can produce invalid values\n if (trimStart >= trimEnd) {\n trimStart = 0;\n trimEnd = 1;\n }\n return {\n levels: chunkLevels,\n samples: buffer,\n sampleRate: this.audioContext.sampleRate,\n trimStart: trimStart,\n trimEnd: trimEnd\n };\n }\n dispose() {\n if (this.started) {\n this.scriptProcessorNode.onaudioprocess = null;\n this.scriptProcessorNode.disconnect();\n this.analyserNode.disconnect();\n this.sourceNode.disconnect();\n this.mediaStreamSource.disconnect();\n this.userMediaStream.getAudioTracks()[0].stop();\n }\n this.disposed = true;\n }\n}\n/* harmony default export */ var audio_recorder = (audio_recorder_AudioRecorder);\n// CONCATENATED MODULE: ./src/containers/recording-step.jsx\nconst recording_step_excluded = [\"onRecord\", \"onStopRecording\"];\nfunction recording_step_extends() { return recording_step_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, recording_step_extends.apply(null, arguments); }\nfunction recording_step_objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = recording_step_objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction recording_step_objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\n\n\n\nconst containers_recording_step_messages = Object(index_es[\"g\" /* defineMessages */])({\n alertMsg: {\n \"id\": \"gui.recordingStep.alertMsg\",\n \"defaultMessage\": \"Could not start recording\"\n }\n});\nclass containers_recording_step_RecordingStep extends react_default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['handleRecord', 'handleStopRecording', 'handleStarted', 'handleLevelUpdate', 'handleRecordingError']);\n this.state = {\n listening: false,\n level: 0,\n levels: null\n };\n }\n componentDidMount() {\n this.audioRecorder = new audio_recorder();\n this.audioRecorder.startListening(this.handleStarted, this.handleLevelUpdate, this.handleRecordingError);\n }\n componentWillUnmount() {\n this.audioRecorder.dispose();\n }\n handleStarted() {\n this.setState({\n listening: true\n });\n }\n handleRecordingError(error) {\n log[\"default\"].error(error);\n alert(this.props.intl.formatMessage(containers_recording_step_messages.alertMsg)); // eslint-disable-line no-alert\n }\n handleLevelUpdate(level) {\n this.setState({\n level: level,\n levels: this.props.recording ? (this.state.levels || []).concat([level]) : this.state.levels\n });\n }\n handleRecord() {\n this.audioRecorder.startRecording();\n this.props.onRecord();\n }\n handleStopRecording() {\n const {\n samples,\n sampleRate,\n levels,\n trimStart,\n trimEnd\n } = this.audioRecorder.stop();\n this.props.onStopRecording(samples, sampleRate, levels, trimStart, trimEnd);\n }\n render() {\n const _this$props = this.props,\n {\n onRecord,\n // eslint-disable-line no-unused-vars\n onStopRecording // eslint-disable-line no-unused-vars\n } = _this$props,\n componentProps = recording_step_objectWithoutProperties(_this$props, recording_step_excluded);\n return /*#__PURE__*/react_default.a.createElement(recording_step, recording_step_extends({\n level: this.state.level,\n levels: this.state.levels,\n listening: this.state.listening,\n onRecord: this.handleRecord,\n onStopRecording: this.handleStopRecording\n }, componentProps));\n }\n}\ncontainers_recording_step_RecordingStep.propTypes = {\n intl: index_es[\"i\" /* intlShape */].isRequired,\n onRecord: prop_types_default.a.func.isRequired,\n onStopRecording: prop_types_default.a.func.isRequired,\n recording: prop_types_default.a.bool\n};\n/* harmony default export */ var containers_recording_step = (Object(index_es[\"h\" /* injectIntl */])(containers_recording_step_RecordingStep));\n// EXTERNAL MODULE: ./src/components/audio-trimmer/audio-trimmer.css\nvar audio_trimmer = __webpack_require__(29);\nvar audio_trimmer_default = /*#__PURE__*/__webpack_require__.n(audio_trimmer);\n\n// CONCATENATED MODULE: ./src/lib/tw-recolor/build.js!./src/components/audio-trimmer/icon--handle.svg\n\n const audio_trimmer_icon_handle_original = \"\";\n\n const audio_trimmer_icon_handle_getSRC = () => {\n const recolored = typeof Recolor === 'object' ? (\n audio_trimmer_icon_handle_original.replace(/#855cd6/gi, Recolor.primary)\n ) : audio_trimmer_icon_handle_original;\n return 'data:image/svg+xml;,' + encodeURIComponent(recolored);\n };\n\n /* harmony default export */ var audio_trimmer_icon_handle = (audio_trimmer_icon_handle_getSRC);\n\n// CONCATENATED MODULE: ./src/components/audio-trimmer/selection-handle.jsx\n\n\n\n\n\n\n\nconst SelectionHandle = props => /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: classnames_default()(audio_trimmer_default.a.trimLine, props.handleStyle),\n onMouseDown: props.onMouseDown,\n onTouchStart: props.onMouseDown\n}, /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: classnames_default()(audio_trimmer_default.a.trimHandle, audio_trimmer_default.a.topTrimHandle)\n}, /*#__PURE__*/react_default.a.createElement(render, {\n src: audio_trimmer_icon_handle,\n draggable: false\n})), /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: classnames_default()(audio_trimmer_default.a.trimHandle, audio_trimmer_default.a.bottomTrimHandle)\n}, /*#__PURE__*/react_default.a.createElement(render, {\n src: audio_trimmer_icon_handle,\n draggable: false\n})));\nSelectionHandle.propTypes = {\n handleStyle: prop_types_default.a.string,\n onMouseDown: prop_types_default.a.func\n};\n/* harmony default export */ var selection_handle = (SelectionHandle);\n// CONCATENATED MODULE: ./src/components/audio-trimmer/playhead.jsx\n\n\n\n\nconst Playhead = props => /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: audio_trimmer_default.a.playheadContainer\n}, /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: classnames_default()(audio_trimmer_default.a.playhead),\n style: {\n transform: \"translateX(\".concat(100 * props.playbackPosition, \"%)\")\n }\n}));\nPlayhead.propTypes = {\n playbackPosition: prop_types_default.a.number\n};\n/* harmony default export */ var playhead = (Playhead);\n// CONCATENATED MODULE: ./src/components/audio-trimmer/audio-trimmer.jsx\n\n\n\n\n\n\n\nconst audio_trimmer_AudioTrimmer = props => /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: classnames_default()(audio_trimmer_default.a.absolute, audio_trimmer_default.a.trimmer),\n ref: props.containerRef\n}, props.trimStart === null ? null : /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: classnames_default()(audio_trimmer_default.a.absolute, audio_trimmer_default.a.trimBackground, audio_trimmer_default.a.startTrimBackground),\n style: {\n width: \"\".concat(100 * props.trimStart, \"%\")\n },\n onMouseDown: props.onTrimStartMouseDown,\n onTouchStart: props.onTrimStartMouseDown\n}, /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: classnames_default()(audio_trimmer_default.a.absolute, audio_trimmer_default.a.trimBackgroundMask)\n}), /*#__PURE__*/react_default.a.createElement(selection_handle, {\n handleStyle: audio_trimmer_default.a.leftHandle\n})), props.playhead ? /*#__PURE__*/react_default.a.createElement(playhead, {\n playbackPosition: props.playhead\n}) : null, props.trimEnd === null ? null : /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: classnames_default()(audio_trimmer_default.a.absolute, audio_trimmer_default.a.trimBackground, audio_trimmer_default.a.endTrimBackground),\n style: {\n left: \"\".concat(100 * props.trimEnd, \"%\"),\n width: \"\".concat(100 - 100 * props.trimEnd, \"%\")\n },\n onMouseDown: props.onTrimEndMouseDown,\n onTouchStart: props.onTrimEndMouseDown\n}, /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: classnames_default()(audio_trimmer_default.a.absolute, audio_trimmer_default.a.trimBackgroundMask)\n}), /*#__PURE__*/react_default.a.createElement(selection_handle, {\n handleStyle: audio_trimmer_default.a.rightHandle\n})));\naudio_trimmer_AudioTrimmer.propTypes = {\n containerRef: prop_types_default.a.func,\n onTrimEndMouseDown: prop_types_default.a.func.isRequired,\n onTrimStartMouseDown: prop_types_default.a.func.isRequired,\n playhead: prop_types_default.a.number,\n trimEnd: prop_types_default.a.number,\n trimStart: prop_types_default.a.number\n};\n/* harmony default export */ var audio_trimmer_audio_trimmer = (audio_trimmer_AudioTrimmer);\n// CONCATENATED MODULE: ./src/containers/audio-trimmer.jsx\n\n\n\n\n\nconst MIN_LENGTH = 0.01; // Used to stop sounds being trimmed smaller than 1%\n\nclass containers_audio_trimmer_AudioTrimmer extends react_default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['handleTrimStartMouseDown', 'handleTrimEndMouseDown', 'handleTrimStartMouseMove', 'handleTrimEndMouseMove', 'storeRef']);\n this.trimStartDragRecognizer = new drag_recognizer({\n onDrag: this.handleTrimStartMouseMove,\n touchDragAngle: 90,\n distanceThreshold: 0\n });\n this.trimEndDragRecognizer = new drag_recognizer({\n onDrag: this.handleTrimEndMouseMove,\n touchDragAngle: 90,\n distanceThreshold: 0\n });\n }\n handleTrimStartMouseMove(currentOffset, initialOffset) {\n const dx = (currentOffset.x - initialOffset.x) / this.containerSize;\n const newTrim = Math.max(0, Math.min(this.props.trimEnd - MIN_LENGTH, this.initialTrim + dx));\n this.props.onSetTrimStart(newTrim);\n }\n handleTrimEndMouseMove(currentOffset, initialOffset) {\n const dx = (currentOffset.x - initialOffset.x) / this.containerSize;\n const newTrim = Math.min(1, Math.max(this.props.trimStart + MIN_LENGTH, this.initialTrim + dx));\n this.props.onSetTrimEnd(newTrim);\n }\n handleTrimStartMouseDown(e) {\n this.containerSize = this.containerElement.getBoundingClientRect().width;\n this.trimStartDragRecognizer.start(e);\n this.initialTrim = this.props.trimStart;\n }\n handleTrimEndMouseDown(e) {\n this.containerSize = this.containerElement.getBoundingClientRect().width;\n this.trimEndDragRecognizer.start(e);\n this.initialTrim = this.props.trimEnd;\n }\n storeRef(el) {\n this.containerElement = el;\n }\n render() {\n return /*#__PURE__*/react_default.a.createElement(audio_trimmer_audio_trimmer, {\n containerRef: this.storeRef,\n playhead: this.props.playhead,\n trimEnd: this.props.trimEnd,\n trimStart: this.props.trimStart,\n onTrimEndMouseDown: this.handleTrimEndMouseDown,\n onTrimStartMouseDown: this.handleTrimStartMouseDown\n });\n }\n}\ncontainers_audio_trimmer_AudioTrimmer.propTypes = {\n onSetTrimEnd: prop_types_default.a.func,\n onSetTrimStart: prop_types_default.a.func,\n playhead: prop_types_default.a.number,\n trimEnd: prop_types_default.a.number,\n trimStart: prop_types_default.a.number\n};\n/* harmony default export */ var containers_audio_trimmer = (containers_audio_trimmer_AudioTrimmer);\n// CONCATENATED MODULE: ./src/lib/tw-recolor/build.js!./src/components/record-modal/icon--back.svg\n\n const icon_back_original = \"\\n\\n \\n re-record\\n Created with Sketch.\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n\\n\";\n\n const icon_back_getSRC = () => {\n const recolored = typeof Recolor === 'object' ? (\n icon_back_original.replace(/#855cd6/gi, Recolor.primary)\n ) : icon_back_original;\n return 'data:image/svg+xml;,' + encodeURIComponent(recolored);\n };\n\n /* harmony default export */ var record_modal_icon_back = (icon_back_getSRC);\n\n// CONCATENATED MODULE: ./src/lib/tw-recolor/build.js!./src/components/record-modal/icon--stop-playback.svg\n\n const icon_stop_playback_original = \"\\n\\n \\n stop-playback\\n Created with Sketch.\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n\\n\";\n\n const icon_stop_playback_getSRC = () => {\n const recolored = typeof Recolor === 'object' ? (\n icon_stop_playback_original.replace(/#855cd6/gi, Recolor.primary)\n ) : icon_stop_playback_original;\n return 'data:image/svg+xml;,' + encodeURIComponent(recolored);\n };\n\n /* harmony default export */ var icon_stop_playback = (icon_stop_playback_getSRC);\n\n// CONCATENATED MODULE: ./src/lib/tw-recolor/build.js!./src/components/record-modal/icon--play.svg\n\n const icon_play_original = \"\\n\\n \\n play\\n Created with Sketch.\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n\\n\";\n\n const icon_play_getSRC = () => {\n const recolored = typeof Recolor === 'object' ? (\n icon_play_original.replace(/#855cd6/gi, Recolor.primary)\n ) : icon_play_original;\n return 'data:image/svg+xml;,' + encodeURIComponent(recolored);\n };\n\n /* harmony default export */ var record_modal_icon_play = (icon_play_getSRC);\n\n// CONCATENATED MODULE: ./src/components/record-modal/playback-step.jsx\n\n\n\n\n\n\n\n\n\n\n\n\nconst playback_step_messages = Object(index_es[\"g\" /* defineMessages */])({\n stopMsg: {\n \"id\": \"gui.playbackStep.stopMsg\",\n \"defaultMessage\": \"Stop\"\n },\n playMsg: {\n \"id\": \"gui.playbackStep.playMsg\",\n \"defaultMessage\": \"Play\"\n },\n loadingMsg: {\n \"id\": \"gui.playbackStep.loadingMsg\",\n \"defaultMessage\": \"Loading...\"\n },\n saveMsg: {\n \"id\": \"gui.playbackStep.saveMsg\",\n \"defaultMessage\": \"Save\"\n },\n reRecordMsg: {\n \"id\": \"gui.playbackStep.reRecordMsg\",\n \"defaultMessage\": \"Re-record\"\n }\n});\nconst playback_step_PlaybackStep = props => /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], null, /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: record_modal_default.a.visualizationContainer\n}, /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: record_modal_default.a.meterContainer\n}, /*#__PURE__*/react_default.a.createElement(meter_meter, {\n height: 172,\n level: 0,\n width: 20\n})), /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: record_modal_default.a.waveformContainer\n}, /*#__PURE__*/react_default.a.createElement(waveform_waveform, {\n data: props.levels,\n height: 150,\n level: 0,\n width: 480\n}), /*#__PURE__*/react_default.a.createElement(containers_audio_trimmer, {\n playhead: props.playhead,\n trimEnd: props.trimEnd,\n trimStart: props.trimStart,\n onSetTrimEnd: props.onSetTrimEnd,\n onSetTrimStart: props.onSetTrimStart\n}))), /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: record_modal_default.a.mainButtonRow\n}, /*#__PURE__*/react_default.a.createElement(\"button\", {\n className: record_modal_default.a.mainButton,\n onClick: props.playing ? props.onStopPlaying : props.onPlay\n}, /*#__PURE__*/react_default.a.createElement(render, {\n draggable: false,\n src: props.playing ? icon_stop_playback : record_modal_icon_play\n}), /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: record_modal_default.a.helpText\n}, /*#__PURE__*/react_default.a.createElement(\"span\", {\n className: record_modal_default.a.playingText\n}, props.playing ? props.intl.formatMessage(playback_step_messages.stopMsg) : props.intl.formatMessage(playback_step_messages.playMsg))))), /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: record_modal_default.a.buttonRow\n}, /*#__PURE__*/react_default.a.createElement(\"button\", {\n className: record_modal_default.a.rerecordButton,\n onClick: props.onBack\n}, /*#__PURE__*/react_default.a.createElement(render, {\n draggable: false,\n src: record_modal_icon_back\n}), props.intl.formatMessage(playback_step_messages.reRecordMsg)), /*#__PURE__*/react_default.a.createElement(\"button\", {\n className: record_modal_default.a.okButton,\n disabled: props.encoding,\n onClick: props.onSubmit\n}, props.encoding ? props.intl.formatMessage(playback_step_messages.loadingMsg) : props.intl.formatMessage(playback_step_messages.saveMsg))));\nplayback_step_PlaybackStep.propTypes = {\n encoding: prop_types_default.a.bool.isRequired,\n intl: index_es[\"i\" /* intlShape */].isRequired,\n levels: prop_types_default.a.arrayOf(prop_types_default.a.number).isRequired,\n onBack: prop_types_default.a.func.isRequired,\n onPlay: prop_types_default.a.func.isRequired,\n onSetTrimEnd: prop_types_default.a.func.isRequired,\n onSetTrimStart: prop_types_default.a.func.isRequired,\n onStopPlaying: prop_types_default.a.func.isRequired,\n onSubmit: prop_types_default.a.func.isRequired,\n playhead: prop_types_default.a.number,\n playing: prop_types_default.a.bool.isRequired,\n trimEnd: prop_types_default.a.number.isRequired,\n trimStart: prop_types_default.a.number.isRequired\n};\n/* harmony default export */ var playback_step = (Object(index_es[\"h\" /* injectIntl */])(playback_step_PlaybackStep));\n// CONCATENATED MODULE: ./src/lib/audio/audio-buffer-player.js\n\nclass audio_buffer_player_AudioBufferPlayer {\n constructor(samples, sampleRate) {\n this.audioContext = new shared_audio_context();\n this.buffer = this.audioContext.createBuffer(1, samples.length, sampleRate);\n this.buffer.getChannelData(0).set(samples);\n this.source = null;\n this.startTime = null;\n this.updateCallback = null;\n this.trimStart = null;\n this.trimEnd = null;\n }\n play(trimStart, trimEnd, onUpdate, onEnded) {\n this.updateCallback = onUpdate;\n this.trimStart = trimStart;\n this.trimEnd = trimEnd;\n this.startTime = Date.now();\n const trimStartTime = this.buffer.duration * trimStart;\n const trimmedDuration = this.buffer.duration * trimEnd - trimStartTime;\n this.source = this.audioContext.createBufferSource();\n this.source.onended = onEnded;\n this.source.buffer = this.buffer;\n this.source.connect(this.audioContext.destination);\n this.source.start(0, trimStartTime, trimmedDuration);\n this.update();\n }\n update() {\n const timeSinceStart = (Date.now() - this.startTime) / 1000;\n const percentage = timeSinceStart / this.buffer.duration;\n if (percentage + this.trimStart < this.trimEnd && this.source.onended) {\n requestAnimationFrame(this.update.bind(this));\n this.updateCallback(percentage + this.trimStart);\n } else {\n this.updateCallback = null;\n }\n }\n stop() {\n if (this.source) {\n this.source.onended = null; // Do not call onEnded callback if manually stopped\n try {\n this.source.stop();\n } catch (e) {\n // This is probably Safari, which dies when you call stop more than once\n // which the spec says is allowed: https://developer.mozilla.org/en-US/docs/Web/API/AudioBufferSourceNode\n console.log('Caught error while stopping buffer source node.'); // eslint-disable-line no-console\n }\n }\n }\n}\n/* harmony default export */ var audio_buffer_player = (audio_buffer_player_AudioBufferPlayer);\n// CONCATENATED MODULE: ./src/containers/playback-step.jsx\nconst playback_step_excluded = [\"sampleRate\", \"onPlay\", \"onStopPlaying\", \"onSetPlayhead\"];\nfunction playback_step_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction playback_step_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? playback_step_ownKeys(Object(t), !0).forEach(function (r) { playback_step_defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : playback_step_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction playback_step_defineProperty(e, r, t) { return (r = playback_step_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction playback_step_toPropertyKey(t) { var i = playback_step_toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction playback_step_toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction playback_step_extends() { return playback_step_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, playback_step_extends.apply(null, arguments); }\nfunction playback_step_objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = playback_step_objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction playback_step_objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\n\nclass containers_playback_step_PlaybackStep extends react_default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['handlePlay', 'handleStopPlaying']);\n }\n componentDidMount() {\n this.audioBufferPlayer = new audio_buffer_player(this.props.samples, this.props.sampleRate);\n }\n componentWillUnmount() {\n this.audioBufferPlayer.stop();\n }\n handlePlay() {\n this.audioBufferPlayer.play(this.props.trimStart, this.props.trimEnd, this.props.onSetPlayhead, this.props.onStopPlaying);\n this.props.onPlay();\n }\n handleStopPlaying() {\n this.audioBufferPlayer.stop();\n this.props.onStopPlaying();\n }\n render() {\n const _this$props = this.props,\n {\n sampleRate,\n // eslint-disable-line no-unused-vars\n onPlay,\n // eslint-disable-line no-unused-vars\n onStopPlaying,\n // eslint-disable-line no-unused-vars\n onSetPlayhead // eslint-disable-line no-unused-vars\n } = _this$props,\n componentProps = playback_step_objectWithoutProperties(_this$props, playback_step_excluded);\n return /*#__PURE__*/react_default.a.createElement(playback_step, playback_step_extends({\n onPlay: this.handlePlay,\n onStopPlaying: this.handleStopPlaying\n }, componentProps));\n }\n}\ncontainers_playback_step_PlaybackStep.propTypes = playback_step_objectSpread({\n sampleRate: prop_types_default.a.number.isRequired,\n samples: prop_types_default.a.instanceOf(Float32Array).isRequired\n}, playback_step.propTypes);\n/* harmony default export */ var containers_playback_step = (containers_playback_step_PlaybackStep);\n// CONCATENATED MODULE: ./src/components/record-modal/record-modal.jsx\n\n\n\n\n\n\n\n\nconst record_modal_messages = Object(index_es[\"g\" /* defineMessages */])({\n title: {\n \"id\": \"gui.recordModal.title\",\n \"defaultMessage\": \"Record Sound\"\n }\n});\nconst record_modal_RecordModal = props => /*#__PURE__*/react_default.a.createElement(containers_modal, {\n className: record_modal_default.a.modalContent,\n contentLabel: props.intl.formatMessage(record_modal_messages.title),\n onRequestClose: props.onCancel\n}, /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: record_modal_default.a.body\n}, props.samples ? /*#__PURE__*/react_default.a.createElement(containers_playback_step, {\n encoding: props.encoding,\n levels: props.levels,\n playhead: props.playhead,\n playing: props.playing,\n sampleRate: props.sampleRate,\n samples: props.samples,\n trimEnd: props.trimEnd,\n trimStart: props.trimStart,\n onBack: props.onBack,\n onPlay: props.onPlay,\n onSetPlayhead: props.onSetPlayhead,\n onSetTrimEnd: props.onSetTrimEnd,\n onSetTrimStart: props.onSetTrimStart,\n onStopPlaying: props.onStopPlaying,\n onSubmit: props.onSubmit\n}) : /*#__PURE__*/react_default.a.createElement(containers_recording_step, {\n recording: props.recording,\n onRecord: props.onRecord,\n onStopRecording: props.onStopRecording\n})));\nrecord_modal_RecordModal.propTypes = {\n encoding: prop_types_default.a.bool.isRequired,\n intl: index_es[\"i\" /* intlShape */].isRequired,\n levels: prop_types_default.a.arrayOf(prop_types_default.a.number),\n onBack: prop_types_default.a.func.isRequired,\n onCancel: prop_types_default.a.func.isRequired,\n onPlay: prop_types_default.a.func.isRequired,\n onRecord: prop_types_default.a.func.isRequired,\n onSetPlayhead: prop_types_default.a.func.isRequired,\n onSetTrimEnd: prop_types_default.a.func.isRequired,\n onSetTrimStart: prop_types_default.a.func.isRequired,\n onStopPlaying: prop_types_default.a.func.isRequired,\n onStopRecording: prop_types_default.a.func.isRequired,\n onSubmit: prop_types_default.a.func.isRequired,\n playhead: prop_types_default.a.number,\n playing: prop_types_default.a.bool,\n recording: prop_types_default.a.bool,\n sampleRate: prop_types_default.a.number,\n samples: prop_types_default.a.instanceOf(Float32Array),\n trimEnd: prop_types_default.a.number.isRequired,\n trimStart: prop_types_default.a.number.isRequired\n};\n/* harmony default export */ var record_modal_record_modal = (Object(index_es[\"h\" /* injectIntl */])(record_modal_RecordModal));\n// CONCATENATED MODULE: ./src/containers/record-modal.jsx\n\n\n\n\n\n\n\n\nclass containers_record_modal_RecordModal extends react_default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['handleRecord', 'handleStopRecording', 'handlePlay', 'handleStopPlaying', 'handleBack', 'handleSubmit', 'handleCancel', 'handleSetPlayhead', 'handleSetTrimStart', 'handleSetTrimEnd']);\n this.state = {\n samples: null,\n encoding: false,\n levels: null,\n playhead: null,\n playing: false,\n recording: false,\n sampleRate: null,\n trimStart: 0,\n trimEnd: 1\n };\n }\n handleRecord() {\n this.setState({\n recording: true\n });\n }\n handleStopRecording(samples, sampleRate, levels, trimStart, trimEnd) {\n if (samples.length > 0) {\n this.setState({\n samples,\n sampleRate,\n levels,\n trimStart,\n trimEnd,\n recording: false\n });\n }\n }\n handlePlay() {\n this.setState({\n playing: true\n });\n }\n handleStopPlaying() {\n this.setState({\n playing: false,\n playhead: null\n });\n }\n handleBack() {\n this.setState({\n playing: false,\n samples: null\n });\n }\n handleSetTrimEnd(trimEnd) {\n this.setState({\n trimEnd\n });\n }\n handleSetTrimStart(trimStart) {\n this.setState({\n trimStart\n });\n }\n handleSetPlayhead(playhead) {\n this.setState({\n playhead\n });\n }\n handleSubmit() {\n this.setState({\n encoding: true\n }, () => {\n const sampleCount = this.state.samples.length;\n const startIndex = Math.floor(this.state.trimStart * sampleCount);\n const endIndex = Math.floor(this.state.trimEnd * sampleCount);\n const clippedSamples = this.state.samples.slice(startIndex, endIndex);\n audio_util_encodeAndAddSoundToVM(this.props.vm, clippedSamples, this.state.sampleRate, 'recording1', () => {\n this.props.onClose();\n this.props.onNewSound();\n });\n });\n }\n handleCancel() {\n this.props.onClose();\n }\n render() {\n return /*#__PURE__*/react_default.a.createElement(record_modal_record_modal, {\n encoding: this.state.encoding,\n levels: this.state.levels,\n playhead: this.state.playhead,\n playing: this.state.playing,\n recording: this.state.recording,\n sampleRate: this.state.sampleRate,\n samples: this.state.samples,\n trimEnd: this.state.trimEnd,\n trimStart: this.state.trimStart,\n onBack: this.handleBack,\n onCancel: this.handleCancel,\n onPlay: this.handlePlay,\n onRecord: this.handleRecord,\n onSetPlayhead: this.handleSetPlayhead,\n onSetTrimEnd: this.handleSetTrimEnd,\n onSetTrimStart: this.handleSetTrimStart,\n onStopPlaying: this.handleStopPlaying,\n onStopRecording: this.handleStopRecording,\n onSubmit: this.handleSubmit\n });\n }\n}\ncontainers_record_modal_RecordModal.propTypes = {\n onClose: prop_types_default.a.func,\n onNewSound: prop_types_default.a.func,\n vm: prop_types_default.a.instanceOf(src_default.a)\n};\nconst record_modal_mapStateToProps = state => ({\n vm: state.scratchGui.vm\n});\nconst record_modal_mapDispatchToProps = dispatch => ({\n onClose: () => {\n dispatch(Object(modals[\"l\" /* closeSoundRecorder */])());\n }\n});\n/* harmony default export */ var containers_record_modal = (Object(react_redux_es[\"b\" /* connect */])(record_modal_mapStateToProps, record_modal_mapDispatchToProps)(containers_record_modal_RecordModal));\n// CONCATENATED MODULE: ./src/lib/audio/effects/echo-effect.js\nclass EchoEffect {\n static get DELAY_TIME() {\n return 0.25;\n }\n static get TAIL_SECONDS() {\n return 0.75;\n }\n constructor(audioContext, startTime, endTime) {\n this.audioContext = audioContext;\n this.input = this.audioContext.createGain();\n this.output = this.audioContext.createGain();\n this.effectInput = this.audioContext.createGain();\n this.effectInput.gain.value = 0;\n this.effectInput.gain.setValueAtTime(0.75, startTime);\n this.effectInput.gain.setValueAtTime(0, endTime);\n this.delay = this.audioContext.createDelay(1);\n this.delay.delayTime.value = EchoEffect.DELAY_TIME;\n this.decay = this.audioContext.createGain();\n this.decay.gain.value = 0.3;\n this.compressor = this.audioContext.createDynamicsCompressor();\n this.compressor.threshold.value = -5;\n this.compressor.knee.value = 15;\n this.compressor.ratio.value = 12;\n this.compressor.attack.value = 0;\n this.compressor.release.value = 0.25;\n this.input.connect(this.effectInput);\n this.effectInput.connect(this.delay);\n this.delay.connect(this.compressor);\n this.input.connect(this.compressor);\n this.delay.connect(this.decay);\n this.decay.connect(this.delay);\n this.compressor.connect(this.output);\n }\n}\n/* harmony default export */ var echo_effect = (EchoEffect);\n// CONCATENATED MODULE: ./src/lib/audio/effects/robot-effect.js\nclass RobotEffect {\n constructor(audioContext, startTime, endTime) {\n this.audioContext = audioContext;\n this.input = this.audioContext.createGain();\n this.output = this.audioContext.createGain();\n this.passthrough = this.audioContext.createGain();\n this.effectInput = this.audioContext.createGain();\n this.passthrough.gain.value = 1;\n this.effectInput.gain.value = 0;\n this.passthrough.gain.setValueAtTime(0, startTime);\n this.passthrough.gain.setValueAtTime(1, endTime);\n this.effectInput.gain.setValueAtTime(1, startTime);\n this.effectInput.gain.setValueAtTime(0, endTime);\n\n // Ring modulator inspired by BBC Dalek voice\n // http://recherche.ircam.fr/pub/dafx11/Papers/66_e.pdf\n // https://github.com/bbc/webaudio.prototyping.bbc.co.uk\n\n // > There are four parallel signal paths, two which process the\n // > combination Vc + Vin / 2 and two which process Vc - Vin/2.\n // > Each branch consists of a non-linearity [diode]...\n const createDiodeNode = () => {\n const node = this.audioContext.createWaveShaper();\n\n // Piecewise function given by (2) in Parker paper\n const transform = function transform(v) {\n let vb = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0.2;\n let vl = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0.4;\n let h = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0.65;\n if (v <= vb) return 0;\n if (v <= vl) return h * (Math.pow(v - vb, 2) / (2 * vl - 2 * vb));\n return h * v - h * vl + h * (Math.pow(v - vb, 2) / (2 * vl - 2 * vb));\n };\n\n // Create the waveshaper curve with the voltage transform above\n const bufferLength = 1024;\n const curve = new Float32Array(bufferLength);\n for (let i = 0; i < bufferLength; i++) {\n const voltage = 2 * (i / bufferLength) - 1;\n curve[i] = transform(voltage);\n }\n node.curve = curve;\n return node;\n };\n const oscillator = this.audioContext.createOscillator();\n oscillator.frequency.value = 50;\n oscillator.start(0);\n const vInGain = this.audioContext.createGain();\n vInGain.gain.value = 0.5;\n const vInInverter1 = this.audioContext.createGain();\n vInInverter1.gain.value = -1;\n const vInInverter2 = this.audioContext.createGain();\n vInInverter2.gain.value = -1;\n const vInDiode1 = createDiodeNode(this.audioContext);\n const vInDiode2 = createDiodeNode(this.audioContext);\n const vInInverter3 = this.audioContext.createGain();\n vInInverter3.gain.value = -1;\n const vcInverter1 = this.audioContext.createGain();\n vcInverter1.gain.value = -1;\n const vcDiode3 = createDiodeNode(this.audioContext);\n const vcDiode4 = createDiodeNode(this.audioContext);\n const compressor = this.audioContext.createDynamicsCompressor();\n compressor.threshold.value = -5;\n compressor.knee.value = 15;\n compressor.ratio.value = 12;\n compressor.attack.value = 0;\n compressor.release.value = 0.25;\n const biquadFilter = this.audioContext.createBiquadFilter();\n biquadFilter.type = 'highpass';\n biquadFilter.frequency.value = 1000;\n biquadFilter.gain.value = 1.25;\n this.input.connect(this.effectInput);\n this.input.connect(this.passthrough);\n this.passthrough.connect(this.output);\n this.effectInput.connect(vcInverter1);\n this.effectInput.connect(vcDiode4);\n vcInverter1.connect(vcDiode3);\n oscillator.connect(vInGain);\n vInGain.connect(vInInverter1);\n vInGain.connect(vcInverter1);\n vInGain.connect(vcDiode4);\n vInInverter1.connect(vInInverter2);\n vInInverter1.connect(vInDiode2);\n vInInverter2.connect(vInDiode1);\n vInDiode1.connect(vInInverter3);\n vInDiode2.connect(vInInverter3);\n vInInverter3.connect(compressor);\n vcDiode3.connect(compressor);\n vcDiode4.connect(compressor);\n this.effectInput.connect(biquadFilter);\n biquadFilter.connect(compressor);\n compressor.connect(this.output);\n }\n}\n/* harmony default export */ var robot_effect = (RobotEffect);\n// CONCATENATED MODULE: ./src/lib/audio/effects/volume-effect.js\nclass VolumeEffect {\n constructor(audioContext, volume, startSeconds, endSeconds) {\n this.audioContext = audioContext;\n this.input = this.audioContext.createGain();\n this.output = this.audioContext.createGain();\n this.gain = this.audioContext.createGain();\n\n // Smoothly ramp the gain up before the start time, and down after the end time.\n this.rampLength = 0.01;\n this.gain.gain.setValueAtTime(1.0, Math.max(0, startSeconds - this.rampLength));\n this.gain.gain.exponentialRampToValueAtTime(volume, startSeconds);\n this.gain.gain.setValueAtTime(volume, endSeconds);\n this.gain.gain.exponentialRampToValueAtTime(1.0, endSeconds + this.rampLength);\n this.input.connect(this.gain);\n this.gain.connect(this.output);\n }\n}\n/* harmony default export */ var volume_effect = (VolumeEffect);\n// CONCATENATED MODULE: ./src/lib/audio/effects/fade-effect.js\nclass FadeEffect {\n constructor(audioContext, fadeIn, startSeconds, endSeconds) {\n this.audioContext = audioContext;\n this.input = this.audioContext.createGain();\n this.output = this.audioContext.createGain();\n this.gain = this.audioContext.createGain();\n this.gain.gain.setValueAtTime(1, 0);\n if (fadeIn) {\n this.gain.gain.setValueAtTime(0, startSeconds);\n this.gain.gain.linearRampToValueAtTime(1, endSeconds);\n } else {\n this.gain.gain.setValueAtTime(1, startSeconds);\n this.gain.gain.linearRampToValueAtTime(0, endSeconds);\n }\n this.gain.gain.setValueAtTime(1, endSeconds);\n this.input.connect(this.gain);\n this.gain.connect(this.output);\n }\n}\n/* harmony default export */ var fade_effect = (FadeEffect);\n// CONCATENATED MODULE: ./src/lib/audio/effects/mute-effect.js\nclass MuteEffect {\n constructor(audioContext, startSeconds, endSeconds) {\n this.audioContext = audioContext;\n this.input = this.audioContext.createGain();\n this.output = this.audioContext.createGain();\n this.gain = this.audioContext.createGain();\n\n // Smoothly ramp the gain down before the start time, and up after the end time.\n this.rampLength = 0.001;\n this.gain.gain.setValueAtTime(1.0, Math.max(0, startSeconds - this.rampLength));\n this.gain.gain.linearRampToValueAtTime(0, startSeconds);\n this.gain.gain.setValueAtTime(0, endSeconds);\n this.gain.gain.linearRampToValueAtTime(1.0, endSeconds + this.rampLength);\n this.input.connect(this.gain);\n this.gain.connect(this.output);\n }\n}\n/* harmony default export */ var mute_effect = (MuteEffect);\n// CONCATENATED MODULE: ./src/lib/audio/audio-effects.js\n\n\n\n\n\nconst audio_effects_effectTypes = {\n ROBOT: 'robot',\n REVERSE: 'reverse',\n LOUDER: 'higher',\n SOFTER: 'lower',\n FASTER: 'faster',\n SLOWER: 'slower',\n ECHO: 'echo',\n FADEIN: 'fade in',\n FADEOUT: 'fade out',\n MUTE: 'mute'\n};\nclass audio_effects_AudioEffects {\n static get effectTypes() {\n return audio_effects_effectTypes;\n }\n constructor(buffer, name, trimStart, trimEnd) {\n this.trimStartSeconds = trimStart * buffer.length / buffer.sampleRate;\n this.trimEndSeconds = trimEnd * buffer.length / buffer.sampleRate;\n this.adjustedTrimStartSeconds = this.trimStartSeconds;\n this.adjustedTrimEndSeconds = this.trimEndSeconds;\n\n // Some effects will modify the playback rate and/or number of samples.\n // Need to precompute those values to create the offline audio context.\n const pitchRatio = Math.pow(2, 4 / 12); // A major third\n let sampleCount = buffer.length;\n const affectedSampleCount = Math.floor((this.trimEndSeconds - this.trimStartSeconds) * buffer.sampleRate);\n let adjustedAffectedSampleCount = affectedSampleCount;\n const unaffectedSampleCount = sampleCount - affectedSampleCount;\n this.playbackRate = 1;\n switch (name) {\n case audio_effects_effectTypes.ECHO:\n sampleCount = Math.max(sampleCount, Math.floor((this.trimEndSeconds + echo_effect.TAIL_SECONDS) * buffer.sampleRate));\n break;\n case audio_effects_effectTypes.FASTER:\n this.playbackRate = pitchRatio;\n adjustedAffectedSampleCount = Math.floor(affectedSampleCount / this.playbackRate);\n sampleCount = unaffectedSampleCount + adjustedAffectedSampleCount;\n break;\n case audio_effects_effectTypes.SLOWER:\n this.playbackRate = 1 / pitchRatio;\n adjustedAffectedSampleCount = Math.floor(affectedSampleCount / this.playbackRate);\n sampleCount = unaffectedSampleCount + adjustedAffectedSampleCount;\n break;\n }\n const durationSeconds = sampleCount / buffer.sampleRate;\n this.adjustedTrimEndSeconds = this.trimStartSeconds + adjustedAffectedSampleCount / buffer.sampleRate;\n this.adjustedTrimStart = this.adjustedTrimStartSeconds / durationSeconds;\n this.adjustedTrimEnd = this.adjustedTrimEndSeconds / durationSeconds;\n if (window.OfflineAudioContext) {\n this.audioContext = new window.OfflineAudioContext(1, sampleCount, buffer.sampleRate);\n } else {\n // Need to use webkitOfflineAudioContext, which doesn't support all sample rates.\n // Resample by adjusting sample count to make room and set offline context to desired sample rate.\n const sampleScale = 44100 / buffer.sampleRate;\n this.audioContext = new window.webkitOfflineAudioContext(1, sampleScale * sampleCount, 44100);\n }\n\n // For the reverse effect we need to manually reverse the data into a new audio buffer\n // to prevent overwriting the original, so that the undo stack works correctly.\n // Doing buffer.reverse() would mutate the original data.\n if (name === audio_effects_effectTypes.REVERSE) {\n const originalBufferData = buffer.getChannelData(0);\n const newBuffer = this.audioContext.createBuffer(1, buffer.length, buffer.sampleRate);\n const newBufferData = newBuffer.getChannelData(0);\n const bufferLength = buffer.length;\n const startSamples = Math.floor(this.trimStartSeconds * buffer.sampleRate);\n const endSamples = Math.floor(this.trimEndSeconds * buffer.sampleRate);\n let counter = 0;\n for (let i = 0; i < bufferLength; i++) {\n if (i >= startSamples && i < endSamples) {\n newBufferData[i] = originalBufferData[endSamples - counter - 1];\n counter++;\n } else {\n newBufferData[i] = originalBufferData[i];\n }\n }\n this.buffer = newBuffer;\n } else {\n // All other effects use the original buffer because it is not modified.\n this.buffer = buffer;\n }\n this.source = this.audioContext.createBufferSource();\n this.source.buffer = this.buffer;\n this.name = name;\n }\n process(done) {\n // Some effects need to use more nodes and must expose an input and output\n let input;\n let output;\n switch (this.name) {\n case audio_effects_effectTypes.FASTER:\n case audio_effects_effectTypes.SLOWER:\n this.source.playbackRate.setValueAtTime(this.playbackRate, this.adjustedTrimStartSeconds);\n this.source.playbackRate.setValueAtTime(1.0, this.adjustedTrimEndSeconds);\n break;\n case audio_effects_effectTypes.LOUDER:\n ({\n input,\n output\n } = new volume_effect(this.audioContext, 1.25, this.adjustedTrimStartSeconds, this.adjustedTrimEndSeconds));\n break;\n case audio_effects_effectTypes.SOFTER:\n ({\n input,\n output\n } = new volume_effect(this.audioContext, 0.75, this.adjustedTrimStartSeconds, this.adjustedTrimEndSeconds));\n break;\n case audio_effects_effectTypes.ECHO:\n ({\n input,\n output\n } = new echo_effect(this.audioContext, this.adjustedTrimStartSeconds, this.adjustedTrimEndSeconds));\n break;\n case audio_effects_effectTypes.ROBOT:\n ({\n input,\n output\n } = new robot_effect(this.audioContext, this.adjustedTrimStartSeconds, this.adjustedTrimEndSeconds));\n break;\n case audio_effects_effectTypes.FADEIN:\n ({\n input,\n output\n } = new fade_effect(this.audioContext, true, this.adjustedTrimStartSeconds, this.adjustedTrimEndSeconds));\n break;\n case audio_effects_effectTypes.FADEOUT:\n ({\n input,\n output\n } = new fade_effect(this.audioContext, false, this.adjustedTrimStartSeconds, this.adjustedTrimEndSeconds));\n break;\n case audio_effects_effectTypes.MUTE:\n ({\n input,\n output\n } = new mute_effect(this.audioContext, this.adjustedTrimStartSeconds, this.adjustedTrimEndSeconds));\n break;\n }\n if (input && output) {\n this.source.connect(input);\n output.connect(this.audioContext.destination);\n } else {\n // No effects nodes are needed, wire directly to the output\n this.source.connect(this.audioContext.destination);\n }\n this.source.start();\n this.audioContext.startRendering();\n this.audioContext.oncomplete = _ref => {\n let {\n renderedBuffer\n } = _ref;\n done(renderedBuffer, this.adjustedTrimStart, this.adjustedTrimEnd);\n };\n }\n}\n/* harmony default export */ var audio_effects = (audio_effects_AudioEffects);\n// CONCATENATED MODULE: ./src/components/audio-trimmer/audio-selector.jsx\n\n\n\n\n\n\n\nconst audio_selector_AudioSelector = props => /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: classnames_default()(audio_trimmer_default.a.absolute, audio_trimmer_default.a.selector),\n ref: props.containerRef,\n onMouseDown: props.onNewSelectionMouseDown,\n onTouchStart: props.onNewSelectionMouseDown\n}, props.trimStart === null ? null : /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: classnames_default()(audio_trimmer_default.a.absolute),\n style: {\n left: \"\".concat(props.trimStart * 100, \"%\"),\n width: \"\".concat(100 * (props.trimEnd - props.trimStart), \"%\")\n }\n}, /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: classnames_default()(audio_trimmer_default.a.absolute, audio_trimmer_default.a.selectionBackground)\n}), /*#__PURE__*/react_default.a.createElement(selection_handle, {\n handleStyle: audio_trimmer_default.a.leftHandle,\n onMouseDown: props.onTrimStartMouseDown\n}), /*#__PURE__*/react_default.a.createElement(selection_handle, {\n handleStyle: audio_trimmer_default.a.rightHandle,\n onMouseDown: props.onTrimEndMouseDown\n})), props.playhead ? /*#__PURE__*/react_default.a.createElement(playhead, {\n playbackPosition: props.playhead\n}) : null);\naudio_selector_AudioSelector.propTypes = {\n containerRef: prop_types_default.a.func,\n onNewSelectionMouseDown: prop_types_default.a.func.isRequired,\n onTrimEndMouseDown: prop_types_default.a.func.isRequired,\n onTrimStartMouseDown: prop_types_default.a.func.isRequired,\n playhead: prop_types_default.a.number,\n trimEnd: prop_types_default.a.number,\n trimStart: prop_types_default.a.number\n};\n/* harmony default export */ var audio_selector = (audio_selector_AudioSelector);\n// CONCATENATED MODULE: ./src/containers/audio-selector.jsx\n\n\n\n\n\n\nconst audio_selector_MIN_LENGTH = 0.01;\nconst MIN_DURATION = 500;\nclass containers_audio_selector_AudioSelector extends react_default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['handleNewSelectionMouseDown', 'handleTrimStartMouseDown', 'handleTrimEndMouseDown', 'handleTrimStartMouseMove', 'handleTrimEndMouseMove', 'handleTrimStartMouseUp', 'handleTrimEndMouseUp', 'storeRef']);\n this.state = {\n trimStart: props.trimStart,\n trimEnd: props.trimEnd\n };\n this.clickStartTime = 0;\n this.trimStartDragRecognizer = new drag_recognizer({\n onDrag: this.handleTrimStartMouseMove,\n onDragEnd: this.handleTrimStartMouseUp,\n touchDragAngle: 90,\n distanceThreshold: 0\n });\n this.trimEndDragRecognizer = new drag_recognizer({\n onDrag: this.handleTrimEndMouseMove,\n onDragEnd: this.handleTrimEndMouseUp,\n touchDragAngle: 90,\n distanceThreshold: 0\n });\n }\n componentWillReceiveProps(newProps) {\n const {\n trimStart,\n trimEnd\n } = this.props;\n if (newProps.trimStart === trimStart && newProps.trimEnd === trimEnd) return;\n this.setState({\n trimStart: newProps.trimStart,\n trimEnd: newProps.trimEnd\n });\n }\n clearSelection() {\n this.props.onSetTrim(null, null);\n }\n handleNewSelectionMouseDown(e) {\n const {\n width,\n left\n } = this.containerElement.getBoundingClientRect();\n this.initialTrimEnd = (getEventXY(e).x - left) / width;\n this.initialTrimStart = this.initialTrimEnd;\n this.props.onSetTrim(this.initialTrimStart, this.initialTrimEnd);\n this.clickStartTime = Date.now();\n this.containerSize = width;\n this.trimEndDragRecognizer.start(e);\n e.preventDefault();\n }\n handleTrimStartMouseMove(currentOffset, initialOffset) {\n const dx = (currentOffset.x - initialOffset.x) / this.containerSize;\n const newTrim = Math.max(0, Math.min(1, this.initialTrimStart + dx));\n if (newTrim > this.initialTrimEnd) {\n this.setState({\n trimStart: this.initialTrimEnd,\n trimEnd: newTrim\n });\n } else {\n this.setState({\n trimStart: newTrim,\n trimEnd: this.initialTrimEnd\n });\n }\n }\n handleTrimEndMouseMove(currentOffset, initialOffset) {\n const dx = (currentOffset.x - initialOffset.x) / this.containerSize;\n const newTrim = Math.min(1, Math.max(0, this.initialTrimEnd + dx));\n if (newTrim < this.initialTrimStart) {\n this.setState({\n trimStart: newTrim,\n trimEnd: this.initialTrimStart\n });\n } else {\n this.setState({\n trimStart: this.initialTrimStart,\n trimEnd: newTrim\n });\n }\n }\n handleTrimStartMouseUp() {\n this.props.onSetTrim(this.state.trimStart, this.state.trimEnd);\n }\n handleTrimEndMouseUp() {\n // If the selection was made quickly (tooFast) and is small (tooShort),\n // deselect instead. This allows click-to-deselect even if you drag\n // a little bit by accident. It also allows very quickly making a\n // selection, as long as it is above a minimum length.\n const tooFast = Date.now() - this.clickStartTime < MIN_DURATION;\n const tooShort = this.state.trimEnd - this.state.trimStart < audio_selector_MIN_LENGTH;\n if (tooFast && tooShort) {\n this.clearSelection();\n } else {\n this.props.onSetTrim(this.state.trimStart, this.state.trimEnd);\n }\n }\n handleTrimStartMouseDown(e) {\n this.containerSize = this.containerElement.getBoundingClientRect().width;\n this.trimStartDragRecognizer.start(e);\n this.initialTrimStart = this.props.trimStart;\n this.initialTrimEnd = this.props.trimEnd;\n e.stopPropagation();\n e.preventDefault();\n }\n handleTrimEndMouseDown(e) {\n this.containerSize = this.containerElement.getBoundingClientRect().width;\n this.trimEndDragRecognizer.start(e);\n this.initialTrimEnd = this.props.trimEnd;\n this.initialTrimStart = this.props.trimStart;\n e.stopPropagation();\n e.preventDefault();\n }\n storeRef(el) {\n this.containerElement = el;\n }\n render() {\n return /*#__PURE__*/react_default.a.createElement(audio_selector, {\n containerRef: this.storeRef,\n playhead: this.props.playhead,\n trimEnd: this.state.trimEnd,\n trimStart: this.state.trimStart,\n onNewSelectionMouseDown: this.handleNewSelectionMouseDown,\n onTrimEndMouseDown: this.handleTrimEndMouseDown,\n onTrimStartMouseDown: this.handleTrimStartMouseDown\n });\n }\n}\ncontainers_audio_selector_AudioSelector.propTypes = {\n onSetTrim: prop_types_default.a.func,\n playhead: prop_types_default.a.number,\n trimEnd: prop_types_default.a.number,\n trimStart: prop_types_default.a.number\n};\n/* harmony default export */ var containers_audio_selector = (containers_audio_selector_AudioSelector);\n// EXTERNAL MODULE: ./src/components/icon-button/icon-button.css\nvar icon_button = __webpack_require__(165);\nvar icon_button_default = /*#__PURE__*/__webpack_require__.n(icon_button);\n\n// CONCATENATED MODULE: ./src/components/icon-button/icon-button.jsx\n\n\n\n\n\nconst IconButton = _ref => {\n let {\n img,\n disabled,\n className,\n title,\n onClick\n } = _ref;\n return /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: classnames_default()(icon_button_default.a.container, className, disabled ? icon_button_default.a.disabled : null),\n role: \"button\",\n onClick: disabled ? null : onClick\n }, /*#__PURE__*/react_default.a.createElement(render, {\n className: icon_button_default.a.icon,\n draggable: false,\n src: img\n }), /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: icon_button_default.a.title\n }, title));\n};\nIconButton.propTypes = {\n className: prop_types_default.a.string,\n disabled: prop_types_default.a.bool,\n img: prop_types_default.a.oneOfType([prop_types_default.a.func, prop_types_default.a.string]),\n onClick: prop_types_default.a.func.isRequired,\n title: prop_types_default.a.node.isRequired\n};\n/* harmony default export */ var icon_button_icon_button = (IconButton);\n// EXTERNAL MODULE: ./src/components/sound-editor/sound-editor.css\nvar sound_editor = __webpack_require__(19);\nvar sound_editor_default = /*#__PURE__*/__webpack_require__.n(sound_editor);\n\n// EXTERNAL MODULE: ./src/components/sound-editor/icon--play.svg\nvar sound_editor_icon_play = __webpack_require__(327);\nvar sound_editor_icon_play_default = /*#__PURE__*/__webpack_require__.n(sound_editor_icon_play);\n\n// EXTERNAL MODULE: ./src/components/sound-editor/icon--stop.svg\nvar sound_editor_icon_stop = __webpack_require__(328);\nvar sound_editor_icon_stop_default = /*#__PURE__*/__webpack_require__.n(sound_editor_icon_stop);\n\n// CONCATENATED MODULE: ./src/lib/tw-recolor/build.js!./src/components/sound-editor/icon--redo.svg\n\n const icon_redo_original = \"\\n\\n \\n redo\\n Created with Sketch.\\n \\n \\n \\n \\n \\n \\n\\n\";\n\n const icon_redo_getSRC = () => {\n const recolored = typeof Recolor === 'object' ? (\n icon_redo_original.replace(/#855cd6/gi, Recolor.primary)\n ) : icon_redo_original;\n return 'data:image/svg+xml;,' + encodeURIComponent(recolored);\n };\n\n /* harmony default export */ var icon_redo = (icon_redo_getSRC);\n\n// CONCATENATED MODULE: ./src/lib/tw-recolor/build.js!./src/components/sound-editor/icon--undo.svg\n\n const icon_undo_original = \"\\n\\n \\n undo\\n Created with Sketch.\\n \\n \\n \\n \\n \\n \\n\\n\";\n\n const icon_undo_getSRC = () => {\n const recolored = typeof Recolor === 'object' ? (\n icon_undo_original.replace(/#855cd6/gi, Recolor.primary)\n ) : icon_undo_original;\n return 'data:image/svg+xml;,' + encodeURIComponent(recolored);\n };\n\n /* harmony default export */ var icon_undo = (icon_undo_getSRC);\n\n// EXTERNAL MODULE: ./src/components/sound-editor/icon--faster.svg\nvar icon_faster = __webpack_require__(329);\nvar icon_faster_default = /*#__PURE__*/__webpack_require__.n(icon_faster);\n\n// EXTERNAL MODULE: ./src/components/sound-editor/icon--slower.svg\nvar icon_slower = __webpack_require__(330);\nvar icon_slower_default = /*#__PURE__*/__webpack_require__.n(icon_slower);\n\n// EXTERNAL MODULE: ./src/components/sound-editor/icon--louder.svg\nvar icon_louder = __webpack_require__(331);\nvar icon_louder_default = /*#__PURE__*/__webpack_require__.n(icon_louder);\n\n// EXTERNAL MODULE: ./src/components/sound-editor/icon--softer.svg\nvar icon_softer = __webpack_require__(332);\nvar icon_softer_default = /*#__PURE__*/__webpack_require__.n(icon_softer);\n\n// EXTERNAL MODULE: ./src/components/sound-editor/icon--robot.svg\nvar icon_robot = __webpack_require__(333);\nvar icon_robot_default = /*#__PURE__*/__webpack_require__.n(icon_robot);\n\n// EXTERNAL MODULE: ./src/components/sound-editor/icon--echo.svg\nvar icon_echo = __webpack_require__(334);\nvar icon_echo_default = /*#__PURE__*/__webpack_require__.n(icon_echo);\n\n// EXTERNAL MODULE: ./src/components/sound-editor/icon--reverse.svg\nvar icon_reverse = __webpack_require__(335);\nvar icon_reverse_default = /*#__PURE__*/__webpack_require__.n(icon_reverse);\n\n// EXTERNAL MODULE: ./src/components/sound-editor/icon--fade-out.svg\nvar icon_fade_out = __webpack_require__(336);\nvar icon_fade_out_default = /*#__PURE__*/__webpack_require__.n(icon_fade_out);\n\n// EXTERNAL MODULE: ./src/components/sound-editor/icon--fade-in.svg\nvar icon_fade_in = __webpack_require__(337);\nvar icon_fade_in_default = /*#__PURE__*/__webpack_require__.n(icon_fade_in);\n\n// EXTERNAL MODULE: ./src/components/sound-editor/icon--mute.svg\nvar icon_mute = __webpack_require__(338);\nvar icon_mute_default = /*#__PURE__*/__webpack_require__.n(icon_mute);\n\n// CONCATENATED MODULE: ./src/lib/tw-recolor/build.js!./src/components/sound-editor/icon--delete.svg\n\n const icon_delete_original = \"\\n\\n \\n Sound/General/Trim\\n Created with Sketch.\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n\\n\";\n\n const icon_delete_getSRC = () => {\n const recolored = typeof Recolor === 'object' ? (\n icon_delete_original.replace(/#855cd6/gi, Recolor.primary)\n ) : icon_delete_original;\n return 'data:image/svg+xml;,' + encodeURIComponent(recolored);\n };\n\n /* harmony default export */ var sound_editor_icon_delete = (icon_delete_getSRC);\n\n// CONCATENATED MODULE: ./src/lib/tw-recolor/build.js!./src/components/sound-editor/icon--copy.svg\n\n const icon_copy_original = \"\\n\\n \\n Sound/General/Copy\\n Created with Sketch.\\n \\n \\n \\n \\n \\n \\n \\n \\n\\n\";\n\n const icon_copy_getSRC = () => {\n const recolored = typeof Recolor === 'object' ? (\n icon_copy_original.replace(/#855cd6/gi, Recolor.primary)\n ) : icon_copy_original;\n return 'data:image/svg+xml;,' + encodeURIComponent(recolored);\n };\n\n /* harmony default export */ var icon_copy = (icon_copy_getSRC);\n\n// CONCATENATED MODULE: ./src/lib/tw-recolor/build.js!./src/components/sound-editor/icon--paste.svg\n\n const icon_paste_original = \"\\n\\n \\n Sound/General/Paste\\n Created with Sketch.\\n \\n \\n \\n\\n\";\n\n const icon_paste_getSRC = () => {\n const recolored = typeof Recolor === 'object' ? (\n icon_paste_original.replace(/#855cd6/gi, Recolor.primary)\n ) : icon_paste_original;\n return 'data:image/svg+xml;,' + encodeURIComponent(recolored);\n };\n\n /* harmony default export */ var icon_paste = (icon_paste_getSRC);\n\n// CONCATENATED MODULE: ./src/lib/tw-recolor/build.js!./src/components/sound-editor/icon--copy-to-new.svg\n\n const icon_copy_to_new_original = \"\\n\\n \\n Sound/General/Copy to New\\n Created with Sketch.\\n \\n \\n \\n\\n\";\n\n const icon_copy_to_new_getSRC = () => {\n const recolored = typeof Recolor === 'object' ? (\n icon_copy_to_new_original.replace(/#855cd6/gi, Recolor.primary)\n ) : icon_copy_to_new_original;\n return 'data:image/svg+xml;,' + encodeURIComponent(recolored);\n };\n\n /* harmony default export */ var icon_copy_to_new = (icon_copy_to_new_getSRC);\n\n// CONCATENATED MODULE: ./src/components/sound-editor/sound-editor.jsx\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst sound_editor_BufferedInput = Object(buffered_input_hoc[\"a\" /* default */])(forms_input[\"a\" /* default */]);\nconst sound_editor_messages = Object(index_es[\"g\" /* defineMessages */])({\n sound: {\n \"id\": \"gui.soundEditor.sound\",\n \"defaultMessage\": \"Sound\"\n },\n play: {\n \"id\": \"gui.soundEditor.play\",\n \"defaultMessage\": \"Play\"\n },\n stop: {\n \"id\": \"gui.soundEditor.stop\",\n \"defaultMessage\": \"Stop\"\n },\n copy: {\n \"id\": \"gui.soundEditor.copy\",\n \"defaultMessage\": \"Copy\"\n },\n paste: {\n \"id\": \"gui.soundEditor.paste\",\n \"defaultMessage\": \"Paste\"\n },\n copyToNew: {\n \"id\": \"gui.soundEditor.copyToNew\",\n \"defaultMessage\": \"Copy to New\"\n },\n delete: {\n \"id\": \"gui.soundEditor.delete\",\n \"defaultMessage\": \"Delete\"\n },\n save: {\n \"id\": \"gui.soundEditor.save\",\n \"defaultMessage\": \"Save\"\n },\n undo: {\n \"id\": \"gui.soundEditor.undo\",\n \"defaultMessage\": \"Undo\"\n },\n redo: {\n \"id\": \"gui.soundEditor.redo\",\n \"defaultMessage\": \"Redo\"\n },\n faster: {\n \"id\": \"gui.soundEditor.faster\",\n \"defaultMessage\": \"Faster\"\n },\n slower: {\n \"id\": \"gui.soundEditor.slower\",\n \"defaultMessage\": \"Slower\"\n },\n echo: {\n \"id\": \"gui.soundEditor.echo\",\n \"defaultMessage\": \"Echo\"\n },\n robot: {\n \"id\": \"gui.soundEditor.robot\",\n \"defaultMessage\": \"Robot\"\n },\n louder: {\n \"id\": \"gui.soundEditor.louder\",\n \"defaultMessage\": \"Louder\"\n },\n softer: {\n \"id\": \"gui.soundEditor.softer\",\n \"defaultMessage\": \"Softer\"\n },\n reverse: {\n \"id\": \"gui.soundEditor.reverse\",\n \"defaultMessage\": \"Reverse\"\n },\n fadeOut: {\n \"id\": \"gui.soundEditor.fadeOut\",\n \"defaultMessage\": \"Fade out\"\n },\n fadeIn: {\n \"id\": \"gui.soundEditor.fadeIn\",\n \"defaultMessage\": \"Fade in\"\n },\n mute: {\n \"id\": \"gui.soundEditor.mute\",\n \"defaultMessage\": \"Mute\"\n }\n});\nconst formatTime = timeSeconds => {\n const minutes = Math.floor(timeSeconds / 60).toString().padStart(2, '0');\n const seconds = (timeSeconds % 60).toFixed(2).padStart(5, '0');\n return \"\".concat(minutes, \":\").concat(seconds);\n};\nconst formatDuration = (playheadPercent, trimStartPercent, trimEndPercent, durationSeconds) => {\n // If no selection, the trim is the entire sound.\n trimStartPercent = trimStartPercent === null ? 0 : trimStartPercent;\n trimEndPercent = trimEndPercent === null ? 1 : trimEndPercent;\n\n // If the playhead doesn't exist, assume it's at the start of the selection.\n playheadPercent = playheadPercent === null ? trimStartPercent : playheadPercent;\n\n // If selection has zero length, treat it as the entire sound being selected.\n // This happens when the user first clicks to start making a selection.\n const trimSize = trimEndPercent - trimStartPercent || 1;\n const trimDuration = trimSize * durationSeconds;\n const progressInTrim = (playheadPercent - trimStartPercent) / trimSize;\n const currentTime = progressInTrim * trimDuration;\n return \"\".concat(formatTime(currentTime), \" / \").concat(formatTime(trimDuration));\n};\nconst formatSoundSize = bytes => {\n if (bytes > 1000 * 1000) {\n return \"\".concat((bytes / 1000 / 1000).toFixed(2), \"MB\");\n }\n return \"\".concat((bytes / 1000).toFixed(2), \"KB\");\n};\nconst sound_editor_SoundEditor = props => /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: sound_editor_default.a.editorContainer,\n ref: props.setRef,\n onMouseDown: props.onContainerClick\n}, /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: sound_editor_default.a.row\n}, /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: sound_editor_default.a.inputGroup\n}, /*#__PURE__*/react_default.a.createElement(components_forms_label, {\n text: props.intl.formatMessage(sound_editor_messages.sound)\n}, /*#__PURE__*/react_default.a.createElement(sound_editor_BufferedInput, {\n tabIndex: \"1\",\n type: \"text\",\n value: props.name,\n onSubmit: props.onChangeName,\n className: sound_editor_default.a.nameInput\n})), /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: sound_editor_default.a.buttonGroup\n}, /*#__PURE__*/react_default.a.createElement(\"button\", {\n className: sound_editor_default.a.button,\n disabled: !props.canUndo,\n title: props.intl.formatMessage(sound_editor_messages.undo),\n onClick: props.onUndo\n}, /*#__PURE__*/react_default.a.createElement(render, {\n className: sound_editor_default.a.undoIcon,\n draggable: false,\n src: icon_undo\n})), /*#__PURE__*/react_default.a.createElement(\"button\", {\n className: sound_editor_default.a.button,\n disabled: !props.canRedo,\n title: props.intl.formatMessage(sound_editor_messages.redo),\n onClick: props.onRedo\n}, /*#__PURE__*/react_default.a.createElement(render, {\n className: sound_editor_default.a.redoIcon,\n draggable: false,\n src: icon_redo\n})))), /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: sound_editor_default.a.inputGroup\n}, /*#__PURE__*/react_default.a.createElement(icon_button_icon_button, {\n className: sound_editor_default.a.toolButton,\n img: icon_copy,\n title: props.intl.formatMessage(sound_editor_messages.copy),\n onClick: props.onCopy\n}), /*#__PURE__*/react_default.a.createElement(icon_button_icon_button, {\n className: sound_editor_default.a.toolButton,\n disabled: props.canPaste === false,\n img: icon_paste,\n title: props.intl.formatMessage(sound_editor_messages.paste),\n onClick: props.onPaste\n}), /*#__PURE__*/react_default.a.createElement(icon_button_icon_button, {\n className: classnames_default()(sound_editor_default.a.toolButton, sound_editor_default.a.flipInRtl),\n img: icon_copy_to_new,\n title: props.intl.formatMessage(sound_editor_messages.copyToNew),\n onClick: props.onCopyToNew\n})), /*#__PURE__*/react_default.a.createElement(icon_button_icon_button, {\n className: sound_editor_default.a.toolButton,\n disabled: props.trimStart === null,\n img: sound_editor_icon_delete,\n title: props.intl.formatMessage(sound_editor_messages.delete),\n onClick: props.onDelete\n})), /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: sound_editor_default.a.row\n}, /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: sound_editor_default.a.waveformContainer\n}, /*#__PURE__*/react_default.a.createElement(waveform_waveform, {\n data: props.chunkLevels,\n height: 160,\n width: 600\n}), /*#__PURE__*/react_default.a.createElement(containers_audio_selector, {\n playhead: props.playhead,\n trimEnd: props.trimEnd,\n trimStart: props.trimStart,\n onPlay: props.onPlay,\n onSetTrim: props.onSetTrim,\n onStop: props.onStop\n}))), /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: classnames_default()(sound_editor_default.a.row, sound_editor_default.a.rowReverse)\n}, /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: classnames_default()(sound_editor_default.a.roundButtonOuter, sound_editor_default.a.inputGroup)\n}, props.playhead ? /*#__PURE__*/react_default.a.createElement(\"button\", {\n className: classnames_default()(sound_editor_default.a.roundButton, sound_editor_default.a.stopButtonn),\n title: props.intl.formatMessage(sound_editor_messages.stop),\n onClick: props.onStop\n}, /*#__PURE__*/react_default.a.createElement(\"img\", {\n draggable: false,\n src: sound_editor_icon_stop_default.a\n})) : /*#__PURE__*/react_default.a.createElement(\"button\", {\n className: classnames_default()(sound_editor_default.a.roundButton, sound_editor_default.a.playButton),\n title: props.intl.formatMessage(sound_editor_messages.play),\n onClick: props.onPlay\n}, /*#__PURE__*/react_default.a.createElement(\"img\", {\n draggable: false,\n src: sound_editor_icon_play_default.a\n}))), /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: sound_editor_default.a.effects\n}, /*#__PURE__*/react_default.a.createElement(icon_button_icon_button, {\n className: sound_editor_default.a.effectButton,\n img: icon_faster_default.a,\n title: /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], sound_editor_messages.faster),\n onClick: props.onFaster\n}), /*#__PURE__*/react_default.a.createElement(icon_button_icon_button, {\n className: sound_editor_default.a.effectButton,\n img: icon_slower_default.a,\n title: /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], sound_editor_messages.slower),\n onClick: props.onSlower\n}), /*#__PURE__*/react_default.a.createElement(icon_button_icon_button, {\n disabled: props.tooLoud,\n className: classnames_default()(sound_editor_default.a.effectButton, sound_editor_default.a.flipInRtl),\n img: icon_louder_default.a,\n title: /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], sound_editor_messages.louder),\n onClick: props.onLouder\n}), /*#__PURE__*/react_default.a.createElement(icon_button_icon_button, {\n className: classnames_default()(sound_editor_default.a.effectButton, sound_editor_default.a.flipInRtl),\n img: icon_softer_default.a,\n title: /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], sound_editor_messages.softer),\n onClick: props.onSofter\n}), /*#__PURE__*/react_default.a.createElement(icon_button_icon_button, {\n className: classnames_default()(sound_editor_default.a.effectButton, sound_editor_default.a.flipInRtl),\n img: icon_mute_default.a,\n title: /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], sound_editor_messages.mute),\n onClick: props.onMute\n}), /*#__PURE__*/react_default.a.createElement(icon_button_icon_button, {\n className: sound_editor_default.a.effectButton,\n img: icon_fade_in_default.a,\n title: /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], sound_editor_messages.fadeIn),\n onClick: props.onFadeIn\n}), /*#__PURE__*/react_default.a.createElement(icon_button_icon_button, {\n className: sound_editor_default.a.effectButton,\n img: icon_fade_out_default.a,\n title: /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], sound_editor_messages.fadeOut),\n onClick: props.onFadeOut\n}), /*#__PURE__*/react_default.a.createElement(icon_button_icon_button, {\n className: sound_editor_default.a.effectButton,\n img: icon_reverse_default.a,\n title: /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], sound_editor_messages.reverse),\n onClick: props.onReverse\n}), /*#__PURE__*/react_default.a.createElement(icon_button_icon_button, {\n className: sound_editor_default.a.effectButton,\n img: icon_robot_default.a,\n title: /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], sound_editor_messages.robot),\n onClick: props.onRobot\n}), /*#__PURE__*/react_default.a.createElement(icon_button_icon_button, {\n className: sound_editor_default.a.effectButton,\n img: icon_echo_default.a,\n title: /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], sound_editor_messages.echo),\n onClick: props.onEcho\n}))), /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: sound_editor_default.a.infoRow\n}, /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: sound_editor_default.a.duration\n}, formatDuration(props.playhead, props.trimStart, props.trimEnd, props.duration)), /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: sound_editor_default.a.advancedInfo\n}, props.isStereo ? /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Stereo\",\n id: \"tw.stereo\"\n}) : /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Mono\",\n id: \"tw.mono\"\n}), \" (\".concat(formatSoundSize(props.size), \")\"))), props.size >= SOUND_BYTE_LIMIT && /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: classnames_default()(sound_editor_default.a.alert, sound_editor_default.a.tooLarge)\n}, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"This sound may be too large to upload to Scratch.\",\n id: \"tw.tooLarge\"\n})), props.isStereo && /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: classnames_default()(sound_editor_default.a.alert, sound_editor_default.a.stereo)\n}, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Editing this stereo sound will irreversibly convert it to mono.\",\n id: \"tw.stereoAlert\"\n})));\nsound_editor_SoundEditor.propTypes = {\n isStereo: prop_types_default.a.bool.isRequired,\n duration: prop_types_default.a.number.isRequired,\n size: prop_types_default.a.number.isRequired,\n canPaste: prop_types_default.a.bool.isRequired,\n canRedo: prop_types_default.a.bool.isRequired,\n canUndo: prop_types_default.a.bool.isRequired,\n chunkLevels: prop_types_default.a.arrayOf(prop_types_default.a.number).isRequired,\n intl: index_es[\"i\" /* intlShape */],\n name: prop_types_default.a.string.isRequired,\n onChangeName: prop_types_default.a.func.isRequired,\n onContainerClick: prop_types_default.a.func.isRequired,\n onCopy: prop_types_default.a.func.isRequired,\n onCopyToNew: prop_types_default.a.func.isRequired,\n onDelete: prop_types_default.a.func,\n onEcho: prop_types_default.a.func.isRequired,\n onFadeIn: prop_types_default.a.func.isRequired,\n onFadeOut: prop_types_default.a.func.isRequired,\n onFaster: prop_types_default.a.func.isRequired,\n onLouder: prop_types_default.a.func.isRequired,\n onMute: prop_types_default.a.func.isRequired,\n onPaste: prop_types_default.a.func.isRequired,\n onPlay: prop_types_default.a.func.isRequired,\n onRedo: prop_types_default.a.func.isRequired,\n onReverse: prop_types_default.a.func.isRequired,\n onRobot: prop_types_default.a.func.isRequired,\n onSetTrim: prop_types_default.a.func,\n onSlower: prop_types_default.a.func.isRequired,\n onSofter: prop_types_default.a.func.isRequired,\n onStop: prop_types_default.a.func.isRequired,\n onUndo: prop_types_default.a.func.isRequired,\n playhead: prop_types_default.a.number,\n setRef: prop_types_default.a.func,\n tooLoud: prop_types_default.a.bool.isRequired,\n trimEnd: prop_types_default.a.number,\n trimStart: prop_types_default.a.number\n};\n/* harmony default export */ var sound_editor_sound_editor = (Object(index_es[\"h\" /* injectIntl */])(sound_editor_SoundEditor));\n// CONCATENATED MODULE: ./src/containers/sound-editor.jsx\nfunction sound_editor_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction sound_editor_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? sound_editor_ownKeys(Object(t), !0).forEach(function (r) { sound_editor_defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : sound_editor_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction sound_editor_defineProperty(e, r, t) { return (r = sound_editor_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction sound_editor_toPropertyKey(t) { var i = sound_editor_toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction sound_editor_toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\n\n\n\n\n\n\n\n\n\n\nconst UNDO_STACK_SIZE = 99;\nconst MAX_RMS = 1.2;\nclass containers_sound_editor_SoundEditor extends react_default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['copy', 'copyCurrentBuffer', 'handleCopyToNew', 'handleStoppedPlaying', 'handleChangeName', 'handlePlay', 'handleStopPlaying', 'handleUpdatePlayhead', 'handleDelete', 'handleUpdateTrim', 'handleEffect', 'handleUndo', 'handleRedo', 'submitNewSamples', 'handleCopy', 'handlePaste', 'paste', 'handleKeyPress', 'handleContainerClick', 'setRef', 'resampleBufferToRate']);\n this.state = {\n copyBuffer: null,\n chunkLevels: computeChunkedRMS(this.props.samples),\n playhead: null,\n // null is not playing, [0 -> 1] is playing percent\n trimStart: null,\n trimEnd: null\n };\n this.redoStack = [];\n this.undoStack = [];\n this.ref = null;\n }\n componentDidMount() {\n this.audioBufferPlayer = new audio_buffer_player(this.props.samples, this.props.sampleRate);\n document.addEventListener('keydown', this.handleKeyPress);\n }\n componentWillReceiveProps(newProps) {\n if (newProps.soundId !== this.props.soundId) {\n // A different sound has been selected\n this.redoStack = [];\n this.undoStack = [];\n this.resetState(newProps.samples, newProps.sampleRate);\n this.setState({\n trimStart: null,\n trimEnd: null\n });\n }\n }\n componentWillUnmount() {\n this.audioBufferPlayer.stop();\n document.removeEventListener('keydown', this.handleKeyPress);\n }\n handleKeyPress(event) {\n if (event.target instanceof HTMLInputElement) {\n // Ignore keyboard shortcuts if a text input field is focused\n return;\n }\n if (this.props.isFullScreen) {\n // Ignore keyboard shortcuts if the stage is fullscreen mode\n return;\n }\n if (event.key === ' ') {\n event.preventDefault();\n if (this.state.playhead) {\n this.handleStopPlaying();\n } else {\n this.handlePlay();\n }\n }\n if (event.key === 'Delete' || event.key === 'Backspace') {\n event.preventDefault();\n if (event.shiftKey) {\n this.handleDeleteInverse();\n } else {\n this.handleDelete();\n }\n }\n if (event.key === 'Escape') {\n event.preventDefault();\n this.handleUpdateTrim(null, null);\n }\n if (event.metaKey || event.ctrlKey) {\n if (event.shiftKey && event.key.toLowerCase() === 'z') {\n event.preventDefault();\n if (this.redoStack.length > 0) {\n this.handleRedo();\n }\n } else if (event.key === 'z') {\n if (this.undoStack.length > 0) {\n event.preventDefault();\n this.handleUndo();\n }\n } else if (event.key === 'c') {\n event.preventDefault();\n this.handleCopy();\n } else if (event.key === 'v') {\n event.preventDefault();\n this.handlePaste();\n } else if (event.key === 'a') {\n event.preventDefault();\n this.handleUpdateTrim(0, 1);\n }\n }\n }\n resetState(samples, sampleRate) {\n this.audioBufferPlayer.stop();\n this.audioBufferPlayer = new audio_buffer_player(samples, sampleRate);\n this.setState({\n chunkLevels: computeChunkedRMS(samples),\n playhead: null\n });\n }\n submitNewSamples(samples, sampleRate, skipUndo) {\n return downsampleIfNeeded({\n samples,\n sampleRate\n }, this.resampleBufferToRate).then(_ref => {\n let {\n samples: newSamples,\n sampleRate: newSampleRate\n } = _ref;\n return wav_encoder_default.a.encode({\n sampleRate: newSampleRate,\n channelData: [newSamples]\n }).then(wavBuffer => {\n if (!skipUndo) {\n this.redoStack = [];\n if (this.undoStack.length >= UNDO_STACK_SIZE) {\n this.undoStack.shift(); // Drop the first element off the array\n }\n this.undoStack.push(this.getUndoItem());\n }\n this.resetState(newSamples, newSampleRate);\n this.props.vm.updateSoundBuffer(this.props.soundIndex, this.audioBufferPlayer.buffer, new Uint8Array(wavBuffer));\n return true; // Edit was successful\n });\n }).catch(e => {\n // Encoding failed, or the sound was too large to save so edit is rejected\n log[\"default\"].error(\"Encountered error while trying to encode sound update: \".concat(e.message));\n return false; // Edit was not applied\n });\n }\n handlePlay() {\n this.audioBufferPlayer.stop();\n this.audioBufferPlayer.play(this.state.trimStart || 0, this.state.trimEnd || 1, this.handleUpdatePlayhead, this.handleStoppedPlaying);\n }\n handleStopPlaying() {\n this.audioBufferPlayer.stop();\n this.handleStoppedPlaying();\n }\n handleStoppedPlaying() {\n this.setState({\n playhead: null\n });\n }\n handleUpdatePlayhead(playhead) {\n this.setState({\n playhead\n });\n }\n handleChangeName(name) {\n this.props.vm.renameSound(this.props.soundIndex, name);\n }\n handleDelete() {\n const {\n samples,\n sampleRate\n } = this.copyCurrentBuffer();\n const sampleCount = samples.length;\n const startIndex = Math.floor(this.state.trimStart * sampleCount);\n const endIndex = Math.floor(this.state.trimEnd * sampleCount);\n const firstPart = samples.slice(0, startIndex);\n const secondPart = samples.slice(endIndex, sampleCount);\n const newLength = firstPart.length + secondPart.length;\n let newSamples;\n if (newLength === 0) {\n newSamples = new Float32Array(1);\n } else {\n newSamples = new Float32Array(newLength);\n newSamples.set(firstPart, 0);\n newSamples.set(secondPart, firstPart.length);\n }\n this.submitNewSamples(newSamples, sampleRate).then(() => {\n this.setState({\n trimStart: null,\n trimEnd: null\n });\n });\n }\n handleDeleteInverse() {\n // Delete everything outside of the trimmers\n const {\n samples,\n sampleRate\n } = this.copyCurrentBuffer();\n const sampleCount = samples.length;\n const startIndex = Math.floor(this.state.trimStart * sampleCount);\n const endIndex = Math.floor(this.state.trimEnd * sampleCount);\n let clippedSamples = samples.slice(startIndex, endIndex);\n if (clippedSamples.length === 0) {\n clippedSamples = new Float32Array(1);\n }\n this.submitNewSamples(clippedSamples, sampleRate).then(success => {\n if (success) {\n this.setState({\n trimStart: null,\n trimEnd: null\n });\n }\n });\n }\n handleUpdateTrim(trimStart, trimEnd) {\n this.setState({\n trimStart,\n trimEnd\n });\n this.handleStopPlaying();\n }\n effectFactory(name) {\n return () => this.handleEffect(name);\n }\n copyCurrentBuffer() {\n // Cannot reliably use props.samples because it gets detached by Firefox\n return {\n samples: this.audioBufferPlayer.buffer.getChannelData(0),\n sampleRate: this.audioBufferPlayer.buffer.sampleRate\n };\n }\n handleEffect(name) {\n const trimStart = this.state.trimStart === null ? 0.0 : this.state.trimStart;\n const trimEnd = this.state.trimEnd === null ? 1.0 : this.state.trimEnd;\n\n // Offline audio context needs at least 2 samples\n if (this.audioBufferPlayer.buffer.length < 2) {\n return;\n }\n const effects = new audio_effects(this.audioBufferPlayer.buffer, name, trimStart, trimEnd);\n effects.process((renderedBuffer, adjustedTrimStart, adjustedTrimEnd) => {\n const samples = renderedBuffer.getChannelData(0);\n const sampleRate = renderedBuffer.sampleRate;\n this.submitNewSamples(samples, sampleRate).then(success => {\n if (success) {\n if (this.state.trimStart === null) {\n this.handlePlay();\n } else {\n this.setState({\n trimStart: adjustedTrimStart,\n trimEnd: adjustedTrimEnd\n }, this.handlePlay);\n }\n }\n });\n });\n }\n tooLoud() {\n const numChunks = this.state.chunkLevels.length;\n const startIndex = this.state.trimStart === null ? 0 : Math.floor(this.state.trimStart * numChunks);\n const endIndex = this.state.trimEnd === null ? numChunks - 1 : Math.ceil(this.state.trimEnd * numChunks);\n const trimChunks = this.state.chunkLevels.slice(startIndex, endIndex);\n let max = 0;\n for (const i of trimChunks) {\n if (i > max) {\n max = i;\n }\n }\n return max > MAX_RMS;\n }\n getUndoItem() {\n return sound_editor_objectSpread(sound_editor_objectSpread({}, this.copyCurrentBuffer()), {}, {\n trimStart: this.state.trimStart,\n trimEnd: this.state.trimEnd\n });\n }\n handleUndo() {\n this.redoStack.push(this.getUndoItem());\n const {\n samples,\n sampleRate,\n trimStart,\n trimEnd\n } = this.undoStack.pop();\n if (samples) {\n return this.submitNewSamples(samples, sampleRate, true).then(success => {\n if (success) {\n this.setState({\n trimStart: trimStart,\n trimEnd: trimEnd\n }, this.handlePlay);\n }\n });\n }\n }\n handleRedo() {\n const {\n samples,\n sampleRate,\n trimStart,\n trimEnd\n } = this.redoStack.pop();\n if (samples) {\n this.undoStack.push(this.getUndoItem());\n return this.submitNewSamples(samples, sampleRate, true).then(success => {\n if (success) {\n this.setState({\n trimStart: trimStart,\n trimEnd: trimEnd\n }, this.handlePlay);\n }\n });\n }\n }\n handleCopy() {\n this.copy();\n }\n copy(callback) {\n const trimStart = this.state.trimStart === null ? 0.0 : this.state.trimStart;\n const trimEnd = this.state.trimEnd === null ? 1.0 : this.state.trimEnd;\n const newCopyBuffer = this.copyCurrentBuffer();\n const trimStartSamples = trimStart * newCopyBuffer.samples.length;\n const trimEndSamples = trimEnd * newCopyBuffer.samples.length;\n newCopyBuffer.samples = newCopyBuffer.samples.slice(trimStartSamples, trimEndSamples);\n this.setState({\n copyBuffer: newCopyBuffer\n }, callback);\n }\n handleCopyToNew() {\n this.copy(() => {\n audio_util_encodeAndAddSoundToVM(this.props.vm, this.state.copyBuffer.samples, this.state.copyBuffer.sampleRate, this.props.name);\n });\n }\n resampleBufferToRate(buffer, newRate) {\n return new Promise((resolve, reject) => {\n const sampleRateRatio = newRate / buffer.sampleRate;\n const newLength = sampleRateRatio * buffer.samples.length;\n let offlineContext;\n // Try to use either OfflineAudioContext or webkitOfflineAudioContext to resample\n // The constructors will throw if trying to resample at an unsupported rate\n // (e.g. Safari/webkitOAC does not support lower than 44khz).\n try {\n if (window.OfflineAudioContext) {\n offlineContext = new window.OfflineAudioContext(1, newLength, newRate);\n } else if (window.webkitOfflineAudioContext) {\n offlineContext = new window.webkitOfflineAudioContext(1, newLength, newRate);\n }\n } catch (_unused) {\n // If no OAC available and downsampling by 2, downsample by dropping every other sample.\n if (newRate === buffer.sampleRate / 2) {\n return resolve(dropEveryOtherSample(buffer));\n }\n return reject(new Error('Could not resample'));\n }\n const source = offlineContext.createBufferSource();\n const audioBuffer = offlineContext.createBuffer(1, buffer.samples.length, buffer.sampleRate);\n audioBuffer.getChannelData(0).set(buffer.samples);\n source.buffer = audioBuffer;\n source.connect(offlineContext.destination);\n source.start();\n offlineContext.startRendering();\n offlineContext.oncomplete = _ref2 => {\n let {\n renderedBuffer\n } = _ref2;\n resolve({\n samples: renderedBuffer.getChannelData(0),\n sampleRate: newRate\n });\n };\n });\n }\n paste() {\n // If there's no selection, paste at the end of the sound\n const {\n samples\n } = this.copyCurrentBuffer();\n if (this.state.trimStart === null) {\n const newLength = samples.length + this.state.copyBuffer.samples.length;\n const newSamples = new Float32Array(newLength);\n newSamples.set(samples, 0);\n newSamples.set(this.state.copyBuffer.samples, samples.length);\n this.submitNewSamples(newSamples, this.props.sampleRate, false).then(success => {\n if (success) {\n this.handlePlay();\n }\n });\n } else {\n // else replace the selection with the pasted sound\n const trimStartSamples = this.state.trimStart * samples.length;\n const trimEndSamples = this.state.trimEnd * samples.length;\n const firstPart = samples.slice(0, trimStartSamples);\n const lastPart = samples.slice(trimEndSamples);\n const newLength = firstPart.length + this.state.copyBuffer.samples.length + lastPart.length;\n const newSamples = new Float32Array(newLength);\n newSamples.set(firstPart, 0);\n newSamples.set(this.state.copyBuffer.samples, firstPart.length);\n newSamples.set(lastPart, firstPart.length + this.state.copyBuffer.samples.length);\n const trimStartSeconds = trimStartSamples / this.props.sampleRate;\n const trimEndSeconds = trimStartSeconds + this.state.copyBuffer.samples.length / this.state.copyBuffer.sampleRate;\n const newDurationSeconds = newSamples.length / this.state.copyBuffer.sampleRate;\n const adjustedTrimStart = trimStartSeconds / newDurationSeconds;\n const adjustedTrimEnd = trimEndSeconds / newDurationSeconds;\n this.submitNewSamples(newSamples, this.props.sampleRate, false).then(success => {\n if (success) {\n this.setState({\n trimStart: adjustedTrimStart,\n trimEnd: adjustedTrimEnd\n }, this.handlePlay);\n }\n });\n }\n }\n handlePaste() {\n if (!this.state.copyBuffer) return;\n if (this.state.copyBuffer.sampleRate === this.props.sampleRate) {\n this.paste();\n } else {\n this.resampleBufferToRate(this.state.copyBuffer, this.props.sampleRate).then(buffer => {\n this.setState({\n copyBuffer: buffer\n }, this.paste);\n });\n }\n }\n setRef(element) {\n this.ref = element;\n }\n handleContainerClick(e) {\n // If the click is on the sound editor's div (and not any other element), delesect\n if (e.target === this.ref && this.state.trimStart !== null) {\n this.handleUpdateTrim(null, null);\n }\n }\n render() {\n const {\n effectTypes\n } = audio_effects;\n return /*#__PURE__*/react_default.a.createElement(sound_editor_sound_editor, {\n isStereo: this.props.isStereo,\n duration: this.props.duration,\n size: this.props.size,\n canPaste: this.state.copyBuffer !== null,\n canRedo: this.redoStack.length > 0,\n canUndo: this.undoStack.length > 0,\n chunkLevels: this.state.chunkLevels,\n name: this.props.name,\n playhead: this.state.playhead,\n setRef: this.setRef,\n tooLoud: this.tooLoud(),\n trimEnd: this.state.trimEnd,\n trimStart: this.state.trimStart,\n onChangeName: this.handleChangeName,\n onContainerClick: this.handleContainerClick,\n onCopy: this.handleCopy,\n onCopyToNew: this.handleCopyToNew,\n onDelete: this.handleDelete,\n onEcho: this.effectFactory(effectTypes.ECHO),\n onFadeIn: this.effectFactory(effectTypes.FADEIN),\n onFadeOut: this.effectFactory(effectTypes.FADEOUT),\n onFaster: this.effectFactory(effectTypes.FASTER),\n onLouder: this.effectFactory(effectTypes.LOUDER),\n onMute: this.effectFactory(effectTypes.MUTE),\n onPaste: this.handlePaste,\n onPlay: this.handlePlay,\n onRedo: this.handleRedo,\n onReverse: this.effectFactory(effectTypes.REVERSE),\n onRobot: this.effectFactory(effectTypes.ROBOT),\n onSetTrim: this.handleUpdateTrim,\n onSlower: this.effectFactory(effectTypes.SLOWER),\n onSofter: this.effectFactory(effectTypes.SOFTER),\n onStop: this.handleStopPlaying,\n onUndo: this.handleUndo\n });\n }\n}\ncontainers_sound_editor_SoundEditor.propTypes = {\n isStereo: prop_types_default.a.bool,\n duration: prop_types_default.a.number,\n size: prop_types_default.a.number,\n isFullScreen: prop_types_default.a.bool,\n name: prop_types_default.a.string.isRequired,\n sampleRate: prop_types_default.a.number,\n samples: prop_types_default.a.instanceOf(Float32Array),\n soundId: prop_types_default.a.string,\n soundIndex: prop_types_default.a.number,\n vm: prop_types_default.a.instanceOf(src_default.a).isRequired\n};\nconst sound_editor_mapStateToProps = (state, _ref3) => {\n let {\n soundIndex\n } = _ref3;\n const sprite = state.scratchGui.vm.editingTarget.sprite;\n // Make sure the sound index doesn't go out of range.\n const index = soundIndex < sprite.sounds.length ? soundIndex : sprite.sounds.length - 1;\n const sound = state.scratchGui.vm.editingTarget.sprite.sounds[index];\n const audioBuffer = state.scratchGui.vm.getSoundBuffer(index);\n return {\n isStereo: audioBuffer.numberOfChannels !== 1,\n duration: sound.sampleCount / sound.rate,\n size: sound.asset ? sound.asset.data.byteLength : 0,\n soundId: sound.soundId,\n sampleRate: audioBuffer.sampleRate,\n samples: audioBuffer.getChannelData(0),\n isFullScreen: state.scratchGui.mode.isFullScreen,\n name: sound.name,\n vm: state.scratchGui.vm\n };\n};\n/* harmony default export */ var containers_sound_editor = (Object(react_redux_es[\"b\" /* connect */])(sound_editor_mapStateToProps)(containers_sound_editor_SoundEditor));\n// EXTERNAL MODULE: ./src/components/library-item/lib-icon--sound.svg\nvar lib_icon_sound = __webpack_require__(339);\nvar lib_icon_sound_default = /*#__PURE__*/__webpack_require__.n(lib_icon_sound);\n\n// EXTERNAL MODULE: ./src/components/library-item/lib-icon--sound-rtl.svg\nvar lib_icon_sound_rtl = __webpack_require__(340);\nvar lib_icon_sound_rtl_default = /*#__PURE__*/__webpack_require__.n(lib_icon_sound_rtl);\n\n// CONCATENATED MODULE: ./src/lib/libraries/sound-tags.js\n\n/* harmony default export */ var sound_tags = ([{\n tag: 'animals',\n intlLabel: tag_messages.animals\n}, {\n tag: 'effects',\n intlLabel: tag_messages.effects\n}, {\n tag: 'loops',\n intlLabel: tag_messages.loops\n}, {\n tag: 'notes',\n intlLabel: tag_messages.notes\n}, {\n tag: 'percussion',\n intlLabel: tag_messages.percussion\n}, {\n tag: 'space',\n intlLabel: tag_messages.space\n}, {\n tag: 'sports',\n intlLabel: tag_messages.sports\n}, {\n tag: 'voice',\n intlLabel: tag_messages.voice\n}, {\n tag: 'wacky',\n intlLabel: tag_messages.wacky\n}]);\n// CONCATENATED MODULE: ./src/containers/sound-library.jsx\nconst sound_library_excluded = [\"md5ext\"];\nfunction sound_library_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction sound_library_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? sound_library_ownKeys(Object(t), !0).forEach(function (r) { sound_library_defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : sound_library_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction sound_library_defineProperty(e, r, t) { return (r = sound_library_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction sound_library_toPropertyKey(t) { var i = sound_library_toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction sound_library_toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction sound_library_objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = sound_library_objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction sound_library_objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst sound_library_messages = Object(index_es[\"g\" /* defineMessages */])({\n libraryTitle: {\n \"id\": \"gui.soundLibrary.chooseASound\",\n \"defaultMessage\": \"Choose a Sound\"\n }\n});\n\n// @todo need to use this hack to avoid library using md5 for image\nconst getSoundLibraryThumbnailData = (soundLibraryContent, isRtl) => soundLibraryContent.map(sound => {\n const {\n md5ext\n } = sound,\n otherData = sound_library_objectWithoutProperties(sound, sound_library_excluded);\n return sound_library_objectSpread({\n _md5: md5ext,\n rawURL: isRtl ? lib_icon_sound_rtl_default.a : lib_icon_sound_default.a\n }, otherData);\n});\nclass sound_library_SoundLibrary extends react_default.a.PureComponent {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['handleItemSelected', 'handleItemMouseEnter', 'handleItemMouseLeave', 'onStop', 'setStopHandler']);\n\n /**\n * AudioEngine that will decode and play sounds for us.\n * @type {AudioEngine}\n */\n this.audioEngine = null;\n /**\n * A promise for the sound queued to play as soon as it loads and\n * decodes.\n * @type {Promise}\n */\n this.playingSoundPromise = null;\n\n /**\n * function to call when the sound ends\n */\n this.handleStop = null;\n this.state = {\n data: null\n };\n }\n componentDidMount() {\n const soundLibrary = getSoundLibrary();\n if (soundLibrary.then) {\n soundLibrary.then(data => this.setState({\n data: getSoundLibraryThumbnailData(data, this.props.isRtl)\n }));\n } else {\n this.setState({\n data: getSoundLibraryThumbnailData(soundLibrary, this.props.isRtl)\n });\n }\n this.audioEngine = new scratch_audio_src_default.a(new shared_audio_context());\n this.playingSoundPromise = null;\n }\n componentWillUnmount() {\n this.stopPlayingSound();\n }\n onStop() {\n if (this.playingSoundPromise !== null) {\n this.playingSoundPromise.then(soundPlayer => soundPlayer && soundPlayer.removeListener('stop', this.onStop));\n if (this.handleStop) this.handleStop();\n }\n }\n setStopHandler(func) {\n this.handleStop = func;\n }\n stopPlayingSound() {\n // Playback is queued, playing, or has played recently and finished\n // normally.\n if (this.playingSoundPromise !== null) {\n // Forcing sound to stop, so stop listening for sound ending:\n this.playingSoundPromise.then(soundPlayer => soundPlayer && soundPlayer.removeListener('stop', this.onStop));\n // Queued playback began playing before this method.\n if (this.playingSoundPromise.isPlaying) {\n // Fetch the player from the promise and stop playback soon.\n this.playingSoundPromise.then(soundPlayer => {\n soundPlayer.stop();\n });\n } else {\n // Fetch the player from the promise and stop immediately. Since\n // the sound is not playing yet, this callback will be called\n // immediately after the sound starts playback. Stopping it\n // immediately will have the effect of no sound being played.\n this.playingSoundPromise.then(soundPlayer => {\n if (soundPlayer) soundPlayer.stopImmediately();\n });\n }\n // No further work should be performed on this promise and its\n // soundPlayer.\n this.playingSoundPromise = null;\n }\n }\n handleItemMouseEnter(soundItem) {\n const md5ext = soundItem._md5;\n const idParts = md5ext.split('.');\n const md5 = idParts[0];\n const vm = this.props.vm;\n\n // In case enter is called twice without a corresponding leave\n // inbetween, stop the last playback before queueing a new sound.\n this.stopPlayingSound();\n\n // Save the promise so code to stop the sound may queue the stop\n // instruction after the play instruction.\n this.playingSoundPromise = vm.runtime.storage.load(vm.runtime.storage.AssetType.Sound, md5).then(soundAsset => {\n if (soundAsset) {\n const sound = {\n md5: md5ext,\n name: soundItem.name,\n format: soundItem.format,\n data: soundAsset.data\n };\n return this.audioEngine.decodeSoundPlayer(sound).then(soundPlayer => {\n soundPlayer.connect(this.audioEngine);\n // Play the sound. Playing the sound will always come before a\n // paired stop if the sound must stop early.\n soundPlayer.play();\n soundPlayer.addListener('stop', this.onStop);\n // Set that the sound is playing. This affects the type of stop\n // instruction given if the sound must stop early.\n if (this.playingSoundPromise !== null) {\n this.playingSoundPromise.isPlaying = true;\n }\n return soundPlayer;\n });\n }\n });\n }\n handleItemMouseLeave() {\n this.stopPlayingSound();\n }\n handleItemSelected(soundItem) {\n const vmSound = {\n format: soundItem.format,\n md5: soundItem._md5,\n rate: soundItem.rate,\n sampleCount: soundItem.sampleCount,\n name: soundItem.name\n };\n this.props.vm.addSound(vmSound).then(() => {\n this.props.onNewSound();\n });\n }\n render() {\n return /*#__PURE__*/react_default.a.createElement(components_library_library, {\n showPlayButton: true,\n data: this.state.data,\n id: \"soundLibrary\",\n setStopHandler: this.setStopHandler,\n tags: sound_tags,\n title: this.props.intl.formatMessage(sound_library_messages.libraryTitle),\n onItemMouseEnter: this.handleItemMouseEnter,\n onItemMouseLeave: this.handleItemMouseLeave,\n onItemSelected: this.handleItemSelected,\n onRequestClose: this.props.onRequestClose\n });\n }\n}\nsound_library_SoundLibrary.propTypes = {\n intl: index_es[\"i\" /* intlShape */].isRequired,\n isRtl: prop_types_default.a.bool,\n onNewSound: prop_types_default.a.func.isRequired,\n onRequestClose: prop_types_default.a.func,\n vm: prop_types_default.a.instanceOf(src_default.a).isRequired\n};\nconst sound_library_mapStateToProps = state => ({\n isRtl: state.locales.isRtl\n});\nconst sound_library_mapDispatchToProps = () => ({});\n/* harmony default export */ var sound_library = (Object(index_es[\"h\" /* injectIntl */])(Object(react_redux_es[\"b\" /* connect */])(sound_library_mapStateToProps, sound_library_mapDispatchToProps)(sound_library_SoundLibrary)));\n// EXTERNAL MODULE: ./src/components/tw-sound-editor-not-supported/sound-editor-not-supported.css\nvar sound_editor_not_supported = __webpack_require__(341);\nvar sound_editor_not_supported_default = /*#__PURE__*/__webpack_require__.n(sound_editor_not_supported);\n\n// CONCATENATED MODULE: ./src/components/tw-sound-editor-not-supported/sound-editor-not-supported.jsx\n\n\n\nconst SoundEditorNotSupported = () => /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: sound_editor_not_supported_default.a.container\n}, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Sound editor is not supported in this browser.\"\n // eslint-disable-next-line max-len\n ,\n\n id: \"tw.soundEditorNotSupported\"\n}));\n/* harmony default export */ var tw_sound_editor_not_supported_sound_editor_not_supported = (SoundEditorNotSupported);\n// CONCATENATED MODULE: ./src/containers/sound-tab.jsx\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nclass sound_tab_SoundTab extends react_default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['handleSelectSound', 'handleDeleteSound', 'handleDuplicateSound', 'handleExportSound', 'handleNewSound', 'handleSurpriseSound', 'handleFileUploadClick', 'handleSoundUpload', 'handleDrop', 'setFileInput']);\n this.state = {\n selectedSoundIndex: 0\n };\n }\n componentWillReceiveProps(nextProps) {\n const {\n editingTarget,\n sprites,\n stage\n } = nextProps;\n const target = editingTarget && sprites[editingTarget] ? sprites[editingTarget] : stage;\n if (!target || !target.sounds) {\n return;\n }\n\n // If switching editing targets, reset the sound index\n if (this.props.editingTarget !== editingTarget) {\n this.setState({\n selectedSoundIndex: 0\n });\n } else if (this.state.selectedSoundIndex > target.sounds.length - 1) {\n this.setState({\n selectedSoundIndex: Math.max(target.sounds.length - 1, 0)\n });\n }\n }\n handleSelectSound(soundIndex) {\n this.setState({\n selectedSoundIndex: soundIndex\n });\n }\n handleDeleteSound(soundIndex) {\n const restoreFun = this.props.vm.deleteSound(soundIndex);\n if (soundIndex >= this.state.selectedSoundIndex) {\n this.setState({\n selectedSoundIndex: Math.max(0, soundIndex - 1)\n });\n }\n this.props.dispatchUpdateRestore({\n restoreFun,\n deletedItem: 'Sound'\n });\n }\n handleExportSound(soundIndex) {\n const item = this.props.vm.editingTarget.sprite.sounds[soundIndex];\n const blob = new Blob([item.asset.data], {\n type: item.asset.assetType.contentType\n });\n Object(download_blob[\"a\" /* default */])(\"\".concat(item.name, \".\").concat(item.asset.dataFormat), blob);\n }\n handleDuplicateSound(soundIndex) {\n this.props.vm.duplicateSound(soundIndex).then(() => {\n this.setState({\n selectedSoundIndex: soundIndex + 1\n });\n });\n }\n handleNewSound() {\n if (!this.props.vm.editingTarget) {\n return null;\n }\n const sprite = this.props.vm.editingTarget.sprite;\n const sounds = sprite.sounds ? sprite.sounds : [];\n this.setState({\n selectedSoundIndex: Math.max(sounds.length - 1, 0)\n });\n }\n async handleSurpriseSound() {\n const soundLibraryContent = await getSoundLibrary();\n const soundItem = soundLibraryContent[Math.floor(Math.random() * soundLibraryContent.length)];\n const vmSound = {\n format: soundItem.dataFormat,\n md5: soundItem.md5ext,\n rate: soundItem.rate,\n sampleCount: soundItem.sampleCount,\n name: soundItem.name\n };\n this.props.vm.addSound(vmSound).then(() => {\n this.handleNewSound();\n });\n }\n handleFileUploadClick() {\n this.fileInput.click();\n }\n handleSoundUpload(e) {\n const storage = this.props.vm.runtime.storage;\n const targetId = this.props.vm.editingTarget.id;\n this.props.onShowImporting();\n handleFileUpload(e.target, (buffer, fileType, fileName, fileIndex, fileCount) => {\n _soundUpload(buffer, fileType, storage, newSound => {\n newSound.name = fileName;\n this.props.vm.addSound(newSound, targetId).then(() => {\n this.handleNewSound();\n if (fileIndex === fileCount - 1) {\n this.props.onCloseImporting();\n }\n });\n }, this.props.onCloseImporting);\n }, this.props.onCloseImporting);\n }\n handleDrop(dropInfo) {\n if (dropInfo.dragType === drag_constants.SOUND) {\n const sprite = this.props.vm.editingTarget.sprite;\n const activeSound = sprite.sounds[this.state.selectedSoundIndex];\n this.props.vm.reorderSound(this.props.vm.editingTarget.id, dropInfo.index, dropInfo.newIndex);\n this.setState({\n selectedSoundIndex: sprite.sounds.indexOf(activeSound)\n });\n } else if (dropInfo.dragType === drag_constants.BACKPACK_COSTUME) {\n this.props.onActivateCostumesTab();\n this.props.vm.addCostume(dropInfo.payload.body, {\n name: dropInfo.payload.name\n });\n } else if (dropInfo.dragType === drag_constants.BACKPACK_SOUND) {\n this.props.vm.addSound({\n md5: dropInfo.payload.body,\n name: dropInfo.payload.name\n }).then(this.handleNewSound);\n }\n }\n setFileInput(input) {\n this.fileInput = input;\n }\n render() {\n const {\n dispatchUpdateRestore,\n // eslint-disable-line no-unused-vars\n intl,\n isRtl,\n vm,\n onNewSoundFromLibraryClick,\n onNewSoundFromRecordingClick\n } = this.props;\n if (!vm.editingTarget) {\n return null;\n }\n const isSupported = !!(vm.runtime.audioEngine && new shared_audio_context());\n const sprite = vm.editingTarget.sprite;\n const sounds = sprite.sounds ? sprite.sounds.map(sound => ({\n url: isRtl ? icon_sound_rtl_default.a : icon_sound_default.a,\n name: sound.name,\n details: (sound.sampleCount / sound.rate).toFixed(2),\n dragPayload: sound\n })) : [];\n const messages = Object(index_es[\"g\" /* defineMessages */])({\n fileUploadSound: {\n \"id\": \"gui.soundTab.fileUploadSound\",\n \"defaultMessage\": \"Upload Sound\"\n },\n surpriseSound: {\n \"id\": \"gui.soundTab.surpriseSound\",\n \"defaultMessage\": \"Surprise\"\n },\n recordSound: {\n \"id\": \"gui.soundTab.recordSound\",\n \"defaultMessage\": \"Record\"\n },\n addSound: {\n \"id\": \"gui.soundTab.addSoundFromLibrary\",\n \"defaultMessage\": \"Choose a Sound\"\n }\n });\n return /*#__PURE__*/react_default.a.createElement(asset_panel_asset_panel, {\n buttons: isSupported ? [{\n title: intl.formatMessage(messages.addSound),\n img: icon_add_sound_lib_default.a,\n onClick: onNewSoundFromLibraryClick\n }, {\n title: intl.formatMessage(messages.fileUploadSound),\n img: icon_file_upload_default.a,\n onClick: this.handleFileUploadClick,\n fileAccept: '.wav, .mp3, .ogg, .flac, .aac, .m4a',\n fileChange: this.handleSoundUpload,\n fileInput: this.setFileInput,\n fileMultiple: true\n }, {\n title: intl.formatMessage(messages.surpriseSound),\n img: icon_surprise_default.a,\n onClick: this.handleSurpriseSound\n }, {\n title: intl.formatMessage(messages.recordSound),\n img: icon_add_sound_record_default.a,\n onClick: onNewSoundFromRecordingClick\n }, {\n title: intl.formatMessage(messages.addSound),\n img: icon_search_default.a,\n onClick: onNewSoundFromLibraryClick\n }] : [],\n dragType: drag_constants.SOUND,\n isRtl: isRtl,\n items: sounds,\n selectedItemIndex: this.state.selectedSoundIndex,\n onDeleteClick: this.handleDeleteSound,\n onDrop: this.handleDrop,\n onDuplicateClick: this.handleDuplicateSound,\n onExportClick: this.handleExportSound,\n onItemClick: this.handleSelectSound\n }, sprite.sounds && sprite.sounds[this.state.selectedSoundIndex] ? isSupported ? /*#__PURE__*/react_default.a.createElement(containers_sound_editor, {\n soundIndex: this.state.selectedSoundIndex\n }) : /*#__PURE__*/react_default.a.createElement(tw_sound_editor_not_supported_sound_editor_not_supported, null) : null, this.props.soundRecorderVisible ? /*#__PURE__*/react_default.a.createElement(containers_record_modal, {\n onNewSound: this.handleNewSound\n }) : null, this.props.soundLibraryVisible ? /*#__PURE__*/react_default.a.createElement(sound_library, {\n vm: this.props.vm,\n onNewSound: this.handleNewSound,\n onRequestClose: this.props.onRequestCloseSoundLibrary\n }) : null);\n }\n}\nsound_tab_SoundTab.propTypes = {\n dispatchUpdateRestore: prop_types_default.a.func,\n editingTarget: prop_types_default.a.string,\n intl: index_es[\"i\" /* intlShape */],\n isRtl: prop_types_default.a.bool,\n onActivateCostumesTab: prop_types_default.a.func.isRequired,\n onCloseImporting: prop_types_default.a.func.isRequired,\n onNewSoundFromLibraryClick: prop_types_default.a.func.isRequired,\n onNewSoundFromRecordingClick: prop_types_default.a.func.isRequired,\n onRequestCloseSoundLibrary: prop_types_default.a.func.isRequired,\n onShowImporting: prop_types_default.a.func.isRequired,\n soundLibraryVisible: prop_types_default.a.bool,\n soundRecorderVisible: prop_types_default.a.bool,\n sprites: prop_types_default.a.shape({\n id: prop_types_default.a.shape({\n sounds: prop_types_default.a.arrayOf(prop_types_default.a.shape({\n name: prop_types_default.a.string.isRequired\n }))\n })\n }),\n stage: prop_types_default.a.shape({\n sounds: prop_types_default.a.arrayOf(prop_types_default.a.shape({\n name: prop_types_default.a.string.isRequired\n }))\n }),\n vm: prop_types_default.a.instanceOf(src_default.a).isRequired\n};\nconst sound_tab_mapStateToProps = state => ({\n editingTarget: state.scratchGui.targets.editingTarget,\n isRtl: state.locales.isRtl,\n sprites: state.scratchGui.targets.sprites,\n stage: state.scratchGui.targets.stage,\n soundLibraryVisible: state.scratchGui.modals.soundLibrary,\n soundRecorderVisible: state.scratchGui.modals.soundRecorder\n});\nconst sound_tab_mapDispatchToProps = dispatch => ({\n onActivateCostumesTab: () => dispatch(Object(editor_tab[\"d\" /* activateTab */])(editor_tab[\"b\" /* COSTUMES_TAB_INDEX */])),\n onNewSoundFromLibraryClick: e => {\n e.preventDefault();\n dispatch(Object(modals[\"D\" /* openSoundLibrary */])());\n },\n onNewSoundFromRecordingClick: () => {\n dispatch(Object(modals[\"E\" /* openSoundRecorder */])());\n },\n onRequestCloseSoundLibrary: () => {\n dispatch(Object(modals[\"k\" /* closeSoundLibrary */])());\n },\n dispatchUpdateRestore: restoreState => {\n dispatch(Object(restore_deletion[\"c\" /* setRestore */])(restoreState));\n },\n onCloseImporting: () => dispatch(Object(alerts[\"c\" /* closeAlertWithId */])('importingAsset')),\n onShowImporting: () => dispatch(Object(alerts[\"i\" /* showStandardAlert */])('importingAsset'))\n});\n/* harmony default export */ var sound_tab = (Object(error_boundary_hoc[\"a\" /* default */])('Sound Tab')(Object(index_es[\"h\" /* injectIntl */])(Object(react_redux_es[\"b\" /* connect */])(sound_tab_mapStateToProps, sound_tab_mapDispatchToProps)(sound_tab_SoundTab))));\n// EXTERNAL MODULE: ./src/reducers/stage-size.js\nvar stage_size = __webpack_require__(120);\n\n// EXTERNAL MODULE: ./src/reducers/mode.js\nvar reducers_mode = __webpack_require__(47);\n\n// EXTERNAL MODULE: ./src/components/green-flag/icon--green-flag.svg\nvar icon_green_flag = __webpack_require__(187);\nvar icon_green_flag_default = /*#__PURE__*/__webpack_require__.n(icon_green_flag);\n\n// EXTERNAL MODULE: ./src/components/green-flag/green-flag.css\nvar green_flag = __webpack_require__(235);\nvar green_flag_default = /*#__PURE__*/__webpack_require__.n(green_flag);\n\n// CONCATENATED MODULE: ./src/components/green-flag/green-flag.jsx\nconst green_flag_excluded = [\"active\", \"className\", \"onClick\", \"title\"];\nfunction green_flag_extends() { return green_flag_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, green_flag_extends.apply(null, arguments); }\nfunction green_flag_objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = green_flag_objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction green_flag_objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\n\nconst green_flag_GreenFlagComponent = function GreenFlagComponent(props) {\n const {\n active,\n className,\n onClick,\n title\n } = props,\n componentProps = green_flag_objectWithoutProperties(props, green_flag_excluded);\n return /*#__PURE__*/react_default.a.createElement(\"img\", green_flag_extends({\n className: classnames_default()(className, green_flag_default.a.greenFlag, {\n [green_flag_default.a.isActive]: active\n }),\n draggable: false,\n src: icon_green_flag_default.a,\n title: title,\n onClick: onClick\n // tw: also fire click when opening context menu (right click on all systems and alt+click on chromebooks)\n ,\n onContextMenu: onClick\n }, componentProps));\n};\ngreen_flag_GreenFlagComponent.propTypes = {\n active: prop_types_default.a.bool,\n className: prop_types_default.a.string,\n onClick: prop_types_default.a.func.isRequired,\n title: prop_types_default.a.string\n};\ngreen_flag_GreenFlagComponent.defaultProps = {\n active: false,\n title: 'Go'\n};\n/* harmony default export */ var green_flag_green_flag = (green_flag_GreenFlagComponent);\n// EXTERNAL MODULE: ./src/components/stop-all/icon--stop-all.svg\nvar icon_stop_all = __webpack_require__(342);\nvar icon_stop_all_default = /*#__PURE__*/__webpack_require__.n(icon_stop_all);\n\n// EXTERNAL MODULE: ./src/components/stop-all/stop-all.css\nvar stop_all = __webpack_require__(236);\nvar stop_all_default = /*#__PURE__*/__webpack_require__.n(stop_all);\n\n// CONCATENATED MODULE: ./src/components/stop-all/stop-all.jsx\nconst stop_all_excluded = [\"active\", \"className\", \"onClick\", \"title\"];\nfunction stop_all_extends() { return stop_all_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, stop_all_extends.apply(null, arguments); }\nfunction stop_all_objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = stop_all_objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction stop_all_objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\n\nconst stop_all_StopAllComponent = function StopAllComponent(props) {\n const {\n active,\n className,\n onClick,\n title\n } = props,\n componentProps = stop_all_objectWithoutProperties(props, stop_all_excluded);\n return /*#__PURE__*/react_default.a.createElement(\"img\", stop_all_extends({\n className: classnames_default()(className, stop_all_default.a.stopAll, {\n [stop_all_default.a.isActive]: active\n }),\n draggable: false,\n src: icon_stop_all_default.a,\n title: title,\n onClick: onClick\n }, componentProps));\n};\nstop_all_StopAllComponent.propTypes = {\n active: prop_types_default.a.bool,\n className: prop_types_default.a.string,\n onClick: prop_types_default.a.func.isRequired,\n title: prop_types_default.a.string\n};\nstop_all_StopAllComponent.defaultProps = {\n active: false,\n title: 'Stop'\n};\n/* harmony default export */ var stop_all_stop_all = (stop_all_StopAllComponent);\n// EXTERNAL MODULE: ./src/components/turbo-mode/icon--turbo.svg\nvar icon_turbo = __webpack_require__(343);\nvar icon_turbo_default = /*#__PURE__*/__webpack_require__.n(icon_turbo);\n\n// EXTERNAL MODULE: ./src/components/turbo-mode/turbo-mode.css\nvar turbo_mode = __webpack_require__(201);\nvar turbo_mode_default = /*#__PURE__*/__webpack_require__.n(turbo_mode);\n\n// CONCATENATED MODULE: ./src/components/turbo-mode/turbo-mode.jsx\n\n\n\n\n\nconst TurboMode = _ref => {\n let {\n isSmall\n } = _ref;\n return /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: turbo_mode_default.a.turboContainer\n }, /*#__PURE__*/react_default.a.createElement(\"img\", {\n className: turbo_mode_default.a.turboIcon,\n src: icon_turbo_default.a,\n draggable: false,\n width: 16,\n height: 16\n }), !isSmall && /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: turbo_mode_default.a.turboLabel\n }, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Turbo Mode\",\n id: \"gui.turboMode.active\"\n })));\n};\nTurboMode.propTypes = {\n isSmall: prop_types_default.a.bool\n};\nTurboMode.defaultProps = {\n isSmall: false\n};\n/* harmony default export */ var turbo_mode_turbo_mode = (TurboMode);\n// EXTERNAL MODULE: ./src/components/tw-framerate-indicator/framerate-indicator.css\nvar framerate_indicator = __webpack_require__(166);\nvar framerate_indicator_default = /*#__PURE__*/__webpack_require__.n(framerate_indicator);\n\n// CONCATENATED MODULE: ./src/components/tw-framerate-indicator/framerate-indicator.jsx\n\n\n\n\nconst FramerateIndicator = _ref => {\n let {\n framerate,\n interpolation\n } = _ref;\n return /*#__PURE__*/react_default.a.createElement(react_default.a.Fragment, null, framerate !== 30 && framerate !== 0 && /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: framerate_indicator_default.a.framerateContainer\n }, /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: framerate_indicator_default.a.framerateLabel\n }, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"{framerate} FPS\",\n id: \"tw.fps\",\n values: {\n framerate: framerate\n }\n }))), interpolation && /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: framerate_indicator_default.a.framerateContainer\n }, /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: framerate_indicator_default.a.framerateLabel\n }, /*#__PURE__*/react_default.a.createElement(index_es[\"b\" /* FormattedMessage */], {\n defaultMessage: \"Interpolation\",\n id: \"tw.interpolationEnabled\"\n }))));\n};\nFramerateIndicator.propTypes = {\n framerate: prop_types_default.a.number,\n interpolation: prop_types_default.a.bool\n};\n/* harmony default export */ var tw_framerate_indicator_framerate_indicator = (FramerateIndicator);\n// EXTERNAL MODULE: ./src/components/controls/controls.css\nvar controls = __webpack_require__(344);\nvar controls_default = /*#__PURE__*/__webpack_require__.n(controls);\n\n// CONCATENATED MODULE: ./src/components/controls/controls.jsx\nconst controls_excluded = [\"active\", \"className\", \"intl\", \"onGreenFlagClick\", \"onStopAllClick\", \"turbo\", \"framerate\", \"interpolation\", \"isSmall\"];\nfunction controls_extends() { return controls_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, controls_extends.apply(null, arguments); }\nfunction controls_objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = controls_objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction controls_objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\n\n\n\n\n\nconst controls_messages = Object(index_es[\"g\" /* defineMessages */])({\n goTitle: {\n \"id\": \"gui.controls.go\",\n \"defaultMessage\": \"Go\"\n },\n stopTitle: {\n \"id\": \"gui.controls.stop\",\n \"defaultMessage\": \"Stop\"\n }\n});\nconst controls_Controls = function Controls(props) {\n const {\n active,\n className,\n intl,\n onGreenFlagClick,\n onStopAllClick,\n turbo,\n framerate,\n interpolation,\n isSmall\n } = props,\n componentProps = controls_objectWithoutProperties(props, controls_excluded);\n return /*#__PURE__*/react_default.a.createElement(\"div\", controls_extends({\n className: classnames_default()(controls_default.a.controlsContainer, className)\n }, componentProps), /*#__PURE__*/react_default.a.createElement(green_flag_green_flag, {\n active: active,\n title: intl.formatMessage(controls_messages.goTitle),\n onClick: onGreenFlagClick\n }), /*#__PURE__*/react_default.a.createElement(stop_all_stop_all, {\n active: active,\n title: intl.formatMessage(controls_messages.stopTitle),\n onClick: onStopAllClick\n }), turbo ? /*#__PURE__*/react_default.a.createElement(turbo_mode_turbo_mode, {\n isSmall: isSmall\n }) : null, !isSmall && /*#__PURE__*/react_default.a.createElement(tw_framerate_indicator_framerate_indicator, {\n framerate: framerate,\n interpolation: interpolation\n }));\n};\ncontrols_Controls.propTypes = {\n active: prop_types_default.a.bool,\n className: prop_types_default.a.string,\n intl: index_es[\"i\" /* intlShape */].isRequired,\n onGreenFlagClick: prop_types_default.a.func.isRequired,\n onStopAllClick: prop_types_default.a.func.isRequired,\n framerate: prop_types_default.a.number,\n interpolation: prop_types_default.a.bool,\n isSmall: prop_types_default.a.bool,\n turbo: prop_types_default.a.bool\n};\ncontrols_Controls.defaultProps = {\n active: false,\n turbo: false,\n isSmall: false\n};\n/* harmony default export */ var controls_controls = (Object(index_es[\"h\" /* injectIntl */])(controls_Controls));\n// CONCATENATED MODULE: ./src/containers/controls.jsx\nconst containers_controls_excluded = [\"vm\", \"isStarted\", \"projectRunning\", \"turbo\"];\nfunction containers_controls_extends() { return containers_controls_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, containers_controls_extends.apply(null, arguments); }\nfunction containers_controls_objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = containers_controls_objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction containers_controls_objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\n\n\n\n\n\nclass containers_controls_Controls extends react_default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['handleGreenFlagClick', 'handleStopAllClick']);\n }\n handleGreenFlagClick(e) {\n e.preventDefault();\n // tw: implement alt+click and right click to toggle FPS\n if (e.shiftKey || e.altKey || e.type === 'contextmenu') {\n if (e.shiftKey) {\n this.props.vm.setTurboMode(!this.props.turbo);\n }\n if (e.altKey || e.type === 'contextmenu') {\n if (this.props.framerate === 30) {\n this.props.vm.setFramerate(60);\n } else {\n this.props.vm.setFramerate(30);\n }\n }\n } else {\n if (!this.props.isStarted) {\n this.props.vm.start();\n }\n this.props.vm.greenFlag();\n }\n }\n handleStopAllClick(e) {\n e.preventDefault();\n this.props.vm.stopAll();\n }\n render() {\n const _this$props = this.props,\n {\n vm,\n // eslint-disable-line no-unused-vars\n isStarted,\n // eslint-disable-line no-unused-vars\n projectRunning,\n turbo\n } = _this$props,\n props = containers_controls_objectWithoutProperties(_this$props, containers_controls_excluded);\n return /*#__PURE__*/react_default.a.createElement(controls_controls, containers_controls_extends({}, props, {\n active: projectRunning && isStarted,\n turbo: turbo,\n onGreenFlagClick: this.handleGreenFlagClick,\n onStopAllClick: this.handleStopAllClick\n }));\n }\n}\ncontainers_controls_Controls.propTypes = {\n isStarted: prop_types_default.a.bool.isRequired,\n projectRunning: prop_types_default.a.bool.isRequired,\n turbo: prop_types_default.a.bool.isRequired,\n framerate: prop_types_default.a.number.isRequired,\n interpolation: prop_types_default.a.bool.isRequired,\n isSmall: prop_types_default.a.bool,\n vm: prop_types_default.a.instanceOf(src_default.a)\n};\nconst controls_mapStateToProps = state => ({\n isStarted: state.scratchGui.vmStatus.started,\n projectRunning: state.scratchGui.vmStatus.running,\n framerate: state.scratchGui.tw.framerate,\n interpolation: state.scratchGui.tw.interpolation,\n turbo: state.scratchGui.vmStatus.turbo\n});\n// no-op function to prevent dispatch prop being passed to component\nconst controls_mapDispatchToProps = () => ({});\n/* harmony default export */ var containers_controls = (Object(react_redux_es[\"b\" /* connect */])(controls_mapStateToProps, controls_mapDispatchToProps)(containers_controls_Controls));\n// CONCATENATED MODULE: ./src/lib/screen-utils.js\n\nconst maxScaleParam = typeof URLSearchParams !== 'undefined' && new URLSearchParams(location.search).get('scale');\n\n/**\n * @typedef {object} StageDimensions\n * @property {int} height - the height to be used for the stage in the current situation.\n * @property {int} width - the width to be used for the stage in the current situation.\n * @property {number} scale - the scale factor from the stage's default size to its current size.\n * @property {int} heightDefault - the height of the stage in its default (large) size.\n * @property {int} widthDefault - the width of the stage in its default (large) size.\n */\n\nconst STAGE_DIMENSION_DEFAULTS = {\n // referencing css/units.css,\n // spacingBorderAdjustment = 2 * $full-screen-top-bottom-margin +\n // 2 * $full-screen-border-width\n fullScreenSpacingBorderAdjustment: 8,\n // referencing css/units.css,\n // menuHeightAdjustment = $stage-menu-height\n menuHeightAdjustment: 44\n};\n\n/**\n * Resolve the current GUI and browser state to an actual stage size enum value.\n * @param {STAGE_SIZE_MODES} stageSizeMode - the state of the stage size toggle button.\n * @param {boolean} isUnconstrained - true if the window is large enough for the full stage at its full size.\n * @return {STAGE_DISPLAY_SIZES} - the stage size enum value we should use in this situation.\n */\nconst resolveStageSize = (stageSizeMode, isUnconstrained) => {\n if (stageSizeMode === layout_constants[\"e\" /* STAGE_SIZE_MODES */].full && !isUnconstrained) {\n return layout_constants[\"d\" /* STAGE_DISPLAY_SIZES */].constrained;\n }\n return stageSizeMode;\n};\n\n/**\n * Retrieve info used to determine the actual stage size based on the current GUI and browser state.\n * @param {STAGE_DISPLAY_SIZES} stageSize - the current fully-resolved stage size.\n * @param {{width: number, height: number}} customStageSize Custom stage size\n * @param {boolean} isFullScreen - true if full-screen mode is enabled.\n * @return {StageDimensions} - an object describing the dimensions of the stage.\n */\nconst getStageDimensions = (stageSize, customStageSize, isFullScreen) => {\n const stageDimensions = {\n heightDefault: customStageSize.height,\n widthDefault: customStageSize.width,\n height: 0,\n width: 0,\n scale: 0\n };\n if (isFullScreen) {\n stageDimensions.height = window.innerHeight - STAGE_DIMENSION_DEFAULTS.menuHeightAdjustment - STAGE_DIMENSION_DEFAULTS.fullScreenSpacingBorderAdjustment;\n stageDimensions.width = stageDimensions.height * (customStageSize.width / customStageSize.height);\n const maxWidth = maxScaleParam ? Math.min(window.innerWidth, maxScaleParam * customStageSize.width) : window.innerWidth;\n if (stageDimensions.width > maxWidth) {\n stageDimensions.width = maxWidth;\n stageDimensions.height = stageDimensions.width * (customStageSize.height / customStageSize.width);\n }\n stageDimensions.scale = stageDimensions.width / stageDimensions.widthDefault;\n } else {\n const metadata = layout_constants[\"c\" /* STAGE_DISPLAY_SCALE_METADATA */][stageSize];\n if (metadata.width) {\n // Uses a fixed width.\n stageDimensions.width = metadata.width;\n stageDimensions.scale = stageDimensions.width / stageDimensions.widthDefault;\n stageDimensions.height = stageDimensions.scale * stageDimensions.heightDefault;\n } else {\n // Uses a width relative to the current size.\n stageDimensions.scale = metadata.scale;\n stageDimensions.height = stageDimensions.scale * stageDimensions.heightDefault;\n stageDimensions.width = stageDimensions.scale * stageDimensions.widthDefault;\n }\n }\n\n // Round off dimensions to prevent resampling/blurriness\n stageDimensions.height = Math.round(stageDimensions.height);\n stageDimensions.width = Math.round(stageDimensions.width);\n return stageDimensions;\n};\n\n/**\n * @param {STAGE_DISPLAY_SIZES} stageSize - the current fully-resolved stage size.\n * @returns {number} Minimum width to display the stage area of the screen at. May be wider than the stage's actual size\n */\nconst getMinWidth = stageSize => {\n const metadata = layout_constants[\"c\" /* STAGE_DISPLAY_SCALE_METADATA */][stageSize];\n if (metadata.width) {\n return metadata.width;\n }\n return layout_constants[\"b\" /* FIXED_WIDTH */] * metadata.scale;\n};\n\n/**\n * Take a pair of sizes for the stage (a target height and width and a default height and width),\n * calculate the ratio between them, and return a CSS transform to scale to that ratio.\n * @param {object} sizeInfo An object containing dimensions of the target and default stage sizes.\n * @param {number} sizeInfo.width The target width\n * @param {number} sizeInfo.height The target height\n * @param {number} sizeInfo.widthDefault The default width\n * @param {number} sizeInfo.heightDefault The default height\n * @returns {object} the CSS transform\n */\nconst stageSizeToTransform = _ref => {\n let {\n width,\n height,\n widthDefault,\n heightDefault\n } = _ref;\n const scaleX = width / widthDefault;\n const scaleY = height / heightDefault;\n if (scaleX === 1 && scaleY === 1) {\n // Do not set a transform if the scale is 1 because\n // it messes up `position: fixed` elements like the context menu.\n return;\n }\n return {\n transform: \"scale(\".concat(scaleX, \",\").concat(scaleY, \")\")\n };\n};\n\n// EXTERNAL MODULE: ./src/components/stage-header/icon--fullscreen.svg\nvar icon_fullscreen = __webpack_require__(237);\nvar icon_fullscreen_default = /*#__PURE__*/__webpack_require__.n(icon_fullscreen);\n\n// EXTERNAL MODULE: ./src/components/stage-header/icon--unfullscreen.svg\nvar icon_unfullscreen = __webpack_require__(345);\nvar icon_unfullscreen_default = /*#__PURE__*/__webpack_require__.n(icon_unfullscreen);\n\n// CONCATENATED MODULE: ./src/lib/tw-recolor/build.js!./src/components/stage-header/icon--large-stage.svg\n\n const icon_large_stage_original = \"\\n\\n \\n Large Stage (active)\\n Created with Sketch.\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n\\n\";\n\n const icon_large_stage_getSRC = () => {\n const recolored = typeof Recolor === 'object' ? (\n icon_large_stage_original.replace(/#855cd6/gi, Recolor.primary)\n ) : icon_large_stage_original;\n return 'data:image/svg+xml;,' + encodeURIComponent(recolored);\n };\n\n /* harmony default export */ var icon_large_stage = (icon_large_stage_getSRC);\n\n// CONCATENATED MODULE: ./src/lib/tw-recolor/build.js!./src/components/stage-header/icon--small-stage.svg\n\n const icon_small_stage_original = \"\\n\\n \\n Small Stage (inactive)\\n Created with Sketch.\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n\\n\";\n\n const icon_small_stage_getSRC = () => {\n const recolored = typeof Recolor === 'object' ? (\n icon_small_stage_original.replace(/#855cd6/gi, Recolor.primary)\n ) : icon_small_stage_original;\n return 'data:image/svg+xml;,' + encodeURIComponent(recolored);\n };\n\n /* harmony default export */ var icon_small_stage = (icon_small_stage_getSRC);\n\n// CONCATENATED MODULE: ./src/lib/tw-recolor/build.js!./src/components/stage-header/icon--full-stage.svg\n\n const icon_full_stage_original = \"\";\n\n const icon_full_stage_getSRC = () => {\n const recolored = typeof Recolor === 'object' ? (\n icon_full_stage_original.replace(/#855cd6/gi, Recolor.primary)\n ) : icon_full_stage_original;\n return 'data:image/svg+xml;,' + encodeURIComponent(recolored);\n };\n\n /* harmony default export */ var icon_full_stage = (icon_full_stage_getSRC);\n\n// EXTERNAL MODULE: ./src/components/stage-header/icon--settings.svg\nvar icon_settings = __webpack_require__(346);\nvar icon_settings_default = /*#__PURE__*/__webpack_require__.n(icon_settings);\n\n// EXTERNAL MODULE: ./src/components/stage-header/stage-header.css\nvar stage_header = __webpack_require__(33);\nvar stage_header_default = /*#__PURE__*/__webpack_require__.n(stage_header);\n\n// EXTERNAL MODULE: ./src/lib/tw-fullscreen-api.js\nvar tw_fullscreen_api = __webpack_require__(213);\n\n// CONCATENATED MODULE: ./src/components/stage-header/stage-header.jsx\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst stage_header_messages = Object(index_es[\"g\" /* defineMessages */])({\n largeStageSizeMessage: {\n \"id\": \"gui.stageHeader.stageSizeLarge\",\n \"defaultMessage\": \"Switch to large stage\"\n },\n smallStageSizeMessage: {\n \"id\": \"gui.stageHeader.stageSizeSmall\",\n \"defaultMessage\": \"Switch to small stage\"\n },\n fullStageSizeMessage: {\n \"id\": \"tw.stageHeader.full\",\n \"defaultMessage\": \"Switch to full stage\"\n },\n fullScreenMessage: {\n \"id\": \"gui.stageHeader.stageSizeFull\",\n \"defaultMessage\": \"Enter full screen mode\"\n },\n unFullScreenMessage: {\n \"id\": \"gui.stageHeader.stageSizeUnFull\",\n \"defaultMessage\": \"Exit full screen mode\"\n },\n fullscreenControl: {\n \"id\": \"gui.stageHeader.fullscreenControl\",\n \"defaultMessage\": \"Full Screen Control\"\n },\n openSettingsMessage: {\n \"id\": \"tw.openAdvanced\",\n \"defaultMessage\": \"Open advanced settings\"\n }\n});\nconst enableSettingsButton = new URLSearchParams(location.search).has('settings-button');\nconst stage_header_StageHeaderComponent = function StageHeaderComponent(props) {\n const {\n customStageSize,\n showFixedLargeSize,\n isFullScreen,\n isPlayerOnly,\n onKeyPress,\n onSetStageFullScreen,\n onSetStageUnFullScreen,\n onSetStageLarge,\n onSetStageSmall,\n onSetStageFull,\n onOpenSettings,\n isEmbedded,\n stageSize,\n stageSizeMode,\n vm\n } = props;\n let header = null;\n const stageDimensions = getStageDimensions(stageSize, customStageSize, isFullScreen || isEmbedded);\n if (isFullScreen || isEmbedded) {\n const settingsButton = isEmbedded && enableSettingsButton ? /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: classnames_default()(stage_header_default.a.settingsButton, stage_header_default.a.unselectWrapper)\n }, /*#__PURE__*/react_default.a.createElement(button_button[\"a\" /* default */], {\n className: stage_header_default.a.stageButton,\n onClick: onOpenSettings\n }, /*#__PURE__*/react_default.a.createElement(\"img\", {\n alt: props.intl.formatMessage(stage_header_messages.openSettingsMessage),\n className: stage_header_default.a.stageButtonIcon,\n draggable: false,\n src: icon_settings_default.a,\n title: props.intl.formatMessage(stage_header_messages.openSettingsMessage)\n }))) : null;\n const fullscreenButton = isFullScreen ? /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: stage_header_default.a.unselectWrapper\n }, /*#__PURE__*/react_default.a.createElement(button_button[\"a\" /* default */], {\n className: stage_header_default.a.stageButton,\n onClick: onSetStageUnFullScreen,\n onKeyPress: onKeyPress\n }, /*#__PURE__*/react_default.a.createElement(\"img\", {\n alt: props.intl.formatMessage(stage_header_messages.unFullScreenMessage),\n className: stage_header_default.a.stageButtonIcon,\n draggable: false,\n src: icon_unfullscreen_default.a,\n title: props.intl.formatMessage(stage_header_messages.fullscreenControl)\n }))) : tw_fullscreen_api[\"a\" /* default */].available() ? /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: stage_header_default.a.unselectWrapper\n }, /*#__PURE__*/react_default.a.createElement(button_button[\"a\" /* default */], {\n className: stage_header_default.a.stageButton,\n onClick: onSetStageFullScreen\n }, /*#__PURE__*/react_default.a.createElement(\"img\", {\n alt: props.intl.formatMessage(stage_header_messages.fullScreenMessage),\n className: stage_header_default.a.stageButtonIcon,\n draggable: false,\n src: icon_fullscreen_default.a,\n title: props.intl.formatMessage(stage_header_messages.fullscreenControl)\n }))) : null;\n header = /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: classnames_default()(stage_header_default.a.stageHeaderWrapperOverlay, {\n [stage_header_default.a.embedded]: isEmbedded\n })\n }, /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: stage_header_default.a.stageMenuWrapper,\n style: {\n width: stageDimensions.width\n }\n }, /*#__PURE__*/react_default.a.createElement(containers_controls, {\n vm: vm\n }), /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: stage_header_default.a.fullscreenButtonsRow,\n key: \"fullscreen\" // addons require the HTML element to be not be re-used by in-editor buttons\n }, settingsButton, fullscreenButton)));\n } else {\n const stageControls = isPlayerOnly ? [] : /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: stage_header_default.a.stageSizeToggleGroup\n }, /*#__PURE__*/react_default.a.createElement(toggle_buttons_toggle_buttons, {\n buttons: [{\n handleClick: onSetStageSmall,\n icon: icon_small_stage,\n iconClassName: stage_header_default.a.stageButtonIcon,\n isSelected: stageSizeMode === layout_constants[\"e\" /* STAGE_SIZE_MODES */].small,\n title: props.intl.formatMessage(stage_header_messages.smallStageSizeMessage)\n }, ...(showFixedLargeSize ? [{\n handleClick: onSetStageLarge,\n icon: icon_large_stage,\n iconClassName: stage_header_default.a.stageButtonIcon,\n isSelected: stageSizeMode === layout_constants[\"e\" /* STAGE_SIZE_MODES */].large,\n title: props.intl.formatMessage(stage_header_messages.largeStageSizeMessage)\n }] : []), {\n handleClick: onSetStageFull,\n icon: showFixedLargeSize ? icon_full_stage : icon_large_stage,\n iconClassName: stage_header_default.a.stageButtonIcon,\n isSelected: stageSizeMode === layout_constants[\"e\" /* STAGE_SIZE_MODES */].full,\n title: props.intl.formatMessage(stage_header_messages.fullStageSizeMessage)\n }]\n }));\n header = /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: stage_header_default.a.stageHeaderWrapper\n // + 2 px because the stage will have 2 pixels of border around it\n ,\n style: {\n minWidth: \"\".concat(stageDimensions.width + 2, \"px\")\n }\n }, /*#__PURE__*/react_default.a.createElement(box[\"a\" /* default */], {\n className: stage_header_default.a.stageMenuWrapper\n }, /*#__PURE__*/react_default.a.createElement(containers_controls, {\n vm: vm,\n isSmall: stageSizeMode === layout_constants[\"e\" /* STAGE_SIZE_MODES */].small\n }), /*#__PURE__*/react_default.a.createElement(\"div\", {\n className: stage_header_default.a.stageSizeRow,\n key: \"editor\" // addons require the HTML element to be not be re-used by in-editor buttons\n }, stageControls, /*#__PURE__*/react_default.a.createElement(\"div\", null, /*#__PURE__*/react_default.a.createElement(button_button[\"a\" /* default */], {\n className: stage_header_default.a.stageButton,\n onClick: onSetStageFullScreen\n }, /*#__PURE__*/react_default.a.createElement(\"img\", {\n alt: props.intl.formatMessage(stage_header_messages.fullStageSizeMessage),\n className: stage_header_default.a.stageButtonIcon,\n draggable: false,\n src: icon_fullscreen_default.a,\n title: props.intl.formatMessage(stage_header_messages.fullscreenControl)\n }))))));\n }\n return header;\n};\nconst stage_header_mapStateToProps = state => ({\n // This is the button's mode, as opposed to the actual current state\n stageSizeMode: state.scratchGui.stageSize.stageSize\n});\nstage_header_StageHeaderComponent.propTypes = {\n intl: index_es[\"i\" /* intlShape */],\n customStageSize: prop_types_default.a.shape({\n width: prop_types_default.a.number,\n height: prop_types_default.a.number\n }),\n showFixedLargeSize: prop_types_default.a.bool,\n isFullScreen: prop_types_default.a.bool.isRequired,\n isPlayerOnly: prop_types_default.a.bool.isRequired,\n onKeyPress: prop_types_default.a.func.isRequired,\n onSetStageFullScreen: prop_types_default.a.func.isRequired,\n onSetStageUnFullScreen: prop_types_default.a.func.isRequired,\n onSetStageLarge: prop_types_default.a.func.isRequired,\n onSetStageSmall: prop_types_default.a.func.isRequired,\n onSetStageFull: prop_types_default.a.func.isRequired,\n onOpenSettings: prop_types_default.a.func.isRequired,\n isEmbedded: prop_types_default.a.bool.isRequired,\n stageSize: prop_types_default.a.oneOf(Object.keys(layout_constants[\"d\" /* STAGE_DISPLAY_SIZES */])),\n stageSizeMode: prop_types_default.a.oneOf(Object.keys(layout_constants[\"e\" /* STAGE_SIZE_MODES */])),\n vm: prop_types_default.a.instanceOf(src_default.a).isRequired\n};\nstage_header_StageHeaderComponent.defaultProps = {\n stageSizeMode: layout_constants[\"e\" /* STAGE_SIZE_MODES */].large\n};\n/* harmony default export */ var stage_header_stage_header = (Object(index_es[\"h\" /* injectIntl */])(Object(react_redux_es[\"b\" /* connect */])(stage_header_mapStateToProps)(stage_header_StageHeaderComponent)));\n// CONCATENATED MODULE: ./src/containers/stage-header.jsx\nfunction stage_header_extends() { return stage_header_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, stage_header_extends.apply(null, arguments); }\n\n\n\n\n\n\n\n\n\n\n\n// eslint-disable-next-line react/prefer-stateless-function\nclass stage_header_StageHeader extends react_default.a.Component {\n constructor(props) {\n super(props);\n lodash_bindall_default()(this, ['handleKeyPress']);\n this.checkInvalidStageSizeMode();\n }\n componentDidMount() {\n document.addEventListener('keydown', this.handleKeyPress);\n }\n componentDidUpdate() {\n this.checkInvalidStageSizeMode();\n }\n componentWillUnmount() {\n document.removeEventListener('keydown', this.handleKeyPress);\n }\n handleKeyPress(event) {\n if (event.key === 'Escape' && this.props.isFullScreen) {\n this.props.onSetStageUnFullScreen();\n }\n }\n checkInvalidStageSizeMode() {\n // Switch from \"large\" to \"full\" when the large option isn't even displayed in the interface\n if (this.props.stageSizeMode === layout_constants[\"e\" /* STAGE_SIZE_MODES */].large && !this.showFixedLargeSize()) {\n this.props.onSetStageFull();\n }\n }\n showFixedLargeSize() {\n // Fixed width \"large\" mode should only be available when it would be smaller than the constrained\n // full stage, otherwise there are some sizes where switching to the smaller size would make it\n // larger instead of smaller.\n const constrainedScale = layout_constants[\"c\" /* STAGE_DISPLAY_SCALE_METADATA */][layout_constants[\"d\" /* STAGE_DISPLAY_SIZES */].constrained].scale;\n const constrainedWidth = this.props.customStageSize.width * constrainedScale;\n const largeWidth = layout_constants[\"c\" /* STAGE_DISPLAY_SCALE_METADATA */][layout_constants[\"d\" /* STAGE_DISPLAY_SIZES */].large].width;\n return constrainedWidth > largeWidth;\n }\n render() {\n const props = stage_header_extends({}, this.props);\n return /*#__PURE__*/react_default.a.createElement(stage_header_stage_header, stage_header_extends({}, props, {\n onKeyPress: this.handleKeyPress,\n showFixedLargeSize: this.showFixedLargeSize()\n }));\n }\n}\nstage_header_StageHeader.propTypes = {\n isFullScreen: prop_types_default.a.bool.isRequired,\n // tw: update when dimensions or isWindowFullScreen changes\n isWindowFullScreen: prop_types_default.a.bool.isRequired,\n customStageSize: prop_types_default.a.shape({\n width: prop_types_default.a.number.isRequired,\n height: prop_types_default.a.number.isRequired\n }).isRequired,\n dimensions: prop_types_default.a.arrayOf(prop_types_default.a.number),\n isPlayerOnly: prop_types_default.a.bool,\n onSetStageUnFullScreen: prop_types_default.a.func.isRequired,\n onSetStageFull: prop_types_default.a.func.isRequired,\n onOpenSettings: prop_types_default.a.func.isRequired,\n // tw: replace showBranding\n isEmbedded: prop_types_default.a.bool.isRequired,\n stageSizeMode: prop_types_default.a.oneOf(Object.keys(layout_constants[\"e\" /* STAGE_SIZE_MODES */])).isRequired,\n vm: prop_types_default.a.instanceOf(src_default.a).isRequired\n};\nconst containers_stage_header_mapStateToProps = state => ({\n customStageSize: state.scratchGui.customStageSize,\n stageSizeMode: state.scratchGui.stageSize.stageSize,\n // tw: replace showBranding\n isEmbedded: state.scratchGui.mode.isEmbedded,\n isFullScreen: state.scratchGui.mode.isFullScreen,\n // tw: update when dimensions or isWindowFullScreen changes\n isWindowFullScreen: state.scratchGui.tw.isWindowFullScreen,\n dimensions: state.scratchGui.tw.dimensions,\n isPlayerOnly: state.scratchGui.mode.isPlayerOnly\n});\nconst stage_header_mapDispatchToProps = dispatch => ({\n onSetStageLarge: () => dispatch(Object(stage_size[\"b\" /* setStageSize */])(layout_constants[\"e\" /* STAGE_SIZE_MODES */].large)),\n onSetStageSmall: () => dispatch(Object(stage_size[\"b\" /* setStageSize */])(layout_constants[\"e\" /* STAGE_SIZE_MODES */].small)),\n onSetStageFull: () => dispatch(Object(stage_size[\"b\" /* setStageSize */])(layout_constants[\"e\" /* STAGE_SIZE_MODES */].full)),\n onSetStageFullScreen: () => dispatch(Object(reducers_mode[\"c\" /* setFullScreen */])(true)),\n onSetStageUnFullScreen: () => dispatch(Object(reducers_mode[\"c\" /* setFullScreen */])(false)),\n onOpenSettings: () => dispatch(Object(modals[\"C\" /* openSettingsModal */])())\n});\n/* harmony default export */ var containers_stage_header = (Object(react_redux_es[\"b\" /* connect */])(containers_stage_header_mapStateToProps, stage_header_mapDispatchToProps)(stage_header_StageHeader));\n// EXTERNAL MODULE: ./node_modules/scratch-render/src/index.js\nvar scratch_render_src = __webpack_require__(220);\nvar scratch_render_src_default = /*#__PURE__*/__webpack_require__.n(scratch_render_src);\n\n// CONCATENATED MODULE: ./src/lib/video/camera.js\n\n\n// Single Setup For All Video Streams used by the GUI\n// While VideoProvider uses a private _singleSetup\n// property to ensure that each instance of a VideoProvider\n// use the same setup, this ensures that all instances\n// of VideoProviders use a single stream. This way, closing a camera modal\n// does not affect the video on the stage, and a program running and disabling\n// video on the stage will not affect the camera modal's video.\nconst requestStack = [];\nconst requestVideoStream = videoDesc => {\n let streamPromise;\n if (requestStack.length === 0) {\n streamPromise = get_user_media_promise_default()({\n audio: false,\n video: videoDesc\n });\n requestStack.push(streamPromise);\n } else if (requestStack.length > 0) {\n streamPromise = requestStack[0];\n requestStack.push(true);\n }\n return streamPromise;\n};\nconst requestDisableVideo = () => {\n requestStack.pop();\n if (requestStack.length > 0) return false;\n return true;\n};\n\n// CONCATENATED MODULE: ./src/lib/video/video-provider.js\n\n\n\n/**\n * Video Manager for video extensions.\n */\nclass video_provider_VideoProvider {\n constructor() {\n /**\n * Default value for mirrored frames.\n * @type boolean\n */\n this.mirror = true;\n\n /**\n * Cache frames for this many ms.\n * @type number\n */\n this._frameCacheTimeout = 16;\n\n /**\n * DOM Video element\n * @private\n */\n this._video = null;\n\n /**\n * Usermedia stream track\n * @private\n */\n this._track = null;\n\n /**\n * Stores some canvas/frame data per resolution/mirror states\n */\n this._workspace = [];\n }\n static get FORMAT_IMAGE_DATA() {\n return 'image-data';\n }\n static get FORMAT_CANVAS() {\n return 'canvas';\n }\n\n /**\n * Dimensions the video stream is analyzed at after its rendered to the\n * sample canvas.\n * @type {Array.}\n */\n static get DIMENSIONS() {\n return [480, 360];\n }\n\n /**\n * Order preview drawable is inserted at in the renderer.\n * @type {number}\n */\n static get ORDER() {\n return 1;\n }\n\n /**\n * Get the HTML video element containing the stream\n */\n get video() {\n return this._video;\n }\n\n /**\n * Request video be enabled. Sets up video, creates video skin and enables preview.\n *\n * @return {Promise.