1
0
mirror of synced 2024-11-17 04:23:50 +00:00
CuttingBoard/docs/js/app.a1173833.js.map

1 line
114 KiB
Plaintext

{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/App.vue?8e57","webpack:///./src/App.vue","webpack:///./src/components/Settings.vue","webpack:///./src/lib/units.js","webpack:///./src/components/Settings.vue?b32f","webpack:///./src/components/Layers.vue","webpack:///./src/components/Layers.vue?f1ba","webpack:///./src/components/Wood.vue","webpack:///./src/components/Wood.vue?85c2","webpack:///./src/components/EndGrainPreview.vue","webpack:///./src/components/EndGrainPreview.vue?ab3d","webpack:///./src/components/EdgeGrainPreview.vue","webpack:///./src/components/EdgeGrainPreview.vue?0ca3","webpack:///./src/components/CuttingList.vue","webpack:///./src/components/CuttingList.vue?203c","webpack:///./src/lib/base64.js","webpack:///./src/App.vue?eabf","webpack:///./src/lib/enums.js","webpack:///./src/store.js","webpack:///./src/main.js","webpack:///./src/App.vue?61d6","webpack:///./src/components/EdgeGrainPreview.vue?d87f","webpack:///./src/components/Wood.vue?9d37","webpack:///./src/components/EndGrainPreview.vue?e4bc","webpack:///./src/components/CuttingList.vue?ff1d","webpack:///./src/components/Layers.vue?10ca","webpack:///./src/components/Settings.vue?cedc"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice","class","for","type","ref","accept","href","target","tab","icon","size","fixed-width","printEndGrain","id","printEdgeGrain","printCuttingList","print","saveFilename","save","load","scale","boards","board","boardIndex","settings","units","$store","commit","$event","bladeKerf","parseFloatDef","crosscutWidth","millimetersPerInch","millimetersPerCentimeter","pixelsPerMillimeter","convert","fromUnits","toUnits","millimeters","this","toMillimeters","fromMillimeters","toPixels","Math","ceil","console","error","display","displayValue","limitDecimals","decimals","power","pow","round","computed","state","methods","parsedValue","parseFloat","is","NaN","render","__scopeId","previousBoard","disabled","removeBoard","addBoard","nextBoard","currentBoard","thickness","layers","layer","index","dropTarget","startDrag","wood","item","width","removeLayer","widthWarning","addLayer","checked","borders","direction","setDirection","dragIndex","self","minWidth","currentWidth","maxWidth","forEach","boardWidth","map","reduce","accumulator","currentValue","message","maxBoardWidth","dragMouseMove","event","getTargetLayer","pageY","document","removeEventListener","from","to","addEventListener","yPos","firstLayer","getPageOffsetRect","$refs","layer0","lastLayer","bottom","top","currentTarget","testTarget","element","clientRect","getBoundingClientRect","scrollLeft","pageXOffset","documentElement","scrollTop","pageYOffset","left","right","color","removeWood","addWood","boardHeight","viewportWidth","height","viewportHeight","viewBox","x","y","getBoardLayerOffset","style","getBoardLayerStyle","x1","y1","x2","y2","boardPixelHeight","endGrain","getLayerOffset","transform","getLayerTransform","mouseDown","props","Number","boardPixelWidth","floor","offset","woodIndex","borderStyle","reversed","reverseLayer","startX","pageX","dragging","moveEvent","abs","getTargetStrip","xPos","firstStrip","strip0","lastStrip","getLayerStyle","colspan","getLayerWood","getLayerWidth","bom","stock","woodName","woodTally","base64abc","base64codes","getBase64Code","charCode","Error","code","bytesToBase64","bytes","base64ToBytes","str","indexOf","buffer","missingOctets","endsWith","Uint8Array","charCodeAt","subarray","components","EndGrainPreview","EdgeGrainPreview","Settings","Layers","Wood","CuttingList","created","checkHash","location","hash","substring","decoded","e","getters","saveMsgPack","blob","Blob","loadFile","files","toLowerCase","reader","FileReader","readAsBinaryString","watch","newValue","history","replaceState","UnitsEnum","mm","cm","inchdecimal","DirectionEnum","uniform","alternate","custom","DefaultSettings","DefaultWood","DefaultBoards","DefaultEndGrain","updateEndGrain","createStore","mutations","payload","moveLayer","moveArrayItem","updateSettings","oldUnits","mergeObject","copyFrom","source","updateBoard","oldLength","values","moveEndgrain","parsedPayload","JSON","parse","loadObject","loadMsgPack","deserialize","serialized","serializeState","stringify","serialize","array","boardTally","cutWidth","remove","boardAvailable","remaining","isNaN","parseIntDef","parseInt","deserialized","deserializeState","SettingsNameMapJSON","SettingsNameMapMsgPack","messagePack","serializeSettings","serializeWood","serializeBoards","serializeEndgrain","boardResult","layerResult","deserializeSettings","deserializeWood","deserializeBoards","deserializeEndgrain","alternateDirection","boardLength","boardThickness","isValid","Array","isArray","test","library","add","faSlidersH","faLayerGroup","faSave","faPrint","faInfoCircle","faTree","createApp","App","use","store","component","FontAwesomeIcon","mount"],"mappings":"aACE,SAASA,EAAqBC,GAQ7B,IAPA,IAMIC,EAAUC,EANVC,EAAWH,EAAK,GAChBI,EAAcJ,EAAK,GACnBK,EAAiBL,EAAK,GAIHM,EAAI,EAAGC,EAAW,GACpCD,EAAIH,EAASK,OAAQF,IACzBJ,EAAUC,EAASG,GAChBG,OAAOC,UAAUC,eAAeC,KAAKC,EAAiBX,IAAYW,EAAgBX,IACpFK,EAASO,KAAKD,EAAgBX,GAAS,IAExCW,EAAgBX,GAAW,EAE5B,IAAID,KAAYG,EACZK,OAAOC,UAAUC,eAAeC,KAAKR,EAAaH,KACpDc,EAAQd,GAAYG,EAAYH,IAG/Be,GAAqBA,EAAoBhB,GAE5C,MAAMO,EAASC,OACdD,EAASU,OAATV,GAOD,OAHAW,EAAgBJ,KAAKK,MAAMD,EAAiBb,GAAkB,IAGvDe,IAER,SAASA,IAER,IADA,IAAIC,EACIf,EAAI,EAAGA,EAAIY,EAAgBV,OAAQF,IAAK,CAG/C,IAFA,IAAIgB,EAAiBJ,EAAgBZ,GACjCiB,GAAY,EACRC,EAAI,EAAGA,EAAIF,EAAed,OAAQgB,IAAK,CAC9C,IAAIC,EAAQH,EAAeE,GACG,IAA3BX,EAAgBY,KAAcF,GAAY,GAE3CA,IACFL,EAAgBQ,OAAOpB,IAAK,GAC5Be,EAASM,EAAoBA,EAAoBC,EAAIN,EAAe,KAItE,OAAOD,EAIR,IAAIQ,EAAmB,GAKnBhB,EAAkB,CACrB,IAAO,GAGJK,EAAkB,GAGtB,SAASS,EAAoB1B,GAG5B,GAAG4B,EAAiB5B,GACnB,OAAO4B,EAAiB5B,GAAU6B,QAGnC,IAAIC,EAASF,EAAiB5B,GAAY,CACzCK,EAAGL,EACH+B,GAAG,EACHF,QAAS,IAUV,OANAf,EAAQd,GAAUW,KAAKmB,EAAOD,QAASC,EAAQA,EAAOD,QAASH,GAG/DI,EAAOC,GAAI,EAGJD,EAAOD,QAKfH,EAAoBM,EAAIlB,EAGxBY,EAAoBO,EAAIL,EAGxBF,EAAoBQ,EAAI,SAASL,EAASM,EAAMC,GAC3CV,EAAoBW,EAAER,EAASM,IAClC3B,OAAO8B,eAAeT,EAASM,EAAM,CAAEI,YAAY,EAAMC,IAAKJ,KAKhEV,EAAoBe,EAAI,SAASZ,GACX,qBAAXa,QAA0BA,OAAOC,aAC1CnC,OAAO8B,eAAeT,EAASa,OAAOC,YAAa,CAAEC,MAAO,WAE7DpC,OAAO8B,eAAeT,EAAS,aAAc,CAAEe,OAAO,KAQvDlB,EAAoBmB,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQlB,EAAoBkB,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,kBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAKxC,OAAOyC,OAAO,MAGvB,GAFAvB,EAAoBe,EAAEO,GACtBxC,OAAO8B,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOlB,EAAoBQ,EAAEc,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,IAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIRtB,EAAoB0B,EAAI,SAAStB,GAChC,IAAIM,EAASN,GAAUA,EAAOiB,WAC7B,WAAwB,OAAOjB,EAAO,YACtC,WAA8B,OAAOA,GAEtC,OADAJ,EAAoBQ,EAAEE,EAAQ,IAAKA,GAC5BA,GAIRV,EAAoBW,EAAI,SAASgB,EAAQC,GAAY,OAAO9C,OAAOC,UAAUC,eAAeC,KAAK0C,EAAQC,IAGzG5B,EAAoB6B,EAAI,GAExB,IAAIC,EAAaC,OAAO,gBAAkBA,OAAO,iBAAmB,GAChEC,EAAmBF,EAAW3C,KAAKsC,KAAKK,GAC5CA,EAAW3C,KAAOf,EAClB0D,EAAaA,EAAWG,QACxB,IAAI,IAAItD,EAAI,EAAGA,EAAImD,EAAWjD,OAAQF,IAAKP,EAAqB0D,EAAWnD,IAC3E,IAAIU,EAAsB2C,EAI1BzC,EAAgBJ,KAAK,CAAC,EAAE,kBAEjBM,K,sGCvJT,W,yMCCOyC,MAAM,uB,GACJA,MAAM,W,iBACwH,a,iBACb,S,iBACW,W,iBACH,gB,iBACL,U,iBACM,U,GAG1HA,MAAM,Q,GACJA,MAAM,O,GAINA,MAAM,O,GAINA,MAAM,O,GAINA,MAAM,O,EACT,eAEI,SAFD,2KAEH,G,EAIE,eAAqD,SAA9CC,IAAI,iBAAgB,sBAAkB,G,EAI7C,eAAuD,SAAhDA,IAAI,kBAAiB,uBAAmB,G,EAI/C,eAAyE,SAAlEA,IAAI,oBAAmB,uCAAmC,G,EAGnE,eAAM,mB,GAIHD,MAAM,O,EACT,eAEI,SAFD,mOAEH,G,GAQSE,KAAK,OAAOC,IAAI,WAAWC,OAAO,S,GAKxCJ,MAAM,O,EACT,eAEI,U,eAFD,0GACoG,eAA2E,KAAxEK,KAAK,yCAAyCC,OAAO,UAAS,U,eAAU,gD,KAElL,eAEI,U,eAFD,yBACmB,eAA6D,KAA1DD,KAAK,wCAAuC,c,eAAc,Q,MAMpFL,MAAM,W,EAEP,eAAkB,UAAd,aAAS,G,EAKb,eAAmB,UAAf,cAAU,G,YAQd,eAAqB,UAAjB,gBAAY,G,wUAvFpB,eAsEM,MAtEN,EAsEM,CArEJ,eAOM,MAPN,EAOM,CANJ,eAA8I,KAA1IA,MAAK,QAAe,aAAH,EAAAO,KAAuB,QAAK,+BAAE,EAAAA,IAAG,c,CAAe,eAA4D,GAAzCC,KAAK,YAAYC,KAAK,KAAKC,cAAA,K,MACnH,eAA6H,KAAzHV,MAAK,QAAe,SAAH,EAAAO,KAAmB,QAAK,+BAAE,EAAAA,IAAG,U,CAAW,eAAuD,GAApCC,KAAK,OAAOC,KAAK,KAAKC,cAAA,K,MACtG,eAA0I,KAAtIV,MAAK,QAAe,WAAH,EAAAO,KAAqB,QAAK,+BAAE,EAAAA,IAAG,Y,CAAa,eAA8D,GAA3CC,KAAK,cAAcC,KAAK,KAAKC,cAAA,K,MACjH,eAA4I,KAAxIV,MAAK,QAAe,aAAH,EAAAO,KAAuB,QAAK,+BAAE,EAAAA,IAAG,c,CAAe,eAAuD,GAApCC,KAAK,OAAOC,KAAK,KAAKC,cAAA,K,MAC9G,eAAiI,KAA7HV,MAAK,QAAe,UAAH,EAAAO,KAAoB,QAAK,+BAAE,EAAAA,IAAG,W,CAAY,eAAwD,GAArCC,KAAK,QAAQC,KAAK,KAAKC,cAAA,K,MACzG,eAAuI,KAAnIV,MAAK,QAAe,UAAH,EAAAO,KAAoB,QAAK,+BAAE,EAAAA,IAAG,W,CAAY,eAA8D,GAA3CC,KAAK,cAAcC,KAAK,KAAKC,cAAA,K,QAGjH,eA2DM,MA3DN,EA2DM,C,eA1DJ,eAEM,MAFN,EAEM,CADJ,eAAY,I,cADc,aAAH,EAAAH,O,eAIzB,eAEM,MAFN,EAEM,CADJ,eAAU,I,cADgB,WAAH,EAAAA,O,eAIzB,eAEM,MAFN,EAEM,CADJ,eAAQ,I,cADkB,SAAH,EAAAA,O,eAIzB,eAoBM,MApBN,EAoBM,CAnBJ,EAIA,eAGM,Y,eAFJ,eAAoE,SAA7DL,KAAK,W,qDAAoB,EAAAS,cAAa,IAAEC,GAAG,iB,mBAAlB,EAAAD,iBAChC,IAEF,eAGM,Y,eAFJ,eAAsE,SAA/DT,KAAK,W,qDAAoB,EAAAW,eAAc,IAAED,GAAG,kB,mBAAnB,EAAAC,kBAChC,IAEF,eAGM,Y,eAFJ,eAA0E,SAAnEX,KAAK,W,qDAAoB,EAAAY,iBAAgB,IAAEF,GAAG,oB,mBAArB,EAAAE,oBAChC,IAGF,EACA,eAAqC,UAA5B,QAAK,gCAAE,EAAAC,OAAA,EAAAA,MAAA,sBAAO,U,cAnBG,UAAH,EAAAR,O,eAsBzB,eAcM,MAdN,EAcM,CAbJ,EAIA,eAGI,U,eAFF,eAA4C,SAArCL,KAAK,O,uDAAgB,EAAAc,aAAY,K,mBAAZ,EAAAA,gBAC5B,eAAmC,UAA1B,QAAK,gCAAE,EAAAC,MAAA,EAAAA,KAAA,sBAAM,UAGxB,eAGI,UAFF,eAAmD,QAAnD,EAAmD,UACnD,eAAmC,UAA1B,QAAK,gCAAE,EAAAC,MAAA,EAAAA,KAAA,sBAAM,W,cAZE,aAAH,EAAAX,O,eAgBzB,eAOM,MAPN,EAOM,CANJ,EAGA,G,cAJ0B,UAAH,EAAAA,WAW7B,eAkBM,MAlBN,EAkBM,CAjBJ,eAGM,OAHAP,MAAK,cAAkB,EAAAW,gB,CAC3B,EACA,eAA8B,GAAZQ,MAAO,K,GAG3B,eAMM,OANAnB,MAAK,cAAkB,EAAAa,iB,CAC3B,G,mBACA,eAGW,2BAH6B,EAAAO,QAAM,SAA5BC,EAAOC,G,oDACb,EAAAF,OAAOzE,OAAM,G,iBAAvB,eAA2D,OAA9B,SAAM,eAAG2E,EAAa,GAAH,I,sBAChD,eAA8C,GAA3BD,MAAOA,EAAQF,MAAO,G,oCAI7C,eAGM,OAHAnB,MAAK,cAAkB,EAAAc,mB,CAC3B,EACA,eAAe,I,gHCxFdd,MAAM,Y,EACT,eAAiB,UAAb,YAAQ,G,EAEZ,eAAgC,SAAzBC,IAAI,SAAQ,SAAK,G,EAEtB,eAAuC,UAA/BjB,MAAM,MAAK,eAAW,G,EAC9B,eAAuC,UAA/BA,MAAM,MAAK,eAAW,G,EAC9B,eAAqD,UAA7CA,MAAM,eAAc,oBAAgB,G,EAI9C,eAAc,UAAV,SAAK,G,EACT,eAAyC,SAAlCiB,IAAI,aAAY,cAAU,G,EAGjC,eAAkB,UAAd,aAAS,G,EACb,eAAiD,SAA1CA,IAAI,iBAAgB,kBAAc,G,wEAhB3C,eAkBM,MAlBN,EAkBM,CAjBJ,EAEA,EACA,eAKS,UALDW,GAAG,QAAS5B,MAAO,EAAAuC,SAASC,MAAQ,SAAM,+BAAE,EAAAC,OAAOC,OAAM,wBAA4BC,EAAOrB,OAAOtB,W,CACzG,EACA,EACA,G,cAIF,EACA,EACA,eAA+J,SAAxJ4B,GAAG,YAAYV,KAAK,SAAUlB,MAAO,EAAAuC,SAASK,UAAY,SAAM,+BAAE,EAAAH,OAAOC,OAAM,4BAAgC,EAAAG,cAAcF,EAAOrB,OAAOtB,Y,mBAElJ,EACA,EACA,eAA2K,SAApK4B,GAAG,gBAAgBV,KAAK,SAAUlB,MAAO,EAAAuC,SAASO,cAAgB,SAAM,+BAAE,EAAAL,OAAOC,OAAM,gCAAoC,EAAAG,cAAcF,EAAOrB,OAAOtB,Y,wBClB5J+C,G,UAAqB,MACrBC,EAA2B,GAC3BC,EAAsB,EAItBT,EAAQ,CACZU,QADY,SACJlD,EAAOmD,EAAWC,GAExB,IAAMC,EAAcC,KAAKC,cAAcvD,EAAOmD,GAC9C,OAAOG,KAAKE,gBAAgBH,EAAaD,IAI3CK,SARY,SAQHzD,EAAOwC,GAEd,OAAOkB,KAAKC,KAAKL,KAAKC,cAAcvD,EAAOwC,GAASS,IAItDM,cAdY,SAcEvD,EAAOwC,GAEnB,OAAQA,GAEN,IAAK,KAAM,OAAOxC,EAClB,IAAK,KAAM,OAAOA,EAAQgD,EAC1B,IAAK,cAAe,OAAOhD,EAAQ+C,EAIrC,OADAa,QAAQC,MAAM,uBAAyBrB,GAChC,GAITgB,gBA5BY,SA4BIxD,EAAOwC,GAErB,OAAQA,GAEN,IAAK,KAAM,OAAOxC,EAClB,IAAK,KAAM,OAAOA,EAAQgD,EAC1B,IAAK,cAAe,OAAOhD,EAAQ+C,EAIrC,OADAa,QAAQC,MAAM,uBAAyBrB,GAChC,GAITsB,QA1CY,SA0CJ9D,EAAOwC,GAEb,IAAMuB,EAAeT,KAAKU,cAAchE,EAAO,GAE/C,OAAQwC,GAEN,IAAK,KAAM,OAAOuB,EAAe,MACjC,IAAK,KAAM,OAAOA,EAAe,MACjC,IAAK,cAAe,OAAOA,EAAe,QAI5C,OADAH,QAAQC,MAAM,uBAAyBrB,GAChCuB,GAITC,cA1DY,SA0DEhE,EAAOiE,GAGnB,IAAMC,EAAQR,KAAKS,IAAI,GAAIF,GAC3B,OAAOP,KAAKU,MAAMpE,EAAQkE,GAASA,ID3CxB,GACbG,SAAU,CACR9B,SADQ,WACK,OAAOe,KAAKb,OAAO6B,MAAM/B,WAIxCgC,QAAS,CACP1B,cADO,SACO7C,GAEZ,IAAMwE,EAAcC,WAAWzE,GAC/B,OAAOpC,OAAO8G,GAAGF,EAAaG,KAAO,EAAIH,K,UE9B/C,EAAOI,OAAS,EAChB,EAAOC,UAAY,kBAEJ,Q,8ECPR7D,MAAM,S,IAEJA,MAAM,Q,IAONA,MAAM,iB,GACT,eAA6C,SAAtCC,IAAI,eAAc,gBAAY,G,GAGrC,eAAmD,SAA5CA,IAAI,kBAAiB,mBAAe,G,IAIxCD,MAAM,U,6TAiBFA,MAAM,U,UAKRA,MAAM,gB,IAINA,MAAM,O,GAMX,eAAyB,UAArB,oBAAgB,G,GAEpB,eAA0C,SAAnCC,IAAI,WAAU,iBAAa,G,GAIlC,eAAkC,UAA9B,6BAAyB,G,GAG3B,eAA8C,SAAvCA,IAAI,oBAAmB,YAAQ,G,GAKtC,eAAkD,SAA3CA,IAAI,sBAAqB,cAAU,G,GAK1C,eAA4C,SAArCA,IAAI,mBAAkB,WAAO,G,6BACM,iE,6BACmD,8B,kBAAqH,gC,qGAtExN,eAMM,MANN,GAMM,CALJ,eAAwE,UAA/D,QAAK,8BAAE,EAAA6D,eAAA,EAAAA,cAAA,qBAAgBC,SAAoB,GAAV,EAAAzC,YAAiB,IAAI,gBAC/D,eAAyE,MAAzE,GAAkB,SAAM,eAAG,EAAAA,WAAU,GAAO,OAAI,eAAG,EAAAF,OAAOzE,QAAM,GAC7B,EAAAyE,OAAOzE,OAAM,G,iBAAhD,eAAqE,U,MAA5D,QAAK,8BAAE,EAAAqH,aAAA,EAAAA,YAAA,sBAAsC,W,sBACtD,eAAsC,UAA7B,QAAK,8BAAE,EAAAC,UAAA,EAAAA,SAAA,sBAAU,OAC1B,eAAoF,UAA3E,QAAK,8BAAE,EAAAC,WAAA,EAAAA,UAAA,qBAAYH,SAAU,EAAAzC,YAAc,EAAAF,OAAOzE,OAAM,GAAM,IAAI,kBAGjD,OAAZ,EAAAwH,c,iBAAhB,eAkEW,gBAjET,eAMM,MANN,GAMM,CALJ,GACA,eAA0L,SAAnLvD,GAAG,cAAcV,KAAK,SAAUlB,MAAO,EAAAmF,aAAaxH,OAAS,SAAM,+BAAE,EAAA8E,OAAOC,OAAM,qBAAyB,EAAAJ,WAAU,eAAoB,EAAAO,cAAcF,EAAOrB,OAAOtB,a,mBAE5K,GACA,eAAmM,SAA5L4B,GAAG,iBAAiBV,KAAK,SAAUlB,MAAO,EAAAmF,aAAaC,UAAY,SAAM,+BAAE,EAAA3C,OAAOC,OAAM,qBAAyB,EAAAJ,WAAU,kBAAuB,EAAAO,cAAcF,EAAOrB,OAAOtB,a,qBAGvL,eA6BM,MA7BN,GA6BM,CA5BJ,I,mBASA,eAUW,2BAVwB,EAAAmF,aAAaE,QAAM,SAApCC,EAAOC,G,oDACvB,eAAgQ,OAA3PvE,MAAK,CAAC,QAAO,iBAA4B,EAAAwE,aAAeD,EAAK,gBAAmB,EAAAC,aAAe,EAAAL,aAAaE,OAAO1H,QAAU4H,IAAU,EAAAJ,aAAaE,OAAO1H,OAAM,IAASwD,IAAG,QAAYoE,EAAQ,YAAS,mCAAU,EAAAE,UAAUF,KAAK,c,eAAMA,EAAQ,GAAH,oB,eACnP,eAES,U,yCAFQD,EAAMI,KAAI,GAAE1E,MAAM,Q,qBACjC,eAA6E,2BAA7C,EAAA0E,MAAI,SAApBC,EAAMJ,G,wBAAtB,eAA6E,UAAtCvF,MAAOuF,GAAK,eAAKI,EAAKpG,MAAI,gB,2CADlD+F,EAAMI,QAGvB,eAAoH,SAA7GxE,KAAK,SAASF,MAAM,QAAShB,MAAOsF,EAAMM,MAAQ,QAAK,mBAAEN,EAAMM,MAAQ,EAAA/C,cAAcF,EAAOrB,OAAOtB,S,6BAE1G,eAEM,MAFN,GAEM,CADJ,eAA8C,UAArC,QAAK,mBAAE,EAAA6F,YAAYN,KAAQ,IAAC,kB,aAIG,OAAZ,EAAAO,c,iBAAhC,eAEM,MAFN,GAEM,eADD,EAAAA,cAAY,I,sBAGjB,eAEM,MAFN,GAEM,CADJ,eAA8C,UAArC,QAAK,+BAAE,EAAAC,cAAY,iBAIhC,eAIM,YAHJ,GACA,eAAgJ,SAAzInE,GAAG,UAAUV,KAAK,WAAY8E,QAAS,EAAAzD,SAAS0D,QAAU,SAAM,+BAAE,EAAAxD,OAAOC,OAAM,0BAA8BC,EAAOrB,OAAO0E,a,qBAClI,KAGF,eAmBM,YAlBJ,GACA,eAGM,YAFJ,eAAkI,SAA3HpE,GAAG,mBAAmBV,KAAK,QAAS8E,QAA2B,YAAlB,EAAAzD,SAAS2D,UAA0B,SAAM,+BAAE,EAAAC,aAAaxD,EAAM,c,qBAClH,KAGF,eAGM,YAFJ,eAAwI,SAAjIf,GAAG,qBAAqBV,KAAK,QAAS8E,QAA2B,cAAlB,EAAAzD,SAAS2D,UAA4B,SAAM,iCAAE,EAAAC,aAAaxD,EAAM,gB,qBACtH,KAGF,eAMM,YALJ,eAA+H,SAAxHf,GAAG,kBAAkBV,KAAK,QAAS8E,QAA2B,WAAlB,EAAAzD,SAAS2D,UAAyB,SAAM,iCAAE,EAAAC,aAAaxD,EAAM,a,qBAChH,GAC2B,WAAlB,EAAAJ,SAAS2D,W,iBAAlB,eAEI,Q,GADuE,EAAA3D,SAAS0D,Q,wCAAtB,eAAuL,W,GAA9H,eAA2F,KAAxF5E,KAAK,IAAK,QAAK,iDAAU,EAAAoB,OAAOC,OAAM,gDAAuC,W,uEAUhM,I,wCAAA,CACbvF,KADa,WAGX,MAAO,CACLmF,WAAY,EACZ8D,UAAW,KACXZ,WAAY,OAKhBnB,SAAU,CACR9B,SADQ,WACK,OAAOe,KAAKb,OAAO6B,MAAM/B,UACtCmD,KAFQ,WAEC,OAAOpC,KAAKb,OAAO6B,MAAMoB,MAClCtD,OAHQ,WAGG,OAAOkB,KAAKb,OAAO6B,MAAMlC,QAEpC+C,aALQ,WAON,OAAO7B,KAAKhB,YAAc,GAAKgB,KAAKhB,WAAagB,KAAKlB,OAAOzE,OACzD2F,KAAKlB,OAAOkB,KAAKhB,YACjB,MAGNwD,aAZQ,WAcN,IAAMO,EAAO/C,KACb,GAA0B,OAAtB+C,EAAKlB,cAA+C,GAAtBkB,EAAKjE,OAAOzE,OAC5C,OAAO,KAET,IAAI2I,EAAW,KACXC,EAAe,KACfC,EAAW,KAoBf,GAlBAH,EAAKjE,OAAOqE,SAAQ,SAACpE,EAAOkD,GAE1B,IAAMmB,EAAalE,EAAMwB,cACvB3B,EAAMgD,OACHsB,KAAI,SAAArB,GAAI,OAAKA,EAAMM,SACnBgB,QAAO,SAACC,EAAaC,GAAd,OAA+BD,EAAcC,IAAc,GACrE,GAEEvB,GAASc,EAAK/D,aAChBiE,EAAeG,IAEA,OAAbJ,GAAqBI,EAAaJ,KACpCA,EAAWI,IAEI,OAAbF,GAAqBE,EAAaF,KACpCA,EAAWE,MAGXJ,GAAYE,EACd,OAAO,KAET,IAAIO,EAAU,2DAA6DvE,EAAMsB,QAAQyC,EAAcjD,KAAKf,SAASC,OAAS,IAQ9H,OALEuE,GADER,EAAeC,EACN,uBAAyBhE,EAAMsB,QAAQ0C,EAAUlD,KAAKf,SAASC,OAAS,KAExE,yBAA2BA,EAAMsB,QAAQwC,EAAUhD,KAAKf,SAASC,OAAS,KAEvFuE,GAAW,sCACJA,GAGTC,cAtDQ,WAyDN,OAAO1D,KAAKlB,OACTuE,KAAI,SAAAtE,GAAI,OAAKA,EAAMgD,OACjBsB,KAAI,SAAArB,GAAI,OAAKA,EAAMM,SACnBgB,QAAO,SAACC,EAAaC,GAAd,OAA+BD,EAAcC,IAAc,MACpEF,QAAO,SAACC,EAAaC,GAAd,OAA+BA,EAAeD,EAAcC,EAAeD,IAAa,KAKtGtC,QAAS,CACP1B,cADO,SACO7C,GAEZ,IAAMwE,EAAcC,WAAWzE,GAC/B,OAAOpC,OAAO8G,GAAGF,EAAaG,KAAO,EAAIH,GAI3CM,cARO,WAUDxB,KAAKhB,WAAa,GACpBgB,KAAKhB,cAIT4C,UAfO,WAiBD5B,KAAKhB,WAAagB,KAAKlB,OAAOzE,OAAS,GACzC2F,KAAKhB,cAIT2C,SAtBO,WAwBL3B,KAAKb,OAAOC,OAAO,WAAYY,KAAKhB,YACpCgB,KAAKhB,WAAagB,KAAKlB,OAAOzE,OAAS,GAIzCqH,YA7BO,WA+BD1B,KAAKlB,OAAOzE,QAAU,IAG1B2F,KAAKb,OAAOC,OAAO,cAAeY,KAAKhB,YAEnCgB,KAAKhB,YAAcgB,KAAKlB,OAAOzE,SACjC2F,KAAKhB,WAAagB,KAAKlB,OAAOzE,OAAS,KAI3CoI,SAzCO,WA2CLzC,KAAKb,OAAOC,OAAO,WAAYY,KAAKhB,aAItCuD,YA/CO,SA+CKN,GAEVjC,KAAKb,OAAOC,OAAO,cAAe,CAAEL,MAAOiB,KAAKhB,WAAYgD,MAAOC,KAIrEE,UArDO,SAqDGF,GACV,WACQc,EAAO/C,KACb+C,EAAKD,UAAYb,EACjBc,EAAKb,WAAaD,EAElB,IAKI,EALE0B,EAAgB,SAACC,GAErBb,EAAKb,WAAaa,EAAKc,eAAeD,EAAME,QAI9C,EAAc,WAEZC,SAASC,oBAAoB,YAAaL,GAC1CI,SAASC,oBAAoB,UAAW,GAEpCjB,EAAKD,YAAcC,EAAKb,YAC1Ba,EAAK5D,OAAOC,OAAO,YAAa,CAAEL,MAAO,EAAKC,WAAYiF,KAAMlB,EAAKD,UAAWoB,GAAInB,EAAKb,aAE3Fa,EAAKb,WAAa,KAClBa,EAAKD,UAAY,MAGnBiB,SAASI,iBAAiB,YAAaR,GACvCI,SAASI,iBAAiB,UAAW,IAIvCN,eAlFO,SAkFQO,GAEb,GAA0B,OAAtBpE,KAAK6B,cAA4D,GAAnC7B,KAAK6B,aAAaE,OAAO1H,OACzD,OAAO,KAET,IAAMgK,EAAarE,KAAKsE,kBAAkBtE,KAAKuE,MAAMC,QAC/CC,EAAYzE,KAAKsE,kBAAkBtE,KAAKuE,MAAM,SAAWvE,KAAK6B,aAAaE,OAAO1H,OAAS,KAGjG,GAAI+J,GAAQC,EAAWK,OACrB,OAAO,EAGT,GAAIN,GAAQK,EAAUC,OACpB,OAAO1E,KAAK6B,aAAaE,OAAO1H,OAGlC,GAAI+J,GAAQK,EAAUE,IACpB,OAAO3E,KAAK6B,aAAaE,OAAO1H,OAAS,EAI3C,GAAyB,OAArB2F,KAAKkC,YAAwBlC,KAAKkC,WAAa,GAAKlC,KAAKkC,WAAalC,KAAK6B,aAAaE,OAAO1H,OAAS,EAC5G,CACE,IAAMuK,EAAgB5E,KAAKsE,kBAAkBtE,KAAKuE,MAAM,QAAUvE,KAAKkC,aACvE,GAAIkC,GAAQQ,EAAcD,KAAOP,EAAOQ,EAAcF,OACpD,OAAO1E,KAAKkC,WAIhB,IAAK,IAAI/H,EAAI,EAAGA,EAAI6F,KAAK6B,aAAaE,OAAO1H,OAAS,EAAGF,IACzD,CACE,IAAM0K,EAAa7E,KAAKsE,kBAAkBtE,KAAKuE,MAAM,QAAUpK,IAC/D,GAAIiK,GAAQS,EAAWF,KAAOP,EAAOS,EAAWH,OAC9C,OAAOvK,EAIX,OAAO,MAITmK,kBA5HO,SA4HWQ,GAEhB,IAAMC,EAAaD,EAAQE,wBACrBC,EAAa1H,OAAO2H,aAAenB,SAASoB,gBAAgBF,WAC5DG,EAAY7H,OAAO8H,aAAetB,SAASoB,gBAAgBC,UAEjE,MAAO,CACLT,IAAKI,EAAWJ,IAAMS,EACtBE,KAAMP,EAAWO,KAAOL,EACxBM,MAAOR,EAAWQ,MAAQN,EAC1BP,OAAQK,EAAWL,OAASU,IAKhCvC,aA3IO,SA2IMe,EAAOhB,GAEbgB,EAAM5F,OAAO0E,SAGlB1C,KAAKb,OAAOC,OAAO,iBAAkB,CAAEwD,UAAWA,Q,UCzSxD,GAAOtB,OAAS,GAChB,GAAOC,UAAY,kBAEJ,U,+ECPR7D,MAAM,Q,GACT,eAAgC,QAA1BA,MAAM,UAAS,QAAI,G,GACzB,eAAkC,QAA5BA,MAAM,UAAS,UAAM,G,GAC3B,eAAkC,QAA5BA,MAAM,UAAS,KAAM,G,IAMpBA,MAAM,U,IAKRA,MAAM,O,0EAdb,eAiBM,MAjBN,GAiBM,CAhBJ,GACA,GACA,I,mBAEA,eAOW,2BAPuB,EAAA0E,MAAI,SAApBC,EAAMJ,G,mEACtB,eAAsD,SAA/CrE,KAAK,OAAOF,MAAM,O,yCAAgB2E,EAAKpG,KAAI,I,yCAAToG,EAAKpG,Q,eAC9C,eAAyD,SAAlD2B,KAAK,QAAQF,MAAM,Q,yCAAiB2E,EAAKmD,MAAK,I,yCAAVnD,EAAKmD,SAEhD,eAEM,MAFN,GAEM,CADJ,eAA6C,UAApC,QAAK,mBAAE,EAAAC,WAAWxD,KAAQ,IAAC,kB,aAIxC,eAEM,MAFN,GAEM,CADJ,eAAoD,UAA3C,QAAK,+BAAE,EAAAyD,aAAW,2BAMlB,IACb3E,SAAU,CACR9B,SADQ,WACK,OAAOe,KAAKb,OAAO6B,MAAM/B,UACtCmD,KAFQ,WAEC,OAAOpC,KAAKb,OAAO6B,MAAMoB,OAIpCnB,QAAS,CACPyE,QADO,WAGL1F,KAAKb,OAAOC,OAAO,YAIrBqG,WAPO,SAOIxD,GAETjC,KAAKb,OAAOC,OAAO,aAAc6C,M,UCjCvC,GAAOX,OAAS,GAChB,GAAOC,UAAY,kBAEJ,U,+ECPR7D,MAAM,W,IACJA,MAAM,c,UAEmBA,MAAM,wB,IAiB7BY,GAAG,c,0EApBZ,eAuCM,MAvCN,GAuCM,CAtCJ,eAAwI,MAAxI,GAAwB,eAAY,eAAG,EAAAkC,QAAQ,EAAA4C,aAAc,MAAG,eAAG,EAAA5C,QAAQ,EAAAmF,cAAe,MAAG,eAAG,EAAAnF,QAAQ,EAAAvB,SAASO,gBAAa,GAEnH,EAAAV,OAAOzE,OAAM,G,iBAAxB,eAA4I,MAA5I,GAA2D,gF,wCAE3D,eAiCM,OAhCHiI,MAAO,EAAAsD,cACPC,OAAQ,EAAAC,eACRC,QAAS,EAAAA,QACTrI,MAAK,UAAwB,OAAV,EAAAwE,a,CACpB,eAaO,c,mBAZL,eAQI,2BAR6B,EAAApD,QAAM,SAA5BC,EAAOC,G,wBAAlB,eAQI,KARsCV,GAAE,QAAYU,G,qBACtD,eAM8C,2BALnBD,EAAMgD,QAAM,SAA7BC,EAAOC,G,wBADjB,eAM8C,QAJ3CK,MAAO,EAAAnC,SAASpB,EAAM+C,WACtB+D,OAAQ,EAAA1F,SAAS6B,EAAMM,OACxB0D,EAAE,IACDC,EAAG,EAAAC,oBAAoBnH,EAAOkD,GAC9BkE,MAAO,EAAAC,mBAAmBrH,EAAOkD,I,6DAEtC,eAEI,IAFJ,GAEI,CADF,eAA2F,QAArFoE,GAAG,IAAIC,GAAG,IAAIC,GAAG,IAAKC,GAAI,EAAAC,iBAAkBN,MAAA,qC,uCAItD,eAOkD,2BANvB,EAAAO,UAAQ,SAAzB1E,EAAOC,G,wBADjB,eAOkD,OAL/CpE,IAAG,QAAYoE,EACflE,KAAI,SAAaiE,EAAMjD,MACvBiH,EAAG,EAAAW,eAAe1E,GACnBgE,EAAE,IACDW,UAAW,EAAAC,kBAAkB5E,GAC7B,YAAS,mCAAU,EAAA6E,UAAU7E,EAAO5C,KAAM,c,yDAG3B,OAAV,EAAA6C,Y,iBADR,eAGoC,O,MADlCnE,KAAK,cACJiI,EAAG,EAAAW,eAAe,EAAAzE,a,6EAQZ,I,UAAA,CACb6E,MAAO,CACLlI,MAAOmI,QAITnN,KANa,WAQX,MAAO,CACLiJ,UAAW,KACXZ,WAAY,OAKhBnB,SAAU,CACR9B,SADQ,WACK,OAAOe,KAAKb,OAAO6B,MAAM/B,UACtCH,OAFQ,WAEG,OAAOkB,KAAKb,OAAO6B,MAAMlC,QACpCsD,KAHQ,WAGC,OAAOpC,KAAKb,OAAO6B,MAAMoB,MAClCsE,SAJQ,WAIK,OAAO1G,KAAKb,OAAO6B,MAAM0F,UAEtCtD,WANQ,WAQN,IAAML,EAAO/C,KAEb,OAAOA,KAAK0G,SACTrD,KAAI,SAAArB,GAAI,OAAKA,EAAMjD,OAAS,GAAKiD,EAAMjD,MAAQgE,EAAKjE,OAAOzE,OAAS0I,EAAKjE,OAAOkD,EAAMjD,OAAO+C,UAAY,KACzGwB,QAAO,SAACC,EAAaC,GAAd,OAA+BD,EAAcC,IAAc,IAGvEmC,YAfQ,WAmBN,OAAO3F,KAAKlB,OACTuE,KAAI,SAAAtE,GAAI,OAAKA,EAAMgD,OACjBsB,KAAI,SAAArB,GAAI,OAAKA,EAAMM,SACnBgB,QAAO,SAACC,EAAaC,GAAd,OAA+BD,EAAcC,IAAc,MACpEF,QAAO,SAACC,EAAaC,GAAd,OAA+BA,EAAeD,EAAcC,EAAeD,IAAa,IAGpG0D,gBA1BQ,WA4BN,OAAOjH,KAAKG,SAASH,KAAKoD,aAG5BqD,iBA/BQ,WAiCN,OAAOzG,KAAKG,SAASH,KAAK2F,cAG5BC,cApCQ,WAoCU,OAAOxF,KAAK8G,MAAMlH,KAAKiH,gBAAkBjH,KAAKnB,QAChEiH,eArCQ,WAqCW,OAAO1F,KAAK8G,MAAMlH,KAAKyG,iBAAmBzG,KAAKnB,QAClEkH,QAtCQ,WAsCI,MAAO,OAAS/F,KAAKiH,gBAAkB,IAAMjH,KAAKyG,mBAIhExF,QAAS,CACPd,SADO,SACEzD,GAEP,OAAOwC,EAAMiB,SAASzD,EAAOsD,KAAKf,SAASC,QAG7CsB,QANO,SAMC9D,GAEN,OAAOwC,EAAMsB,QAAQ9D,EAAOsD,KAAKf,SAASC,QAG5CgH,oBAXO,SAWanH,EAAOkD,GAEzB,GAAIA,EAAQ,GAAKA,GAASlD,EAAMgD,OAAO1H,OACrC,OAAO,EAIT,IAFA,IAAI8M,EAAS,EAEJhN,EAAI,EAAGA,EAAI8H,EAAO9H,IACzBgN,GAAUpI,EAAMgD,OAAO5H,GAAGmI,MAE5B,OAAOtC,KAAKG,SAASgH,IAGvBf,mBAxBO,SAwBYrH,EAAOkD,GAExB,GAAIA,EAAQ,GAAKA,GAASlD,EAAMgD,OAAO1H,OACrC,MAAO,gBAET,IAAM+M,EAAYrI,EAAMgD,OAAOE,GAAOG,KACtC,GAAIgF,EAAY,GAAKA,GAAapH,KAAKoC,KAAK/H,OAC1C,MAAO,GAET,IAAMgN,EAAcrH,KAAKf,SAAS0D,QAC9B,mCACA,GAEJ,MAAO,SAAW3C,KAAKoC,KAAKgF,GAAW5B,MAAQ6B,GAGjDV,eAxCO,SAwCQ1E,GAEb,GAAIA,EAAQ,GAAKA,EAAQjC,KAAK0G,SAASrM,OACrC,OAAO,EAIT,IAFA,IAAI8M,EAAS,EAEJhN,EAAI,EAAGA,EAAI8H,EAAO9H,IAC3B,CACE,IAAM6E,EAAagB,KAAK0G,SAASvM,GAAG4E,MAChCC,GAAc,GAAKA,EAAagB,KAAKlB,OAAOzE,SAC9C8M,GAAUnH,KAAKlB,OAAOE,GAAY8C,WAGtC,OAAO9B,KAAKG,SAASgH,IAGvBN,kBAzDO,SAyDW5E,GAEhB,IAAIqF,GAAW,EAEf,OAAQtH,KAAKf,SAAS2D,WAEpB,IAAK,YACH0E,EAAYrF,EAAQ,GAAM,EAC1B,MAEF,IAAK,SACHqF,EAAWrF,GAAS,GAAKA,EAAQjC,KAAK0G,SAASrM,QAAU2F,KAAK0G,SAASzE,GAAOqF,SAC9E,MAGJ,OAAOA,EAAW,8BAAgCtH,KAAKyG,iBAAmB,IAAM,IAGlFc,aA3EO,SA2EMtF,GAEqB,WAA5BjC,KAAKf,SAAS2D,YAGdX,EAAQ,GAAKA,GAASjC,KAAK0G,SAASrM,SAGxC2F,KAAK0G,SAASzE,GAAOqF,UAAYtH,KAAK0G,SAASzE,GAAOqF,YAIxDR,UAvFO,SAuFG7E,EAAO2B,GAEf,IAmBI,EAnBEb,EAAO/C,KACPwH,EAAS5D,EAAM6D,MACjBC,GAAW,EAET/D,EAAgB,SAACgE,GAEhBD,GAECtH,KAAKwH,IAAID,EAAUF,MAAQD,IAAW,IAExCzE,EAAKD,UAAYb,EACjByF,GAAW,GAIXA,IACF3E,EAAKb,WAAaa,EAAK8E,eAAeF,EAAUF,SAIpD,EAAc,WAEZ1D,SAASC,oBAAoB,YAAaL,GAC1CI,SAASC,oBAAoB,UAAW,GAEpC0D,GAEE3E,EAAKD,YAAcC,EAAKb,YAC1Ba,EAAK5D,OAAOC,OAAO,eAAgB,CAAE6E,KAAMlB,EAAKD,UAAWoB,GAAInB,EAAKb,aAEtEa,EAAKb,WAAa,KAClBa,EAAKD,UAAY,MAGjBC,EAAKwE,aAAatF,IAGtB8B,SAASI,iBAAiB,YAAaR,GACvCI,SAASI,iBAAiB,UAAW,IAIvC0D,eAnIO,SAmIQC,GAEb,GAA4B,GAAxB9H,KAAK0G,SAASrM,OAChB,OAAO,KAET,IAAM0N,EAAa/H,KAAKsE,kBAAkBtE,KAAKuE,MAAMyD,QAC/CC,EAAYjI,KAAKsE,kBAAkBtE,KAAKuE,MAAM,SAAWvE,KAAK0G,SAASrM,OAAS,KAGtF,GAAIyN,GAAQC,EAAWxC,MACrB,OAAO,EAGT,GAAIuC,GAAQG,EAAU1C,MACpB,OAAOvF,KAAK0G,SAASrM,OAGvB,GAAIyN,GAAQG,EAAU3C,KACpB,OAAOtF,KAAK0G,SAASrM,OAAS,EAIhC,GAAyB,OAArB2F,KAAKkC,YAAwBlC,KAAKkC,WAAa,GAAKlC,KAAKkC,WAAalC,KAAK0G,SAASrM,OAAS,EACjG,CACE,IAAMuK,EAAgB5E,KAAKsE,kBAAkBtE,KAAKuE,MAAM,QAAUvE,KAAKkC,aACvE,GAAI4F,GAAQlD,EAAcU,MAAQwC,EAAOlD,EAAcW,MACrD,OAAOvF,KAAKkC,WAIhB,IAAK,IAAI/H,EAAI,EAAGA,EAAI6F,KAAK0G,SAASrM,OAAS,EAAGF,IAC9C,CACE,IAAM0K,EAAa7E,KAAKsE,kBAAkBtE,KAAKuE,MAAM,QAAUpK,IAC/D,GAAI2N,GAAQjD,EAAWS,MAAQwC,EAAOjD,EAAWU,MAC/C,OAAOpL,EAIX,OAAO,MAITmK,kBA7KO,SA6KWQ,GAEhB,IAAMC,EAAaD,EAAQE,wBACrBC,EAAa1H,OAAO2H,aAAenB,SAASoB,gBAAgBF,WAC5DG,EAAY7H,OAAO8H,aAAetB,SAASoB,gBAAgBC,UAEjE,MAAO,CACLT,IAAKI,EAAWJ,IAAMS,EACtBE,KAAMP,EAAWO,KAAOL,EACxBM,MAAOR,EAAWQ,MAAQN,EAC1BP,OAAQK,EAAWL,OAASU,O,UCzRpC,GAAO9D,OAAS,GAChB,GAAOC,UAAY,kBAEJ,U,+ECPR7D,MAAM,W,IACJA,MAAM,c,0EADb,eAgBM,MAhBN,GAgBM,CAfJ,eAAiI,MAAjI,GAAwB,eAAY,eAAG,EAAA8C,QAAQ,EAAA4C,aAAc,MAAG,eAAG,EAAA5C,QAAQ,EAAAmF,cAAe,MAAG,eAAG,EAAAnF,QAAQ,EAAAzB,MAAM+C,YAAS,I,iBAEvH,eAYM,OAXHQ,MAAO,EAAAsD,cACPC,OAAQ,EAAAC,eACRC,QAAS,EAAAA,S,qBAEV,eAMkC,2BALP,EAAAhE,QAAM,SAAvBC,EAAOC,G,wBADjB,eAMkC,QAJ/BK,MAAO,EAAAnC,SAAS,EAAApB,MAAM1E,QACtBwL,OAAQ,EAAA1F,SAAS6B,EAAMM,OACxB0D,EAAE,IACDC,EAAG,EAAAU,eAAe1E,GAClBkE,MAAO,EAAA+B,cAAcjG,I,gFAQf,IACb8E,MAAO,CACLlI,MAAOmI,OACPjI,MAAOzE,QAITyG,SAAU,CACR9B,SADQ,WACK,OAAOe,KAAKb,OAAO6B,MAAM/B,UACtCmD,KAFQ,WAEC,OAAOpC,KAAKb,OAAO6B,MAAMoB,MAClCL,OAHQ,WAGG,OAAO/B,KAAKjB,MAAMgD,QAE7BqB,WALQ,WAKO,OAAOpD,KAAKjB,MAAM1E,QAEjCsL,YAPQ,WASN,OAA0B,GAAtB3F,KAAK+B,OAAO1H,OACP,EAEF2F,KAAK+B,OACPsB,KAAI,SAAAG,GAAW,OAAKA,EAAalB,SACjCgB,QAAO,SAACC,EAAaC,GAAd,OAA+BD,EAAcC,IAAc,IAGzEyD,gBAjBQ,WAmBN,OAAOjH,KAAKG,SAASH,KAAKoD,aAG5BqD,iBAtBQ,WAwBN,OAAOzG,KAAKG,SAASH,KAAK2F,cAG5BC,cA3BQ,WA2BU,OAAOxF,KAAK8G,MAAMlH,KAAKiH,gBAAkBjH,KAAKnB,QAChEiH,eA5BQ,WA4BW,OAAO1F,KAAK8G,MAAMlH,KAAKyG,iBAAmBzG,KAAKnB,QAClEkH,QA7BQ,WA6BI,MAAO,OAAS/F,KAAKiH,gBAAkB,IAAMjH,KAAKyG,mBAIhExF,QAAS,CACPd,SADO,SACEzD,GAEP,OAAOwC,EAAMiB,SAASzD,EAAOsD,KAAKf,SAASC,QAG7CsB,QANO,SAMC9D,GAEN,OAAOwC,EAAMsB,QAAQ9D,EAAOsD,KAAKf,SAASC,QAG5CyH,eAXO,SAWQ1E,GAEb,GAAIA,EAAQ,GAAKA,GAASjC,KAAK+B,OAAO1H,OACpC,OAAO,EAIT,IAFA,IAAI8M,EAAS,EAEJhN,EAAI,EAAGA,EAAI8H,EAAO9H,IACzBgN,GAAUnH,KAAK+B,OAAO5H,GAAGmI,MAE3B,OAAOtC,KAAKG,SAASgH,IAGvBe,cAxBO,SAwBOjG,GAEZ,GAAIA,EAAQ,GAAKA,GAASjC,KAAK+B,OAAO1H,OACpC,MAAO,gBAET,IAAM+M,EAAYpH,KAAK+B,OAAOE,GAAOG,KACrC,GAAIgF,EAAY,GAAKA,GAAapH,KAAKoC,KAAK/H,OAC1C,MAAO,GAET,IAAMgN,EAAcrH,KAAKf,SAAS0D,QAC9B,mCACA,GAEJ,MAAO,SAAW3C,KAAKoC,KAAKgF,GAAW5B,MAAQ6B,K,UC/FrD,GAAO/F,OAAS,GAChB,GAAOC,UAAY,kBAEJ,U,+ECPN7D,MAAM,Q,GACX,eAIK,WAHH,eAAc,UAAV,SACJ,eAAqB,UAAjB,gBACJ,eAAgC,MAA5BA,MAAM,aAAY,W,aAGlBA,MAAM,S,IACJyK,QAAQ,K,IAMRzK,MAAM,a,GAKhB,eAA0B,UAAtB,qBAAiB,G,IACdA,MAAM,Q,GACX,eAKK,WAJH,eAAqB,UAAjB,gBACJ,eAAiC,MAA7BA,MAAM,aAAY,UACtB,eAAgC,MAA5BA,MAAM,aAAY,SACtB,eAAoC,MAAhCA,MAAM,aAAY,e,aAGlBA,MAAM,S,IACJyK,QAAQ,K,IAKRzK,MAAM,a,IACNA,MAAM,a,IACNA,MAAM,a,sGApChB,eAiBQ,QAjBR,GAiBQ,CAhBN,I,mBAKA,eAUW,2BAV6B,EAAAoB,QAAM,SAA5BC,EAAOC,G,oDACC,EAAAF,OAAOzE,OAAM,G,iBAArC,eAEK,KAFL,GAEK,CADH,eAA+C,KAA/C,GAAgB,SAAM,eAAG2E,EAAa,GAAH,M,0CAGrC,eAIK,2BAJwBD,EAAMgD,QAAM,SAA7BC,EAAOC,G,wBAAnB,eAIK,WAHH,eAAwB,yBAAjBA,EAAQ,GAAH,GACZ,eAAyC,yBAAlC,EAAAmG,aAAarJ,EAAOkD,IAAK,GAChC,eAA4D,KAA5D,GAA4D,eAAnC,EAAAoG,cAActJ,EAAOkD,IAAK,Q,sBAKzD,GACA,eAmBQ,QAnBR,GAmBQ,CAlBN,I,mBAMA,eAWW,2BAX6B,EAAAqG,KAAG,SAAzBvJ,EAAOC,G,oDACC,EAAAsJ,IAAIjO,OAAM,G,iBAAlC,eAEK,KAFL,GAEK,CADH,eAA+C,KAA/C,GAAgB,SAAM,eAAG2E,EAAa,GAAH,M,0CAGrC,eAKK,2BALeD,GAAK,SAAdwJ,G,wBAAX,eAKK,WAJH,eAA6B,yBAAtBA,EAAMC,UAAQ,GACrB,eAAsD,KAAtD,GAAsD,eAA7B,EAAAhI,QAAQ+H,EAAMlO,SAAM,GAC7C,eAAqD,KAArD,GAAqD,eAA5B,EAAAmG,QAAQ+H,EAAMjG,QAAK,GAC5C,eAAyD,KAAzD,GAAyD,eAAhC,EAAA9B,QAAQ+H,EAAMzG,YAAS,Q,8BASzC,IACbf,SAAU,CACR9B,SADQ,WACK,OAAOe,KAAKb,OAAO6B,MAAM/B,UACtCH,OAFQ,WAEG,OAAOkB,KAAKb,OAAO6B,MAAMlC,QACpCsD,KAHQ,WAGC,OAAOpC,KAAKb,OAAO6B,MAAMoB,MAElCkG,IALQ,WAON,IAAMvF,EAAO/C,KAEb,OAAO+C,EAAKjE,OAAOuE,KAAI,SAACtE,EAAOC,GAE7B,IAAMsJ,EAAM,GACNG,EAAY,GAUlB,IAAK,IAAIrG,KARTrD,EAAMgD,OAAOoB,SAAQ,SAAAnB,GAEfyG,EAAUjO,eAAewH,EAAMI,MACjCqG,EAAUzG,EAAMI,OAASJ,EAAMM,MAAQS,EAAK9D,SAASK,UAErDmJ,EAAUzG,EAAMI,MAAQJ,EAAMM,SAGjBmG,EAEVA,EAAUjO,eAAe4H,IAG9BkG,EAAI3N,KAAK,CACPoE,MAAOC,EACPwJ,SAAUpG,GAAQ,GAAKA,EAAOW,EAAKX,KAAK/H,OAAS0I,EAAKX,KAAKA,GAAMnG,KAAO,GACxE5B,OAAQ0E,EAAM1E,OACdiI,MAAOmG,EAAUrG,GACjBN,UAAW/C,EAAM+C,YAIrB,OAAOwG,OAMbrH,QAAS,CACPmH,aADO,SACMrJ,EAAOkD,GAElB,GAAIA,EAAQ,GAAKA,GAASlD,EAAMgD,OAAO1H,OACrC,MAAO,GAET,IAAM+M,EAAYrI,EAAMgD,OAAOE,GAAOG,KACtC,OAAIgF,EAAY,GAAKA,GAAapH,KAAKoC,KAAK/H,OACnC,GAEF2F,KAAKoC,KAAKgF,GAAWnL,MAI9BoM,cAdO,SAcOtJ,EAAOkD,GAEnB,OAAIA,EAAQ,GAAKA,GAASlD,EAAMgD,OAAO1H,OAC9B,GAEF2F,KAAKQ,QAAQzB,EAAMgD,OAAOE,GAAOK,QAI1C9B,QAvBO,SAuBC9D,GAEN,OAAOwC,EAAMsB,QAAQ9D,EAAOsD,KAAKf,SAASC,U,UC7GhD,GAAOoC,OAAS,GAChB,GAAOC,UAAY,kBAEJ,U,aC8BTmH,I,oQAAY,CAChB,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC5D,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC5D,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC5D,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC5D,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAcnDC,GAAc,CAClB,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC3E,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC3E,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAC1E,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,EAAG,IAAK,IAC/D,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GACnD,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAChE,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAC7D,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAG1C,SAASC,GAAcC,GACrB,GAAIA,GAAYF,GAAYtO,OAC1B,MAAM,IAAIyO,MAAM,kCAElB,IAAMC,EAAOJ,GAAYE,GACzB,GAAa,MAATE,EACF,MAAM,IAAID,MAAM,kCAElB,OAAOC,EAGF,SAASC,GAAcC,GAC5B,IAAiB9O,EAAbe,EAAS,GAAOW,EAAIoN,EAAM5O,OAC9B,IAAKF,EAAI,EAAGA,EAAI0B,EAAG1B,GAAK,EACtBe,GAAUwN,GAAUO,EAAM9O,EAAI,IAAM,GACpCe,GAAUwN,IAA2B,EAAfO,EAAM9O,EAAI,KAAc,EAAM8O,EAAM9O,EAAI,IAAM,GACpEe,GAAUwN,IAA2B,GAAfO,EAAM9O,EAAI,KAAc,EAAM8O,EAAM9O,IAAM,GAChEe,GAAUwN,GAAqB,GAAXO,EAAM9O,IAa5B,OAXIA,IAAM0B,EAAI,IACZX,GAAUwN,GAAUO,EAAM9O,EAAI,IAAM,GACpCe,GAAUwN,IAA0B,EAAfO,EAAM9O,EAAI,KAAc,GAC7Ce,GAAU,MAERf,IAAM0B,IACRX,GAAUwN,GAAUO,EAAM9O,EAAI,IAAM,GACpCe,GAAUwN,IAA2B,EAAfO,EAAM9O,EAAI,KAAc,EAAM8O,EAAM9O,EAAI,IAAM,GACpEe,GAAUwN,IAA0B,GAAfO,EAAM9O,EAAI,KAAc,GAC7Ce,GAAU,KAELA,EAGF,SAASgO,GAAcC,GAC5B,GAAIA,EAAI9O,OAAS,IAAM,EACrB,MAAM,IAAIyO,MAAM,kCAElB,IAAM7G,EAAQkH,EAAIC,QAAQ,KAC1B,IAAe,IAAXnH,GAAgBA,EAAQkH,EAAI9O,OAAS,EACvC,MAAM,IAAIyO,MAAM,kCAMlB,IAJA,IAGEO,EAHEC,EAAgBH,EAAII,SAAS,MAAQ,EAAIJ,EAAII,SAAS,KAAO,EAAI,EACnErM,EAAIiM,EAAI9O,OACRa,EAAS,IAAIsO,WAAgBtM,EAAI,EAAT,GAEjB/C,EAAI,EAAGkB,EAAI,EAAGlB,EAAI+C,EAAG/C,GAAK,EAAGkB,GAAK,EACzCgO,EACET,GAAcO,EAAIM,WAAWtP,KAAO,GACpCyO,GAAcO,EAAIM,WAAWtP,EAAI,KAAO,GACxCyO,GAAcO,EAAIM,WAAWtP,EAAI,KAAO,EACxCyO,GAAcO,EAAIM,WAAWtP,EAAI,IACnCe,EAAOG,GAAKgO,GAAU,GACtBnO,EAAOG,EAAI,GAAMgO,GAAU,EAAK,IAChCnO,EAAOG,EAAI,GAAc,IAATgO,EAElB,OAAOnO,EAAOwO,SAAS,EAAGxO,EAAOb,OAASiP,GdlB7B,QACbrN,KAAM,MACN0N,WAAY,CACVC,mBACAC,oBACAC,WACAC,UACAC,QACAC,gBAGFpQ,KAXa,WAaX,MAAO,CACLoE,IAAK,WACLS,aAAc,mBAEdH,gBAAgB,EAChBF,eAAe,EACfG,kBAAkB,IAItB0L,QAvBa,WAyBX,IAAMnH,EAAO/C,KACPmK,EAAY,WAEhB,GAAKC,SAASC,KAAd,CAGA,IAAMA,EAAOD,SAASC,KAAKC,UAAU,GACrC,IAEE,IAAMC,EAAUrB,GAAcmB,GAC1BE,GACFxH,EAAK5D,OAAOC,OAAO,cAAemL,GAEtC,MAAOC,GAELlK,QAAQC,MAAMiK,MAIlBL,IAEA5M,OAAO4G,iBAAiB,cAAc,WAEpCgG,QAIJpJ,SAAU,CACRjC,OADQ,WACG,OAAOkB,KAAKb,OAAO6B,MAAMlC,QAEpCuL,KAHQ,WAKN,OAAOrB,GAAchJ,KAAKb,OAAOsL,QAAQC,eAI7CzJ,QAAS,CACPtC,KADO,WAGL,IAAMqC,EAAQhB,KAAKb,OAAOsL,QAAQ9L,KAC5BgM,EAAO,IAAIC,KAAK,CAAC5J,GAAQ,CAAEpD,KAAM,8BAEvC,qBAAO+M,EAAM3K,KAAKtB,aAAe,UAInCE,KAVO,WAWP,WACQiM,EAAW7K,KAAKuE,MAAMsG,SAASC,MAAM,GAC3C,GAAKD,EAAL,CAGA7K,KAAKtB,aAAemM,EAAS5O,KAAK8O,cAAcxB,SAAS,SACrDsB,EAAS5O,KAAKqO,UAAU,EAAGO,EAAS5O,KAAK5B,OAAS,GAClDwQ,EAAS5O,KAEb,IAAM+O,EAAS,IAAIC,WACnBD,EAAO7G,iBAAiB,QAAQ,SAACP,GAE/B,EAAKzE,OAAOC,OAAO,OAAQwE,EAAM5F,OAAO9C,WAE1C8P,EAAOE,mBAAmBL,KAI5BpM,MA7BO,WA+BLlB,OAAOkB,UAIX0M,MAAO,CACLd,KAAM,SAACe,GAELC,QAAQC,aAAa,GAAI,GAAI,IAAMF,M,oBetMzC,GAAO9J,OAASA,EAChB,GAAOC,UAAY,kBAEJ,U,mCCTTgK,GAAY,CAChBC,GAAI,KACJC,GAAI,KACJC,YAAa,cAKfH,QAAoB,SAAC7O,GAEnB,OAAQA,GAEN,KAAK6O,GAAUC,GACf,KAAKD,GAAUE,GACf,KAAKF,GAAUG,YAEb,OAAO,EAET,QACE,OAAO,KAKPC,GAAgB,CACpBC,QAAS,UACTC,UAAW,YACXC,OAAQ,SAIVH,QAAwB,SAACjP,GAEvB,OAAQA,GAEN,KAAKiP,GAAcC,QACnB,KAAKD,GAAcE,UACnB,KAAKF,GAAcG,OACjB,OAAOpP,EAET,QACE,OAAOiP,GAAcC,W,aCjC3B,SAASG,KAEP,MAAO,CACL7M,MAAOqM,GAAUE,GACjB9I,SAAS,EACTrD,UAAW,IACXE,cAAe,EACfoD,UAAW+I,GAAcE,WAK7B,SAASG,KAEP,MAAO,CACL,CAAE/P,KAAM,SAAUuJ,MAAO,WACzB,CAAEvJ,KAAM,QAASuJ,MAAO,WACxB,CAAEvJ,KAAM,SAAUuJ,MAAO,WACzB,CAAEvJ,KAAM,WAAYuJ,MAAO,WAC3B,CAAEvJ,KAAM,cAAeuJ,MAAO,WAC9B,CAAEvJ,KAAM,YAAauJ,MAAO,WAC5B,CAAEvJ,KAAM,UAAWuJ,MAAO,WAC1B,CAAEvJ,KAAM,SAAUuJ,MAAO,WACzB,CAAEvJ,KAAM,SAAUuJ,MAAO,YAK7B,SAASyG,KAEP,MAAO,CACL,CACEnK,UAAW,EACXzH,OAAQ,GAER0H,OAAQ,CACN,CAAEK,KAAM,EAAGE,MAAO,GAClB,CAAEF,KAAM,EAAGE,MAAO,KAClB,CAAEF,KAAM,EAAGE,MAAO,GAClB,CAAEF,KAAM,EAAGE,MAAO,GAClB,CAAEF,KAAM,EAAGE,MAAO,IAClB,CAAEF,KAAM,EAAGE,MAAO,GAClB,CAAEF,KAAM,EAAGE,MAAO,KAClB,CAAEF,KAAM,EAAGE,MAAO,MAO1B,SAAS4J,KAEP,IAAMjN,EAAW8M,KACXjN,EAASmN,KACT/Q,EAAS,GAIf,OAFAiR,GAAejR,EAAQ+D,EAAUH,GAE1B5D,EAIMkR,uBAAY,CACzBpL,MAAO,CACL/B,SAAU8M,KACV3J,KAAM4J,KACNlN,OAAQmN,KACRvF,SAAUwF,MAGZG,UAAW,CACT5J,SADS,SACAzB,EAAOjC,GAEVA,EAAQ,GAAKA,GAASiC,EAAMlC,OAAOzE,QAGvC2G,EAAMlC,OAAOC,GAAOgD,OAAOpH,KAAK,CAC9ByH,KAAM,EACNE,MAAOpD,EAAMgB,gBAAgB,GAAIc,EAAM/B,SAASC,UAIpDqD,YAZS,SAYGvB,EAAOsL,GAEjB,KAAIA,EAAQvN,MAAQ,GAAKuN,EAAQvN,OAASiC,EAAMlC,OAAOzE,QAAvD,CAGA,IAAM0E,EAAQiC,EAAMlC,OAAOwN,EAAQvN,OAE/BuN,EAAQtK,MAAQ,GAAKsK,EAAQtK,OAASjD,EAAMgD,OAAO1H,QAGvD0E,EAAMgD,OAAOxG,OAAO+Q,EAAQtK,MAAO,KAGrCuK,UAzBS,SAyBCvL,EAAOsL,GAEf,KAAIA,EAAQvN,MAAQ,GAAKuN,EAAQvN,OAASiC,EAAMlC,OAAOzE,QAAvD,CAGA,IAAM0E,EAAQiC,EAAMlC,OAAOwN,EAAQvN,OACnCyN,GAAczN,EAAMgD,OAAQuK,EAAQrI,KAAMqI,EAAQpI,MAIpDwB,QAnCS,SAmCD1E,GAENA,EAAMoB,KAAKzH,KAAK,CACdsB,KAAM,UAAY+E,EAAMoB,KAAK/H,OAAS,GACtCmL,MAAO,aAIXC,WA3CS,SA2CEzE,EAAOiB,GAEZA,EAAQ,GAAKA,GAASjB,EAAMoB,KAAK/H,SAIrC2G,EAAMlC,OAAOqE,SAAQ,SAAApE,GAEnBA,EAAMgD,OAAOoB,SAAQ,SAAAnB,GAEfA,EAAMI,OAASH,EACjBD,EAAMI,MAAQ,EACPJ,EAAMI,KAAOH,GACpBD,EAAMI,aAIZpB,EAAMoB,KAAK7G,OAAO0G,EAAO,KAI3BwK,eAhES,SAgEMzL,EAAOsL,GAEpB,IAAMI,EAAW1L,EAAM/B,SAASC,MAChCyN,GAAYL,EAAStL,EAAM/B,UAEvByN,IAAa1L,EAAM/B,SAASC,QAG9B8B,EAAM/B,SAASK,UAAYJ,EAAMwB,cAAcxB,EAAMU,QAAQoB,EAAM/B,SAASK,UAAWoN,EAAU1L,EAAM/B,SAASC,OAAQ,GACxH8B,EAAM/B,SAASO,cAAgBN,EAAMwB,cAAcxB,EAAMU,QAAQoB,EAAM/B,SAASO,cAAekN,EAAU1L,EAAM/B,SAASC,OAAQ,GAGhI8B,EAAMlC,OAAOqE,SAAQ,SAAApE,GAEnBA,EAAM+C,UAAY5C,EAAMwB,cAAcxB,EAAMU,QAAQb,EAAM+C,UAAW4K,EAAU1L,EAAM/B,SAASC,OAAQ,GACtGH,EAAM1E,OAAS6E,EAAMwB,cAAcxB,EAAMU,QAAQb,EAAM1E,OAAQqS,EAAU1L,EAAM/B,SAASC,OAAQ,GAEhGH,EAAMgD,OAAOoB,SAAQ,SAAAnB,GAEnBA,EAAMM,MAAQpD,EAAMwB,cAAcxB,EAAMU,QAAQoC,EAAMM,MAAOoK,EAAU1L,EAAM/B,SAASC,OAAQ,WAOtGyC,SA1FS,SA0FAX,EAAO4L,GAEd,GAAIA,EAAW,GAAKA,GAAY5L,EAAMlC,OAAOzE,OAE3C2G,EAAMlC,OAAOnE,KAAK,CAChBmH,UAAW,EACXzH,OAAQ,GACR0H,OAAQ,SALZ,CAWA,IAAM8K,EAAS7L,EAAMlC,OAAO8N,GAE5B5L,EAAMlC,OAAOnE,KAAK,CAChBmH,UAAW+K,EAAO/K,UAClBzH,OAAQwS,EAAOxS,OACf0H,OAAQ8K,EAAO9K,OAAOsB,KAAI,SAAArB,GAExB,MAAO,CACLI,KAAMJ,EAAMI,KACZE,MAAON,EAAMM,YAKnB6J,GAAenL,EAAM0F,SAAU1F,EAAM/B,SAAU+B,EAAMlC,UAIvD4C,YAzHS,SAyHGV,EAAOiB,GAEbA,EAAQ,GAAKA,GAASjB,EAAMlC,OAAOzE,SAGvC2G,EAAMlC,OAAOvD,OAAO0G,EAAO,GAG3BjB,EAAM0F,SAASvD,SAAQ,SAAAnB,GAEjBA,EAAMjD,OAASkD,EACjBD,EAAMjD,OAAS,EACRiD,EAAMjD,MAAQkD,GACrBD,EAAMjD,WAGVoN,GAAenL,EAAM0F,SAAU1F,EAAM/B,SAAU+B,EAAMlC,UAIvDgO,YA7IS,SA6IG9L,EAAOsL,GAEjB,KAAIA,EAAQvN,MAAQ,GAAKuN,EAAQvN,OAASiC,EAAMlC,OAAOzE,QAAvD,CAGA,IAAM0E,EAAQiC,EAAMlC,OAAOwN,EAAQvN,OAC7BgO,EAAYhO,EAAM1E,OACxBsS,GAAYL,EAAQU,OAAQjO,GAExBgO,IAAchO,EAAM1E,QACtB8R,GAAenL,EAAM0F,SAAU1F,EAAM/B,SAAU+B,EAAMlC,UAIzDmO,aA3JS,SA2JIjM,EAAOsL,GAElBE,GAAcxL,EAAM0F,SAAU4F,EAAQrI,KAAMqI,EAAQpI,KAQtDtF,KArKS,SAqKJoC,EAAOsL,GAEV,IAAMY,EAAgBC,KAAKC,MAAMd,GACjCe,GAAWrM,EAAOkM,IAGpBI,YA3KS,SA2KGtM,EAAOsL,GAEjB,IAEE,IAAMY,EAAgBK,0BAAYjB,GAC9BY,GACFG,GAAWrM,EAAOkM,GAEtB,MAAM1C,GAEJlK,QAAQC,MAAMiK,MAKpBC,QAAS,CACP9L,KADO,SACFqC,GAEH,IAAMwM,EAAaC,GAAezM,GAAO,GACzC,OAAOmM,KAAKO,UAAUF,IAGxB9C,YAPO,SAOK1J,GAEV,IAAMwM,EAAaC,GAAezM,GAAO,GACzC,OAAO2M,wBAAUH,OAQvB,SAAShB,GAAcoB,EAAO3J,EAAMC,GAElC,KAAID,EAAO,GAAKA,GAAQ2J,EAAMvT,WAG1B6J,EAAK,GAAKA,EAAK0J,EAAMvT,QAGzB,GAAI6J,GAAM0J,EAAMvT,OAGduT,EAAMjT,KAAKiT,EAAM3J,IACjB2J,EAAMrS,OAAO0I,EAAM,OAGrB,CACE,IAAM5B,EAAOuL,EAAM3J,GACnB2J,EAAMrS,OAAO0I,EAAM,GAEfC,EAAKD,GACPC,IAEF0J,EAAMrS,OAAO2I,EAAI,EAAG7B,IAoBxB,SAAS8J,GAAejR,EAAQ+D,EAAUH,GAGxC,IADA,IAAM+O,EAAa,GACV1T,EAAI,EAAGA,EAAI2E,EAAOzE,OAAQF,IACjC0T,EAAW1T,GAAK2E,EAAO3E,GAAGE,OAAS4E,EAASK,UAE9C,IAAMwO,EAAW7O,EAASO,cAAgBP,EAASK,UAC7CyO,EAAS,GAGf7S,EAAOiI,SAAQ,SAACnB,EAAOC,GAErB,IAAI+L,GAAiB,EAEjBhM,EAAMjD,OAAS,GAAKiD,EAAMjD,MAAQD,EAAOzE,SAE3C2T,EAAiBH,EAAW7L,EAAMjD,QAAU+O,EACxCE,IACFH,EAAW7L,EAAMjD,QAAU+O,IAG1BE,GACHD,EAAOpT,KAAKsH,MAGhB,IAAK,IAAI9H,EAAI4T,EAAO1T,OAAS,EAAGF,GAAK,EAAGA,IACtCe,EAAOK,OAAOwS,EAAO5T,GAAI,GAG3B0T,EAAW1K,SAAQ,SAAC8K,EAAWhM,GAE7B,MAAOgM,GAAaH,EAElB5S,EAAOP,KAAK,CAAEoE,MAAOkD,EAAOqF,UAAU,IACtC2G,GAAaH,EAGbG,EAAY/O,EAAMwB,cAAcuN,EAAW,MAOjD,SAAStB,GAAYE,EAAQ7O,GAE3B,IAAK,IAAMZ,KAAYyP,EAEhBA,EAAOrS,eAAe4C,IAAcY,EAAOxD,eAAe4C,KAG/DY,EAAOZ,GAAYyP,EAAOzP,IAK9B,SAASmC,GAAc7C,GAErB,IAAMwE,EAAcC,WAAWzE,GAC/B,OAAOwR,MAAMhN,GAAe,EAAIA,EAIlC,SAASiN,GAAYzR,GAEnB,IAAMwE,EAAckN,SAAS1R,GAC7B,OAAOwR,MAAMhN,GAAe,EAAIA,EAIlC,SAASmM,GAAWrM,EAAOkM,GAEzB,IAAMmB,EAAeC,GAAiBpB,GAEtCP,GAAY0B,EAAapP,SAAU+B,EAAM/B,UACzC+B,EAAMoB,KAAOiM,EAAajM,KAC1BpB,EAAMlC,OAASuP,EAAavP,OAC5BkC,EAAM0F,SAAW2H,EAAa3H,SAE9ByF,GAAenL,EAAM0F,SAAU1F,EAAM/B,SAAU+B,EAAMlC,QASvD,IAAMyP,GAAsB,CAC1BtP,SAAU,CACR8D,KAAM,WACN7D,MAAO,QACPyD,QAAS,UACTrD,UAAW,YACXE,cAAe,gBACfoD,UAAW,aAGbR,KAAM,CACJW,KAAM,OACN9G,KAAM,OACNuJ,MAAO,SAGT1G,OAAQ,CACNiE,KAAM,SACNjB,UAAW,YACXzH,OAAQ,SACR0H,OAAQ,CACNgB,KAAM,SACNX,KAAM,OACNE,MAAO,UAIXoE,SAAU,CACR3D,KAAM,WACNhE,MAAO,QACPuI,SAAU,aAKRkH,GAAyB,CAC7BvP,SAAU,CACR8D,KAAM,IACN7D,MAAO,IACPyD,QAAS,IACTrD,UAAW,IACXE,cAAe,IACfoD,UAAW,KAGbR,KAAM,CACJW,KAAM,IACN9G,KAAM,IACNuJ,MAAO,KAGT1G,OAAQ,CACNiE,KAAM,IACNjB,UAAW,IACXzH,OAAQ,IACR0H,OAAQ,CACNgB,KAAM,IACNX,KAAM,IACNE,MAAO,MAIXoE,SAAU,CACR3D,KAAM,IACNhE,MAAO,IACPuI,SAAU,MASd,SAASmG,GAAezM,EAAOyN,GAE7B,IAAMpL,EAAMoL,EAAcD,GAAyBD,GAC7CrT,EAAS,GAOf,OALAA,EAAOmI,EAAIpE,SAAS8D,MAAQ2L,GAAkB1N,EAAM/B,SAAUoE,GAC9DnI,EAAOmI,EAAIjB,KAAKW,MAAQ4L,GAAc3N,EAAMoB,KAAMiB,GAClDnI,EAAOmI,EAAIvE,OAAOiE,MAAQ6L,GAAgB5N,EAAMlC,OAAQuE,GACxDnI,EAAOmI,EAAIqD,SAAS3D,MAAQ8L,GAAkB7N,EAAM0F,SAAUrD,GAEvDnI,EAIT,SAASwT,GAAkBzP,EAAUoE,GAEnC,IAAMnI,EAAS,GAQf,OANAA,EAAOmI,EAAIpE,SAASC,OAASD,EAASC,MACtChE,EAAOmI,EAAIpE,SAAS0D,SAAW1D,EAAS0D,QACxCzH,EAAOmI,EAAIpE,SAASK,WAAaL,EAASK,UAC1CpE,EAAOmI,EAAIpE,SAASO,eAAiBP,EAASO,cAC9CtE,EAAOmI,EAAIpE,SAAS2D,WAAa3D,EAAS2D,UAEnC1H,EAIT,SAASyT,GAAcvM,EAAMiB,GAE3B,OAAoB,IAAhBjB,EAAK/H,OACA,GAEF+H,EAAKiB,KAAI,SAAAhB,GAEd,IAAMnH,EAAS,GAKf,OAHAA,EAAOmI,EAAIjB,KAAKnG,MAAQoG,EAAKpG,KAC7Bf,EAAOmI,EAAIjB,KAAKoD,OAASnD,EAAKmD,MAEvBtK,KAKX,SAAS0T,GAAgB9P,EAAQuE,GAE/B,OAAOvE,EAAOuE,KAAI,SAAAtE,GAEhB,IAAM+P,EAAc,GAepB,OAbAA,EAAYzL,EAAIvE,OAAOzE,QAAU0E,EAAM1E,OACvCyU,EAAYzL,EAAIvE,OAAOgD,WAAa/C,EAAM+C,UAE1CgN,EAAYzL,EAAIvE,OAAOiD,OAAOgB,MAAQhE,EAAMgD,OAAOsB,KAAI,SAAArB,GAErD,IAAM+M,EAAc,GAKpB,OAHAA,EAAY1L,EAAIvE,OAAOiD,OAAOK,MAAQJ,EAAMI,KAC5C2M,EAAY1L,EAAIvE,OAAOiD,OAAOO,OAASN,EAAMM,MAEtCyM,KAGFD,KAKX,SAASD,GAAkBnI,EAAUrD,GAEnC,OAAOqD,EAASrD,KAAI,SAAArB,GAElB,IAAM+M,EAAc,GAKpB,OAHAA,EAAY1L,EAAIqD,SAAS3H,OAASiD,EAAMjD,MACxCgQ,EAAY1L,EAAIqD,SAASY,UAAYtF,EAAMsF,SAEpCyH,KAMX,SAAST,GAAiBpB,GAExB,IAAM7J,EAAM6J,EAAc1S,eAAegU,GAAuBvP,SAAS8D,MAAQyL,GAAyBD,GAEpGrT,EAAS,CACb+D,SAAU+P,GAAoB9B,EAAe7J,GAC7CjB,KAAM6M,GAAgB/B,EAAe7J,GACrCvE,OAAQoQ,GAAkBhC,EAAe7J,GACzCqD,SAAUyI,GAAoBjC,EAAe7J,IAoB/C,OAfI6J,EAAc1S,eAAe,cAE3B0S,EAAcjO,SAASzE,eAAe,wBACxCU,EAAO+D,SAAS2D,UAAYsK,EAAcjO,SAASmQ,mBAAqBzD,GAAcE,UAAYF,GAAcC,SAE9GsB,EAAcjO,SAASzE,eAAe,iBACxCU,EAAO4D,OAAO,GAAGzE,OAASkF,GAAc2N,EAAcjO,SAASoQ,cAE7DnC,EAAcjO,SAASzE,eAAe,oBACxCU,EAAO4D,OAAO,GAAGgD,UAAYvC,GAAc2N,EAAcjO,SAASqQ,kBAGvC,IAA3BpU,EAAOwL,SAASrM,QAClB8R,GAAejR,EAAOwL,SAAUxL,EAAO+D,SAAU/D,EAAO4D,QAEnD5D,EAIT,SAAS8T,GAAoB9B,EAAe7J,GAE1C,IAAK6J,EAAc1S,eAAe6I,EAAIpE,SAAS8D,MAC7C,OAAOgJ,KAET,IAAM9M,EAAWiO,EAAc7J,EAAIpE,SAAS8D,MAE5C,MAAO,CACL7D,MAAOqM,GAAUgE,QAAQtQ,EAASoE,EAAIpE,SAASC,QAAUD,EAASoE,EAAIpE,SAASC,OAASqM,GAAUE,GAClG9I,SAA4C,IAAnC1D,EAASoE,EAAIpE,SAAS0D,SAC/BrD,UAAWC,GAAcN,EAASoE,EAAIpE,SAASK,YAC/CE,cAAeD,GAAcN,EAASoE,EAAIpE,SAASO,gBACnDoD,UAAW+I,GAAc4D,QAAQtQ,EAASoE,EAAIpE,SAAS2D,YAAc3D,EAASoE,EAAIpE,SAAS2D,WAAa+I,GAAcC,SAK1H,SAASqD,GAAgB/B,EAAe7J,GAEtC,OAAK6J,EAAc1S,eAAe6I,EAAIjB,KAAKW,OAAUyM,MAAMC,QAAQvC,EAAc7J,EAAIjB,KAAKW,OAGnFmK,EAAc7J,EAAIjB,KAAKW,MAAMM,KAAI,SAAAhB,GAEtC,MAAO,CACLpG,KAAMoG,EAAKgB,EAAIjB,KAAKnG,MACpBuJ,MAAO,kBAAkBkK,KAAKrN,EAAKgB,EAAIjB,KAAKoD,QAAU,IAAMnD,EAAKgB,EAAIjB,KAAKoD,OAAS,cAN9E,GAYX,SAAS0J,GAAkBhC,EAAe7J,GAExC,IAAK6J,EAAc1S,eAAe6I,EAAIvE,OAAOiE,QAAUyM,MAAMC,QAAQvC,EAAc7J,EAAIvE,OAAOiE,OAC5F,MAAO,GAET,IAAM7H,EAASgS,EAAc7J,EAAIvE,OAAOiE,MAAMM,KAAI,SAAAtE,GAEhD,IAAM+P,EAAc,CAClBhN,UAAWvC,GAAcR,EAAMsE,EAAIvE,OAAOgD,YAC1CzH,OAAQkF,GAAcR,EAAMsE,EAAIvE,OAAOzE,SACvC0H,OAAQ,IAcV,OAXIhD,EAAMvE,eAAe6I,EAAIvE,OAAOiD,OAAOgB,OAASyM,MAAMC,QAAQ1Q,EAAMsE,EAAIvE,OAAOiD,OAAOgB,SAExF+L,EAAY/M,OAAShD,EAAMsE,EAAIvE,OAAOiD,OAAOgB,MAAMM,KAAI,SAAArB,GAErD,MAAO,CACLI,KAAM+L,GAAYnM,EAAMqB,EAAIvE,OAAOiD,OAAOK,OAC1CE,MAAO/C,GAAcyC,EAAMqB,EAAIvE,OAAOiD,OAAOO,aAK5CwM,KAGT,OAAO5T,EAAOb,OAAS,EACnBa,EACA,CAAEb,OAAQ,EAAGyH,UAAW,EAAGC,OAAQ,IAIzC,SAASoN,GAAoBjC,EAAe7J,GAE1C,OAAK6J,EAAc1S,eAAe6I,EAAIqD,SAAS3D,OAAUyM,MAAMC,QAAQvC,EAAc7J,EAAIqD,SAAS3D,OAG3FmK,EAAc7J,EAAIqD,SAAS3D,MAAMM,KAAI,SAAArB,GAE1C,MAAO,CACLjD,MAAOoP,GAAYnM,EAAMqB,EAAIqD,SAAS3H,QACtCuI,UAA2C,IAAjCtF,EAAMqB,EAAIqD,SAASY,cANxB,G,2CCtpBXqI,QAAQC,IAAIC,QAAYC,QAAcC,QAAQC,QAASC,QAAcC,SAErEC,eAAUC,IACPC,IAAIC,IACJC,UAAU,oBAAqBC,SAC/BC,MAAM,S,oCCbT,W,oCCAA,W,oCCAA,W,kCCAA,W,oCCAA,W,uJCAA,W,kCCAA,W","file":"js/app.a1173833.js","sourcesContent":[" \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\t\"app\": 0\n \t};\n\n \tvar deferredModules = [];\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\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 \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\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([0,\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","export * from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../node_modules/vue-loader-v16/dist/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./App.vue?vue&type=style&index=1&id=5bc914fd&lang=scss&scoped=true\"","<template>\n <div class=\"sidebar hideOnPrint\">\n <div class=\"toolbar\">\n <a :class=\"{ active: tab === 'settings' }\" @click=\"tab = 'settings'\"><font-awesome-icon icon=\"sliders-h\" size=\"2x\" fixed-width /> Settings</a>\n <a :class=\"{ active: tab === 'wood' }\" @click=\"tab = 'wood'\"><font-awesome-icon icon=\"tree\" size=\"2x\" fixed-width /> Wood</a>\n <a :class=\"{ active: tab === 'layers' }\" @click=\"tab = 'layers'\"><font-awesome-icon icon=\"layer-group\" size=\"2x\" fixed-width /> Layers</a>\n <a :class=\"{ active: tab === 'saveLoad' }\" @click=\"tab = 'saveLoad'\"><font-awesome-icon icon=\"save\" size=\"2x\" fixed-width /> Save / load</a>\n <a :class=\"{ active: tab === 'print' }\" @click=\"tab = 'print'\"><font-awesome-icon icon=\"print\" size=\"2x\" fixed-width /> Print</a>\n <a :class=\"{ active: tab === 'about' }\" @click=\"tab = 'about'\"><font-awesome-icon icon=\"info-circle\" size=\"2x\" fixed-width /> About</a>\n </div>\n\n <div class=\"tabs\">\n <div class=\"tab\" v-show=\"tab === 'settings'\">\n <Settings />\n </div>\n\n <div class=\"tab\" v-show=\"tab === 'layers'\">\n <Layers />\n </div>\n\n <div class=\"tab\" v-show=\"tab === 'wood'\">\n <Wood />\n </div>\n\n <div class=\"tab\" v-show=\"tab === 'print'\">\n <p>\n Use your browser's built-in print functionality (for example, Ctrl+P on Windows) or click the button below to get a printable version of your board and cutting list.\n </p>\n\n <div>\n <input type=\"checkbox\" v-model=\"printEndGrain\" id=\"printEndGrain\" />\n <label for=\"printEndGrain\"> End grain preview</label>\n </div>\n <div>\n <input type=\"checkbox\" v-model=\"printEdgeGrain\" id=\"printEdgeGrain\" />\n <label for=\"printEdgeGrain\"> Edge grain preview</label>\n </div>\n <div>\n <input type=\"checkbox\" v-model=\"printCuttingList\" id=\"printCuttingList\" />\n <label for=\"printCuttingList\"> Cutting list and bill of materials</label>\n </div>\n\n <br />\n <button @click=\"print\">Print</button>\n </div>\n\n <div class=\"tab\" v-show=\"tab === 'saveLoad'\">\n <p>\n Below you can download the current settings or load them again from a file. You can also bookmark the current page or copy the URL from the address bar instead, as it is automatically updated whenever you change anything.\n </p>\n\n <p>\n <input type=\"text\" v-model=\"saveFilename\" />\n <button @click=\"save\">Save</button>\n </p>\n\n <p>\n <input type=\"file\" ref=\"loadFile\" accept=\".json\" />\n <button @click=\"load\">Load</button>\n </p>\n </div>\n\n <div class=\"tab\" v-show=\"tab === 'about'\">\n <p>\n Created by Mark van Renswoude. Open-source and available under the Unlicense to the public domain on <a href=\"https://github.com/MvRens/CuttingBoard\" target=\"_blank\">Github</a>, where feedback is welcome under Issues.\n </p>\n <p>\n Heavily inspired by <a href=\"http://www.lastalias.com/cbdesigner/\">CBdesigner</a>.\n </p>\n </div>\n </div>\n </div>\n\n <div class=\"content\">\n <div :class=\"{ hideOnPrint: !printEndGrain }\">\n <h1>End grain</h1>\n <EndGrainPreview :scale=\"1\" />\n </div>\n\n <div :class=\"{ hideOnPrint: !printEdgeGrain }\">\n <h1>Edge grain</h1>\n <template v-for=\"(board, boardIndex) in boards\">\n <h2 v-if=\"boards.length > 1\">Board {{ boardIndex + 1}}</h2>\n <EdgeGrainPreview :board=\"board\" :scale=\"1\" />\n </template>\n </div>\n\n <div :class=\"{ hideOnPrint: !printCuttingList }\">\n <h1>Cutting list</h1>\n <CuttingList />\n </div>\n </div>\n</template>\n\n<script>\nimport Settings from './components/Settings.vue'\nimport Layers from './components/Layers.vue'\nimport Wood from './components/Wood.vue'\nimport EndGrainPreview from './components/EndGrainPreview.vue'\nimport EdgeGrainPreview from './components/EdgeGrainPreview.vue'\nimport CuttingList from './components/CuttingList.vue'\n\nimport { saveAs } from 'file-saver';\nimport { bytesToBase64, base64ToBytes } from './lib/base64';\n\nexport default {\n name: 'App',\n components: {\n EndGrainPreview,\n EdgeGrainPreview,\n Settings,\n Layers,\n Wood,\n CuttingList\n },\n\n data()\n {\n return {\n tab: 'settings',\n saveFilename: 'My cutting board',\n\n printEdgeGrain: true,\n printEndGrain: true,\n printCuttingList: true\n }\n },\n\n created()\n {\n const self = this;\n const checkHash = () =>\n {\n if (!location.hash)\n return;\n\n const hash = location.hash.substring(1);\n try\n {\n const decoded = base64ToBytes(hash);\n if (decoded)\n self.$store.commit('loadMsgPack', decoded);\n }\n catch (e)\n {\n console.error(e);\n }\n }\n\n checkHash();\n\n window.addEventListener('hashchange', () =>\n {\n checkHash();\n });\n },\n\n computed: {\n boards() { return this.$store.state.boards; },\n\n hash()\n {\n return bytesToBase64(this.$store.getters.saveMsgPack);\n }\n },\n\n methods: {\n save()\n {\n const state = this.$store.getters.save;\n const blob = new Blob([state], { type: 'text/plain; charset=utf-8' });\n\n saveAs(blob, this.saveFilename + '.json');\n },\n\n\n load()\n {\n const loadFile = this.$refs.loadFile.files[0];\n if (!loadFile)\n return;\n\n this.saveFilename = loadFile.name.toLowerCase().endsWith('.json')\n ? loadFile.name.substring(0, loadFile.name.length - 5)\n : loadFile.name;\n\n const reader = new FileReader();\n reader.addEventListener('load', (event) =>\n {\n this.$store.commit('load', event.target.result);\n });\n reader.readAsBinaryString(loadFile);\n },\n\n\n print()\n {\n window.print();\n }\n },\n\n watch: {\n hash: (newValue) =>\n {\n history.replaceState({}, '', '#' + newValue);\n }\n }\n}\n</script>\n\n<style lang=\"scss\">\nhtml, body\n{\n background-color: #444444;\n color: white;\n margin: 0;\n padding: 0;\n width: 100%;\n height: 100%;\n overflow: none;\n\n @media print\n {\n background-color: white;\n color: black;\n overflow: visible;\n }\n}\n\n#app\n{\n font-family: 'Verdana', 'Arial', sans-serif;\n font-size: 10pt;\n\n display: flex;\n flex-direction: horizontal;\n\n width: 100%;\n height: 100%;\n}\n\nh2\n{\n color: #808080;\n font-size: 80%;\n}\n\na\n{\n color: #99ccff;\n}\n\ninput, select\n{\n background-color: #303030;\n color: white;\n border: solid 1px #606060;\n padding-top: .3em;\n padding-bottom: .3em;\n\n &:focus\n {\n outline: solid 1px #808080;\n }\n}\n\ninput[type='number']\n{\n text-align: right;\n}\n\nbutton\n{\n background-color: #404040;\n color: white;\n border: solid 1px #606060;\n padding-top: .3em;\n padding-bottom: .3em;\n\n &:hover:not([disabled])\n {\n background-color: #808080;\n }\n}\n\n.hideOnPrint\n{\n @media print\n {\n display: none;\n }\n}\n</style>\n\n<style lang=\"scss\" scoped>\n.sidebar\n{\n background-color: #383838;\n color: white;\n width: 35em;\n flex-shrink: 0;\n box-shadow: 0 0 3em #101010;\n\n .toolbar\n {\n background-color: #333333;\n box-shadow: -.2em 0 .5em black;\n margin-bottom: .5em;\n\n a\n {\n color: white;\n display: inline-block;\n padding: .5em;\n padding-left: 1em;\n padding-right: 1em;\n cursor: pointer;\n\n &.active\n {\n background-color: #0066cc;\n }\n\n &:hover:not(.active)\n {\n background-color: #004d99;\n }\n\n > svg\n {\n display: block;\n margin-left: auto;\n margin-right: auto;\n }\n }\n }\n\n .tab\n {\n padding: 1em;\n }\n}\n\n.settings\n{\n margin-right: 1em;\n\n .block\n {\n margin-bottom: 2em;\n }\n}\n\n.content\n{\n flex-grow: 1;\n padding: 2em;\n padding-left: 3em;\n overflow: auto;\n\n @media print\n {\n background-color: white;\n color: black;\n overflow: visible;\n }\n\n h1\n {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 150%;\n }\n\n .preview\n {\n margin-bottom: 2em;\n }\n}\n\n.loadSave, .about\n{\n width: 30em;\n}\n</style>\n","<template>\r\n <div class=\"settings\">\r\n <h2>Designer</h2>\r\n\r\n <label for=\"units\">Units</label>\r\n <select id=\"units\" :value=\"settings.units\" @change=\"$store.commit('updateSettings', { units: $event.target.value })\">\r\n <option value=\"mm\">Millimeters</option>\r\n <option value=\"cm\">Centimeters</option>\r\n <option value=\"inchdecimal\">Inches (decimal)</option>\r\n <!--<option value=\"inchfractional\">Inches (fractional)</option>-->\r\n </select>\r\n\r\n <h2>Tools</h2>\r\n <label for=\"bladeKerf\">Blade kerf</label>\r\n <input id=\"bladeKerf\" type=\"number\" :value=\"settings.bladeKerf\" @change=\"$store.commit('updateSettings', { bladeKerf: parseFloatDef($event.target.value) })\" />\r\n\r\n <h2>End grain</h2>\r\n <label for=\"crosscutWidth\">Crosscut width</label>\r\n <input id=\"crosscutWidth\" type=\"number\" :value=\"settings.crosscutWidth\" @change=\"$store.commit('updateSettings', { crosscutWidth: parseFloatDef($event.target.value) })\" />\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport { units } from '../lib/units';\r\n\r\nexport default {\r\n computed: {\r\n settings() { return this.$store.state.settings; }\r\n },\r\n\r\n\r\n methods: {\r\n parseFloatDef(value)\r\n {\r\n const parsedValue = parseFloat(value);\r\n return Object.is(parsedValue, NaN) ? 0 : parsedValue;\r\n }\r\n }\r\n}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.settings\r\n{\r\n display: inline-grid;\r\n grid-template-columns: auto auto;\r\n grid-column-gap: 1em;\r\n grid-row-gap: .25em;\r\n\r\n h2\r\n {\r\n margin-top: 1em;\r\n margin-bottom: .25em;\r\n grid-column: 1 / 3;\r\n }\r\n}\r\n</style>","const millimetersPerInch = 25.4;\r\nconst millimetersPerCentimeter = 10;\r\nconst pixelsPerMillimeter = 1;\r\n\r\n\r\n\r\nconst units = {\r\n convert(value, fromUnits, toUnits)\r\n {\r\n const millimeters = this.toMillimeters(value, fromUnits);\r\n return this.fromMillimeters(millimeters, toUnits);\r\n },\r\n\r\n\r\n toPixels(value, units)\r\n {\r\n return Math.ceil(this.toMillimeters(value, units) * pixelsPerMillimeter);\r\n },\r\n\r\n\r\n toMillimeters(value, units)\r\n {\r\n switch (units)\r\n {\r\n case 'mm': return value;\r\n case 'cm': return value * millimetersPerCentimeter;\r\n case 'inchdecimal': return value * millimetersPerInch;\r\n }\r\n\r\n console.error('Invalid units type: ' + units);\r\n return 0;\r\n },\r\n\r\n\r\n fromMillimeters(value, units)\r\n {\r\n switch (units)\r\n {\r\n case 'mm': return value;\r\n case 'cm': return value / millimetersPerCentimeter;\r\n case 'inchdecimal': return value / millimetersPerInch;\r\n }\r\n\r\n console.error('Invalid units type: ' + units);\r\n return 0;\r\n },\r\n\r\n\r\n display(value, units)\r\n {\r\n const displayValue = this.limitDecimals(value, 3);\r\n\r\n switch (units)\r\n {\r\n case 'mm': return displayValue + ' mm';\r\n case 'cm': return displayValue + ' cm';\r\n case 'inchdecimal': return displayValue + ' inch';\r\n }\r\n\r\n console.error('Invalid units type: ' + units);\r\n return displayValue;\r\n },\r\n\r\n\r\n limitDecimals(value, decimals)\r\n {\r\n // toFixed turns it into a string and pads it with zeroes\r\n const power = Math.pow(10, decimals);\r\n return Math.round(value * power) / power;\r\n }\r\n};\r\n\r\n\r\nexport { units }","import { render } from \"./Settings.vue?vue&type=template&id=7067c7c7&scoped=true\"\nimport script from \"./Settings.vue?vue&type=script&lang=js\"\nexport * from \"./Settings.vue?vue&type=script&lang=js\"\n\nimport \"./Settings.vue?vue&type=style&index=0&id=7067c7c7&lang=scss&scoped=true\"\nscript.render = render\nscript.__scopeId = \"data-v-7067c7c7\"\n\nexport default script","<template>\r\n <div class=\"board\">\r\n <button @click=\"previousBoard\" :disabled=\"boardIndex == 0\">&lt;</button>\r\n <div class=\"name\">Board {{ boardIndex + 1 }} of {{ boards.length }}</div>\r\n <button @click=\"removeBoard\" v-if=\"boards.length > 1\">Remove</button>\r\n <button @click=\"addBoard\">Add</button>\r\n <button @click=\"nextBoard\" :disabled=\"boardIndex == boards.length - 1\">&gt;</button>\r\n </div>\r\n\r\n <template v-if=\"currentBoard !== null\">\r\n <div class=\"boardsettings\">\r\n <label for=\"boardLength\">Board length</label>\r\n <input id=\"boardLength\" type=\"number\" :value=\"currentBoard.length\" @change=\"$store.commit('updateBoard', { board: boardIndex, values: { length: parseFloatDef($event.target.value) }})\" />\r\n\r\n <label for=\"boardThickness\">Board thickness</label>\r\n <input id=\"boardThickness\" type=\"number\" :value=\"currentBoard.thickness\" @change=\"$store.commit('updateBoard', { board: boardIndex, values: { thickness: parseFloatDef($event.target.value) }})\" />\r\n </div>\r\n\r\n <div class=\"layers\">\r\n <div class=\"hint\">\r\n Tip: click and drag the layer number to move a layer\r\n </div>\r\n\r\n <span class=\"header\">&nbsp;</span>\r\n <span class=\"header\">Wood species</span>\r\n <span class=\"header\">Width</span>\r\n <span class=\"header\">&nbsp;</span>\r\n\r\n <template v-for=\"(layer, index) in currentBoard.layers\">\r\n <div class=\"index\" :class=\"{ dropTargetAbove: dropTarget === index, dropTargetBelow: dropTarget === currentBoard.layers.length && index === currentBoard.layers.length - 1 }\" :ref=\"'layer' + index\" @mousedown.prevent=\"startDrag(index)\">{{ index + 1 }}</div>\r\n <select v-model=\"layer.wood\" class=\"wood\">\r\n <option v-for=\"(item, index) in wood\" :value=\"index\">{{ item.name }}</option>\r\n </select>\r\n <input type=\"number\" class=\"width\" :value=\"layer.width\" @input=\"layer.width = parseFloatDef($event.target.value)\" />\r\n\r\n <div class=\"remove\">\r\n <button @click=\"removeLayer(index)\">X</button>\r\n </div>\r\n </template>\r\n\r\n <div class=\"widthwarning\" v-if=\"widthWarning !== null\">\r\n {{ widthWarning }}\r\n </div>\r\n\r\n <div class=\"add\">\r\n <button @click=\"addLayer()\">Add layer</button>\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <h2>Preview settings</h2>\r\n <input id=\"borders\" type=\"checkbox\" :checked=\"settings.borders\" @change=\"$store.commit('updateSettings', { borders: $event.target.checked })\" />\r\n <label for=\"borders\"> Show borders</label>\r\n </div>\r\n\r\n <div>\r\n <h2>End grain layer direction</h2>\r\n <div>\r\n <input id=\"directionUniform\" type=\"radio\" :checked=\"settings.direction === 'uniform'\" @change=\"setDirection($event, 'uniform')\" />\r\n <label for=\"directionUniform\"> Uniform</label>\r\n </div>\r\n\r\n <div>\r\n <input id=\"directionAlternate\" type=\"radio\" :checked=\"settings.direction === 'alternate'\" @change=\"setDirection($event, 'alternate')\" />\r\n <label for=\"directionAlternate\"> Alternate</label>\r\n </div>\r\n\r\n <div>\r\n <input id=\"directionCustom\" type=\"radio\" :checked=\"settings.direction === 'custom'\" @change=\"setDirection($event, 'custom')\" />\r\n <label for=\"directionCustom\"> Custom</label>\r\n <p v-if=\"settings.direction === 'custom'\">\r\n Click the strips in the preview to reverse their direction. <span v-if=\"!settings.borders\">This may be easier if you <a href=\"#\" @click.prevent=\"$store.commit('updateSettings', { borders: true })\">turn on</a> the 'Show borders' setting.</span>\r\n </p>\r\n </div>\r\n </div>\r\n </template>\r\n</template>\r\n\r\n<script>\r\nimport { units } from '../lib/units';\r\n\r\nexport default {\r\n data()\r\n {\r\n return {\r\n boardIndex: 0,\r\n dragIndex: null,\r\n dropTarget: null\r\n }\r\n },\r\n\r\n\r\n computed: {\r\n settings() { return this.$store.state.settings; },\r\n wood() { return this.$store.state.wood; },\r\n boards() { return this.$store.state.boards; },\r\n\r\n currentBoard()\r\n {\r\n return this.boardIndex >= 0 && this.boardIndex < this.boards.length\r\n ? this.boards[this.boardIndex]\r\n : null;\r\n },\r\n\r\n widthWarning()\r\n {\r\n const self = this;\r\n if (self.currentBoard === null || self.boards.length == 1)\r\n return null;\r\n\r\n let minWidth = null;\r\n let currentWidth = null;\r\n let maxWidth = null;\r\n\r\n self.boards.forEach((board, index) =>\r\n {\r\n const boardWidth = units.limitDecimals(\r\n board.layers\r\n .map(layer => layer.width)\r\n .reduce((accumulator, currentValue) => accumulator + currentValue, 0),\r\n 3);\r\n\r\n if (index == self.boardIndex)\r\n currentWidth = boardWidth;\r\n\r\n if (minWidth === null || boardWidth < minWidth)\r\n minWidth = boardWidth;\r\n\r\n if (maxWidth === null || boardWidth > maxWidth)\r\n maxWidth = boardWidth;\r\n });\r\n\r\n if (minWidth == maxWidth)\r\n return null;\r\n\r\n let message = \"Your board are not of equal width. The current board is \" + units.display(currentWidth, this.settings.units) + \" \";\r\n\r\n if (currentWidth < maxWidth)\r\n message += \"while the widest is \" + units.display(maxWidth, this.settings.units) + \". \";\r\n else\r\n message += \"while the smallest is \" + units.display(minWidth, this.settings.units) + \". \";\r\n\r\n message += \"The end grain board will not align.\";\r\n return message;\r\n },\r\n\r\n maxBoardWidth()\r\n {\r\n // This is a copy from EndGrainPreview.vue, deduplicate maybe?\r\n return this.boards\r\n .map(board => board.layers\r\n .map(layer => layer.width)\r\n .reduce((accumulator, currentValue) => accumulator + currentValue, 0))\r\n .reduce((accumulator, currentValue) => currentValue > accumulator ? currentValue : accumulator, 0);\r\n }\r\n },\r\n\r\n\r\n methods: {\r\n parseFloatDef(value)\r\n {\r\n const parsedValue = parseFloat(value);\r\n return Object.is(parsedValue, NaN) ? 0 : parsedValue;\r\n },\r\n\r\n\r\n previousBoard()\r\n {\r\n if (this.boardIndex > 0)\r\n this.boardIndex--;\r\n },\r\n\r\n\r\n nextBoard()\r\n {\r\n if (this.boardIndex < this.boards.length - 1)\r\n this.boardIndex++;\r\n },\r\n\r\n\r\n addBoard()\r\n {\r\n this.$store.commit('addBoard', this.boardIndex);\r\n this.boardIndex = this.boards.length - 1;\r\n },\r\n\r\n\r\n removeBoard()\r\n {\r\n if (this.boards.length <= 1)\r\n return;\r\n\r\n this.$store.commit('removeBoard', this.boardIndex);\r\n\r\n if (this.boardIndex >= this.boards.length)\r\n this.boardIndex = this.boards.length - 1;\r\n },\r\n\r\n\r\n addLayer()\r\n {\r\n this.$store.commit('addLayer', this.boardIndex);\r\n },\r\n\r\n\r\n removeLayer(index)\r\n {\r\n this.$store.commit('removeLayer', { board: this.boardIndex, layer: index });\r\n },\r\n\r\n\r\n startDrag(index)\r\n {\r\n const self = this;\r\n self.dragIndex = index;\r\n self.dropTarget = index;\r\n\r\n const dragMouseMove = (event) =>\r\n {\r\n self.dropTarget = self.getTargetLayer(event.pageY);\r\n };\r\n\r\n let dragMouseUp;\r\n dragMouseUp = () =>\r\n {\r\n document.removeEventListener('mousemove', dragMouseMove);\r\n document.removeEventListener('mouseup', dragMouseUp);\r\n\r\n if (self.dragIndex !== self.dropTarget)\r\n self.$store.commit('moveLayer', { board: this.boardIndex, from: self.dragIndex, to: self.dropTarget });\r\n\r\n self.dropTarget = null;\r\n self.dragIndex = null;\r\n };\r\n\r\n document.addEventListener('mousemove', dragMouseMove);\r\n document.addEventListener('mouseup', dragMouseUp);\r\n },\r\n\r\n\r\n getTargetLayer(yPos)\r\n {\r\n if (this.currentBoard === null || this.currentBoard.layers.length == 0)\r\n return null;\r\n\r\n const firstLayer = this.getPageOffsetRect(this.$refs.layer0);\r\n const lastLayer = this.getPageOffsetRect(this.$refs['layer' + (this.currentBoard.layers.length - 1)]);\r\n\r\n // On or above the first item\r\n if (yPos <= firstLayer.bottom)\r\n return 0;\r\n\r\n // Below the last item\r\n if (yPos >= lastLayer.bottom)\r\n return this.currentBoard.layers.length;\r\n\r\n // On the last item\r\n if (yPos >= lastLayer.top)\r\n return this.currentBoard.layers.length - 1;\r\n\r\n // Check the previous target first, as it is most likely unchanged due to how\r\n // often mouseMove events occur\r\n if (this.dropTarget !== null && this.dropTarget > 0 && this.dropTarget < this.currentBoard.layers.length - 1)\r\n {\r\n const currentTarget = this.getPageOffsetRect(this.$refs['layer' + this.dropTarget]);\r\n if (yPos >= currentTarget.top && yPos < currentTarget.bottom)\r\n return this.dropTarget;\r\n }\r\n\r\n // Just loop through all the layers, there shouldn't be enough to warrant anything more efficient\r\n for (let i = 1; i < this.currentBoard.layers.length - 1; i++)\r\n {\r\n const testTarget = this.getPageOffsetRect(this.$refs['layer' + i]);\r\n if (yPos >= testTarget.top && yPos < testTarget.bottom)\r\n return i;\r\n }\r\n\r\n // This should never occur, so it probably will!\r\n return null;\r\n },\r\n\r\n\r\n getPageOffsetRect(element)\r\n {\r\n const clientRect = element.getBoundingClientRect();\r\n const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;\r\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\r\n\r\n return {\r\n top: clientRect.top + scrollTop,\r\n left: clientRect.left + scrollLeft,\r\n right: clientRect.right + scrollLeft,\r\n bottom: clientRect.bottom + scrollTop\r\n };\r\n },\r\n\r\n\r\n setDirection(event, direction)\r\n {\r\n if (!event.target.checked)\r\n return;\r\n\r\n this.$store.commit('updateSettings', { direction: direction });\r\n }\r\n }\r\n}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.layers\r\n{\r\n display: grid;\r\n grid-template-columns: min-content auto 5em min-content;\r\n grid-column-gap: 1em;\r\n\r\n .hint\r\n {\r\n color: #808080;\r\n text-align: center;\r\n\r\n grid-column: 1 / 5;\r\n margin-bottom: 1em;\r\n }\r\n\r\n .index\r\n {\r\n cursor: grab;\r\n\r\n &.dropTargetAbove\r\n {\r\n border-top: solid 1px white;\r\n cursor: grabbing;\r\n }\r\n\r\n &.dropTargetBelow\r\n {\r\n border-bottom: solid 1px white;\r\n cursor: grabbing;\r\n }\r\n }\r\n\r\n .add\r\n {\r\n grid-column: 2 / 5;\r\n padding-top: 1em;\r\n }\r\n\r\n .widthwarning\r\n {\r\n font-size: 80%;\r\n color: yellow;\r\n grid-column: 2 / 5;\r\n padding-top: .5em;\r\n }\r\n\r\n .header\r\n {\r\n font-weight: bold;\r\n margin-bottom: .25em;\r\n }\r\n}\r\n\r\n.board\r\n{\r\n display: flex;\r\n margin-bottom: 2em;\r\n\r\n .name\r\n {\r\n flex-grow: 1;\r\n padding: .5em;\r\n }\r\n}\r\n\r\n\r\n.boardsettings\r\n{\r\n display: inline-grid;\r\n grid-template-columns: max-content 5em;\r\n grid-column-gap: 1em;\r\n\r\n margin-bottom: 2em;\r\n}\r\n\r\n\r\nh2\r\n{\r\n margin-top: 2em;\r\n}\r\n</style>","import { render } from \"./Layers.vue?vue&type=template&id=01187e40&scoped=true\"\nimport script from \"./Layers.vue?vue&type=script&lang=js\"\nexport * from \"./Layers.vue?vue&type=script&lang=js\"\n\nimport \"./Layers.vue?vue&type=style&index=0&id=01187e40&lang=scss&scoped=true\"\nscript.render = render\nscript.__scopeId = \"data-v-01187e40\"\n\nexport default script","<template>\r\n <div class=\"wood\">\r\n <span class=\"header\">Name</span>\r\n <span class=\"header\">Colour</span>\r\n <span class=\"header\">&nbsp;</span>\r\n\r\n <template v-for=\"(item, index) in wood\">\r\n <input type=\"text\" class=\"name\" v-model=\"item.name\" />\r\n <input type=\"color\" class=\"color\" v-model=\"item.color\" />\r\n\r\n <div class=\"remove\">\r\n <button @click=\"removeWood(index)\">X</button>\r\n </div>\r\n </template>\r\n\r\n <div class=\"add\">\r\n <button @click=\"addWood()\">Add wood species</button>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nexport default {\r\n computed: {\r\n settings() { return this.$store.state.settings; },\r\n wood() { return this.$store.state.wood; }\r\n },\r\n\r\n\r\n methods: {\r\n addWood()\r\n {\r\n this.$store.commit('addWood');\r\n },\r\n\r\n\r\n removeWood(index)\r\n {\r\n this.$store.commit('removeWood', index);\r\n }\r\n }\r\n}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.wood\r\n{\r\n display: grid;\r\n grid-template-columns: auto min-content min-content;\r\n grid-column-gap: 1em;\r\n\r\n .add\r\n {\r\n grid-column: 1 / 4;\r\n padding-top: 1em;\r\n }\r\n\r\n .header\r\n {\r\n font-weight: bold;\r\n margin-bottom: .25em;\r\n }\r\n\r\n button\r\n {\r\n height: 100%;\r\n }\r\n}\r\n</style>","import { render } from \"./Wood.vue?vue&type=template&id=15338ab0&scoped=true\"\nimport script from \"./Wood.vue?vue&type=script&lang=js\"\nexport * from \"./Wood.vue?vue&type=script&lang=js\"\n\nimport \"./Wood.vue?vue&type=style&index=0&id=15338ab0&lang=scss&scoped=true\"\nscript.render = render\nscript.__scopeId = \"data-v-15338ab0\"\n\nexport default script","<template>\n <div class=\"preview\">\n <div class=\"dimensions\">Dimensions: {{ display(boardWidth) }} x {{ display(boardHeight) }} x {{ display(settings.crosscutWidth) }}</div>\n\n <div v-if=\"boards.length > 1\" class=\"draghint hideOnPrint\">Click and drag strips to reorder them. Click once to reverse the direction.</div>\n\n <svg\n :width=\"viewportWidth\"\n :height=\"viewportHeight\"\n :viewBox=\"viewBox\"\n :class=\"{ dragging: dropTarget !== null }\">\n <defs>\n <g v-for=\"(board, boardIndex) in boards\" :id=\"'strip' + boardIndex\">\n <rect\n v-for=\"(layer, index) in board.layers\"\n :width=\"toPixels(board.thickness)\"\n :height=\"toPixels(layer.width)\"\n x=\"0\"\n :y=\"getBoardLayerOffset(board, index)\"\n :style=\"getBoardLayerStyle(board, index)\" />\n </g>\n <g id=\"dropTarget\">\n <line x1=\"0\" y1=\"0\" x2=\"0\" :y2=\"boardPixelHeight\" style=\"stroke: white; stroke-width: 2\" />\n </g>\n </defs>\n\n <use\n v-for=\"(layer, index) in endGrain\"\n :ref=\"'strip' + index\"\n :href=\"'#strip' + layer.board\"\n :x=\"getLayerOffset(index)\"\n y=\"0\"\n :transform=\"getLayerTransform(index)\"\n @mousedown.prevent=\"mouseDown(index, $event)\" />\n\n <use\n v-if=\"dropTarget !== null\"\n href=\"#dropTarget\"\n :x=\"getLayerOffset(dropTarget)\" />\n </svg>\n </div>\n</template>\n\n<script>\nimport { units } from '../lib/units';\n\nexport default {\n props: {\n scale: Number\n },\n\n\n data()\n {\n return {\n dragIndex: null,\n dropTarget: null\n };\n },\n\n\n computed: {\n settings() { return this.$store.state.settings; },\n boards() { return this.$store.state.boards; },\n wood() { return this.$store.state.wood; },\n endGrain() { return this.$store.state.endGrain },\n\n boardWidth()\n {\n const self = this;\n\n return this.endGrain\n .map(layer => layer.board >= 0 && layer.board < self.boards.length ? self.boards[layer.board].thickness : 0)\n .reduce((accumulator, currentValue) => accumulator + currentValue, 0);\n },\n\n boardHeight()\n {\n // Calculate the total width of each board (adding all the layers, inner map/reduce),\n // then use the maximum value (outer map/reduce)\n return this.boards\n .map(board => board.layers\n .map(layer => layer.width)\n .reduce((accumulator, currentValue) => accumulator + currentValue, 0))\n .reduce((accumulator, currentValue) => currentValue > accumulator ? currentValue : accumulator, 0);\n },\n\n boardPixelWidth()\n {\n return this.toPixels(this.boardWidth);\n },\n\n boardPixelHeight()\n {\n return this.toPixels(this.boardHeight);\n },\n\n viewportWidth() { return Math.floor(this.boardPixelWidth * this.scale); },\n viewportHeight() { return Math.floor(this.boardPixelHeight * this.scale); },\n viewBox() { return '0 0 ' + this.boardPixelWidth + ' ' + this.boardPixelHeight; }\n },\n\n\n methods: {\n toPixels(value)\n {\n return units.toPixels(value, this.settings.units);\n },\n\n display(value)\n {\n return units.display(value, this.settings.units);\n },\n\n getBoardLayerOffset(board, index)\n {\n if (index < 0 || index >= board.layers.length)\n return 0;\n\n let offset = 0;\n\n for (let i = 0; i < index; i++)\n offset += board.layers[i].width;\n\n return this.toPixels(offset);\n },\n\n getBoardLayerStyle(board, index)\n {\n if (index < 0 || index >= board.layers.length)\n return 'fill: fuchsia';\n\n const woodIndex = board.layers[index].wood;\n if (woodIndex < 0 || woodIndex >= this.wood.length)\n return '';\n\n const borderStyle = this.settings.borders\n ? '; stroke-width: 1; stroke: black'\n : '';\n\n return 'fill: ' + this.wood[woodIndex].color + borderStyle;\n },\n\n getLayerOffset(index)\n {\n if (index < 0 || index > this.endGrain.length)\n return 0;\n\n let offset = 0;\n\n for (let i = 0; i < index; i++)\n {\n const boardIndex = this.endGrain[i].board;\n if (boardIndex >= 0 && boardIndex < this.boards.length)\n offset += this.boards[boardIndex].thickness;\n }\n\n return this.toPixels(offset);\n },\n\n getLayerTransform(index)\n {\n let reversed = false;\n\n switch (this.settings.direction)\n {\n case 'alternate':\n reversed = (index % 2) == 0;\n break;\n\n case 'custom':\n reversed = index >= 0 && index < this.endGrain.length && this.endGrain[index].reversed;\n break;\n }\n\n return reversed ? 'scale(1, -1) translate(0, -' + this.boardPixelHeight + ')' : '';\n },\n\n reverseLayer(index)\n {\n if (this.settings.direction !== 'custom')\n return;\n\n if (index < 0 || index >= this.endGrain.length)\n return;\n\n this.endGrain[index].reversed = !this.endGrain[index].reversed;\n },\n\n\n mouseDown(index, event)\n {\n const self = this;\n const startX = event.pageX;\n let dragging = false;\n\n const dragMouseMove = (moveEvent) =>\n {\n if (!dragging)\n {\n if (Math.abs(moveEvent.pageX - startX) >= 5)\n {\n self.dragIndex = index;\n dragging = true;\n }\n }\n\n if (dragging)\n self.dropTarget = self.getTargetStrip(moveEvent.pageX);\n };\n\n let dragMouseUp;\n dragMouseUp = () =>\n {\n document.removeEventListener('mousemove', dragMouseMove);\n document.removeEventListener('mouseup', dragMouseUp);\n\n if (dragging)\n {\n if (self.dragIndex !== self.dropTarget)\n self.$store.commit('moveEndgrain', { from: self.dragIndex, to: self.dropTarget });\n\n self.dropTarget = null;\n self.dragIndex = null;\n }\n else\n self.reverseLayer(index);\n };\n\n document.addEventListener('mousemove', dragMouseMove);\n document.addEventListener('mouseup', dragMouseUp);\n },\n\n\n getTargetStrip(xPos)\n {\n if (this.endGrain.length == 0)\n return null;\n\n const firstStrip = this.getPageOffsetRect(this.$refs.strip0);\n const lastStrip = this.getPageOffsetRect(this.$refs['strip' + (this.endGrain.length - 1)]);\n\n // On or above the first item\n if (xPos <= firstStrip.right)\n return 0;\n\n // Below the last item\n if (xPos >= lastStrip.right)\n return this.endGrain.length;\n\n // On the last item\n if (xPos >= lastStrip.left)\n return this.endGrain.length - 1;\n\n // Check the previous target first, as it is most likely unchanged due to how\n // often mouseMove events occur\n if (this.dropTarget !== null && this.dropTarget > 0 && this.dropTarget < this.endGrain.length - 1)\n {\n const currentTarget = this.getPageOffsetRect(this.$refs['strip' + this.dropTarget]);\n if (xPos >= currentTarget.left && xPos < currentTarget.right)\n return this.dropTarget;\n }\n\n // Just loop through all the strips, there shouldn't be enough to warrant anything more efficient\n for (let i = 1; i < this.endGrain.length - 1; i++)\n {\n const testTarget = this.getPageOffsetRect(this.$refs['strip' + i]);\n if (xPos >= testTarget.left && xPos < testTarget.right)\n return i;\n }\n\n // This should never occur, so it probably will!\n return null;\n },\n\n\n getPageOffsetRect(element)\n {\n const clientRect = element.getBoundingClientRect();\n const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n\n return {\n top: clientRect.top + scrollTop,\n left: clientRect.left + scrollLeft,\n right: clientRect.right + scrollLeft,\n bottom: clientRect.bottom + scrollTop\n };\n }\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.dimensions\n{\n margin-bottom: .5em;\n}\n\n\n.draghint\n{\n margin-bottom: 2em;\n}\n\n\nsvg\n{\n user-select: none;\n\n @media screen\n {\n box-shadow: 0 0 3em black;\n }\n\n @media print\n {\n max-width: 100%;\n }\n\n &.dragging\n {\n cursor: grabbing;\n }\n}\n</style>","import { render } from \"./EndGrainPreview.vue?vue&type=template&id=61e0967d&scoped=true\"\nimport script from \"./EndGrainPreview.vue?vue&type=script&lang=js\"\nexport * from \"./EndGrainPreview.vue?vue&type=script&lang=js\"\n\nimport \"./EndGrainPreview.vue?vue&type=style&index=0&id=61e0967d&lang=scss&scoped=true\"\nscript.render = render\nscript.__scopeId = \"data-v-61e0967d\"\n\nexport default script","<template>\n <div class=\"preview\">\n <div class=\"dimensions\">Dimensions: {{ display(boardWidth) }} x {{ display(boardHeight) }} x {{ display(board.thickness) }}</div>\n\n <svg\n :width=\"viewportWidth\"\n :height=\"viewportHeight\"\n :viewBox=\"viewBox\">\n\n <rect\n v-for=\"(layer, index) in layers\"\n :width=\"toPixels(board.length)\"\n :height=\"toPixels(layer.width)\"\n x=\"0\"\n :y=\"getLayerOffset(index)\"\n :style=\"getLayerStyle(index)\" />\n </svg>\n </div>\n</template>\n\n<script>\nimport { units } from '../lib/units';\n\nexport default {\n props: {\n scale: Number,\n board: Object\n },\n\n\n computed: {\n settings() { return this.$store.state.settings; },\n wood() { return this.$store.state.wood; },\n layers() { return this.board.layers; },\n\n boardWidth() { return this.board.length; },\n\n boardHeight()\n {\n if (this.layers.length == 0)\n return 0;\n\n return this.layers\n .map(currentValue => currentValue.width)\n .reduce((accumulator, currentValue) => accumulator + currentValue, 0);\n },\n\n boardPixelWidth()\n {\n return this.toPixels(this.boardWidth);\n },\n\n boardPixelHeight()\n {\n return this.toPixels(this.boardHeight);\n },\n\n viewportWidth() { return Math.floor(this.boardPixelWidth * this.scale); },\n viewportHeight() { return Math.floor(this.boardPixelHeight * this.scale); },\n viewBox() { return '0 0 ' + this.boardPixelWidth + ' ' + this.boardPixelHeight; }\n },\n\n\n methods: {\n toPixels(value)\n {\n return units.toPixels(value, this.settings.units);\n },\n\n display(value)\n {\n return units.display(value, this.settings.units);\n },\n\n getLayerOffset(index)\n {\n if (index < 0 || index >= this.layers.length)\n return 0;\n\n let offset = 0;\n\n for (let i = 0; i < index; i++)\n offset += this.layers[i].width;\n\n return this.toPixels(offset);\n },\n\n getLayerStyle(index)\n {\n if (index < 0 || index >= this.layers.length)\n return 'fill: fuchsia';\n\n const woodIndex = this.layers[index].wood;\n if (woodIndex < 0 || woodIndex >= this.wood.length)\n return '';\n\n const borderStyle = this.settings.borders\n ? '; stroke-width: 1; stroke: black'\n : '';\n\n return 'fill: ' + this.wood[woodIndex].color + borderStyle;\n }\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.dimensions\n{\n margin-bottom: .5em;\n}\n\n\nsvg\n{\n @media screen\n {\n box-shadow: 0 0 3em black;\n }\n\n @media print\n {\n max-width: 100%;\n }\n}\n</style>","import { render } from \"./EdgeGrainPreview.vue?vue&type=template&id=a5fd011a&scoped=true\"\nimport script from \"./EdgeGrainPreview.vue?vue&type=script&lang=js\"\nexport * from \"./EdgeGrainPreview.vue?vue&type=script&lang=js\"\n\nimport \"./EdgeGrainPreview.vue?vue&type=style&index=0&id=a5fd011a&lang=scss&scoped=true\"\nscript.render = render\nscript.__scopeId = \"data-v-a5fd011a\"\n\nexport default script","<template>\r\n <table class=\"list\">\r\n <tr>\r\n <th>Layer</th>\r\n <th>Wood species</th>\r\n <th class=\"dimension\">Width</th>\r\n </tr>\r\n <template v-for=\"(board, boardIndex) in boards\">\r\n <tr class=\"board\" v-if=\"boards.length > 1\">\r\n <td colspan=\"3\">Board {{ boardIndex + 1 }}</td>\r\n </tr>\r\n\r\n <tr v-for=\"(layer, index) in board.layers\">\r\n <td>{{ index + 1 }}</td>\r\n <td>{{ getLayerWood(board, index) }}</td>\r\n <td class=\"dimension\">{{ getLayerWidth(board, index) }}</td>\r\n </tr>\r\n </template>\r\n </table>\r\n\r\n <h2>Bill of materials</h2>\r\n <table class=\"list\">\r\n <tr>\r\n <th>Wood species</th>\r\n <th class=\"dimension\">Length</th>\r\n <th class=\"dimension\">Width</th>\r\n <th class=\"dimension\">Thickness</th>\r\n </tr>\r\n <template v-for=\"(board, boardIndex) in bom\">\r\n <tr class=\"board\" v-if=\"bom.length > 1\">\r\n <td colspan=\"3\">Board {{ boardIndex + 1 }}</td>\r\n </tr>\r\n\r\n <tr v-for=\"stock in board\">\r\n <td>{{ stock.woodName }}</td>\r\n <td class=\"dimension\">{{ display(stock.length) }}</td>\r\n <td class=\"dimension\">{{ display(stock.width) }}</td>\r\n <td class=\"dimension\">{{ display(stock.thickness) }}</td>\r\n </tr>\r\n </template>\r\n </table>\r\n</template>\r\n\r\n<script>\r\nimport { units } from '../lib/units';\r\n\r\nexport default {\r\n computed: {\r\n settings() { return this.$store.state.settings; },\r\n boards() { return this.$store.state.boards; },\r\n wood() { return this.$store.state.wood; },\r\n\r\n bom()\r\n {\r\n const self = this;\r\n\r\n return self.boards.map((board, boardIndex) =>\r\n {\r\n const bom = [];\r\n const woodTally = {};\r\n\r\n board.layers.forEach(layer =>\r\n {\r\n if (woodTally.hasOwnProperty(layer.wood))\r\n woodTally[layer.wood] += layer.width + self.settings.bladeKerf;\r\n else\r\n woodTally[layer.wood] = layer.width;\r\n });\r\n\r\n for (let wood in woodTally)\r\n {\r\n if (!woodTally.hasOwnProperty(wood))\r\n continue;\r\n\r\n bom.push({\r\n board: boardIndex,\r\n woodName: wood >= 0 && wood < self.wood.length ? self.wood[wood].name : '',\r\n length: board.length,\r\n width: woodTally[wood],\r\n thickness: board.thickness\r\n });\r\n }\r\n\r\n return bom;\r\n });\r\n }\r\n },\r\n\r\n\r\n methods: {\r\n getLayerWood(board, index)\r\n {\r\n if (index < 0 || index >= board.layers.length)\r\n return '';\r\n\r\n const woodIndex = board.layers[index].wood;\r\n if (woodIndex < 0 || woodIndex >= this.wood.length)\r\n return '';\r\n\r\n return this.wood[woodIndex].name;\r\n },\r\n\r\n\r\n getLayerWidth(board, index)\r\n {\r\n if (index < 0 || index >= board.layers.length)\r\n return '';\r\n\r\n return this.display(board.layers[index].width);\r\n },\r\n\r\n\r\n display(value)\r\n {\r\n return units.display(value, this.settings.units);\r\n }\r\n }\r\n}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\nh2\r\n{\r\n font-size: 110%;\r\n}\r\n\r\n.list\r\n{\r\n border-collapse: collapse;\r\n margin-top: 1em;\r\n margin-bottom: 3em;\r\n\r\n th, td\r\n {\r\n padding: .25em;\r\n padding-left: 1em;\r\n padding-right: 1em;\r\n }\r\n\r\n .dimension\r\n {\r\n text-align: right;\r\n }\r\n\r\n tr.board td\r\n {\r\n font-style: italic;\r\n }\r\n\r\n tr:nth-child(even):not(.board) td\r\n {\r\n background-color: #555555;\r\n\r\n @media print\r\n {\r\n background-color: #f0f0f0;\r\n }\r\n }\r\n}\r\n</style>","import { render } from \"./CuttingList.vue?vue&type=template&id=30665a8d&scoped=true\"\nimport script from \"./CuttingList.vue?vue&type=script&lang=js\"\nexport * from \"./CuttingList.vue?vue&type=script&lang=js\"\n\nimport \"./CuttingList.vue?vue&type=style&index=0&id=30665a8d&lang=scss&scoped=true\"\nscript.render = render\nscript.__scopeId = \"data-v-30665a8d\"\n\nexport default script","/*\r\nMIT License\r\nCopyright (c) 2020 Egor Nepomnyaschih\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n*/\r\n\r\n/*\r\n// This constant can also be computed with the following algorithm:\r\nconst base64abc = [],\r\n A = \"A\".charCodeAt(0),\r\n a = \"a\".charCodeAt(0),\r\n n = \"0\".charCodeAt(0);\r\nfor (let i = 0; i < 26; ++i) {\r\n base64abc.push(String.fromCharCode(A + i));\r\n}\r\nfor (let i = 0; i < 26; ++i) {\r\n base64abc.push(String.fromCharCode(a + i));\r\n}\r\nfor (let i = 0; i < 10; ++i) {\r\n base64abc.push(String.fromCharCode(n + i));\r\n}\r\nbase64abc.push(\"+\");\r\nbase64abc.push(\"/\");\r\n*/\r\nconst base64abc = [\r\n \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\", \"J\", \"K\", \"L\", \"M\",\r\n \"N\", \"O\", \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\", \"X\", \"Y\", \"Z\",\r\n \"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\", \"i\", \"j\", \"k\", \"l\", \"m\",\r\n \"n\", \"o\", \"p\", \"q\", \"r\", \"s\", \"t\", \"u\", \"v\", \"w\", \"x\", \"y\", \"z\",\r\n \"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"+\", \"/\"\r\n];\r\n\r\n/*\r\n// This constant can also be computed with the following algorithm:\r\nconst l = 256, base64codes = new Uint8Array(l);\r\nfor (let i = 0; i < l; ++i) {\r\n base64codes[i] = 255; // invalid character\r\n}\r\nbase64abc.forEach((char, index) => {\r\n base64codes[char.charCodeAt(0)] = index;\r\n});\r\nbase64codes[\"=\".charCodeAt(0)] = 0; // ignored anyway, so we just need to prevent an error\r\n*/\r\nconst base64codes = [\r\n 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\r\n 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\r\n 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 62, 255, 255, 255, 63,\r\n 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255, 255, 0, 255, 255,\r\n 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,\r\n 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 255, 255, 255, 255, 255,\r\n 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,\r\n 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51\r\n];\r\n\r\nfunction getBase64Code(charCode) {\r\n if (charCode >= base64codes.length) {\r\n throw new Error(\"Unable to parse base64 string.\");\r\n }\r\n const code = base64codes[charCode];\r\n if (code === 255) {\r\n throw new Error(\"Unable to parse base64 string.\");\r\n }\r\n return code;\r\n}\r\n\r\nexport function bytesToBase64(bytes) {\r\n let result = '', i, l = bytes.length;\r\n for (i = 2; i < l; i += 3) {\r\n result += base64abc[bytes[i - 2] >> 2];\r\n result += base64abc[((bytes[i - 2] & 0x03) << 4) | (bytes[i - 1] >> 4)];\r\n result += base64abc[((bytes[i - 1] & 0x0F) << 2) | (bytes[i] >> 6)];\r\n result += base64abc[bytes[i] & 0x3F];\r\n }\r\n if (i === l + 1) { // 1 octet yet to write\r\n result += base64abc[bytes[i - 2] >> 2];\r\n result += base64abc[(bytes[i - 2] & 0x03) << 4];\r\n result += \"==\";\r\n }\r\n if (i === l) { // 2 octets yet to write\r\n result += base64abc[bytes[i - 2] >> 2];\r\n result += base64abc[((bytes[i - 2] & 0x03) << 4) | (bytes[i - 1] >> 4)];\r\n result += base64abc[(bytes[i - 1] & 0x0F) << 2];\r\n result += \"=\";\r\n }\r\n return result;\r\n}\r\n\r\nexport function base64ToBytes(str) {\r\n if (str.length % 4 !== 0) {\r\n throw new Error(\"Unable to parse base64 string.\");\r\n }\r\n const index = str.indexOf(\"=\");\r\n if (index !== -1 && index < str.length - 2) {\r\n throw new Error(\"Unable to parse base64 string.\");\r\n }\r\n let missingOctets = str.endsWith(\"==\") ? 2 : str.endsWith(\"=\") ? 1 : 0,\r\n n = str.length,\r\n result = new Uint8Array(3 * (n / 4)),\r\n buffer;\r\n for (let i = 0, j = 0; i < n; i += 4, j += 3) {\r\n buffer =\r\n getBase64Code(str.charCodeAt(i)) << 18 |\r\n getBase64Code(str.charCodeAt(i + 1)) << 12 |\r\n getBase64Code(str.charCodeAt(i + 2)) << 6 |\r\n getBase64Code(str.charCodeAt(i + 3));\r\n result[j] = buffer >> 16;\r\n result[j + 1] = (buffer >> 8) & 0xFF;\r\n result[j + 2] = buffer & 0xFF;\r\n }\r\n return result.subarray(0, result.length - missingOctets);\r\n}\r\n\r\nexport function base64encode(str, encoder = new TextEncoder()) {\r\n return bytesToBase64(encoder.encode(str));\r\n}\r\n\r\nexport function base64decode(str, decoder = new TextDecoder()) {\r\n return decoder.decode(base64ToBytes(str));\r\n}","import { render } from \"./App.vue?vue&type=template&id=5bc914fd&scoped=true\"\nimport script from \"./App.vue?vue&type=script&lang=js\"\nexport * from \"./App.vue?vue&type=script&lang=js\"\n\nimport \"./App.vue?vue&type=style&index=0&id=5bc914fd&lang=scss\"\nimport \"./App.vue?vue&type=style&index=1&id=5bc914fd&lang=scss&scoped=true\"\nscript.render = render\nscript.__scopeId = \"data-v-5bc914fd\"\n\nexport default script","const UnitsEnum = {\r\n mm: 'mm',\r\n cm: 'cm',\r\n inchdecimal: 'inchdecimal',\r\n //inchfractional: 'inchfractional'\r\n};\r\n\r\n\r\nUnitsEnum.isValid = (value) =>\r\n{\r\n switch (value)\r\n {\r\n case UnitsEnum.mm:\r\n case UnitsEnum.cm:\r\n case UnitsEnum.inchdecimal:\r\n //case UnitsEnum.inchfractional:\r\n return true;\r\n\r\n default:\r\n return false;\r\n }\r\n};\r\n\r\n\r\nconst DirectionEnum = {\r\n uniform: 'uniform',\r\n alternate: 'alternate',\r\n custom: 'custom'\r\n};\r\n\r\n\r\nDirectionEnum.isValid = (value) =>\r\n{\r\n switch (value)\r\n {\r\n case DirectionEnum.uniform:\r\n case DirectionEnum.alternate:\r\n case DirectionEnum.custom:\r\n return value;\r\n\r\n default:\r\n return DirectionEnum.uniform;\r\n }\r\n};\r\n\r\n\r\nexport {\r\n UnitsEnum,\r\n DirectionEnum\r\n}","import { createStore } from 'vuex';\nimport { units } from './lib/units';\nimport { UnitsEnum, DirectionEnum } from './lib/enums';\n\nimport { serialize, deserialize } from '@ygoe/msgpack';\n\n\n\nfunction DefaultSettings()\n{\n return {\n units: UnitsEnum.cm,\n borders: false,\n bladeKerf: 0.35,\n crosscutWidth: 3,\n direction: DirectionEnum.alternate\n };\n}\n\n\nfunction DefaultWood()\n{\n return [\n { name: 'Walnut', color: '#58443f' },\n { name: 'Maple', color: '#f2e0aa' },\n { name: 'Cherry', color: '#bb8359' },\n { name: 'Mahogany', color: '#98473f' },\n { name: 'Yellowheart', color: '#ffff84' },\n { name: 'White oak', color: '#fdf4b9' },\n { name: 'Bubinga', color: '#7e3c34' },\n { name: 'Jatoba', color: '#9b281c' },\n { name: 'Padouk', color: '#933350' }\n ];\n}\n\n\nfunction DefaultBoards()\n{\n return [\n {\n thickness: 2,\n length: 70,\n\n layers: [\n { wood: 8, width: 1 },\n { wood: 1, width: 1.5 },\n { wood: 8, width: 2 },\n { wood: 1, width: 2 },\n { wood: 8, width: 15 },\n { wood: 1, width: 2 },\n { wood: 8, width: 1.5 },\n { wood: 1, width: 1 }\n ]\n }\n ];\n}\n\n\nfunction DefaultEndGrain()\n{\n const settings = DefaultSettings();\n const boards = DefaultBoards();\n const result = [];\n\n updateEndGrain(result, settings, boards);\n\n return result;\n}\n\n\nexport default createStore({\n state: {\n settings: DefaultSettings(),\n wood: DefaultWood(),\n boards: DefaultBoards(),\n endGrain: DefaultEndGrain()\n },\n\n mutations: {\n addLayer(state, board)\n {\n if (board < 0 || board >= state.boards.length)\n return;\n\n state.boards[board].layers.push({\n wood: 0,\n width: units.fromMillimeters(20, state.settings.units)\n });\n },\n\n removeLayer(state, payload)\n {\n if (payload.board < 0 || payload.board >= state.boards.length)\n return;\n\n const board = state.boards[payload.board];\n\n if (payload.layer < 0 || payload.layer >= board.layers.length)\n return;\n\n board.layers.splice(payload.layer, 1);\n },\n\n moveLayer(state, payload)\n {\n if (payload.board < 0 || payload.board >= state.boards.length)\n return;\n\n const board = state.boards[payload.board];\n moveArrayItem(board.layers, payload.from, payload.to);\n },\n\n\n addWood(state)\n {\n state.wood.push({\n name: 'Wood #' + (state.wood.length + 1),\n color: '#f2e0aa'\n });\n },\n\n removeWood(state, index)\n {\n if (index < 0 || index >= state.wood.length)\n return;\n\n // Update all layers\n state.boards.forEach(board =>\n {\n board.layers.forEach(layer =>\n {\n if (layer.wood === index)\n layer.wood = -1\n else if (layer.wood > index)\n layer.wood--;\n });\n });\n\n state.wood.splice(index, 1);\n },\n\n\n updateSettings(state, payload)\n {\n const oldUnits = state.settings.units;\n mergeObject(payload, state.settings);\n\n if (oldUnits !== state.settings.units)\n {\n // Convert the settings\n state.settings.bladeKerf = units.limitDecimals(units.convert(state.settings.bladeKerf, oldUnits, state.settings.units), 3);\n state.settings.crosscutWidth = units.limitDecimals(units.convert(state.settings.crosscutWidth, oldUnits, state.settings.units), 3);\n\n // Convert the boards\n state.boards.forEach(board =>\n {\n board.thickness = units.limitDecimals(units.convert(board.thickness, oldUnits, state.settings.units), 3);\n board.length = units.limitDecimals(units.convert(board.length, oldUnits, state.settings.units), 3);\n\n board.layers.forEach(layer =>\n {\n layer.width = units.limitDecimals(units.convert(layer.width, oldUnits, state.settings.units), 3);\n });\n });\n }\n },\n\n\n addBoard(state, copyFrom)\n {\n if (copyFrom < 0 || copyFrom >= state.boards.length)\n {\n state.boards.push({\n thickness: 2,\n length: 70,\n layers: []\n });\n\n return;\n }\n\n const source = state.boards[copyFrom];\n\n state.boards.push({\n thickness: source.thickness,\n length: source.length,\n layers: source.layers.map(layer =>\n {\n return {\n wood: layer.wood,\n width: layer.width\n };\n })\n });\n\n updateEndGrain(state.endGrain, state.settings, state.boards);\n },\n\n\n removeBoard(state, index)\n {\n if (index < 0 || index >= state.boards.length)\n return;\n\n state.boards.splice(index, 1);\n\n // Update all references to the boards coming after\n state.endGrain.forEach(layer =>\n {\n if (layer.board == index)\n layer.board = -1;\n else if (layer.board > index)\n layer.board--;\n });\n\n updateEndGrain(state.endGrain, state.settings, state.boards);\n },\n\n\n updateBoard(state, payload)\n {\n if (payload.board < 0 || payload.board >= state.boards.length)\n return;\n\n const board = state.boards[payload.board];\n const oldLength = board.length;\n mergeObject(payload.values, board);\n\n if (oldLength !== board.length)\n updateEndGrain(state.endGrain, state.settings, state.boards);\n },\n\n\n moveEndgrain(state, payload)\n {\n moveArrayItem(state.endGrain, payload.from, payload.to);\n },\n\n\n // TODO some updates, like Wood properties and Layer width, don't go through the store yet. this works,\n // but is kinda defeating the rules of Vuex.\n\n\n load(state, payload)\n {\n const parsedPayload = JSON.parse(payload);\n loadObject(state, parsedPayload);\n },\n\n loadMsgPack(state, payload)\n {\n try\n {\n const parsedPayload = deserialize(payload);\n if (parsedPayload)\n loadObject(state, parsedPayload);\n }\n catch(e)\n {\n console.error(e);\n }\n }\n },\n\n getters: {\n save(state)\n {\n const serialized = serializeState(state, false);\n return JSON.stringify(serialized);\n },\n\n saveMsgPack(state)\n {\n const serialized = serializeState(state, true);\n return serialize(serialized);\n }\n }\n});\n\n\n\n\nfunction moveArrayItem(array, from, to)\n{\n if (from < 0 || from >= array.length)\n return;\n\n if (to < 0 || to > array.length)\n return;\n\n if (to == array.length)\n {\n // Move to end\n array.push(array[from]);\n array.splice(from, 1);\n }\n else\n {\n const item = array[from];\n array.splice(from, 1);\n\n if (to > from)\n to--;\n\n array.splice(to, 0, item);\n }\n}\n\n\nfunction stripsPerBoard(settings, board)\n{\n const stripAndKerf = settings.crosscutWidth + settings.bladeKerf;\n if (stripAndKerf === 0)\n return 0;\n\n let stripsPerBoard = (board.length + settings.bladeKerf) / stripAndKerf;\n\n // Try to account for rounding errors\n stripsPerBoard = units.limitDecimals(stripsPerBoard, 3);\n\n return Math.floor(stripsPerBoard);\n}\n\n\nfunction updateEndGrain(result, settings, boards)\n{\n const boardTally = [];\n for (let i = 0; i < boards.length; i++)\n boardTally[i] = boards[i].length + settings.bladeKerf;\n\n const cutWidth = settings.crosscutWidth + settings.bladeKerf;\n const remove = [];\n\n // Check the current configuration and see if we still have enough\n result.forEach((layer, index) =>\n {\n let boardAvailable = false;\n\n if (layer.board >= 0 && layer.board < boards.length)\n {\n boardAvailable = boardTally[layer.board] >= cutWidth;\n if (boardAvailable)\n boardTally[layer.board] -= cutWidth;\n }\n\n if (!boardAvailable)\n remove.push(index);\n });\n\n for (let i = remove.length - 1; i >= 0; i--)\n result.splice(remove[i], 1);\n\n // If we have sufficient board length left, add the layers for it\n boardTally.forEach((remaining, index) =>\n {\n while (remaining >= cutWidth)\n {\n result.push({ board: index, reversed: false });\n remaining -= cutWidth;\n\n // Try to account for rounding errors\n remaining = units.limitDecimals(remaining, 3);\n }\n });\n}\n\n\n\nfunction mergeObject(source, target)\n{\n for (const property in source)\n {\n if (!source.hasOwnProperty(property) || !target.hasOwnProperty(property))\n continue;\n\n target[property] = source[property];\n }\n}\n\n\nfunction parseFloatDef(value)\n{\n const parsedValue = parseFloat(value);\n return isNaN(parsedValue) ? 0 : parsedValue;\n}\n\n\nfunction parseIntDef(value)\n{\n const parsedValue = parseInt(value);\n return isNaN(parsedValue) ? 0 : parsedValue;\n}\n\n\nfunction loadObject(state, parsedPayload)\n{\n const deserialized = deserializeState(parsedPayload);\n\n mergeObject(deserialized.settings, state.settings);\n state.wood = deserialized.wood;\n state.boards = deserialized.boards;\n state.endGrain = deserialized.endGrain;\n\n updateEndGrain(state.endGrain, state.settings, state.boards);\n}\n\n\n// For the MessagePack version that is used in the URL, we minimize the\n// property names as well to significantly reduce the size. Do not do\n// this for the downloaded versions to make them more readable.\n// Note that this map is also used to convert older MsgPack encoded payloads,\n// as they used the same layout as the JSON data.\nconst SettingsNameMapJSON = {\n settings: {\n self: 'settings',\n units: 'units',\n borders: 'borders',\n bladeKerf: 'bladeKerf',\n crosscutWidth: 'crosscutWidth',\n direction: 'direction'\n },\n\n wood: {\n self: 'wood',\n name: 'name',\n color: 'color'\n },\n\n boards: {\n self: 'boards',\n thickness: 'thickness',\n length: 'length',\n layers: {\n self: 'layers',\n wood: 'wood',\n width: 'width'\n }\n },\n\n endGrain: {\n self: 'endGrain',\n board: 'board',\n reversed: 'reversed'\n }\n};\n\n\nconst SettingsNameMapMsgPack = {\n settings: {\n self: 's',\n units: 'u',\n borders: 'b',\n bladeKerf: 'k',\n crosscutWidth: 'c',\n direction: 'd'\n },\n\n wood: {\n self: 'w',\n name: 'n',\n color: 'c'\n },\n\n boards: {\n self: 'b',\n thickness: 't',\n length: 'x',\n layers: {\n self: 'l',\n wood: 'w',\n width: 'x'\n }\n },\n\n endGrain: {\n self: 'e',\n board: 'b',\n reversed: 'r'\n }\n};\n\n\n\n// All external input and output is done through these functions to provide backwards\n// compatibility and perform sanity checking. This means the rest of the application\n// trust that the contents of the store is as expected.\nfunction serializeState(state, messagePack)\n{\n const map = messagePack ? SettingsNameMapMsgPack : SettingsNameMapJSON;\n const result = {};\n\n result[map.settings.self] = serializeSettings(state.settings, map);\n result[map.wood.self] = serializeWood(state.wood, map);\n result[map.boards.self] = serializeBoards(state.boards, map);\n result[map.endGrain.self] = serializeEndgrain(state.endGrain, map);\n\n return result;\n}\n\n\nfunction serializeSettings(settings, map)\n{\n const result = {};\n\n result[map.settings.units] = settings.units;\n result[map.settings.borders] = settings.borders;\n result[map.settings.bladeKerf] = settings.bladeKerf;\n result[map.settings.crosscutWidth] = settings.crosscutWidth;\n result[map.settings.direction] = settings.direction;\n\n return result;\n}\n\n\nfunction serializeWood(wood, map)\n{\n if (wood.length === 0)\n return [];\n\n return wood.map(item =>\n {\n const result = {};\n\n result[map.wood.name] = item.name;\n result[map.wood.color] = item.color;\n\n return result;\n });\n}\n\n\nfunction serializeBoards(boards, map)\n{\n return boards.map(board =>\n {\n const boardResult = {};\n\n boardResult[map.boards.length] = board.length;\n boardResult[map.boards.thickness] = board.thickness;\n\n boardResult[map.boards.layers.self] = board.layers.map(layer =>\n {\n const layerResult = {};\n\n layerResult[map.boards.layers.wood] = layer.wood;\n layerResult[map.boards.layers.width] = layer.width;\n\n return layerResult;\n });\n\n return boardResult;\n });\n}\n\n\nfunction serializeEndgrain(endGrain, map)\n{\n return endGrain.map(layer =>\n {\n const layerResult = {};\n\n layerResult[map.endGrain.board] = layer.board;\n layerResult[map.endGrain.reversed] = layer.reversed;\n\n return layerResult;\n });\n}\n\n\n\nfunction deserializeState(parsedPayload)\n{\n const map = parsedPayload.hasOwnProperty(SettingsNameMapMsgPack.settings.self) ? SettingsNameMapMsgPack : SettingsNameMapJSON;\n\n const result = {\n settings: deserializeSettings(parsedPayload, map),\n wood: deserializeWood(parsedPayload, map),\n boards: deserializeBoards(parsedPayload, map),\n endGrain: deserializeEndgrain(parsedPayload, map)\n };\n\n\n // Backwards compatibility\n if (parsedPayload.hasOwnProperty('settings'))\n {\n if (parsedPayload.settings.hasOwnProperty('alternateDirection'))\n result.settings.direction = parsedPayload.settings.alternateDirection ? DirectionEnum.alternate : DirectionEnum.uniform;\n\n if (parsedPayload.settings.hasOwnProperty('boardLength'))\n result.boards[0].length = parseFloatDef(parsedPayload.settings.boardLength);\n\n if (parsedPayload.settings.hasOwnProperty('boardThickness'))\n result.boards[0].thickness = parseFloatDef(parsedPayload.settings.boardThickness);\n }\n\n if (result.endGrain.length === 0)\n updateEndGrain(result.endGrain, result.settings, result.boards);\n\n return result;\n}\n\n\nfunction deserializeSettings(parsedPayload, map)\n{\n if (!parsedPayload.hasOwnProperty(map.settings.self))\n return DefaultSettings();\n\n const settings = parsedPayload[map.settings.self];\n\n return {\n units: UnitsEnum.isValid(settings[map.settings.units]) ? settings[map.settings.units] : UnitsEnum.cm,\n borders: settings[map.settings.borders] === true,\n bladeKerf: parseFloatDef(settings[map.settings.bladeKerf]),\n crosscutWidth: parseFloatDef(settings[map.settings.crosscutWidth]),\n direction: DirectionEnum.isValid(settings[map.settings.direction]) ? settings[map.settings.direction] : DirectionEnum.uniform,\n };\n}\n\n\nfunction deserializeWood(parsedPayload, map)\n{\n if (!parsedPayload.hasOwnProperty(map.wood.self) || !Array.isArray(parsedPayload[map.wood.self]))\n return [];\n\n return parsedPayload[map.wood.self].map(item =>\n {\n return {\n name: item[map.wood.name],\n color: /^#[0-9A-F]{6}$/i.test(item[map.wood.color] || '') ? item[map.wood.color] : '#000000'\n };\n });\n}\n\n\nfunction deserializeBoards(parsedPayload, map)\n{\n if (!parsedPayload.hasOwnProperty(map.boards.self) || !Array.isArray(parsedPayload[map.boards.self]))\n return [];\n\n const result = parsedPayload[map.boards.self].map(board =>\n {\n const boardResult = {\n thickness: parseFloatDef(board[map.boards.thickness]),\n length: parseFloatDef(board[map.boards.length]),\n layers: []\n };\n\n if (board.hasOwnProperty(map.boards.layers.self) && Array.isArray(board[map.boards.layers.self]))\n {\n boardResult.layers = board[map.boards.layers.self].map(layer =>\n {\n return {\n wood: parseIntDef(layer[map.boards.layers.wood]),\n width: parseFloatDef(layer[map.boards.layers.width])\n }\n });\n }\n\n return boardResult;\n });\n\n return result.length > 0\n ? result\n : { length: 0, thickness: 0, layers: [] };\n}\n\n\nfunction deserializeEndgrain(parsedPayload, map)\n{\n if (!parsedPayload.hasOwnProperty(map.endGrain.self) || !Array.isArray(parsedPayload[map.endGrain.self]))\n return [];\n\n return parsedPayload[map.endGrain.self].map(layer =>\n {\n return {\n board: parseIntDef(layer[map.endGrain.board]),\n reversed: layer[map.endGrain.reversed] === true\n };\n });\n}","import { createApp } from 'vue';\nimport App from './App.vue';\nimport store from './store';\n\nimport { library } from '@fortawesome/fontawesome-svg-core';\nimport { faSlidersH, faLayerGroup, faSave, faPrint, faInfoCircle, faTree } from '@fortawesome/free-solid-svg-icons';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\n\nlibrary.add(faSlidersH, faLayerGroup, faSave, faPrint, faInfoCircle, faTree);\n\ncreateApp(App)\n .use(store)\n .component('font-awesome-icon', FontAwesomeIcon)\n .mount('#app');\n","export * from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../node_modules/vue-loader-v16/dist/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./App.vue?vue&type=style&index=0&id=5bc914fd&lang=scss\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./EdgeGrainPreview.vue?vue&type=style&index=0&id=a5fd011a&lang=scss&scoped=true\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./Wood.vue?vue&type=style&index=0&id=15338ab0&lang=scss&scoped=true\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./EndGrainPreview.vue?vue&type=style&index=0&id=61e0967d&lang=scss&scoped=true\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./CuttingList.vue?vue&type=style&index=0&id=30665a8d&lang=scss&scoped=true\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./Layers.vue?vue&type=style&index=0&id=01187e40&lang=scss&scoped=true\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./Settings.vue?vue&type=style&index=0&id=7067c7c7&lang=scss&scoped=true\""],"sourceRoot":""}