{"roots":["0:3"],"nodeById":{"32:813":{"type":"COMPONENT_SET","id":"32:813","name":"슬라이더 1","absoluteBoundingBox":{"x":-6273.0,"y":-1923.0,"width":778.0,"height":2372.0},"isolatedAbsoluteRenderBounds":{"x":-6273.0,"y":-1923.0,"width":778.0,"height":2372.0},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,3024.0]],"size":{"x":778.0,"y":2372.0},"fills":[],"strokeAlign":"INSIDE","strokeDashes":[10.0,5.0],"strokes":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.592156887054443,"g":0.278431385755539,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"children":["32:808","32:809","32:810","32:811"],"componentPropertyDefinitions":{"Property 1":{"type":"VARIANT","defaultValue":"Carousel slide 1","variantOptions":["Carousel slide 1","Carousel slide 2","Carousel slide 3","Carousel slide 4"]}}},"32:811":{"type":"COMPONENT","id":"32:811","name":"Property 1=Carousel slide 4","absoluteBoundingBox":{"x":-6253.0,"y":-16.0,"width":738.0,"height":445.0},"isolatedAbsoluteRenderBounds":{"x":-6253.0,"y":-16.0,"width":738.0,"height":445.0},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,1907.0]],"size":{"x":738.0,"y":445.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.966601550579071,"g":0.966601550579071,"b":0.966601550579071,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","maxWidth":738.0,"minHeight":445.0,"strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":30.0,"paddingRight":50.0,"paddingBottom":30.0,"paddingLeft":50.0,"layoutMode":"VERTICAL","itemSpacing":80.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","children":["32:799","64:720"],"componentSetId":"32:813"},"4:908":{"type":"FRAME","id":"4:908","name":"Header section","absoluteBoundingBox":{"x":-2954.0,"y":-479.0,"width":800.0,"height":729.0},"isolatedAbsoluteRenderBounds":{"x":-2958.0,"y":-479.0,"width":1701.0,"height":737.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":800.0,"y":729.0},"fills":[{"opacity":0.5,"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true},{"opacity":0.600000023841858,"blendMode":"NORMAL","type":"VIDEO","scaleMode":"FILL","imageRef":"933cf4df3736a6926c3a3bafb0e3bb5fefa6361f","originalImageWidth":1920,"originalImageHeight":1080,"videoRef":"c52b1e752c910ebdb03f10fcd0aaf34af1c288bc","visible":true,"autoplay":true,"mediaLoop":true,"muted":true,"showControls":true},{"opacity":0.300000011920929,"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"effects":[{"type":"DROP_SHADOW","visible":true,"color":{"r":0.0,"g":0.0,"b":0.0,"a":0.25},"blendMode":"NORMAL","offset":{"x":0.0,"y":4.0},"radius":4.0,"showShadowBehindNode":false,"spread":0.0}],"accessibleHTMLTag":"VIDEO","isDecorativeImage":false,"accessibleLabel":"ablstract visual art video","ariaAttributes":{},"interactions":[],"paddingTop":25.0,"paddingRight":50.0,"paddingBottom":70.0,"paddingLeft":50.0,"layoutMode":"VERTICAL","itemSpacing":86.0,"primaryAxisAlignItems":"MAX","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2702:545"]},"95:265":{"type":"SVG","id":"95:265","name":"Right arrow","absoluteBoundingBox":{"x":-5828.5556640625,"y":331.5,"width":24.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":-5828.5556640625,"y":331.5,"width":24.0,"height":24.0},"relativeTransform":[[1.0,0.0,374.444427490234],[0.0,1.0,0.0]],"size":{"x":24.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Arrow icons that navigate through customer testimonial quotes.","ariaAttributes":{},"interactions":[{"id":{"sessionID":162,"localID":194},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":32,"localID":808},"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","stateGroupContext":"32:813"}],"isDeleted":false,"stateManagementVersion":1}],"hash":"7e6ea15829e431bdb0452867680cb725205eb5d7"},"6:1356":{"key":"bcc262e16c06dc528ec5203195d6322cbd051b62","name":"Paragraph/Paragraph 3","styleType":"TEXT","remote":false,"description":"","id":"6:1356","assetId":"StyleId:6:1356","type":"STYLE","style":{"fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":0.0,"name":"Mobile","style":{"fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontSize":14.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":107.692314147949,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"},"responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":0.0,"name":"Mobile","style":{"fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}}]},"64:724":{"type":"FRAME","id":"64:724","name":"Slideshow navigation","absoluteBoundingBox":{"x":-5919.4443359375,"y":338.388885498047,"width":70.8888854980469,"height":10.222222328186},"isolatedAbsoluteRenderBounds":{"x":-5919.4443359375,"y":338.388885498047,"width":70.8888854980469,"height":10.2222290039062},"relativeTransform":[[1.0,0.0,283.555541992188],[0.0,1.0,6.88888883590698]],"size":{"x":70.8888854980469,"y":10.222222328186},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","children":["64:725","64:726","64:727","64:728"]},"95:256":{"type":"SVG","id":"95:256","name":"Left arrow","absoluteBoundingBox":{"x":-5963.4443359375,"y":331.5,"width":24.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":-5963.4443359375,"y":331.5,"width":24.0,"height":24.0},"relativeTransform":[[1.0,0.0,239.555557250977],[0.0,1.0,0.0]],"size":{"x":24.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Arrow icons that navigate through customer testimonial quotes.","ariaAttributes":{},"interactions":[{"id":{"sessionID":162,"localID":193},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":32,"localID":810},"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","stateGroupContext":"32:813"}],"isDeleted":false,"stateManagementVersion":1}],"hash":"d51fd734751e3ca96c861815c86406c63cb6551e"},"32:799":{"type":"FRAME","id":"32:799","name":"Carousel content","absoluteBoundingBox":{"x":-6203.0,"y":57.5,"width":638.0,"height":194.0},"isolatedAbsoluteRenderBounds":{"x":-6203.0,"y":57.5,"width":638.0,"height":194.0},"relativeTransform":[[1.0,0.0,50.0],[0.0,1.0,73.5]],"size":{"x":638.0,"y":194.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":80.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["32:800"]},"32:800":{"type":"FRAME","id":"32:800","name":"Our clients quote 1","absoluteBoundingBox":{"x":-6203.0,"y":57.5,"width":638.0,"height":194.0},"isolatedAbsoluteRenderBounds":{"x":-6203.0,"y":57.5,"width":638.0,"height":194.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":638.0,"y":194.0},"fills":[],"strokeAlign":"INSIDE","layoutGrow":1.0,"strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":32.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","children":["32:801","32:802"]},"32:801":{"type":"TEXT","id":"32:801","name":"\"부주의하고 산만해서 숙제를 끝내는데 시간이 많이 걸리던 ADHD 남아 입니다. 레이저에이블 테라피 1달 이후 집중력이 좋아지면서 숙게를 끝내는  시간이 훨씬 빨라졌습니다.\"","absoluteBoundingBox":{"x":-6203.0,"y":57.5,"width":638.0,"height":128.0},"isolatedAbsoluteRenderBounds":{"x":-6187.80029296875,"y":63.5319976806641,"width":602.78662109375,"height":117.984008789062},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":638.0,"y":128.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"characterStyleOverrides":[],"characters":"\"부주의하고 산만해서 숙제를 끝내는데 시간이 많이 걸리던 ADHD 남아 입니다.\n레이저에이블 테라피 1달 이후 집중력이 좋아지면서 숙게를 \n끝내는  시간이 훨씬 빨라졌습니다.\"","lineIndentations":[0,0,0],"lineTypes":["NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","textAlignHorizontal":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":24.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":0.96,"letterSpacingValue":4.0,"letterSpacingUnit":"PERCENT","lineHeightPx":32.4000015258789,"lineHeightPercent":112.499992370605,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2109:1176":{"type":"RECTANGLE","id":"2109:1176","name":"brainable_logo_ver.001-03 1","absoluteBoundingBox":{"x":-2763.0,"y":318.0,"width":280.0,"height":116.0},"targetAspectRatio":{"x":726.0,"y":301.0},"isolatedAbsoluteRenderBounds":{"x":-2763.0,"y":318.0,"width":280.0,"height":116.0},"relativeTransform":[[1.0,0.0,163.0],[0.0,1.0,0.0]],"size":{"x":280.0,"y":116.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"64270238d3de4edd07597c9179b36856b5a53af3","originalImageWidth":1400,"originalImageHeight":1167,"visible":true,"opacity":1.0,"rotation":0.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[]},"32:810":{"type":"COMPONENT","id":"32:810","name":"Property 1=Carousel slide 3","absoluteBoundingBox":{"x":-6253.0,"y":-789.0,"width":738.0,"height":661.0},"isolatedAbsoluteRenderBounds":{"x":-6253.0,"y":-789.0,"width":738.0,"height":661.0},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,1134.0]],"size":{"x":738.0,"y":661.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.966601550579071,"g":0.966601550579071,"b":0.966601550579071,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","maxWidth":738.0,"minHeight":445.0,"strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":30.0,"paddingRight":50.0,"paddingBottom":30.0,"paddingLeft":50.0,"layoutMode":"VERTICAL","itemSpacing":80.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","children":["32:786","64:707"],"componentSetId":"32:813"},"2702:495":{"type":"FRAME","id":"2702:495","name":"Frame 2","absoluteBoundingBox":{"x":-4293.0,"y":-479.0,"width":365.0,"height":430.0},"isolatedAbsoluteRenderBounds":{"x":-4293.0,"y":-479.0,"width":365.0,"height":430.0},"relativeTransform":[[1.0,0.0,5.0],[0.0,1.0,0.0]],"size":{"x":365.0,"y":430.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"visible":false,"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","counterAxisAlignItems":"CENTER","children":["2702:496","2702:504"]},"64:707":{"type":"FRAME","id":"64:707","name":"Slideshow nav bar","absoluteBoundingBox":{"x":-5963.4443359375,"y":-182.0,"width":158.888885498047,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":-5963.4443359375,"y":-182.0,"width":158.888885498047,"height":24.0},"relativeTransform":[[1.0,0.0,289.555541992188],[0.0,1.0,607.0]],"size":{"x":158.888885498047,"y":24.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":20.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","children":["95:253","64:711","95:262"]},"10:4382":{"type":"FRAME","id":"10:4382","name":"Offering section","absoluteBoundingBox":{"x":-4298.0,"y":2490.0,"width":1280.0,"height":1869.0},"isolatedAbsoluteRenderBounds":{"x":-4298.0,"y":2490.0,"width":1280.0,"height":1869.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,1834.0]],"size":{"x":1280.0,"y":1869.0},"fills":[{"blendMode":"NORMAL","type":"VIDEO","scaleMode":"FILL","imageRef":"75a85c77b4c731c7f19114f560b575519434a452","originalImageWidth":3840,"originalImageHeight":2160,"videoRef":"c93e4a77270d048f96f370a261142fd8506d83b3","visible":true,"opacity":1.0,"autoplay":true,"mediaLoop":true,"muted":true,"showControls":false}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["10:4383","10:4387"]},"64:714":{"type":"SVG","id":"64:714","name":"Ellipse 182","absoluteBoundingBox":{"x":-5879.0,"y":-175.111114501953,"width":10.222222328186,"height":10.222222328186},"targetAspectRatio":{"x":11.0,"y":11.0},"isolatedAbsoluteRenderBounds":{"x":-5879.0,"y":-175.111114501953,"width":10.22216796875,"height":10.2222290039062},"relativeTransform":[[1.0,0.0,40.4444427490234],[0.0,1.0,0.0]],"size":{"x":10.222222328186,"y":10.222222328186},"fills":[{"opacity":0.800000011920929,"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Currently selected quote - 3 of 4","ariaAttributes":{},"interactions":[],"hash":"2edf0a2574fd046031ec27a85cb2479acbee6258"},"2695:695":{"type":"TEXT","id":"2695:695","name":"회사소개","absoluteBoundingBox":{"x":-3414.0,"y":-418.5,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-3413.8173828125,"y":-414.81201171875,"width":58.63623046875,"height":16.5120239257812},"relativeTransform":[[1.0,0.0,80.0],[0.0,1.0,0.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"회사소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"hyperlink":{"type":"NODE","nodeID":"/about_us"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"1:2":{"type":"FRAME","id":"1:2","name":"Mobile","absoluteBoundingBox":{"x":-2954.0,"y":-479.0,"width":375.0,"height":5078.0},"isolatedAbsoluteRenderBounds":{"x":-2954.0,"y":-479.0,"width":375.0,"height":5078.0},"relativeTransform":[[1.0,0.0,1408.0],[0.0,1.0,100.0]],"size":{"x":375.0,"y":5078.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"clipsContent":true,"overflowDirection":"VERTICAL_SCROLLING","layoutMode":"VERTICAL","itemSpacing":47.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","isBreakpointFrame":true,"children":["2695:738","2695:754","4:914","161:102","5:1322"]},"5:1332":{"type":"FRAME","id":"5:1332","name":"Contact column 1","absoluteBoundingBox":{"x":-2922.0,"y":4003.0,"width":148.0,"height":46.0},"isolatedAbsoluteRenderBounds":{"x":-2922.0,"y":4003.0,"width":148.0,"height":46.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":148.0,"y":46.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":2.0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["5:1333","5:1334"]},"64:713":{"type":"SVG","id":"64:713","name":"Ellipse 181","absoluteBoundingBox":{"x":-5899.22216796875,"y":-175.111114501953,"width":10.222222328186,"height":10.222222328186},"targetAspectRatio":{"x":11.0,"y":11.0},"isolatedAbsoluteRenderBounds":{"x":-5899.22216796875,"y":-175.111114501953,"width":10.22216796875,"height":10.2222290039062},"relativeTransform":[[1.0,0.0,20.2222213745117],[0.0,1.0,0.0]],"size":{"x":10.222222328186,"y":10.222222328186},"fills":[{"opacity":0.25,"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Customer quote 2 of 4","ariaAttributes":{},"interactions":[{"id":{"sessionID":162,"localID":190},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":32,"localID":809},"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","stateGroupContext":"32:813"}],"isDeleted":false,"stateManagementVersion":1}],"hash":"35991871b7ca3007bc0612f8601be0ce1363dd1b"},"95:253":{"type":"SVG","id":"95:253","name":"Left arrow","absoluteBoundingBox":{"x":-5963.4443359375,"y":-182.0,"width":24.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":-5963.4443359375,"y":-182.0,"width":24.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":24.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Arrow icons that navigate through customer testimonial quotes.","ariaAttributes":{},"interactions":[{"id":{"sessionID":162,"localID":188},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":32,"localID":809},"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","stateGroupContext":"32:813"}],"isDeleted":false,"stateManagementVersion":1}],"hash":"a8068c16c07e08787ae188a3a56e1f330444bb95"},"32:786":{"type":"FRAME","id":"32:786","name":"Carousel content","absoluteBoundingBox":{"x":-6203.0,"y":-759.0,"width":638.0,"height":497.0},"isolatedAbsoluteRenderBounds":{"x":-6203.0,"y":-759.0,"width":638.0,"height":497.0},"relativeTransform":[[1.0,0.0,50.0],[0.0,1.0,30.0]],"size":{"x":638.0,"y":497.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":80.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["32:787"]},"32:789":{"type":"TEXT","id":"32:789","name":"— 30대 후반 놀이치료사 여성","absoluteBoundingBox":{"x":-6203.0,"y":-279.0,"width":638.0,"height":17.0},"isolatedAbsoluteRenderBounds":{"x":-5986.75732421875,"y":-277.359985351562,"width":204.4599609375,"height":14.7039794921875},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,480.0]],"size":{"x":638.0,"y":17.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"characterStyleOverrides":[],"characters":"— 30대 후반 놀이치료사 여성","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","textAlignHorizontal":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":0.8,"letterSpacingValue":5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":17.4400005340576,"lineHeightPercent":90.8333282470703,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"32:809":{"type":"COMPONENT","id":"32:809","name":"Property 1=Carousel slide 2","absoluteBoundingBox":{"x":-6253.0,"y":-1346.0,"width":738.0,"height":445.0},"isolatedAbsoluteRenderBounds":{"x":-6253.0,"y":-1346.0,"width":738.0,"height":445.0},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,577.0]],"size":{"x":738.0,"y":445.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.966601550579071,"g":0.966601550579071,"b":0.966601550579071,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","maxWidth":738.0,"minHeight":445.0,"strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":30.0,"paddingRight":50.0,"paddingBottom":30.0,"paddingLeft":50.0,"layoutMode":"VERTICAL","itemSpacing":80.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","children":["32:776","64:694"],"componentSetId":"32:813"},"64:694":{"type":"FRAME","id":"64:694","name":"Slideshow nav bar","absoluteBoundingBox":{"x":-6203.0,"y":-966.5,"width":638.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":-6203.0,"y":-966.5,"width":638.0,"height":24.0},"relativeTransform":[[1.0,0.0,50.0],[0.0,1.0,379.5]],"size":{"x":638.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":20.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["95:250","64:698","95:259"]},"64:701":{"type":"SVG","id":"64:701","name":"Ellipse 182","absoluteBoundingBox":{"x":-5879.0,"y":-959.611083984375,"width":10.222222328186,"height":10.222222328186},"targetAspectRatio":{"x":11.0,"y":11.0},"isolatedAbsoluteRenderBounds":{"x":-5879.0,"y":-959.611083984375,"width":10.22216796875,"height":10.2222290039062},"relativeTransform":[[1.0,0.0,40.4444427490234],[0.0,1.0,0.0]],"size":{"x":10.222222328186,"y":10.222222328186},"fills":[{"opacity":0.25,"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Customer quote 3 of 4","ariaAttributes":{},"interactions":[{"id":{"sessionID":162,"localID":185},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":32,"localID":810},"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","stateGroupContext":"32:813"}],"isDeleted":false,"stateManagementVersion":1}],"hash":"4cb2d839ddaa8ed7ade717b8698b33f4489b6d5d"},"64:699":{"type":"SVG","id":"64:699","name":"Ellipse 180","absoluteBoundingBox":{"x":-5919.4443359375,"y":-959.611083984375,"width":10.222222328186,"height":10.222222328186},"targetAspectRatio":{"x":11.0,"y":11.0},"isolatedAbsoluteRenderBounds":{"x":-5919.4443359375,"y":-959.611083984375,"width":10.22216796875,"height":10.2222290039062},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":10.222222328186,"y":10.222222328186},"fills":[{"opacity":0.25,"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Customer quote 1 of 4","ariaAttributes":{},"interactions":[{"id":{"sessionID":32,"localID":919},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":32,"localID":808},"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","transitionResetScrollPosition":false,"transitionResetInteractiveComponents":true,"stateGroupContext":"32:813"}],"isDeleted":false,"stateManagementVersion":1}],"hash":"336ac530876eaa2b1db913b1b0df0a39feacfdd3"},"95:250":{"type":"SVG","id":"95:250","name":"Left arrow","absoluteBoundingBox":{"x":-5963.4443359375,"y":-966.5,"width":24.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":-5963.4443359375,"y":-966.5,"width":24.0,"height":24.0},"relativeTransform":[[1.0,0.0,239.555557250977],[0.0,1.0,0.0]],"size":{"x":24.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Arrow icons that navigate through customer testimonial quotes.","ariaAttributes":{},"interactions":[{"id":{"sessionID":162,"localID":183},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":32,"localID":808},"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","stateGroupContext":"32:813"}],"isDeleted":false,"stateManagementVersion":1}],"hash":"810fe0ab1fe2f2d55db0e815c5d94bc78555faf4"},"32:779":{"type":"TEXT","id":"32:779","name":"— 12세 자폐 여아, 브레인에이블 서울권 센터","absoluteBoundingBox":{"x":-6203.0,"y":-1080.5,"width":638.0,"height":34.0},"isolatedAbsoluteRenderBounds":{"x":-5972.61083984375,"y":-1078.81201171875,"width":176.119140625,"height":31.656005859375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,224.0]],"size":{"x":638.0,"y":34.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"characterStyleOverrides":[],"characters":"— 12세 자폐 여아, \n브레인에이블 서울권 센터","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","textAlignHorizontal":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":0.8,"letterSpacingValue":5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":17.4400005340576,"lineHeightPercent":90.8333282470703,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2695:698":{"type":"TEXT","id":"2695:698","name":"센터소개","absoluteBoundingBox":{"x":-3141.0,"y":-418.5,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-3140.8173828125,"y":-414.81201171875,"width":58.63623046875,"height":16.5120239257812},"relativeTransform":[[1.0,0.0,353.0],[0.0,1.0,0.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"센터소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"hyperlink":{"type":"NODE","nodeID":"/센터소개"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2695:743":{"type":"TEXT","id":"2695:743","name":"제품소개","absoluteBoundingBox":{"x":-2508.0,"y":-429.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-2507.8173828125,"y":-425.31201171875,"width":58.63623046875,"height":16.5120239257812},"relativeTransform":[[1.0,0.0,171.0],[0.0,1.0,0.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"제품소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"hyperlink":{"type":"NODE","nodeID":"/laserable"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"64:175":{"type":"FRAME","id":"64:175","name":"Slideshow nav bar","absoluteBoundingBox":{"x":-5963.4443359375,"y":-1555.5,"width":158.888885498047,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":-5963.4443359375,"y":-1555.5,"width":158.888885498047,"height":24.0},"relativeTransform":[[1.0,0.0,289.555541992188],[0.0,1.0,347.5]],"size":{"x":158.888885498047,"y":24.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":20.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","children":["64:480","32:757","64:99"]},"2608:2836":{"type":"TEXT","id":"2608:2836","name":"Text","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":12.0,"height":12.0},"isolatedAbsoluteRenderBounds":{"x":0.0400000028312206,"y":2.66999959945679,"width":11.543984413147,"height":9.82999992370605},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":12.0,"y":12.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":10.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":12.0,"lineHeightPercent":100.0,"lineHeightUnit":"INTRINSIC_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED","lineHeightPercentFontSize":100},"styleOverrideTable":{}},"32:760":{"type":"SVG","id":"32:760","name":"Ellipse 182","absoluteBoundingBox":{"x":-5879.0,"y":-1548.61108398438,"width":10.222222328186,"height":10.222222328186},"targetAspectRatio":{"x":11.0,"y":11.0},"isolatedAbsoluteRenderBounds":{"x":-5879.0,"y":-1548.61108398438,"width":10.22216796875,"height":10.22216796875},"relativeTransform":[[1.0,0.0,40.4444427490234],[0.0,1.0,0.0]],"size":{"x":10.222222328186,"y":10.222222328186},"fills":[{"opacity":0.25,"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Customer quote 3 of 4","ariaAttributes":{},"interactions":[{"id":{"sessionID":162,"localID":180},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":32,"localID":810},"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","stateGroupContext":"32:813"}],"isDeleted":false,"stateManagementVersion":1}],"hash":"4cb2d839ddaa8ed7ade717b8698b33f4489b6d5d"},"32:759":{"type":"SVG","id":"32:759","name":"Ellipse 181","absoluteBoundingBox":{"x":-5899.22216796875,"y":-1548.61108398438,"width":10.222222328186,"height":10.222222328186},"targetAspectRatio":{"x":11.0,"y":11.0},"isolatedAbsoluteRenderBounds":{"x":-5899.22216796875,"y":-1548.61108398438,"width":10.22216796875,"height":10.22216796875},"relativeTransform":[[1.0,0.0,20.2222213745117],[0.0,1.0,0.0]],"size":{"x":10.222222328186,"y":10.222222328186},"fills":[{"opacity":0.25,"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Customer quote 2 of 4","ariaAttributes":{},"interactions":[{"id":{"sessionID":162,"localID":179},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":32,"localID":809},"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","stateGroupContext":"32:813"}],"isDeleted":false,"stateManagementVersion":1}],"hash":"35991871b7ca3007bc0612f8601be0ce1363dd1b"},"2695:758":{"type":"TEXT","id":"2695:758","name":"HOME","absoluteBoundingBox":{"x":-2679.0,"y":-429.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-2678.65844726562,"y":-423.0,"width":58.3232421875,"height":15.2000122070312},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"HOME","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"style":{"styleIdForText":"StyleId:2608:2916","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":3.84,"letterSpacingValue":24.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":120.83332824707,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"32:675":{"type":"FRAME","id":"32:675","name":"Carousel content","absoluteBoundingBox":{"x":-6203.0,"y":-1829.5,"width":638.0,"height":194.0},"isolatedAbsoluteRenderBounds":{"x":-6203.0,"y":-1829.5,"width":638.0,"height":194.0},"relativeTransform":[[1.0,0.0,50.0],[0.0,1.0,73.5]],"size":{"x":638.0,"y":194.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":80.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["32:676"]},"32:676":{"type":"FRAME","id":"32:676","name":"Our clients quote 1","absoluteBoundingBox":{"x":-6203.0,"y":-1829.5,"width":638.0,"height":194.0},"isolatedAbsoluteRenderBounds":{"x":-6203.0,"y":-1829.5,"width":638.0,"height":194.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":638.0,"y":194.0},"fills":[],"strokeAlign":"INSIDE","layoutGrow":1.0,"strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":32.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","children":["32:677","32:678"]},"32:678":{"type":"TEXT","id":"32:678","name":"— 60대 초반 여성, 브레인에이블 서울권 센터","absoluteBoundingBox":{"x":-6203.0,"y":-1669.5,"width":638.0,"height":34.0},"isolatedAbsoluteRenderBounds":{"x":-5972.61083984375,"y":-1667.81201171875,"width":176.119140625,"height":31.656005859375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,160.0]],"size":{"x":638.0,"y":34.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"characterStyleOverrides":[],"characters":"— 60대 초반  여성, \n브레인에이블 서울권 센터","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","textAlignHorizontal":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":0.8,"letterSpacingValue":5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":17.4400005340576,"lineHeightPercent":90.8333282470703,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"6:1477":{"type":"COMPONENT","id":"6:1477","name":"Property 1=Hover","absoluteBoundingBox":{"x":-6253.0,"y":-2214.0,"width":114.0,"height":58.0},"isolatedAbsoluteRenderBounds":{"x":-6253.0,"y":-2214.0,"width":114.0,"height":58.0},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,121.0]],"size":{"x":114.0,"y":58.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.121568627655506,"g":0.0313725508749485,"b":0.0313725508749485,"a":1.0},"visible":true,"opacity":1.0}],"constraintValues":{"left":{"pixelOffset":20.0,"sizeFraction":0.0},"top":{"pixelOffset":121.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":193,"localID":83},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":9,"localID":2725},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/laserable"}],"isDeleted":false,"stateManagementVersion":1}],"rectangleCornerRadii":[500.0,500.0,500.0,500.0],"cornerRadius":500.0,"paddingTop":18.0,"paddingRight":24.0,"paddingBottom":18.0,"paddingLeft":24.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","children":["6:1476"],"componentSetId":"6:1478"},"6:1476":{"type":"TEXT","id":"6:1476","name":"제품소개","absoluteBoundingBox":{"x":-6229.0,"y":-2196.0,"width":66.0,"height":22.0},"isolatedAbsoluteRenderBounds":{"x":-6227.875,"y":-2193.88598632812,"width":62.58154296875,"height":16.2900390625},"relativeTransform":[[1.0,0.0,24.0],[0.0,1.0,18.0]],"size":{"x":66.0,"y":22.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.45461630821228,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"제품소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","style":{"styleIdForText":"StyleId:4:982","fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"styleIdForText":"StyleId:4:982","fontSize":18.0,"letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":21.6000003814697,"lineHeightPercent":102.400009155273,"lineHeightPercentFontSize":120.000007629395,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"styleIdForText":"StyleId:4:982","fontSize":18.0,"letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":21.6000003814697,"lineHeightPercent":102.400009155273,"lineHeightPercentFontSize":120.000007629395,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":0.0,"name":"Mobile","style":{"styleIdForText":"StyleId:4:982","fontSize":18.0,"letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":21.6000003814697,"lineHeightPercent":102.400009155273,"lineHeightPercentFontSize":120.000007629395,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":21.6000003814697,"lineHeightPercent":92.3077011108398,"lineHeightPercentFontSize":120.000007629395,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"0:3":{"type":"WEBPAGE","id":"0:3","name":"/","absoluteBoundingBox":{"x":-4362.0,"y":-579.0,"width":1847.0,"height":8427.0},"isolatedAbsoluteRenderBounds":{"x":-4362.0,"y":-579.0,"width":1847.0,"height":8427.0},"relativeTransform":[[1.0,0.0,-4362.0],[0.0,1.0,-579.0]],"size":{"x":1847.0,"y":8427.0},"fills":[{"opacity":0.0470588244497776,"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"children":["0:4","1:3","1:2"]},"2149:4149":{"type":"GROUP","id":"2149:4149","name":"READINGABLE","absoluteBoundingBox":{"x":-2904.5,"y":1922.0,"width":273.0,"height":280.953979492188},"isolatedAbsoluteRenderBounds":{"x":-2907.56396484375,"y":1922.0,"width":276.06396484375,"height":280.953979492188},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,286.0]],"size":{"x":273.0,"y":280.953979492188},"fills":[],"constraints":{"vertical":"TOP","horizontal":"SCALE"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"right":{"pixelOffset":0.0,"sizeFraction":0.992727272727273},"top":{"pixelOffset":286.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"children":["2149:4150","2149:4151","2149:4152","2149:4153"]},"5:1343":{"type":"TEXT","id":"5:1343","name":"Brainable Co., LTD. © 2025 All Rights Reserved","absoluteBoundingBox":{"x":-2922.0,"y":4106.0,"width":197.0,"height":26.0},"isolatedAbsoluteRenderBounds":{"x":-2921.48706054688,"y":4108.85400390625,"width":125.53759765625,"height":22.458984375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":197.0,"y":26.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Brainable Co., LTD.\n© 2025 All Rights Reserved","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Thin","fontStyle":"Thin","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":9.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.9,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":12.5999994277954,"lineHeightPercent":116.666664123535,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"95:262":{"type":"SVG","id":"95:262","name":"Right arrow","absoluteBoundingBox":{"x":-5828.5556640625,"y":-182.0,"width":24.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":-5828.5556640625,"y":-182.0,"width":24.0,"height":24.0},"relativeTransform":[[1.0,0.0,134.888885498047],[0.0,1.0,0.0]],"size":{"x":24.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Arrow icons that navigate through customer testimonial quotes.","ariaAttributes":{},"interactions":[{"id":{"sessionID":162,"localID":192},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":32,"localID":811},"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","stateGroupContext":"32:813"}],"isDeleted":false,"stateManagementVersion":1}],"hash":"9b88bdc27380c69fa75742db0490e856faaff907"},"2119:1760":{"type":"FRAME","id":"2119:1760","name":"Main","absoluteBoundingBox":{"x":-2954.0,"y":321.0,"width":800.0,"height":3079.625},"isolatedAbsoluteRenderBounds":{"x":-3020.0,"y":321.0,"width":1346.0,"height":4224.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,800.0]],"size":{"x":800.0,"y":3079.625},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"eeddaeafbec3bca4e92bca33d628ea78a0653211","originalImageWidth":4096,"originalImageHeight":2731,"visible":true,"opacity":1.0,"rotation":0.0},{"opacity":0.300000011920929,"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"MAIN","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":2106,"localID":732},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":6,"localID":1529},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/about_us"}],"isDeleted":false,"stateManagementVersion":1}],"layoutMode":"VERTICAL","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","isInAnimateTree":true,"children":["2149:4110","2119:1761","2119:1768","2149:3574"]},"5:1331":{"type":"FRAME","id":"5:1331","name":"Footer contact information","absoluteBoundingBox":{"x":-2922.0,"y":4003.0,"width":122.0,"height":46.0},"isolatedAbsoluteRenderBounds":{"x":-2922.0,"y":4003.0,"width":558.0,"height":77.0},"relativeTransform":[[1.0,0.0,32.0],[0.0,1.0,271.0]],"size":{"x":122.0,"y":46.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["5:1332","5:1335","106:833"]},"2149:4124":{"type":"TEXT","id":"2149:4124","name":"가장 진보된 AI 기술과 브레인에이블이 독자적으로 개발한 시선추적 시스템을 융합한 디지털 난독증 진단 솔루션 입니다.","absoluteBoundingBox":{"x":-2844.0,"y":1104.0,"width":771.0,"height":93.0},"isolatedAbsoluteRenderBounds":{"x":-2843.10009765625,"y":1111.21997070312,"width":765.629638671875,"height":49.5400390625},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,133.0]],"size":{"x":771.0,"y":93.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"TOP","horizontal":"LEFT"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"top":{"pixelOffset":133.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"가장 진보된 AI 기술과 브레인에이블이 독자적으로 개발한 시선추적 시스템을 융합한 디지털 난독증 진단 솔루션 입니다.\n","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":20.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":31.4000015258789,"lineHeightPercent":130.83332824707,"lineHeightPercentFontSize":157.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2149:4128":{"type":"TEXT","id":"2149:4128","name":"LISTENINGABLE","absoluteBoundingBox":{"x":-2844.0,"y":1513.0,"width":596.0,"height":38.0},"isolatedAbsoluteRenderBounds":{"x":-2841.15209960938,"y":1520.19201660156,"width":409.899658203125,"height":40.4320068359375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,59.0]],"size":{"x":596.0,"y":38.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"TOP","horizontal":"LEFT"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"top":{"pixelOffset":59.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[{"opacity":0.579999983310699,"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0708940923213959,"g":0.628357946872711,"b":1.0,"a":1.0},"visible":true}],"strokeWeight":2.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"LISTENINGABLE\n","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","fontVariantPosition":"NORMAL","fontSize":48.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":4.8,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":52.3199996948242,"lineHeightPercent":90.8333282470703,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2149:4148":{"type":"TEXT","id":"2149:4148","name":"LASERABLE","absoluteBoundingBox":{"x":-2904.5,"y":1684.0,"width":191.0,"height":17.0},"isolatedAbsoluteRenderBounds":{"x":-2902.88403320312,"y":1687.06396484375,"width":144.727294921875,"height":12.14404296875},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,48.0]],"size":{"x":191.0,"y":17.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"TOP","horizontal":"SCALE"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"right":{"pixelOffset":0.0,"sizeFraction":0.694545454545455},"top":{"pixelOffset":48.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":2.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"LASERABLE","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","textAlignVertical":"BOTTOM","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"BOTTOM","letterSpacing":7.68,"letterSpacingValue":48.0,"letterSpacingUnit":"PERCENT","lineHeightPx":17.4400005340576,"lineHeightPercent":90.8333282470703,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"106:833":{"type":"FRAME","id":"106:833","name":"Contact column 4","absoluteBoundingBox":{"x":-2619.0,"y":4003.0,"width":255.0,"height":20.0},"isolatedAbsoluteRenderBounds":{"x":-2619.0,"y":4003.0,"width":255.0,"height":20.0},"relativeTransform":[[1.0,0.0,303.0],[0.0,1.0,0.0]],"size":{"x":255.0,"y":20.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":2.0,"primaryAxisAlignItems":"CENTER","children":[]},"32:808":{"type":"COMPONENT","id":"32:808","name":"Property 1=Carousel slide 1","absoluteBoundingBox":{"x":-6253.0,"y":-1903.0,"width":738.0,"height":445.0},"isolatedAbsoluteRenderBounds":{"x":-6253.0,"y":-1903.0,"width":738.0,"height":445.0},"relativeTransform":[[1.0,0.0,20.0],[0.0,1.0,20.0]],"size":{"x":738.0,"y":445.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.966601550579071,"g":0.966601550579071,"b":0.966601550579071,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","maxWidth":738.0,"minHeight":445.0,"strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":30.0,"paddingRight":50.0,"paddingBottom":30.0,"paddingLeft":50.0,"layoutMode":"VERTICAL","itemSpacing":80.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","children":["32:675","64:175"],"componentSetId":"32:813"},"5:1334":{"type":"TEXT","id":"5:1334","name":"010-8123-7857 02)-581-7856","absoluteBoundingBox":{"x":-2922.0,"y":4003.5,"width":122.0,"height":45.0},"isolatedAbsoluteRenderBounds":{"x":-2921.44995117188,"y":4008.2939453125,"width":85.560546875,"height":28.362060546875},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.5]],"size":{"x":122.0,"y":45.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"hover":{"transition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.300000011920929,"delay":0.0},"state":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.699999988079071},"behaviorType":"hover"}},"characterStyleOverrides":[],"characters":"010-8123-7857\n02)-581-7856\n","lineIndentations":[0,0,0],"lineTypes":["NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","fontVariantPosition":"NORMAL","fontSize":11.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.99,"letterSpacingValue":9.0,"letterSpacingUnit":"PERCENT","lineHeightPx":17.8199996948242,"lineHeightPercent":135.0,"lineHeightPercentFontSize":162.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"5:1333":{"type":"TEXT","id":"5:1333","name":"hello@brainable.co.kr","absoluteBoundingBox":{"x":-2922.0,"y":4017.5,"width":255.0,"height":20.0},"isolatedAbsoluteRenderBounds":{"x":-2922.0,"y":4017.5,"width":255.0,"height":20.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,14.5]],"size":{"x":255.0,"y":20.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"visible":false,"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"hover":{"transition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.300000011920929,"delay":0.0},"state":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.699999988079071},"behaviorType":"hover"}},"characterStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1],"characters":"hello@brainable.co.kr","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"styleIdForText":"StyleId:6:1356","fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","hyperlink":{"type":"URL","url":"mailto:hello@figma.com","openInNewTab":true},"textAutoResize":"HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"styleIdForText":"StyleId:6:1356","fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"styleIdForText":"StyleId:6:1356","fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":0.0,"name":"Mobile","style":{"styleIdForText":"StyleId:6:1356","fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":14.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":107.692314147949,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{"1":{"styleIdForText":"StyleId:6:1356","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100}}},"5:1329":{"type":"GROUP","id":"5:1329","name":"Footer subhead","absoluteBoundingBox":{"x":-2922.0,"y":3918.0,"width":311.0,"height":28.0},"isolatedAbsoluteRenderBounds":{"x":-2922.0,"y":3918.0,"width":311.0,"height":28.0},"relativeTransform":[[1.0,0.0,32.0],[0.0,1.0,186.0]],"size":{"x":311.0,"y":28.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"children":["5:1330"]},"2109:1177":{"type":"RECTANGLE","id":"2109:1177","name":"brainable_logo_ver.001-03 1","absoluteBoundingBox":{"x":-2887.0,"y":3803.0,"width":89.0,"height":74.0},"targetAspectRatio":{"x":1400.0,"y":1167.0},"isolatedAbsoluteRenderBounds":{"x":-2887.0,"y":3803.0,"width":89.0,"height":74.0},"relativeTransform":[[1.0,0.0,35.0],[0.0,1.0,-16.0]],"size":{"x":89.0,"y":74.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"d5fa8c9a8fa609d8b7d06565c3a9a33ab9d65149","originalImageWidth":1400,"originalImageHeight":1167,"visible":true,"opacity":1.0,"rotation":0.0}],"visible":false,"constraintValues":{"left":{"pixelOffset":35.0,"sizeFraction":0.0},"top":{"pixelOffset":-16.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","layoutPositioning":"ABSOLUTE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[]},"2149:3584":{"type":"FRAME","id":"2149:3584","name":"Our clients content","absoluteBoundingBox":{"x":-3135.5,"y":2759.0,"width":738.0,"height":858.0},"isolatedAbsoluteRenderBounds":{"x":-3135.5,"y":2759.0,"width":738.0,"height":858.0},"relativeTransform":[[1.0,0.0,271.0],[0.0,1.0,62.0]],"size":{"x":738.0,"y":858.0},"fills":[],"strokeAlign":"INSIDE","maxWidth":942.0,"strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","isInAnimateTree":true,"children":["2149:3585","2149:3588","2149:3589","2224:2677"]},"2702:553":{"type":"FRAME","id":"2702:553","name":"Header content","absoluteBoundingBox":{"x":-2930.0,"y":35.0,"width":326.0,"height":377.0},"isolatedAbsoluteRenderBounds":{"x":-2930.0,"y":35.0,"width":326.0,"height":377.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,12.0]],"size":{"x":326.0,"y":377.0},"fills":[],"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"top":{"pixelOffset":12.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","scrollBehavior":"STICKY_SCROLLS","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":150.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"},"scrollParallax":{"axis":"VERTICAL","speed":0.649999976158142,"relativeToPage":false,"behaviorType":"scrollParallax"}},"paddingTop":96.0,"paddingBottom":120.0,"layoutMode":"VERTICAL","itemSpacing":130.0,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2702:554","2702:555","2702:556"]},"2695:745":{"type":"TEXT","id":"2695:745","name":"센터소개","absoluteBoundingBox":{"x":-2326.0,"y":-429.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-2325.8173828125,"y":-425.31201171875,"width":58.63623046875,"height":16.5120239257812},"relativeTransform":[[1.0,0.0,353.0],[0.0,1.0,0.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"센터소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"hyperlink":{"type":"NODE","nodeID":"/센터소개"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2149:3585":{"type":"FRAME","id":"2149:3585","name":"Our clients intro","absoluteBoundingBox":{"x":-3135.5,"y":2759.0,"width":738.0,"height":200.0},"isolatedAbsoluteRenderBounds":{"x":-3135.5,"y":2759.0,"width":738.0,"height":200.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":738.0,"y":200.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":32.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2149:3586","2149:3587"]},"2149:3587":{"type":"TEXT","id":"2149:3587","name":"브레인에이블과 함께해주신 분들의 후기","absoluteBoundingBox":{"x":-2876.0,"y":2879.0,"width":219.0,"height":80.0},"isolatedAbsoluteRenderBounds":{"x":-2875.22290039062,"y":2881.94409179688,"width":216.57080078125,"height":11.06396484375},"relativeTransform":[[1.0,0.0,259.5],[0.0,1.0,120.0]],"size":{"x":219.0,"y":80.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"브레인에이블과 함께해주신 분들의 후기","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAlignHorizontal":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","fontVariantPosition":"NORMAL","fontSize":12.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":1.2,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":16.2000007629395,"lineHeightPercent":112.499992370605,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"64:712":{"type":"SVG","id":"64:712","name":"Ellipse 180","absoluteBoundingBox":{"x":-5919.4443359375,"y":-175.111114501953,"width":10.222222328186,"height":10.222222328186},"targetAspectRatio":{"x":11.0,"y":11.0},"isolatedAbsoluteRenderBounds":{"x":-5919.4443359375,"y":-175.111114501953,"width":10.22216796875,"height":10.2222290039062},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":10.222222328186,"y":10.222222328186},"fills":[{"opacity":0.25,"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Customer quote 1 of 4","ariaAttributes":{},"interactions":[{"id":{"sessionID":32,"localID":919},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":32,"localID":808},"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","transitionResetScrollPosition":false,"transitionResetInteractiveComponents":true,"stateGroupContext":"32:813"}],"isDeleted":false,"stateManagementVersion":1}],"hash":"336ac530876eaa2b1db913b1b0df0a39feacfdd3"},"32:816":{"type":"FRAME","id":"32:816","name":"Our clients intro","absoluteBoundingBox":{"x":-4027.0,"y":4806.0,"width":738.0,"height":91.0},"isolatedAbsoluteRenderBounds":{"x":-4027.0,"y":4806.0,"width":738.0,"height":91.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,-141.0]],"size":{"x":738.0,"y":91.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":32.0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","children":["32:817","32:818"]},"2149:4137":{"type":"FRAME","id":"2149:4137","name":"Offering section","absoluteBoundingBox":{"x":-3406.5,"y":1401.0,"width":1280.0,"height":1296.0},"isolatedAbsoluteRenderBounds":{"x":-3406.5,"y":1401.0,"width":1280.0,"height":1296.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,813.0]],"size":{"x":1280.0,"y":1296.0},"fills":[{"blendMode":"NORMAL","type":"VIDEO","scaleMode":"FILL","imageRef":"75a85c77b4c731c7f19114f560b575519434a452","originalImageWidth":3840,"originalImageHeight":2160,"videoRef":"c93e4a77270d048f96f370a261142fd8506d83b3","visible":true,"opacity":1.0,"autoplay":true,"mediaLoop":true,"muted":true,"showControls":false}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2149:4138","2149:4143"]},"2149:4144":{"type":"GROUP","id":"2149:4144","name":"products lists","absoluteBoundingBox":{"x":-2904.5,"y":1636.0,"width":275.0,"height":799.0},"isolatedAbsoluteRenderBounds":{"x":-2908.00805664062,"y":1636.0,"width":278.508056640625,"height":799.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,87.0]],"size":{"x":275.0,"y":799.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"children":["2149:4145","2149:4149","2149:4154"]},"2149:4154":{"type":"GROUP","id":"2149:4154","name":"LISTENINGABLE","absoluteBoundingBox":{"x":-2904.5,"y":2266.0,"width":267.0,"height":169.0},"isolatedAbsoluteRenderBounds":{"x":-2908.00805664062,"y":2266.0,"width":270.508056640625,"height":169.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,630.0]],"size":{"x":267.0,"y":169.0},"fills":[],"constraints":{"vertical":"TOP","horizontal":"SCALE"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"right":{"pixelOffset":0.0,"sizeFraction":0.970909090909091},"top":{"pixelOffset":630.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"children":["2149:4155","2149:4156","2149:4157"]},"2149:4155":{"type":"TEXT","id":"2149:4155","name":"LISTENINGABLE","absoluteBoundingBox":{"x":-2904.5,"y":2322.0,"width":230.0,"height":49.0},"isolatedAbsoluteRenderBounds":{"x":-2902.88403320312,"y":2325.06396484375,"width":208.260009765625,"height":12.14404296875},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,56.0]],"size":{"x":230.0,"y":49.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"TOP","horizontal":"SCALE"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"right":{"pixelOffset":0.0,"sizeFraction":0.861423220973783},"top":{"pixelOffset":56.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":2.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"LISTENINGABLE\n","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":7.68,"letterSpacingValue":48.0,"letterSpacingUnit":"PERCENT","lineHeightPx":17.4400005340576,"lineHeightPercent":90.8333282470703,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2:721":{"type":"TEXT","id":"2:721","name":"Display/디스플레이 2","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":43.0,"height":36.0},"isolatedAbsoluteRenderBounds":{"x":0.0,"y":6.6789984703064,"width":42.4073219299316,"height":32.4720039367676},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":43.0,"y":36.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","textAutoResize":"WIDTH_AND_HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"fontSize":120.0,"letterSpacing":-3.6,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":114.0,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"fontSize":84.0,"letterSpacing":-2.52,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":79.7999954223633,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":1.0,"name":"Mobile","style":{"fontSize":84.0,"letterSpacing":-2.52,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":79.7999954223633,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":33.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":3.3,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":36.2999992370605,"lineHeightPercent":91.6666641235352,"lineHeightPercentFontSize":110.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2149:4153":{"type":"TEXT","id":"2149:4153","name":"난독증진단장비","absoluteBoundingBox":{"x":-2904.5,"y":1922.0,"width":191.0,"height":50.0},"isolatedAbsoluteRenderBounds":{"x":-2907.56396484375,"y":1922.93200683594,"width":108.92626953125,"height":19.1600341796875},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":191.0,"y":50.0},"fills":[{"opacity":0.959999978542328,"blendMode":"NORMAL","type":"SOLID","color":{"r":0.464608997106552,"g":0.964307248592377,"b":1.0,"a":1.0},"visible":true}],"constraints":{"vertical":"TOP","horizontal":"SCALE"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"right":{"pixelOffset":0.0,"sizeFraction":0.6996336996337},"top":{"pixelOffset":0.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[],"effects":[{"type":"DROP_SHADOW","visible":true,"color":{"r":0.0,"g":0.0,"b":0.0,"a":0.25},"blendMode":"NORMAL","offset":{"x":0.0,"y":4.0},"radius":4.0,"showShadowBehindNode":false,"spread":0.0}],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"난독증진단장비","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","fontVariantPosition":"NORMAL","fontSize":12.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":4.32,"letterSpacingValue":36.0,"letterSpacingUnit":"PERCENT","lineHeightPx":13.0799999237061,"lineHeightPercent":90.8333282470703,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2149:4152":{"type":"TEXT","id":"2149:4152","name":"LASERABLE","absoluteBoundingBox":{"x":-2755.78393554688,"y":2229.9345703125,"width":98.4357757568359,"height":52.4617195129395},"isolatedAbsoluteRenderBounds":{"x":-2755.78393554688,"y":2229.9345703125,"width":98.4357757568359,"height":52.4617195129395},"relativeTransform":[[1.0,0.0,148.716033935547],[0.0,1.0,307.9345703125]],"size":{"x":98.4357757568359,"y":52.4617195129395},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"visible":false,"constraints":{"vertical":"TOP","horizontal":"SCALE"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.544747377053285},"right":{"pixelOffset":0.0,"sizeFraction":0.905317984221182},"top":{"pixelOffset":307.9345703125,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"characterStyleOverrides":[],"characters":"LASERABLE \n","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"style":{"styleIdForText":"StyleId:7aa8e3397bdf15c0f346f2cbc2db3f1f00b8f278/121:1154","fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","fontVariantPosition":"NORMAL","fontSize":32.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-1.6,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":34.8800010681152,"lineHeightPercent":83.8461532592773,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2149:4145":{"type":"GROUP","id":"2149:4145","name":"LASERABLE","absoluteBoundingBox":{"x":-2904.5,"y":1636.0,"width":275.0,"height":201.0},"isolatedAbsoluteRenderBounds":{"x":-2907.40795898438,"y":1636.0,"width":277.907958984375,"height":201.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":275.0,"y":201.0},"fills":[],"constraints":{"vertical":"TOP","horizontal":"SCALE"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"right":{"pixelOffset":0.0,"sizeFraction":1.0},"top":{"pixelOffset":0.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"children":["2149:4146","2149:4147","2149:4148"]},"2149:4146":{"type":"TEXT","id":"2149:4146","name":"PBM 테라피 장비","absoluteBoundingBox":{"x":-2904.5,"y":1636.0,"width":164.0,"height":15.0},"isolatedAbsoluteRenderBounds":{"x":-2907.40795898438,"y":1636.93200683594,"width":131.491943359375,"height":19.14794921875},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":164.0,"y":15.0},"fills":[{"opacity":0.959999978542328,"blendMode":"NORMAL","type":"SOLID","color":{"r":0.464608997106552,"g":0.964307248592377,"b":1.0,"a":1.0},"visible":true}],"constraints":{"vertical":"TOP","horizontal":"SCALE"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"right":{"pixelOffset":0.0,"sizeFraction":0.596363636363636},"top":{"pixelOffset":0.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[],"effects":[{"type":"DROP_SHADOW","visible":true,"color":{"r":0.0,"g":0.0,"b":0.0,"a":0.25},"blendMode":"NORMAL","offset":{"x":0.0,"y":4.0},"radius":4.0,"showShadowBehindNode":false,"spread":0.0}],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"PBM 테라피 장비","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","fontVariantPosition":"NORMAL","fontSize":12.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":4.32,"letterSpacingValue":36.0,"letterSpacingUnit":"PERCENT","lineHeightPx":13.0799999237061,"lineHeightPercent":90.8333282470703,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2108:1148":{"type":"GROUP","id":"2108:1148","name":"Brainable 로고","absoluteBoundingBox":{"x":-2820.5,"y":1255.0,"width":106.230834960938,"height":67.0002136230469},"isolatedAbsoluteRenderBounds":{"x":-2820.5,"y":1255.0,"width":106.230834960938,"height":67.0002136230469},"relativeTransform":[[1.0,0.0,586.0],[0.0,1.0,154.0]],"size":{"x":106.230834960938,"y":67.0002136230469},"fills":[],"visible":false,"constraints":{"vertical":"TOP","horizontal":"LEFT"},"constraintValues":{"left":{"pixelOffset":586.0,"sizeFraction":0.0},"top":{"pixelOffset":154.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","layoutPositioning":"ABSOLUTE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"children":["2108:1149","2108:1150"]},"2108:1150":{"type":"RECTANGLE","id":"2108:1150","name":"brainable_logo_ver.001-02 1","absoluteBoundingBox":{"x":-3272.5,"y":1255.0,"width":80.3772888183594,"height":67.0002136230469},"targetAspectRatio":{"x":1400.0,"y":1167.0},"isolatedAbsoluteRenderBounds":{"x":-3272.5,"y":1255.0,"width":80.377197265625,"height":67.000244140625},"relativeTransform":[[1.0,0.0,-452.0],[0.0,1.0,0.0]],"size":{"x":80.3772888183594,"y":67.0002136230469},"fills":[{"opacity":0.629999995231628,"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"5a2eead312ec2ae252dc5a353cb3f7a48575eadc","originalImageWidth":1400,"originalImageHeight":1167,"visible":true,"rotation":0.0}],"constraintValues":{"left":{"pixelOffset":134.0,"sizeFraction":0.0},"top":{"pixelOffset":154.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[]},"2108:1149":{"type":"RECTANGLE","id":"2108:1149","name":"brainable_logo_ver.001-06 1","absoluteBoundingBox":{"x":-3194.12255859375,"y":1278.69506835938,"width":27.8535175323486,"height":23.2178955078125},"targetAspectRatio":{"x":1400.0,"y":1167.0},"isolatedAbsoluteRenderBounds":{"x":-3194.12255859375,"y":1278.69506835938,"width":27.853515625,"height":23.2178955078125},"relativeTransform":[[1.0,0.0,-373.622680664062],[0.0,1.0,23.695068359375]],"size":{"x":27.8535175323486,"y":23.2178955078125},"fills":[{"opacity":0.579999983310699,"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"5fb30151daec360d1afcbecd1c68465285304a9e","originalImageWidth":1400,"originalImageHeight":1167,"visible":true,"rotation":0.0}],"constraintValues":{"left":{"pixelOffset":212.377319335938,"sizeFraction":0.0},"top":{"pixelOffset":177.695068359375,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[]},"32:761":{"type":"SVG","id":"32:761","name":"Ellipse 183","absoluteBoundingBox":{"x":-5858.77783203125,"y":-1548.61108398438,"width":10.222222328186,"height":10.222222328186},"targetAspectRatio":{"x":11.0,"y":11.0},"isolatedAbsoluteRenderBounds":{"x":-5858.77783203125,"y":-1548.61108398438,"width":10.22216796875,"height":10.22216796875},"relativeTransform":[[1.0,0.0,60.6666641235352],[0.0,1.0,0.0]],"size":{"x":10.222222328186,"y":10.222222328186},"fills":[{"opacity":0.25,"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Customer quote 4 of 4","ariaAttributes":{},"interactions":[{"id":{"sessionID":162,"localID":181},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":32,"localID":811},"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","stateGroupContext":"32:813"}],"isDeleted":false,"stateManagementVersion":1}],"hash":"244f7ed17a34bb385ccfc7d9ccaa5c5f8a523d1a"},"4:943":{"type":"FRAME","id":"4:943","name":"Welcome body copy","absoluteBoundingBox":{"x":-2930.0,"y":749.5,"width":327.0,"height":287.0},"isolatedAbsoluteRenderBounds":{"x":-2930.0,"y":749.5,"width":327.0,"height":287.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,89.0]],"size":{"x":327.0,"y":287.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":61.0,"primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["4:944","2191:182"]},"2191:182":{"mainComponentId":"6:1477","type":"INSTANCE","id":"2191:182","name":"Button Dark","absoluteBoundingBox":{"x":-2930.0,"y":973.5,"width":50.0,"height":27.0},"isolatedAbsoluteRenderBounds":{"x":-2930.0,"y":973.5,"width":50.0,"height":27.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,224.0]],"size":{"x":50.0,"y":27.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":193,"localID":83},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":6,"localID":1529},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/about_us"}],"isDeleted":false,"stateManagementVersion":1},{"id":{"sessionID":9,"localID":2665},"event":{"interactionType":"ON_HOVER"},"actions":[{"transitionNodeID":{"sessionID":6,"localID":1477},"transitionType":"SMART_ANIMATE","transitionDuration":0.300000011920929,"easingType":"OUT_CUBIC","easingFunction":[0.0,0.0,0.579999983310699,1.0],"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","transitionResetVideoPosition":false,"stateGroupContext":"6:1478"}],"isDeleted":false,"stateManagementVersion":1}],"rectangleCornerRadii":[500.0,500.0,500.0,500.0],"cornerRadius":500.0,"paddingTop":18.0,"paddingRight":24.0,"paddingBottom":18.0,"paddingLeft":24.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["I2191:182;6:1476"],"componentSetId":"6:1478","componentProperties":{"Property 1":{"value":"Hover","type":"VARIANT","boundVariables":{}}},"overrides":[{"key":[],"value":{"behaviors":null,"counterAxisSizingMode":"FIXED","fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","size":{"x":50.0,"y":27.0},"interactions":[{"id":{"sessionID":193,"localID":83},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":6,"localID":1529},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/about_us"}],"isDeleted":false,"stateManagementVersion":1},{"id":{"sessionID":9,"localID":2665},"event":{"interactionType":"ON_HOVER"},"actions":[{"transitionNodeID":{"sessionID":6,"localID":1477},"transitionType":"SMART_ANIMATE","transitionDuration":0.300000011920929,"easingType":"OUT_CUBIC","easingFunction":[0.0,0.0,0.579999983310699,1.0],"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","transitionResetVideoPosition":false,"stateGroupContext":"6:1478"}],"isDeleted":false,"stateManagementVersion":1},{"id":{"sessionID":9,"localID":2659},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":6,"localID":1477},"transitionType":"SMART_ANIMATE","transitionDuration":0.300000011920929,"easingType":"OUT_CUBIC","easingFunction":[0.0,0.0,0.579999983310699,1.0],"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","transitionResetVideoPosition":false}],"isDeleted":true,"stateManagementVersion":1},{"id":{"sessionID":9,"localID":2662},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"URL","connectionURL":"figma.com/sites","openUrlInNewTab":true}],"isDeleted":true,"stateManagementVersion":1},{"id":{"sessionID":10,"localID":3480},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":9,"localID":2725},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","openUrlInNewTab":true}],"isDeleted":true,"stateManagementVersion":1}]},"componentId":"6:1477"},{"key":["제품소개0"],"value":{"characterStyleOverrides":[],"characters":"회사소개","fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","hyperlink":{"type":"NODE","nodeID":"/about_us"},"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":8.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":1.36,"letterSpacingValue":17.0,"letterSpacingUnit":"PERCENT","lineHeightPx":9.60000038146973,"lineHeightPercent":100.0,"lineHeightPercentFontSize":120.000007629395,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"lineHeightPercent":null,"lineHeightPercentFontSize":null,"lineHeightPx":null,"lineHeightUnit":null,"lineIndentations":[0],"lineStyleOverrides":[0],"lineTypes":["NONE"],"name":"회사소개","openTypeFlags":null,"styleOverrideTable":{},"text":null,"textAlignVertical":"CENTER","textDecoration":null,"textDecorationSkipInk":null},"componentId":"6:1477"}]},"2577:671":{"type":"TEXT","id":"2577:671","name":"Text md / Semibold","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":62.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":0.0,"y":0.0,"width":62.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":62.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"visible":false,"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Rag 123","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","paragraphSpacing":16.0,"style":{"fontFamily":"Inter","fontPostScriptName":null,"fontStyle":"Semi Bold","paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":123.943664550781,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"PIXELS","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2108:1143":{"type":"RECTANGLE","id":"2108:1143","name":"brainable_logo_ver.001-06 1","absoluteBoundingBox":{"x":-3754.0,"y":2096.00805664062,"width":53.9649696350098,"height":44.9839057922363},"targetAspectRatio":{"x":1400.0,"y":1167.0},"isolatedAbsoluteRenderBounds":{"x":-3754.0,"y":2096.00805664062,"width":53.965087890625,"height":44.98388671875},"relativeTransform":[[1.0,0.0,219.0],[0.0,1.0,41.0080261230469]],"size":{"x":53.9649696350098,"y":44.9839057922363},"fills":[{"opacity":0.660000026226044,"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"5fb30151daec360d1afcbecd1c68465285304a9e","originalImageWidth":1400,"originalImageHeight":1167,"visible":true,"rotation":0.0}],"constraintValues":{"left":{"pixelOffset":544.0,"sizeFraction":0.0},"top":{"pixelOffset":424.008026123047,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[]},"2702:551":{"type":"FRAME","id":"2702:551","name":"Group 3","absoluteBoundingBox":{"x":-2930.0,"y":23.0,"width":1643.0,"height":572.0},"isolatedAbsoluteRenderBounds":{"x":-2930.0,"y":23.0,"width":1643.0,"height":572.0},"relativeTransform":[[1.0,0.0,24.0],[0.0,1.0,25.0]],"size":{"x":1643.0,"y":572.0},"fills":[],"constraintValues":{"left":{"pixelOffset":24.0,"sizeFraction":0.0},"top":{"pixelOffset":25.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","layoutPositioning":"ABSOLUTE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"clipsContent":true,"children":["2702:552","2702:553"]},"64:720":{"type":"FRAME","id":"64:720","name":"Slideshow nav bar","absoluteBoundingBox":{"x":-6203.0,"y":331.5,"width":638.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":-6203.0,"y":331.5,"width":638.0,"height":24.0},"relativeTransform":[[1.0,0.0,50.0],[0.0,1.0,347.5]],"size":{"x":638.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":20.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["95:256","64:724","95:265"]},"2702:556":{"type":"TEXT","id":"2702:556","name":"잠재력을 깨우는 기술, 이 함께합니다.","absoluteBoundingBox":{"x":-2930.0,"y":124.0,"width":326.0,"height":295.0},"isolatedAbsoluteRenderBounds":{"x":-2929.28002929688,"y":250.751998901367,"width":198.66748046875,"height":41.5120086669922},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,89.0]],"size":{"x":326.0,"y":295.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"top":{"pixelOffset":89.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","layoutPositioning":"ABSOLUTE","strokes":[],"accessibleHTMLTag":"H1","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"PAGE_LOAD","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"},"scrollParallax":{"axis":"VERTICAL","speed":0.649999976158142,"relativeToPage":false,"behaviorType":"scrollParallax"}},"characterStyleOverrides":[48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,47,48,48,48,48,48,48,48],"characters":"잠재력을 깨우는 기술,\n                       이 함께합니다.","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAlignVertical":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","hangingPunctuation":true,"textCase":"TITLE","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"CENTER","letterSpacing":0.8,"letterSpacingValue":5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":27.3600006103516,"lineHeightPercent":142.5,"lineHeightPercentFontSize":171.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{"48":{"fontSize":16.0,"paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100},"47":{"fontSize":16.0,"letterSpacing":-1.28,"letterSpacingValue":-8.0,"letterSpacingUnit":"PERCENT","lineHeightPx":27.3600006103516,"lineHeightPercent":145.919998168945,"lineHeightPercentFontSize":171.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"}}},"2702:555":{"type":"RECTANGLE","id":"2702:555","name":"브레인에이블/W,ip","absoluteBoundingBox":{"x":-2930.0,"y":279.0,"width":93.0,"height":13.0},"targetAspectRatio":{"x":491.0,"y":71.0},"isolatedAbsoluteRenderBounds":{"x":-2930.0,"y":279.0,"width":93.0,"height":13.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,244.0]],"size":{"x":93.0,"y":13.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"fde0244a54e45655f579546c98baaa88b4e2d8c7","originalImageWidth":491,"originalImageHeight":71,"visible":true,"opacity":1.0,"rotation":0.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":150.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"},"scrollParallax":{"axis":"VERTICAL","speed":0.649999976158142,"relativeToPage":false,"behaviorType":"scrollParallax"}}},"2109:1307":{"type":"TEXT","id":"2109:1307","name":"LASERABLE","absoluteBoundingBox":{"x":-4149.0,"y":3009.0,"width":391.466796875,"height":56.0},"isolatedAbsoluteRenderBounds":{"x":-4145.36376953125,"y":3016.14404296875,"width":216.1962890625,"height":27.323974609375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,93.0]],"size":{"x":391.466796875,"y":56.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"TOP","horizontal":"SCALE"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"right":{"pixelOffset":0.0,"sizeFraction":0.427365498771834},"top":{"pixelOffset":93.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":2.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"LASERABLE \n","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","fontVariantPosition":"NORMAL","fontSize":36.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":3.6,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":39.2400016784668,"lineHeightPercent":90.8333282470703,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"32:802":{"type":"TEXT","id":"32:802","name":"— 8세 ADHD 남아, 브레인에이블 서울권 센터","absoluteBoundingBox":{"x":-6203.0,"y":217.5,"width":638.0,"height":34.0},"isolatedAbsoluteRenderBounds":{"x":-5972.61083984375,"y":219.188003540039,"width":176.119140625,"height":31.6559906005859},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,160.0]],"size":{"x":638.0,"y":34.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"characterStyleOverrides":[],"characters":"— 8세 ADHD 남아,\n브레인에이블 서울권 센터","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","textAlignHorizontal":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":0.8,"letterSpacingValue":5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":17.4400005340576,"lineHeightPercent":90.8333282470703,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2702:554":{"type":"TEXT","id":"2702:554","name":"Pioneer of the wellness-tech solution","absoluteBoundingBox":{"x":-2930.0,"y":131.0,"width":562.0,"height":119.0},"isolatedAbsoluteRenderBounds":{"x":-2929.63989257812,"y":176.304000854492,"width":149.000244140625,"height":27.8520050048828},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,96.0]],"size":{"x":562.0,"y":119.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Pioneer of  the \nwellness-tech solution","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAlignVertical":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Light","fontStyle":"Light","hangingPunctuation":true,"textCase":"TITLE","fontVariantPosition":"NORMAL","fontSize":12.0,"textAlignHorizontal":"LEFT","textAlignVertical":"CENTER","letterSpacing":1.2,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":18.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2702:552":{"type":"TEXT","id":"2702:552","name":"Brainable Co., LTD.","absoluteBoundingBox":{"x":-2930.0,"y":298.0,"width":1368.0,"height":292.0},"isolatedAbsoluteRenderBounds":{"x":-2929.03100585938,"y":440.43798828125,"width":96.998779296875,"height":9.32901000976562},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,275.0]],"size":{"x":1368.0,"y":292.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.949019610881805,"g":0.949019610881805,"b":0.949019610881805,"a":1.0},"visible":true,"opacity":1.0}],"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"top":{"pixelOffset":275.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"H3","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Brainable Co., LTD.","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAlignVertical":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-DemiLight","fontStyle":"DemiLight","fontVariantPosition":"NORMAL","fontSize":9.5,"textAlignHorizontal":"LEFT","textAlignVertical":"CENTER","letterSpacing":0.95,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":12.8249998092651,"lineHeightPercent":112.499992370605,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2702:515":{"type":"RECTANGLE","id":"2702:515","name":"Logo","absoluteBoundingBox":{"x":-2885.0,"y":-455.0,"width":211.0,"height":75.0},"isolatedAbsoluteRenderBounds":{"x":-2885.0,"y":-455.0,"width":211.0,"height":75.0},"relativeTransform":[[1.0,0.0,64.0],[0.0,1.0,24.0]],"size":{"x":211.0,"y":75.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"64270238d3de4edd07597c9179b36856b5a53af3","originalImageWidth":1400,"originalImageHeight":1167,"visible":true,"opacity":1.0,"rotation":0.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Logomark","ariaAttributes":{},"interactions":[]},"2695:754":{"type":"FRAME","id":"2695:754","name":"Frame 2","absoluteBoundingBox":{"x":-2954.0,"y":-479.0,"width":375.0,"height":430.0},"isolatedAbsoluteRenderBounds":{"x":-2954.0,"y":-479.0,"width":375.0,"height":430.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":375.0,"y":430.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["2695:755","2695:763"]},"2695:770":{"type":"TEXT","id":"2695:770","name":"커뮤니티","absoluteBoundingBox":{"x":-2801.0,"y":-175.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-2800.8173828125,"y":-171.311996459961,"width":58.63623046875,"height":16.5119934082031},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,165.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"커뮤니티","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"hyperlink":{"type":"NODE","nodeID":"/커뮤니티Articles"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2695:769":{"type":"TEXT","id":"2695:769","name":"제품소개","absoluteBoundingBox":{"x":-2801.0,"y":-230.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-2800.8173828125,"y":-226.311996459961,"width":58.63623046875,"height":16.5119934082031},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,110.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"제품소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"hyperlink":{"type":"NODE","nodeID":"/laserable"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"4:927":{"type":"FRAME","id":"4:927","name":"Welcome body copy","absoluteBoundingBox":{"x":-4101.5,"y":1102.5,"width":1139.0,"height":140.0},"isolatedAbsoluteRenderBounds":{"x":-4101.5,"y":1102.5,"width":1139.0,"height":390.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,183.5]],"size":{"x":1139.0,"y":140.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":4.0,"primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["4:928","6:1520"]},"2695:765":{"type":"RECTANGLE","id":"2695:765","name":"Logo","absoluteBoundingBox":{"x":-2877.0,"y":-431.0,"width":211.0,"height":75.0},"isolatedAbsoluteRenderBounds":{"x":-2877.0,"y":-431.0,"width":211.0,"height":75.0},"relativeTransform":[[1.0,0.0,33.0],[0.0,1.0,24.0]],"size":{"x":211.0,"y":75.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"64270238d3de4edd07597c9179b36856b5a53af3","originalImageWidth":1400,"originalImageHeight":1167,"visible":true,"opacity":1.0,"rotation":0.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Logomark","ariaAttributes":{},"interactions":[{"id":{"sessionID":2608,"localID":2148},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":0,"localID":3},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/"}],"isDeleted":false,"stateManagementVersion":1}]},"2695:755":{"type":"FRAME","id":"2695:755","name":"Header 1","absoluteBoundingBox":{"x":-2954.0,"y":-479.0,"width":375.0,"height":123.0},"isolatedAbsoluteRenderBounds":{"x":-2954.0,"y":-479.0,"width":375.0,"height":123.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":375.0,"y":123.0},"fills":[],"visible":false,"strokeAlign":"INSIDE","layoutGrow":1.0,"strokes":[],"accessibleHTMLTag":"HEADER","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":24.0,"paddingRight":64.0,"paddingBottom":24.0,"paddingLeft":64.0,"layoutMode":"HORIZONTAL","itemSpacing":16.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED","children":["2695:756","2695:757"]},"2695:757":{"type":"FRAME","id":"2695:757","name":"Nav","absoluteBoundingBox":{"x":-2679.0,"y":-429.0,"width":471.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-2679.0,"y":-429.0,"width":471.0,"height":23.0},"relativeTransform":[[1.0,0.0,275.0],[0.0,1.0,50.0]],"size":{"x":471.0,"y":23.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"NAV","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":32.0,"counterAxisAlignItems":"CENTER","children":["2695:758","2695:759","2695:760","2695:761","2695:762"]},"2695:762":{"type":"TEXT","id":"2695:762","name":"회사소개","absoluteBoundingBox":{"x":-2279.0,"y":-429.0,"width":71.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-2278.69750976562,"y":-424.31201171875,"width":70.396240234375,"height":16.5120239257812},"relativeTransform":[[1.0,0.0,400.0],[0.0,1.0,0.0]],"size":{"x":71.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"회사소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"style":{"styleIdForText":"StyleId:2608:2916","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":3.84,"letterSpacingValue":24.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":120.83332824707,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2695:759":{"type":"TEXT","id":"2695:759","name":"제품소개","absoluteBoundingBox":{"x":-2588.0,"y":-429.0,"width":71.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-2587.69750976562,"y":-424.31201171875,"width":70.396240234375,"height":16.5120239257812},"relativeTransform":[[1.0,0.0,91.0],[0.0,1.0,0.0]],"size":{"x":71.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"제품소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"style":{"styleIdForText":"StyleId:2608:2916","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","hyperlink":{"type":"NODE","nodeID":"/laserable"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":3.84,"letterSpacingValue":24.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":120.83332824707,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"5:1299":{"type":"TEXT","id":"5:1299","name":"Brainable Co., LTD. © 2025 All Rights Reserved","absoluteBoundingBox":{"x":-4155.0,"y":6798.0,"width":197.0,"height":28.0},"isolatedAbsoluteRenderBounds":{"x":-4154.4501953125,"y":6801.0400390625,"width":146.859130859375,"height":24.4599609375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":197.0,"y":28.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Brainable Co., LTD.\n© 2025 All Rights Reserved","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":10.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":1.0,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":14.0,"lineHeightPercent":116.666664123535,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2695:761":{"type":"TEXT","id":"2695:761","name":"센터소개","absoluteBoundingBox":{"x":-2382.0,"y":-429.0,"width":71.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-2381.69750976562,"y":-424.31201171875,"width":70.396240234375,"height":16.5120239257812},"relativeTransform":[[1.0,0.0,297.0],[0.0,1.0,0.0]],"size":{"x":71.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"센터소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"style":{"styleIdForText":"StyleId:2608:2916","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","hyperlink":{"type":"NODE","nodeID":"/센터소개"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":3.84,"letterSpacingValue":24.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":120.83332824707,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2695:740":{"type":"FRAME","id":"2695:740","name":"Nav","absoluteBoundingBox":{"x":-2679.0,"y":-429.0,"width":412.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-2679.0,"y":-429.0,"width":412.0,"height":23.0},"relativeTransform":[[1.0,0.0,275.0],[0.0,1.0,50.0]],"size":{"x":412.0,"y":23.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"NAV","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":2608,"localID":4804},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":0,"localID":3},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/"}],"isDeleted":false,"stateManagementVersion":1}],"layoutMode":"HORIZONTAL","itemSpacing":32.0,"counterAxisAlignItems":"CENTER","children":["2695:741","2695:742","2695:743","2695:744","2695:745"]},"2702:549":{"type":"RECTANGLE","id":"2702:549","name":"브레인에이블/W,ip","absoluteBoundingBox":{"x":-2902.0,"y":-244.0,"width":268.0,"height":39.0},"targetAspectRatio":{"x":491.0,"y":71.0},"isolatedAbsoluteRenderBounds":{"x":-2902.0,"y":-244.0,"width":268.0,"height":39.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,148.0]],"size":{"x":268.0,"y":39.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"fde0244a54e45655f579546c98baaa88b4e2d8c7","originalImageWidth":491,"originalImageHeight":71,"visible":true,"opacity":1.0,"rotation":0.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":150.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"},"scrollParallax":{"axis":"VERTICAL","speed":0.649999976158142,"relativeToPage":false,"behaviorType":"scrollParallax"}}},"2702:506":{"type":"RECTANGLE","id":"2702:506","name":"Logo","absoluteBoundingBox":{"x":-4216.0,"y":-431.0,"width":211.0,"height":75.0},"isolatedAbsoluteRenderBounds":{"x":-4216.0,"y":-431.0,"width":211.0,"height":75.0},"relativeTransform":[[1.0,0.0,33.0],[0.0,1.0,24.0]],"size":{"x":211.0,"y":75.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"64270238d3de4edd07597c9179b36856b5a53af3","originalImageWidth":1400,"originalImageHeight":1167,"visible":true,"opacity":1.0,"rotation":0.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Logomark","ariaAttributes":{},"interactions":[{"id":{"sessionID":2608,"localID":2148},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":0,"localID":3},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/"}],"isDeleted":false,"stateManagementVersion":1}]},"4:945":{"type":"TEXT","id":"4:945","name":"주식회사 브레인에이블은 두뇌 건강과 인지 능력 향상을 위한 과학 기반의 솔루션을 연구·개발하고 제공하는 뇌과학 전문 헬스테크 기업입니다. 신경과학, 교육공학, 디지털 치료기술을 융합하여 집중력, 기억력, 학습 능력, 실행 기능(Executive Function) 등 뇌 기능 향상에 도움을 주는 프로그램과 기기를 개발하고 있습니다.","absoluteBoundingBox":{"x":-2930.0,"y":749.5,"width":325.0,"height":229.0},"isolatedAbsoluteRenderBounds":{"x":-2929.51611328125,"y":756.325988769531,"width":317.767578125,"height":125.043029785156},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":325.0,"y":229.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"strokeWeight":3.45461630821228,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173],"characters":"주식회사 브레인에이블은 두뇌 건강과 인지 능력 향상을 위한 과학 기반의 솔루션을 연구·개발하고  제공하는 뇌과학 전문 헬스테크 \n기업입니다. \n신경과학, 교육공학, 디지털 치료기술을 융합하여 \n집중력, 기억력, 학습 능력, 실행 기능(Executive Function) 등\n뇌 기능 향상에 도움을 주는 프로그램과 기기를 개발하고 있습니다.","lineIndentations":[0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"3":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"4":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","fontVariantPosition":"NORMAL","fontSize":11.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.66,"letterSpacingValue":6.0,"letterSpacingUnit":"PERCENT","lineHeightPx":22.9899997711182,"lineHeightPercent":174.166641235352,"lineHeightPercentFontSize":208.999984741211,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{"173":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","fontSize":11.0,"letterSpacing":0.66,"letterSpacingValue":6.0,"letterSpacingUnit":"PERCENT","lineHeightPx":22.9899997711182,"lineHeightPercent":174.166641235352,"lineHeightPercentFontSize":208.999984741211,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"}}},"2695:742":{"type":"TEXT","id":"2695:742","name":"회사소개","absoluteBoundingBox":{"x":-2599.0,"y":-429.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-2598.8173828125,"y":-425.31201171875,"width":58.63623046875,"height":16.5120239257812},"relativeTransform":[[1.0,0.0,80.0],[0.0,1.0,0.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"회사소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"hyperlink":{"type":"NODE","nodeID":"/about_us"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"1:3":{"type":"FRAME","id":"1:3","name":"Tablet","absoluteBoundingBox":{"x":-2954.0,"y":-479.0,"width":800.0,"height":1963.0},"isolatedAbsoluteRenderBounds":{"x":-2954.0,"y":-479.0,"width":800.0,"height":1963.0},"relativeTransform":[[1.0,0.0,1408.0],[0.0,1.0,100.0]],"size":{"x":800.0,"y":1963.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"visible":false,"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"clipsContent":true,"overflowDirection":"VERTICAL_SCROLLING","layoutMode":"VERTICAL","counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","isBreakpointFrame":true,"children":["2695:746","2702:513","4:908","2119:1760","6:1426"]},"32:757":{"type":"FRAME","id":"32:757","name":"Slideshow navigation","absoluteBoundingBox":{"x":-5919.4443359375,"y":-1548.61108398438,"width":70.8888854980469,"height":10.222222328186},"isolatedAbsoluteRenderBounds":{"x":-5919.4443359375,"y":-1548.61108398438,"width":70.8888854980469,"height":10.222222328186},"relativeTransform":[[1.0,0.0,44.0],[0.0,1.0,6.88888883590698]],"size":{"x":70.8888854980469,"y":10.222222328186},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","children":["32:758","32:759","32:760","32:761"]},"32:677":{"type":"TEXT","id":"32:677","name":"\"평소 김치를 담그려면 마음을 먹고 담글 때까지도 한 달 이상 걸리던 제가 레이저에이블 테라피 20분씩, 3세션 이후 3일 내에 일을 처리하게 되었고 깜빡거리던 기억력이 개선되었습니다.\"","absoluteBoundingBox":{"x":-6203.0,"y":-1829.5,"width":638.0,"height":128.0},"isolatedAbsoluteRenderBounds":{"x":-6190.125,"y":-1823.46801757812,"width":606.14697265625,"height":117.984008789062},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":638.0,"y":128.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"characterStyleOverrides":[],"characters":"\"평소 김치를 담그려면 마음을 먹고 담글 때까지도 \n한 달 이상 걸리던 제가 \n레이저에이블 테라피 20분씩, 3세션 이후 3일 내에 일을 \n처리하게 되었고 깜빡거리던 기억력이 개선되었습니다.\" ","lineIndentations":[0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"3":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","textAlignHorizontal":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":24.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":2.16,"letterSpacingValue":9.0,"letterSpacingUnit":"PERCENT","lineHeightPx":32.4000015258789,"lineHeightPercent":112.499992370605,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"6:1463":{"type":"FRAME","id":"6:1463","name":"Footer copyright","absoluteBoundingBox":{"x":-2926.0,"y":654.0,"width":197.0,"height":40.0},"isolatedAbsoluteRenderBounds":{"x":-2926.0,"y":654.0,"width":197.0,"height":40.0},"relativeTransform":[[1.0,0.0,28.0],[0.0,1.0,404.0]],"size":{"x":197.0,"y":40.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","children":["6:1464"]},"4:985":{"type":"FRAME","id":"4:985","name":"Image breaker section","absoluteBoundingBox":{"x":-4298.0,"y":1672.0,"width":1280.0,"height":818.0},"isolatedAbsoluteRenderBounds":{"x":-4298.0,"y":1672.0,"width":1280.0,"height":818.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,1016.0]],"size":{"x":1280.0,"y":818.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"0498fd21cc66170e5afb7c43f3496d658b5ba682","originalImageWidth":2179,"originalImageHeight":3051,"visible":true,"opacity":1.0,"rotation":0.0},{"opacity":0.300000011920929,"blendMode":"NORMAL","type":"SOLID","color":{"r":0.125490203499794,"g":0.125490203499794,"b":0.125490203499794,"a":1.0},"visible":true}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","layoutGrow":1.0,"strokes":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Photo of rows of books in a library with marble busts.","ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingRight":10.0,"paddingBottom":10.0,"paddingLeft":10.0,"layoutMode":"VERTICAL","counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2102:310","2108:1142"]},"6:1464":{"type":"TEXT","id":"6:1464","name":"Brainable Co., LTD. © 2025 All Rights Reserved","absoluteBoundingBox":{"x":-2926.0,"y":654.0,"width":197.0,"height":40.0},"isolatedAbsoluteRenderBounds":{"x":-2924.7119140625,"y":658.835998535156,"width":179.171875,"height":32.4320068359375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":197.0,"y":40.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Brainable Co., LTD.\n © 2025 All Rights Reserved","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"styleIdForText":"StyleId:6:1356","fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"styleIdForText":"StyleId:6:1356","fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"styleIdForText":"StyleId:6:1356","fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":0.0,"name":"Mobile","style":{"styleIdForText":"StyleId:6:1356","fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":14.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":107.692314147949,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"4:926":{"type":"TEXT","id":"4:926","name":"BrainAble, 두뇌의 가능성을 깨우다.","absoluteBoundingBox":{"x":-4101.5,"y":1017.5,"width":1139.0,"height":50.0},"isolatedAbsoluteRenderBounds":{"x":-4098.662109375,"y":1027.61499023438,"width":583.5234375,"height":35.3759765625},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,98.5]],"size":{"x":1139.0,"y":50.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"H2","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"BrainAble, 두뇌의 가능성을 깨우다.","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","textAlignVertical":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Black","fontStyle":"Black","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":33.0,"textAlignHorizontal":"LEFT","textAlignVertical":"CENTER","letterSpacing":3.3,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":49.5,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2695:739":{"type":"RECTANGLE","id":"2695:739","name":"Logo","absoluteBoundingBox":{"x":-2890.0,"y":-455.0,"width":211.0,"height":75.0},"isolatedAbsoluteRenderBounds":{"x":-2890.0,"y":-455.0,"width":211.0,"height":75.0},"relativeTransform":[[1.0,0.0,64.0],[0.0,1.0,24.0]],"size":{"x":211.0,"y":75.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"64270238d3de4edd07597c9179b36856b5a53af3","originalImageWidth":1400,"originalImageHeight":1167,"visible":true,"opacity":1.0,"rotation":0.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Logomark","ariaAttributes":{},"interactions":[{"id":{"sessionID":2608,"localID":4807},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":0,"localID":3},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/"}],"isDeleted":false,"stateManagementVersion":1}]},"2149:3586":{"type":"TEXT","id":"2149:3586","name":"Hear From Our Clients","absoluteBoundingBox":{"x":-2859.0,"y":2759.0,"width":185.0,"height":88.0},"isolatedAbsoluteRenderBounds":{"x":-2841.3798828125,"y":2765.416015625,"width":150.416748046875,"height":59.031982421875},"relativeTransform":[[1.0,0.0,276.5],[0.0,1.0,0.0]],"size":{"x":185.0,"y":88.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"H2","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Hear From Our Clients","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAlignHorizontal":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","fontVariantPosition":"NORMAL","fontSize":32.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":-1.6,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":34.8800010681152,"lineHeightPercent":90.8333282470703,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"6:1456":{"type":"FRAME","id":"6:1456","name":"Contact column 2","absoluteBoundingBox":{"x":-2626.0,"y":546.0,"width":255.0,"height":60.0},"isolatedAbsoluteRenderBounds":{"x":-2626.0,"y":546.0,"width":255.0,"height":60.0},"relativeTransform":[[1.0,0.0,300.0],[0.0,1.0,0.0]],"size":{"x":255.0,"y":60.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":2.0,"primaryAxisAlignItems":"CENTER","children":["6:1457"]},"6:1457":{"type":"TEXT","id":"6:1457","name":"서울특별시 서초구 마방로 6길 28, 5층 502호","absoluteBoundingBox":{"x":-2626.0,"y":546.0,"width":255.0,"height":60.0},"isolatedAbsoluteRenderBounds":{"x":-2625.6220703125,"y":550.421997070312,"width":193.083251953125,"height":32.6420288085938},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":255.0,"y":60.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"hover":{"transition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.300000011920929,"delay":0.0},"state":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.699999988079071},"behaviorType":"hover"}},"characterStyleOverrides":[],"characters":"서울특별시 서초구 마방로 6길 28, \n5층 502호\n","lineIndentations":[0,0,0],"lineTypes":["NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":14.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":116.666664123535,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"6:1455":{"type":"TEXT","id":"6:1455","name":"010-8123-7857","absoluteBoundingBox":{"x":-2926.0,"y":546.0,"width":255.0,"height":20.0},"isolatedAbsoluteRenderBounds":{"x":-2925.30004882812,"y":550.835998535156,"width":96.132080078125,"height":10.3880004882812},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":255.0,"y":20.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"hover":{"transition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.300000011920929,"delay":0.0},"state":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.699999988079071},"behaviorType":"hover"}},"characterStyleOverrides":[3,3,3,3,3,3,3,3,3,3,3,3,3],"characters":"010-8123-7857","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"styleIdForText":"StyleId:6:1356","fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"styleIdForText":"StyleId:6:1356","fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"styleIdForText":"StyleId:6:1356","fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":0.0,"name":"Mobile","style":{"styleIdForText":"StyleId:6:1356","fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":14.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":107.692314147949,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{"3":{"styleIdForText":"StyleId:6:1356","fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"styleIdForText":"StyleId:6:1356","fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"styleIdForText":"StyleId:6:1356","fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":0.0,"name":"Mobile","style":{"styleIdForText":"StyleId:6:1356","fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","isOverrideOverTextStyle":true,"fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"lineHeightPx":19.6000003814697,"lineHeightPercent":107.692314147949,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%","inheritTextStyleId":"6:1356","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"}}},"2695:756":{"type":"RECTANGLE","id":"2695:756","name":"Logo","absoluteBoundingBox":{"x":-2890.0,"y":-455.0,"width":211.0,"height":75.0},"isolatedAbsoluteRenderBounds":{"x":-2890.0,"y":-455.0,"width":211.0,"height":75.0},"relativeTransform":[[1.0,0.0,64.0],[0.0,1.0,24.0]],"size":{"x":211.0,"y":75.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"64270238d3de4edd07597c9179b36856b5a53af3","originalImageWidth":1400,"originalImageHeight":1167,"visible":true,"opacity":1.0,"rotation":0.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Logomark","ariaAttributes":{},"interactions":[]},"6:1454":{"type":"TEXT","id":"6:1454","name":"hello@brainable.co.kr","absoluteBoundingBox":{"x":-2926.0,"y":546.0,"width":255.0,"height":20.0},"isolatedAbsoluteRenderBounds":{"x":-2926.0,"y":546.0,"width":255.0,"height":20.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":255.0,"y":20.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"visible":false,"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"hover":{"transition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.300000011920929,"delay":0.0},"state":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.699999988079071},"behaviorType":"hover"}},"characterStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1],"characters":"hello@brainable.co.kr","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"styleIdForText":"StyleId:6:1356","fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","hyperlink":{"type":"URL","url":"mailto:hello@figma.com","openInNewTab":true},"textAutoResize":"HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"styleIdForText":"StyleId:6:1356","fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"styleIdForText":"StyleId:6:1356","fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":0.0,"name":"Mobile","style":{"styleIdForText":"StyleId:6:1356","fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":14.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":107.692314147949,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{"1":{"styleIdForText":"StyleId:6:1356","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100}}},"2119:1765":{"type":"FRAME","id":"2119:1765","name":"Welcome body paragraphs","absoluteBoundingBox":{"x":-2802.0,"y":2689.0,"width":942.0,"height":96.0},"isolatedAbsoluteRenderBounds":{"x":-2802.0,"y":2689.0,"width":942.0,"height":96.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":942.0,"y":96.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","layoutWrap":"WRAP","itemSpacing":48.0,"primaryAxisSizingMode":"FIXED","counterAxisSpacing":48.0,"children":["2119:1766"]},"6:1450":{"type":"FRAME","id":"6:1450","name":"Footer subhead","absoluteBoundingBox":{"x":-2926.0,"y":482.0,"width":744.0,"height":16.0},"isolatedAbsoluteRenderBounds":{"x":-2926.0,"y":482.0,"width":744.0,"height":16.0},"relativeTransform":[[1.0,0.0,28.0],[0.0,1.0,232.0]],"size":{"x":744.0,"y":16.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["6:1451"]},"6:1427":{"type":"FRAME","id":"6:1427","name":"Footer header","absoluteBoundingBox":{"x":-2926.0,"y":318.0,"width":443.0,"height":116.0},"isolatedAbsoluteRenderBounds":{"x":-2926.0,"y":318.0,"width":443.0,"height":116.0},"relativeTransform":[[1.0,0.0,28.0],[0.0,1.0,68.0]],"size":{"x":443.0,"y":116.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":24.0,"counterAxisSizingMode":"FIXED","children":["2109:1180","2109:1176"]},"5:1336":{"type":"TEXT","id":"5:1336","name":"서울특별시 서초구 마방로 6길 28, 5층 502호","absoluteBoundingBox":{"x":-2774.0,"y":4004.0,"width":155.0,"height":75.0},"isolatedAbsoluteRenderBounds":{"x":-2773.70288085938,"y":4007.90307617188,"width":151.7080078125,"height":27.932861328125},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,1.0]],"size":{"x":155.0,"y":75.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"hover":{"transition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.300000011920929,"delay":0.0},"state":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.699999988079071},"behaviorType":"hover"}},"characterStyleOverrides":[],"characters":"서울특별시 서초구 마방로 6길 28, \n5층 502호\n","lineIndentations":[0,0,0],"lineTypes":["NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","fontVariantPosition":"NORMAL","fontSize":11.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":17.8199996948242,"lineHeightPercent":135.0,"lineHeightPercentFontSize":162.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2695:738":{"type":"FRAME","id":"2695:738","name":"Header 1","absoluteBoundingBox":{"x":-2954.0,"y":-479.0,"width":375.0,"height":123.0},"isolatedAbsoluteRenderBounds":{"x":-2954.0,"y":-479.0,"width":375.0,"height":123.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":375.0,"y":123.0},"fills":[],"visible":false,"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"HEADER","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":24.0,"paddingRight":64.0,"paddingBottom":24.0,"paddingLeft":64.0,"layoutMode":"HORIZONTAL","itemSpacing":16.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED","children":["2695:739","2695:740"]},"4:743":{"type":"TEXT","id":"4:743","name":"Header/Header 1","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":40.0,"height":48.0},"isolatedAbsoluteRenderBounds":{"x":0.0,"y":13.4159984588623,"width":39.2022514343262,"height":31.488000869751},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":40.0,"y":48.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","textAutoResize":"WIDTH_AND_HEIGHT","responsiveTextStyleVariants":[{"minWidth":1200.0,"name":"Desktop","style":{"fontSize":32.0,"letterSpacing":-1.6,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":34.8800010681152,"lineHeightPercent":93.0133361816406,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"fontSize":32.0,"letterSpacing":-1.6,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":34.8800010681152,"lineHeightPercent":93.0133361816406,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":1.0,"name":"Mobile","style":{"fontSize":22.0,"letterSpacing":-1.1,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.980001449585,"lineHeightPercent":93.0133361816406,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":32.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":1.28,"letterSpacingValue":4.0,"letterSpacingUnit":"PERCENT","lineHeightPx":48.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"4:928":{"type":"FRAME","id":"4:928","name":"Welcome body paragraphs","absoluteBoundingBox":{"x":-4101.5,"y":1102.5,"width":1139.0,"height":331.0},"isolatedAbsoluteRenderBounds":{"x":-4101.5,"y":1102.5,"width":1139.0,"height":331.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":1139.0,"y":331.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","layoutWrap":"WRAP","itemSpacing":48.0,"primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","counterAxisSpacing":48.0,"children":["4:929"]},"2109:1180":{"type":"RECTANGLE","id":"2109:1180","name":"brainable_logo_ver.001-01 1","absoluteBoundingBox":{"x":-2926.0,"y":318.0,"width":139.0,"height":116.0},"targetAspectRatio":{"x":1400.0,"y":1167.0},"isolatedAbsoluteRenderBounds":{"x":-2926.0,"y":318.0,"width":139.0,"height":116.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":139.0,"y":116.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"4f89b370cf29c22c8bfd83ffd6ad48b1dd2cd6af","originalImageWidth":1400,"originalImageHeight":1167,"visible":true,"opacity":1.0,"rotation":0.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[]},"2702:534":{"type":"TEXT","id":"2702:534","name":"Pioneer of the wellness-tech solution","absoluteBoundingBox":{"x":-4241.0,"y":-67.0,"width":562.0,"height":119.0},"isolatedAbsoluteRenderBounds":{"x":-4240.52001953125,"y":-25.9280014038086,"width":198.667236328125,"height":37.1360015869141},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,-151.0]],"size":{"x":562.0,"y":119.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Pioneer of  the \nwellness-tech solution","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAlignVertical":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Light","fontStyle":"Light","hangingPunctuation":true,"textCase":"TITLE","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"CENTER","letterSpacing":1.6,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"4:952":{"type":"FRAME","id":"4:952","name":"Welcome content","absoluteBoundingBox":{"x":-2930.0,"y":660.5,"width":327.0,"height":415.0},"isolatedAbsoluteRenderBounds":{"x":-2930.0,"y":660.5,"width":327.0,"height":415.0},"relativeTransform":[[1.0,0.0,476.5],[0.0,1.0,72.5]],"size":{"x":327.0,"y":415.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"layoutMode":"VERTICAL","itemSpacing":24.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["4:942","4:943"]},"2695:764":{"type":"FRAME","id":"2695:764","name":"Header 1","absoluteBoundingBox":{"x":-2910.0,"y":-455.0,"width":277.0,"height":382.0},"isolatedAbsoluteRenderBounds":{"x":-2910.0,"y":-455.0,"width":277.0,"height":382.0},"relativeTransform":[[1.0,0.0,44.0],[0.0,1.0,24.0]],"size":{"x":277.0,"y":382.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"HEADER","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":24.0,"paddingRight":33.0,"paddingBottom":24.0,"paddingLeft":33.0,"layoutMode":"VERTICAL","itemSpacing":16.0,"counterAxisAlignItems":"CENTER","children":["2695:765","2695:766"]},"5:1330":{"type":"TEXT","id":"5:1330","name":"Pioneer of the Wellness-tech Solution.","absoluteBoundingBox":{"x":-2922.0,"y":3918.0,"width":311.0,"height":28.0},"isolatedAbsoluteRenderBounds":{"x":-2920.98999023438,"y":3920.90991210938,"width":271.185302734375,"height":8.219970703125},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":311.0,"y":28.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"TOP","horizontal":"SCALE"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"right":{"pixelOffset":0.0,"sizeFraction":1.0},"top":{"pixelOffset":0.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Pioneer of the Wellness-tech Solution.","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","fontVariantPosition":"NORMAL","fontSize":10.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":2.6,"letterSpacingValue":26.0,"letterSpacingUnit":"PERCENT","lineHeightPx":13.5,"lineHeightPercent":112.499992370605,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2149:3575":{"type":"FRAME","id":"2149:3575","name":"Our clients content","absoluteBoundingBox":{"x":-2749.0,"y":3394.0,"width":738.0,"height":1035.0},"isolatedAbsoluteRenderBounds":{"x":-2749.0,"y":3394.0,"width":738.0,"height":1035.0},"relativeTransform":[[1.0,0.0,271.0],[0.0,1.0,276.0]],"size":{"x":738.0,"y":1035.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","maxWidth":942.0,"strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":56.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","isInAnimateTree":true,"children":["2149:3576","2224:2676","2149:3579","2149:3580"]},"2149:3580":{"type":"FRAME","id":"2149:3580","name":"Our clients outro","absoluteBoundingBox":{"x":-2749.0,"y":4369.0,"width":738.0,"height":60.0},"isolatedAbsoluteRenderBounds":{"x":-2749.0,"y":4369.0,"width":738.0,"height":60.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,975.0]],"size":{"x":738.0,"y":60.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2149:3581"]},"2149:3581":{"type":"TEXT","id":"2149:3581","name":"브레인에이블과 함께 내 숨겨진 잠재력을 찾고 향상된 일상의 즐거움을 찾아 보세요. 지금 바로 문의주세요.","absoluteBoundingBox":{"x":-2620.0,"y":4369.0,"width":480.0,"height":60.0},"isolatedAbsoluteRenderBounds":{"x":-2614.52099609375,"y":4371.98779296875,"width":467.657470703125,"height":40.43408203125},"relativeTransform":[[1.0,0.0,129.0],[0.0,1.0,0.0]],"size":{"x":480.0,"y":60.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutGrow":1.0,"maxWidth":480.0,"strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"브레인에이블과 함께 내 숨겨진 잠재력을 찾고 향상된 일상의 즐거움을 찾아 보세요. 지금 바로 문의주세요.","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAlignHorizontal":"CENTER","style":{"styleIdForText":"StyleId:6:1353","fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"styleIdForText":"StyleId:6:1353","fontSize":18.0,"letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":115.199996948242,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":103.846160888672,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2149:4138":{"type":"FRAME","id":"2149:4138","name":"Offering content","absoluteBoundingBox":{"x":-3296.5,"y":1549.0,"width":137.0,"height":29.0},"isolatedAbsoluteRenderBounds":{"x":-3296.5,"y":1549.0,"width":137.0,"height":29.0},"relativeTransform":[[1.0,0.0,110.0],[0.0,1.0,148.0]],"size":{"x":137.0,"y":29.0},"fills":[],"constraintValues":{"left":{"pixelOffset":110.0,"sizeFraction":0.0},"top":{"pixelOffset":148.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","layoutPositioning":"ABSOLUTE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED","children":[]},"2702:547":{"type":"FRAME","id":"2702:547","name":"Header content","absoluteBoundingBox":{"x":-2902.0,"y":-392.0,"width":1641.0,"height":290.0},"isolatedAbsoluteRenderBounds":{"x":-2902.0,"y":-501.928009033203,"width":1641.0,"height":399.928009033203},"relativeTransform":[[1.0,0.0,2.0],[0.0,1.0,0.0]],"size":{"x":1641.0,"y":290.0},"fills":[],"constraintValues":{"left":{"pixelOffset":2.0,"sizeFraction":0.0},"top":{"pixelOffset":0.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":150.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"},"scrollParallax":{"axis":"VERTICAL","speed":0.649999976158142,"relativeToPage":false,"behaviorType":"scrollParallax"}},"paddingTop":95.0,"paddingBottom":103.0,"layoutMode":"VERTICAL","itemSpacing":180.0,"primaryAxisAlignItems":"MAX","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2702:548","2702:549","2702:550"]},"2109:1349":{"type":"GROUP","id":"2109:1349","name":"LISTENINGABLE","absoluteBoundingBox":{"x":-4149.0,"y":3752.5,"width":964.0,"height":248.0},"isolatedAbsoluteRenderBounds":{"x":-4152.01611328125,"y":3752.5,"width":967.01611328125,"height":248.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,836.5]],"size":{"x":964.0,"y":248.0},"fills":[],"constraints":{"vertical":"TOP","horizontal":"SCALE"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"right":{"pixelOffset":0.0,"sizeFraction":0.981670061099796},"top":{"pixelOffset":836.5,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"children":["2109:1350","2109:1351","2109:1352"]},"2224:2677":{"mainComponentId":"6:1477","type":"INSTANCE","id":"2224:2677","name":"Button Dark","absoluteBoundingBox":{"x":-2808.0,"y":3578.0,"width":83.0,"height":39.0},"isolatedAbsoluteRenderBounds":{"x":-2808.0,"y":3578.0,"width":83.0,"height":39.0},"relativeTransform":[[1.0,0.0,327.5],[0.0,1.0,819.0]],"size":{"x":83.0,"y":39.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":193,"localID":83},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":2090,"localID":90},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/센터소개"}],"isDeleted":false,"stateManagementVersion":1},{"id":{"sessionID":9,"localID":2665},"event":{"interactionType":"ON_HOVER"},"actions":[{"transitionNodeID":{"sessionID":6,"localID":1477},"transitionType":"SMART_ANIMATE","transitionDuration":0.300000011920929,"easingType":"OUT_CUBIC","easingFunction":[0.0,0.0,0.579999983310699,1.0],"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","transitionResetVideoPosition":false,"stateGroupContext":"6:1478"}],"isDeleted":false,"stateManagementVersion":1}],"rectangleCornerRadii":[500.0,500.0,500.0,500.0],"cornerRadius":500.0,"paddingTop":18.0,"paddingRight":24.0,"paddingBottom":18.0,"paddingLeft":24.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["I2224:2677;6:1476"],"componentSetId":"6:1478","componentProperties":{"Property 1":{"value":"Hover","type":"VARIANT","boundVariables":{}}},"overrides":[{"key":[],"value":{"behaviors":null,"counterAxisSizingMode":"FIXED","fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","size":{"x":83.0,"y":39.0},"interactions":[{"id":{"sessionID":193,"localID":83},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":2090,"localID":90},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/센터소개"}],"isDeleted":false,"stateManagementVersion":1},{"id":{"sessionID":9,"localID":2665},"event":{"interactionType":"ON_HOVER"},"actions":[{"transitionNodeID":{"sessionID":6,"localID":1477},"transitionType":"SMART_ANIMATE","transitionDuration":0.300000011920929,"easingType":"OUT_CUBIC","easingFunction":[0.0,0.0,0.579999983310699,1.0],"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","transitionResetVideoPosition":false,"stateGroupContext":"6:1478"}],"isDeleted":false,"stateManagementVersion":1},{"id":{"sessionID":9,"localID":2659},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":6,"localID":1477},"transitionType":"SMART_ANIMATE","transitionDuration":0.300000011920929,"easingType":"OUT_CUBIC","easingFunction":[0.0,0.0,0.579999983310699,1.0],"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","transitionResetVideoPosition":false}],"isDeleted":true,"stateManagementVersion":1},{"id":{"sessionID":9,"localID":2662},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"URL","connectionURL":"figma.com/sites","openUrlInNewTab":true}],"isDeleted":true,"stateManagementVersion":1},{"id":{"sessionID":10,"localID":3480},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":9,"localID":2725},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","openUrlInNewTab":true}],"isDeleted":true,"stateManagementVersion":1}]},"componentId":"6:1477"},{"key":["제품소개0"],"value":{"characterStyleOverrides":[],"characters":"CONTACTS","fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","hyperlink":{"type":"NODE","nodeID":"/센터소개"},"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":11.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.22,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":13.2000007629395,"lineHeightPercent":100.0,"lineHeightPercentFontSize":120.000007629395,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"lineHeightPercent":null,"lineHeightPercentFontSize":null,"lineHeightPx":null,"lineHeightUnit":null,"lineIndentations":[0],"lineStyleOverrides":[0],"lineTypes":["NONE"],"name":"회사소개","openTypeFlags":null,"styleOverrideTable":{},"text":null,"textAlignVertical":"CENTER","textDecoration":null,"textDecorationSkipInk":null},"componentId":"6:1477"}]},"2702:546":{"type":"TEXT","id":"2702:546","name":"Brainable Co., LTD.","absoluteBoundingBox":{"x":-2904.0,"y":-112.0,"width":1368.0,"height":292.0},"isolatedAbsoluteRenderBounds":{"x":-2903.03100585938,"y":30.4379997253418,"width":96.998779296875,"height":9.32899856567383},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,280.0]],"size":{"x":1368.0,"y":292.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.949019610881805,"g":0.949019610881805,"b":0.949019610881805,"a":1.0},"visible":true,"opacity":1.0}],"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"top":{"pixelOffset":280.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"H3","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Brainable Co., LTD.","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAlignVertical":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-DemiLight","fontStyle":"DemiLight","fontVariantPosition":"NORMAL","fontSize":9.5,"textAlignHorizontal":"LEFT","textAlignVertical":"CENTER","letterSpacing":0.95,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":12.8249998092651,"lineHeightPercent":112.499992370605,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2119:1768":{"type":"FRAME","id":"2119:1768","name":"Image breaker section","absoluteBoundingBox":{"x":-2954.0,"y":3010.0,"width":800.0,"height":390.624938964844},"isolatedAbsoluteRenderBounds":{"x":-2954.0,"y":3010.0,"width":800.0,"height":390.625},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,2689.0]],"size":{"x":800.0,"y":390.624938964844},"fills":[{"opacity":0.300000011920929,"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"8936bff9bdf0e1071beac9eac5b2331ec4cf27cc","originalImageWidth":4096,"originalImageHeight":2731,"visible":true,"rotation":0.0},{"opacity":0.200000002980232,"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true},{"opacity":0.200000002980232,"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","layoutGrow":1.0,"strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Photo of rows of books in a library with marble busts.","ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"paddingTop":10.0,"paddingRight":10.0,"paddingBottom":10.0,"paddingLeft":10.0,"clipsContent":true,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2119:1769","2119:1772"]},"64:99":{"type":"SVG","id":"64:99","name":"Right arrow","absoluteBoundingBox":{"x":-5828.5556640625,"y":-1555.5,"width":24.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":-5828.5556640625,"y":-1555.5,"width":24.0,"height":24.0},"relativeTransform":[[1.0,0.0,134.888885498047],[0.0,1.0,0.0]],"size":{"x":24.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Arrow icons that navigate through customer testimonial quotes.","ariaAttributes":{},"interactions":[{"id":{"sessionID":162,"localID":182},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":32,"localID":809},"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","stateGroupContext":"32:813"}],"isDeleted":false,"stateManagementVersion":1}],"hash":"06243902d099512128dcc1355a48e5c992aa106c"},"32:788":{"type":"TEXT","id":"32:788","name":"\"만성적인 무기력, 불안, 우울, 브레인 포그 증상이 있었습니다. 레이저에이블을 사용하면 머리가 맑아지는 느낌이 있었고, 반복 사용할수록 그 맑은 상태가 조금씩 더 오래 유지됐습니다. 사용 후 몸에 에너지가 생기는 변화가 있었고, 그 덕분에 무기력에서 벗어나 운동을 시작할 수 있을 정도로 힘이 회복되었습니다. 운동을 병행하면서 전반적인 컨디션도 더 안정되는 편이었습니다. 헬멧은 착용이 편하고 조작이 단순해 사용 과정에 부담이 거의 없었습니다. 전체적으로 브레인포그 완화와 에너지 증가에 도움이 되었고, 무기력 상태에서 벗어나는 데 긍정적인 변화를 경험했습니다.\"","absoluteBoundingBox":{"x":-6203.0,"y":-759.0,"width":638.0,"height":448.0},"isolatedAbsoluteRenderBounds":{"x":-6198.736328125,"y":-752.968017578125,"width":628.4267578125,"height":437.984008789062},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":638.0,"y":448.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"characterStyleOverrides":[],"characters":"\"만성적인 무기력, 불안, 우울, 브레인 포그 \n증상이 있었습니다. \n레이저에이블을 사용하면 머리가 맑아지는 느낌이 있었고, 반복 사용할수록 그 맑은 상태가 조금씩 더 오래 유지됐습니다.\n사용 후 몸에 에너지가 생기는 변화가 있었고, 그 덕분에 무기력에서 벗어나 운동을 시작할 수 있을 정도로 힘이 회복되었습니다. 운동을 병행하면서 전반적인 컨디션도 더 안정되는 \n편이었습니다.\n\n헬멧은 착용이 편하고 조작이 단순해 사용 \n과정에 부담이 거의 없었습니다.\n\n전체적으로 브레인포그 완화와 에너지 증가에 도움이 되었고, 무기력 상태에서 벗어나는 데 긍정적인 변화를 경험했습니다.\"","lineIndentations":[0,0,0,0,0,0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0,0,0,0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"3":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"4":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"5":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"6":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"7":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"8":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"9":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","textAlignHorizontal":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":24.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":0.96,"letterSpacingValue":4.0,"letterSpacingUnit":"PERCENT","lineHeightPx":32.4000015258789,"lineHeightPercent":112.499992370605,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2109:1308":{"type":"TEXT","id":"2109:1308","name":"브레인에이블만의 자체적인 뇌과학 연구개발을 통해 독보적 기술력으로 만들어진 PBM 테라피 장비 입니다. 가장 안전하고 효과적인 광자극(tPBM)을 통해 뇌 기능 향상에 최적화된 브레인 웰니스 디바이스 입니다.","absoluteBoundingBox":{"x":-4149.0,"y":3132.5,"width":916.0,"height":82.0},"isolatedAbsoluteRenderBounds":{"x":-4148.2001953125,"y":3138.2041015625,"width":783.251953125,"height":41.575927734375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,216.5]],"size":{"x":916.0,"y":82.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"TOP","horizontal":"SCALE"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"right":{"pixelOffset":0.0,"sizeFraction":1.0},"top":{"pixelOffset":216.5,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],"characters":"브레인에이블만의 자체적인 뇌과학 연구개발을 통해 독보적 기술력으로 만들어진 PBM 테라피 장비 입니다. \n가장 안전하고 효과적인  광자극(tPBM)을 통해 뇌 기능 향상에 최적화된 브레인 웰니스 디바이스 입니다.\n\n","lineIndentations":[0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"3":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":11.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":1.1,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":17.2700004577637,"lineHeightPercent":130.83332824707,"lineHeightPercentFontSize":157.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{"6":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Black","fontStyle":"Black","fontSize":16.0,"paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100},"5":{"fontSize":16.0,"paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100}}},"5:1342":{"type":"FRAME","id":"5:1342","name":"Footer copyright","absoluteBoundingBox":{"x":-2922.0,"y":4106.0,"width":197.0,"height":26.0},"isolatedAbsoluteRenderBounds":{"x":-2922.0,"y":4106.0,"width":197.0,"height":26.0},"relativeTransform":[[1.0,0.0,32.0],[0.0,1.0,374.0]],"size":{"x":197.0,"y":26.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","children":["5:1343"]},"2119:1771":{"type":"RECTANGLE","id":"2119:1771","name":"brainable_logo_ver.001-02 1","absoluteBoundingBox":{"x":-2434.02001953125,"y":3293.0,"width":317.453308105469,"height":264.620025634766},"targetAspectRatio":{"x":1400.0,"y":1167.0},"isolatedAbsoluteRenderBounds":{"x":-2434.02001953125,"y":3293.0,"width":317.453369140625,"height":264.6201171875},"relativeTransform":[[1.0,0.0,394.980010986328],[0.0,1.0,-7.62939453125e-06]],"size":{"x":317.453308105469,"y":264.620025634766},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"5a2eead312ec2ae252dc5a353cb3f7a48575eadc","originalImageWidth":1400,"originalImageHeight":1167,"visible":true,"opacity":1.0,"rotation":0.0}],"constraintValues":{"left":{"pixelOffset":519.980010986328,"sizeFraction":0.0},"top":{"pixelOffset":282.999992370605,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[]},"6:1478":{"type":"COMPONENT_SET","id":"6:1478","name":"Button Dark","absoluteBoundingBox":{"x":-6273.0,"y":-2335.0,"width":242.0,"height":199.0},"isolatedAbsoluteRenderBounds":{"x":-6273.0,"y":-2335.0,"width":242.0,"height":199.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":242.0,"y":199.0},"fills":[],"strokeAlign":"INSIDE","strokeDashes":[10.0,5.0],"strokes":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.592156887054443,"g":0.278431385755539,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"children":["6:1477"],"componentPropertyDefinitions":{"Property 1":{"type":"VARIANT","defaultValue":"Default","variantOptions":["Default","Hover"]}}},"2109:1270":{"type":"TEXT","id":"2109:1270","name":"난독증진단장비","absoluteBoundingBox":{"x":-4149.0,"y":3307.0,"width":366.0,"height":26.0},"isolatedAbsoluteRenderBounds":{"x":-4151.1279296875,"y":3309.86401367188,"width":172.41259765625,"height":30.320068359375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":366.0,"y":26.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.720453143119812,"g":0.841228127479553,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"TOP","horizontal":"SCALE"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"right":{"pixelOffset":0.0,"sizeFraction":0.372708757637475},"top":{"pixelOffset":0.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[],"effects":[{"type":"DROP_SHADOW","visible":true,"color":{"r":0.0,"g":0.0,"b":0.0,"a":0.25},"blendMode":"NORMAL","offset":{"x":0.0,"y":4.0},"radius":4.0,"showShadowBehindNode":false,"spread":0.0}],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"난독증진단장비","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","fontVariantPosition":"NORMAL","fontSize":24.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":2.4,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":26.1599998474121,"lineHeightPercent":90.8333282470703,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2109:1181":{"type":"RECTANGLE","id":"2109:1181","name":"brainable_logo_ver.001-01 1","absoluteBoundingBox":{"x":-2922.0,"y":3822.5,"width":42.0,"height":35.0},"targetAspectRatio":{"x":1400.0,"y":1167.0},"isolatedAbsoluteRenderBounds":{"x":-2922.0,"y":3822.5,"width":42.0,"height":35.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,3.5]],"size":{"x":42.0,"y":35.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"4f89b370cf29c22c8bfd83ffd6ad48b1dd2cd6af","originalImageWidth":1400,"originalImageHeight":1167,"visible":true,"opacity":1.0,"rotation":0.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[]},"2149:3576":{"type":"FRAME","id":"2149:3576","name":"Our clients intro","absoluteBoundingBox":{"x":-2749.0,"y":3394.0,"width":738.0,"height":91.0},"isolatedAbsoluteRenderBounds":{"x":-2749.0,"y":3394.0,"width":738.0,"height":91.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":738.0,"y":91.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":32.0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","children":["2149:3577","2149:3578"]},"5:1298":{"type":"FRAME","id":"5:1298","name":"Footer copyright","absoluteBoundingBox":{"x":-4155.0,"y":6798.0,"width":994.0,"height":28.0},"isolatedAbsoluteRenderBounds":{"x":-4155.0,"y":6798.0,"width":994.0,"height":28.0},"relativeTransform":[[1.0,0.0,143.0],[0.0,1.0,559.0]],"size":{"x":994.0,"y":28.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["5:1299"]},"32:776":{"type":"FRAME","id":"32:776","name":"Carousel content","absoluteBoundingBox":{"x":-6203.0,"y":-1304.5,"width":638.0,"height":258.0},"isolatedAbsoluteRenderBounds":{"x":-6203.0,"y":-1304.5,"width":638.0,"height":258.0},"relativeTransform":[[1.0,0.0,50.0],[0.0,1.0,41.5]],"size":{"x":638.0,"y":258.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":80.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["32:777"]},"2149:3578":{"type":"TEXT","id":"2149:3578","name":"브레인에이블과 함께해주신 분들의 후기","absoluteBoundingBox":{"x":-2620.0,"y":3461.0,"width":480.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":-2522.564453125,"y":3464.916015625,"width":283.81640625,"height":16.595947265625},"relativeTransform":[[1.0,0.0,129.0],[0.0,1.0,67.0]],"size":{"x":480.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"브레인에이블과 함께해주신 분들의 후기","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","textAlignHorizontal":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":112.499992370605,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2224:2676":{"mainComponentId":"6:1477","type":"INSTANCE","id":"2224:2676","name":"Button Dark","absoluteBoundingBox":{"x":-2437.0,"y":3541.0,"width":114.0,"height":55.0},"isolatedAbsoluteRenderBounds":{"x":-2437.0,"y":3541.0,"width":114.0,"height":55.0},"relativeTransform":[[1.0,0.0,312.0],[0.0,1.0,147.0]],"size":{"x":114.0,"y":55.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":193,"localID":83},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":2090,"localID":90},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/센터소개"}],"isDeleted":false,"stateManagementVersion":1},{"id":{"sessionID":9,"localID":2665},"event":{"interactionType":"ON_HOVER"},"actions":[{"transitionNodeID":{"sessionID":6,"localID":1477},"transitionType":"SMART_ANIMATE","transitionDuration":0.300000011920929,"easingType":"OUT_CUBIC","easingFunction":[0.0,0.0,0.579999983310699,1.0],"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","transitionResetVideoPosition":false,"stateGroupContext":"6:1478"}],"isDeleted":false,"stateManagementVersion":1}],"rectangleCornerRadii":[500.0,500.0,500.0,500.0],"cornerRadius":500.0,"paddingTop":18.0,"paddingRight":24.0,"paddingBottom":18.0,"paddingLeft":24.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["I2224:2676;6:1476"],"componentSetId":"6:1478","componentProperties":{"Property 1":{"value":"Hover","type":"VARIANT","boundVariables":{}}},"overrides":[{"key":[],"value":{"behaviors":null,"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","size":{"x":114.0,"y":55.0},"interactions":[{"id":{"sessionID":193,"localID":83},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":2090,"localID":90},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/센터소개"}],"isDeleted":false,"stateManagementVersion":1},{"id":{"sessionID":9,"localID":2665},"event":{"interactionType":"ON_HOVER"},"actions":[{"transitionNodeID":{"sessionID":6,"localID":1477},"transitionType":"SMART_ANIMATE","transitionDuration":0.300000011920929,"easingType":"OUT_CUBIC","easingFunction":[0.0,0.0,0.579999983310699,1.0],"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","transitionResetVideoPosition":false,"stateGroupContext":"6:1478"}],"isDeleted":false,"stateManagementVersion":1},{"id":{"sessionID":9,"localID":2659},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":6,"localID":1477},"transitionType":"SMART_ANIMATE","transitionDuration":0.300000011920929,"easingType":"OUT_CUBIC","easingFunction":[0.0,0.0,0.579999983310699,1.0],"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","transitionResetVideoPosition":false}],"isDeleted":true,"stateManagementVersion":1},{"id":{"sessionID":9,"localID":2662},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"URL","connectionURL":"figma.com/sites","openUrlInNewTab":true}],"isDeleted":true,"stateManagementVersion":1},{"id":{"sessionID":10,"localID":3480},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":9,"localID":2725},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","openUrlInNewTab":true}],"isDeleted":true,"stateManagementVersion":1}]},"componentId":"6:1477"},{"key":["제품소개0"],"value":{"characterStyleOverrides":[],"characters":"CONTACTS","fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.32,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.2000007629395,"lineHeightPercent":100.0,"lineHeightPercentFontSize":120.000007629395,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"lineHeightPercent":null,"lineHeightPercentFontSize":null,"lineHeightPx":null,"lineHeightUnit":null,"lineIndentations":[0],"lineStyleOverrides":[0],"lineTypes":["NONE"],"name":"회사소개","openTypeFlags":null,"styleOverrideTable":{},"text":null,"textAlignVertical":"CENTER","textDecoration":null,"textDecorationSkipInk":null},"componentId":"6:1477"}]},"2119:1772":{"type":"TEXT","id":"2119:1772","name":"놀라운 기술력을 바탕으로, 세상에 없던 제품을 만듭니다.","absoluteBoundingBox":{"x":-3123.0,"y":3199.0,"width":1139.0,"height":216.0},"isolatedAbsoluteRenderBounds":{"x":-3021.40161132812,"y":3199.07202148438,"width":932.416015625,"height":118.98388671875},"relativeTransform":[[1.0,0.0,-169.0],[0.0,1.0,189.0]],"size":{"x":1139.0,"y":216.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"CENTER","horizontal":"CENTER"},"constraintValues":{"left":{"pixelOffset":-569.0,"sizeFraction":0.5},"right":{"pixelOffset":570.0,"sizeFraction":0.5},"top":{"pixelOffset":-6.31246948242188,"sizeFraction":0.5},"bottom":{"pixelOffset":209.687530517578,"sizeFraction":0.5}},"strokeAlign":"OUTSIDE","layoutPositioning":"ABSOLUTE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"characterStyleOverrides":[],"characters":"놀라운 기술력을 바탕으로, 세상에 없던\n제품을 만듭니다.","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAlignHorizontal":"CENTER","style":{"styleIdForText":"StyleId:2:722","fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","hangingPunctuation":true,"textCase":"TITLE","responsiveTextStyleVariants":[{"minWidth":1200.0,"name":"Desktop","style":{"styleIdForText":"StyleId:2:722","fontSize":76.0,"letterSpacing":-4.56,"letterSpacingValue":-6.0,"letterSpacingUnit":"PERCENT","lineHeightPx":72.1999969482422,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"styleIdForText":"StyleId:2:722","fontSize":64.0,"letterSpacing":-3.84,"letterSpacingValue":-6.0,"letterSpacingUnit":"PERCENT","lineHeightPx":60.7999992370605,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":1.0,"name":"Mobile","style":{"styleIdForText":"StyleId:2:722","paragraphSpacing":12.0,"fontSize":36.0,"letterSpacing":-2.16,"letterSpacingValue":-6.0,"letterSpacingUnit":"PERCENT","lineHeightPx":34.2000007629395,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":64.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":-3.84,"letterSpacingValue":-6.0,"letterSpacingUnit":"PERCENT","lineHeightPx":60.7999992370605,"lineHeightPercent":73.0769271850586,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2119:1769":{"type":"GROUP","id":"2119:1769","name":"Brainable 로고","absoluteBoundingBox":{"x":-2829.0,"y":3293.0,"width":393.433288574219,"height":264.620025634766},"isolatedAbsoluteRenderBounds":{"x":-2829.0,"y":3293.0,"width":393.433288574219,"height":264.620025634766},"relativeTransform":[[1.0,0.0,125.0],[0.0,1.0,283.0]],"size":{"x":393.433288574219,"y":264.620025634766},"fills":[],"visible":false,"constraints":{"vertical":"TOP","horizontal":"LEFT"},"constraintValues":{"left":{"pixelOffset":125.0,"sizeFraction":0.0},"top":{"pixelOffset":283.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","layoutPositioning":"ABSOLUTE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"children":["2119:1770","2119:1771"]},"64:698":{"type":"FRAME","id":"64:698","name":"Slideshow navigation","absoluteBoundingBox":{"x":-5919.4443359375,"y":-959.611083984375,"width":70.8888854980469,"height":10.222222328186},"isolatedAbsoluteRenderBounds":{"x":-5919.4443359375,"y":-959.611083984375,"width":70.8888854980469,"height":10.2222290039062},"relativeTransform":[[1.0,0.0,283.555541992188],[0.0,1.0,6.88888883590698]],"size":{"x":70.8888854980469,"y":10.222222328186},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","children":["64:699","64:700","64:701","64:702"]},"2119:1766":{"type":"TEXT","id":"2119:1766","name":"주식회사 브레인에이블은 두뇌 건강과 인지 능력 향상을 위한 과학 기반의 솔루션을 연구·개발하고 제공하는 뇌과학 전문 헬스테크 기업입니다. 신경과학, 교육공학, 디지털 치료기술을 융합하여 집중력, 기억력, 학습 능력, 실행 기능(Executive Function) 향상에 도움을 주는 프로그램과 기기를 개발하고 있습니다.","absoluteBoundingBox":{"x":-2802.0,"y":2689.0,"width":942.0,"height":96.0},"isolatedAbsoluteRenderBounds":{"x":-2801.19995117188,"y":2693.65600585938,"width":815.935913085938,"height":86.60791015625},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":942.0,"y":96.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutGrow":1.0,"strokes":[],"strokeWeight":3.45461630821228,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"주식회사 브레인에이블은 두뇌 건강과 인지 능력 향상을 위한 과학 기반의 솔루션을 연구·개발하고 제공하는 \n뇌과학 전문 헬스테크 기업입니다. \n신경과학, 교육공학, 디지털 치료기술을 융합하여 집중력, 기억력, 학습 능력, 실행 기능(Executive Function)\n향상에 도움을 주는 프로그램과 기기를 개발하고 있습니다.","lineIndentations":[0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"3":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":1.6,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2109:1178":{"type":"RECTANGLE","id":"2109:1178","name":"brainable_logo_ver.001-01 1","absoluteBoundingBox":{"x":-4169.0,"y":6253.5,"width":117.0,"height":97.0},"targetAspectRatio":{"x":1400.0,"y":1167.0},"isolatedAbsoluteRenderBounds":{"x":-4169.0,"y":6253.5,"width":117.0,"height":97.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,14.5]],"size":{"x":117.0,"y":97.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"4f89b370cf29c22c8bfd83ffd6ad48b1dd2cd6af","originalImageWidth":1400,"originalImageHeight":1167,"visible":true,"opacity":1.0,"rotation":0.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[]},"2149:4156":{"type":"TEXT","id":"2149:4156","name":"언어발달장애, 난독증 치료의 기본이 되는 소리의 미세 차이 구별 훈련을 통한 청취와 발성 능력 향상 솔루션 입니다.","absoluteBoundingBox":{"x":-2904.5,"y":2381.0,"width":267.0,"height":54.0},"isolatedAbsoluteRenderBounds":{"x":-2903.99389648438,"y":2384.84790039062,"width":264.993408203125,"height":28.076171875},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,115.0]],"size":{"x":267.0,"y":54.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"TOP","horizontal":"SCALE"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"right":{"pixelOffset":0.0,"sizeFraction":1.0},"top":{"pixelOffset":115.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"언어발달장애, 난독증 치료의 기본이 되는 소리의 미세 차이 구별 훈련을 통한 청취와 발성 능력 향상 솔루션 입니다.\n","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":11.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.11,"letterSpacingValue":1.0,"letterSpacingUnit":"PERCENT","lineHeightPx":17.9300003051758,"lineHeightPercent":135.83332824707,"lineHeightPercentFontSize":163.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2695:697":{"type":"TEXT","id":"2695:697","name":"제품소개","absoluteBoundingBox":{"x":-3232.0,"y":-418.5,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-3231.8173828125,"y":-414.81201171875,"width":58.63623046875,"height":16.5120239257812},"relativeTransform":[[1.0,0.0,262.0],[0.0,1.0,0.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"커뮤니티","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"hyperlink":{"type":"NODE","nodeID":"/커뮤니티Articles"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2702:525":{"type":"FRAME","id":"2702:525","name":"Nav","absoluteBoundingBox":{"x":-2796.0,"y":-340.0,"width":59.0,"height":243.0},"isolatedAbsoluteRenderBounds":{"x":-2796.0,"y":-340.0,"width":59.0,"height":243.0},"relativeTransform":[[1.0,0.0,109.0],[0.0,1.0,115.0]],"size":{"x":59.0,"y":243.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"NAV","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":2608,"localID":1766},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":6,"localID":1529},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/about_us"}],"isDeleted":false,"stateManagementVersion":1}],"behaviors":{"hover":{"transition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.300000011920929,"delay":0.0},"state":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"behaviorType":"hover"}},"layoutMode":"VERTICAL","itemSpacing":32.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED","children":["2702:526","2702:527","2702:528","2702:529","2702:530"]},"2149:4117":{"type":"GROUP","id":"2149:4117","name":"products lists","absoluteBoundingBox":{"x":-2844.0,"y":576.0,"width":797.0,"height":1101.0},"isolatedAbsoluteRenderBounds":{"x":-2847.1279296875,"y":576.0,"width":800.1279296875,"height":1101.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,46.0]],"size":{"x":797.0,"y":1101.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"children":["2149:4118","2149:4122","2149:4127"]},"2149:3583":{"type":"FRAME","id":"2149:3583","name":"Our clients section","absoluteBoundingBox":{"x":-3406.5,"y":2697.0,"width":1280.0,"height":935.0},"isolatedAbsoluteRenderBounds":{"x":-3406.5,"y":2697.0,"width":1280.0,"height":935.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,2109.0]],"size":{"x":1280.0,"y":935.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":62.0,"paddingRight":271.0,"paddingBottom":15.0,"paddingLeft":271.0,"layoutMode":"VERTICAL","itemSpacing":74.0,"counterAxisAlignItems":"CENTER","isInAnimateTree":true,"children":["2149:3584"]},"2102:312":{"type":"TEXT","id":"2102:312","name":"놀라운 기술력을 바탕으로, 세상에 없던 제품을 만듭니다.","absoluteBoundingBox":{"x":-2884.5,"y":1223.0,"width":235.0,"height":42.0},"isolatedAbsoluteRenderBounds":{"x":-2883.361328125,"y":1227.35205078125,"width":232.0517578125,"height":33.823974609375},"relativeTransform":[[1.0,0.0,522.0],[0.0,1.0,122.0]],"size":{"x":235.0,"y":42.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"CENTER","horizontal":"CENTER"},"constraintValues":{"left":{"pixelOffset":-118.0,"sizeFraction":0.5},"right":{"pixelOffset":117.0,"sizeFraction":0.5},"top":{"pixelOffset":-28.0,"sizeFraction":0.5},"bottom":{"pixelOffset":14.0,"sizeFraction":0.5}},"strokeAlign":"OUTSIDE","layoutPositioning":"ABSOLUTE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"characterStyleOverrides":[],"characters":"놀라운 기술력을 바탕으로, 세상에 없던\n제품을 만듭니다.","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":14.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":0.56,"letterSpacingValue":4.0,"letterSpacingUnit":"PERCENT","lineHeightPx":21.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2149:3588":{"mainComponentId":"32:808","type":"INSTANCE","id":"2149:3588","name":"슬라이더 1","absoluteBoundingBox":{"x":-3135.5,"y":2959.0,"width":738.0,"height":445.0},"isolatedAbsoluteRenderBounds":{"x":-3135.5,"y":2959.0,"width":738.0,"height":445.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,200.0]],"size":{"x":738.0,"y":445.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","maxWidth":738.0,"minHeight":445.0,"strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":30.0,"paddingRight":50.0,"paddingBottom":30.0,"paddingLeft":50.0,"layoutMode":"VERTICAL","itemSpacing":80.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","children":["I2149:3588;32:675","I2149:3588;64:175"],"componentSetId":"32:813","componentProperties":{"Property 1":{"value":"Carousel slide 1","type":"VARIANT","boundVariables":{}}},"overrides":[{"key":[],"value":{"counterAxisSizingMode":null,"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":null,"size":{"x":738.0,"y":445.0}},"componentId":"32:808"},{"key":["Carousel content0","Our clients quote 10"],"value":{"counterAxisSizingMode":"FIXED","layoutGrow":null,"primaryAxisSizingMode":"FIXED"},"componentId":"32:808"},{"key":["Carousel content0","Our clients quote 10","\"평소 김치를 담그려면 마음을 먹고 담글 때까지도 한 달 이상 걸리던 제가 레이저에이블 테라피 20분씩, 3세션 이후 3일 내에 일을 처리하게 되었고 깜빡거리던 기억력이 개선되었습니다.\"0"],"value":{"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":11.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":0.99,"letterSpacingValue":9.0,"letterSpacingUnit":"PERCENT","lineHeightPx":14.8500003814697,"lineHeightPercent":112.499992370605,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"layoutAlign":null,"lineHeightPercent":null,"lineHeightPercentFontSize":null,"lineHeightPx":null,"textAutoResize":"WIDTH_AND_HEIGHT"},"componentId":"32:808"},{"key":["Carousel content0","Our clients quote 10","— 60대 초반 여성, 브레인에이블 서울권 센터0"],"value":{"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":11.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":0.55,"letterSpacingValue":5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":11.9900007247925,"lineHeightPercent":90.8333282470703,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"layoutAlign":null,"lineHeightPercent":null,"lineHeightPercentFontSize":null,"lineHeightPx":null,"textAutoResize":"WIDTH_AND_HEIGHT"},"componentId":"32:808"},{"key":["Slideshow nav bar0","Slideshow navigation0","Ellipse 1800"],"value":{"behaviors":null,"interactions":[{"id":{"sessionID":186,"localID":71},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"NONE"}],"isDeleted":true,"stateManagementVersion":1},{"id":{"sessionID":186,"localID":74},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE"}],"isDeleted":true,"stateManagementVersion":1}]},"componentId":"32:808"},{"key":["Slideshow nav bar0","Left arrow0"],"value":{"accessibleLabel":"Arrow icon that navigates to previous customer quote"},"componentId":"32:808"},{"key":["Slideshow nav bar0","Right arrow0"],"value":{"accessibleLabel":"Arrow icon that navigates to next customer quote"},"componentId":"32:808"}]},"5:1287":{"type":"FRAME","id":"5:1287","name":"Footer contact information","absoluteBoundingBox":{"x":-4155.0,"y":6626.0,"width":994.0,"height":67.0},"isolatedAbsoluteRenderBounds":{"x":-4155.0,"y":6626.0,"width":994.0,"height":67.0},"relativeTransform":[[1.0,0.0,143.0],[0.0,1.0,387.0]],"size":{"x":994.0,"y":67.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingBottom":1.0,"layoutMode":"HORIZONTAL","primaryAxisSizingMode":"FIXED","children":["5:1288","5:1291","106:823"]},"2149:4127":{"type":"GROUP","id":"2149:4127","name":"LISTENINGABLE","absoluteBoundingBox":{"x":-2844.0,"y":1454.0,"width":698.0,"height":223.0},"isolatedAbsoluteRenderBounds":{"x":-2846.93603515625,"y":1454.0,"width":700.93603515625,"height":223.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,878.0]],"size":{"x":698.0,"y":223.0},"fills":[],"constraints":{"vertical":"TOP","horizontal":"LEFT"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"top":{"pixelOffset":878.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"children":["2149:4128","2149:4129","2149:4130"]},"2149:4116":{"type":"FRAME","id":"2149:4116","name":"Offering list items","absoluteBoundingBox":{"x":-2844.0,"y":530.0,"width":1004.0,"height":48.0},"isolatedAbsoluteRenderBounds":{"x":-2847.1279296875,"y":530.0,"width":1007.1279296875,"height":1110.68005371094},"relativeTransform":[[1.0,0.0,110.0],[0.0,1.0,209.0]],"size":{"x":1004.0,"y":48.0},"fills":[],"constraintValues":{"left":{"pixelOffset":110.0,"sizeFraction":0.0},"top":{"pixelOffset":209.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","layoutPositioning":"ABSOLUTE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2150:4186","2149:4117"]},"2119:1762":{"type":"FRAME","id":"2119:1762","name":"Welcome content","absoluteBoundingBox":{"x":-2802.0,"y":2529.0,"width":462.0,"height":361.0},"isolatedAbsoluteRenderBounds":{"x":-2802.0,"y":2529.0,"width":942.0,"height":361.0},"relativeTransform":[[1.0,0.0,152.0],[0.0,1.0,139.0]],"size":{"x":462.0,"y":361.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","maxWidth":1180.0,"strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"layoutMode":"VERTICAL","itemSpacing":60.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","children":["2119:1763","2119:1764"]},"2149:4130":{"type":"TEXT","id":"2149:4130","name":"미세소리훈련장비","absoluteBoundingBox":{"x":-2844.0,"y":1454.0,"width":175.769332885742,"height":26.0},"isolatedAbsoluteRenderBounds":{"x":-2846.93603515625,"y":1455.81604003906,"width":173.4990234375,"height":32.343994140625},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":175.769332885742,"y":26.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.464608997106552,"g":0.964307248592377,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"TOP","horizontal":"LEFT"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"top":{"pixelOffset":0.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0724911093711853,"g":0.591715276241302,"b":0.72152179479599,"a":1.0},"visible":true,"opacity":1.0}],"effects":[{"type":"DROP_SHADOW","visible":true,"color":{"r":0.0,"g":0.0,"b":0.0,"a":0.25},"blendMode":"NORMAL","offset":{"x":0.0,"y":4.0},"radius":4.0,"showShadowBehindNode":false,"spread":0.0}],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"미세소리훈련장비","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":24.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-1.2,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":26.1599998474121,"lineHeightPercent":90.8333282470703,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2149:4129":{"type":"TEXT","id":"2149:4129","name":"언어발달장애, 난독증 치료의 기본이 되는 소리의 미세 차이 구별 훈련을 통한 청취와 발성 능력 향상 솔루션 입니다.","absoluteBoundingBox":{"x":-2844.0,"y":1584.0,"width":698.0,"height":93.0},"isolatedAbsoluteRenderBounds":{"x":-2843.28002929688,"y":1591.21997070312,"width":677.041015625,"height":49.4600830078125},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,130.0]],"size":{"x":698.0,"y":93.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"TOP","horizontal":"LEFT"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"top":{"pixelOffset":130.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"언어발달장애, 난독증 치료의 기본이 되는 소리의 미세 차이 구별 훈련을 통한 청취와 발성 능력 향상 솔루션 입니다.\n","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":20.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.4,"letterSpacingValue":2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":31.4000015258789,"lineHeightPercent":130.83332824707,"lineHeightPercentFontSize":157.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2149:4126":{"type":"TEXT","id":"2149:4126","name":"난독증진단장비","absoluteBoundingBox":{"x":-2844.0,"y":971.0,"width":148.0,"height":26.0},"isolatedAbsoluteRenderBounds":{"x":-2847.1279296875,"y":972.864013671875,"width":152.812744140625,"height":32.3200073242188},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":148.0,"y":26.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.464608997106552,"g":0.964307248592377,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"TOP","horizontal":"LEFT"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"top":{"pixelOffset":0.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0724911093711853,"g":0.591715276241302,"b":0.72152179479599,"a":1.0},"visible":true,"opacity":1.0}],"effects":[{"type":"DROP_SHADOW","visible":true,"color":{"r":0.0,"g":0.0,"b":0.0,"a":0.25},"blendMode":"NORMAL","offset":{"x":0.0,"y":4.0},"radius":4.0,"showShadowBehindNode":false,"spread":0.0}],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"난독증진단장비","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":24.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-1.2,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":26.1599998474121,"lineHeightPercent":90.8333282470703,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2149:4123":{"type":"TEXT","id":"2149:4123","name":"READINGABLE","absoluteBoundingBox":{"x":-2844.0,"y":1029.0,"width":464.0,"height":42.0},"isolatedAbsoluteRenderBounds":{"x":-2841.15209960938,"y":1038.19201660156,"width":362.0966796875,"height":40.4320068359375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,58.0]],"size":{"x":464.0,"y":42.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"TOP","horizontal":"LEFT"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"top":{"pixelOffset":58.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[{"opacity":0.579999983310699,"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0708940923213959,"g":0.628357946872711,"b":1.0,"a":1.0},"visible":true}],"strokeWeight":2.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[19,19,19,19,19,19,19,19,19,19,19,18,18],"characters":"READINGABLE \n","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"style":{"fontFamily":"Gasoek One","fontPostScriptName":"GasoekOne-Regular","fontStyle":"Regular","fontVariantPosition":"NORMAL","fontSize":48.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":4.8,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":52.3199996948242,"lineHeightPercent":75.2762451171875,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{"19":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","fontSize":48.0,"letterSpacing":4.8,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100},"18":{"letterSpacing":4.8,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100}}},"10:4387":{"type":"FRAME","id":"10:4387","name":"Offering list items","absoluteBoundingBox":{"x":-4149.0,"y":2742.0,"width":982.0,"height":1468.0},"isolatedAbsoluteRenderBounds":{"x":-4152.01611328125,"y":2742.0,"width":985.01611328125,"height":1468.0},"relativeTransform":[[1.0,0.0,149.0],[0.0,1.0,252.0]],"size":{"x":982.0,"y":1468.0},"fills":[],"constraints":{"vertical":"TOP","horizontal":"CENTER"},"constraintValues":{"left":{"pixelOffset":-491.0,"sizeFraction":0.5},"right":{"pixelOffset":491.0,"sizeFraction":0.5},"top":{"pixelOffset":252.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","layoutPositioning":"ABSOLUTE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":65.0,"primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["10:4389","2131:3091"]},"2149:4118":{"type":"GROUP","id":"2149:4118","name":"LASERABLE","absoluteBoundingBox":{"x":-2844.0,"y":576.0,"width":797.0,"height":344.0},"isolatedAbsoluteRenderBounds":{"x":-2846.81591796875,"y":576.0,"width":799.81591796875,"height":344.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":797.0,"y":344.0},"fills":[],"constraints":{"vertical":"TOP","horizontal":"LEFT"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"top":{"pixelOffset":0.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"children":["2149:4119","2149:4120","2149:4121"]},"2577:745":{"type":"TEXT","id":"2577:745","name":"Text sm / Medium","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":54.0,"height":20.0},"isolatedAbsoluteRenderBounds":{"x":0.0,"y":0.0,"width":54.0,"height":20.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":54.0,"y":20.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"visible":false,"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Rag 123","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":14.0}},"textAutoResize":"WIDTH_AND_HEIGHT","paragraphSpacing":14.0,"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","paragraphSpacing":14.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":14.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":20.0,"lineHeightPercent":118.04158782959,"lineHeightPercentFontSize":142.857147216797,"lineHeightUnit":"PIXELS","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2149:4121":{"type":"TEXT","id":"2149:4121","name":"LASERABLE","absoluteBoundingBox":{"x":-2844.0,"y":635.0,"width":386.967864990234,"height":56.0},"isolatedAbsoluteRenderBounds":{"x":-2841.15209960938,"y":642.192016601562,"width":292.26220703125,"height":40.4320068359375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,59.0]],"size":{"x":386.967864990234,"y":56.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"TOP","horizontal":"LEFT"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"top":{"pixelOffset":59.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[{"opacity":0.579999983310699,"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0708940923213959,"g":0.628357946872711,"b":1.0,"a":1.0},"visible":true}],"strokeWeight":2.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"LASERABLE \n","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","fontVariantPosition":"NORMAL","fontSize":48.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":4.8,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":52.3199996948242,"lineHeightPercent":90.8333282470703,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"4:942":{"type":"TEXT","id":"4:942","name":"BrainAble, 두뇌의 가능성을 깨우다","absoluteBoundingBox":{"x":-2930.0,"y":699.5,"width":327.0,"height":26.0},"isolatedAbsoluteRenderBounds":{"x":-2928.5439453125,"y":705.075988769531,"width":273.44091796875,"height":16.8480224609375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,39.0]],"size":{"x":327.0,"y":26.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"H2","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"BrainAble, 두뇌의 가능성을 깨우다","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAlignVertical":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"CENTER","letterSpacing":1.6,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2702:545":{"type":"FRAME","id":"2702:545","name":"Group 3","absoluteBoundingBox":{"x":-2904.0,"y":-392.0,"width":1643.0,"height":572.0},"isolatedAbsoluteRenderBounds":{"x":-2904.0,"y":-392.0,"width":1643.0,"height":572.0},"relativeTransform":[[1.0,0.0,50.0],[0.0,1.0,87.0]],"size":{"x":1643.0,"y":572.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"clipsContent":true,"children":["2702:546","2702:547"]},"32:871":{"mainComponentId":"32:808","type":"INSTANCE","id":"32:871","name":"슬라이더 1","absoluteBoundingBox":{"x":-4027.0,"y":4973.0,"width":738.0,"height":445.0},"isolatedAbsoluteRenderBounds":{"x":-4027.0,"y":4973.0,"width":738.0,"height":445.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,26.0]],"size":{"x":738.0,"y":445.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","maxWidth":738.0,"minHeight":445.0,"strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":30.0,"paddingRight":50.0,"paddingBottom":30.0,"paddingLeft":50.0,"layoutMode":"VERTICAL","itemSpacing":80.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["I32:871;32:675","I32:871;64:175"],"componentSetId":"32:813","componentProperties":{"Property 1":{"value":"Carousel slide 1","type":"VARIANT","boundVariables":{}}},"overrides":[{"key":[],"value":{"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"primaryAxisSizingMode":"FIXED","size":{"x":738.0,"y":445.0}},"componentId":"32:808"},{"key":["Carousel content0","Our clients quote 10","\"평소 김치를 담그려면 마음을 먹고 담글 때까지도 한 달 이상 걸리던 제가 레이저에이블 테라피 20분씩, 3세션 이후 3일 내에 일을 처리하게 되었고 깜빡거리던 기억력이 개선되었습니다.\"0"],"value":{"characterStyleOverrides":[],"characters":"\"평소 김치를 담그려면 마음을 먹고 담글 때까지도 \n한 달 이상 걸리던 제가 \n레이저에이블 테라피 20분씩, 3세션 이후 3일 내에 일을 \n처리하게 되었고 깜빡거리던 기억력이 개선되었습니다.\" ","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":24.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":2.16,"letterSpacingValue":9.0,"letterSpacingUnit":"PERCENT","lineHeightPx":32.4000015258789,"lineHeightPercent":112.499992370605,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"lineHeightPercent":null,"lineHeightPercentFontSize":null,"lineHeightPx":null,"lineHeightUnit":null,"lineIndentations":[0,0,0,0],"lineStyleOverrides":[0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE"],"openTypeFlags":null,"styleOverrideTable":{},"text":null,"textDecorationSkipInk":null},"componentId":"32:808"},{"key":["Carousel content0","Our clients quote 10","— 60대 초반 여성, 브레인에이블 서울권 센터0"],"value":{"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":-0.8,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":17.4400005340576,"lineHeightPercent":90.8333282470703,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"lineHeightPercent":null,"lineHeightPercentFontSize":null,"lineHeightPx":null,"lineHeightUnit":null,"openTypeFlags":null,"text":null,"textDecorationSkipInk":null},"componentId":"32:808"},{"key":["Slideshow nav bar0","Slideshow navigation0","Ellipse 1800"],"value":{"accessibleLabel":"Customer quote 1 of 4","behaviors":null,"interactions":[{"id":{"sessionID":32,"localID":919},"event":{"interactionType":"ON_HOVER"},"actions":[{"transitionNodeID":{"sessionID":-1,"localID":-1},"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","transitionResetScrollPosition":false,"transitionResetInteractiveComponents":true}],"isDeleted":true,"stateManagementVersion":1},{"id":{"sessionID":186,"localID":71},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"NONE"}],"isDeleted":true,"stateManagementVersion":1},{"id":{"sessionID":186,"localID":74},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE"}],"isDeleted":true,"stateManagementVersion":1}]},"componentId":"32:808"},{"key":["Slideshow nav bar0","Slideshow navigation0","Ellipse 1810"],"value":{"accessibleLabel":"Customer quote 2 of 4"},"componentId":"32:808"},{"key":["Slideshow nav bar0","Slideshow navigation0","Ellipse 1820"],"value":{"accessibleLabel":"Customer quote 3 of 4"},"componentId":"32:808"},{"key":["Slideshow nav bar0","Slideshow navigation0","Ellipse 1830"],"value":{"accessibleLabel":"Customer quote 4 of 4"},"componentId":"32:808"},{"key":["Slideshow nav bar0","Left arrow0"],"value":{"accessibleLabel":"Arrow icon that navigates to previous customer quote"},"componentId":"32:808"},{"key":["Slideshow nav bar0","Right arrow0"],"value":{"accessibleLabel":"Arrow icon that navigates to next customer quote"},"componentId":"32:808"}]},"2149:4150":{"type":"TEXT","id":"2149:4150","name":"READINGABLE","absoluteBoundingBox":{"x":-2904.5,"y":2000.0,"width":191.0,"height":56.0},"isolatedAbsoluteRenderBounds":{"x":-2902.88403320312,"y":2003.06396484375,"width":180.16552734375,"height":12.14404296875},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,78.0]],"size":{"x":191.0,"y":56.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"TOP","horizontal":"SCALE"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"right":{"pixelOffset":0.0,"sizeFraction":0.6996336996337},"top":{"pixelOffset":78.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":2.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[23,23,23,23,23,23,23,23,23,23,23,22,22],"characters":"READINGABLE \n","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"style":{"fontFamily":"Gasoek One","fontPostScriptName":"GasoekOne-Regular","fontStyle":"Regular","fontVariantPosition":"NORMAL","fontSize":48.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":4.8,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":52.3199996948242,"lineHeightPercent":75.2762451171875,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{"23":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","fontSize":16.0,"letterSpacing":7.68,"letterSpacingValue":48.0,"letterSpacingUnit":"PERCENT","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100},"22":{"fontSize":16.0,"letterSpacing":7.68,"letterSpacingValue":48.0,"letterSpacingUnit":"PERCENT","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100}}},"2702:550":{"type":"TEXT","id":"2702:550","name":"잠재력을 깨우는 기술, 이 함께합니다.","absoluteBoundingBox":{"x":-2902.0,"y":-339.0,"width":1887.0,"height":154.0},"isolatedAbsoluteRenderBounds":{"x":-2899.97509765625,"y":-319.260009765625,"width":558.75244140625,"height":117.815002441406},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,53.0]],"size":{"x":1887.0,"y":154.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"top":{"pixelOffset":53.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","layoutPositioning":"ABSOLUTE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"H1","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"PAGE_LOAD","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"},"scrollParallax":{"axis":"VERTICAL","speed":0.649999976158142,"relativeToPage":false,"behaviorType":"scrollParallax"}},"characterStyleOverrides":[44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,43,44,44,44,44,44,44,44],"characters":"잠재력을 깨우는 기술,\n                       이 함께합니다.","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAlignVertical":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","hangingPunctuation":true,"textCase":"TITLE","fontVariantPosition":"NORMAL","fontSize":45.0,"textAlignHorizontal":"LEFT","textAlignVertical":"CENTER","letterSpacing":2.25,"letterSpacingValue":5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":76.9500045776367,"lineHeightPercent":142.5,"lineHeightPercentFontSize":171.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{"44":{"fontSize":45.0,"paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100},"43":{"fontSize":45.0,"letterSpacing":-3.6,"letterSpacingValue":-8.0,"letterSpacingUnit":"PERCENT","lineHeightPx":76.9500045776367,"lineHeightPercent":145.919998168945,"lineHeightPercentFontSize":171.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"}}},"2702:523":{"type":"FRAME","id":"2702:523","name":"Header 1","absoluteBoundingBox":{"x":-2905.0,"y":-455.0,"width":277.0,"height":382.0},"isolatedAbsoluteRenderBounds":{"x":-2905.0,"y":-455.0,"width":277.0,"height":382.0},"relativeTransform":[[1.0,0.0,44.0],[0.0,1.0,24.0]],"size":{"x":277.0,"y":382.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"HEADER","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":24.0,"paddingRight":33.0,"paddingBottom":24.0,"paddingLeft":33.0,"layoutMode":"VERTICAL","itemSpacing":16.0,"counterAxisAlignItems":"CENTER","children":["2702:524","2702:525"]},"2109:1309":{"type":"TEXT","id":"2109:1309","name":"PBM 테라피 장비","absoluteBoundingBox":{"x":-4149.0,"y":2916.0,"width":355.0,"height":26.0},"isolatedAbsoluteRenderBounds":{"x":-4150.81591796875,"y":2918.86401367188,"width":198.82421875,"height":30.2958984375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":355.0,"y":26.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.720453143119812,"g":0.841228127479553,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"TOP","horizontal":"SCALE"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"right":{"pixelOffset":0.0,"sizeFraction":0.387554585152838},"top":{"pixelOffset":0.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[],"effects":[{"type":"DROP_SHADOW","visible":true,"color":{"r":0.0,"g":0.0,"b":0.0,"a":0.25},"blendMode":"NORMAL","offset":{"x":0.0,"y":4.0},"radius":4.0,"showShadowBehindNode":false,"spread":0.0}],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"PBM 테라피 장비","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":24.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":2.4,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":26.1599998474121,"lineHeightPercent":90.8333282470703,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2702:527":{"type":"TEXT","id":"2702:527","name":"제품소개","absoluteBoundingBox":{"x":-2796.0,"y":-285.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-2795.8173828125,"y":-281.31201171875,"width":58.63623046875,"height":16.5120239257812},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,55.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"회사소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"hyperlink":{"type":"NODE","nodeID":"/about_us"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2149:4125":{"type":"TEXT","id":"2149:4125","name":"LASERABLE","absoluteBoundingBox":{"x":-2424.0,"y":1200.0,"width":278.0,"height":39.0},"isolatedAbsoluteRenderBounds":{"x":-2424.0,"y":1200.0,"width":278.0,"height":39.0},"relativeTransform":[[1.0,0.0,420.0],[0.0,1.0,229.0]],"size":{"x":278.0,"y":39.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"visible":false,"constraints":{"vertical":"TOP","horizontal":"LEFT"},"constraintValues":{"left":{"pixelOffset":420.0,"sizeFraction":0.0},"top":{"pixelOffset":229.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"characterStyleOverrides":[],"characters":"LASERABLE \n","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"style":{"styleIdForText":"StyleId:7aa8e3397bdf15c0f346f2cbc2db3f1f00b8f278/121:1154","fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","fontVariantPosition":"NORMAL","fontSize":32.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-1.6,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":34.8800010681152,"lineHeightPercent":83.8461532592773,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2702:514":{"type":"FRAME","id":"2702:514","name":"Header 1","absoluteBoundingBox":{"x":-2949.0,"y":-479.0,"width":375.0,"height":123.0},"isolatedAbsoluteRenderBounds":{"x":-2949.0,"y":-479.0,"width":375.0,"height":123.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":375.0,"y":123.0},"fills":[],"visible":false,"strokeAlign":"INSIDE","layoutGrow":1.0,"strokes":[],"accessibleHTMLTag":"HEADER","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":24.0,"paddingRight":64.0,"paddingBottom":24.0,"paddingLeft":64.0,"layoutMode":"HORIZONTAL","itemSpacing":16.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED","children":["2702:515","2702:516"]},"2702:517":{"type":"TEXT","id":"2702:517","name":"HOME","absoluteBoundingBox":{"x":-2674.0,"y":-429.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-2673.65844726562,"y":-423.0,"width":58.3232421875,"height":15.2000122070312},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"HOME","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"style":{"styleIdForText":"StyleId:2608:2916","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":3.84,"letterSpacingValue":24.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":120.83332824707,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2191:181":{"mainComponentId":"6:1477","type":"INSTANCE","id":"2191:181","name":"Button Dark","absoluteBoundingBox":{"x":-2802.0,"y":2835.0,"width":106.0,"height":55.0},"isolatedAbsoluteRenderBounds":{"x":-2802.0,"y":2835.0,"width":106.0,"height":55.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,146.0]],"size":{"x":106.0,"y":55.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":193,"localID":83},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":6,"localID":1529},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/about_us"}],"isDeleted":false,"stateManagementVersion":1},{"id":{"sessionID":9,"localID":2665},"event":{"interactionType":"ON_HOVER"},"actions":[{"transitionNodeID":{"sessionID":6,"localID":1477},"transitionType":"SMART_ANIMATE","transitionDuration":0.300000011920929,"easingType":"OUT_CUBIC","easingFunction":[0.0,0.0,0.579999983310699,1.0],"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","transitionResetVideoPosition":false,"stateGroupContext":"6:1478"}],"isDeleted":false,"stateManagementVersion":1}],"rectangleCornerRadii":[500.0,500.0,500.0,500.0],"cornerRadius":500.0,"paddingTop":18.0,"paddingRight":24.0,"paddingBottom":18.0,"paddingLeft":24.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"MAX","children":["I2191:181;6:1476"],"componentSetId":"6:1478","componentProperties":{"Property 1":{"value":"Hover","type":"VARIANT","boundVariables":{}}},"overrides":[{"key":[],"value":{"behaviors":null,"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"primaryAxisAlignItems":"MAX","size":{"x":106.0,"y":55.0},"interactions":[{"id":{"sessionID":193,"localID":83},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":6,"localID":1529},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/about_us"}],"isDeleted":false,"stateManagementVersion":1},{"id":{"sessionID":9,"localID":2665},"event":{"interactionType":"ON_HOVER"},"actions":[{"transitionNodeID":{"sessionID":6,"localID":1477},"transitionType":"SMART_ANIMATE","transitionDuration":0.300000011920929,"easingType":"OUT_CUBIC","easingFunction":[0.0,0.0,0.579999983310699,1.0],"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","transitionResetVideoPosition":false,"stateGroupContext":"6:1478"}],"isDeleted":false,"stateManagementVersion":1},{"id":{"sessionID":9,"localID":2659},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":6,"localID":1477},"transitionType":"SMART_ANIMATE","transitionDuration":0.300000011920929,"easingType":"OUT_CUBIC","easingFunction":[0.0,0.0,0.579999983310699,1.0],"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","transitionResetVideoPosition":false}],"isDeleted":true,"stateManagementVersion":1},{"id":{"sessionID":9,"localID":2662},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"URL","connectionURL":"figma.com/sites","openUrlInNewTab":true}],"isDeleted":true,"stateManagementVersion":1},{"id":{"sessionID":10,"localID":3480},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":9,"localID":2725},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","openUrlInNewTab":true}],"isDeleted":true,"stateManagementVersion":1}]},"componentId":"6:1477"},{"key":["제품소개0"],"value":{"characterStyleOverrides":[],"characters":"회사소개","fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","hyperlink":{"type":"NODE","nodeID":"/about_us"},"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.32,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.2000007629395,"lineHeightPercent":100.0,"lineHeightPercentFontSize":120.000007629395,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"lineHeightPercent":null,"lineHeightPercentFontSize":null,"lineHeightPx":null,"lineHeightUnit":null,"lineIndentations":[0],"lineStyleOverrides":[0],"lineTypes":["NONE"],"name":"회사소개","openTypeFlags":null,"styleOverrideTable":{},"text":null,"textAlignVertical":"CENTER","textDecoration":null,"textDecorationSkipInk":null},"componentId":"6:1477"}]},"2119:1763":{"type":"TEXT","id":"2119:1763","name":"BrainAble, 두뇌의 가능성을 깨우다","absoluteBoundingBox":{"x":-2802.0,"y":2529.0,"width":462.0,"height":100.0},"isolatedAbsoluteRenderBounds":{"x":-2801.14208984375,"y":2539.31298828125,"width":453.64208984375,"height":80.656982421875},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":462.0,"y":100.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"H2","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"BrainAble, 두뇌의 가능성을 깨우다","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":33.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":3.3,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":49.5,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"4:749":{"type":"TEXT","id":"4:749","name":"Header/Header 3","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":23.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":0.360000014305115,"y":5.21999931335449,"width":20.9145946502686,"height":15.6960010528564},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":23.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Geist","fontPostScriptName":"Geist-Medium","fontStyle":"Medium","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":103.846160888672,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2281:541":{"type":"TEXT","id":"2281:541","name":"Rich text/Body","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":21.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":0.409090936183929,"y":6.3636360168457,"width":18.9261379241943,"height":15.0909099578857},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":21.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Inter","fontPostScriptName":null,"fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":123.943664550781,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2695:746":{"type":"FRAME","id":"2695:746","name":"Header 1","absoluteBoundingBox":{"x":-3081.0,"y":745.0,"width":800.0,"height":123.0},"isolatedAbsoluteRenderBounds":{"x":-3081.0,"y":745.0,"width":800.0,"height":123.0},"relativeTransform":[[1.0,0.0,-127.0],[0.0,1.0,1224.0]],"size":{"x":800.0,"y":123.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"HEADER","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":24.0,"paddingRight":64.0,"paddingBottom":24.0,"paddingLeft":64.0,"layoutMode":"HORIZONTAL","itemSpacing":16.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED","children":["2695:747","2695:748"]},"2702:522":{"type":"FRAME","id":"2702:522","name":"Frame 2","absoluteBoundingBox":{"x":-2949.0,"y":-479.0,"width":365.0,"height":430.0},"isolatedAbsoluteRenderBounds":{"x":-2949.0,"y":-479.0,"width":365.0,"height":430.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":365.0,"y":430.0},"fills":[],"strokeAlign":"INSIDE","maxWidth":375.0,"strokes":[],"accessibleHTMLTag":"HEADER","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":24.0,"paddingRight":44.0,"paddingBottom":24.0,"paddingLeft":44.0,"layoutMode":"VERTICAL","itemSpacing":40.0,"counterAxisAlignItems":"CENTER","children":["2702:523"]},"2695:753":{"type":"TEXT","id":"2695:753","name":"센터소개","absoluteBoundingBox":{"x":-2404.0,"y":795.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-2403.8173828125,"y":798.68798828125,"width":58.63623046875,"height":16.5120239257812},"relativeTransform":[[1.0,0.0,353.0],[0.0,1.0,0.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"센터소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"hyperlink":{"type":"NODE","nodeID":"/센터소개"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2281:543":{"type":"TEXT","id":"2281:543","name":"Rich text/Header 2","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":63.0,"height":53.0},"isolatedAbsoluteRenderBounds":{"x":1.17613637447357,"y":9.09090805053711,"width":58.1679573059082,"height":45.2727279663086},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":63.0,"y":53.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Inter","fontPostScriptName":null,"fontStyle":"Semi Bold","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":48.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-1.44,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":52.8000030517578,"lineHeightPercent":90.8920211791992,"lineHeightPercentFontSize":110.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2281:542":{"type":"TEXT","id":"2281:542","name":"Rich text/Header 1","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":86.0,"height":70.0},"isolatedAbsoluteRenderBounds":{"x":1.52272737026215,"y":11.4545440673828,"width":79.7863693237305,"height":60.363639831543},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":86.0,"y":70.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Inter","fontPostScriptName":null,"fontStyle":"Bold","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":64.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-1.6,"letterSpacingValue":-2.5,"letterSpacingUnit":"PERCENT","lineHeightPx":70.4000015258789,"lineHeightPercent":90.8920211791992,"lineHeightPercentFontSize":110.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2702:503":{"type":"TEXT","id":"2702:503","name":"회사소개","absoluteBoundingBox":{"x":-3618.0,"y":-429.0,"width":71.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-3617.69750976562,"y":-424.31201171875,"width":70.396240234375,"height":16.5120239257812},"relativeTransform":[[1.0,0.0,400.0],[0.0,1.0,0.0]],"size":{"x":71.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"회사소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"style":{"styleIdForText":"StyleId:2608:2916","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":3.84,"letterSpacingValue":24.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":120.83332824707,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"161:102":{"type":"FRAME","id":"161:102","name":"Main","absoluteBoundingBox":{"x":-3406.5,"y":588.0,"width":1280.0,"height":3097.0},"isolatedAbsoluteRenderBounds":{"x":-3406.5,"y":588.0,"width":1280.0,"height":3097.0},"relativeTransform":[[1.0,0.0,-452.5],[0.0,1.0,1067.0]],"size":{"x":1280.0,"y":3097.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"MAIN","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingBottom":53.0,"layoutMode":"VERTICAL","counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","isInAnimateTree":true,"children":["4:941","4:987","2149:4137","2149:3583"]},"2695:752":{"type":"TEXT","id":"2695:752","name":"제품소개","absoluteBoundingBox":{"x":-2495.0,"y":795.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-2494.8173828125,"y":798.68798828125,"width":58.63623046875,"height":16.5120239257812},"relativeTransform":[[1.0,0.0,262.0],[0.0,1.0,0.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"커뮤니티","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"hyperlink":{"type":"NODE","nodeID":"/커뮤니티Articles"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2695:749":{"type":"TEXT","id":"2695:749","name":"HOME","absoluteBoundingBox":{"x":-2757.0,"y":795.0,"width":48.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-2756.9658203125,"y":800.204528808594,"width":47.93896484375,"height":16.0681762695312},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":48.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"HOME","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","hyperlink":{"type":"NODE","nodeID":"/"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2149:4120":{"type":"TEXT","id":"2149:4120","name":"브레인에이블만의 자체적인 뇌과학 연구개발을 통해 독보적 기술력으로 만들어진 PBM 테라피 장비 입니다. 가장 안전하고 효과적인 광자극(tPBM)을 통해 뇌 기능 향상에 최적화된 브레인 웰니스 디바이스 입니다.","absoluteBoundingBox":{"x":-2844.0,"y":724.0,"width":797.0,"height":196.0},"isolatedAbsoluteRenderBounds":{"x":-2843.44995117188,"y":727.859008789062,"width":538.485595703125,"height":28.3629760742188},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,148.0]],"size":{"x":797.0,"y":196.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"TOP","horizontal":"LEFT"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"top":{"pixelOffset":148.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1],"characters":"브레인에이블만의 자체적인 뇌과학 연구개발을 통해 독보적 기술력으로 만들어진 PBM 테라피 장비 입니다. \n가장 안전하고 효과적인  광자극(tPBM)을 통해 뇌 기능 향상에 최적화된 브레인 웰니스 디바이스 입니다.\n\n","lineIndentations":[0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"3":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","fontVariantPosition":"NORMAL","fontSize":11.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":1.1,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":17.2700004577637,"lineHeightPercent":130.83332824707,"lineHeightPercentFontSize":157.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{"1":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100}}},"2702:499":{"type":"TEXT","id":"2702:499","name":"HOME","absoluteBoundingBox":{"x":-4018.0,"y":-429.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-4017.65844726562,"y":-423.0,"width":58.3232421875,"height":15.2000122070312},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"HOME","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"style":{"styleIdForText":"StyleId:2608:2916","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":3.84,"letterSpacingValue":24.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":120.83332824707,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"0:4":{"type":"FRAME","id":"0:4","name":"Desktop","absoluteBoundingBox":{"x":-4298.0,"y":-479.0,"width":1280.0,"height":8263.0},"isolatedAbsoluteRenderBounds":{"x":-4298.0,"y":-479.0,"width":1280.0,"height":8263.0},"relativeTransform":[[1.0,0.0,64.0],[0.0,1.0,100.0]],"size":{"x":1280.0,"y":8263.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"clipsContent":true,"overflowDirection":"VERTICAL_SCROLLING","layoutMode":"VERTICAL","counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","isBreakpointFrame":true,"children":["2695:691","2702:495","4:902","161:101","5:1278"]},"5:1278":{"type":"FRAME","id":"5:1278","name":"Footer section","absoluteBoundingBox":{"x":-4298.0,"y":6239.0,"width":1280.0,"height":1545.0},"isolatedAbsoluteRenderBounds":{"x":-4298.0,"y":6239.0,"width":1280.0,"height":1545.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,6718.0]],"size":{"x":1280.0,"y":1545.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","layoutGrow":1.0,"strokes":[],"accessibleHTMLTag":"FOOTER","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":105.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["5:1279","5:1285","5:1287","5:1298"]},"32:778":{"type":"TEXT","id":"32:778","name":"\"감각적으로 예민하고 상호작용의 욕구가 없던 자폐 여아입니다. 레이저에이블 테라피 후 엄마를 자발적으로 찾기 시작했고, 외출시 낯선 화장실을 갈 수 없던 아이가 외부 화장실을 이용할 수 있게 되었습니다.\"","absoluteBoundingBox":{"x":-6203.0,"y":-1304.5,"width":638.0,"height":192.0},"isolatedAbsoluteRenderBounds":{"x":-6191.1953125,"y":-1298.46801757812,"width":614.4404296875,"height":181.984008789062},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":638.0,"y":192.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"characterStyleOverrides":[],"characters":"\"감각적으로 예민하고 상호작용의 욕구가 \n없던 자폐 여아입니다.\n레이저에이블 테라피 후 엄마를 자발적으로 \n찾기 시작했고,\n외출시 낯선 화장실을 갈 수 없던 아이가 외부 화장실을 이용할 수 있게 되었습니다.\"","lineIndentations":[0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"3":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"4":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","textAlignHorizontal":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":24.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":1.2,"letterSpacingValue":5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":32.4000015258789,"lineHeightPercent":112.499992370605,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"106:823":{"type":"FRAME","id":"106:823","name":"Contact column 4","absoluteBoundingBox":{"x":-3548.0,"y":6626.0,"width":255.0,"height":20.0},"isolatedAbsoluteRenderBounds":{"x":-3548.0,"y":6626.0,"width":255.0,"height":20.0},"relativeTransform":[[1.0,0.0,607.0],[0.0,1.0,0.0]],"size":{"x":255.0,"y":20.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":2.0,"primaryAxisAlignItems":"CENTER","children":[]},"5:1285":{"type":"FRAME","id":"5:1285","name":"Footer subhead","absoluteBoundingBox":{"x":-4155.0,"y":6470.0,"width":994.0,"height":51.0},"isolatedAbsoluteRenderBounds":{"x":-4155.0,"y":6470.0,"width":994.0,"height":51.0},"relativeTransform":[[1.0,0.0,143.0],[0.0,1.0,231.0]],"size":{"x":994.0,"y":51.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["5:1286"]},"64:728":{"type":"SVG","id":"64:728","name":"Ellipse 183","absoluteBoundingBox":{"x":-5858.77783203125,"y":338.388885498047,"width":10.222222328186,"height":10.222222328186},"targetAspectRatio":{"x":11.0,"y":11.0},"isolatedAbsoluteRenderBounds":{"x":-5858.77783203125,"y":338.388885498047,"width":10.22216796875,"height":10.2222290039062},"relativeTransform":[[1.0,0.0,60.6666641235352],[0.0,1.0,0.0]],"size":{"x":10.222222328186,"y":10.222222328186},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.192156866192818,"g":0.0666666701436043,"b":0.0588235296308994,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Currently selected quote - 4 of 4","ariaAttributes":{},"interactions":[],"hash":"0eeda1840f980a8ed0e689fe1f9824353bafb041"},"64:702":{"type":"SVG","id":"64:702","name":"Ellipse 183","absoluteBoundingBox":{"x":-5858.77783203125,"y":-959.611083984375,"width":10.222222328186,"height":10.222222328186},"targetAspectRatio":{"x":11.0,"y":11.0},"isolatedAbsoluteRenderBounds":{"x":-5858.77783203125,"y":-959.611083984375,"width":10.22216796875,"height":10.2222290039062},"relativeTransform":[[1.0,0.0,60.6666641235352],[0.0,1.0,0.0]],"size":{"x":10.222222328186,"y":10.222222328186},"fills":[{"opacity":0.25,"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Customer quote 4 of 4","ariaAttributes":{},"interactions":[{"id":{"sessionID":162,"localID":186},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":32,"localID":811},"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","stateGroupContext":"32:813"}],"isDeleted":false,"stateManagementVersion":1}],"hash":"244f7ed17a34bb385ccfc7d9ccaa5c5f8a523d1a"},"5:1286":{"type":"TEXT","id":"5:1286","name":"Pioneer of the Wellness-tech Solution.","absoluteBoundingBox":{"x":-4155.0,"y":6486.0,"width":994.0,"height":19.0},"isolatedAbsoluteRenderBounds":{"x":-4153.57177734375,"y":6489.673828125,"width":501.282470703125,"height":11.50830078125},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,16.0]],"size":{"x":994.0,"y":19.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutGrow":1.0,"strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Pioneer of the Wellness-tech Solution.","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-DemiLight","fontStyle":"DemiLight","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":14.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":7.0,"letterSpacingValue":50.0,"letterSpacingUnit":"PERCENT","lineHeightPx":18.8999996185303,"lineHeightPercent":112.499992370605,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2119:1770":{"type":"RECTANGLE","id":"2119:1770","name":"brainable_logo_ver.001-06 1","absoluteBoundingBox":{"x":-2510.0,"y":3379.4599609375,"width":110.008590698242,"height":91.7000122070312},"targetAspectRatio":{"x":1400.0,"y":1167.0},"isolatedAbsoluteRenderBounds":{"x":-2510.0,"y":3379.4599609375,"width":110.008544921875,"height":91.699951171875},"relativeTransform":[[1.0,0.0,319.0],[0.0,1.0,86.4600067138672]],"size":{"x":110.008590698242,"y":91.7000122070312},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"5fb30151daec360d1afcbecd1c68465285304a9e","originalImageWidth":1400,"originalImageHeight":1167,"visible":true,"opacity":1.0,"rotation":0.0}],"constraintValues":{"left":{"pixelOffset":444.0,"sizeFraction":0.0},"top":{"pixelOffset":369.460006713867,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[]},"5:1279":{"type":"FRAME","id":"5:1279","name":"Footer header","absoluteBoundingBox":{"x":-4169.0,"y":6239.0,"width":1022.0,"height":126.0},"isolatedAbsoluteRenderBounds":{"x":-4169.0,"y":6239.0,"width":1022.0,"height":126.0},"relativeTransform":[[1.0,0.0,129.0],[0.0,1.0,0.0]],"size":{"x":1022.0,"y":126.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":18.0,"counterAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2109:1178","2109:1174"]},"2109:1174":{"type":"RECTANGLE","id":"2109:1174","name":"brainable_logo_ver.001-03 1","absoluteBoundingBox":{"x":-4034.0,"y":6242.5,"width":142.800003051758,"height":119.0},"targetAspectRatio":{"x":142.800003051758,"y":119.0},"isolatedAbsoluteRenderBounds":{"x":-4034.0,"y":6242.5,"width":142.800048828125,"height":119.0},"relativeTransform":[[1.0,0.0,135.0],[0.0,1.0,3.5]],"size":{"x":142.800003051758,"y":119.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"64270238d3de4edd07597c9179b36856b5a53af3","originalImageWidth":1400,"originalImageHeight":1167,"visible":true,"opacity":1.0,"rotation":0.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[]},"2695:768":{"type":"TEXT","id":"2695:768","name":"제품소개","absoluteBoundingBox":{"x":-2801.0,"y":-285.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-2800.8173828125,"y":-281.31201171875,"width":58.63623046875,"height":16.5120239257812},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,55.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"회사소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"hyperlink":{"type":"NODE","nodeID":"/about_us"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"161:101":{"type":"FRAME","id":"161:101","name":"Main","absoluteBoundingBox":{"x":-4298.0,"y":656.0,"width":1280.0,"height":5583.0},"isolatedAbsoluteRenderBounds":{"x":-4298.0,"y":656.0,"width":1335.5,"height":5583.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,1135.0]],"size":{"x":1280.0,"y":5583.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"MAIN","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":2106,"localID":732},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":6,"localID":1529},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/about_us"}],"isDeleted":false,"stateManagementVersion":1}],"layoutMode":"VERTICAL","counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["4:925","4:985","10:4382","32:814"]},"32:814":{"type":"FRAME","id":"32:814","name":"Our clients section","absoluteBoundingBox":{"x":-4298.0,"y":4359.0,"width":1280.0,"height":1880.0},"isolatedAbsoluteRenderBounds":{"x":-4298.0,"y":4359.0,"width":1280.0,"height":1880.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,3703.0]],"size":{"x":1280.0,"y":1880.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":4.0,"layoutMode":"VERTICAL","itemSpacing":113.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["32:815"]},"32:822":{"type":"FRAME","id":"32:822","name":"Our clients outro","absoluteBoundingBox":{"x":-4027.0,"y":5494.0,"width":738.0,"height":171.0},"isolatedAbsoluteRenderBounds":{"x":-4027.0,"y":5494.0,"width":738.0,"height":171.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,547.0]],"size":{"x":738.0,"y":171.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["32:823"]},"2702:521":{"type":"TEXT","id":"2702:521","name":"회사소개","absoluteBoundingBox":{"x":-2274.0,"y":-429.0,"width":71.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-2273.69750976562,"y":-424.31201171875,"width":70.396240234375,"height":16.5120239257812},"relativeTransform":[[1.0,0.0,400.0],[0.0,1.0,0.0]],"size":{"x":71.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"회사소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"style":{"styleIdForText":"StyleId:2608:2916","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":3.84,"letterSpacingValue":24.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":120.83332824707,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2702:498":{"type":"FRAME","id":"2702:498","name":"Nav","absoluteBoundingBox":{"x":-4018.0,"y":-429.0,"width":471.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-4018.0,"y":-429.0,"width":471.0,"height":23.0},"relativeTransform":[[1.0,0.0,275.0],[0.0,1.0,50.0]],"size":{"x":471.0,"y":23.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"NAV","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":32.0,"counterAxisAlignItems":"CENTER","children":["2702:499","2702:500","2702:501","2702:502","2702:503"]},"2702:536":{"type":"TEXT","id":"2702:536","name":"잠재력을 깨우는 기술, 이 함께합니다.","absoluteBoundingBox":{"x":-4241.0,"y":137.0,"width":1887.0,"height":154.0},"isolatedAbsoluteRenderBounds":{"x":-4238.97509765625,"y":156.739990234375,"width":558.75244140625,"height":117.815002441406},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,53.0]],"size":{"x":1887.0,"y":154.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"top":{"pixelOffset":53.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","layoutPositioning":"ABSOLUTE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"H1","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"PAGE_LOAD","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"},"scrollParallax":{"axis":"VERTICAL","speed":0.649999976158142,"relativeToPage":false,"behaviorType":"scrollParallax"}},"characterStyleOverrides":[44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,43,44,44,44,44,44,44,44],"characters":"잠재력을 깨우는 기술,\n                       이 함께합니다.","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAlignVertical":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","hangingPunctuation":true,"textCase":"TITLE","fontVariantPosition":"NORMAL","fontSize":45.0,"textAlignHorizontal":"LEFT","textAlignVertical":"CENTER","letterSpacing":2.25,"letterSpacingValue":5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":76.9500045776367,"lineHeightPercent":142.5,"lineHeightPercentFontSize":171.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{"44":{"fontSize":45.0,"paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100},"43":{"fontSize":45.0,"letterSpacing":-3.6,"letterSpacingValue":-8.0,"letterSpacingUnit":"PERCENT","lineHeightPx":76.9500045776367,"lineHeightPercent":145.919998168945,"lineHeightPercentFontSize":171.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"}}},"2695:751":{"type":"TEXT","id":"2695:751","name":"제품소개","absoluteBoundingBox":{"x":-2586.0,"y":795.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-2585.8173828125,"y":798.68798828125,"width":58.63623046875,"height":16.5120239257812},"relativeTransform":[[1.0,0.0,171.0],[0.0,1.0,0.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"제품소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"hyperlink":{"type":"NODE","nodeID":"/laserable"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"4:941":{"type":"FRAME","id":"4:941","name":"Welcome section","absoluteBoundingBox":{"x":-3406.5,"y":588.0,"width":1280.0,"height":513.0},"isolatedAbsoluteRenderBounds":{"x":-3406.5,"y":588.0,"width":1280.0,"height":513.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":1280.0,"y":513.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":2218,"localID":2594},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":6,"localID":1529},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/about_us"}],"isDeleted":false,"stateManagementVersion":1}],"paddingTop":47.0,"paddingRight":35.0,"paddingLeft":35.0,"clipsContent":true,"layoutMode":"VERTICAL","itemSpacing":60.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["4:952"]},"32:823":{"type":"TEXT","id":"32:823","name":"브레인에이블과 함께 내 숨겨진 잠재력을 찾고 향상된 일상의 즐거움을 찾아 보세요. 지금 바로 문의주세요.","absoluteBoundingBox":{"x":-3898.0,"y":5549.5,"width":480.0,"height":60.0},"isolatedAbsoluteRenderBounds":{"x":-3892.52099609375,"y":5552.48779296875,"width":467.657470703125,"height":40.43408203125},"relativeTransform":[[1.0,0.0,129.0],[0.0,1.0,55.5]],"size":{"x":480.0,"y":60.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutGrow":1.0,"maxWidth":480.0,"strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"브레인에이블과 함께 내 숨겨진 잠재력을 찾고 향상된 일상의 즐거움을 찾아 보세요. 지금 바로 문의주세요.","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAlignHorizontal":"CENTER","style":{"styleIdForText":"StyleId:6:1353","fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"styleIdForText":"StyleId:6:1353","fontSize":18.0,"letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":115.199996948242,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":103.846160888672,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"4:925":{"type":"FRAME","id":"4:925","name":"Welcome section","absoluteBoundingBox":{"x":-4298.0,"y":656.0,"width":1280.0,"height":1016.0},"isolatedAbsoluteRenderBounds":{"x":-4298.0,"y":656.0,"width":1335.5,"height":1016.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":1280.0,"y":1016.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingBottom":68.0,"paddingLeft":252.0,"layoutMode":"VERTICAL","itemSpacing":60.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["4:954"]},"4:914":{"type":"FRAME","id":"4:914","name":"Header section","absoluteBoundingBox":{"x":-2954.0,"y":-2.0,"width":375.0,"height":543.0},"isolatedAbsoluteRenderBounds":{"x":-2954.0,"y":-2.0,"width":1667.0,"height":597.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,477.0]],"size":{"x":375.0,"y":543.0},"fills":[{"blendMode":"NORMAL","type":"VIDEO","scaleMode":"FILL","imageRef":"933cf4df3736a6926c3a3bafb0e3bb5fefa6361f","originalImageWidth":1920,"originalImageHeight":1080,"videoRef":"c52b1e752c910ebdb03f10fcd0aaf34af1c288bc","visible":true,"opacity":1.0,"autoplay":true,"mediaLoop":true,"muted":true,"showControls":true}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"VIDEO","isDecorativeImage":false,"accessibleLabel":"ablstract visual art video","ariaAttributes":{},"interactions":[],"paddingTop":25.0,"paddingRight":24.0,"paddingBottom":45.0,"paddingLeft":24.0,"layoutMode":"VERTICAL","itemSpacing":86.0,"primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2702:551"]},"2817:1153":{"type":"TEXT","id":"2817:1153","name":"Button","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":23.0,"height":22.0},"isolatedAbsoluteRenderBounds":{"x":0.0,"y":0.0,"width":23.0,"height":22.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":23.0,"y":22.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"visible":false,"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"fontSize":18.0,"letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":21.6000003814697,"lineHeightPercent":102.400009155273,"lineHeightPercentFontSize":120.000007629395,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"fontSize":18.0,"letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":21.6000003814697,"lineHeightPercent":102.400009155273,"lineHeightPercentFontSize":120.000007629395,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":0.0,"name":"Mobile","style":{"fontSize":18.0,"letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":21.6000003814697,"lineHeightPercent":102.400009155273,"lineHeightPercentFontSize":120.000007629395,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":21.6000003814697,"lineHeightPercent":92.3077011108398,"lineHeightPercentFontSize":120.000007629395,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"6:1426":{"type":"FRAME","id":"6:1426","name":"Footer section","absoluteBoundingBox":{"x":-2954.0,"y":250.0,"width":800.0,"height":1.0},"isolatedAbsoluteRenderBounds":{"x":-2954.0,"y":250.0,"width":800.0,"height":1.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,729.0]],"size":{"x":800.0,"y":1.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.968627452850342,"g":0.95686274766922,"b":0.921568632125854,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","layoutGrow":1.0,"strokes":[],"accessibleHTMLTag":"FOOTER","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":68.0,"paddingRight":28.0,"paddingBottom":68.0,"paddingLeft":28.0,"clipsContent":true,"layoutMode":"VERTICAL","itemSpacing":48.0,"primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["6:1427","6:1450","6:1452","6:1463"]},"2702:516":{"type":"FRAME","id":"2702:516","name":"Nav","absoluteBoundingBox":{"x":-2674.0,"y":-429.0,"width":471.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-2674.0,"y":-429.0,"width":471.0,"height":23.0},"relativeTransform":[[1.0,0.0,275.0],[0.0,1.0,50.0]],"size":{"x":471.0,"y":23.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"NAV","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":32.0,"counterAxisAlignItems":"CENTER","children":["2702:517","2702:518","2702:519","2702:520","2702:521"]},"2695:741":{"type":"TEXT","id":"2695:741","name":"HOME","absoluteBoundingBox":{"x":-2679.0,"y":-429.0,"width":48.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-2678.9658203125,"y":-423.795440673828,"width":47.93896484375,"height":16.0681762695312},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":48.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"HOME","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","hyperlink":{"type":"NODE","nodeID":"/"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2475:6406":{"type":"TEXT","id":"2475:6406","name":"Text","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":14.0,"height":12.0},"isolatedAbsoluteRenderBounds":{"x":0.237926155328751,"y":2.72727251052856,"width":12.7166194915771,"height":9.43181800842285},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":14.0,"y":12.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Bold","fontStyle":"Bold","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":10.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":12.1022720336914,"lineHeightPercent":100.0,"lineHeightUnit":"INTRINSIC_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED","lineHeightPercentFontSize":100},"styleOverrideTable":{}},"5:1292":{"type":"TEXT","id":"5:1292","name":"서울특별시 서초구 마방로 6길 28, 5층 502호","absoluteBoundingBox":{"x":-3803.0,"y":6626.0,"width":255.0,"height":66.0},"isolatedAbsoluteRenderBounds":{"x":-3802.55200195312,"y":6629.7998046875,"width":220.162841796875,"height":36.38427734375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":255.0,"y":66.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"hover":{"transition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.300000011920929,"delay":0.0},"state":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.699999988079071},"behaviorType":"hover"}},"characterStyleOverrides":[],"characters":"서울특별시 서초구 마방로 6길 28, \n5층 502호\n","lineIndentations":[0,0,0],"lineTypes":["NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-DemiLight","fontStyle":"DemiLight","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":22.3999996185303,"lineHeightPercent":116.666664123535,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2149:4111":{"type":"FRAME","id":"2149:4111","name":"Offering content","absoluteBoundingBox":{"x":-2844.0,"y":469.0,"width":137.0,"height":29.0},"isolatedAbsoluteRenderBounds":{"x":-2844.0,"y":469.0,"width":137.0,"height":29.0},"relativeTransform":[[1.0,0.0,110.0],[0.0,1.0,148.0]],"size":{"x":137.0,"y":29.0},"fills":[],"constraintValues":{"left":{"pixelOffset":110.0,"sizeFraction":0.0},"top":{"pixelOffset":148.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","layoutPositioning":"ABSOLUTE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED","children":[]},"2119:1761":{"type":"FRAME","id":"2119:1761","name":"Welcome section","absoluteBoundingBox":{"x":-2954.0,"y":2390.0,"width":800.0,"height":620.0},"isolatedAbsoluteRenderBounds":{"x":-2954.0,"y":2390.0,"width":800.0,"height":620.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,2069.0]],"size":{"x":800.0,"y":620.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.968627452850342,"g":0.95686274766922,"b":0.921568632125854,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":179.0,"paddingRight":186.0,"paddingBottom":160.0,"paddingLeft":152.0,"clipsContent":true,"layoutMode":"VERTICAL","itemSpacing":60.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2119:1762"]},"32:815":{"type":"FRAME","id":"32:815","name":"Our clients content","absoluteBoundingBox":{"x":-4027.0,"y":4947.0,"width":738.0,"height":708.0},"isolatedAbsoluteRenderBounds":{"x":-4027.0,"y":4806.0,"width":738.0,"height":990.0},"relativeTransform":[[1.0,0.0,271.0],[0.0,1.0,588.0]],"size":{"x":738.0,"y":708.0},"fills":[],"strokeAlign":"INSIDE","maxWidth":942.0,"maxHeight":708.0,"strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":76.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","children":["32:816","32:871","32:822","2224:2668"]},"2702:519":{"type":"TEXT","id":"2702:519","name":"커뮤니티","absoluteBoundingBox":{"x":-2480.0,"y":-429.0,"width":71.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-2479.69750976562,"y":-424.31201171875,"width":70.396240234375,"height":16.5120239257812},"relativeTransform":[[1.0,0.0,194.0],[0.0,1.0,0.0]],"size":{"x":71.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"오시는길","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"style":{"styleIdForText":"StyleId:2608:2916","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","hyperlink":{"type":"NODE","nodeID":"/커뮤니티Articles"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":3.84,"letterSpacingValue":24.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":120.83332824707,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2109:1350":{"type":"TEXT","id":"2109:1350","name":"LISTENINGABLE","absoluteBoundingBox":{"x":-4149.0,"y":3845.5,"width":602.929138183594,"height":38.0},"isolatedAbsoluteRenderBounds":{"x":-4145.36376953125,"y":3852.64404296875,"width":304.424560546875,"height":27.323974609375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,93.0]],"size":{"x":602.929138183594,"y":38.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"TOP","horizontal":"SCALE"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"right":{"pixelOffset":0.0,"sizeFraction":0.625445164090865},"top":{"pixelOffset":93.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":2.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"LISTENINGABLE\n","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","fontVariantPosition":"NORMAL","fontSize":36.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":3.6,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":39.2400016784668,"lineHeightPercent":90.8333282470703,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2695:692":{"type":"RECTANGLE","id":"2695:692","name":"Logo","absoluteBoundingBox":{"x":-4234.0,"y":-444.5,"width":211.0,"height":75.0},"isolatedAbsoluteRenderBounds":{"x":-4234.0,"y":-444.5,"width":211.0,"height":75.0},"relativeTransform":[[1.0,0.0,64.0],[0.0,1.0,34.5]],"size":{"x":211.0,"y":75.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"64270238d3de4edd07597c9179b36856b5a53af3","originalImageWidth":1400,"originalImageHeight":1167,"visible":true,"opacity":1.0,"rotation":0.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Logomark","ariaAttributes":{},"interactions":[{"id":{"sessionID":2608,"localID":4807},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":0,"localID":3},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/"}],"isDeleted":false,"stateManagementVersion":1}]},"2702:533":{"type":"FRAME","id":"2702:533","name":"Header content","absoluteBoundingBox":{"x":-4241.0,"y":84.0,"width":1641.0,"height":290.0},"isolatedAbsoluteRenderBounds":{"x":-4241.0,"y":-25.9280014038086,"width":1641.0,"height":399.928009033203},"relativeTransform":[[1.0,0.0,2.0],[0.0,1.0,0.0]],"size":{"x":1641.0,"y":290.0},"fills":[],"constraintValues":{"left":{"pixelOffset":2.0,"sizeFraction":0.0},"top":{"pixelOffset":0.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":150.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"},"scrollParallax":{"axis":"VERTICAL","speed":0.649999976158142,"relativeToPage":false,"behaviorType":"scrollParallax"}},"paddingTop":95.0,"paddingBottom":103.0,"layoutMode":"VERTICAL","itemSpacing":180.0,"primaryAxisAlignItems":"MAX","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2702:534","2702:535","2702:536"]},"2695:744":{"type":"TEXT","id":"2695:744","name":"제품소개","absoluteBoundingBox":{"x":-2417.0,"y":-429.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-2416.8173828125,"y":-425.31201171875,"width":58.63623046875,"height":16.5120239257812},"relativeTransform":[[1.0,0.0,262.0],[0.0,1.0,0.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"커뮤니티","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"hyperlink":{"type":"NODE","nodeID":"/커뮤니티Articles"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2702:532":{"type":"TEXT","id":"2702:532","name":"Brainable Co., LTD.","absoluteBoundingBox":{"x":-4243.0,"y":364.0,"width":1368.0,"height":292.0},"isolatedAbsoluteRenderBounds":{"x":-4242.03076171875,"y":506.43798828125,"width":96.99853515625,"height":9.32904052734375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,280.0]],"size":{"x":1368.0,"y":292.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.949019610881805,"g":0.949019610881805,"b":0.949019610881805,"a":1.0},"visible":true,"opacity":1.0}],"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"top":{"pixelOffset":280.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"H3","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Brainable Co., LTD.","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAlignVertical":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-DemiLight","fontStyle":"DemiLight","fontVariantPosition":"NORMAL","fontSize":9.5,"textAlignHorizontal":"LEFT","textAlignVertical":"CENTER","letterSpacing":0.95,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":12.8249998092651,"lineHeightPercent":112.499992370605,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2150:4187":{"type":"TEXT","id":"2150:4187","name":"브레인에이블은 모든 이의 잠재력을 깨우기 위해 혁신적인 기술로 더 나은 삶을 안내합니다.","absoluteBoundingBox":{"x":-2904.5,"y":1549.0,"width":275.0,"height":87.0},"isolatedAbsoluteRenderBounds":{"x":-2903.50952148438,"y":1552.81494140625,"width":271.908935546875,"height":28.0540771484375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":275.0,"y":87.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.968627452850342,"g":0.95686274766922,"b":0.921568632125854,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,6],"characters":"브레인에이블은 모든 이의 잠재력을 깨우기 위해 혁신적인 기술로 더 나은 삶을 안내합니다.\n\n","lineIndentations":[0,0,0],"lineTypes":["NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAlignHorizontal":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","fontVariantPosition":"NORMAL","fontSize":11.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":0.55,"letterSpacingValue":5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":17.6000003814697,"lineHeightPercent":133.33332824707,"lineHeightPercentFontSize":160.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{"7":{"fontSize":11.0,"letterSpacing":0.55,"letterSpacingValue":5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":17.6000003814697,"lineHeightPercent":136.533340454102,"lineHeightPercentFontSize":160.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"6":{"fontSize":11.0,"paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100}}},"4:954":{"type":"FRAME","id":"4:954","name":"Welcome content","absoluteBoundingBox":{"x":-4101.5,"y":919.0,"width":1139.0,"height":422.0},"isolatedAbsoluteRenderBounds":{"x":-4101.5,"y":919.0,"width":1139.0,"height":573.5},"relativeTransform":[[1.0,0.0,196.5],[0.0,1.0,263.0]],"size":{"x":1139.0,"y":422.0},"fills":[],"strokeAlign":"INSIDE","maxWidth":1180.0,"strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.800000011920929,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"layoutMode":"VERTICAL","itemSpacing":35.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["4:926","4:927"]},"2702:528":{"type":"TEXT","id":"2702:528","name":"제품소개","absoluteBoundingBox":{"x":-2796.0,"y":-230.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-2795.8173828125,"y":-226.311996459961,"width":58.63623046875,"height":16.5119934082031},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,110.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"제품소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"hyperlink":{"type":"NODE","nodeID":"/laserable"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2702:511":{"type":"TEXT","id":"2702:511","name":"커뮤니티","absoluteBoundingBox":{"x":-4140.0,"y":-175.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-4139.8173828125,"y":-171.311996459961,"width":58.63623046875,"height":16.5119934082031},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,165.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"커뮤니티","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"hyperlink":{"type":"NODE","nodeID":"/커뮤니티Articles"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"32:818":{"type":"TEXT","id":"32:818","name":"브레인에이블과 함께해주신 분들의 후기","absoluteBoundingBox":{"x":-3898.0,"y":4873.0,"width":480.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":-3800.564453125,"y":4876.916015625,"width":283.81640625,"height":16.59619140625},"relativeTransform":[[1.0,0.0,129.0],[0.0,1.0,67.0]],"size":{"x":480.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"브레인에이블과 함께해주신 분들의 후기","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","textAlignHorizontal":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":112.499992370605,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2702:548":{"type":"TEXT","id":"2702:548","name":"Pioneer of the wellness-tech solution","absoluteBoundingBox":{"x":-2902.0,"y":-543.0,"width":562.0,"height":119.0},"isolatedAbsoluteRenderBounds":{"x":-2901.52001953125,"y":-501.928009033203,"width":198.667236328125,"height":37.1360168457031},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,-151.0]],"size":{"x":562.0,"y":119.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Pioneer of  the \nwellness-tech solution","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAlignVertical":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Light","fontStyle":"Light","hangingPunctuation":true,"textCase":"TITLE","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"CENTER","letterSpacing":1.6,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.0,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"32:817":{"type":"TEXT","id":"32:817","name":"Hear From Our Clients","absoluteBoundingBox":{"x":-4027.0,"y":4806.0,"width":738.0,"height":35.0},"isolatedAbsoluteRenderBounds":{"x":-3806.97412109375,"y":4810.49609375,"width":299.917236328125,"height":25.9521484375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":738.0,"y":35.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"H2","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Hear From Our Clients","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","textAlignHorizontal":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":32.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":-1.6,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":34.8800010681152,"lineHeightPercent":90.8333282470703,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"4:987":{"type":"FRAME","id":"4:987","name":"Image breaker section","absoluteBoundingBox":{"x":-3406.5,"y":1101.0,"width":1280.0,"height":300.0},"isolatedAbsoluteRenderBounds":{"x":-3406.5,"y":1101.0,"width":1280.0,"height":300.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,513.0]],"size":{"x":1280.0,"y":300.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"0498fd21cc66170e5afb7c43f3496d658b5ba682","originalImageWidth":2179,"originalImageHeight":3051,"visible":true,"opacity":1.0,"rotation":0.0},{"opacity":0.200000002980232,"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true},{"opacity":0.200000002980232,"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Photo of rows of books in a library with marble busts.","ariaAttributes":{},"interactions":[],"paddingTop":10.0,"paddingRight":10.0,"paddingBottom":10.0,"paddingLeft":10.0,"clipsContent":true,"layoutMode":"VERTICAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2108:1148","2102:312"]},"2150:4186":{"type":"TEXT","id":"2150:4186","name":"브레인에이블은 모든 이의 잠재력을 깨우기 위해 혁신적인 기술로 더 나은 삶을 안내합니다.","absoluteBoundingBox":{"x":-2844.0,"y":530.0,"width":1012.0,"height":46.0},"isolatedAbsoluteRenderBounds":{"x":-2842.60009765625,"y":533.619995117188,"width":959.05810546875,"height":25.5919799804688},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":1012.0,"y":46.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.968627452850342,"g":0.95686274766922,"b":0.921568632125854,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"브레인에이블은 모든 이의 잠재력을 깨우기 위해 혁신적인 기술로 더 나은 삶을 안내합니다.\n\n","lineIndentations":[0,0,0],"lineTypes":["NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","fontVariantPosition":"NORMAL","fontSize":28.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-1.4,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":30.5200004577637,"lineHeightPercent":90.8333282470703,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"64:480":{"type":"SVG","id":"64:480","name":"Left arrow","absoluteBoundingBox":{"x":-5963.4443359375,"y":-1555.5,"width":24.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":-5963.4443359375,"y":-1555.5,"width":24.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":24.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Arrow icons that navigate through customer testimonial quotes.","ariaAttributes":{},"interactions":[{"id":{"sessionID":162,"localID":178},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":32,"localID":811},"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","stateGroupContext":"32:813"}],"isDeleted":false,"stateManagementVersion":1}],"hash":"bf4857ec80fcb1404f21acecaa5eff1653753c91"},"2695:748":{"type":"FRAME","id":"2695:748","name":"Nav","absoluteBoundingBox":{"x":-2757.0,"y":795.0,"width":412.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-2757.0,"y":795.0,"width":412.0,"height":23.0},"relativeTransform":[[1.0,0.0,324.0],[0.0,1.0,50.0]],"size":{"x":412.0,"y":23.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"NAV","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":2608,"localID":4804},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":0,"localID":3},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/"}],"isDeleted":false,"stateManagementVersion":1}],"layoutMode":"HORIZONTAL","itemSpacing":32.0,"counterAxisAlignItems":"CENTER","children":["2695:749","2695:750","2695:751","2695:752","2695:753"]},"2109:1351":{"type":"TEXT","id":"2109:1351","name":"언어발달장애, 난독증 치료의 기본이 되는 소리의 미세 차이 구별 훈련을 통한 청취와 발성 능력 향상 솔루션 입니다.","absoluteBoundingBox":{"x":-4149.0,"y":3950.5,"width":964.0,"height":50.0},"isolatedAbsoluteRenderBounds":{"x":-4148.05615234375,"y":3956.07592773438,"width":762.17626953125,"height":16.6240234375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,198.0]],"size":{"x":964.0,"y":50.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"TOP","horizontal":"SCALE"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"right":{"pixelOffset":0.0,"sizeFraction":1.0},"top":{"pixelOffset":198.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"언어발달장애, 난독증 치료의 기본이 되는 소리의 미세 차이 구별 훈련을 통한 청취와 발성 능력 향상 솔루션 입니다.\n","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.32,"letterSpacingValue":2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":25.1200008392334,"lineHeightPercent":130.83332824707,"lineHeightPercentFontSize":157.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2149:3577":{"type":"TEXT","id":"2149:3577","name":"Hear From Our Clients","absoluteBoundingBox":{"x":-2749.0,"y":3394.0,"width":738.0,"height":35.0},"isolatedAbsoluteRenderBounds":{"x":-2528.97412109375,"y":3398.49609375,"width":299.917236328125,"height":25.951904296875},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":738.0,"y":35.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"H2","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Hear From Our Clients","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","textAlignHorizontal":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":32.0,"textAlignHorizontal":"CENTER","textAlignVertical":"TOP","letterSpacing":-1.6,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":34.8800010681152,"lineHeightPercent":90.8333282470703,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"64:715":{"type":"SVG","id":"64:715","name":"Ellipse 183","absoluteBoundingBox":{"x":-5858.77783203125,"y":-175.111114501953,"width":10.222222328186,"height":10.222222328186},"targetAspectRatio":{"x":11.0,"y":11.0},"isolatedAbsoluteRenderBounds":{"x":-5858.77783203125,"y":-175.111114501953,"width":10.22216796875,"height":10.2222290039062},"relativeTransform":[[1.0,0.0,60.6666641235352],[0.0,1.0,0.0]],"size":{"x":10.222222328186,"y":10.222222328186},"fills":[{"opacity":0.25,"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Customer quote 4 of 4","ariaAttributes":{},"interactions":[{"id":{"sessionID":162,"localID":191},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":32,"localID":811},"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","stateGroupContext":"32:813"}],"isDeleted":false,"stateManagementVersion":1}],"hash":"244f7ed17a34bb385ccfc7d9ccaa5c5f8a523d1a"},"2695:766":{"type":"FRAME","id":"2695:766","name":"Nav","absoluteBoundingBox":{"x":-2801.0,"y":-340.0,"width":59.0,"height":243.0},"isolatedAbsoluteRenderBounds":{"x":-2801.0,"y":-340.0,"width":59.0,"height":243.0},"relativeTransform":[[1.0,0.0,109.0],[0.0,1.0,115.0]],"size":{"x":59.0,"y":243.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"NAV","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":2608,"localID":1766},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":6,"localID":1529},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/about_us"}],"isDeleted":false,"stateManagementVersion":1}],"behaviors":{"hover":{"transition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.300000011920929,"delay":0.0},"state":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"behaviorType":"hover"}},"layoutMode":"VERTICAL","itemSpacing":32.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED","children":["2695:767","2695:768","2695:769","2695:770","2695:771"]},"2109:1255":{"type":"TEXT","id":"2109:1255","name":"READINGABLE","absoluteBoundingBox":{"x":-4149.0,"y":3399.81616210938,"width":469.394470214844,"height":42.5106391906738},"isolatedAbsoluteRenderBounds":{"x":-4145.36376953125,"y":3407.96020507812,"width":268.572265625,"height":27.323974609375},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,92.816162109375]],"size":{"x":469.394470214844,"y":42.5106391906738},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"TOP","horizontal":"SCALE"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"right":{"pixelOffset":0.0,"sizeFraction":0.477998442173975},"top":{"pixelOffset":92.816162109375,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":2.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[21,21,21,21,21,21,21,21,21,21,21,20,20],"characters":"READINGABLE \n","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"style":{"fontFamily":"Gasoek One","fontPostScriptName":"GasoekOne-Regular","fontStyle":"Regular","fontVariantPosition":"NORMAL","fontSize":36.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":3.6,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":39.2400016784668,"lineHeightPercent":75.2762451171875,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{"21":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","fontSize":36.0,"letterSpacing":3.6,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100},"20":{"fontSize":36.0,"paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100}}},"2695:763":{"type":"FRAME","id":"2695:763","name":"Frame 2","absoluteBoundingBox":{"x":-2954.0,"y":-479.0,"width":365.0,"height":430.0},"isolatedAbsoluteRenderBounds":{"x":-2954.0,"y":-479.0,"width":365.0,"height":430.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":365.0,"y":430.0},"fills":[],"strokeAlign":"INSIDE","maxWidth":375.0,"strokes":[],"accessibleHTMLTag":"HEADER","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":24.0,"paddingRight":44.0,"paddingBottom":24.0,"paddingLeft":44.0,"layoutMode":"VERTICAL","itemSpacing":40.0,"counterAxisAlignItems":"CENTER","children":["2695:764"]},"5:1289":{"type":"TEXT","id":"5:1289","name":"hello@brainable.co.kr","absoluteBoundingBox":{"x":-4155.0,"y":6626.0,"width":255.0,"height":20.0},"isolatedAbsoluteRenderBounds":{"x":-4155.0,"y":6626.0,"width":255.0,"height":20.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":255.0,"y":20.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"visible":false,"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"hover":{"transition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.300000011920929,"delay":0.0},"state":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.699999988079071},"behaviorType":"hover"}},"characterStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1],"characters":"hello@brainable.co.kr","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"styleIdForText":"StyleId:6:1356","fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","hyperlink":{"type":"URL","url":"mailto:hello@figma.com","openInNewTab":true},"textAutoResize":"HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"styleIdForText":"StyleId:6:1356","fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"styleIdForText":"StyleId:6:1356","fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":0.0,"name":"Mobile","style":{"styleIdForText":"StyleId:6:1356","fontSize":14.0,"letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":119.466667175293,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":14.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.6000003814697,"lineHeightPercent":107.692314147949,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{"1":{"styleIdForText":"StyleId:6:1356","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100}}},"10:4383":{"type":"FRAME","id":"10:4383","name":"Offering content","absoluteBoundingBox":{"x":-4188.0,"y":2662.0,"width":137.0,"height":29.0},"isolatedAbsoluteRenderBounds":{"x":-4188.0,"y":2662.0,"width":137.0,"height":29.0},"relativeTransform":[[1.0,0.0,110.0],[0.0,1.0,172.0]],"size":{"x":137.0,"y":29.0},"fills":[],"constraintValues":{"left":{"pixelOffset":110.0,"sizeFraction":0.0},"top":{"pixelOffset":172.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","layoutPositioning":"ABSOLUTE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED","children":[]},"2102:310":{"type":"TEXT","id":"2102:310","name":"놀라운 기술력을 바탕으로, 세상에 없던 제품을 만듭니다.","absoluteBoundingBox":{"x":-4298.0,"y":2013.0,"width":1280.0,"height":136.0},"isolatedAbsoluteRenderBounds":{"x":-4059.01831054688,"y":2027.56005859375,"width":799.880126953125,"height":109.219970703125},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,341.0]],"size":{"x":1280.0,"y":136.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"CENTER","horizontal":"CENTER"},"constraintValues":{"left":{"pixelOffset":-640.0,"sizeFraction":0.5},"right":{"pixelOffset":640.0,"sizeFraction":0.5},"top":{"pixelOffset":-68.0,"sizeFraction":0.5},"bottom":{"pixelOffset":68.0,"sizeFraction":0.5}},"strokeAlign":"OUTSIDE","layoutPositioning":"ABSOLUTE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"characterStyleOverrides":[],"characters":"놀라운 기술력을 바탕으로, 세상에 없던\n제품을 만듭니다.","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"BOTTOM","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","hangingPunctuation":true,"textCase":"TITLE","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":45.0,"textAlignHorizontal":"CENTER","textAlignVertical":"BOTTOM","letterSpacing":4.5,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":67.5,"lineHeightPercent":124.999992370605,"lineHeightPercentFontSize":150.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2695:771":{"type":"TEXT","id":"2695:771","name":"오시는길","absoluteBoundingBox":{"x":-2801.0,"y":-120.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-2800.8173828125,"y":-116.312004089355,"width":58.63623046875,"height":16.5120010375977},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,220.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"센터소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"hyperlink":{"type":"NODE","nodeID":"/센터소개"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"5:1291":{"type":"FRAME","id":"5:1291","name":"Contact column 2","absoluteBoundingBox":{"x":-3803.0,"y":6626.0,"width":255.0,"height":66.0},"isolatedAbsoluteRenderBounds":{"x":-3803.0,"y":6626.0,"width":255.0,"height":66.0},"relativeTransform":[[1.0,0.0,352.0],[0.0,1.0,0.0]],"size":{"x":255.0,"y":66.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":2.0,"primaryAxisAlignItems":"CENTER","children":["5:1292"]},"5:1290":{"type":"TEXT","id":"5:1290","name":"010-8123-7857 02)-581-7856","absoluteBoundingBox":{"x":-4155.0,"y":6628.5,"width":255.0,"height":55.0},"isolatedAbsoluteRenderBounds":{"x":-4154.2001953125,"y":6634.56396484375,"width":126.371826171875,"height":38.072265625},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,2.5]],"size":{"x":255.0,"y":55.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"hover":{"transition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.300000011920929,"delay":0.0},"state":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.699999988079071},"behaviorType":"hover"}},"characterStyleOverrides":[],"characters":"010-8123-7857\n02)-581-7856","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":1.6,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":22.8799991607666,"lineHeightPercent":119.166664123535,"lineHeightPercentFontSize":143.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2224:2668":{"mainComponentId":"6:1477","type":"INSTANCE","id":"2224:2668","name":"Button Dark","absoluteBoundingBox":{"x":-3715.0,"y":5741.0,"width":114.0,"height":55.0},"isolatedAbsoluteRenderBounds":{"x":-3715.0,"y":5741.0,"width":114.0,"height":55.0},"relativeTransform":[[1.0,0.0,312.0],[0.0,1.0,794.0]],"size":{"x":114.0,"y":55.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":193,"localID":83},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":2090,"localID":90},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/센터소개"}],"isDeleted":false,"stateManagementVersion":1},{"id":{"sessionID":9,"localID":2665},"event":{"interactionType":"ON_HOVER"},"actions":[{"transitionNodeID":{"sessionID":6,"localID":1477},"transitionType":"SMART_ANIMATE","transitionDuration":0.300000011920929,"easingType":"OUT_CUBIC","easingFunction":[0.0,0.0,0.579999983310699,1.0],"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","transitionResetVideoPosition":false,"stateGroupContext":"6:1478"}],"isDeleted":false,"stateManagementVersion":1}],"rectangleCornerRadii":[500.0,500.0,500.0,500.0],"cornerRadius":500.0,"paddingTop":18.0,"paddingRight":24.0,"paddingBottom":18.0,"paddingLeft":24.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","children":["I2224:2668;6:1476"],"componentSetId":"6:1478","componentProperties":{"Property 1":{"value":"Hover","type":"VARIANT","boundVariables":{}}},"overrides":[{"key":[],"value":{"behaviors":null,"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","size":{"x":114.0,"y":55.0},"interactions":[{"id":{"sessionID":193,"localID":83},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":2090,"localID":90},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/센터소개"}],"isDeleted":false,"stateManagementVersion":1},{"id":{"sessionID":9,"localID":2665},"event":{"interactionType":"ON_HOVER"},"actions":[{"transitionNodeID":{"sessionID":6,"localID":1477},"transitionType":"SMART_ANIMATE","transitionDuration":0.300000011920929,"easingType":"OUT_CUBIC","easingFunction":[0.0,0.0,0.579999983310699,1.0],"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","transitionResetVideoPosition":false,"stateGroupContext":"6:1478"}],"isDeleted":false,"stateManagementVersion":1},{"id":{"sessionID":9,"localID":2659},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":6,"localID":1477},"transitionType":"SMART_ANIMATE","transitionDuration":0.300000011920929,"easingType":"OUT_CUBIC","easingFunction":[0.0,0.0,0.579999983310699,1.0],"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","transitionResetVideoPosition":false}],"isDeleted":true,"stateManagementVersion":1},{"id":{"sessionID":9,"localID":2662},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"URL","connectionURL":"figma.com/sites","openUrlInNewTab":true}],"isDeleted":true,"stateManagementVersion":1},{"id":{"sessionID":10,"localID":3480},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":9,"localID":2725},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","openUrlInNewTab":true}],"isDeleted":true,"stateManagementVersion":1}]},"componentId":"6:1477"},{"key":["제품소개0"],"value":{"characterStyleOverrides":[],"characters":"CONTACTS","fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.32,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.2000007629395,"lineHeightPercent":100.0,"lineHeightPercentFontSize":120.000007629395,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"lineHeightPercent":null,"lineHeightPercentFontSize":null,"lineHeightPx":null,"lineHeightUnit":null,"lineIndentations":[0],"lineStyleOverrides":[0],"lineTypes":["NONE"],"name":"회사소개","openTypeFlags":null,"styleOverrideTable":{},"text":null,"textAlignVertical":"CENTER","textDecoration":null,"textDecorationSkipInk":null},"componentId":"6:1477"}]},"2108:1144":{"type":"RECTANGLE","id":"2108:1144","name":"brainable_logo_ver.001-02 1","absoluteBoundingBox":{"x":-3691.04907226562,"y":2075.0,"width":130.048614501953,"height":92.70263671875},"targetAspectRatio":{"x":130.048614501953,"y":92.70263671875},"isolatedAbsoluteRenderBounds":{"x":-3691.04907226562,"y":2075.0,"width":130.048583984375,"height":92.70263671875},"relativeTransform":[[1.0,0.0,281.950988769531],[0.0,1.0,20.0]],"size":{"x":130.048614501953,"y":92.70263671875},"fills":[{"opacity":0.670000016689301,"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"5a2eead312ec2ae252dc5a353cb3f7a48575eadc","originalImageWidth":1400,"originalImageHeight":1167,"visible":true,"rotation":0.0}],"constraintValues":{"left":{"pixelOffset":606.950988769531,"sizeFraction":0.0},"top":{"pixelOffset":403.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[]},"2702:510":{"type":"TEXT","id":"2702:510","name":"제품소개","absoluteBoundingBox":{"x":-4140.0,"y":-230.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-4139.8173828125,"y":-226.311996459961,"width":58.63623046875,"height":16.5119934082031},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,110.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"제품소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"hyperlink":{"type":"NODE","nodeID":"/laserable"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2149:4119":{"type":"TEXT","id":"2149:4119","name":"PBM 테라피 장비","absoluteBoundingBox":{"x":-2844.0,"y":576.0,"width":178.107711791992,"height":26.0},"isolatedAbsoluteRenderBounds":{"x":-2846.81591796875,"y":577.864013671875,"width":168.424072265625,"height":32.2959594726562},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":178.107711791992,"y":26.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.464608997106552,"g":0.964307248592377,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"TOP","horizontal":"LEFT"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"top":{"pixelOffset":0.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0724911093711853,"g":0.591715276241302,"b":0.72152179479599,"a":1.0},"visible":true,"opacity":1.0}],"effects":[{"type":"DROP_SHADOW","visible":true,"color":{"r":0.0,"g":0.0,"b":0.0,"a":0.25},"blendMode":"NORMAL","offset":{"x":0.0,"y":4.0},"radius":4.0,"showShadowBehindNode":false,"spread":0.0}],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"PBM 테라피 장비","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":24.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-1.2,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":26.1599998474121,"lineHeightPercent":90.8333282470703,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2149:3574":{"type":"FRAME","id":"2149:3574","name":"Our clients section","absoluteBoundingBox":{"x":-3020.0,"y":3118.0,"width":1280.0,"height":1427.0},"isolatedAbsoluteRenderBounds":{"x":-3020.0,"y":3118.0,"width":1280.0,"height":1427.0},"relativeTransform":[[1.0,0.0,-66.0],[0.0,1.0,2797.0]],"size":{"x":1280.0,"y":1427.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraintValues":{"left":{"pixelOffset":-66.0,"sizeFraction":0.0},"top":{"pixelOffset":2797.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","layoutPositioning":"ABSOLUTE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":276.0,"paddingRight":271.0,"paddingBottom":116.0,"paddingLeft":271.0,"clipsContent":true,"layoutMode":"VERTICAL","itemSpacing":74.0,"counterAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","isInAnimateTree":true,"children":["2149:3575"]},"2119:1764":{"type":"FRAME","id":"2119:1764","name":"Welcome body copy","absoluteBoundingBox":{"x":-2802.0,"y":2689.0,"width":462.0,"height":201.0},"isolatedAbsoluteRenderBounds":{"x":-2802.0,"y":2689.0,"width":942.0,"height":201.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,160.0]],"size":{"x":462.0,"y":201.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":50.0,"counterAxisSizingMode":"FIXED","isInAnimateTree":true,"children":["2119:1765","2191:181"]},"2579:6693":{"type":"TEXT","id":"2579:6693","name":"Text","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":13.0,"height":12.0},"isolatedAbsoluteRenderBounds":{"x":-0.0800000056624413,"y":2.54999923706055,"width":12.6715631484985,"height":9.84000110626221},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":13.0,"y":12.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Black","fontStyle":"Black","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":10.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":12.0,"lineHeightPercent":100.0,"lineHeightUnit":"INTRINSIC_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED","lineHeightPercentFontSize":100},"styleOverrideTable":{}},"4:748":{"type":"TEXT","id":"4:748","name":"Paragraph/Paragraph 1","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":39.0,"height":35.0},"isolatedAbsoluteRenderBounds":{"x":0.64000004529953,"y":6.27999877929688,"width":35.0205001831055,"height":27.9039993286133},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":39.0,"y":35.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"fontSize":32.0,"letterSpacing":-1.6,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":34.8800010681152,"lineHeightPercent":93.0133361816406,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"fontSize":32.0,"letterSpacing":-1.6,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":34.8800010681152,"lineHeightPercent":93.0133361816406,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":1.0,"name":"Mobile","style":{"fontSize":22.0,"letterSpacing":-1.1,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.980001449585,"lineHeightPercent":93.0133361816406,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":32.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-1.6,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":34.8800010681152,"lineHeightPercent":83.8461532592773,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2577:739":{"type":"TEXT","id":"2577:739","name":"Text lg / Semibold","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":70.0,"height":28.0},"isolatedAbsoluteRenderBounds":{"x":0.0,"y":0.0,"width":70.0,"height":28.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":70.0,"y":28.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"visible":false,"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Rag 123","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":18.0}},"textAutoResize":"WIDTH_AND_HEIGHT","paragraphSpacing":18.0,"style":{"fontFamily":"Inter","fontPostScriptName":null,"fontStyle":"Semi Bold","paragraphSpacing":18.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":28.0,"lineHeightPercent":128.5341796875,"lineHeightPercentFontSize":155.555557250977,"lineHeightUnit":"PIXELS","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2702:500":{"type":"TEXT","id":"2702:500","name":"제품소개","absoluteBoundingBox":{"x":-3927.0,"y":-429.0,"width":71.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-3926.69750976562,"y":-424.31201171875,"width":70.396240234375,"height":16.5120239257812},"relativeTransform":[[1.0,0.0,91.0],[0.0,1.0,0.0]],"size":{"x":71.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"제품소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"style":{"styleIdForText":"StyleId:2608:2916","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","hyperlink":{"type":"NODE","nodeID":"/laserable"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":3.84,"letterSpacingValue":24.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":120.83332824707,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"106:828":{"type":"FRAME","id":"106:828","name":"Contact column 4","absoluteBoundingBox":{"x":-2326.0,"y":546.0,"width":255.0,"height":20.0},"isolatedAbsoluteRenderBounds":{"x":-2326.0,"y":546.0,"width":255.0,"height":20.0},"relativeTransform":[[1.0,0.0,600.0],[0.0,1.0,0.0]],"size":{"x":255.0,"y":20.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":2.0,"primaryAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","children":[]},"4:902":{"type":"FRAME","id":"4:902","name":"Header section","absoluteBoundingBox":{"x":-4298.0,"y":-335.0,"width":1280.0,"height":991.0},"isolatedAbsoluteRenderBounds":{"x":-4298.0,"y":-335.0,"width":1698.0,"height":991.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,144.0]],"size":{"x":1280.0,"y":991.0},"fills":[{"blendMode":"NORMAL","type":"VIDEO","scaleMode":"FILL","imageRef":"933cf4df3736a6926c3a3bafb0e3bb5fefa6361f","originalImageWidth":1920,"originalImageHeight":1080,"videoRef":"c52b1e752c910ebdb03f10fcd0aaf34af1c288bc","visible":true,"opacity":1.0,"autoplay":true,"mediaLoop":true,"muted":true,"showControls":true}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","scrollBehavior":"STICKY_SCROLLS","strokes":[],"accessibleHTMLTag":"VIDEO","isDecorativeImage":false,"accessibleLabel":"ablstract visual art video","ariaAttributes":{},"interactions":[],"paddingTop":40.0,"paddingLeft":55.0,"layoutMode":"VERTICAL","itemSpacing":86.0,"primaryAxisAlignItems":"MAX","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2702:531"]},"2108:1142":{"type":"GROUP","id":"2108:1142","name":"Brainable 로고","absoluteBoundingBox":{"x":-3973.0,"y":2055.0,"width":192.999603271484,"height":92.70263671875},"isolatedAbsoluteRenderBounds":{"x":-3973.0,"y":2055.0,"width":192.999603271484,"height":92.70263671875},"relativeTransform":[[1.0,0.0,325.0],[0.0,1.0,383.0]],"size":{"x":192.999603271484,"y":92.70263671875},"fills":[],"visible":false,"constraints":{"vertical":"TOP","horizontal":"LEFT"},"constraintValues":{"left":{"pixelOffset":325.0,"sizeFraction":0.0},"top":{"pixelOffset":383.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","layoutPositioning":"ABSOLUTE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"children":["2108:1143","2108:1144"]},"6:1452":{"type":"FRAME","id":"6:1452","name":"Footer contact information","absoluteBoundingBox":{"x":-2926.0,"y":546.0,"width":744.0,"height":60.0},"isolatedAbsoluteRenderBounds":{"x":-2926.0,"y":546.0,"width":855.0,"height":60.0},"relativeTransform":[[1.0,0.0,28.0],[0.0,1.0,296.0]],"size":{"x":744.0,"y":60.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":45.0,"primaryAxisSizingMode":"FIXED","children":["6:1453","6:1456","106:828"]},"2702:508":{"type":"TEXT","id":"2702:508","name":"회사소개","absoluteBoundingBox":{"x":-4140.0,"y":-340.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-4139.658203125,"y":-334.0,"width":58.322998046875,"height":15.2000122070312},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"HOME","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"style":{"styleIdForText":"StyleId:2608:2916","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","hyperlink":{"type":"NODE","nodeID":"/"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":3.84,"letterSpacingValue":24.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":120.83332824707,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2702:526":{"type":"TEXT","id":"2702:526","name":"회사소개","absoluteBoundingBox":{"x":-2796.0,"y":-340.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-2795.65844726562,"y":-334.0,"width":58.3232421875,"height":15.2000122070312},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"HOME","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"style":{"styleIdForText":"StyleId:2608:2916","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","hyperlink":{"type":"NODE","nodeID":"/"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":3.84,"letterSpacingValue":24.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":120.83332824707,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"5:1323":{"type":"FRAME","id":"5:1323","name":"Footer header","absoluteBoundingBox":{"x":-2922.0,"y":3819.0,"width":311.0,"height":42.0},"isolatedAbsoluteRenderBounds":{"x":-2922.0,"y":3819.0,"width":311.0,"height":42.0},"relativeTransform":[[1.0,0.0,32.0],[0.0,1.0,87.0]],"size":{"x":311.0,"y":42.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":24.0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2109:1177","2109:1181"]},"5:1322":{"type":"FRAME","id":"5:1322","name":"Footer section","absoluteBoundingBox":{"x":-2954.0,"y":3732.0,"width":375.0,"height":907.0},"isolatedAbsoluteRenderBounds":{"x":-2954.0,"y":3732.0,"width":590.0,"height":907.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,4211.0]],"size":{"x":375.0,"y":907.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"FOOTER","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":87.0,"paddingRight":32.0,"paddingBottom":29.0,"paddingLeft":32.0,"layoutMode":"VERTICAL","itemSpacing":57.0,"primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["5:1323","5:1329","5:1331","5:1342"]},"2702:535":{"type":"RECTANGLE","id":"2702:535","name":"브레인에이블/W,ip","absoluteBoundingBox":{"x":-4241.0,"y":232.0,"width":268.0,"height":39.0},"targetAspectRatio":{"x":491.0,"y":71.0},"isolatedAbsoluteRenderBounds":{"x":-4241.0,"y":232.0,"width":268.0,"height":39.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,148.0]],"size":{"x":268.0,"y":39.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"fde0244a54e45655f579546c98baaa88b4e2d8c7","originalImageWidth":491,"originalImageHeight":71,"visible":true,"opacity":1.0,"rotation":0.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":150.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"},"scrollParallax":{"axis":"VERTICAL","speed":0.649999976158142,"relativeToPage":false,"behaviorType":"scrollParallax"}}},"64:711":{"type":"FRAME","id":"64:711","name":"Slideshow navigation","absoluteBoundingBox":{"x":-5919.4443359375,"y":-175.111114501953,"width":70.8888854980469,"height":10.222222328186},"isolatedAbsoluteRenderBounds":{"x":-5919.4443359375,"y":-175.111114501953,"width":70.8888854980469,"height":10.2222290039062},"relativeTransform":[[1.0,0.0,44.0],[0.0,1.0,6.88888883590698]],"size":{"x":70.8888854980469,"y":10.222222328186},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","children":["64:712","64:713","64:714","64:715"]},"2695:767":{"type":"TEXT","id":"2695:767","name":"회사소개","absoluteBoundingBox":{"x":-2801.0,"y":-340.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-2800.65844726562,"y":-334.0,"width":58.3232421875,"height":15.2000122070312},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"HOME","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"style":{"styleIdForText":"StyleId:2608:2916","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","hyperlink":{"type":"NODE","nodeID":"/"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":3.84,"letterSpacingValue":24.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":120.83332824707,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2695:750":{"type":"TEXT","id":"2695:750","name":"회사소개","absoluteBoundingBox":{"x":-2677.0,"y":795.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-2676.8173828125,"y":798.68798828125,"width":58.63623046875,"height":16.5120239257812},"relativeTransform":[[1.0,0.0,80.0],[0.0,1.0,0.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"회사소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"hyperlink":{"type":"NODE","nodeID":"/about_us"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2695:760":{"type":"TEXT","id":"2695:760","name":"커뮤니티","absoluteBoundingBox":{"x":-2485.0,"y":-429.0,"width":71.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-2484.69750976562,"y":-424.31201171875,"width":70.396240234375,"height":16.5120239257812},"relativeTransform":[[1.0,0.0,194.0],[0.0,1.0,0.0]],"size":{"x":71.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"오시는길","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"style":{"styleIdForText":"StyleId:2608:2916","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","hyperlink":{"type":"NODE","nodeID":"/커뮤니티Articles"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":3.84,"letterSpacingValue":24.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":120.83332824707,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2702:529":{"type":"TEXT","id":"2702:529","name":"커뮤니티","absoluteBoundingBox":{"x":-2796.0,"y":-175.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-2795.8173828125,"y":-171.311996459961,"width":58.63623046875,"height":16.5119934082031},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,165.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"커뮤니티","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"hyperlink":{"type":"NODE","nodeID":"/커뮤니티Articles"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2702:520":{"type":"TEXT","id":"2702:520","name":"센터소개","absoluteBoundingBox":{"x":-2377.0,"y":-429.0,"width":71.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-2376.69750976562,"y":-424.31201171875,"width":70.396240234375,"height":16.5120239257812},"relativeTransform":[[1.0,0.0,297.0],[0.0,1.0,0.0]],"size":{"x":71.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"센터소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"style":{"styleIdForText":"StyleId:2608:2916","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","hyperlink":{"type":"NODE","nodeID":"/센터소개"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":3.84,"letterSpacingValue":24.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":120.83332824707,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2695:696":{"type":"TEXT","id":"2695:696","name":"제품소개","absoluteBoundingBox":{"x":-3323.0,"y":-418.5,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-3322.8173828125,"y":-414.81201171875,"width":58.63623046875,"height":16.5120239257812},"relativeTransform":[[1.0,0.0,171.0],[0.0,1.0,0.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"제품소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"hyperlink":{"type":"NODE","nodeID":"/laserable"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2702:512":{"type":"TEXT","id":"2702:512","name":"오시는길","absoluteBoundingBox":{"x":-4140.0,"y":-120.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-4139.8173828125,"y":-116.312004089355,"width":58.63623046875,"height":16.5120010375977},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,220.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"센터소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"hyperlink":{"type":"NODE","nodeID":"/센터소개"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"5:1335":{"type":"FRAME","id":"5:1335","name":"Contact column 2","absoluteBoundingBox":{"x":-2774.0,"y":4003.0,"width":155.0,"height":77.0},"isolatedAbsoluteRenderBounds":{"x":-2774.0,"y":4003.0,"width":155.0,"height":77.0},"relativeTransform":[[1.0,0.0,148.0],[0.0,1.0,0.0]],"size":{"x":155.0,"y":77.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":2.0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["5:1336"]},"2702:509":{"type":"TEXT","id":"2702:509","name":"제품소개","absoluteBoundingBox":{"x":-4140.0,"y":-285.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-4139.8173828125,"y":-281.31201171875,"width":58.63623046875,"height":16.5120239257812},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,55.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"회사소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"hyperlink":{"type":"NODE","nodeID":"/about_us"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"6:1520":{"mainComponentId":"6:1477","type":"INSTANCE","id":"6:1520","name":"Button Dark","absoluteBoundingBox":{"x":-4101.5,"y":1437.5,"width":106.0,"height":55.0},"isolatedAbsoluteRenderBounds":{"x":-4101.5,"y":1437.5,"width":106.0,"height":55.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,335.0]],"size":{"x":106.0,"y":55.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":193,"localID":83},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":6,"localID":1529},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/about_us"}],"isDeleted":false,"stateManagementVersion":1},{"id":{"sessionID":9,"localID":2665},"event":{"interactionType":"ON_HOVER"},"actions":[{"transitionNodeID":{"sessionID":6,"localID":1477},"transitionType":"SMART_ANIMATE","transitionDuration":0.300000011920929,"easingType":"OUT_CUBIC","easingFunction":[0.0,0.0,0.579999983310699,1.0],"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","transitionResetVideoPosition":false,"stateGroupContext":"6:1478"}],"isDeleted":false,"stateManagementVersion":1}],"rectangleCornerRadii":[500.0,500.0,500.0,500.0],"cornerRadius":500.0,"paddingTop":18.0,"paddingRight":24.0,"paddingBottom":18.0,"paddingLeft":24.0,"layoutMode":"HORIZONTAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"MAX","children":["I6:1520;6:1476"],"componentSetId":"6:1478","componentProperties":{"Property 1":{"value":"Hover","type":"VARIANT","boundVariables":{}}},"overrides":[{"key":[],"value":{"behaviors":null,"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"primaryAxisAlignItems":"MAX","size":{"x":106.0,"y":55.0},"interactions":[{"id":{"sessionID":193,"localID":83},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":6,"localID":1529},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/about_us"}],"isDeleted":false,"stateManagementVersion":1},{"id":{"sessionID":9,"localID":2665},"event":{"interactionType":"ON_HOVER"},"actions":[{"transitionNodeID":{"sessionID":6,"localID":1477},"transitionType":"SMART_ANIMATE","transitionDuration":0.300000011920929,"easingType":"OUT_CUBIC","easingFunction":[0.0,0.0,0.579999983310699,1.0],"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","transitionResetVideoPosition":false,"stateGroupContext":"6:1478"}],"isDeleted":false,"stateManagementVersion":1},{"id":{"sessionID":9,"localID":2659},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":6,"localID":1477},"transitionType":"SMART_ANIMATE","transitionDuration":0.300000011920929,"easingType":"OUT_CUBIC","easingFunction":[0.0,0.0,0.579999983310699,1.0],"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","transitionResetVideoPosition":false}],"isDeleted":true,"stateManagementVersion":1},{"id":{"sessionID":9,"localID":2662},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"URL","connectionURL":"figma.com/sites","openUrlInNewTab":true}],"isDeleted":true,"stateManagementVersion":1},{"id":{"sessionID":10,"localID":3480},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":9,"localID":2725},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","openUrlInNewTab":true}],"isDeleted":true,"stateManagementVersion":1}]},"componentId":"6:1477"},{"key":["제품소개0"],"value":{"characterStyleOverrides":[],"characters":"회사소개","fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","hyperlink":{"type":"NODE","nodeID":"/about_us"},"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.32,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.2000007629395,"lineHeightPercent":100.0,"lineHeightPercentFontSize":120.000007629395,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"lineHeightPercent":null,"lineHeightPercentFontSize":null,"lineHeightPx":null,"lineHeightUnit":null,"lineIndentations":[0],"lineStyleOverrides":[0],"lineTypes":["NONE"],"name":"회사소개","openTypeFlags":null,"styleOverrideTable":{},"text":null,"textAlignVertical":"CENTER","textDecoration":null,"textDecorationSkipInk":null},"componentId":"6:1477"}]},"32:787":{"type":"FRAME","id":"32:787","name":"Our clients quote 1","absoluteBoundingBox":{"x":-6203.0,"y":-759.0,"width":638.0,"height":497.0},"isolatedAbsoluteRenderBounds":{"x":-6203.0,"y":-759.0,"width":638.0,"height":497.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":638.0,"y":497.0},"fills":[],"strokeAlign":"INSIDE","layoutGrow":1.0,"strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":32.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","children":["32:788","32:789"]},"64:700":{"type":"SVG","id":"64:700","name":"Ellipse 181","absoluteBoundingBox":{"x":-5899.22216796875,"y":-959.611083984375,"width":10.222222328186,"height":10.222222328186},"targetAspectRatio":{"x":11.0,"y":11.0},"isolatedAbsoluteRenderBounds":{"x":-5899.22216796875,"y":-959.611083984375,"width":10.22216796875,"height":10.2222290039062},"relativeTransform":[[1.0,0.0,20.2222213745117],[0.0,1.0,0.0]],"size":{"x":10.222222328186,"y":10.222222328186},"fills":[{"opacity":0.800000011920929,"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Currently selected quote - 2 of 4","ariaAttributes":{},"interactions":[],"hash":"2edf0a2574fd046031ec27a85cb2479acbee6258"},"4:929":{"type":"TEXT","id":"4:929","name":"주식회사 브레인에이블은 두뇌 건강과 인지 능력 향상을 위한 과학 기반의 솔루션을 연구·개발하고 제공하는 뇌과학 전문 헬스테크 기업입니다. 신경과학, 교육공학, 디지털 치료기술을 융합하여 집중력, 기억력, 학습 능력, 실행 기능(Executive Function) 향상에 도움을 주는 프로그램과 기기를 개발하고 있습니다.","absoluteBoundingBox":{"x":-4101.5,"y":1102.5,"width":1180.0,"height":165.0},"isolatedAbsoluteRenderBounds":{"x":-4100.833984375,"y":1132.48803710938,"width":872.52099609375,"height":106.433959960938},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":1180.0,"y":165.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"strokeWeight":3.45461630821228,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79],"characters":"주식회사 브레인에이블은 두뇌 건강과 인지 능력 향상을 위한 과학 기반의 솔루션을 연구·개발하고 제공하는 \n뇌과학 전문 헬스테크 기업입니다. \n신경과학, 교육공학, 디지털 치료기술을 융합하여 집중력, 기억력, 학습 능력, 실행 기능(Executive Function)\n향상에 도움을 주는 프로그램과 기기를 개발하고 있습니다.","lineIndentations":[0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"3":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAlignVertical":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"LEFT","textAlignVertical":"CENTER","letterSpacing":0.9,"letterSpacingValue":5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":30.4200019836426,"lineHeightPercent":140.83332824707,"lineHeightPercentFontSize":169.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{"79":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100}}},"6:1451":{"type":"TEXT","id":"6:1451","name":"Pioneer of the Wellness-tech Solution.","absoluteBoundingBox":{"x":-2926.0,"y":482.0,"width":744.0,"height":16.0},"isolatedAbsoluteRenderBounds":{"x":-2924.7880859375,"y":485.2919921875,"width":201.1025390625,"height":9.864013671875},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":744.0,"y":16.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutGrow":1.0,"strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Pioneer of the Wellness-tech Solution.","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":12.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.24,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":16.2000007629395,"lineHeightPercent":112.499992370605,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2702:496":{"type":"FRAME","id":"2702:496","name":"Header 1","absoluteBoundingBox":{"x":-4293.0,"y":-479.0,"width":375.0,"height":123.0},"isolatedAbsoluteRenderBounds":{"x":-4293.0,"y":-479.0,"width":375.0,"height":123.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":375.0,"y":123.0},"fills":[],"visible":false,"strokeAlign":"INSIDE","layoutGrow":1.0,"strokes":[],"accessibleHTMLTag":"HEADER","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":24.0,"paddingRight":64.0,"paddingBottom":24.0,"paddingLeft":64.0,"layoutMode":"HORIZONTAL","itemSpacing":16.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED","children":["2702:497","2702:498"]},"2702:502":{"type":"TEXT","id":"2702:502","name":"센터소개","absoluteBoundingBox":{"x":-3721.0,"y":-429.0,"width":71.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-3720.69750976562,"y":-424.31201171875,"width":70.396240234375,"height":16.5120239257812},"relativeTransform":[[1.0,0.0,297.0],[0.0,1.0,0.0]],"size":{"x":71.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"센터소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"style":{"styleIdForText":"StyleId:2608:2916","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","hyperlink":{"type":"NODE","nodeID":"/센터소개"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":3.84,"letterSpacingValue":24.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":120.83332824707,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"32:758":{"type":"SVG","id":"32:758","name":"Ellipse 180","absoluteBoundingBox":{"x":-5919.4443359375,"y":-1548.61108398438,"width":10.222222328186,"height":10.222222328186},"targetAspectRatio":{"x":11.0,"y":11.0},"isolatedAbsoluteRenderBounds":{"x":-5919.4443359375,"y":-1548.61108398438,"width":10.22216796875,"height":10.22216796875},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":10.222222328186,"y":10.222222328186},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.192156866192818,"g":0.0666666701436043,"b":0.0588235296308994,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Currently selected quote - 1 of 4","ariaAttributes":{},"interactions":[],"hash":"0eeda1840f980a8ed0e689fe1f9824353bafb041"},"2149:3579":{"mainComponentId":"32:810","type":"INSTANCE","id":"2149:3579","name":"슬라이더 1","absoluteBoundingBox":{"x":-2749.0,"y":3652.0,"width":738.0,"height":661.0},"isolatedAbsoluteRenderBounds":{"x":-2749.0,"y":3652.0,"width":738.0,"height":661.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,258.0]],"size":{"x":738.0,"y":661.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.966601550579071,"g":0.966601550579071,"b":0.966601550579071,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","maxWidth":738.0,"minHeight":445.0,"strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":30.0,"paddingRight":50.0,"paddingBottom":30.0,"paddingLeft":50.0,"layoutMode":"VERTICAL","itemSpacing":80.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","children":["I2149:3579;32:786","I2149:3579;64:707"],"componentSetId":"32:813","componentProperties":{"Property 1":{"value":"Carousel slide 3","type":"VARIANT","boundVariables":{}}},"overrides":[{"key":["Slideshow nav bar0","Slideshow navigation0","Ellipse 1800"],"value":{"behaviors":null,"interactions":[{"id":{"sessionID":32,"localID":919},"event":{"interactionType":"ON_HOVER"},"actions":[{"transitionNodeID":{"sessionID":-1,"localID":-1},"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","transitionResetScrollPosition":false,"transitionResetInteractiveComponents":true}],"isDeleted":true,"stateManagementVersion":1},{"id":{"sessionID":186,"localID":71},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"NONE"}],"isDeleted":true,"stateManagementVersion":1},{"id":{"sessionID":186,"localID":74},"event":{"interactionType":"ON_CLICK"},"actions":[{"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE"}],"isDeleted":true,"stateManagementVersion":1}]},"componentId":"32:810"},{"key":["Slideshow nav bar0","Slideshow navigation0","Ellipse 1810"],"value":{"accessibleLabel":"Customer quote 2 of 4"},"componentId":"32:810"},{"key":["Slideshow nav bar0","Slideshow navigation0","Ellipse 1830"],"value":{"accessibleLabel":"Customer quote 4 of 4"},"componentId":"32:810"},{"key":["Slideshow nav bar0","Left arrow0"],"value":{"accessibleLabel":"Arrow icon that navigates to previous customer quote"},"componentId":"32:810"},{"key":["Slideshow nav bar0","Right arrow0"],"value":{"accessibleLabel":"Arrow icon that navigates to next customer quote"},"componentId":"32:810"}]},"4:944":{"type":"FRAME","id":"4:944","name":"Welcome body paragraphs","absoluteBoundingBox":{"x":-2930.0,"y":749.5,"width":325.0,"height":163.0},"isolatedAbsoluteRenderBounds":{"x":-2930.0,"y":749.5,"width":325.0,"height":163.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":325.0,"y":163.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":24.0,"primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["4:945"]},"2702:524":{"type":"RECTANGLE","id":"2702:524","name":"Logo","absoluteBoundingBox":{"x":-2872.0,"y":-431.0,"width":211.0,"height":75.0},"isolatedAbsoluteRenderBounds":{"x":-2872.0,"y":-431.0,"width":211.0,"height":75.0},"relativeTransform":[[1.0,0.0,33.0],[0.0,1.0,24.0]],"size":{"x":211.0,"y":75.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"64270238d3de4edd07597c9179b36856b5a53af3","originalImageWidth":1400,"originalImageHeight":1167,"visible":true,"opacity":1.0,"rotation":0.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Logomark","ariaAttributes":{},"interactions":[{"id":{"sessionID":2608,"localID":2148},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":0,"localID":3},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/"}],"isDeleted":false,"stateManagementVersion":1}]},"2702:505":{"type":"FRAME","id":"2702:505","name":"Header 1","absoluteBoundingBox":{"x":-4249.0,"y":-455.0,"width":277.0,"height":382.0},"isolatedAbsoluteRenderBounds":{"x":-4249.0,"y":-455.0,"width":277.0,"height":382.0},"relativeTransform":[[1.0,0.0,44.0],[0.0,1.0,24.0]],"size":{"x":277.0,"y":382.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"HEADER","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":24.0,"paddingRight":33.0,"paddingBottom":24.0,"paddingLeft":33.0,"layoutMode":"VERTICAL","itemSpacing":16.0,"counterAxisAlignItems":"CENTER","children":["2702:506","2702:507"]},"2149:3589":{"type":"FRAME","id":"2149:3589","name":"Our clients outro","absoluteBoundingBox":{"x":-3135.5,"y":3404.0,"width":738.0,"height":174.0},"isolatedAbsoluteRenderBounds":{"x":-3135.5,"y":3404.0,"width":738.0,"height":174.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,-1.0,819.0]],"size":{"x":738.0,"y":174.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":10.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2149:3590"]},"2702:497":{"type":"RECTANGLE","id":"2702:497","name":"Logo","absoluteBoundingBox":{"x":-4229.0,"y":-455.0,"width":211.0,"height":75.0},"isolatedAbsoluteRenderBounds":{"x":-4229.0,"y":-455.0,"width":211.0,"height":75.0},"relativeTransform":[[1.0,0.0,64.0],[0.0,1.0,24.0]],"size":{"x":211.0,"y":75.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"64270238d3de4edd07597c9179b36856b5a53af3","originalImageWidth":1400,"originalImageHeight":1167,"visible":true,"opacity":1.0,"rotation":0.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Logomark","ariaAttributes":{},"interactions":[]},"2131:3091":{"type":"GROUP","id":"2131:3091","name":"products lists","absoluteBoundingBox":{"x":-4149.0,"y":2916.0,"width":982.0,"height":1084.5},"isolatedAbsoluteRenderBounds":{"x":-4152.01611328125,"y":2916.0,"width":985.01611328125,"height":1084.5},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,174.0]],"size":{"x":982.0,"y":1084.5},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"children":["2109:1306","2109:1279","2109:1349"]},"64:726":{"type":"SVG","id":"64:726","name":"Ellipse 181","absoluteBoundingBox":{"x":-5899.22216796875,"y":338.388885498047,"width":10.222222328186,"height":10.222222328186},"targetAspectRatio":{"x":11.0,"y":11.0},"isolatedAbsoluteRenderBounds":{"x":-5899.22216796875,"y":338.388885498047,"width":10.22216796875,"height":10.2222290039062},"relativeTransform":[[1.0,0.0,20.2222213745117],[0.0,1.0,0.0]],"size":{"x":10.222222328186,"y":10.222222328186},"fills":[{"opacity":0.25,"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Customer quote 2 of 4","ariaAttributes":{},"interactions":[{"id":{"sessionID":162,"localID":196},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":32,"localID":809},"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","stateGroupContext":"32:813"}],"isDeleted":false,"stateManagementVersion":1}],"hash":"35991871b7ca3007bc0612f8601be0ce1363dd1b"},"2109:1352":{"type":"TEXT","id":"2109:1352","name":"소리미세차이 구분능력 훈련 장비","absoluteBoundingBox":{"x":-4149.0,"y":3752.5,"width":591.0,"height":26.0},"isolatedAbsoluteRenderBounds":{"x":-4152.01611328125,"y":3755.31591796875,"width":368.16015625,"height":30.343994140625},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":591.0,"y":26.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.720453143119812,"g":0.841228127479553,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"TOP","horizontal":"SCALE"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"right":{"pixelOffset":0.0,"sizeFraction":0.613070539419087},"top":{"pixelOffset":0.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[],"effects":[{"type":"DROP_SHADOW","visible":true,"color":{"r":0.0,"g":0.0,"b":0.0,"a":0.25},"blendMode":"NORMAL","offset":{"x":0.0,"y":4.0},"radius":4.0,"showShadowBehindNode":false,"spread":0.0}],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"소리미세차이 구분능력 훈련 장비","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":24.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":2.4,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":26.1599998474121,"lineHeightPercent":90.8333282470703,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"64:725":{"type":"SVG","id":"64:725","name":"Ellipse 180","absoluteBoundingBox":{"x":-5919.4443359375,"y":338.388885498047,"width":10.222222328186,"height":10.222222328186},"targetAspectRatio":{"x":11.0,"y":11.0},"isolatedAbsoluteRenderBounds":{"x":-5919.4443359375,"y":338.388885498047,"width":10.22216796875,"height":10.2222290039062},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":10.222222328186,"y":10.222222328186},"fills":[{"opacity":0.25,"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Customer quote 1 of 4","ariaAttributes":{},"interactions":[{"id":{"sessionID":32,"localID":919},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":32,"localID":808},"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","transitionResetScrollPosition":false,"transitionResetInteractiveComponents":true,"stateGroupContext":"32:813"}],"isDeleted":false,"stateManagementVersion":1}],"hash":"336ac530876eaa2b1db913b1b0df0a39feacfdd3"},"2149:4157":{"type":"TEXT","id":"2149:4157","name":"소리미세차이 구분능력 훈련 장비","absoluteBoundingBox":{"x":-2904.5,"y":2266.0,"width":238.0,"height":39.0},"isolatedAbsoluteRenderBounds":{"x":-2908.00805664062,"y":2266.90795898438,"width":213.0400390625,"height":19.172119140625},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":238.0,"y":39.0},"fills":[{"opacity":0.959999978542328,"blendMode":"NORMAL","type":"SOLID","color":{"r":0.464608997106552,"g":0.964307248592377,"b":1.0,"a":1.0},"visible":true}],"constraints":{"vertical":"TOP","horizontal":"SCALE"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"right":{"pixelOffset":0.0,"sizeFraction":0.891385767790262},"top":{"pixelOffset":0.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[],"effects":[{"type":"DROP_SHADOW","visible":true,"color":{"r":0.0,"g":0.0,"b":0.0,"a":0.25},"blendMode":"NORMAL","offset":{"x":0.0,"y":4.0},"radius":4.0,"showShadowBehindNode":false,"spread":0.0}],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"소리미세차이 구분능력 훈련 장비","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","fontVariantPosition":"NORMAL","fontSize":12.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":2.76,"letterSpacingValue":23.0,"letterSpacingUnit":"PERCENT","lineHeightPx":13.0799999237061,"lineHeightPercent":90.8333282470703,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2702:504":{"type":"FRAME","id":"2702:504","name":"Frame 2","absoluteBoundingBox":{"x":-4293.0,"y":-479.0,"width":365.0,"height":430.0},"isolatedAbsoluteRenderBounds":{"x":-4293.0,"y":-479.0,"width":365.0,"height":430.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":365.0,"y":430.0},"fills":[],"strokeAlign":"INSIDE","maxWidth":375.0,"strokes":[],"accessibleHTMLTag":"HEADER","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":24.0,"paddingRight":44.0,"paddingBottom":24.0,"paddingLeft":44.0,"layoutMode":"VERTICAL","itemSpacing":40.0,"counterAxisAlignItems":"CENTER","children":["2702:505"]},"2149:4143":{"type":"FRAME","id":"2149:4143","name":"Offering list items","absoluteBoundingBox":{"x":-2904.5,"y":1549.0,"width":275.0,"height":15.0},"isolatedAbsoluteRenderBounds":{"x":-2908.00805664062,"y":1549.0,"width":278.508056640625,"height":863.924072265625},"relativeTransform":[[1.0,0.0,502.0],[0.0,1.0,148.0]],"size":{"x":275.0,"y":15.0},"fills":[],"constraints":{"vertical":"TOP","horizontal":"CENTER"},"constraintValues":{"left":{"pixelOffset":-138.0,"sizeFraction":0.5},"right":{"pixelOffset":137.0,"sizeFraction":0.5},"top":{"pixelOffset":148.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","layoutPositioning":"ABSOLUTE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2150:4187","2149:4144"]},"2695:694":{"type":"TEXT","id":"2695:694","name":"HOME","absoluteBoundingBox":{"x":-3494.0,"y":-418.5,"width":48.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-3493.9658203125,"y":-413.295440673828,"width":47.93896484375,"height":16.0681762695312},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":48.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"HOME","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","hyperlink":{"type":"NODE","nodeID":"/"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2702:531":{"type":"FRAME","id":"2702:531","name":"Group 3","absoluteBoundingBox":{"x":-4243.0,"y":84.0,"width":1643.0,"height":572.0},"isolatedAbsoluteRenderBounds":{"x":-4243.0,"y":84.0,"width":1643.0,"height":572.0},"relativeTransform":[[1.0,0.0,55.0],[0.0,1.0,419.0]],"size":{"x":1643.0,"y":572.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"clipsContent":true,"children":["2702:532","2702:533"]},"2281:544":{"type":"TEXT","id":"2281:544","name":"Rich text/Header 3","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":43.0,"height":42.0},"isolatedAbsoluteRenderBounds":{"x":0.761363685131073,"y":9.72727203369141,"width":39.7331848144531,"height":30.1818199157715},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":43.0,"y":42.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Inter","fontPostScriptName":null,"fontStyle":"Bold","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":32.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.96,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":41.5999984741211,"lineHeightPercent":107.417839050293,"lineHeightPercentFontSize":130.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2817:1136":{"type":"TEXT","id":"2817:1136","name":"Paragraph/Paragraph 2","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":23.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":0.0,"y":0.0,"width":23.0,"height":24.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":23.0,"y":24.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"visible":false,"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"fontSize":18.0,"letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":115.199996948242,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":18.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":103.846160888672,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2109:1306":{"type":"GROUP","id":"2109:1306","name":"LASERABLE","absoluteBoundingBox":{"x":-4149.0,"y":2916.0,"width":916.0,"height":298.5},"isolatedAbsoluteRenderBounds":{"x":-4150.81591796875,"y":2916.0,"width":917.81591796875,"height":298.5},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":916.0,"y":298.5},"fills":[],"constraints":{"vertical":"TOP","horizontal":"SCALE"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"right":{"pixelOffset":0.0,"sizeFraction":0.932790224032587},"top":{"pixelOffset":0.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"children":["2109:1309","2109:1308","2109:1307"]},"2608:2992":{"type":"TEXT","id":"2608:2992","name":"데스크탑_네비","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":32.0,"height":29.0},"isolatedAbsoluteRenderBounds":{"x":0.0,"y":6.31199884414673,"width":31.3216896057129,"height":23.6160011291504},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":32.0,"y":29.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","textAutoResize":"WIDTH_AND_HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"데스크톱","style":{"fontSize":24.0,"letterSpacing":2.88,"letterSpacingValue":12.0,"letterSpacingUnit":"PERCENT","lineHeightPx":28.125,"lineHeightPercent":100.0,"lineHeightUnit":"INTRINSIC_%"}}],"fontVariantPosition":"NORMAL","fontSize":24.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":2.88,"letterSpacingValue":12.0,"letterSpacingUnit":"PERCENT","lineHeightPx":28.8000011444092,"lineHeightPercent":100.0,"lineHeightUnit":"INTRINSIC_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED","lineHeightPercentFontSize":100},"styleOverrideTable":{}},"2702:518":{"type":"TEXT","id":"2702:518","name":"제품소개","absoluteBoundingBox":{"x":-2583.0,"y":-429.0,"width":71.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-2582.69750976562,"y":-424.31201171875,"width":70.396240234375,"height":16.5120239257812},"relativeTransform":[[1.0,0.0,91.0],[0.0,1.0,0.0]],"size":{"x":71.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"제품소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"style":{"styleIdForText":"StyleId:2608:2916","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","hyperlink":{"type":"NODE","nodeID":"/laserable"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":3.84,"letterSpacingValue":24.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":120.83332824707,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2695:747":{"type":"RECTANGLE","id":"2695:747","name":"Logo","absoluteBoundingBox":{"x":-3017.0,"y":769.0,"width":211.0,"height":75.0},"isolatedAbsoluteRenderBounds":{"x":-3017.0,"y":769.0,"width":211.0,"height":75.0},"relativeTransform":[[1.0,0.0,64.0],[0.0,1.0,24.0]],"size":{"x":211.0,"y":75.0},"fills":[{"blendMode":"NORMAL","type":"IMAGE","scaleMode":"FILL","imageRef":"64270238d3de4edd07597c9179b36856b5a53af3","originalImageWidth":1400,"originalImageHeight":1167,"visible":true,"opacity":1.0,"rotation":0.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Logomark","ariaAttributes":{},"interactions":[{"id":{"sessionID":2608,"localID":4807},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":0,"localID":3},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/"}],"isDeleted":false,"stateManagementVersion":1}]},"2702:513":{"type":"FRAME","id":"2702:513","name":"Frame 2","absoluteBoundingBox":{"x":-2949.0,"y":-479.0,"width":365.0,"height":430.0},"isolatedAbsoluteRenderBounds":{"x":-2949.0,"y":-479.0,"width":365.0,"height":430.0},"relativeTransform":[[1.0,0.0,5.0],[0.0,1.0,0.0]],"size":{"x":365.0,"y":430.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"visible":false,"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"HORIZONTAL","counterAxisAlignItems":"CENTER","children":["2702:514","2702:522"]},"6:1353":{"key":"97dafb45fff15bf769b52f3a6ba1d1c9a7c3d06a","name":"Paragraph/Paragraph 2","styleType":"TEXT","remote":false,"description":"","id":"6:1353","assetId":"StyleId:6:1353","type":"STYLE","style":{"fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"fontSize":18.0,"letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":115.199996948242,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontSize":18.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":103.846160888672,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%"},"responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"fontSize":18.0,"letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":24.3000011444092,"lineHeightPercent":115.199996948242,"lineHeightPercentFontSize":135.0,"lineHeightUnit":"FONT_SIZE_%"}}]},"2281:545":{"type":"TEXT","id":"2281:545","name":"Rich text/Header 4","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":32.0,"height":34.0},"isolatedAbsoluteRenderBounds":{"x":0.588068187236786,"y":8.54545402526855,"width":29.0839786529541,"height":22.6363639831543},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":32.0,"y":34.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Inter","fontPostScriptName":null,"fontStyle":"Semi Bold","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":24.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.72,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":33.5999984741211,"lineHeightPercent":115.680755615234,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"6:1466":{"type":"TEXT","id":"6:1466","name":"Display/Hero DIsplay","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":146.0,"height":114.0},"isolatedAbsoluteRenderBounds":{"x":2.40000009536743,"y":14.7999954223633,"width":133.72688293457,"height":104.640007019043},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":146.0,"y":114.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"fontSize":120.0,"letterSpacing":-3.6,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":114.0,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"fontSize":72.0,"letterSpacing":-2.16,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":68.4000015258789,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":0.0,"name":"Mobile","style":{"fontSize":36.0,"letterSpacing":-1.08,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":34.2000007629395,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":120.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-3.6,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":114.0,"lineHeightPercent":73.0769271850586,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2:722":{"key":"1f33ab3b04a97bcb0c157e362973aa6098fb5a27","name":"Display/Display 3","styleType":"TEXT","remote":false,"description":"","id":"2:722","assetId":"StyleId:2:722","type":"STYLE","style":{"fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","hangingPunctuation":true,"textCase":"TITLE","textAutoResize":"WIDTH_AND_HEIGHT","responsiveTextStyleVariants":[{"minWidth":1200.0,"name":"Desktop","style":{"fontSize":76.0,"letterSpacing":-4.56,"letterSpacingValue":-6.0,"letterSpacingUnit":"PERCENT","lineHeightPx":72.1999969482422,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"fontSize":64.0,"letterSpacing":-3.84,"letterSpacingValue":-6.0,"letterSpacingUnit":"PERCENT","lineHeightPx":60.7999992370605,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":1.0,"name":"Mobile","style":{"paragraphSpacing":12.0,"fontSize":36.0,"letterSpacing":-2.16,"letterSpacingValue":-6.0,"letterSpacingUnit":"PERCENT","lineHeightPx":34.2000007629395,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontSize":76.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-4.56,"letterSpacingValue":-6.0,"letterSpacingUnit":"PERCENT","lineHeightPx":72.1999969482422,"lineHeightPercent":73.0769271850586,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"},"responsiveTextStyleVariants":[{"minWidth":1200.0,"name":"Desktop","style":{"fontSize":76.0,"letterSpacing":-4.56,"letterSpacingValue":-6.0,"letterSpacingUnit":"PERCENT","lineHeightPx":72.1999969482422,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"fontSize":64.0,"letterSpacing":-3.84,"letterSpacingValue":-6.0,"letterSpacingUnit":"PERCENT","lineHeightPx":60.7999992370605,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":1.0,"name":"Mobile","style":{"paragraphSpacing":12.0,"fontSize":36.0,"letterSpacing":-2.16,"letterSpacingValue":-6.0,"letterSpacingUnit":"PERCENT","lineHeightPx":34.2000007629395,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}}]},"32:1153":{"type":"TEXT","id":"32:1153","name":"Link","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":16.0,"height":12.0},"isolatedAbsoluteRenderBounds":{"x":0.260000020265579,"y":1.76999950408936,"width":14.4870777130127,"height":11.3360004425049},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":16.0,"y":12.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"fontSize":13.0,"letterSpacing":-0.39,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":12.3499994277954,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"fontSize":13.0,"letterSpacing":-0.39,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":12.3499994277954,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":0.0,"name":"Mobile","style":{"fontSize":13.0,"letterSpacing":-0.39,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":12.3499994277954,"lineHeightPercent":81.0666656494141,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":13.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.39,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":12.3499994277954,"lineHeightPercent":73.0769271850586,"lineHeightPercentFontSize":95.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2149:4151":{"type":"TEXT","id":"2149:4151","name":"가장 진보된 AI 기술과 브레인에이블이 독자개발한 시선추적 시스템 융합 디지털 난독증 진단 솔루션 입니다.","absoluteBoundingBox":{"x":-2904.5,"y":2056.0,"width":273.0,"height":146.953964233398},"isolatedAbsoluteRenderBounds":{"x":-2904.08203125,"y":2059.84790039062,"width":258.714111328125,"height":28.1201171875},"relativeTransform":[[1.0,0.0,-2.27373675443232e-13],[0.0,1.0,134.0]],"size":{"x":273.0,"y":146.953964233398},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"TOP","horizontal":"SCALE"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":-8.32870606019165e-16},"right":{"pixelOffset":0.0,"sizeFraction":0.9999999999999991},"top":{"pixelOffset":134.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"가장 진보된 AI 기술과 브레인에이블이 독자개발한 \n시선추적 시스템 융합 디지털 난독증 진단 솔루션 입니다.","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","fontVariantPosition":"NORMAL","fontSize":11.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.22,"letterSpacingValue":2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":17.6000003814697,"lineHeightPercent":133.33332824707,"lineHeightPercentFontSize":160.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2149:4122":{"type":"GROUP","id":"2149:4122","name":"READINGABLE","absoluteBoundingBox":{"x":-2844.0,"y":971.0,"width":771.0,"height":226.0},"isolatedAbsoluteRenderBounds":{"x":-2847.1279296875,"y":971.0,"width":774.1279296875,"height":226.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,395.0]],"size":{"x":771.0,"y":226.0},"fills":[],"constraints":{"vertical":"TOP","horizontal":"LEFT"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"top":{"pixelOffset":395.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"children":["2149:4123","2149:4124","2149:4125","2149:4126"]},"2608:2834":{"type":"TEXT","id":"2608:2834","name":"Text","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":12.0,"height":12.0},"isolatedAbsoluteRenderBounds":{"x":0.0800000056624413,"y":2.70999956130981,"width":11.1089067459106,"height":9.82999992370605},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":12.0,"y":12.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Light","fontStyle":"Light","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":10.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":12.0,"lineHeightPercent":100.0,"lineHeightUnit":"INTRINSIC_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED","lineHeightPercentFontSize":100},"styleOverrideTable":{}},"2702:507":{"type":"FRAME","id":"2702:507","name":"Nav","absoluteBoundingBox":{"x":-4140.0,"y":-340.0,"width":59.0,"height":243.0},"isolatedAbsoluteRenderBounds":{"x":-4140.0,"y":-340.0,"width":59.0,"height":243.0},"relativeTransform":[[1.0,0.0,109.0],[0.0,1.0,115.0]],"size":{"x":59.0,"y":243.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"NAV","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":2608,"localID":1766},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":6,"localID":1529},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/about_us"}],"isDeleted":false,"stateManagementVersion":1}],"behaviors":{"hover":{"transition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.300000011920929,"delay":0.0},"state":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"behaviorType":"hover"}},"layoutMode":"VERTICAL","itemSpacing":32.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED","children":["2702:508","2702:509","2702:510","2702:511","2702:512"]},"10:4389":{"type":"TEXT","id":"10:4389","name":"브레인에이블은 모든 이의 잠재력을 깨우기 위해 혁신적인 기술로 더 나은 삶을 안내합니다.","absoluteBoundingBox":{"x":-4149.0,"y":2742.0,"width":982.0,"height":109.0},"isolatedAbsoluteRenderBounds":{"x":-4138.98974609375,"y":2757.71997070312,"width":961.2548828125,"height":22.464111328125},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":982.0,"y":109.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.968627452850342,"g":0.95686274766922,"b":0.921568632125854,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","layoutAlign":"STRETCH","strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[17,17,17,17,17,17,17,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,10,3,3,3,3,3,3,3,3,3,3,3,3],"characters":"브레인에이블은 모든 이의 잠재력을 깨우기 위해 혁신적인 기술로 더 나은 삶을 안내합니다.\n\n","lineIndentations":[0,0,0],"lineTypes":["NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","fontVariantPosition":"NORMAL","fontSize":28.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-1.4,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":30.5200004577637,"lineHeightPercent":90.8333282470703,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{"17":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","fontSize":24.0,"letterSpacing":4.08,"letterSpacingValue":17.0,"letterSpacingUnit":"PERCENT","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100},"10":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","fontSize":24.0,"letterSpacing":2.88,"letterSpacingValue":12.0,"letterSpacingUnit":"PERCENT","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100},"3":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","fontSize":24.0,"letterSpacing":1.2,"letterSpacingValue":5.0,"letterSpacingUnit":"PERCENT","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100}}},"2702:501":{"type":"TEXT","id":"2702:501","name":"커뮤니티","absoluteBoundingBox":{"x":-3824.0,"y":-429.0,"width":71.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-3823.69750976562,"y":-424.31201171875,"width":70.396240234375,"height":16.5120239257812},"relativeTransform":[[1.0,0.0,194.0],[0.0,1.0,0.0]],"size":{"x":71.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"오시는길","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"style":{"styleIdForText":"StyleId:2608:2916","fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","hyperlink":{"type":"NODE","nodeID":"/커뮤니티Articles"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":3.84,"letterSpacingValue":24.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":120.83332824707,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2149:4147":{"type":"TEXT","id":"2149:4147","name":"브레인에이블만의 자체적인 뇌과학 연구개발을 통해 독보적 기술력으로 만들어진 PBM 테라피 장비 입니다. 가장 안전하고 효과적인 광자극(tPBM)을 통해 뇌 기능 향상에 최적화된 브레인 웰니스 디바이스 입니다.","absoluteBoundingBox":{"x":-2904.5,"y":1734.0,"width":275.0,"height":103.0},"isolatedAbsoluteRenderBounds":{"x":-2904.0048828125,"y":1737.80395507812,"width":268.537109375,"height":64.1199951171875},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,98.0]],"size":{"x":275.0,"y":103.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"TOP","horizontal":"SCALE"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"right":{"pixelOffset":0.0,"sizeFraction":1.0},"top":{"pixelOffset":98.0,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,20,20,20,20,20,20,20,20,20,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19],"characters":"브레인에이블만의 자체적인 뇌과학 연구개발을 통해 \n독보적 기술력으로 만들어진 PBM 테라피 장비 입니다. \n가장 안전하고 효과적인  광자극(tPBM)을 통해 \n뇌 기능 향상에 최적화된 브레인 웰니스 디바이스 입니다.\n\n","lineIndentations":[0,0,0,0,0,0],"lineTypes":["NONE","NONE","NONE","NONE","NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0,0,0,0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"2":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"3":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"4":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"5":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Regular","fontStyle":"Regular","fontVariantPosition":"NORMAL","fontSize":11.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.55,"letterSpacingValue":5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":17.6000003814697,"lineHeightPercent":133.33332824707,"lineHeightPercentFontSize":160.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{"20":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100},"19":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED","lineHeightPercent":100,"lineHeightPercentFontSize":100}}},"95:259":{"type":"SVG","id":"95:259","name":"Right arrow","absoluteBoundingBox":{"x":-5828.5556640625,"y":-966.5,"width":24.0,"height":24.0},"isolatedAbsoluteRenderBounds":{"x":-5828.5556640625,"y":-966.5,"width":24.0,"height":24.0},"relativeTransform":[[1.0,0.0,374.444427490234],[0.0,1.0,0.0]],"size":{"x":24.0,"y":24.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Arrow icons that navigate through customer testimonial quotes.","ariaAttributes":{},"interactions":[{"id":{"sessionID":162,"localID":187},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":32,"localID":810},"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","stateGroupContext":"32:813"}],"isDeleted":false,"stateManagementVersion":1}],"hash":"e42088c55caa5c48897632bcfeafc30b03c43aca"},"4:982":{"key":"01b92b5a881b8428596a37a50974a33e09b8b94d","name":"Button","styleType":"TEXT","remote":false,"description":"","id":"4:982","assetId":"StyleId:4:982","type":"STYLE","style":{"fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"fontSize":18.0,"letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":21.6000003814697,"lineHeightPercent":102.400009155273,"lineHeightPercentFontSize":120.000007629395,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"fontSize":18.0,"letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":21.6000003814697,"lineHeightPercent":102.400009155273,"lineHeightPercentFontSize":120.000007629395,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":0.0,"name":"Mobile","style":{"fontSize":18.0,"letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":21.6000003814697,"lineHeightPercent":102.400009155273,"lineHeightPercentFontSize":120.000007629395,"lineHeightUnit":"FONT_SIZE_%"}}],"fontSize":18.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":21.6000003814697,"lineHeightPercent":92.3077011108398,"lineHeightPercentFontSize":120.000007629395,"lineHeightUnit":"FONT_SIZE_%"},"responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"fontSize":18.0,"letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":21.6000003814697,"lineHeightPercent":102.400009155273,"lineHeightPercentFontSize":120.000007629395,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"fontSize":18.0,"letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":21.6000003814697,"lineHeightPercent":102.400009155273,"lineHeightPercentFontSize":120.000007629395,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":0.0,"name":"Mobile","style":{"fontSize":18.0,"letterSpacing":-0.36,"letterSpacingValue":-2.0,"letterSpacingUnit":"PERCENT","lineHeightPx":21.6000003814697,"lineHeightPercent":102.400009155273,"lineHeightPercentFontSize":120.000007629395,"lineHeightUnit":"FONT_SIZE_%"}}]},"2702:530":{"type":"TEXT","id":"2702:530","name":"오시는길","absoluteBoundingBox":{"x":-2796.0,"y":-120.0,"width":59.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-2795.8173828125,"y":-116.312004089355,"width":58.63623046875,"height":16.5120010375977},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,220.0]],"size":{"x":59.0,"y":23.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.443900465965271,"g":0.442026853561401,"b":0.442026853561401,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"센터소개","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":16.0}},"textAutoResize":"WIDTH_AND_HEIGHT","textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","paragraphSpacing":16.0,"fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","fallbackFonts":[{"fontFamily":"Noto Sans KR","fontStyle":"Medium"}],"hyperlink":{"type":"NODE","nodeID":"/센터소개"},"paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","textDecoration":"UNDERLINE","textDecorationSkipInk":true,"fontSize":16.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":-0.08,"letterSpacingValue":-0.5,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":119.812210083008,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2281:546":{"type":"TEXT","id":"2281:546","name":"Rich text/Header 5","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":27.0,"height":28.0},"isolatedAbsoluteRenderBounds":{"x":0.490056842565536,"y":6.45454502105713,"width":24.2366466522217,"height":18.8636360168457},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":27.0,"y":28.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Inter","fontPostScriptName":null,"fontStyle":"Semi Bold","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":20.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.6,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":28.0,"lineHeightPercent":115.680755615234,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2:720":{"type":"TEXT","id":"2:720","name":"Display/디스플레이 1","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":81.0,"height":66.0},"isolatedAbsoluteRenderBounds":{"x":-0.240000009536743,"y":12.5399971008301,"width":79.5374984741211,"height":59.0400047302246},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":81.0,"y":66.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Bold","fontStyle":"Bold","textAutoResize":"WIDTH_AND_HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"fontSize":300.0,"letterSpacing":30.0,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":330.0,"lineHeightPercent":93.8666687011719,"lineHeightPercentFontSize":110.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"fontSize":200.0,"letterSpacing":20.0,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":220.0,"lineHeightPercent":93.8666687011719,"lineHeightPercentFontSize":110.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":1.0,"name":"Mobile","style":{"fontSize":100.0,"letterSpacing":10.0,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":110.0,"lineHeightPercent":93.8666687011719,"lineHeightPercentFontSize":110.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":60.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":6.0,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":66.0,"lineHeightPercent":91.6666641235352,"lineHeightPercentFontSize":110.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2695:693":{"type":"FRAME","id":"2695:693","name":"Nav","absoluteBoundingBox":{"x":-3494.0,"y":-418.5,"width":412.0,"height":23.0},"isolatedAbsoluteRenderBounds":{"x":-3494.0,"y":-418.5,"width":412.0,"height":23.0},"relativeTransform":[[1.0,0.0,804.0],[0.0,1.0,60.5]],"size":{"x":412.0,"y":23.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"NAV","isDecorativeImage":false,"ariaAttributes":{},"interactions":[{"id":{"sessionID":2608,"localID":4804},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":0,"localID":3},"connectionType":"INTERNAL_NODE","navigationType":"NAVIGATE","connectionURL":"/"}],"isDeleted":false,"stateManagementVersion":1}],"layoutMode":"HORIZONTAL","itemSpacing":32.0,"counterAxisAlignItems":"CENTER","children":["2695:694","2695:695","2695:696","2695:697","2695:698"]},"2464:490":{"type":"TEXT","id":"2464:490","name":"Text","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":14.0,"height":12.0},"isolatedAbsoluteRenderBounds":{"x":0.248579546809196,"y":2.72727251052856,"width":12.1271305084229,"height":9.43181800842285},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":14.0,"y":12.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Inter","fontPostScriptName":"Inter-Medium","fontStyle":"Medium","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":10.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":12.1022720336914,"lineHeightPercent":100.0,"lineHeightUnit":"INTRINSIC_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED","lineHeightPercentFontSize":100},"styleOverrideTable":{}},"2112:1531":{"type":"TEXT","id":"2112:1531","name":"LASERABLE","absoluteBoundingBox":{"x":-3724.1171875,"y":3538.2841796875,"width":281.232055664062,"height":39.4741630554199},"isolatedAbsoluteRenderBounds":{"x":-3724.1171875,"y":3538.2841796875,"width":281.232055664062,"height":39.4741630554199},"relativeTransform":[[1.0,0.0,424.882904052734],[0.0,1.0,231.2841796875]],"size":{"x":281.232055664062,"y":39.4741630554199},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"visible":false,"constraints":{"vertical":"TOP","horizontal":"SCALE"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.432670981723762},"right":{"pixelOffset":0.0,"sizeFraction":0.719058003784926},"top":{"pixelOffset":231.2841796875,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"behaviors":{"appear":{"otherLayer":{"sessionID":-1,"localID":-1},"trigger":"THIS_LAYER_IN_VIEW","direction":"UP","enterTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"enterState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":0.0},"exitTransition":{"easingType":"OUT_CUBIC","easingFunction":[0.215000003576279,0.610000014305115,0.354999989271164,1.0],"transitionDuration":0.600000023841858,"delay":0.0},"exitState":{"transform":{"m00":1.0,"m01":0.0,"m02":0.0,"m10":0.0,"m11":1.0,"m12":0.0},"opacity":1.0},"playsOnce":false,"behaviorType":"appear"}},"characterStyleOverrides":[],"characters":"LASERABLE \n","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"style":{"styleIdForText":"StyleId:7aa8e3397bdf15c0f346f2cbc2db3f1f00b8f278/121:1154","fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","fontVariantPosition":"NORMAL","fontSize":32.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-1.6,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":34.8800010681152,"lineHeightPercent":83.8461532592773,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2577:673":{"type":"TEXT","id":"2577:673","name":"Text sm / Regular","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":54.0,"height":20.0},"isolatedAbsoluteRenderBounds":{"x":0.0,"y":0.0,"width":54.0,"height":20.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":54.0,"y":20.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"visible":false,"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Rag 123","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":14.0}},"textAutoResize":"WIDTH_AND_HEIGHT","paragraphSpacing":14.0,"style":{"fontFamily":"Inter","fontPostScriptName":null,"fontStyle":"Regular","paragraphSpacing":14.0,"textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":14.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":20.0,"lineHeightPercent":118.04158782959,"lineHeightPercentFontSize":142.857147216797,"lineHeightUnit":"PIXELS","paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2608:2916":{"key":"9a61926ed9d973c2d9365bbe0a9dc3fb9ac3b365","name":"모바일_네비게이터","styleType":"TEXT","remote":false,"description":"세련\n","id":"2608:2916","assetId":"StyleId:2608:2916","type":"STYLE","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","paragraphSpacing":16.0,"textAutoResize":"WIDTH_AND_HEIGHT","textDecoration":"UNDERLINE","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":3.84,"letterSpacingValue":24.0,"letterSpacingUnit":"PERCENT","lineHeightPx":23.2000007629395,"lineHeightPercent":120.83332824707,"lineHeightPercentFontSize":145.0,"lineHeightUnit":"FONT_SIZE_%"}},"32:777":{"type":"FRAME","id":"32:777","name":"Our clients quote 1","absoluteBoundingBox":{"x":-6203.0,"y":-1304.5,"width":638.0,"height":258.0},"isolatedAbsoluteRenderBounds":{"x":-6203.0,"y":-1304.5,"width":638.0,"height":258.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":638.0,"y":258.0},"fills":[],"strokeAlign":"INSIDE","layoutGrow":1.0,"strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":32.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"CENTER","counterAxisSizingMode":"FIXED","children":["32:778","32:779"]},"2281:547":{"type":"TEXT","id":"2281:547","name":"Rich text/Header 6","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":21.0,"height":22.0},"isolatedAbsoluteRenderBounds":{"x":0.392045468091965,"y":5.3636360168457,"width":19.3893184661865,"height":15.0909099578857},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":21.0,"y":22.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Inter","fontPostScriptName":null,"fontStyle":"Semi Bold","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-0.48,"letterSpacingValue":-3.0,"letterSpacingUnit":"PERCENT","lineHeightPx":22.3999996185303,"lineHeightPercent":115.680755615234,"lineHeightPercentFontSize":140.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"6:1453":{"type":"FRAME","id":"6:1453","name":"Contact column 1","absoluteBoundingBox":{"x":-2926.0,"y":546.0,"width":255.0,"height":20.0},"isolatedAbsoluteRenderBounds":{"x":-2926.0,"y":546.0,"width":255.0,"height":20.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":255.0,"y":20.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":2.0,"primaryAxisAlignItems":"CENTER","children":["6:1454","6:1455"]},"2695:691":{"type":"FRAME","id":"2695:691","name":"Header 1","absoluteBoundingBox":{"x":-4298.0,"y":-479.0,"width":1280.0,"height":144.0},"isolatedAbsoluteRenderBounds":{"x":-4298.0,"y":-479.0,"width":1280.0,"height":144.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":1280.0,"y":144.0},"fills":[],"strokeAlign":"INSIDE","layoutAlign":"STRETCH","strokes":[],"accessibleHTMLTag":"HEADER","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":24.0,"paddingRight":64.0,"paddingBottom":24.0,"paddingLeft":64.0,"layoutMode":"HORIZONTAL","itemSpacing":16.0,"counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2695:692","2695:693"]},"64:727":{"type":"SVG","id":"64:727","name":"Ellipse 182","absoluteBoundingBox":{"x":-5879.0,"y":338.388885498047,"width":10.222222328186,"height":10.222222328186},"targetAspectRatio":{"x":11.0,"y":11.0},"isolatedAbsoluteRenderBounds":{"x":-5879.0,"y":338.388885498047,"width":10.22216796875,"height":10.2222290039062},"relativeTransform":[[1.0,0.0,40.4444427490234],[0.0,1.0,0.0]],"size":{"x":10.222222328186,"y":10.222222328186},"fills":[{"opacity":0.25,"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"accessibleLabel":"Customer quote 3 of 4","ariaAttributes":{},"interactions":[{"id":{"sessionID":162,"localID":197},"event":{"interactionType":"ON_CLICK"},"actions":[{"transitionNodeID":{"sessionID":32,"localID":810},"connectionType":"INTERNAL_NODE","navigationType":"SWAP_STATE","stateGroupContext":"32:813"}],"isDeleted":false,"stateManagementVersion":1}],"hash":"4cb2d839ddaa8ed7ade717b8698b33f4489b6d5d"},"2149:3590":{"type":"TEXT","id":"2149:3590","name":"브레인에이블과 함께 내 숨겨진 잠재력을 찾고 향상된 일상의 즐거움을 찾아 보세요. 지금 바로 문의주세요.","absoluteBoundingBox":{"x":-2897.0,"y":3409.5,"width":261.0,"height":163.0},"isolatedAbsoluteRenderBounds":{"x":-2891.95727539062,"y":3466.44409179688,"width":249.691650390625,"height":49.06396484375},"relativeTransform":[[1.0,0.0,238.5],[0.0,-1.0,168.5]],"size":{"x":261.0,"y":163.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"OUTSIDE","maxWidth":480.0,"strokes":[],"strokeWeight":3.21430063247681,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"브레인에이블과 함께 내 숨겨진 잠재력을 찾고 향상된 일상의 즐거움을 찾아 보세요. \n지금 바로 문의주세요.","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","fontVariantPosition":"NORMAL","fontSize":12.0,"textAlignHorizontal":"CENTER","textAlignVertical":"CENTER","letterSpacing":1.2,"letterSpacingValue":10.0,"letterSpacingUnit":"PERCENT","lineHeightPx":19.4400005340576,"lineHeightPercent":135.0,"lineHeightPercentFontSize":162.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textAutoResize":"NONE","textTruncation":"DISABLED"},"styleOverrideTable":{}},"2109:1279":{"type":"GROUP","id":"2109:1279","name":"READINGABLE","absoluteBoundingBox":{"x":-4149.0,"y":3307.0,"width":982.0,"height":252.326904296875},"isolatedAbsoluteRenderBounds":{"x":-4151.1279296875,"y":3307.0,"width":984.1279296875,"height":252.326904296875},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,391.0]],"size":{"x":982.0,"y":252.326904296875},"fills":[],"constraints":{"vertical":"TOP","horizontal":"SCALE"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"right":{"pixelOffset":0.0,"sizeFraction":1.0},"top":{"pixelOffset":391.0,"sizeFraction":0.0}},"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"children":["2109:1255","2109:1300","2112:1531","2109:1270"]},"5:1288":{"type":"FRAME","id":"5:1288","name":"Contact column 1","absoluteBoundingBox":{"x":-4155.0,"y":6626.0,"width":352.0,"height":60.0},"isolatedAbsoluteRenderBounds":{"x":-4155.0,"y":6626.0,"width":352.0,"height":60.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":352.0,"y":60.0},"fills":[],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"layoutMode":"VERTICAL","itemSpacing":2.0,"primaryAxisAlignItems":"CENTER","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["5:1289","5:1290"]},"2149:4110":{"type":"FRAME","id":"2149:4110","name":"Offering section","absoluteBoundingBox":{"x":-2954.0,"y":321.0,"width":1280.0,"height":2069.0},"isolatedAbsoluteRenderBounds":{"x":-2954.0,"y":321.0,"width":1280.0,"height":2069.0},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":1280.0,"y":2069.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"paddingTop":148.0,"paddingLeft":110.0,"overflowDirection":"HORIZONTAL_AND_VERTICAL_SCROLLING","layoutMode":"HORIZONTAL","counterAxisAlignItems":"CENTER","primaryAxisAlignItems":"SPACE_BETWEEN","primaryAxisSizingMode":"FIXED","counterAxisSizingMode":"FIXED","children":["2149:4111","2149:4116"]},"2608:2832":{"type":"TEXT","id":"2608:2832","name":"Text","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":12.0,"height":12.0},"isolatedAbsoluteRenderBounds":{"x":0.0500000044703484,"y":2.67999935150146,"width":11.4056253433228,"height":9.83000087738037},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":12.0,"y":12.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-DemiLight","fontStyle":"DemiLight","textAutoResize":"WIDTH_AND_HEIGHT","fontVariantPosition":"NORMAL","fontSize":10.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":12.0,"lineHeightPercent":100.0,"lineHeightUnit":"INTRINSIC_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED","lineHeightPercentFontSize":100},"styleOverrideTable":{}},"2109:1300":{"type":"TEXT","id":"2109:1300","name":"가장 진보된 AI 기술과 브레인에이블이 독자적으로 개발한 시선추적 시스템을 융합한 디지털 난독증 진단 솔루션 입니다.","absoluteBoundingBox":{"x":-4149.0,"y":3509.32690429688,"width":982.0,"height":50.0},"isolatedAbsoluteRenderBounds":{"x":-4148.27978515625,"y":3514.90283203125,"width":774.614990234375,"height":14.83203125},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,202.326904296875]],"size":{"x":982.0,"y":50.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":1.0,"g":1.0,"b":1.0,"a":1.0},"visible":true,"opacity":1.0}],"constraints":{"vertical":"TOP","horizontal":"SCALE"},"constraintValues":{"left":{"pixelOffset":0.0,"sizeFraction":0.0},"right":{"pixelOffset":0.0,"sizeFraction":1.0},"top":{"pixelOffset":202.326904296875,"sizeFraction":0.0}},"strokeAlign":"OUTSIDE","strokes":[],"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"가장 진보된 AI 기술과 브레인에이블이 독자적으로 개발한 시선추적 시스템을 융합한 디지털 난독증 진단 솔루션 입니다.\n","lineIndentations":[0,0],"lineTypes":["NONE","NONE"],"listStartOffsets":[],"lineStyleOverrides":[0,0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0},"1":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"HEIGHT","style":{"fontFamily":"Noto Sans KR","fontPostScriptName":"NotoSansKR-Medium","fontStyle":"Medium","textAutoResize":"HEIGHT","fontVariantPosition":"NORMAL","fontSize":16.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":0.0,"letterSpacingValue":0.0,"letterSpacingUnit":"PERCENT","lineHeightPx":25.1200008392334,"lineHeightPercent":130.83332824707,"lineHeightPercentFontSize":157.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}},"9:2655":{"type":"TEXT","id":"9:2655","name":"Header/Header 2","absoluteBoundingBox":{"x":0.0,"y":0.0,"width":29.0,"height":26.0},"isolatedAbsoluteRenderBounds":{"x":0.480000019073486,"y":4.95999908447266,"width":26.2653751373291,"height":20.9280014038086},"relativeTransform":[[1.0,0.0,0.0],[0.0,1.0,0.0]],"size":{"x":29.0,"y":26.0},"fills":[{"blendMode":"NORMAL","type":"SOLID","color":{"r":0.0,"g":0.0,"b":0.0,"a":1.0},"visible":true,"opacity":1.0}],"strokeAlign":"INSIDE","strokes":[],"strokeWeight":0.0,"accessibleHTMLTag":"AUTO","isDecorativeImage":false,"ariaAttributes":{},"interactions":[],"characterStyleOverrides":[],"characters":"Ag","lineIndentations":[0],"lineTypes":["NONE"],"listStartOffsets":[],"lineStyleOverrides":[0],"lineTextDirections":null,"resolvedParagraphValues":{"0":{"listSpacing":0.0,"paragraphIndent":0.0,"paragraphSpacing":0.0}},"textAutoResize":"WIDTH_AND_HEIGHT","style":{"fontFamily":"Geist","fontPostScriptName":"Geist-Regular","fontStyle":"Regular","textAutoResize":"WIDTH_AND_HEIGHT","responsiveTextStyleVariants":[{"minWidth":1280.0,"name":"Desktop","style":{"fontSize":24.0,"letterSpacing":-1.2,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":26.1599998474121,"lineHeightPercent":93.0133361816406,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":800.0,"name":"Tablet","style":{"fontSize":20.0,"letterSpacing":-1.0,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":21.8000011444092,"lineHeightPercent":93.0133361816406,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%"}},{"minWidth":0.0,"name":"Mobile","style":{"fontSize":20.0,"letterSpacing":-1.0,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":21.8000011444092,"lineHeightPercent":93.0133361816406,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%"}}],"fontVariantPosition":"NORMAL","fontSize":24.0,"textAlignHorizontal":"LEFT","textAlignVertical":"TOP","letterSpacing":-1.2,"letterSpacingValue":-5.0,"letterSpacingUnit":"PERCENT","lineHeightPx":26.1599998474121,"lineHeightPercent":83.8461532592773,"lineHeightPercentFontSize":109.0,"lineHeightUnit":"FONT_SIZE_%","paragraphSpacing":0,"paragraphIndent":0,"listSpacing":0,"italic":false,"textCase":"ORIGINAL","textDecoration":"NONE","textDecorationSkipInk":false,"textDecorationStyle":"solid","textTruncation":"DISABLED"},"styleOverrideTable":{}}},"assetIdToGuid":{"StyleId:6:1356":"6:1356","StyleId:4:982":"4:982","StyleId:2:722":"2:722","StyleId:6:1353":"6:1353","StyleId:2608:2916":"2608:2916"},"guidToUrl":{"2090:90":"/센터소개","2281:444":"/case-study","9:2725":"/laserable","0:3":"/","2244:1586":"/제품소개-2-Readingable","2281:127":"/커뮤니티Articles","6:1529":"/about_us","2527:12461":"/커뮤니티News","2570:3654":"/collection-2"},"fonts":{"Noto Sans KR:Thin":{"id":"NotoSansKR-VF_2","url":"/_woff/v2/NotoSansKR-VF_2/NotoSansKR-VF_2.woff2","source":1,"italic":false,"weight":100,"variationAxes":[{"tag":"wght","value":100.0,"name":"Weight"}],"subsets":{"baseUrl":"/_woff/v2/NotoSansKR-VF_2/","subsetMappings":[{"unicodeRange":"U+0000-00A0,U+00A2-00A9,U+00AC-00AE,U+00B0-00B7,U+00B9-00BA,U+00BC-00BE,U+00D7,U+00F7,U+2000-206F,U+2074,U+20AC,U+2122,U+2190-21BB,U+2212,U+2215,U+F8FF,U+FEFF,U+FFFD","file":"NotoSansKR-VF_2-english.woff2"},{"unicodeRange":"U+00A1,U+00AA-00AB,U+00AF,U+00B8,U+00BB,U+00BF-00D6,U+00D8-00F6,U+00F8-00FF,U+0131,U+0152-0153,U+02B0-02FF","file":"NotoSansKR-VF_2-rest-latin.woff2"},{"unicodeRange":"U+0100-0130,U+0132-0151,U+0154-017F","file":"NotoSansKR-VF_2-latin-extended-a.woff2"},{"unicodeRange":"U+0180-024F","file":"NotoSansKR-VF_2-latin-extended-b.woff2"},{"unicodeRange":"U+1E00-1EFF","file":"NotoSansKR-VF_2-latin-extended-additional.woff2"},{"unicodeRange":"U+0250-02AF,U+0300-1DFF,U+1F00-1FFF,U+2070-2073,U+2075-20AB,U+20AD-2121,U+2123-218F,U+21BC-2211,U+2213-2214,U+2216-F8FE,U+F900-FEFE,U+FF00-FFFC,U+FFFE-FFFF","file":"NotoSansKR-VF_2-rest.woff2"}]}},"Gasoek One:Regular":{"id":"GasoekOne-Regular_1","url":"/_woff/v2/GasoekOne-Regular_1/GasoekOne-Regular_1.woff2","source":1,"italic":false,"weight":400,"subsets":{"baseUrl":"/_woff/v2/GasoekOne-Regular_1/","subsetMappings":[{"unicodeRange":"U+0000-00A0,U+00A2-00A9,U+00AC-00AE,U+00B0-00B7,U+00B9-00BA,U+00BC-00BE,U+00D7,U+00F7,U+2000-206F,U+2074,U+20AC,U+2122,U+2190-21BB,U+2212,U+2215,U+F8FF,U+FEFF,U+FFFD","file":"GasoekOne-Regular_1-english.woff2"},{"unicodeRange":"U+00A1,U+00AA-00AB,U+00AF,U+00B8,U+00BB,U+00BF-00D6,U+00D8-00F6,U+00F8-00FF,U+0131,U+0152-0153,U+02B0-02FF","file":"GasoekOne-Regular_1-rest-latin.woff2"},{"unicodeRange":"U+0100-0130,U+0132-0151,U+0154-017F","file":"GasoekOne-Regular_1-latin-extended-a.woff2"},{"unicodeRange":"U+0180-024F","file":"GasoekOne-Regular_1-latin-extended-b.woff2"},{"unicodeRange":"U+1E00-1EFF","file":"GasoekOne-Regular_1-latin-extended-additional.woff2"},{"unicodeRange":"U+0250-02AF,U+0300-1DFF,U+1F00-1FFF,U+2070-2073,U+2075-20AB,U+20AD-2121,U+2123-218F,U+21BC-2211,U+2213-2214,U+2216-F8FE,U+F900-FEFE,U+FF00-FFFC,U+FFFE-FFFF","file":"GasoekOne-Regular_1-rest.woff2"}]}},"Noto Sans KR:Medium":{"id":"NotoSansKR-VF_2","url":"/_woff/v2/NotoSansKR-VF_2/NotoSansKR-VF_2.woff2","source":1,"italic":false,"weight":500,"variationAxes":[{"tag":"wght","value":500.0,"name":"Weight"}],"subsets":{"baseUrl":"/_woff/v2/NotoSansKR-VF_2/","subsetMappings":[{"unicodeRange":"U+0000-00A0,U+00A2-00A9,U+00AC-00AE,U+00B0-00B7,U+00B9-00BA,U+00BC-00BE,U+00D7,U+00F7,U+2000-206F,U+2074,U+20AC,U+2122,U+2190-21BB,U+2212,U+2215,U+F8FF,U+FEFF,U+FFFD","file":"NotoSansKR-VF_2-english.woff2"},{"unicodeRange":"U+00A1,U+00AA-00AB,U+00AF,U+00B8,U+00BB,U+00BF-00D6,U+00D8-00F6,U+00F8-00FF,U+0131,U+0152-0153,U+02B0-02FF","file":"NotoSansKR-VF_2-rest-latin.woff2"},{"unicodeRange":"U+0100-0130,U+0132-0151,U+0154-017F","file":"NotoSansKR-VF_2-latin-extended-a.woff2"},{"unicodeRange":"U+0180-024F","file":"NotoSansKR-VF_2-latin-extended-b.woff2"},{"unicodeRange":"U+1E00-1EFF","file":"NotoSansKR-VF_2-latin-extended-additional.woff2"},{"unicodeRange":"U+0250-02AF,U+0300-1DFF,U+1F00-1FFF,U+2070-2073,U+2075-20AB,U+20AD-2121,U+2123-218F,U+21BC-2211,U+2213-2214,U+2216-F8FE,U+F900-FEFE,U+FF00-FFFC,U+FFFE-FFFF","file":"NotoSansKR-VF_2-rest.woff2"}]}},"Inter:Semi Bold":{"id":"Inter_1","url":"/_woff/v2/Inter_1/Inter_1.woff2","source":1,"italic":false,"weight":600,"variationAxes":[{"tag":"wght","value":600.0,"name":"Weight"},{"tag":"slnt","value":0.0,"name":"Slant"}],"subsets":{"baseUrl":"/_woff/v2/Inter_1/","subsetMappings":[{"unicodeRange":"U+0000-00A0,U+00A2-00A9,U+00AC-00AE,U+00B0-00B7,U+00B9-00BA,U+00BC-00BE,U+00D7,U+00F7,U+2000-206F,U+2074,U+20AC,U+2122,U+2190-21BB,U+2212,U+2215,U+F8FF,U+FEFF,U+FFFD","file":"Inter_1-english.woff2"},{"unicodeRange":"U+00A1,U+00AA-00AB,U+00AF,U+00B8,U+00BB,U+00BF-00D6,U+00D8-00F6,U+00F8-00FF,U+0131,U+0152-0153,U+02B0-02FF","file":"Inter_1-rest-latin.woff2"},{"unicodeRange":"U+0100-0130,U+0132-0151,U+0154-017F","file":"Inter_1-latin-extended-a.woff2"},{"unicodeRange":"U+0180-024F","file":"Inter_1-latin-extended-b.woff2"},{"unicodeRange":"U+1E00-1EFF","file":"Inter_1-latin-extended-additional.woff2"},{"unicodeRange":"U+0250-02AF,U+0300-1DFF,U+1F00-1FFF,U+2070-2073,U+2075-20AB,U+20AD-2121,U+2123-218F,U+21BC-2211,U+2213-2214,U+2216-F8FE,U+F900-FEFE,U+FF00-FFFC,U+FFFE-FFFF","file":"Inter_1-rest.woff2"}]}},"Inter:Bold":{"id":"Inter_1","url":"/_woff/v2/Inter_1/Inter_1.woff2","source":1,"italic":false,"weight":700,"variationAxes":[{"tag":"wght","value":700.0,"name":"Weight"},{"tag":"slnt","value":0.0,"name":"Slant"}],"subsets":{"baseUrl":"/_woff/v2/Inter_1/","subsetMappings":[{"unicodeRange":"U+0000-00A0,U+00A2-00A9,U+00AC-00AE,U+00B0-00B7,U+00B9-00BA,U+00BC-00BE,U+00D7,U+00F7,U+2000-206F,U+2074,U+20AC,U+2122,U+2190-21BB,U+2212,U+2215,U+F8FF,U+FEFF,U+FFFD","file":"Inter_1-english.woff2"},{"unicodeRange":"U+00A1,U+00AA-00AB,U+00AF,U+00B8,U+00BB,U+00BF-00D6,U+00D8-00F6,U+00F8-00FF,U+0131,U+0152-0153,U+02B0-02FF","file":"Inter_1-rest-latin.woff2"},{"unicodeRange":"U+0100-0130,U+0132-0151,U+0154-017F","file":"Inter_1-latin-extended-a.woff2"},{"unicodeRange":"U+0180-024F","file":"Inter_1-latin-extended-b.woff2"},{"unicodeRange":"U+1E00-1EFF","file":"Inter_1-latin-extended-additional.woff2"},{"unicodeRange":"U+0250-02AF,U+0300-1DFF,U+1F00-1FFF,U+2070-2073,U+2075-20AB,U+20AD-2121,U+2123-218F,U+21BC-2211,U+2213-2214,U+2216-F8FE,U+F900-FEFE,U+FF00-FFFC,U+FFFE-FFFF","file":"Inter_1-rest.woff2"}]}},"Noto Sans KR:Light":{"id":"NotoSansKR-VF_2","url":"/_woff/v2/NotoSansKR-VF_2/NotoSansKR-VF_2.woff2","source":1,"italic":false,"weight":300,"variationAxes":[{"tag":"wght","value":300.0,"name":"Weight"}],"subsets":{"baseUrl":"/_woff/v2/NotoSansKR-VF_2/","subsetMappings":[{"unicodeRange":"U+0000-00A0,U+00A2-00A9,U+00AC-00AE,U+00B0-00B7,U+00B9-00BA,U+00BC-00BE,U+00D7,U+00F7,U+2000-206F,U+2074,U+20AC,U+2122,U+2190-21BB,U+2212,U+2215,U+F8FF,U+FEFF,U+FFFD","file":"NotoSansKR-VF_2-english.woff2"},{"unicodeRange":"U+00A1,U+00AA-00AB,U+00AF,U+00B8,U+00BB,U+00BF-00D6,U+00D8-00F6,U+00F8-00FF,U+0131,U+0152-0153,U+02B0-02FF","file":"NotoSansKR-VF_2-rest-latin.woff2"},{"unicodeRange":"U+0100-0130,U+0132-0151,U+0154-017F","file":"NotoSansKR-VF_2-latin-extended-a.woff2"},{"unicodeRange":"U+0180-024F","file":"NotoSansKR-VF_2-latin-extended-b.woff2"},{"unicodeRange":"U+1E00-1EFF","file":"NotoSansKR-VF_2-latin-extended-additional.woff2"},{"unicodeRange":"U+0250-02AF,U+0300-1DFF,U+1F00-1FFF,U+2070-2073,U+2075-20AB,U+20AD-2121,U+2123-218F,U+21BC-2211,U+2213-2214,U+2216-F8FE,U+F900-FEFE,U+FF00-FFFC,U+FFFE-FFFF","file":"NotoSansKR-VF_2-rest.woff2"}]}},"Inter:Medium":{"id":"Inter_1","url":"/_woff/v2/Inter_1/Inter_1.woff2","source":1,"italic":false,"weight":500,"variationAxes":[{"tag":"wght","value":500.0,"name":"Weight"},{"tag":"slnt","value":0.0,"name":"Slant"}],"subsets":{"baseUrl":"/_woff/v2/Inter_1/","subsetMappings":[{"unicodeRange":"U+0000-00A0,U+00A2-00A9,U+00AC-00AE,U+00B0-00B7,U+00B9-00BA,U+00BC-00BE,U+00D7,U+00F7,U+2000-206F,U+2074,U+20AC,U+2122,U+2190-21BB,U+2212,U+2215,U+F8FF,U+FEFF,U+FFFD","file":"Inter_1-english.woff2"},{"unicodeRange":"U+00A1,U+00AA-00AB,U+00AF,U+00B8,U+00BB,U+00BF-00D6,U+00D8-00F6,U+00F8-00FF,U+0131,U+0152-0153,U+02B0-02FF","file":"Inter_1-rest-latin.woff2"},{"unicodeRange":"U+0100-0130,U+0132-0151,U+0154-017F","file":"Inter_1-latin-extended-a.woff2"},{"unicodeRange":"U+0180-024F","file":"Inter_1-latin-extended-b.woff2"},{"unicodeRange":"U+1E00-1EFF","file":"Inter_1-latin-extended-additional.woff2"},{"unicodeRange":"U+0250-02AF,U+0300-1DFF,U+1F00-1FFF,U+2070-2073,U+2075-20AB,U+20AD-2121,U+2123-218F,U+21BC-2211,U+2213-2214,U+2216-F8FE,U+F900-FEFE,U+FF00-FFFC,U+FFFE-FFFF","file":"Inter_1-rest.woff2"}]}},"Noto Sans KR:Bold":{"id":"NotoSansKR-VF_2","url":"/_woff/v2/NotoSansKR-VF_2/NotoSansKR-VF_2.woff2","source":1,"italic":false,"weight":700,"variationAxes":[{"tag":"wght","value":700.0,"name":"Weight"}],"subsets":{"baseUrl":"/_woff/v2/NotoSansKR-VF_2/","subsetMappings":[{"unicodeRange":"U+0000-00A0,U+00A2-00A9,U+00AC-00AE,U+00B0-00B7,U+00B9-00BA,U+00BC-00BE,U+00D7,U+00F7,U+2000-206F,U+2074,U+20AC,U+2122,U+2190-21BB,U+2212,U+2215,U+F8FF,U+FEFF,U+FFFD","file":"NotoSansKR-VF_2-english.woff2"},{"unicodeRange":"U+00A1,U+00AA-00AB,U+00AF,U+00B8,U+00BB,U+00BF-00D6,U+00D8-00F6,U+00F8-00FF,U+0131,U+0152-0153,U+02B0-02FF","file":"NotoSansKR-VF_2-rest-latin.woff2"},{"unicodeRange":"U+0100-0130,U+0132-0151,U+0154-017F","file":"NotoSansKR-VF_2-latin-extended-a.woff2"},{"unicodeRange":"U+0180-024F","file":"NotoSansKR-VF_2-latin-extended-b.woff2"},{"unicodeRange":"U+1E00-1EFF","file":"NotoSansKR-VF_2-latin-extended-additional.woff2"},{"unicodeRange":"U+0250-02AF,U+0300-1DFF,U+1F00-1FFF,U+2070-2073,U+2075-20AB,U+20AD-2121,U+2123-218F,U+21BC-2211,U+2213-2214,U+2216-F8FE,U+F900-FEFE,U+FF00-FFFC,U+FFFE-FFFF","file":"NotoSansKR-VF_2-rest.woff2"}]}},"Geist:Medium":{"id":"Geist_wght__1","url":"/_woff/v2/Geist_wght__1/Geist_wght__1.woff2","source":1,"italic":false,"weight":500,"variationAxes":[{"tag":"wght","value":500.0,"name":"Weight"}],"subsets":{"baseUrl":"/_woff/v2/Geist_wght__1/","subsetMappings":[{"unicodeRange":"U+0000-00A0,U+00A2-00A9,U+00AC-00AE,U+00B0-00B7,U+00B9-00BA,U+00BC-00BE,U+00D7,U+00F7,U+2000-206F,U+2074,U+20AC,U+2122,U+2190-21BB,U+2212,U+2215,U+F8FF,U+FEFF,U+FFFD","file":"Geist_wght__1-english.woff2"},{"unicodeRange":"U+00A1,U+00AA-00AB,U+00AF,U+00B8,U+00BB,U+00BF-00D6,U+00D8-00F6,U+00F8-00FF,U+0131,U+0152-0153,U+02B0-02FF","file":"Geist_wght__1-rest-latin.woff2"},{"unicodeRange":"U+0100-0130,U+0132-0151,U+0154-017F","file":"Geist_wght__1-latin-extended-a.woff2"},{"unicodeRange":"U+0180-024F","file":"Geist_wght__1-latin-extended-b.woff2"},{"unicodeRange":"U+1E00-1EFF","file":"Geist_wght__1-latin-extended-additional.woff2"},{"unicodeRange":"U+0250-02AF,U+0300-1DFF,U+1F00-1FFF,U+2070-2073,U+2075-20AB,U+20AD-2121,U+2123-218F,U+21BC-2211,U+2213-2214,U+2216-F8FE,U+F900-FEFE,U+FF00-FFFC,U+FFFE-FFFF","file":"Geist_wght__1-rest.woff2"}]}},"Noto Sans KR:DemiLight":{"id":"NotoSansKR-VF_2","url":"/_woff/v2/NotoSansKR-VF_2/NotoSansKR-VF_2.woff2","source":1,"italic":false,"weight":350,"variationAxes":[{"tag":"wght","value":350.0,"name":"Weight"}],"subsets":{"baseUrl":"/_woff/v2/NotoSansKR-VF_2/","subsetMappings":[{"unicodeRange":"U+0000-00A0,U+00A2-00A9,U+00AC-00AE,U+00B0-00B7,U+00B9-00BA,U+00BC-00BE,U+00D7,U+00F7,U+2000-206F,U+2074,U+20AC,U+2122,U+2190-21BB,U+2212,U+2215,U+F8FF,U+FEFF,U+FFFD","file":"NotoSansKR-VF_2-english.woff2"},{"unicodeRange":"U+00A1,U+00AA-00AB,U+00AF,U+00B8,U+00BB,U+00BF-00D6,U+00D8-00F6,U+00F8-00FF,U+0131,U+0152-0153,U+02B0-02FF","file":"NotoSansKR-VF_2-rest-latin.woff2"},{"unicodeRange":"U+0100-0130,U+0132-0151,U+0154-017F","file":"NotoSansKR-VF_2-latin-extended-a.woff2"},{"unicodeRange":"U+0180-024F","file":"NotoSansKR-VF_2-latin-extended-b.woff2"},{"unicodeRange":"U+1E00-1EFF","file":"NotoSansKR-VF_2-latin-extended-additional.woff2"},{"unicodeRange":"U+0250-02AF,U+0300-1DFF,U+1F00-1FFF,U+2070-2073,U+2075-20AB,U+20AD-2121,U+2123-218F,U+21BC-2211,U+2213-2214,U+2216-F8FE,U+F900-FEFE,U+FF00-FFFC,U+FFFE-FFFF","file":"NotoSansKR-VF_2-rest.woff2"}]}},"Noto Sans KR:Regular":{"id":"NotoSansKR-VF_2","url":"/_woff/v2/NotoSansKR-VF_2/NotoSansKR-VF_2.woff2","source":1,"italic":false,"weight":400,"variationAxes":[{"tag":"wght","value":400.0,"name":"Weight"}],"subsets":{"baseUrl":"/_woff/v2/NotoSansKR-VF_2/","subsetMappings":[{"unicodeRange":"U+0000-00A0,U+00A2-00A9,U+00AC-00AE,U+00B0-00B7,U+00B9-00BA,U+00BC-00BE,U+00D7,U+00F7,U+2000-206F,U+2074,U+20AC,U+2122,U+2190-21BB,U+2212,U+2215,U+F8FF,U+FEFF,U+FFFD","file":"NotoSansKR-VF_2-english.woff2"},{"unicodeRange":"U+00A1,U+00AA-00AB,U+00AF,U+00B8,U+00BB,U+00BF-00D6,U+00D8-00F6,U+00F8-00FF,U+0131,U+0152-0153,U+02B0-02FF","file":"NotoSansKR-VF_2-rest-latin.woff2"},{"unicodeRange":"U+0100-0130,U+0132-0151,U+0154-017F","file":"NotoSansKR-VF_2-latin-extended-a.woff2"},{"unicodeRange":"U+0180-024F","file":"NotoSansKR-VF_2-latin-extended-b.woff2"},{"unicodeRange":"U+1E00-1EFF","file":"NotoSansKR-VF_2-latin-extended-additional.woff2"},{"unicodeRange":"U+0250-02AF,U+0300-1DFF,U+1F00-1FFF,U+2070-2073,U+2075-20AB,U+20AD-2121,U+2123-218F,U+21BC-2211,U+2213-2214,U+2216-F8FE,U+F900-FEFE,U+FF00-FFFC,U+FFFE-FFFF","file":"NotoSansKR-VF_2-rest.woff2"}]}},"Noto Sans KR:Black":{"id":"NotoSansKR-VF_2","url":"/_woff/v2/NotoSansKR-VF_2/NotoSansKR-VF_2.woff2","source":1,"italic":false,"weight":900,"variationAxes":[{"tag":"wght","value":900.0,"name":"Weight"}],"subsets":{"baseUrl":"/_woff/v2/NotoSansKR-VF_2/","subsetMappings":[{"unicodeRange":"U+0000-00A0,U+00A2-00A9,U+00AC-00AE,U+00B0-00B7,U+00B9-00BA,U+00BC-00BE,U+00D7,U+00F7,U+2000-206F,U+2074,U+20AC,U+2122,U+2190-21BB,U+2212,U+2215,U+F8FF,U+FEFF,U+FFFD","file":"NotoSansKR-VF_2-english.woff2"},{"unicodeRange":"U+00A1,U+00AA-00AB,U+00AF,U+00B8,U+00BB,U+00BF-00D6,U+00D8-00F6,U+00F8-00FF,U+0131,U+0152-0153,U+02B0-02FF","file":"NotoSansKR-VF_2-rest-latin.woff2"},{"unicodeRange":"U+0100-0130,U+0132-0151,U+0154-017F","file":"NotoSansKR-VF_2-latin-extended-a.woff2"},{"unicodeRange":"U+0180-024F","file":"NotoSansKR-VF_2-latin-extended-b.woff2"},{"unicodeRange":"U+1E00-1EFF","file":"NotoSansKR-VF_2-latin-extended-additional.woff2"},{"unicodeRange":"U+0250-02AF,U+0300-1DFF,U+1F00-1FFF,U+2070-2073,U+2075-20AB,U+20AD-2121,U+2123-218F,U+21BC-2211,U+2213-2214,U+2216-F8FE,U+F900-FEFE,U+FF00-FFFC,U+FFFE-FFFF","file":"NotoSansKR-VF_2-rest.woff2"}]}},"Geist:Regular":{"id":"Geist_wght__1","url":"/_woff/v2/Geist_wght__1/Geist_wght__1.woff2","source":1,"italic":false,"weight":400,"variationAxes":[{"tag":"wght","value":400.0,"name":"Weight"}],"subsets":{"baseUrl":"/_woff/v2/Geist_wght__1/","subsetMappings":[{"unicodeRange":"U+0000-00A0,U+00A2-00A9,U+00AC-00AE,U+00B0-00B7,U+00B9-00BA,U+00BC-00BE,U+00D7,U+00F7,U+2000-206F,U+2074,U+20AC,U+2122,U+2190-21BB,U+2212,U+2215,U+F8FF,U+FEFF,U+FFFD","file":"Geist_wght__1-english.woff2"},{"unicodeRange":"U+00A1,U+00AA-00AB,U+00AF,U+00B8,U+00BB,U+00BF-00D6,U+00D8-00F6,U+00F8-00FF,U+0131,U+0152-0153,U+02B0-02FF","file":"Geist_wght__1-rest-latin.woff2"},{"unicodeRange":"U+0100-0130,U+0132-0151,U+0154-017F","file":"Geist_wght__1-latin-extended-a.woff2"},{"unicodeRange":"U+0180-024F","file":"Geist_wght__1-latin-extended-b.woff2"},{"unicodeRange":"U+1E00-1EFF","file":"Geist_wght__1-latin-extended-additional.woff2"},{"unicodeRange":"U+0250-02AF,U+0300-1DFF,U+1F00-1FFF,U+2070-2073,U+2075-20AB,U+20AD-2121,U+2123-218F,U+21BC-2211,U+2213-2214,U+2216-F8FE,U+F900-FEFE,U+FF00-FFFC,U+FFFE-FFFF","file":"Geist_wght__1-rest.woff2"}]}},"Inter:Regular":{"id":"Inter_1","url":"/_woff/v2/Inter_1/Inter_1.woff2","source":1,"italic":false,"weight":400,"variationAxes":[{"tag":"wght","value":400.0,"name":"Weight"},{"tag":"slnt","value":0.0,"name":"Slant"}],"subsets":{"baseUrl":"/_woff/v2/Inter_1/","subsetMappings":[{"unicodeRange":"U+0000-00A0,U+00A2-00A9,U+00AC-00AE,U+00B0-00B7,U+00B9-00BA,U+00BC-00BE,U+00D7,U+00F7,U+2000-206F,U+2074,U+20AC,U+2122,U+2190-21BB,U+2212,U+2215,U+F8FF,U+FEFF,U+FFFD","file":"Inter_1-english.woff2"},{"unicodeRange":"U+00A1,U+00AA-00AB,U+00AF,U+00B8,U+00BB,U+00BF-00D6,U+00D8-00F6,U+00F8-00FF,U+0131,U+0152-0153,U+02B0-02FF","file":"Inter_1-rest-latin.woff2"},{"unicodeRange":"U+0100-0130,U+0132-0151,U+0154-017F","file":"Inter_1-latin-extended-a.woff2"},{"unicodeRange":"U+0180-024F","file":"Inter_1-latin-extended-b.woff2"},{"unicodeRange":"U+1E00-1EFF","file":"Inter_1-latin-extended-additional.woff2"},{"unicodeRange":"U+0250-02AF,U+0300-1DFF,U+1F00-1FFF,U+2070-2073,U+2075-20AB,U+20AD-2121,U+2123-218F,U+21BC-2211,U+2213-2214,U+2216-F8FE,U+F900-FEFE,U+FF00-FFFC,U+FFFE-FFFF","file":"Inter_1-rest.woff2"}]}}},"assets":{"d4d046c9455db92c5289b9bb294e537cc7a4d0bc":{"type":"PAINT_ASSET","url":"d4d046c9455db92c5289b9bb294e537cc7a4d0bc.png","size":{"x":0.0,"y":0.0}},"d6f99e4abb9377224da98112aacc9c411d418965":{"type":"PAINT_ASSET","url":"d6f99e4abb9377224da98112aacc9c411d418965.png","size":{"x":0.0,"y":0.0}},"09cce53a42f5222f6e421ca528f4b9767507bc0c":{"type":"PAINT_ASSET","url":"09cce53a42f5222f6e421ca528f4b9767507bc0c.png","size":{"x":0.0,"y":0.0}},"c5f6c2ee78e1c1fae870476d7c33e9c4ef0e9218":{"type":"PAINT_ASSET","url":"c5f6c2ee78e1c1fae870476d7c33e9c4ef0e9218.png","size":{"x":0.0,"y":0.0}},"8d5569b4c3811a00f9e445ad3a9abc914f81c309":{"type":"PAINT_ASSET","url":"8d5569b4c3811a00f9e445ad3a9abc914f81c309.png","size":{"x":0.0,"y":0.0}},"545cc40fdf2097a486a3ff3fe5554e67773e7e72":{"type":"PAINT_ASSET","url":"545cc40fdf2097a486a3ff3fe5554e67773e7e72.png","size":{"x":0.0,"y":0.0}},"b442be7a14cbc12484fdc22781ea80fc7b20b4fd":{"type":"PAINT_ASSET","url":"b442be7a14cbc12484fdc22781ea80fc7b20b4fd.png","size":{"x":0.0,"y":0.0}},"7e6ea15829e431bdb0452867680cb725205eb5d7":{"type":"GENERATED_ASSET","url":"7e6ea15829e431bdb0452867680cb725205eb5d7.svg","size":{"x":24.0,"y":24.0},"offsets":{"left":{"value":0.0,"unit":"PERCENT"},"right":{"value":0.0,"unit":"PERCENT"},"top":{"value":0.0,"unit":"PERCENT"},"bottom":{"value":0.0,"unit":"PERCENT"}},"format":"SVG"},"d51fd734751e3ca96c861815c86406c63cb6551e":{"type":"GENERATED_ASSET","url":"d51fd734751e3ca96c861815c86406c63cb6551e.svg","size":{"x":24.0,"y":24.0},"offsets":{"left":{"value":0.0,"unit":"PERCENT"},"right":{"value":0.0,"unit":"PERCENT"},"top":{"value":0.0,"unit":"PERCENT"},"bottom":{"value":0.0,"unit":"PERCENT"}},"format":"SVG"},"e42088c55caa5c48897632bcfeafc30b03c43aca":{"type":"GENERATED_ASSET","url":"e42088c55caa5c48897632bcfeafc30b03c43aca.svg","size":{"x":24.0,"y":24.0},"offsets":{"left":{"value":0.0,"unit":"PERCENT"},"right":{"value":0.0,"unit":"PERCENT"},"top":{"value":0.0,"unit":"PERCENT"},"bottom":{"value":0.0,"unit":"PERCENT"}},"format":"SVG"},"5fb30151daec360d1afcbecd1c68465285304a9e":{"type":"PAINT_ASSET","url":"5fb30151daec360d1afcbecd1c68465285304a9e.png","size":{"x":1400.0,"y":1167.0}},"2edf0a2574fd046031ec27a85cb2479acbee6258":{"type":"GENERATED_ASSET","url":"2edf0a2574fd046031ec27a85cb2479acbee6258.svg","size":{"x":10.222222328186,"y":10.222222328186},"offsets":{"left":{"value":0.0,"unit":"PERCENT"},"right":{"value":0.0,"unit":"PERCENT"},"top":{"value":0.0,"unit":"PERCENT"},"bottom":{"value":0.0,"unit":"PERCENT"}},"format":"SVG"},"eeddaeafbec3bca4e92bca33d628ea78a0653211":{"type":"PAINT_ASSET","url":"eeddaeafbec3bca4e92bca33d628ea78a0653211.png","size":{"x":4096.0,"y":2731.0}},"4f89b370cf29c22c8bfd83ffd6ad48b1dd2cd6af":{"type":"PAINT_ASSET","url":"4f89b370cf29c22c8bfd83ffd6ad48b1dd2cd6af.png","size":{"x":1400.0,"y":1167.0}},"0eeda1840f980a8ed0e689fe1f9824353bafb041":{"type":"GENERATED_ASSET","url":"0eeda1840f980a8ed0e689fe1f9824353bafb041.svg","size":{"x":10.222222328186,"y":10.222222328186},"offsets":{"left":{"value":0.0,"unit":"PERCENT"},"right":{"value":0.0,"unit":"PERCENT"},"top":{"value":0.0,"unit":"PERCENT"},"bottom":{"value":0.0,"unit":"PERCENT"}},"format":"SVG"},"06243902d099512128dcc1355a48e5c992aa106c":{"type":"GENERATED_ASSET","url":"06243902d099512128dcc1355a48e5c992aa106c.svg","size":{"x":24.0,"y":24.0},"offsets":{"left":{"value":0.0,"unit":"PERCENT"},"right":{"value":0.0,"unit":"PERCENT"},"top":{"value":0.0,"unit":"PERCENT"},"bottom":{"value":0.0,"unit":"PERCENT"}},"format":"SVG"},"810fe0ab1fe2f2d55db0e815c5d94bc78555faf4":{"type":"GENERATED_ASSET","url":"810fe0ab1fe2f2d55db0e815c5d94bc78555faf4.svg","size":{"x":24.0,"y":24.0},"offsets":{"left":{"value":0.0,"unit":"PERCENT"},"right":{"value":0.0,"unit":"PERCENT"},"top":{"value":0.0,"unit":"PERCENT"},"bottom":{"value":0.0,"unit":"PERCENT"}},"format":"SVG"},"c93e4a77270d048f96f370a261142fd8506d83b3":{"type":"VIDEO_ASSET","url":"c93e4a77270d048f96f370a261142fd8506d83b3","size":{"x":3840.0,"y":2160.0}},"a8068c16c07e08787ae188a3a56e1f330444bb95":{"type":"GENERATED_ASSET","url":"a8068c16c07e08787ae188a3a56e1f330444bb95.svg","size":{"x":24.0,"y":24.0},"offsets":{"left":{"value":0.0,"unit":"PERCENT"},"right":{"value":0.0,"unit":"PERCENT"},"top":{"value":0.0,"unit":"PERCENT"},"bottom":{"value":0.0,"unit":"PERCENT"}},"format":"SVG"},"c52b1e752c910ebdb03f10fcd0aaf34af1c288bc":{"type":"VIDEO_ASSET","url":"c52b1e752c910ebdb03f10fcd0aaf34af1c288bc","size":{"x":1920.0,"y":1080.0}},"4cb2d839ddaa8ed7ade717b8698b33f4489b6d5d":{"type":"GENERATED_ASSET","url":"4cb2d839ddaa8ed7ade717b8698b33f4489b6d5d.svg","size":{"x":10.222222328186,"y":10.222222328186},"offsets":{"left":{"value":0.0,"unit":"PERCENT"},"right":{"value":0.0,"unit":"PERCENT"},"top":{"value":0.0,"unit":"PERCENT"},"bottom":{"value":0.0,"unit":"PERCENT"}},"format":"SVG"},"8936bff9bdf0e1071beac9eac5b2331ec4cf27cc":{"type":"PAINT_ASSET","url":"8936bff9bdf0e1071beac9eac5b2331ec4cf27cc.png","size":{"x":4096.0,"y":2731.0}},"bf4857ec80fcb1404f21acecaa5eff1653753c91":{"type":"GENERATED_ASSET","url":"bf4857ec80fcb1404f21acecaa5eff1653753c91.svg","size":{"x":24.0,"y":24.0},"offsets":{"left":{"value":0.0,"unit":"PERCENT"},"right":{"value":0.0,"unit":"PERCENT"},"top":{"value":0.0,"unit":"PERCENT"},"bottom":{"value":0.0,"unit":"PERCENT"}},"format":"SVG"},"336ac530876eaa2b1db913b1b0df0a39feacfdd3":{"type":"GENERATED_ASSET","url":"336ac530876eaa2b1db913b1b0df0a39feacfdd3.svg","size":{"x":10.222222328186,"y":10.222222328186},"offsets":{"left":{"value":0.0,"unit":"PERCENT"},"right":{"value":0.0,"unit":"PERCENT"},"top":{"value":0.0,"unit":"PERCENT"},"bottom":{"value":0.0,"unit":"PERCENT"}},"format":"SVG"},"244f7ed17a34bb385ccfc7d9ccaa5c5f8a523d1a":{"type":"GENERATED_ASSET","url":"244f7ed17a34bb385ccfc7d9ccaa5c5f8a523d1a.svg","size":{"x":10.222222328186,"y":10.222222328186},"offsets":{"left":{"value":0.0,"unit":"PERCENT"},"right":{"value":0.0,"unit":"PERCENT"},"top":{"value":0.0,"unit":"PERCENT"},"bottom":{"value":0.0,"unit":"PERCENT"}},"format":"SVG"},"35991871b7ca3007bc0612f8601be0ce1363dd1b":{"type":"GENERATED_ASSET","url":"35991871b7ca3007bc0612f8601be0ce1363dd1b.svg","size":{"x":10.222222328186,"y":10.222222328186},"offsets":{"left":{"value":0.0,"unit":"PERCENT"},"right":{"value":0.0,"unit":"PERCENT"},"top":{"value":0.0,"unit":"PERCENT"},"bottom":{"value":0.0,"unit":"PERCENT"}},"format":"SVG"},"5a2eead312ec2ae252dc5a353cb3f7a48575eadc":{"type":"PAINT_ASSET","url":"5a2eead312ec2ae252dc5a353cb3f7a48575eadc.png","size":{"x":1400.0,"y":1167.0}},"0498fd21cc66170e5afb7c43f3496d658b5ba682":{"type":"PAINT_ASSET","url":"0498fd21cc66170e5afb7c43f3496d658b5ba682.png","size":{"x":2179.0,"y":3051.0}},"174af3628ea050b6c5657205c30d58cc8dfdb336":{"type":"PAINT_ASSET","url":"174af3628ea050b6c5657205c30d58cc8dfdb336.png","size":{"x":0.0,"y":0.0}},"fde0244a54e45655f579546c98baaa88b4e2d8c7":{"type":"PAINT_ASSET","url":"fde0244a54e45655f579546c98baaa88b4e2d8c7.png","size":{"x":0.0,"y":0.0}},"f35a0b5928c575f1ef75b13dead04ab7ae834235":{"type":"GENERATED_ASSET","url":"f35a0b5928c575f1ef75b13dead04ab7ae834235.svg","size":{"x":10.222222328186,"y":10.222222328186},"offsets":{"left":{"value":0.0,"unit":"PERCENT"},"right":{"value":0.0,"unit":"PERCENT"},"top":{"value":0.0,"unit":"PERCENT"},"bottom":{"value":0.0,"unit":"PERCENT"}},"format":"SVG"},"d5fa8c9a8fa609d8b7d06565c3a9a33ab9d65149":{"type":"PAINT_ASSET","url":"d5fa8c9a8fa609d8b7d06565c3a9a33ab9d65149.png","size":{"x":1400.0,"y":1167.0}},"64270238d3de4edd07597c9179b36856b5a53af3":{"type":"PAINT_ASSET","url":"64270238d3de4edd07597c9179b36856b5a53af3.png","size":{"x":1400.0,"y":1167.0}},"9b88bdc27380c69fa75742db0490e856faaff907":{"type":"GENERATED_ASSET","url":"9b88bdc27380c69fa75742db0490e856faaff907.svg","size":{"x":24.0,"y":24.0},"offsets":{"left":{"value":0.0,"unit":"PERCENT"},"right":{"value":0.0,"unit":"PERCENT"},"top":{"value":0.0,"unit":"PERCENT"},"bottom":{"value":0.0,"unit":"PERCENT"}},"format":"SVG"},"44da5c3edea87192afa55819594c43cdfdac890b":{"type":"GENERATED_ASSET","url":"44da5c3edea87192afa55819594c43cdfdac890b.png","size":{"x":1200.0,"y":1000.0},"offsets":{"top":{"value":0,"unit":"PIXELS"},"right":{"value":0,"unit":"PIXELS"},"bottom":{"value":0,"unit":"PIXELS"},"left":{"value":0,"unit":"PIXELS"}},"format":"PNG"}},"stablePathToAssetInfo":{"64:726":{"hash":"35991871b7ca3007bc0612f8601be0ce1363dd1b"},"64:725":{"hash":"336ac530876eaa2b1db913b1b0df0a39feacfdd3"},"95:262":{"hash":"9b88bdc27380c69fa75742db0490e856faaff907"},"64:714":{"hash":"2edf0a2574fd046031ec27a85cb2479acbee6258"},"64:728":{"hash":"0eeda1840f980a8ed0e689fe1f9824353bafb041"},"64:713":{"hash":"35991871b7ca3007bc0612f8601be0ce1363dd1b"},"64:699":{"hash":"336ac530876eaa2b1db913b1b0df0a39feacfdd3"},"95:250":{"hash":"810fe0ab1fe2f2d55db0e815c5d94bc78555faf4"},"64:99":{"hash":"06243902d099512128dcc1355a48e5c992aa106c"},"32:761":{"hash":"244f7ed17a34bb385ccfc7d9ccaa5c5f8a523d1a"},"32:760":{"hash":"4cb2d839ddaa8ed7ade717b8698b33f4489b6d5d"},"64:702":{"hash":"244f7ed17a34bb385ccfc7d9ccaa5c5f8a523d1a"},"I32:871;32:759":{"hash":"35991871b7ca3007bc0612f8601be0ce1363dd1b"},"32:758":{"hash":"0eeda1840f980a8ed0e689fe1f9824353bafb041"},"64:701":{"hash":"4cb2d839ddaa8ed7ade717b8698b33f4489b6d5d"},"64:480":{"hash":"bf4857ec80fcb1404f21acecaa5eff1653753c91"},"I2149:3588;32:761":{"hash":"244f7ed17a34bb385ccfc7d9ccaa5c5f8a523d1a"},"I2149:3588;32:760":{"hash":"4cb2d839ddaa8ed7ade717b8698b33f4489b6d5d"},"95:256":{"hash":"d51fd734751e3ca96c861815c86406c63cb6551e"},"I2149:3588;32:759":{"hash":"35991871b7ca3007bc0612f8601be0ce1363dd1b"},"64:715":{"hash":"244f7ed17a34bb385ccfc7d9ccaa5c5f8a523d1a"},"I2149:3579;95:262":{"hash":"9b88bdc27380c69fa75742db0490e856faaff907"},"32:759":{"hash":"35991871b7ca3007bc0612f8601be0ce1363dd1b"},"I2149:3579;64:713":{"hash":"35991871b7ca3007bc0612f8601be0ce1363dd1b"},"I32:871;32:761":{"hash":"244f7ed17a34bb385ccfc7d9ccaa5c5f8a523d1a"},"I2149:3579;64:712":{"hash":"f35a0b5928c575f1ef75b13dead04ab7ae834235"},"64:712":{"hash":"336ac530876eaa2b1db913b1b0df0a39feacfdd3"},"I2149:3579;95:253":{"hash":"a8068c16c07e08787ae188a3a56e1f330444bb95"},"64:727":{"hash":"4cb2d839ddaa8ed7ade717b8698b33f4489b6d5d"},"I2149:3579;64:715":{"hash":"244f7ed17a34bb385ccfc7d9ccaa5c5f8a523d1a"},"95:253":{"hash":"a8068c16c07e08787ae188a3a56e1f330444bb95"},"I2149:3579;64:714":{"hash":"2edf0a2574fd046031ec27a85cb2479acbee6258"},"I2149:3588;32:758":{"hash":"0eeda1840f980a8ed0e689fe1f9824353bafb041"},"I32:871;64:99":{"hash":"06243902d099512128dcc1355a48e5c992aa106c"},"95:259":{"hash":"e42088c55caa5c48897632bcfeafc30b03c43aca"},"64:700":{"hash":"2edf0a2574fd046031ec27a85cb2479acbee6258"},"I2149:3588;64:480":{"hash":"bf4857ec80fcb1404f21acecaa5eff1653753c91"},"95:265":{"hash":"7e6ea15829e431bdb0452867680cb725205eb5d7"},"I32:871;32:758":{"hash":"0eeda1840f980a8ed0e689fe1f9824353bafb041"},"I2149:3588;64:99":{"hash":"06243902d099512128dcc1355a48e5c992aa106c"},"I32:871;64:480":{"hash":"bf4857ec80fcb1404f21acecaa5eff1653753c91"},"I32:871;32:760":{"hash":"4cb2d839ddaa8ed7ade717b8698b33f4489b6d5d"},"2088:72":{"hash":"44da5c3edea87192afa55819594c43cdfdac890b"}},"animateRootIds":["6:1478","1:2","2119:1762","4:943","1:3","32:815","4:927"],"siteSettings":{"title":"브레인에이블 | 두뇌 기능 평가·훈련 솔루션","scalingMode":"REFLOW","lang":"ko","customCodeHeadStart":"<style data-brainable-nav-first-paint32>\n@media(max-width:1023px){\n#container header.css-1npqvn{width:100%!important;height:64px!important;min-height:64px!important;max-height:64px!important;padding:0!important;box-sizing:border-box!important}\n#container header.css-gs1j7q:not([data-brnav-header]),#container header.css-f62t5g:not([data-brnav-header]){height:64px!important;min-height:64px!important;max-height:64px!important;box-sizing:border-box!important;overflow:hidden!important;width:100%!important;position:relative!important;top:0!important;left:0!important;display:flex!important;align-items:center!important;justify-content:space-between!important;padding:0 24px!important}\n#container header.css-gs1j7q nav:not([data-brnav-menu]),#container header.css-f62t5g nav:not([data-brnav-menu]){display:none!important;visibility:hidden!important;pointer-events:none!important}\n#container header.css-gs1j7q:not([data-brnav-header])>a:first-child,#container header.css-f62t5g:not([data-brnav-header])>a:first-child{position:relative!important;flex:none!important;width:108px!important;height:32px!important;display:block!important}\n}\n\n</style>","customCodeBodyEnd":"<style data-brainable-mobile32>\n/* CSS-only first paint: no React-owned DOM is changed before hydration. */\n#container .css-gxicr1,#container .css-7ycw0n,[data-hm32-poster]{background-color:#000!important;background-image:url('data:image/webp;base64,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')!important;background-size:cover!important;background-position:center!important;background-repeat:no-repeat!important}\n#container .css-gxicr1>video,#container .css-7ycw0n>video,[data-bh30-native-hero]>video,[data-hf30-hero]>video{display:none!important;visibility:hidden!important;pointer-events:none!important}\n@media(max-width:767px){#container .css-gxicr1,#container .css-7ycw0n,[data-hm32-poster]{background-image:url('data:image/webp;base64,UklGRlgzAABXRUJQVlA4WAoAAAAgAAAAdgEACwMASUNDUMgBAAAAAAHIAAAAAAQwAABtbnRyUkdCIFhZWiAH4AABAAEAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkZXNjAAAA8AAAACRyWFlaAAABFAAAABRnWFlaAAABKAAAABRiWFlaAAABPAAAABR3dHB0AAABUAAAABRyVFJDAAABZAAAAChnVFJDAAABZAAAAChiVFJDAAABZAAAAChjcHJ0AAABjAAAADxtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJYWVogAAAAAAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9YWVogAAAAAAAA9tYAAQAAAADTLXBhcmEAAAAAAAQAAAACZmYAAPKnAAANWQAAE9AAAApbAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACAAAAAcAEcAbwBvAGcAbABlACAASQBuAGMALgAgADIAMAAxADZWUDggajEAANArAZ0BKncBDAM+PR6NRKIhoSOmdjjocAeJaUtLzD/JfmJdhAyGFJ+oNcXuesCRuu909ZdDRRK8+svywLRRm8Z/3vMR+h/9ecn/Ev8100fLV0f/n/31V/rsIu8tvzXsh/QOyfxR/fdmdOT2m/lX8/6BH4//NfNSaV4VWkHeo0ZmSL6R6g/pN+CXUQ/ln9860X7c///3OP2uE2GMEX5pI6L+98IotMw2Or1Oe6I9z3aciLj0DjJk++cGsKdGnvUNA2MBRYVBf5ZctO3jneI/88AoO9v371F+t5cZDvmcTSXZI06S8PDq42XkvoBXUaawT2poVZE0F88CWNdkhA4P18OT2/8gmL110S2oemR2L1l7SN5lRjfGyxAmuKVM5XqNjGQLjN4+CndsR5zR/6GnwPbiRL8zJtmEcPU5Wr/U34G5bpwfWIsWXe3mQih2n8P+oz7k3hN+AxVE8fJGCa48hlgaUo8JoUAnocFXtHEVcbRQbh1RIBMlM/dyWM6luI0G8fSS4geLfYz1KGfHmPe1D3tuyC30HRuv/9EFcr/0p4YPWhet0FVPjan/5evXLYQW+3QEPipOh+Nv4Na/+hU5HRhEqrIUwmuQzwABUplIrkm3t1W11nES2Jlxb7sxs1DVvgz6oF8fUCLrUdVWs5UIvgmRVCUcYAJr0/2ZzOgA2kR90JEJILZH8iOdnm2xpbLElHGolj9CLj///AHyQ6Ppwqwj/8ftyH/n3yE8JqyRaTcxC6vofXQ1KI2SE3sQI+Vr24apOwEhrhawim200rM87auNJX4VrgCYH2SGtPVcHv7g7vnyinHJqpJi/QGyW6uefGJdavr1zuQnl/447itf/57O/7IBEPu2gku7oMuq2WDk/UOo1t+Ofz5T/+/KMMmsKQKYcNCKOhlwpeVpGju/u2daEwKrJf3SQYGkF3XS4ZspMBOum64kQnni0gcuzkLo2/AL5nYqY/cov4ZO1kML/hqP/4KYh3KZQXoanv/0ZCF63sX/4vcD/9HIfQpIB7q1C1Pf2Y1y+fnsDc/w56O/WDWIYXlW0PrjsvoNnX0FkUCyYZsgJijh5BMJ1aIbmQo6dBxY/ct4I7lxiOhQcBdhyX0jzvLOrc67Cmkd45Z33WsZQt6g9rtH4V/wVsU3ddGvojf0b7av/iSekf3X0dXnUc78Ga9UmxQYC7s+G1v/leAHkXhbKdFNaRVgHteLKn8enugqal+Knf9ovQ/bzBx0b9pPzIStTR0fEqX/8eKD43+v+j+VfvQ+jKd7wrwB3pn6qAZbLR/Adxsx5jU03BAeQVb2h4fzMYzJzwTXbS2buSJ1oiDHkMA0m4E1Qi9LvGDdOIT8flvZM9Lp/F3x3rmL33S84/dbpikIo1I/dTDFQ8bUUfN/+P5iU4ij9F6CUEM/51exzgaoq6APf2g9npFcPd6HokS2HJXwBlrIjgPnaQpodOHg4Rm/Wtpnf/+z9TH2FkT59Gr6TT5qX3Nx3/yvuv3Cybg765nJBPnwIaM5CO0qGRS1mxsU88y6WWVd/W9EeTBnmr7aVDIQEqHCGkRAJfaReHuVh+pOyEH7KhkICVDqZUJ3WSi6MMMu9mxb2anuGjtQ6mVDIQEqjTdKxzI89vlD9qHUyoZCAlQ6mVI1vgft2VDIQEqHUyoZCAlQ6mVDIQEqHUyoZCAlQ6mVDIQEqHUyoZCAlQ6mVDIQEqHUyoZCAlQ6mVDIQEqHUyoZCAlQ6mVDIQEqHUyoZCAlQ6mVDIQEqHUyoZCAlQ6mVDIQEqHUyoZCAlQ6mVDIQEqHUyoZCAlQ6mVDIQEqHUyoZCAlQ6mVDIQEqHUyoZCA2New2tJZatowVYq8puXhye/SEXMqJLPxchZgtyEMVFWikOzR8Nqu1jFsxlCeJ3O8HJeuwRz+fJM2K+TWbaYb8viR45ex2FjyiWMOS2sIqQ1qH4bLlFLDQCzzktFEGBXrhxmAnR2WukwAcDBTUS02Nx6NzcByPx0oQpHowHKke4/Y2Fqyu1v+et1babkFQyd1pTUjJNyul5WgohVc4XdwcFQMYsBNkeC7ld89nphZR+SdplpQ5CnE/zx3AfRBkzpmPeJW8/shAP1nuxVu88TRBNVLRkjYOLAwCEeOPVxk8KIuih52AczcxOVjV3S9oeK1KUwA1W4kqCYYbDRZcUnXx3w0eqwHYABT+CxSvhE8k5hsqam8Znq3s5JFwvgof/+69e+hqKKaNO8WmgBaHHEt4DU++mLpwXgBUWlsJNrfIa3KSeD9QhyikZdp7ga0u7wkzEAXdWp3EGtN4XdJtRfjRYutJ24MRV+89AdSSugExIj4TDgZUIzX96du2kn2Qv+R3GKlHMbn62PktKjvgMeazHLQpcePkSb3anOusp+0PpoQDtdyDNCB24MJNaRO2vcGpXm5jfvuxs/V/hpYh5VQQlO53GbGZKKWmxZcM7gqoDWD/IWuUn2hzUmO5Koik8XwA53jg6RL23JiPTdT3nReDx7GXasf7cvk3RkfR9nWK+b/Ip9d/0dwaVlwvjv3XNQKQbNUp2PhxIj+OdfyRYpuyEN1Dmg7FC9Mez1MixkRv+vdGrceqC/561ffgILEcEqanYXSo3Cb8Lp1xCbbIzn6jQmgEF+NZlbLH4DECXe8Ho/qu4p+JbupP9+EvwhIf3NmbwG/qLwa34Kde0n/9v/8xPb//4XYlfktb6uttv/Z/225JgtJKWcAc6apCaFQe53j4qp4tSyxnl/vPJ6R0ypb7nsj9wbpkZ+KXVKc/Vrt4bYEmznkY4fj941fqXXgsRReTIbum14Ct0e9EDqXvmP330iY1xPqPyH4Hjs//Ce+f0H/nBaVnC0ZKCdDxSm9rsX7jMDpKI4rpnNkrujL1IPt2KjJ7vMRIuKn++g6TgxD1TXE2vW+HXNlbdcvnHhHmhXJU9kpHtLd9tPRBIfH5X0zn99rXQ3flk/n5wRlWULOsJy/3+fY4en463q9peMT0Ua3lqJH+6YrMa/CM6Xb/6nzxryr4uhhFVFCTLgVyGCbfnlILO4CHulxcU8IP4CJEKS0aS/TBJ53QVeb/tvqCGzzaBHKg2jy7RDRpsyelyOUcEct8vCgcKJmmnpd5V8lGdd4r/NyiHQJsYLQsr88V4ej+MeGw2yE/xi88hhqb6quzSQegsnvkUCVz8rGyTt7BNmBDZpUF9caj3VH4tQn3Az7ZnnJTcoe0ltPgpIN0NgA/v9QzUk3vgFlGd9fRt68BxtLylLGzKnL5kRCFsfgx6d0rpQoOe4skZIE6JzKRdL3QMcA9X6Z7ijXYDF1vQ9v/41wgo2uz1uqVECx6NYq3xd2jHU46sumvf7o9YQF/BjQQnt/60ACI1DeNhfHzBwgKc68TCPkML982bMYMawaLUc2MrBVGXfiatsAVMZTBz7ax0GCshglFxboq/MCeramYBk4gWFIZ4O3Fc3tWa375FSjlsFddcUF+I+I3dfX+2zdCdjVYt3MMIdDWQO7Vw9H5pV7G/KtWMo59wVb89quE7jb5q2Cge606zic2s0AB680FSLBDPq/YWbwuGgpdfD+UWxofHihs7iK+u9GK0Tr1yrqrIr/fkCw2Y2x1lAm4tr7w7SGsq47oNB/PSwzI+gzMbYMECzvU9TdL85LUMYkPx5Xma3aReK9YZt28f5BmFFX+RI5P/jzzbawc0Ywa5X6z86AbI9trsJcdxZvdNN3oqG0nR7n2ll+yn3Ipem7TY/qp/qtUF26+XbCeOua3GAwTv+6TSCAmbmnT5K9EVyYUNdkLNRvL3zImc+dEMS00AhMwlBjGSg0jJDmPcvpskijZq2Wc7SnKChUfWc4REeKQHFtltvWv6uWOjmiDz6DMk54WYsriu7GnMO2XX0u0hcIwSFgHR6f5NgoKICB22evF1nkX2J9kQX9baxUuaM4XaayTHjTmvzs37B86E09+K7W5Zh+CmLR7hgE2lRl1p8uKbBqqdt9dq+30fp1+hIiNVuysmP/MG2pRViLZ37J9S9WwHzfl5uBRvMyoMeDkd5v3wUMJA936NL8rk5KxNrSXnkNI0i2t/OdSTuBR8Lv6pf33ueFJ/gaqbvR2me4qZgSBiHudI9vFL10G2ECVfdu9CqEj2roJUhom4ofi7PSVZsTV8RoR7vXvsDTE8aDVlAOoTezYOZpjcFeK3/L4Rj7YyuJZYBvXeT/thae0VU+3fb/M6LhoqTlZMM4Seb/nLLH4D1PpBnD4XF8yTMilNcACcD6yxoGqZAGY4/34IudMayVhu6bfm6yZGpg+84S2pbagv9H9kA0zDlmNt436WKIMI0L40/daual2BshBLv7fGaTbcucQWbclsOKUAWcApcnszKEdek6UmEAp0Aa7iRma3V3ql2K5MvhlSPi+2C3z21/49C82++0LwCpUjyqIZUlvuplJfH4ZvCVPgJ6bPnwqn6JDi96uCg1bI0jUL2qBRbEJ7KkPttQF9vqF0bRS3tgLrHJP4Uk/OXEkWgi3MlniviL2xYIMrMRVFV7gvU6DtNXtS79x//79afMKw85tnoD40ZZm/7GJvo8H2YaLwZ5XsUEPcmfokUlW7WO5lj+i6gCGgT779+GI+fHmaCHKjrGn5AHXsR6ajs5vri2JlKnE4zNe79rLcePT9SBQRG3pIR0olT8iOfieCTxgf2qFzTxSDke9EKYE4ctTFXxSARFthP+HYih70jNaZDJEu/FdqiNMxWnCwxwBdoL/g4LIwwFulbMfBeUqu6sYuMC/beTQtGg9xv7B/HiGphdtD5yqt/w/BT3ja2DokA0ffaGPylE8UKv6vsSLwApgNkcaW8ptbFe67f8V/pDodcDzmN0fymP0Ro4FF1d/2x0ALSIUknn3i0mV4RtWEMAGmuYy64yGmUseZqZj0hp18stwV9XyjsQ6oHKnQcPM19V5aznBzsFI4vuEtx5LA+J4LhxeDvgnZkaaJA3DxWJIvpRJ8Oz2rhbc8rI2cglnMU5aCqS2276CXvWUqIplD0ar//L5Q7lOLrhDKSt4D+NgtRHBgC7Q6Td5WDu4q5bzMTRKyGe86VTZIRDgaOp1c6MdDQ/EoNYCliN8ZCfFKwteDf56bmP755mUJr/wdn+IiGxQvkwmUIszrounwWO/huwSYULIH5hKzgxbsRGg3N6c1tVE2R/GHKRRqY1btXD0ugSneNoRraKvWgg+C2gtPE9ISDrF/7rLB/spCg0Eh9DmAU/40fk9Ebv6qzgFuGr6RDH+xwhxuerUApme5q0KH88qsre7qCpYp4Vdr5Zy1ZDymNc5IJZl684S24GdAM9vFWYNUus3Z7UWM4SeoXAwEd9iE2jb2UyNP+I5AMgxdDFDoyDzj0kzcbH4Y088S2P0cQ5NQC7Srrk7KOCIzo3vcQLWnkw/D7SZYrA5NbXCPEh6C941+Py6MTNF8hAEXiP4isjVwmHbXtkqXF8WKZoARyntrPwO6EEPIqZL6xT8DNLW1Qu3ZPBpVevo839mATO2Hl5lP+QgVsC0/u5u6JnmO/xuj1K95IoHPsqE1FsR/S/2vkz0A5DBrVihJY13NJ14Z7DE0+b0spfIR4RmEoSqHhhltuieVMX8SnP4LHPdvxWdrJFOHeGZnclU4DjLg+leowZIfYp6p2Uz99pDpxbk6vqrjZut69CUn1U6tzhh9U2S2ExYuVlrLVBqya+9u6bZDFJ68IP47ggqt8wawPGzn+r9DIwwUHb+QFBN5sgHJgcvKpsRf2d7rAylYg/yvcoi4tfxjgOtBcuavs1TMcjlBIvUHQ8D3i0YD6OPbD3gDD7DpQlS1jWEcpACGAPokzVjj1mT8LOUgiAlYT+eiHfY4+8nYrO18IxmgxQAa5yHj9upFWNeeFX/r1iqlWHIHrKM1gbeoa+dW6Cy0JOZOTUlnA/gTYHM6q9w5fovJypLUArHFoJJstSkG2VDQ05Twwl8fnPyRrkuR2CjPnV9VCbcWbnHyQQEo2C5ClR2F0jpTpB1mCJE5Ks2siqn5OcaD69AiKwxhG8sJaxD6q+XqGvv0v11ApHGed+N6tWyQ3/rQ+FoTupoBOe19PBnJQFStp28WtIKF6VQ3jT2QnTYycFswDYh9uuq/758hEIK+8qVBP18Fh2WwcF5hXjjXoE6JZvramFl9lRl+fAgyOKxwcw7lTwLY8TxYP3zeVsDrkMVRAsn2CeiByHUxzOgSGpmIm0xd2TcR68Zy7FMWHf7CJiE4XDNF9mHz0pC8F5H/xAcrz7/oHy1gGTe0iv6ttFfMseXhRLfHmB/DLJhFHZ+HnvYKHQ/ilwatEYJFAEjGsyKbeC0Z4pP4oq2ajTvkeD3YR2b9IQYPWNzDsmV4Cr+kQQEXwAhbpUv2qGGm8lt4LJyjSk0JnOCxEjVW0N3rawYpEATD8kxCGsLLf4df47n1RgzvG45HOv5hWAuVGXRQ7dp3A0Ra8sk4sDMq26yhrswR4CFlj6hj4rT1s2DjLd67zcNBSGxkj/kBn0ElhbxFILuDe0NbO81Ulm1raoKF/GnMlWYActTMB1FteBct1tR2HnKsChJ8mJlWgFun7HMZtGcHXVTS2HxIcD1WXzpb3hPzpoe5YIsIfAf1oCXO6qIDfaM82+BcsJ5su/KF24xT3gZLp7indOOVDN46dwkBnKOkLB0IU7xWLax2AVsR7wC+XEZHTmAjvzuXgg90cagxaxIqT9y2/yxIRXQQeR67ttg4oyHmFIkN/lmcW3qhHlVk8+nXg8l3w6WHmnz+kA8vCJiOuduQMdGnmSWbl+LPMhwSrjawlmECmNnl4J4PVJuVf3gu1FJdhEQfnlM6MS5MbzUM3Y/eVKKH7A9/ZKGhG7DF18hHCoZH9c2Og/71P4ob4/6o7l1rPDBOtyrblC89M0CE1eJqtOVbnMjbo4uskXb5q0zFYXA/rAURoU2YcvB34JQrB/Hjwcwi9H69tZciYv/z+ljKvpUyqbVH1aPu30l4/fLme8qInVrMCfQFEUir1/Mze+yGNEyDp4GpUSchOsZzxL63OD+q4FeZhZYNPnukHx+xJgrOLm6r3Pnml9EXHSKuFfHLpTmw6WZBrox67KgGnRs1zFRTdLkvo0qJjlhWVLUciFje/A26V/+2lLnq0FKcOhi7tFhu3cmLsS8F1iaHlZAdhw3Hy/LG1EPeYZobQM/NnfJKXQNAFoxwXmKmRglAl9vG9gWDD36VVQFU2JiVfdVNerofl/usj2dHaJrnOBUCeAX4S6pfsLhtsWyOfASwXDWeAvkQKVb1aNSUEBLcPSQJwhJWKCAk+n5m1Df0KHhru/eLF+a3rHCrs5qAaY6hhgRFL3XxGuq56ZVzqXHhmh6BOadDEWvl940UuQvnghwYlkF7FamGrfbcrIpfK8Hw8p/znQxZYi67VppCDyzlGJYTe3Lm8XvYPeM8w8NaKm58tdWTemdPyHZ3egHbs9KQ85kpNOc+be8aIT4gx8RgbauZN+G7kX7tD+CTbMRxZdMaymkQMSuQybIyiiDCPCZd74501mGl5GAuiI1rcKdJwgC8VJbvHD5eLUrFB7MoM/aQU4BblisGz+HOPDa9h1/+0gCnP5MWzpPeWpOQJJ8iDXLQoMIMJRRe0dMz1HeHcm2/4DTai2IYTyI9uGULFpyL3gVXs+2vozGxA2ZNwVgeQg3VlVE2m6b4m7m7Mx3pVEZligEnDmfdYmt1twYifwMXOiP0zSYAUChUXFkvObUCd3ys6BTigFaTC6iupe7qaEYjghT9lqFA/VOMhl7aQNIsAU4IiwCCo8UoUEsPF9OkEJsa7+pqlDX50TEq2S1ReOidmIMXgfHu8jIw1uCEzM/mTegCxol85JOj+ac24atYBVRE/p+cD3TtIXbNNeRJjZCha7h+vVrl26qfiwsLRjKuOYzCYXWO84VjzJIcqmRVRVF5tQo1+HIV3CyuWsq/atJfu3SujKEF2abP2vwOl3fcnjEE04i6Bc2Da7O6IZ3hi3yyyFKNQC0e4aiZhou4wXohs51fVp7gWWEUBFEPjFubJAaYeXd92nH/Rmwovu6/L6/Wyt0wdf/fBxuEpaeNBO1ILoymXezwwNU03Yyx1D5FPySl6D64E5we4raC3TvzHzbuhZAws4pPlPg6vdbs0/UJKnar6ijuYfI20666S5uv8+YdfsG0ffe7CmQESf6ZBLGCQbfpc+Rt5GzfTOtQXBitBJVhG01bsfCvmeAhLWeQQ3oQ8PtxC/lZ6bZzXm5/FvXW3QPIjNxx+EtgeEmerxOVQXtsZ9o5/N+aFql9s6pB2E3yltWnWzC3ZnNE2Vt4dFNZKOJc+nd7wpOOVBn1uMnOV7Ab0p8XkOzerLyKR80zgQVv0GSIJTYyQ+gKTxC/Ao2EKfbaqCHMxLhH6cnqF5nPSxp5sRxq7oWnco53xJ23RMTaAXtj9YBRv8eS+n7W7y1x8Dq1q8JVlDAPI5vaPctmrt5kshAJ34bKNvAKiYDx4zFXgVb8bz0+W9KQR2O3/foIp5crE9uESSvBt7xTg3Nft8nfOe4bYsO+G8F8Kby12AYdYIjBWctYXYvq+3GPwuGPWOYnbPn1ji+D970sc8y0PhOiTfHasiW02ZGaaZBSe2TGUsrbLcIPbw+1YLDcELRpAnSI6Bmt9ErcjkhXZiZAVrCnz2rpR8Pii8b3yZlCb+Ae3W//3SAXNRygSXgkXS/HpMwYANZRuceo/q81rv6vajDUhfBVFdMKaSJbeUCPtGxr28c3fQ+LRKTDEhOzaL0Oek2PpsI5odL3xZbiv1zIza32LJ5VHd9Hznv0zR6BgUE/DT9/d4Jzuqp7jhuZh7Xme83BM+r5XXuhY2XPSetQZJTS/zC9UHcYhSYvPCe8zwLaEhuT559H7YS1YrHA3azTODV/JRANTcZMySvkJrPlpHOscUDqPtZ/WVcIirS6SUNG2ovITwF1E8f1FIjP5Y5FJwR1Q5j1TyGo+hrvjWresrKm44DT3aNh+1vqs39AOb6sUEfBHdugQJCLKd74Cw79FQoUjqM6UbXsurHaz7ycVOcTy/bUKWrt4AmN0HvVTdd9z5hs8lPS43tBEkKsXPf95Iagjw/tZ9Vei4PGiBgdowqbPm2op3PwqsGvLiBMg0wQJmWhnTNfzzVQ6/ElF3N/9sbeKyiqxeRUaVF/mElpyiU6mv+lGIOYeM9FOcr2hXFf8LKu5G8hxtzb3sxUN2/Tai2GrU6kDywrHHuGUaF3lbRPJ+aoLEdtvWZQ7WuZSaunbTuOke789yjVjzYXnaFuZiq8Q4UM8y/doErcQrRmnVOiJ+2SlLwGs5NUzI1tvr0UrMTKTLf/hHYAGzYqK/STOLS9/yd9Fk5tj9hRlSNW/Kxq0oagV3L7ZbCpeW1E1kwcijoh9jxijrV/cJjmxEa+Nd0vMULCXvfuNIS7z12TPDsfPNSvrye8RPLULsZqN8ArOOO9NZzHVPS1rFuYuc6iEgqHlWP3c5CYsVAX/jJYs/6m+o3eUGQiPNHUuPf22XplTsEdiPfdqADjiD2TdOiJ2hsVs0q0CuqGJuc1OBiQrEJoMY/9J8YoxEiT1jBvERoH4teKEl73WIOayq3Sm7ZxU0ZGsaKFsomjDAeSDMeUXXoq0rz58jM514rp7vDFmkEFXaygk6RS8I72LWx9ExmkPPslb4ce7xjJnh3EDlqV079wiwRP1e17w1fIordTF3d+ZtDue0/zgalbAzoO45d92oBGWc8bVVKqP5+0AoF3kMjQWE34vTFxqyH4IHM59Fvgp4CwYr1yM9eX8KamGlimmAe89X3qwNCdAAAAACybDo1FIab16Aw1YZlkCTutjGjfJO8FtyzqJBHAH5mnEa5wiPNNBJ6yRw+kxY6MXclXs2Zqwwx4yThdWNK4sZVmloxVG8BJ/vrmhJn4RztXpkQamYIoypwH3bHmhn1iNgTTifNJ1/YpGD0bkToCQV+7HFBmZcRhussOKcEEfyzW836ennJTCC5AlEAAAAoKF3D3NH5ykYXdmTPFJwYTg/stCijE+xvpRtQGcDFfuDNy5ozKXqQU7FdX5+s5YBSmWGJ0evfkP29MEpZ3WvB35AHsAFCQF6Bl4QB3y2cI2UeAAAAAGYbauzq7GUO/TSowYn3xe6A6eK8USKL70J/kE5GJAItwoWgbLdZGc8lXfOEuf09gAAAAJ+Ve/tjMvqh69eV1mfI/0vQRKjMQjOwCXpEcG0AAAAAGhsExmxeSUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACIsK63gm8czWzwPLMYIcnmTqzOPiUlFXIfRF3t9yEwA6hcHWoaWnCNbLew/IxuUe0FsGCX1ViG78Fs1cLvKNU60lk2dM17galjheWF4aSk35rrgIFnrEojlrmBErWOjkWt7HW8BmGA4AYj8ZP3QWk+S09F4G4Ng58ctwcZSXgPrsPiFRqLOYGBihJd/Y0Wo8ryjfyOa3aAPvUxRCFt9BNWmRYncXa65sSvdvh7bbfdcpEmNKAK5o+Uk4jIortmJsO6t2ZyQv1Q1iACoqdYaPctLCdfi5bnYFFJ18+kiz/ixJRk38uZW1FkJ9TuKjjWHQfYuiYlgUqSAXLRA9cH8vrWJtXAV7VCqsPxCKGMlBlcFMGt3zbZrXHS/mdoIBo7kTPFkYrLwvQqLP8THoCoLQwbNjE+LINsIkJJ5ZY7HaXG9fSQUbBmXv920SYDme92GVZHKFbmg+panijB5IztqmFjdnmdXJEi03LUjuAUaSAENE7TBGwaYR3CqVFAAnIWwNlWb7L4dPaoCZRYp3PqXQ4HzACXTmFamvF7wZn2YXTIQ8TdsxbK/pTKxZGaUg4fCc/n/cASs+0sJffLaQFmvC3J8Jk5AmXyPkafbT+JjqXEsA5PjTbijAwWCQmEoaPJam0ALZ7JneXuidvUox1TGSvPi10ZlAbQZT7A9xcOnN6Ls++XH1+SapBROlhoAqIen7y98BwMlyaBgHhtNqQwYmK6CnVf8CKJEpa3xYLnAo7C6X6+DQfRFJzSQRSSMiJe7lN4qbOwr6vv6/Lp1jG43DAK/Z3w1erKPbZyKeGQy3vspKhlg/338+shIWV9RXW8CxnTPAwJZIj+2WxI9tb3BMZXNup6ZPTZFQWzA5YSH62qO0/Rv1eeaJ8sJRqjxQmFQ1IIMSNxNFdfVcgTKZxNGMq9rB7C7l4yiuD2zKlSzmMwzTeHt2blGNl5IOo8oyev5y9owi5b7xBoP0eT4Z+C0HaZaefrT9C5pCrWbSHhddM/iXCjoqEvov7//a5QPQiGKuRTJOnRCWu/6WArumYy79ZXSThLWoLWk/4fFPtdeGQCikITa0uzKBDjS4BIGkBpgaQUAPMtqkcMvK9Lt2LpH0u9/voTgy3Yxvefeg3Hn6YbXATu5ndMn+lAVume/+pafb2s49DFN67rcXriPecGdjNO95uibiVQHzlr6MqNH2zhnYpQaXHV877bUr6pbS9Y8fFVUP2aMk+uiTvKtxtL0dusrEmfd+HrPJ0QQ0U9jaGzm37hq8qzGxPHBKd94S0NbaJboxUDEZ14M0u6zbYIcQha3NbECMEPjV7wgzfCZ7bmqY2/7MJlQaTkXolKbPtx7SdAnv616Q1G7GlhWNGX8ULvAttQo9UQrDwGhfSsYdhWGICLsSU9AdrQuZIppGzoCI3hAifkuyvXi5XELNtbkt5yKvoPZWErSlhJkAPT6XcPc0KsxqiEzWr4oJPUUD/XohzuPWTgv1zmqKUolH2DRH1g54yjfM7o2EnHG8pgY0E9A9GYXXrK9cSauI1rRrvZOIqaWAfMkVuUUKyxEDJk9W0iu+ixwhLLSN6As7Hky0sKqLYPJ1YBqDKh0750iH1h1xb84K6v7wkRveBJMe7rovbK7Ntu0mmrxwF4Enl4ZpM5UzSVNMIMqHTtMWNcdmptQO39tFLO7Wn/hedMrX96e28uzi6XoSfoEHOZPjLfe43qFcdCuWwGyOcVhx6Gm9/xhIsejsvaCM4yIBpmFFcIQmia745FYljovmkl1ZN9XCaemGGKTUbNVp+AtCQl76fYn3G7jF62mVf05gzi9PXxZ48M/s4aUvpgqH+uWX/81ymxZ7U/YZsfp4QIWXx9fZCvQe5A8W9L+AC/rn2F+1yHGxjUtPbLz35016zzUOtHHz8QDZFXXG0bGUAr9oDW+aVxum141SknXlyc9GU9iPQqXxSK0e1cc8C7+vILdbVf3HYfpRMS6NlMSz4Nc3WG/NXf3ufIXBUikY3dgjquJdtjYI7OgQtH9ddCUhpklfcUPQdYaeemUvh16S+RqRNVmyWe8rSoXoTtK6wtSgWySlpS467LZDqvgj7N8FIg/Y2i6+6YAjnZuaZl8B4CEeK3XgGKbIJXa6PUrM7+zf0n+P4tsCljSpSTuTP55an2I0RgS94JCc6NB2BxmMHQT256HAb648WPLu6kr184wpJHo+3aJ3JIvUPa7h1AWXNXESwS1ceWWJkER+OXEbusxgAVkPs2Fvew8XXr/lVbxJayAeOSTIbUr3QHD47tjmxUNAX0BGf95x8F8MDl/wHBa4aukUmGtsPku1EVRHEstfAd7o7rwOkrn6A4r7SXH67P6rkmzLTWKWRwre8H0L5F3jt7NCghFImbYjfVTwLS8H3Fkyv74XJQ2UKpDYb4W4ycSFsbcFfbNoxMlOvKdi0l46AD9ZJNWyo/G2h2enTIX+GPNaNuTH7+MhyeCmA7SQDUjDV1dUmJgy2Xgnp7Lccn/yL5+qzSOPz9fn/rHpMUuyR2RsrDYlusNlxYl6n41T+5h71kpSrO3NI5fXBFtkzF42KltORwAo5Z2vFChlf4rKc/AgB9gogfWZgHswFhV12vxR6k17v0F8X8IOeKLRzbYN7naQMR/RgKgXBSK9JOya9sNndbVBA7E6L09xDeKxai+UOBtAeKI32M0/p/nU4eLSrGx/T5JmKSlCkWnNqv0Wa3lios0RQwTAWv+wCFSPxprnvsTg1lv1P1x3abPsGy9Q9NOi9viueP00UMCHoIOlo3YtnZATGe4c0Z3yRjXqr9PzUEiakM5GoHqULRm3BxqN+x1UN7yDhoy3KKQuaNGUmtoefibWHQrj4m/R2vyprA3bTMgBCeq0qkIHb4WrardHcH5RtG1DQbqXePnkDmy88ETPoFHcJzjhWqZcGzsnkKhXaAt460vXdRSuzcKP2UEYQyyg/egYZVMzZwVixHrrfZsGz3JwqEZ5iXCmn2FjUvYwTJUedrcxqhSAzaYBBxMM1OWNU16BU2Z/ec75v2Yrm1ry1oclwPuRpqSenc5ifoOowqLvBVu4heq5n+wGITdx8s2LrxQwMi5yHdHSdl/r/40ljIVi5HaUQOs2Wo6VN7Bw4SbFVTIJY0Ho8S47R7jhTiQE8b4gkDnzDq3HDzCOJx1QFy+1BjK3m9MKa5j+lveryznVy5nzx00Q8qM5w2gZ6v2oq1clWQbsP7HcRN6rYlpb9kicdmDafOqaIPmUFBoc0EQOIFM7itAsefHRvdp3U0dLGA62dRY4pzZM9YpVo6GuGbsbhMaqFL7/84EfmaHKqG+lJvhxhay0gGgNYHtyORToB2UjqTt7q7JFA0nh0yy/s5TDeUMBEEsIzeb7LUJQ0DK7Kn8Ovvx4Sf0jqJm1cAHfMW+XA1AC5+r5qiVI0s5UvQO5P2jOeppRobMkW41LMjk8dNfm1VDBTohaiN9eWBcH0lO/qDK9xn2JcVDr23cp3ofIwWQrv830wtihUwtDTKPP6QuLWjiF60tDeQWsHAaJ9C53zwtTj6GmHsKOK3M7Kw5x2dBhSMqBv/Zlbyf5DPRycNe2905FBxmh/Vc7invVn+0Q4W3ujZvlbcwxD6bJh8zadMciKWQUkag421KFLDZ7WML/nD9/I0GrOqFiEPJ1Yl4WDWu3OEZD5RalDw+zjFMiXVzQ4DB4ACGyu5cfOjdHjc6P1chXUI2OuogJniYjwCjxRrLNiSm384vHWha8pnQOS1Ar6oJAhuTR+Q8QgXlDWsWfncoL9URSUGPwF7lT4uIszKd8WBZiPjMvw+DiMm+Tpw6EEkNe6NTneSo4lM+i+sifO85teUTIq7nnkoemvbvdwPbjP1hLi6j7btdhyMJPllAN7e3vKXrShZgWRnAsQv4x9ilFapat4IOWKU32X1WH2I3F6r7htXkwggvK752qVBURDlimswzmphjln86Saqh/syRmJn6lrIusBka81G0EevIyfiFHzMnGSlbrzk3OCpEhIoGhDBz+yEf0EhJmntV4fptkdmM5Fep7cn8VBU5o0UPFVB9R7/S5PeTfdg2YIXGIu9uxsgSuTrrTmbtulZbuR2D2CC8LFhRwlnFF0ds9MU85/bdE+Exoni+1kcQhHdh0GT429uoBMK0QoHp3fsyBwlQr0STL7Ow9MIkuhXFDcAhY2Uj9szXs/9NCu2iSbnmoNsSq2/G8/nl3aUunXine2F+ZSigvmq0Vg5SI5pUD2srvbFNJ3Qa8ONPUhtP/vM85hDcQnSDsUNiXXbWIRAHiDDtfr75lDHgw7hKCJsb0uPx5H5VhnKNL1EGo2OK2sTI97IkPRG+Dv+X9V4vDDLHvg2Ou18ZTuSV9f8EBMhVPN/blMV+I+c2oK9dEheCvFdSsS6StigIlsTNtJ0dSrDhihQTqp71U0UbHyXI7fYGijRcyPEWBGG6HvqyqaSLxdeczUBa9z/Njqp1KHO9dvf2SRBzfxKsOWAKt9+WKUeOZ49z7nUkCek5634lz6Mqsympz6Q2r76cT7mPCSXO9cNks7aekPcK4Lu/YjyC99JmxaotxLGyQpKcko6kXkVUW6JBt3gx2Lde+vm6iy7r3qem6GeJfuF1MTkECZYIABaZHgEY4mbYmxLa5goSF9vy9+MHP7n3YfALMBiXSExJsWzyOKX547yrBhDCEB9p6KldQprkQ0Oklf3x8g8UfYXVRbkA3Hej8noLYGOtpYhN/EGdnYQkDL2G6eQHyjz1trMDevslsVpJ0qpqNwtEc7lV95BSrcDj0frizyYUb9kL88mb0g4ak2X8w9MtXYgH1tDSNqm6Uf+lS/2tLfvG9BzL6Vn9QOpQShv06Ah9amc/tTcfDBsZkpXBvRnDP3fnoQ4nebBZPkVv2xKo7Tv0d479g8aac3ih63pmJToixUvkLSO9syH6rOSJcIBdmwiQdz48AVK63uOcte71McghOfr65wyJoGK2DLGMBajxA6o0Spk/mrQhLsoAErmheOHHm+W1SQ2lGKI2qSpVNRIp+WEZNms/vJQ+uAy5KbqtTLhLQNwmJrBIcAsgrTeE+63n/oVUQlALazizbVfkwj/snBVgM/ij3LziHpq/ED3u9Uv8exXT3FKNwjS639ReyuWdsORKwqC5wdkVR21U+3tlBqo7tzTAe0cLujFCOybjEGxZ1xQ8b88vuRr9IzaE+d22y5Pu+NlY3rowP5j08OqOj7F+fEXabMQKjb8wfY69EQeKAZ75rx2vcVIQILGNLoYwNp5d6ZhYJmC/JsG5pNlO7w8eEd+cFzJkZedxsKCFjMQTXTV8lXrlEkv3TX0ZtZF4RuvDbwjOjxz0Y3UmQlmZ2cozSo1ysF3m+ninAIc7ixOXjNasZRYozKfoEflq2BNsfJShfMLaHjmIP4yalwDP8RQkRpyduZmZOIZWGGPB54A9OW8vwnwBtVb0F63MLH60wPfDPzIe5S+5C1H9m+TMNHH406kAnWJ2T4d8txqjGtfGsspZBKpHUj/gufAlWsihWzrp1qxCHgZlfvGa6qW66co1yKApM4MhkZARVgXzBKt35O9vA0qmaxbxxa5B6Wf0AREA0JhjR4vn5kbwunFvNa+43kCkKTSUC53AUMrIXI2VLZe+6jG5Zxr6/fSnPz0ECDO1SET3oXuvrlcLqWw0o5lXcy++eONiqBuhs6S7p4ijKNN2B+WiApciTMVeae05c3KBLZGuLTMESEYMSSK5fsI7x+brqSulS+jftvRk627Ew5FJisT0dSk8nXP+nDTbon3rxQimgqLwANQwiwEbqAtgC/Or068sxK9HO6rUqnDQMRWttwPlQ3GTVStEd2gcdGQxyefrKDsREOED/k714bK74AHgVsGxfXkHe+Rh3BNfyGc/lNHIIIhbHQnvpLaWvTBxQpUFLtV+mOqdUeQIUqaliOsw8uGyHaleB2kQf6SGzIK8+zqOyRf5AYeXFqUce0Cgo+YUhB1SaVdQ6MFvkVMkf9uKEz6t2WsW9jLwqh24etyLb+M/+okrZJ8DbDPez6E4UwZJ5s2XwFFQblOjTvZtAB/PFyy3X2bhuDRqELCguMii7Nv/rAAS5uW5uM+GDkA8snCb4SkrUuFALGuTQlxIo8HjKogNC1476l3CnalXZXxPJwtoWqHoPmgD7KsS32jCqE2olthAbkoncaTQheY30qHgTI6bJIFr7ZLPzoLV0jDsifxP6i0wyH0LBmy28on8sw/yztz7ro2U2psDYKY4vaqui2oobTIs0/0dYbGz1Kf2KgGpw0sSKo/4KbdtTmPAoCpyC0LaoD99KXavXpYLii+tAjDLB/4IdubaA0ATujyKqRpER54dkfcWl6wfDKw6fqXNa33Gt73/TvLCXEnda0WF2nWNual/RZLggNZxAXhr9OzmiyYeuViGXIZ/hWVSvlPINv2ae1JQ4pxciIb0S2NZFnht1RUwP6nSIAqErzjBM4aMdwaqnsfm6V22x4DbLd9S047EgxJSAPNVg1SLHhKhJJv5kumpcSAK7k+sNX7uB8pOSab9cZSzURtupBUJnvXHh/vWsLsuYUL5j6uD8jGU9X0FuWG/muddM0+VgYMr4Wb24U6iVzmG5dOOfJ9tm7nxKRCL+AAAA')!important}}\n@media(max-width:1023px){\n#container header.css-1npqvn{width:100%!important;height:64px!important;min-height:64px!important;max-height:64px!important;padding:0!important;box-sizing:border-box!important}\n#container header.css-gs1j7q:not([data-brnav-header]),#container header.css-f62t5g:not([data-brnav-header]){height:64px!important;min-height:64px!important;max-height:64px!important;box-sizing:border-box!important;overflow:hidden!important;width:100%!important;position:relative!important;top:0!important;left:0!important;display:flex!important;align-items:center!important;justify-content:space-between!important;padding:0 24px!important}\n#container header.css-gs1j7q nav:not([data-brnav-menu]),#container header.css-f62t5g nav:not([data-brnav-menu]){display:none!important;visibility:hidden!important;pointer-events:none!important}\n#container header.css-gs1j7q:not([data-brnav-header])>a:first-child,#container header.css-f62t5g:not([data-brnav-header])>a:first-child{position:relative!important;flex:none!important;width:108px!important;height:32px!important;display:block!important}\n}\n@media(max-width:639px){\n[data-hlm-root] [data-hlm-heading],[data-hlm-root] [data-hlm-heading] *{-webkit-text-size-adjust:100%!important;text-size-adjust:100%!important}\n[data-hlm-root] [data-hlm-card] [data-hf30-name],[data-hlm-root] [data-hlm-card] [data-hf30-name] p,[data-hlm-root] [data-hlm-card] [data-hf30-name] span{white-space:nowrap!important;text-wrap:nowrap!important;word-break:normal!important;overflow-wrap:normal!important;width:100%!important;max-width:100%!important}\n[data-hlm-root] [data-hlm-card] [data-hf30-category]{white-space:normal!important;word-break:keep-all!important;overflow-wrap:normal!important;text-wrap:wrap!important}\n[data-hlm-root] [data-hm32-laserable] [data-hf30-category]{white-space:nowrap!important;text-wrap:nowrap!important}\n}\n\n</style>\n<script>\n/** Read-only startup gate for the currently published Figma Sites React runtime. */\n(function brainableAfterHydration(runEnhancements) {\n  'use strict';\n  const KEY = '__brainableHydrationGate31';\n  if (window[KEY]) return;\n  const startedAt = performance.now();\n  let phase = 'waiting', reason = 'document-parsing', frame = 0, timer = 0;\n  let readyChecks = 0, lastContainer = null, warned = false, stopped = false;\n  let rootsSeen = 0, suspensePending = 0;\n\n  function committedRoot(container) {\n    const keys = Object.getOwnPropertyNames(container).filter(name => name.startsWith('__reactContainer$'));\n    const handles = keys.map(name => container[name]);\n    if (container._reactRootContainer) handles.push(container._reactRootContainer);\n    rootsSeen = handles.length;\n    for (const handle of handles) {\n      const root = handle?.stateNode?.current ? handle.stateNode : handle?._internalRoot;\n      const current = root?.current;\n      if (!root || root.containerInfo !== container || current?.tag !== 3) continue;\n      if (current.memoizedState?.isDehydrated !== false || !current.child || current.memoizedState.element == null) continue;\n      return current;\n    }\n    return null;\n  }\n  function hasPendingHydration(root) {\n    const stack = [root], visited = new Set();\n    suspensePending = 0;\n    while (stack.length) {\n      const fiber = stack.pop();\n      if (!fiber || visited.has(fiber)) continue;\n      visited.add(fiber);\n      if (visited.size > 100000) { reason = 'unknown-large-react-tree'; return true; }\n      // React 18 in the observed Sites runtime: 13=Suspense, 18=DehydratedFragment.\n      if ((fiber.tag === 13 && fiber.memoizedState?.dehydrated != null) || fiber.tag === 18) suspensePending++;\n      if (fiber.child) stack.push(fiber.child);\n      if (fiber.sibling) stack.push(fiber.sibling);\n    }\n    return suspensePending > 0;\n  }\n  function isReady() {\n    if (document.readyState === 'loading') { reason = 'document-parsing'; return false; }\n    const container = document.getElementById('container');\n    if (!container?.isConnected) { reason = 'figma-container'; lastContainer = null; return false; }\n    if (container !== lastContainer) { lastContainer = container; readyChecks = 0; }\n    const root = committedRoot(container);\n    if (!root) { reason = rootsSeen ? 'react-root-not-committed' : 'react-root-not-attached'; return false; }\n    if (hasPendingHydration(root)) { if (reason !== 'unknown-large-react-tree') reason = 'suspense-hydration'; return false; }\n    reason = 'committed';\n    return true;\n  }\n  function cleanup() {\n    observer.disconnect();\n    window.removeEventListener('load', schedule);\n    document.removeEventListener('DOMContentLoaded', schedule);\n    document.removeEventListener('visibilitychange', schedule);\n    if (frame) cancelAnimationFrame(frame);\n    if (timer) clearTimeout(timer);\n    frame = timer = 0;\n  }\n  function check() {\n    frame = timer = 0;\n    if (stopped || phase !== 'waiting') return;\n    if (isReady()) readyChecks++;\n    else readyChecks = 0;\n    if (readyChecks >= 2) {\n      phase = 'starting';\n      cleanup();\n      try {\n        runEnhancements.call(window);\n        phase = 'active';\n      } catch (error) {\n        phase = 'failed';\n        reason = 'enhancement-exception';\n        console.error('[BRAINABLE] Enhancement startup failed after hydration.', error);\n      }\n      return;\n    }\n    if (!warned && performance.now() - startedAt >= 15000) {\n      warned = true;\n      console.warn('[BRAINABLE] Waiting for confirmed React hydration; the original page remains unchanged. Checks will continue.', reason);\n    }\n    schedule();\n  }\n  function schedule() {\n    if (stopped || phase !== 'waiting' || frame || timer) return;\n    // Delays throttle observation only. No elapsed timeout can authorize DOM mutation.\n    if (warned || document.visibilityState === 'hidden') timer = setTimeout(check, 250);\n    else frame = requestAnimationFrame(check);\n  }\n  const observer = new MutationObserver(schedule);\n  observer.observe(document.documentElement, {childList:true, subtree:true});\n  window.addEventListener('load', schedule, {once:true});\n  document.addEventListener('DOMContentLoaded', schedule, {once:true});\n  document.addEventListener('visibilitychange', schedule);\n  window[KEY] = {\n    inspect: () => ({phase, reason, rootsSeen, suspensePending, readyChecks, warned, elapsedMs:Math.round(performance.now()-startedAt)}),\n    stopWaiting() { if (phase !== 'waiting') return; stopped = true; phase = 'stopped'; cleanup(); }\n  };\n  schedule();\n})(function brainableApprovedFinal11() {\n/* BRAINABLE production global: navigation */\nvar BrainableNativeNavigation = (() => {\n  var __defProp = Object.defineProperty;\n  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;\n  var __getOwnPropNames = Object.getOwnPropertyNames;\n  var __hasOwnProp = Object.prototype.hasOwnProperty;\n  var __export = (target, all) => {\n    for (var name in all)\n      __defProp(target, name, { get: all[name], enumerable: true });\n  };\n  var __copyProps = (to, from, except, desc) => {\n    if (from && typeof from === \"object\" || typeof from === \"function\") {\n      for (let key of __getOwnPropNames(from))\n        if (!__hasOwnProp.call(to, key) && key !== except)\n          __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n    }\n    return to;\n  };\n  var __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n  // navigation-global-entry.js\n  var navigation_global_entry_exports = {};\n  __export(navigation_global_entry_exports, {\n    installNavigationReference: () => installNavigationReference\n  });\n\n  // navigation-enhancer.js\n  var REGISTRY = Symbol.for(\"brainable.navigationEnhancer.registry.v1\");\n  var OWNED = \"data-brnav-header\";\n  var ATTRS = {\n    menu: \"data-brnav-menu\",\n    top: \"data-brnav-top-link\",\n    compact: \"data-brnav-compact\",\n    open: \"data-brnav-open\",\n    anchor: \"data-brnav-static-anchor\"\n  };\n  var NAV_ENHANCER_CSS = `\n[data-brnav-header] [data-brnav-top-link]{box-sizing:border-box;font-size:16px!important;line-height:24px!important;font-weight:400!important;padding:12px 32px!important;border-radius:4px!important;transition:background-color 150ms cubic-bezier(.4,0,.2,1),color 150ms cubic-bezier(.4,0,.2,1)!important}\n[data-brnav-header] [data-brnav-top-link]:hover{background-color:rgba(9,9,11,.1)!important}\n[data-brnav-header] [data-brnav-top-link]:focus-visible,[data-brnav-header] [data-brnav-toggle]:focus-visible{outline:2px solid #2055df!important;outline-offset:3px!important}\n[data-brnav-toggle]{display:none!important;box-sizing:border-box;appearance:none;border:0;border-radius:4px;background:transparent;color:inherit!important;padding:10px;width:44px;height:44px;cursor:pointer;align-items:center;justify-content:center}\n[data-brnav-toggle]:hover{background:rgba(9,9,11,.1)}\n[data-brnav-toggle] svg{display:block;width:24px;height:24px;pointer-events:none}\n[data-brnav-header][data-brnav-compact=\"true\"]{height:64px!important;min-height:64px!important;max-height:64px!important;overflow:visible!important;box-sizing:border-box!important}\n[data-brnav-header][data-brnav-compact=\"true\"][data-brnav-static-anchor=\"true\"]{position:relative!important}\n[data-brnav-header][data-brnav-compact=\"true\"] [data-brnav-toggle]{position:absolute;top:10px;right:16px;display:inline-flex!important;z-index:2}\n[data-brnav-header][data-brnav-compact=\"true\"] [data-brnav-menu]{box-sizing:border-box!important;position:absolute!important;inset:64px 0 auto 0!important;width:100%!important;min-width:0!important;max-width:100%!important;min-height:0!important;height:auto!important;max-height:calc(100vh - 64px)!important;max-height:calc(100dvh - 64px)!important;overflow:auto!important;overscroll-behavior:contain;display:flex!important;flex-direction:column!important;align-items:stretch!important;gap:0!important;padding:4px 20px 16px!important;background:#fff!important;color:#09090b!important;z-index:1}\n[data-brnav-header][data-brnav-compact=\"true\"] [data-brnav-menu][hidden]{display:none!important}\n[data-brnav-header][data-brnav-compact=\"true\"] [data-brnav-top-link]{width:100%!important;min-height:48px!important;padding:12px 16px!important;white-space:normal!important;justify-content:flex-start!important;text-align:left!important;color:inherit!important}\n@media(prefers-reduced-motion:reduce){[data-brnav-header],[data-brnav-header] *,[data-brnav-header] [data-brnav-top-link]{transition:none!important;scroll-behavior:auto!important}}\n`;\n  function registryFor(win) {\n    if (!win[REGISTRY]) win[REGISTRY] = { instances: /* @__PURE__ */ new WeakMap(), styles: /* @__PURE__ */ new WeakMap(), serial: 0 };\n    return win[REGISTRY];\n  }\n  function leaseStyles(doc, registry) {\n    let entry = registry.styles.get(doc);\n    if (!entry) {\n      const node = doc.createElement(\"style\");\n      node.setAttribute(\"data-brnav-enhancer-style\", \"v1\");\n      node.textContent = NAV_ENHANCER_CSS;\n      doc.head.append(node);\n      entry = { node, count: 0 };\n      registry.styles.set(doc, entry);\n    }\n    entry.count += 1;\n    return () => {\n      entry.count -= 1;\n      if (!entry.count) {\n        entry.node.remove();\n        registry.styles.delete(doc);\n      }\n    };\n  }\n  function attributeLedger() {\n    const entries = /* @__PURE__ */ new Map();\n    const originals = /* @__PURE__ */ new Map();\n    function record(element, name) {\n      if (!originals.has(element)) originals.set(element, /* @__PURE__ */ new Map());\n      const original = originals.get(element);\n      if (!original.has(name)) original.set(name, element.getAttribute(name));\n      return original.get(name);\n    }\n    function set(element, name, value) {\n      record(element, name);\n      if (!entries.has(element)) entries.set(element, /* @__PURE__ */ new Map());\n      entries.get(element).set(name, value);\n      if (element.getAttribute(name) !== value) {\n        if (value === null) element.removeAttribute(name);\n        else element.setAttribute(name, value);\n      }\n    }\n    function restore(element, name) {\n      const owned = entries.get(element);\n      if (!owned?.has(name)) return;\n      if (element.getAttribute(name) === owned.get(name)) {\n        const original = originals.get(element).get(name);\n        if (original === null) element.removeAttribute(name);\n        else element.setAttribute(name, original);\n      }\n      owned.delete(name);\n    }\n    return {\n      set,\n      restore,\n      destroy() {\n        entries.forEach((attributes, element) => [...attributes.keys()].forEach((name) => restore(element, name)));\n        entries.clear();\n        originals.clear();\n      }\n    };\n  }\n  function assertBindings(header, menuContainer, topLinkNodes) {\n    const win = header?.ownerDocument?.defaultView;\n    if (!win || !(header instanceof win.HTMLElement)) throw new TypeError(\"header must be a verified, existing HTMLElement.\");\n    if (!(menuContainer instanceof win.HTMLElement) || menuContainer === header || !header.contains(menuContainer)) throw new TypeError(\"menuContainer must be an existing descendant of header.\");\n    const nodes = Array.from(topLinkNodes || []);\n    if (!nodes.length || nodes.some((node) => !(node instanceof win.HTMLElement) || !menuContainer.contains(node))) throw new TypeError(\"topLinkNodes must be verified existing top-level item descendants of menuContainer (links, buttons, or a static current-page item).\");\n    if (new Set(nodes).size !== nodes.length) throw new TypeError(\"topLinkNodes must not contain duplicates.\");\n    return nodes;\n  }\n  function createEnhancer(header, menuContainer, topLinkNodes, options = {}) {\n    const links = assertBindings(header, menuContainer, topLinkNodes);\n    const doc = header.ownerDocument;\n    const win = doc.defaultView;\n    const registry = registryFor(win);\n    const existing = registry.instances.get(header);\n    if (existing) {\n      if (existing.menuContainer !== menuContainer || existing.topLinkNodes.length !== links.length || existing.topLinkNodes.some((node, index) => node !== links[index])) throw new Error(\"This header already has different bindings. Destroy its enhancer before rebinding.\");\n      return existing;\n    }\n    const breakpoint = options.breakpoint ?? 1023;\n    if (!Number.isFinite(breakpoint) || breakpoint < 320) throw new TypeError(\"breakpoint must be a finite width >= 320.\");\n    const toggleHost = options.toggleHost || menuContainer.parentElement;\n    const toggleBefore = options.toggleBefore === void 0 ? toggleHost === menuContainer.parentElement ? menuContainer : null : options.toggleBefore;\n    if (!toggleHost || !(toggleHost === header || header.contains(toggleHost)) || menuContainer.contains(toggleHost)) throw new TypeError(\"toggleHost must be inside header and outside the collapsing menu.\");\n    if (toggleBefore && toggleBefore.parentNode !== toggleHost) throw new TypeError(\"toggleBefore must be a current child of toggleHost.\");\n    const initialSnapshots = [header, menuContainer, ...links].map((element) => ({\n      element,\n      classAttribute: element.getAttribute(\"class\"),\n      styleAttribute: element.getAttribute(\"style\"),\n      attributes: Object.fromEntries([...element.attributes].map((attr) => [attr.name, attr.value]))\n    }));\n    const ledger = attributeLedger();\n    const releaseStyles = leaseStyles(doc, registry);\n    let id = `brnav-${++registry.serial}`;\n    while (doc.getElementById(`${id}-menu`)) id = `brnav-${++registry.serial}`;\n    const menuId = menuContainer.id || `${id}-menu`;\n    if (!menuContainer.id) ledger.set(menuContainer, \"id\", menuId);\n    ledger.set(header, OWNED, id);\n    ledger.set(menuContainer, ATTRS.menu, id);\n    links.forEach((node) => ledger.set(node, ATTRS.top, id));\n    const toggle = doc.createElement(\"button\");\n    toggle.type = \"button\";\n    toggle.setAttribute(\"data-brnav-toggle\", id);\n    toggle.setAttribute(\"aria-controls\", menuId);\n    const icon = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n    icon.setAttribute(\"viewBox\", \"0 0 24 24\");\n    icon.setAttribute(\"fill\", \"none\");\n    icon.setAttribute(\"aria-hidden\", \"true\");\n    const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n    path.setAttribute(\"stroke\", \"currentColor\");\n    path.setAttribute(\"stroke-width\", \"1.5\");\n    path.setAttribute(\"stroke-linecap\", \"round\");\n    icon.append(path);\n    toggle.append(icon);\n    toggleHost.insertBefore(toggle, toggleBefore);\n    const media = win.matchMedia(`(max-width: ${breakpoint}px)`);\n    let compact = media.matches;\n    let open = false;\n    let disposed = false;\n    let focusTask = 0;\n    function render() {\n      if (disposed) return;\n      ledger.set(header, ATTRS.compact, String(compact));\n      ledger.set(header, ATTRS.open, String(compact && open));\n      ledger.set(header, ATTRS.anchor, String(win.getComputedStyle(header).position === \"static\" || header.getAttribute(ATTRS.anchor) === \"true\"));\n      if (compact && !open) {\n        ledger.set(menuContainer, \"hidden\", \"\");\n        ledger.set(menuContainer, \"inert\", \"\");\n        ledger.set(menuContainer, \"aria-hidden\", \"true\");\n      } else {\n        [\"hidden\", \"inert\", \"aria-hidden\"].forEach((name) => ledger.restore(menuContainer, name));\n      }\n      toggle.setAttribute(\"aria-label\", open ? \"\\uBA54\\uB274 \\uB2EB\\uAE30\" : \"\\uBA54\\uB274 \\uC5F4\\uAE30\");\n      toggle.setAttribute(\"aria-expanded\", String(compact && open));\n      path.setAttribute(\"d\", open ? \"m6 6 12 12M18 6 6 18\" : \"M4 7h16M4 12h16M4 17h16\");\n    }\n    function firstAvailableLink() {\n      return links.find((node) => node.tabIndex >= 0 && !node.matches(\":disabled\") && node.getAttribute(\"aria-disabled\") !== \"true\" && !node.closest('[hidden],[inert],[aria-hidden=\"true\"]') && ![\"hidden\", \"collapse\"].includes(win.getComputedStyle(node).visibility) && node.getClientRects().length > 0);\n    }\n    function openMenu({ focusFirst = options.focusFirstOnOpen ?? false } = {}) {\n      if (disposed || !compact) return;\n      open = true;\n      render();\n      if (focusFirst) firstAvailableLink()?.focus();\n    }\n    function closeMenu({ returnFocus = false } = {}) {\n      if (disposed) return;\n      const wasOpen = open;\n      open = false;\n      render();\n      if (returnFocus && compact && wasOpen) toggle.focus();\n    }\n    function onToggle(event) {\n      event.preventDefault();\n      event.stopPropagation();\n      if (open) closeMenu();\n      else openMenu({ focusFirst: event.detail === 0 });\n    }\n    function onToggleKeyDown(event) {\n      if ([\"Enter\", \" \", \"Spacebar\"].includes(event.key)) event.stopPropagation();\n    }\n    function onKeyDown(event) {\n      if (event.defaultPrevented || event.key !== \"Escape\" || !compact || !open || !header.contains(event.target)) return;\n      if (options.shouldHandleEscape && !options.shouldHandleEscape(event)) return;\n      win.queueMicrotask(() => {\n        if (disposed || event.defaultPrevented || !compact || !open) return;\n        closeMenu({ returnFocus: header.contains(doc.activeElement) });\n      });\n    }\n    function onOutside(event) {\n      if (!compact || !open) return;\n      const inside = event.composedPath ? event.composedPath().includes(header) : header.contains(event.target);\n      if (!inside) closeMenu();\n    }\n    function onFocusOut() {\n      win.clearTimeout(focusTask);\n      focusTask = win.setTimeout(() => {\n        if (!disposed && compact && open && !header.contains(doc.activeElement)) closeMenu();\n      }, 0);\n    }\n    function onModeChange() {\n      const focusWasInMenu = menuContainer.contains(doc.activeElement);\n      const focusWasToggle = doc.activeElement === toggle;\n      compact = media.matches;\n      open = false;\n      render();\n      if (compact && focusWasInMenu) toggle.focus();\n      else if (!compact && focusWasToggle) firstAvailableLink()?.focus();\n    }\n    toggle.addEventListener(\"click\", onToggle);\n    toggle.addEventListener(\"keydown\", onToggleKeyDown);\n    doc.addEventListener(\"keydown\", onKeyDown);\n    header.addEventListener(\"focusout\", onFocusOut);\n    doc.addEventListener(\"pointerdown\", onOutside);\n    media.addEventListener(\"change\", onModeChange);\n    render();\n    const api = {\n      header,\n      menuContainer,\n      topLinkNodes: links,\n      open: openMenu,\n      close: closeMenu,\n      refresh() {\n        if (!disposed) render();\n      },\n      inspect() {\n        return {\n          id,\n          compact,\n          open,\n          disposed,\n          breakpoint,\n          bindingsConnected: header.isConnected && menuContainer.isConnected && links.every((node) => node.isConnected),\n          originalSnapshots: initialSnapshots,\n          originalClassAndStyleUnchanged: initialSnapshots.every((item) => item.element.getAttribute(\"class\") === item.classAttribute && item.element.getAttribute(\"style\") === item.styleAttribute),\n          toggle,\n          menuId\n        };\n      },\n      destroy({ returnFocus = false } = {}) {\n        if (disposed) return;\n        disposed = true;\n        win.clearTimeout(focusTask);\n        toggle.removeEventListener(\"click\", onToggle);\n        toggle.removeEventListener(\"keydown\", onToggleKeyDown);\n        doc.removeEventListener(\"keydown\", onKeyDown);\n        header.removeEventListener(\"focusout\", onFocusOut);\n        doc.removeEventListener(\"pointerdown\", onOutside);\n        media.removeEventListener(\"change\", onModeChange);\n        const focusWasToggle = doc.activeElement === toggle;\n        toggle.remove();\n        ledger.destroy();\n        releaseStyles();\n        registry.instances.delete(header);\n        if (returnFocus && focusWasToggle) firstAvailableLink()?.focus();\n      }\n    };\n    registry.instances.set(header, api);\n    return api;\n  }\n\n  // navigation-authorized-dropdowns.js\n  var AUTHORIZED_DROPDOWNS = Object.freeze({\n    \"\\uC81C\\uD488\\uC18C\\uAC1C\": Object.freeze([{ label: \"LASERABLE\", href: \"/laserable\" }]),\n    \"\\uCEE4\\uBBA4\\uB2C8\\uD2F0\": Object.freeze([{ label: \"ARTIRCLES\", href: \"/\\uCEE4\\uBBA4\\uB2C8\\uD2F0Articles\" }, { label: \"NEWS\", href: \"/\\uCEE4\\uBBA4\\uB2C8\\uD2F0News\" }])\n  });\n  var AUTHORIZED_DROPDOWN_CSS = `\n[data-nav30-owned-dropdown]{box-sizing:border-box!important;list-style:none!important;margin:0!important;padding:0!important;border:0!important;flex:none!important;font:inherit!important;color:#09090b!important;z-index:1000}\n[data-nav30-owned-dropdown][data-compact=\"false\"]{position:fixed!important;display:block!important;width:256px!important;max-width:calc(100vw - 32px)!important;height:auto!important;padding-top:16px!important}\n[data-nav30-owned-dropdown][data-compact=\"false\"][data-open=\"false\"]{pointer-events:none!important}\n[data-nav30-owned-dropdown][data-compact=\"true\"]{position:relative!important;display:block!important;width:100%!important;min-height:0!important;height:auto!important}\n[data-nav30-child-panel]{box-sizing:border-box!important;width:100%!important;margin:0!important;padding:0!important;border:1px solid #e4e4e7!important;border-radius:8px!important;background:#fff!important;color:#09090b!important;box-shadow:none!important;overflow:hidden!important}\n[data-nav30-child-panel][hidden]{display:none!important}\n[data-nav30-owned-dropdown][data-compact=\"true\"][data-open=\"true\"]{padding:0 0 8px!important}\n[data-nav30-owned-dropdown] [data-nav30-child-link]{box-sizing:border-box!important;display:flex!important;align-items:center!important;width:100%!important;min-height:56px!important;margin:0!important;padding:16px!important;border:0!important;border-radius:0!important;background:transparent!important;color:#09090b!important;font:inherit!important;font-size:16px!important;line-height:24px!important;font-weight:400!important;text-decoration:none!important;white-space:normal!important;transition:background-color 150ms cubic-bezier(.4,0,.2,1)!important}\n[data-nav30-owned-dropdown] [data-nav30-child-link]:hover{background:rgba(9,9,11,.1)!important}\n[data-nav30-owned-dropdown] [data-nav30-child-link]:focus-visible,[data-nav30-child-toggle]:focus-visible{outline:2px solid #2055df!important;outline-offset:-3px!important}\n[data-nav30-child-toggle]{box-sizing:border-box!important;position:absolute!important;right:0!important;top:-48px!important;display:none!important;align-items:center!important;justify-content:center!important;width:44px!important;height:48px!important;min-height:48px!important;margin:0!important;padding:12px!important;border:0!important;border-radius:4px!important;background:transparent!important;color:#09090b!important;cursor:pointer!important}\n[data-nav30-owned-dropdown][data-compact=\"true\"]>[data-nav30-child-toggle]{display:flex!important}\n[data-nav30-owned-dropdown][data-compact=\"false\"]>[data-nav30-child-toggle]{display:flex!important;width:28px!important;min-height:0!important;padding:6px!important;pointer-events:auto!important}\n[data-nav30-child-toggle]:hover{background:rgba(9,9,11,.1)!important}\n[data-nav30-child-toggle] svg{width:16px!important;height:16px!important;pointer-events:none;transition:transform 150ms cubic-bezier(.4,0,.2,1)}\n[data-nav30-child-toggle][aria-expanded=\"true\"] svg{transform:rotate(180deg)}\n[data-nav30-dropdown-parent][data-nav30-dropdown-compact=\"true\"]{padding-right:56px!important}\n[data-nav30-kind=\"home\"] .products-panel a{text-transform:uppercase!important}\n@media(prefers-reduced-motion:reduce){[data-nav30-owned-dropdown] *{transition:none!important}}\n`;\n  function originalNavigationText(node) {\n    let text = \"\";\n    for (const child of node.childNodes) {\n      if (child.nodeType === 3) text += child.nodeValue;\n      else if (child.nodeType === 1 && !child.hasAttribute(\"data-nav30-owned-dropdown\")) text += originalNavigationText(child);\n    }\n    return text;\n  }\n  var serial = 0;\n  function createAuthorizedDropdowns({ header, items, breakpoint = 1023, skipLabels = [], beforeOpen = () => {\n  }, onStateChange = () => {\n  } }) {\n    const doc = header.ownerDocument, win = doc.defaultView;\n    const media = win.matchMedia(`(max-width:${breakpoint}px)`);\n    const entries = [], cleanups = [];\n    let disposed = false;\n    const positions = doc.createElement(\"style\");\n    positions.setAttribute(\"data-nav30-child-position\", \"true\");\n    doc.head.append(positions);\n    const restore = [];\n    function ownAttr(node, name, value) {\n      const old = node.getAttribute(name);\n      node.setAttribute(name, value);\n      restore.push(() => {\n        if (old === null) node.removeAttribute(name);\n        else node.setAttribute(name, old);\n      });\n    }\n    const keep = (node, event, handler, options) => {\n      node.addEventListener(event, handler, options);\n      cleanups.push(() => node.removeEventListener(event, handler, options));\n    };\n    function position() {\n      const rules = [];\n      for (const entry of entries) {\n        const rect = entry.parent.getBoundingClientRect();\n        const left = Math.max(16, Math.min(rect.left, doc.documentElement.clientWidth - 272));\n        rules.push(`[data-nav30-owned-dropdown=\"${entry.id}\"][data-compact=\"false\"]{left:${Math.round(left)}px!important;top:${Math.round(rect.bottom)}px!important}`);\n        rules.push(`[data-nav30-owned-dropdown=\"${entry.id}\"]>[data-nav30-child-toggle]{top:-${Math.round(rect.height || 48)}px!important;height:${Math.round(rect.height || 48)}px!important}`);\n        rules.push(`[data-nav30-owned-dropdown=\"${entry.id}\"][data-compact=\"false\"]>[data-nav30-child-toggle]{left:${Math.round(rect.right - left - 30)}px!important;right:auto!important}`);\n      }\n      const css = rules.join(\"\\n\");\n      if (positions.textContent !== css) positions.textContent = css;\n    }\n    function setOpen(entry, value) {\n      if (disposed) return;\n      if (value) {\n        beforeOpen();\n        for (const other of entries) if (other !== entry) setOpen(other, false);\n      }\n      if (entry.timer) {\n        win.clearTimeout(entry.timer);\n        entry.timer = null;\n      }\n      entry.open = value;\n      entry.row.setAttribute(\"data-open\", String(value));\n      entry.panel.hidden = !value;\n      entry.toggle.setAttribute(\"aria-expanded\", String(value));\n      entry.toggle.setAttribute(\"aria-label\", `${entry.label} \\uD558\\uC704 \\uBA54\\uB274 ${value ? \"\\uB2EB\\uAE30\" : \"\\uC5F4\\uAE30\"}`);\n      onStateChange(entries.some((item) => item.open));\n      position();\n    }\n    function delayedClose(entry) {\n      if (entry.timer) win.clearTimeout(entry.timer);\n      entry.timer = win.setTimeout(() => {\n        if (!entry.row.contains(doc.activeElement) && !entry.parent.contains(doc.activeElement)) setOpen(entry, false);\n      }, 130);\n    }\n    for (const parent of items) {\n      const label = originalNavigationText(parent).trim();\n      const links = AUTHORIZED_DROPDOWNS[label];\n      if (!links || skipLabels.includes(label)) continue;\n      const host = parent.parentElement;\n      const after = host?.matches(\"li\") ? host : parent;\n      if (!after.parentElement) continue;\n      const id = `nav30-child-${++serial}`;\n      const row = doc.createElement(after.parentElement.matches(\"ul,ol\") ? \"li\" : \"div\");\n      row.setAttribute(\"data-nav30-owned-dropdown\", id);\n      row.setAttribute(\"data-compact\", String(media.matches));\n      row.setAttribute(\"data-open\", \"false\");\n      const panel = doc.createElement(\"div\");\n      panel.setAttribute(\"data-nav30-child-panel\", \"true\");\n      panel.id = id;\n      panel.hidden = true;\n      const toggle = doc.createElement(\"button\");\n      toggle.type = \"button\";\n      toggle.setAttribute(\"data-nav30-child-toggle\", \"true\");\n      toggle.setAttribute(\"aria-controls\", id);\n      toggle.setAttribute(\"aria-expanded\", \"false\");\n      toggle.setAttribute(\"aria-label\", `${label} \\uD558\\uC704 \\uBA54\\uB274 \\uC5F4\\uAE30`);\n      const svg = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n      svg.setAttribute(\"viewBox\", \"0 0 24 24\");\n      svg.setAttribute(\"fill\", \"none\");\n      svg.setAttribute(\"aria-hidden\", \"true\");\n      const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n      path.setAttribute(\"d\", \"m6 9 6 6 6-6\");\n      path.setAttribute(\"stroke\", \"currentColor\");\n      path.setAttribute(\"stroke-width\", \"1.5\");\n      path.setAttribute(\"stroke-linecap\", \"round\");\n      path.setAttribute(\"stroke-linejoin\", \"round\");\n      svg.append(path);\n      toggle.append(svg);\n      for (const link of links) {\n        const anchor = doc.createElement(\"a\");\n        anchor.setAttribute(\"data-nav30-child-link\", \"true\");\n        anchor.href = link.href;\n        anchor.textContent = link.label;\n        keep(anchor, \"click\", (event) => event.stopPropagation());\n        panel.append(anchor);\n        keep(anchor, \"keydown\", (event) => {\n          if (event.key === \"Enter\") event.stopPropagation();\n        });\n      }\n      row.append(toggle, panel);\n      after.after(row);\n      ownAttr(parent, \"data-nav30-dropdown-parent\", id);\n      ownAttr(parent, \"data-nav30-dropdown-compact\", String(media.matches));\n      const entry = { id, label, parent, row, panel, toggle, links, open: false, timer: null, focusTimer: null, suppressFocusOpen: false };\n      entries.push(entry);\n      keep(toggle, \"click\", (event) => {\n        event.preventDefault();\n        event.stopPropagation();\n        setOpen(entry, !entry.open);\n      });\n      keep(toggle, \"keydown\", (event) => {\n        if ([\"Enter\", \" \", \"Spacebar\"].includes(event.key)) event.stopPropagation();\n      });\n      keep(parent, \"pointerenter\", (event) => {\n        if (!media.matches && event.pointerType === \"mouse\") setOpen(entry, true);\n      });\n      keep(parent, \"pointerleave\", () => {\n        if (!media.matches) delayedClose(entry);\n      });\n      keep(row, \"pointerenter\", (event) => {\n        if (entry.timer) {\n          win.clearTimeout(entry.timer);\n          entry.timer = null;\n        }\n        if (!media.matches && event.pointerType === \"mouse\") setOpen(entry, true);\n      });\n      keep(row, \"pointerleave\", () => {\n        if (!media.matches) delayedClose(entry);\n      });\n      keep(parent, \"focusin\", () => {\n        if (!media.matches && !entry.suppressFocusOpen) setOpen(entry, true);\n      });\n      const focusout = (event) => {\n        if (entry.focusTimer) win.clearTimeout(entry.focusTimer);\n        if (event.relatedTarget && (row.contains(event.relatedTarget) || parent.contains(event.relatedTarget))) return;\n        entry.focusTimer = win.setTimeout(() => {\n          if (!disposed && !row.contains(doc.activeElement) && !parent.contains(doc.activeElement)) setOpen(entry, false);\n        }, 0);\n      };\n      keep(parent, \"focusout\", focusout);\n      keep(row, \"focusout\", focusout);\n    }\n    const closeAll = () => entries.forEach((entry) => setOpen(entry, false));\n    const mode = () => {\n      for (const entry of entries) {\n        entry.row.setAttribute(\"data-compact\", String(media.matches));\n        entry.parent.setAttribute(\"data-nav30-dropdown-compact\", String(media.matches));\n      }\n      closeAll();\n      position();\n    };\n    keep(media, \"change\", mode);\n    keep(win, \"resize\", position);\n    keep(win, \"scroll\", position, true);\n    keep(doc, \"pointerdown\", (event) => {\n      if (!entries.some((entry) => entry.parent.contains(event.target) || entry.row.contains(event.target))) closeAll();\n    });\n    keep(header, \"keydown\", (event) => {\n      if (event.key !== \"Escape\") return;\n      const entry = entries.find((item) => item.open);\n      if (!entry) return;\n      event.preventDefault();\n      if (entry.row.contains(event.target)) event.stopPropagation();\n      setOpen(entry, false);\n      win.queueMicrotask(() => {\n        if (disposed) return;\n        entry.suppressFocusOpen = true;\n        try {\n          (media.matches || entry.parent.tabIndex < 0 ? entry.toggle : entry.parent).focus();\n        } finally {\n          entry.suppressFocusOpen = false;\n        }\n      });\n    }, true);\n    const sizes = new win.ResizeObserver(position);\n    entries.forEach((entry) => sizes.observe(entry.parent));\n    sizes.observe(header);\n    position();\n    return {\n      hasOpen() {\n        return entries.some((entry) => entry.open);\n      },\n      close: closeAll,\n      inspect() {\n        return entries.map(({ label, links, open }) => ({ parent: label, links, open }));\n      },\n      destroy() {\n        if (disposed) return;\n        closeAll();\n        disposed = true;\n        cleanups.forEach((fn) => fn());\n        sizes.disconnect();\n        entries.forEach((entry) => {\n          if (entry.timer) win.clearTimeout(entry.timer);\n          if (entry.focusTimer) win.clearTimeout(entry.focusTimer);\n          entry.row.remove();\n        });\n        restore.reverse().forEach((fn) => fn());\n        positions.remove();\n      }\n    };\n  }\n\n  // navigation-global-entry.js\n  var KEY = \"__brainableNavigationReference30\";\n  var STYLE = `\n${NAV_ENHANCER_CSS}\n${AUTHORIZED_DROPDOWN_CSS}\n[data-nav30-kind=\"native\"]{position:relative!important;display:flex!important;flex-direction:row!important;align-items:center!important;justify-content:space-between!important;width:100%!important;min-width:0!important;max-width:none!important;height:80px!important;min-height:80px!important;padding:0 5%!important;gap:24px!important;background:#fff!important;color:#09090b!important;overflow:visible!important;box-sizing:border-box!important}\n[data-nav30-native-shell]{width:100%!important;min-width:0!important;max-width:none!important;height:auto!important;min-height:0!important;padding:0!important;margin:0!important;gap:0!important;align-self:stretch!important;box-sizing:border-box!important;overflow:visible!important}\n[data-nav30-menu-wrap]{display:contents!important}\n[data-nav30-kind=\"native\"] [data-brnav-menu]{display:flex!important;align-items:center!important;gap:0!important;width:auto!important;min-width:0!important;max-width:none!important;padding:0!important;overflow:visible!important}\n[data-nav30-kind=\"native\"] [data-brnav-top-link]{position:relative!important;display:flex!important;flex-direction:row!important;align-items:center!important;justify-content:center!important;width:auto!important;height:auto!important;min-width:0!important;min-height:48px!important;max-width:none!important;max-height:none!important;flex:none!important;color:inherit!important;text-decoration:none!important}\n[data-nav30-kind=\"native\"] [data-brnav-top-link] p,[data-nav30-kind=\"native\"] [data-brnav-top-link] span{font:inherit!important;line-height:inherit!important;color:inherit!important;text-align:inherit!important;letter-spacing:normal!important;text-decoration:none!important;white-space:nowrap!important;margin:0!important;width:auto!important;min-width:0!important;max-width:none!important}\n[data-nav30-logo]{display:flex!important;align-items:center!important;flex:none!important;min-width:0!important;min-height:0!important;max-height:none!important;overflow:hidden!important}\n[data-brnav-header][data-nav30-kind=\"native\"][data-brnav-compact=\"true\"]{height:64px!important;min-height:64px!important;padding:0 20px!important}\n[data-nav30-native-shell][data-nav30-compact=\"true\"]{height:64px!important;min-height:64px!important;max-height:64px!important}\n[data-brnav-header][data-nav30-kind=\"native\"][data-brnav-compact=\"true\"] [data-brnav-menu]{position:absolute!important;inset:64px 0 auto 0!important;width:100%!important;max-width:100%!important;max-height:calc(100dvh - 64px)!important;padding:4px 20px 16px!important;overflow:auto!important;align-items:stretch!important;flex-direction:column!important;background:#fff!important}\n[data-brnav-header][data-nav30-kind=\"native\"][data-brnav-compact=\"true\"] [data-brnav-menu][hidden]{display:none!important}\n[data-brnav-header][data-nav30-kind=\"native\"][data-brnav-compact=\"true\"] [data-brnav-top-link]{width:100%!important;justify-content:flex-start!important;padding:12px 16px!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"false\"] .products-panel{top:100%!important;width:256px!important;padding:16px 0 0!important;background:transparent!important;color:#09090b!important;border:0!important;box-shadow:none!important;transition:visibility 150ms cubic-bezier(.4,0,.2,1)!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"false\"] .products-panel>div{background:#fff!important;border:1px solid #e4e4e7!important;border-radius:8px!important;overflow:hidden!important;padding:0!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"false\"] .products-panel a{display:block!important;width:100%!important;margin:0!important;padding:16px!important;font-size:16px!important;line-height:24px!important;font-weight:400!important;color:#09090b!important;min-height:56px!important}\n[data-brnav-header][data-nav30-kind=\"home\"] .products-panel a:hover{background:rgba(9,9,11,.1)!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-nav30-authorized-open=\"true\"] .products-panel{visibility:hidden!important;pointer-events:none!important}\n[data-nav30-products-toggle]{display:none!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"true\"] [data-nav30-products-item]{display:grid!important;grid-template-columns:minmax(0,1fr) 44px!important;align-items:center!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"true\"] [data-nav30-products-toggle]{display:flex!important;align-items:center!important;justify-content:center!important;width:44px!important;min-height:48px!important;padding:12px!important;border:0!important;border-radius:4px!important;background:transparent!important;color:inherit!important;cursor:pointer}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"true\"] [data-nav30-products-toggle]:hover{background:rgba(9,9,11,.1)!important}\n[data-nav30-products-toggle] svg{display:block;width:16px;height:16px;transition:transform 150ms cubic-bezier(.4,0,.2,1)}\n[data-nav30-products-toggle][aria-expanded=\"true\"] svg{transform:rotate(180deg)}\n[data-brnav-header][data-nav30-kind=\"home\"] .nav-links{gap:0!important}\n[data-brnav-header][data-nav30-kind=\"home\"] .nav-links [data-brnav-top-link]{font-weight:400!important}\n[data-brnav-header][data-nav30-kind=\"home\"] [data-brnav-top-link]:hover,[data-brnav-header][data-nav30-kind=\"home\"] [data-brnav-top-link][aria-expanded=\"true\"]{color:inherit!important}\n[data-brnav-header][data-nav30-kind=\"home\"] .nav-inner{gap:24px!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"true\"]{display:grid!important;grid-template-columns:minmax(0,1fr) auto!important;grid-template-rows:64px max-content max-content!important;align-items:stretch!important;padding:0!important;background:#fff!important;color:#09090b!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"true\"] .nav-inner{display:contents!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"true\"] .brand{grid-column:1!important;grid-row:1!important;width:158px!important;min-height:44px!important;align-self:center!important;margin:0 20px!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"true\"] .brand img{filter:none!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"true\"] [data-brnav-toggle]{position:static!important;grid-column:2!important;grid-row:1!important;align-self:center!important;margin:0 10px 0 0!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"true\"] [data-brnav-menu]{position:static!important;inset:auto!important;grid-row:2!important;grid-column:1/-1!important;max-height:calc(100dvh - 64px)!important;padding:4px 20px 16px!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"true\"][data-nav30-products=\"true\"] [data-brnav-menu]{max-height:calc(100dvh - 64px - 76px)!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"true\"] .nav-links{display:flex!important;flex-direction:column!important;align-items:stretch!important;width:100%!important;gap:0!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"true\"] .nav-item:not([data-nav30-products-item]){display:block!important;width:100%!important;min-height:48px!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"true\"] .nav-links [data-brnav-top-link]{display:flex!important;width:100%!important;justify-content:flex-start!important;padding:12px 16px!important;color:inherit!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"true\"] .products-panel{position:static!important;inset:auto!important;grid-column:1/-1!important;grid-row:3!important;width:100%!important;max-height:76px!important;overflow:auto!important;padding:0 20px 12px!important;border:0!important;transition:none!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"true\"] .products-panel>div{overflow:visible!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"true\"] .products-panel a{display:block!important;width:100%!important;margin:0!important;padding:12px 16px!important;border-radius:4px!important;font-size:16px!important;line-height:24px!important;font-weight:400!important;color:#52525b!important}\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"true\"] .products-panel[data-open=\"false\"],\n[data-brnav-header][data-nav30-kind=\"home\"][data-brnav-compact=\"true\"][data-brnav-open=\"false\"] .products-panel{display:none!important}\n[data-nav30-kind=\"renewal\"] .b-desk-nav{gap:0!important}\n[data-nav30-kind=\"renewal\"] .b-desk-nav a,[data-nav30-kind=\"renewal\"] .b-mob-nav a{display:block!important;font-size:16px!important;line-height:24px!important;font-weight:400!important;padding:12px 32px!important;border-radius:4px!important;transition:background-color 150ms cubic-bezier(.4,0,.2,1)!important}\n[data-nav30-kind=\"renewal\"] .b-desk-nav a:hover,[data-nav30-kind=\"renewal\"] .b-mob-nav a:hover{background:rgba(9,9,11,.1)!important}\n[data-nav30-kind=\"renewal\"] .b-menu-btn{font-size:16px!important;line-height:24px!important;font-weight:400!important;border:0!important;border-radius:4px!important;min-width:52px!important;height:44px!important;box-shadow:none!important}\n@media(max-width:959px){[data-nav30-kind=\"renewal\"] .b-header-inner{height:64px!important}[data-nav30-kind=\"renewal\"] .b-mob-nav{max-height:calc(100dvh - 64px)!important;overflow:auto!important;overscroll-behavior:contain;box-shadow:none!important;border:0!important;padding:4px 20px 16px!important}[data-nav30-kind=\"renewal\"] .b-mob-nav a{padding:12px 16px!important;border:0!important}}\n@media(prefers-reduced-motion:reduce){[data-nav30-kind],[data-nav30-kind] *,[data-brnav-header][data-nav30-kind][data-brnav-compact] [data-brnav-top-link],[data-brnav-header][data-nav30-kind][data-brnav-compact] .products-panel,[data-nav30-kind] [data-nav30-owned-dropdown] [data-nav30-child-link],[data-nav30-kind=\"renewal\"] .b-desk-nav a,[data-nav30-kind=\"renewal\"] .b-mob-nav a{transition:none!important;scroll-behavior:auto!important}}\n`;\n  function ownedAttributes() {\n    const entries = /* @__PURE__ */ new Map();\n    return {\n      set(node, name, value) {\n        if (!node) return;\n        if (!entries.has(node)) entries.set(node, /* @__PURE__ */ new Map());\n        const attrs = entries.get(node);\n        if (!attrs.has(name)) attrs.set(name, { old: node.getAttribute(name), last: value });\n        attrs.get(name).last = value;\n        if (node.getAttribute(name) !== value) node.setAttribute(name, value);\n      },\n      destroy() {\n        entries.forEach((attrs, node) => attrs.forEach(({ old, last }, name) => {\n          if (node.getAttribute(name) !== last) return;\n          if (old === null) node.removeAttribute(name);\n          else node.setAttribute(name, old);\n        }));\n        entries.clear();\n      }\n    };\n  }\n  function itemSignature(node) {\n    return { label: originalNavigationText(node), href: node.getAttribute(\"href\"), role: node.getAttribute(\"role\"), tabindex: node.getAttribute(\"tabindex\"), tag: node.tagName };\n  }\n  function captureBaseline(header, items) {\n    const nodes = [.../* @__PURE__ */ new Set([...items, ...header.querySelectorAll('a,[role=\"link\"],button')])];\n    return nodes.filter((node) => !node.hasAttribute(\"data-brnav-toggle\") && !node.closest(\"[data-nav30-owned-dropdown]\")).map((node) => ({\n      node,\n      signature: itemSignature(node),\n      nativeToggle: node.matches(\".b-menu-btn\"),\n      onclick: node.onclick,\n      classValue: node.getAttribute(\"class\"),\n      styleValue: node.getAttribute(\"style\")\n    }));\n  }\n  function compareBaseline(baseline) {\n    return baseline.map((entry) => ({\n      ...entry.signature,\n      connected: entry.node.isConnected,\n      exactLabel: entry.nativeToggle ? [\"\\uBA54\\uB274\", \"\\uB2EB\\uAE30\"].includes(entry.node.textContent) : originalNavigationText(entry.node) === entry.signature.label,\n      exactHref: entry.node.getAttribute(\"href\") === entry.signature.href,\n      exactRole: entry.node.getAttribute(\"role\") === entry.signature.role,\n      exactTabindex: entry.node.getAttribute(\"tabindex\") === entry.signature.tabindex,\n      sameOnclick: entry.node.onclick === entry.onclick,\n      exactClass: entry.node.getAttribute(\"class\") === entry.classValue,\n      exactInlineStyle: entry.node.getAttribute(\"style\") === entry.styleValue\n    }));\n  }\n  function nativeBindings(doc) {\n    const result = [];\n    for (const menu of doc.querySelectorAll(\"nav\")) {\n      if (menu.closest(\".brainable-home-nav-v2,.b-header,footer\")) continue;\n      const parent = menu.parentElement;\n      if (!parent) continue;\n      const wrapped = [\"A\", \"DIV\"].includes(parent.tagName) && parent.children.length === 1 && parent.firstElementChild === menu;\n      const wrap = wrapped ? parent : null;\n      const header = wrapped ? parent.parentElement : parent;\n      if (!header || ![\"DIV\", \"HEADER\"].includes(header.tagName)) continue;\n      const children = [...header.children].filter((node) => !node.hasAttribute(\"data-brnav-toggle\"));\n      const menuBranch = wrap || menu;\n      if (children.length !== 2 || !children.includes(menuBranch)) continue;\n      const logo = children.find((node) => node !== menuBranch);\n      if (!logo || !logo.querySelector('img[alt=\"Logomark\"]')) continue;\n      if (!header.getClientRects().length || header.closest('[hidden],[inert],[aria-hidden=\"true\"]') || [\"hidden\", \"collapse\"].includes(doc.defaultView.getComputedStyle(header).visibility)) continue;\n      const items = [...menu.children].filter((node) => !node.hasAttribute(\"data-nav30-owned-dropdown\"));\n      if (items.length < 2 || items.length > 12 || !items.every((node) => [\"DIV\", \"A\"].includes(node.tagName) && node.classList.contains(\"textContents\") && [...node.children].some((child) => child.tagName === \"P\"))) continue;\n      const shells = [];\n      let previous = header;\n      for (let level = 0; level < 4; level++) {\n        const shell = previous.parentElement;\n        if (!shell || ![\"DIV\", \"HEADER\", \"A\"].includes(shell.tagName) || shell.getAttribute(\"role\") === \"main\" || shell.children.length !== 1 || shell.firstElementChild !== previous) break;\n        shells.push(shell);\n        previous = shell;\n      }\n      result.push({ kind: \"native\", header, menu, items, wrap, logo, shells });\n    }\n    return result;\n  }\n  function codeBindings(doc) {\n    const result = [];\n    for (const header of doc.querySelectorAll(\".brainable-home-nav-v2\")) {\n      const inner = header.querySelector(\":scope > .nav-inner\");\n      const menu = inner?.querySelector(\":scope > nav\");\n      const list = menu?.querySelector(\":scope > .nav-links\");\n      if (!inner || !menu || !list || !inner.querySelector(\":scope > a.brand img\")) continue;\n      const items = [...list.children].filter((node) => !node.hasAttribute(\"data-nav30-owned-dropdown\")).flatMap((item) => [...item.children].filter((node) => node.matches(\"a,button\") && !node.hasAttribute(\"data-nav30-products-toggle\")));\n      const products = header.querySelector(\":scope > .products-panel\");\n      if (items.length && products) result.push({ kind: \"home\", header, menu, items, products });\n    }\n    for (const header of doc.querySelectorAll(\".b-header\")) {\n      const inner = header.querySelector(\":scope > .b-header-inner\");\n      const menu = inner?.querySelector(\":scope > .b-desk-nav\");\n      const toggle = inner?.querySelector(':scope > button.b-menu-btn[aria-controls=\"b-mob-menu\"]');\n      if (!inner || !menu || !toggle || !inner.querySelector(\":scope > a.b-brand img\")) continue;\n      const items = [...menu.children].filter((node) => !node.hasAttribute(\"data-nav30-owned-dropdown\"));\n      const mobileMenu = header.querySelector(\":scope > .b-mob-nav\");\n      const mobileItems = mobileMenu ? [...mobileMenu.children].filter((node) => node.tagName === \"A\" && !node.hasAttribute(\"data-nav30-child-link\")) : [];\n      if (items.length && items.every((item) => item.tagName === \"A\")) result.push({ kind: \"renewal\", header, menu, items, toggle, mobileMenu, mobileItems });\n    }\n    return result;\n  }\n  function sameBinding(a, b) {\n    const aShells = a.shells || [], bShells = b.shells || [];\n    const aMobile = a.mobileItems || [], bMobile = b.mobileItems || [];\n    return a.kind === b.kind && a.menu === b.menu && a.products === b.products && a.toggle === b.toggle && a.wrap === b.wrap && a.logo === b.logo && aShells.length === bShells.length && aShells.every((node, index) => node === bShells[index]) && a.mobileMenu === b.mobileMenu && aMobile.length === bMobile.length && aMobile.every((node, index) => node === bMobile[index]) && a.items.length === b.items.length && a.items.every((node, index) => node === b.items[index]);\n  }\n  function installNavigationReference(doc = document) {\n    const win = doc.defaultView;\n    win[KEY]?.destroy();\n    const style = doc.createElement(\"style\");\n    style.setAttribute(\"data-nav30-adapter-style\", \"v1\");\n    style.textContent = STYLE;\n    doc.head.append(style);\n    const active = /* @__PURE__ */ new Map();\n    const errors = [];\n    const history = [];\n    let disposed = false;\n    let scheduled = false;\n    let route = win.location.href;\n    function mount(binding) {\n      const { kind, header, menu, items } = binding;\n      const originalLogoRect = kind === \"native\" ? binding.logo.getBoundingClientRect() : null;\n      const originalLogoSize = originalLogoRect ? { width: originalLogoRect.width, height: originalLogoRect.height } : null;\n      const attrs = ownedAttributes();\n      const baseline = captureBaseline(header, items);\n      attrs.set(header, \"data-nav30-kind\", kind);\n      let enhancer = null;\n      let logoSizing = null;\n      let dropdowns = null;\n      let mountDisposed = false;\n      const cleaners = [];\n      if (kind === \"native\") {\n        attrs.set(binding.wrap, \"data-nav30-menu-wrap\", \"true\");\n        attrs.set(binding.logo, \"data-nav30-logo\", \"true\");\n        binding.shells.forEach((shell) => attrs.set(shell, \"data-nav30-native-shell\", \"true\"));\n      }\n      if (kind !== \"renewal\") enhancer = createEnhancer(header, menu, items, { toggleHost: header, toggleBefore: null, breakpoint: 1023, shouldHandleEscape: () => !dropdowns?.hasOpen() && (kind !== \"home\" || binding.products.getAttribute(\"data-open\") !== \"true\") });\n      if (kind === \"native\") {\n        if (originalLogoSize && originalLogoSize.width > 0 && originalLogoSize.height > 0) {\n          const ratio = originalLogoSize.width / originalLogoSize.height;\n          const fit = (maxWidth, maxHeight) => {\n            const scale = Math.min(maxWidth / originalLogoSize.width, maxHeight / originalLogoSize.height);\n            return { width: Math.round(originalLogoSize.width * scale * 1e3) / 1e3, height: Math.round(originalLogoSize.height * scale * 1e3) / 1e3 };\n          };\n          logoSizing = { original: originalLogoSize, ratio, desktop: fit(190, 48), mobile: fit(158, 44) };\n          const id = enhancer.inspect().id;\n          attrs.set(binding.logo, \"data-nav30-logo\", id);\n          const logoStyle = doc.createElement(\"style\");\n          logoStyle.setAttribute(\"data-nav30-logo-fit\", id);\n          logoStyle.textContent = [[\"false\", logoSizing.desktop], [\"true\", logoSizing.mobile]].map(([compact, size]) => `[data-brnav-header=\"${id}\"][data-nav30-kind=\"native\"][data-brnav-compact=\"${compact}\"] [data-nav30-logo=\"${id}\"]{width:${size.width}px!important;height:${size.height}px!important}`).join(\"\\n\");\n          doc.head.append(logoStyle);\n          cleaners.push(() => logoStyle.remove());\n        }\n        const media = win.matchMedia(\"(max-width:1023px)\");\n        const update = () => {\n          binding.shells.forEach((shell) => attrs.set(shell, \"data-nav30-compact\", String(media.matches)));\n        };\n        update();\n        media.addEventListener(\"change\", update);\n        cleaners.push(() => media.removeEventListener(\"change\", update));\n      }\n      if (kind === \"home\") {\n        const positioning = doc.createElement(\"style\");\n        positioning.setAttribute(\"data-nav30-dropdown-position\", \"true\");\n        doc.head.append(positioning);\n        const productTrigger = items.find((node) => node.getAttribute(\"aria-controls\") === binding.products.id);\n        let disclosure = null;\n        if (productTrigger) {\n          disclosure = doc.createElement(\"button\");\n          disclosure.type = \"button\";\n          disclosure.setAttribute(\"data-nav30-products-toggle\", \"true\");\n          disclosure.setAttribute(\"aria-controls\", binding.products.id);\n          const icon = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n          icon.setAttribute(\"viewBox\", \"0 0 24 24\");\n          icon.setAttribute(\"fill\", \"none\");\n          icon.setAttribute(\"aria-hidden\", \"true\");\n          const arrow = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n          arrow.setAttribute(\"d\", \"m6 9 6 6 6-6\");\n          arrow.setAttribute(\"stroke\", \"currentColor\");\n          arrow.setAttribute(\"stroke-width\", \"1.5\");\n          arrow.setAttribute(\"stroke-linecap\", \"round\");\n          arrow.setAttribute(\"stroke-linejoin\", \"round\");\n          icon.append(arrow);\n          disclosure.append(icon);\n          attrs.set(productTrigger.parentElement, \"data-nav30-products-item\", \"true\");\n          productTrigger.parentElement.append(disclosure);\n          const activate = (event) => {\n            event.preventDefault();\n            event.stopPropagation();\n            if (binding.products.getAttribute(\"data-open\") === \"true\") {\n              productTrigger.focus();\n              productTrigger.dispatchEvent(new win.KeyboardEvent(\"keydown\", { key: \"Escape\", bubbles: true, cancelable: true }));\n            } else productTrigger.click();\n          };\n          disclosure.addEventListener(\"click\", activate);\n          cleaners.push(() => {\n            disclosure.removeEventListener(\"click\", activate);\n            disclosure.remove();\n          });\n        }\n        const position = () => {\n          if (!productTrigger) return;\n          const box = productTrigger.getBoundingClientRect();\n          const outer = header.getBoundingClientRect();\n          const left = Math.max(16, Math.min(box.left - outer.left, outer.width - 272));\n          const rule = `[data-brnav-header=\"${enhancer.inspect().id}\"][data-brnav-compact=\"false\"] .products-panel{left:${Math.round(left)}px!important}`;\n          if (positioning.textContent !== rule) positioning.textContent = rule;\n        };\n        const update = () => {\n          const expanded = binding.products.getAttribute(\"data-open\") === \"true\";\n          attrs.set(header, \"data-nav30-products\", String(expanded));\n          if (disclosure) {\n            disclosure.setAttribute(\"aria-expanded\", String(expanded));\n            disclosure.setAttribute(\"aria-label\", expanded ? \"\\uC81C\\uD488\\uC18C\\uAC1C \\uD558\\uC704 \\uBA54\\uB274 \\uB2EB\\uAE30\" : \"\\uC81C\\uD488\\uC18C\\uAC1C \\uD558\\uC704 \\uBA54\\uB274 \\uC5F4\\uAE30\");\n          }\n          position();\n        };\n        update();\n        const observer2 = new win.MutationObserver(update);\n        observer2.observe(binding.products, { attributes: true, attributeFilter: [\"data-open\"] });\n        const size = new win.ResizeObserver(position);\n        size.observe(header);\n        size.observe(menu);\n        win.addEventListener(\"resize\", position);\n        cleaners.push(() => {\n          observer2.disconnect();\n          size.disconnect();\n          win.removeEventListener(\"resize\", position);\n          positioning.remove();\n        });\n      }\n      let closeExisting = () => {\n      };\n      if (kind === \"renewal\") {\n        const toggle = binding.toggle;\n        closeExisting = () => {\n          if (toggle.getAttribute(\"aria-expanded\") === \"true\") toggle.click();\n        };\n        const outside = (event) => {\n          if (!header.contains(event.target)) closeExisting();\n        };\n        let focusTask = 0;\n        const focusout = (event) => {\n          win.clearTimeout(focusTask);\n          if (event.relatedTarget && header.contains(event.relatedTarget)) return;\n          focusTask = win.setTimeout(() => {\n            if (!disposed && !mountDisposed && !header.contains(doc.activeElement)) closeExisting();\n          }, 0);\n        };\n        const media = win.matchMedia(\"(max-width:959px)\");\n        const mode = () => {\n          if (!media.matches) closeExisting();\n        };\n        doc.addEventListener(\"pointerdown\", outside);\n        header.addEventListener(\"focusout\", focusout);\n        media.addEventListener(\"change\", mode);\n        cleaners.push(() => {\n          win.clearTimeout(focusTask);\n          doc.removeEventListener(\"pointerdown\", outside);\n          header.removeEventListener(\"focusout\", focusout);\n          media.removeEventListener(\"change\", mode);\n        });\n      }\n      dropdowns = createAuthorizedDropdowns({ header, items: [...items, ...binding.mobileItems || []], breakpoint: kind === \"renewal\" ? 959 : 1023, skipLabels: kind === \"home\" ? [\"\\uC81C\\uD488\\uC18C\\uAC1C\"] : [], onStateChange: (open) => attrs.set(header, \"data-nav30-authorized-open\", String(open)) });\n      const menuState = new win.MutationObserver(() => {\n        const open = enhancer ? header.getAttribute(\"data-brnav-open\") === \"true\" : binding.toggle.getAttribute(\"aria-expanded\") === \"true\";\n        const compact = win.matchMedia(`(max-width:${kind === \"renewal\" ? 959 : 1023}px)`).matches;\n        if (compact && !open) dropdowns.close();\n      });\n      menuState.observe(kind === \"renewal\" ? binding.toggle : header, { attributes: true, attributeFilter: [kind === \"renewal\" ? \"aria-expanded\" : \"data-brnav-open\"] });\n      cleaners.push(() => {\n        menuState.disconnect();\n        dropdowns.destroy();\n      });\n      return { binding, baseline, enhancer, logoSizing, dropdowns, close() {\n        dropdowns.close();\n        if (enhancer) enhancer.close();\n        else closeExisting();\n      }, destroy() {\n        mountDisposed = true;\n        cleaners.forEach((fn) => fn());\n        enhancer?.destroy();\n        attrs.destroy();\n      } };\n    }\n    function reconcile() {\n      scheduled = false;\n      if (disposed) return;\n      const bindings = [...nativeBindings(doc), ...codeBindings(doc)];\n      const desired = new Map(bindings.map((binding) => [binding.header, binding]));\n      for (const [header, entry] of active) {\n        const next = desired.get(header);\n        if (!next || !sameBinding(entry.binding, next)) {\n          history.push({ kind: entry.binding.kind, route, items: compareBaseline(entry.baseline) });\n          entry.destroy();\n          active.delete(header);\n        }\n      }\n      for (const [header, binding] of desired) {\n        if (active.has(header)) continue;\n        try {\n          active.set(header, mount(binding));\n        } catch (error) {\n          errors.push(String(error));\n        }\n      }\n      if (win.location.href !== route) {\n        route = win.location.href;\n        active.forEach((entry) => entry.close());\n      }\n    }\n    function schedule() {\n      if (disposed || scheduled) return;\n      scheduled = true;\n      win.queueMicrotask(reconcile);\n    }\n    const observer = new win.MutationObserver(schedule);\n    observer.observe(doc.body, { childList: true, subtree: true });\n    win.addEventListener(\"popstate\", schedule);\n    win.addEventListener(\"hashchange\", schedule);\n    win.addEventListener(\"resize\", schedule);\n    const routeTimer = win.setInterval(() => {\n      if (win.location.href !== route) schedule();\n    }, 350);\n    const api = {\n      inspect() {\n        return { route: win.location.href, viewport: { width: win.innerWidth, height: win.innerHeight }, horizontalOverflow: doc.documentElement.scrollWidth > win.innerWidth, errors: errors.slice(), headers: [...active.values()].map((entry) => ({ kind: entry.binding.kind, menuTag: entry.binding.menu.tagName, logoSizing: entry.logoSizing, itemCount: entry.binding.items.length, menuHeight: entry.binding.menu.getBoundingClientRect().height, menuMaxHeight: win.getComputedStyle(entry.binding.menu).maxHeight, rect: { width: entry.binding.header.getBoundingClientRect().width, height: entry.binding.header.getBoundingClientRect().height }, compact: entry.enhancer?.inspect().compact ?? win.matchMedia(\"(max-width:959px)\").matches, open: entry.enhancer?.inspect().open ?? entry.binding.toggle?.getAttribute(\"aria-expanded\") === \"true\", items: compareBaseline(entry.baseline), authorizedDropdowns: entry.dropdowns.inspect() })), history: history.slice() };\n      },\n      refresh: reconcile,\n      destroy() {\n        if (disposed) return;\n        disposed = true;\n        observer.disconnect();\n        win.clearInterval(routeTimer);\n        win.removeEventListener(\"popstate\", schedule);\n        win.removeEventListener(\"hashchange\", schedule);\n        win.removeEventListener(\"resize\", schedule);\n        active.forEach((entry) => entry.destroy());\n        active.clear();\n        style.remove();\n        if (win[KEY] === api) delete win[KEY];\n      }\n    };\n    win[KEY] = api;\n    win.brainableNavigationQA = () => win[KEY]?.inspect();\n    reconcile();\n    return api;\n  }\n  if (typeof document !== \"undefined\") {\n    if (document.readyState === \"loading\") document.addEventListener(\"DOMContentLoaded\", () => installNavigationReference(document), { once: true });\n    else installNavigationReference(document);\n  }\n  return __toCommonJS(navigation_global_entry_exports);\n})();\n\n;\n/* BRAINABLE production global: cms-pagination */\n(() => {\n  // cms-pagination-core.js\n  var PAGE_SIZE = 5;\n  function pageNumbers(current, total, compact = false) {\n    if (total < 1) return [];\n    const windowSize = compact ? 3 : 5;\n    if (total <= windowSize + 2) return Array.from({ length: total }, (_, i) => i + 1);\n    const start = Math.max(2, Math.min(current - Math.floor(windowSize / 2), total - windowSize));\n    const end = Math.min(total - 1, start + windowSize - 1);\n    const numbers = [1];\n    if (start > 2) numbers.push(\"start-gap\");\n    for (let page = start; page <= end; page++) numbers.push(page);\n    if (end < total - 1) numbers.push(\"end-gap\");\n    numbers.push(total);\n    return numbers;\n  }\n  var CSS = `\n[data-cms30-hidden=\"true\"] { display:none !important; }\n[data-cms30-list] { scroll-margin-top:96px; touch-action:pan-y; }\n[data-cms30-pagination] { box-sizing:border-box; width:100%; display:flex; flex-direction:row; flex-wrap:wrap; align-items:center; justify-content:center; gap:8px; margin:36px 0 0; padding:4px 0; color:#27272a; font-family:inherit; isolation:isolate; }\n[data-cms30-pagination] button { box-sizing:border-box; appearance:none; position:relative; flex:0 0 36px; width:36px; height:36px; min-width:0; min-height:0; display:inline-flex; align-items:center; justify-content:center; margin:0; padding:0; border:0; border-radius:6px; background:transparent; color:inherit; font-family:inherit; font-size:16px; font-weight:600; line-height:1; cursor:pointer; transition:background-color 150ms ease,color 150ms ease; }\n[data-cms30-pagination] button:hover:not(:disabled) { background:#f4f4f5; }\n[data-cms30-pagination] button:focus-visible { outline:2px solid #2563eb; outline-offset:3px; }\n[data-cms30-pagination] button[aria-current=\"page\"] { color:#111; font-weight:750; text-decoration:underline; text-underline-offset:7px; text-decoration-thickness:2px; }\n[data-cms30-pagination] button[data-cms30-arrow] { flex-basis:32px; width:32px; height:32px; border:1px solid #e4e4e7; border-radius:999px; background:#fff; }\n[data-cms30-pagination] button[data-cms30-arrow]:disabled { opacity:.35; cursor:default; }\n[data-cms30-pagination] svg { width:16px; height:16px; stroke:currentColor; fill:none; stroke-width:1.75; stroke-linecap:round; stroke-linejoin:round; pointer-events:none; }\n[data-cms30-pagination] [data-cms30-gap] { flex:0 0 18px; width:18px; font-family:inherit; font-size:14px; font-weight:500; line-height:1; text-align:center; }\n[data-cms30-sr] { position:absolute !important; width:1px !important; height:1px !important; padding:0 !important; margin:-1px !important; overflow:hidden !important; clip:rect(0,0,0,0) !important; white-space:nowrap !important; border:0 !important; }\n@media(max-width:600px) { [data-cms30-pagination] { gap:2px; margin-top:28px; } [data-cms30-pagination] button[data-cms30-arrow=\"first\"], [data-cms30-pagination] button[data-cms30-arrow=\"last\"] { display:none; } [data-cms30-pagination] button { flex-basis:32px; width:32px; height:36px; font-size:15px; } }\n@media(prefers-reduced-motion:reduce) { [data-cms30-pagination] button { transition:none; } }\n`;\n  var arrowPaths = {\n    prev: \"M19 12H5 M12 19l-7-7 7-7\",\n    next: \"M5 12h14 M12 5l7 7-7 7\",\n    first: \"M5 5v14 M19 5l-7 7 7 7 M12 5l-7 7 7 7\",\n    last: \"M19 5v14 M5 5l7 7-7 7 M12 5l7 7-7 7\"\n  };\n  function arrowButton(document2, kind, label) {\n    const button = document2.createElement(\"button\");\n    button.type = \"button\";\n    button.dataset.cms30Arrow = kind;\n    button.setAttribute(\"aria-label\", label);\n    const svg = document2.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n    svg.setAttribute(\"viewBox\", \"0 0 24 24\");\n    svg.setAttribute(\"aria-hidden\", \"true\");\n    const path = document2.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n    path.setAttribute(\"d\", arrowPaths[kind]);\n    svg.append(path);\n    button.append(svg);\n    return button;\n  }\n  function preserveAttrs(node, names) {\n    const saved = Object.fromEntries(names.map((name) => [name, node.getAttribute(name)]));\n    return () => Object.entries(saved).forEach(([name, value]) => value === null ? node.removeAttribute(name) : node.setAttribute(name, value));\n  }\n  function enhanceCMSPagination({ list, cards, label, host = list.parentElement, insertBefore = list.nextSibling, initialPage = 1, pageSize = PAGE_SIZE, itemLabel = \"\\uAC8C\\uC2DC\\uAE00\" }) {\n    if (!list?.ownerDocument || !cards?.length || cards.some((card) => card.parentElement !== list)) throw new Error(\"CMS pagination requires verified direct card children\");\n    if (!Number.isInteger(pageSize) || pageSize < 1) throw new Error(\"Invalid page size\");\n    const document2 = list.ownerDocument, window2 = document2.defaultView;\n    if (list.hasAttribute(\"data-cms30-list\")) throw new Error(\"CMS list already enhanced\");\n    if (!document2.getElementById(\"cms30-pagination-styles\")) {\n      const style = document2.createElement(\"style\");\n      style.id = \"cms30-pagination-styles\";\n      style.textContent = CSS;\n      document2.head.append(style);\n    }\n    const restores = [preserveAttrs(list, [\"data-cms30-list\"])];\n    const originals = cards.map((card) => ({ node: card, text: card.textContent, html: card.innerHTML, href: card.getAttribute(\"href\"), onclick: card.onclick, ariaHidden: card.getAttribute(\"aria-hidden\"), inert: card.getAttribute(\"inert\"), links: [...card.querySelectorAll('a,[role=\"link\"],button,[role=\"button\"]')].map((link) => ({ node: link, href: link.getAttribute(\"href\"), onclick: link.onclick, text: link.textContent })) }));\n    cards.forEach((card) => restores.push(preserveAttrs(card, [\"data-cms30-hidden\", \"aria-hidden\", \"inert\"])));\n    list.dataset.cms30List = label;\n    const nav = document2.createElement(\"nav\");\n    nav.dataset.cms30Pagination = label;\n    nav.setAttribute(\"aria-label\", `${label} \\uD398\\uC774\\uC9C0`);\n    const status = document2.createElement(\"p\");\n    status.dataset.cms30Sr = \"\";\n    status.setAttribute(\"role\", \"status\");\n    status.setAttribute(\"aria-live\", \"polite\");\n    status.setAttribute(\"aria-atomic\", \"true\");\n    nav.append(status);\n    host.insertBefore(nav, insertBefore);\n    const media = window2.matchMedia(\"(max-width:600px)\"), reduced = window2.matchMedia(\"(prefers-reduced-motion:reduce)\");\n    let page = Math.max(1, Math.min(Math.ceil(cards.length / pageSize), initialPage)), destroyed = false, animations = [];\n    const total = Math.ceil(cards.length / pageSize);\n    let pointer = null, suppressClickUntil = 0;\n    function addPage(number) {\n      const button = document2.createElement(\"button\");\n      button.type = \"button\";\n      button.dataset.cms30Page = String(number);\n      button.textContent = String(number);\n      button.setAttribute(\"aria-label\", `${number}\\uD398\\uC774\\uC9C0`);\n      if (number === page) button.setAttribute(\"aria-current\", \"page\");\n      button.addEventListener(\"click\", () => setPage(number, { focus: \"page\" }));\n      nav.insertBefore(button, status);\n    }\n    function renderControls(focusKey) {\n      [...nav.children].filter((node) => node !== status).forEach((node) => node.remove());\n      const addArrow = (kind, label2, target, disabled) => {\n        const button = arrowButton(document2, kind, label2);\n        button.disabled = disabled;\n        button.addEventListener(\"click\", () => setPage(target, { focus: kind }));\n        nav.insertBefore(button, status);\n      };\n      addArrow(\"first\", \"\\uCCAB \\uD398\\uC774\\uC9C0\", 1, page === 1);\n      addArrow(\"prev\", \"\\uC774\\uC804 \\uD398\\uC774\\uC9C0\", page - 1, page === 1);\n      pageNumbers(page, total, media.matches).forEach((number) => {\n        if (typeof number === \"number\") addPage(number);\n        else {\n          const gap = document2.createElement(\"span\");\n          gap.dataset.cms30Gap = \"\";\n          gap.textContent = \"\\u2026\";\n          gap.setAttribute(\"aria-hidden\", \"true\");\n          nav.insertBefore(gap, status);\n        }\n      });\n      addArrow(\"next\", \"\\uB2E4\\uC74C \\uD398\\uC774\\uC9C0\", page + 1, page === total);\n      addArrow(\"last\", \"\\uB9C8\\uC9C0\\uB9C9 \\uD398\\uC774\\uC9C0\", total, page === total);\n      status.textContent = `${label}, ${total}\\uD398\\uC774\\uC9C0 \\uC911 ${page}\\uD398\\uC774\\uC9C0. \\uC804\\uCCB4 ${cards.length}\\uAC1C \\uC911 ${(page - 1) * pageSize + 1}\\u2013${Math.min(page * pageSize, cards.length)}\\uBC88\\uC9F8 ${itemLabel}`;\n      if (focusKey) {\n        const target = focusKey === \"page\" ? nav.querySelector('[aria-current=\"page\"]') : nav.querySelector(`[data-cms30-arrow=\"${focusKey}\"]`);\n        (target && !target.disabled ? target : nav.querySelector('[aria-current=\"page\"]'))?.focus({ preventScroll: true });\n      }\n    }\n    function setPage(next, { focus, scroll = true } = {}) {\n      if (destroyed) return;\n      next = Math.max(1, Math.min(total, next));\n      const direction = next > page ? 1 : -1, changed = next !== page;\n      page = next;\n      animations.forEach((animation) => animation.cancel());\n      animations = [];\n      cards.forEach((card, index) => {\n        const visible = index >= (page - 1) * pageSize && index < page * pageSize;\n        card.dataset.cms30Hidden = String(!visible);\n        if (!visible) {\n          card.setAttribute(\"aria-hidden\", \"true\");\n          card.setAttribute(\"inert\", \"\");\n        } else {\n          const saved = originals[index];\n          saved.ariaHidden === null ? card.removeAttribute(\"aria-hidden\") : card.setAttribute(\"aria-hidden\", saved.ariaHidden);\n          saved.inert === null ? card.removeAttribute(\"inert\") : card.setAttribute(\"inert\", saved.inert);\n          if (changed && !reduced.matches && typeof card.animate === \"function\") animations.push(card.animate([{ opacity: 0.35, transform: `translateX(${direction * 14}px)` }, { opacity: 1, transform: \"translateX(0)\" }], { duration: 180, easing: \"cubic-bezier(.2,.65,.3,1)\" }));\n        }\n      });\n      renderControls(focus);\n      if (changed && scroll) {\n        const rect = list.getBoundingClientRect();\n        if (rect.top < 72 || rect.top > window2.innerHeight * 0.7) list.scrollIntoView({ block: \"start\", behavior: reduced.matches ? \"auto\" : \"smooth\" });\n      }\n    }\n    function keydown(event) {\n      if (event.altKey || event.ctrlKey || event.metaKey) return;\n      const target = event.key === \"ArrowLeft\" ? page - 1 : event.key === \"ArrowRight\" ? page + 1 : event.key === \"Home\" ? 1 : event.key === \"End\" ? total : null;\n      if (target === null) return;\n      event.preventDefault();\n      event.stopPropagation();\n      setPage(target, { focus: \"page\" });\n    }\n    function pointerdown(event) {\n      if (event.pointerType !== \"touch\" || !event.isPrimary || !cards.some((card) => card.contains(event.target))) return;\n      pointer = { x: event.clientX, y: event.clientY, id: event.pointerId };\n    }\n    function pointerup(event) {\n      if (!pointer || event.pointerId !== pointer.id) return;\n      const dx = event.clientX - pointer.x, dy = event.clientY - pointer.y;\n      pointer = null;\n      if (Math.abs(dx) > 64 && Math.abs(dx) > Math.abs(dy) * 1.5) {\n        suppressClickUntil = Date.now() + 600;\n        setPage(page + (dx < 0 ? 1 : -1));\n      }\n    }\n    const mediaChange = () => renderControls();\n    const pointercancel = () => {\n      pointer = null;\n    };\n    const preventSwipeClick = (event) => {\n      if (Date.now() < suppressClickUntil) {\n        event.preventDefault();\n        event.stopPropagation();\n        suppressClickUntil = 0;\n      }\n    };\n    nav.addEventListener(\"keydown\", keydown);\n    nav.addEventListener(\"click\", (event) => {\n      if (event.target.closest(\"button\")) {\n        event.preventDefault();\n        event.stopPropagation();\n      }\n    });\n    list.addEventListener(\"pointerdown\", pointerdown, { passive: true });\n    list.addEventListener(\"pointerup\", pointerup, { passive: true });\n    list.addEventListener(\"pointercancel\", pointercancel, { passive: true });\n    list.addEventListener(\"click\", preventSwipeClick, true);\n    media.addEventListener(\"change\", mediaChange);\n    setPage(page, { scroll: false });\n    return {\n      list,\n      cards,\n      nav,\n      setPage,\n      inspect() {\n        return { label, count: cards.length, pageSize, page, total, visible: cards.map((node, index) => node.dataset.cms30Hidden === \"false\" ? index + 1 : null).filter(Boolean), sameNodes: originals.every((original, index) => original.node === cards[index] && original.node.parentElement === list), contentPreserved: originals.every((original) => original.text === original.node.textContent && original.href === original.node.getAttribute(\"href\") && original.onclick === original.node.onclick && original.links.every((link) => link.href === link.node.getAttribute(\"href\") && link.onclick === link.node.onclick && link.text === link.node.textContent)) };\n      },\n      destroy() {\n        if (destroyed) return;\n        destroyed = true;\n        animations.forEach((animation) => animation.cancel());\n        media.removeEventListener(\"change\", mediaChange);\n        nav.remove();\n        list.removeEventListener(\"pointerdown\", pointerdown);\n        list.removeEventListener(\"pointerup\", pointerup);\n        list.removeEventListener(\"pointercancel\", pointercancel);\n        list.removeEventListener(\"click\", preventSwipeClick, true);\n        restores.reverse().forEach((restore) => restore());\n      }\n    };\n  }\n\n  // centers-desktop-canonical.json\n  var centers_desktop_canonical_default = [\n    {\n      ctaRole: \"link\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uBE0C\\uB808\\uC778\\uC5D0\\uC774\\uBE14\",\n        \"\\uB300\\uCE58 \\uD2B8\\uB808\\uC774\\uB2DD \\uC13C\\uD130\"\n      ],\n      lines: [\n        \"\\uC11C\\uC6B8\\uD2B9\\uBCC4\\uC2DC \\uAC15\\uB0A8\\uAD6C \\uC120\\uB989\\uB85C 317,\",\n        \"K7 \\uBE4C\\uB529, 3\\uCE35 301\\uD638\",\n        \"02-581-7856\",\n        \"010-8123-7857\"\n      ],\n      mapSrc: \"https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3165.429340295972!2d127.04699359130376!3d37.497790800006364!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x357ca473c674ddcd%3A0x5b9d4f51809a7825!2z7Iqk7Lm07J2065GQ64eM7IS47JuA7YG066as64uJ!5e0!3m2!1sko!2skr!4v1762850474352!5m2!1sko!2skr\",\n      directionHref: \"https://www.google.com/maps/place/%EC%8A%A4%EC%B9%B4%EC%9D%B4%EB%91%90%EB%87%8C%EC%84%B8%EC%9B%80%ED%81%B4%EB%A6%AC%EB%8B%89/data=!3m1!4b1!4m4!3m3!1s0x357ca473c674ddcd:0x5b9d4f51809a7825!16s%2Fg%2F11c1wwfmsh!20s8Q99F3X2%2B4P9P4WF?entry=ttu&g_ep=EgoyMDI2MDkyMy4wIKXMDSoASAFQAw%3D%3D\"\n    },\n    {\n      ctaRole: \"button\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uC8FC\\uC2DD\\uD68C\\uC0AC\",\n        \"\\uBE0C\\uB808\\uC778\\uC5D0\\uC774\\uBE14\"\n      ],\n      lines: [\n        \"\\uC11C\\uC6B8\\uD2B9\\uBCC4\\uC2DC \\uC11C\\uCD08\\uAD6C \\uB9C8\\uBC29\\uB85C 6\\uAE38 28, 5\\uCE35 502\\uD638\"\n      ],\n      mapSrc: \"https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d50660.95589854867!2d126.99656882205589!3d37.47701639764579!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x357ca13466bcacd1%3A0xb70bc7ff482af6ab!2z7ISc7Jq47Yq567OE7IucIOyEnOy0iOq1rA!5e0!3m2!1sko!2skr!4v1762850262140!5m2!1sko!2skr\"\n    },\n    {\n      ctaRole: \"button\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uC11C\\uC6B8\\uC131\\uBAA8\\uCE58\\uC720\\uC13C\\uD130\"\n      ],\n      lines: [\n        \"\\uC11C\\uC6B8\\uC2DC \\uAC15\\uB0A8\\uAD6C \\uD559\\uB3D9\\uB85C 206, 4\\uCE35(\\uB17C\\uD604\\uB3D9)\",\n        \"0507-1416-8314\",\n        \"\\u200B\"\n      ],\n      mapSrc: \"https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3164.748520835366!2d127.0314899!3d37.513849!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x357ca3f1997247e9%3A0x37a987f264ef7bb7!2z7ISc7Jq47Yq567OE7IucIOqwleuCqOq1rCDtlZnrj5nroZwgMjA2IDTsuLU!5e0!3m2!1sko!2skr!4v1766456157527!5m2!1sko!2skr\"\n    },\n    {\n      ctaRole: \"button\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uB9C8\\uACE1\\uD2BC\\uD2BC\\uC18C\\uC544\\uCCAD\\uC18C\\uB144\\uACFC\\uBC1C\\uB2EC\\uC13C\\uD130\"\n      ],\n      lines: [\n        \"\\uC11C\\uC6B8\\uD2B9\\uBCC4\\uC2DC \\uB9C8\\uACE1\\uC911\\uC559\\uB85C\\xA0105-7\\xA0\\uCF00\\uC774\\uC2A4\\uD018\\uC5B4\\uD0C0\\uC6CC\\xA03, 2\\uCE35\",\n        \"02-6989-5300\",\n        \"\\u200B\"\n      ],\n      mapSrc: \"https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d1581.3727172275198!2d126.82441933904094!3d37.561060993010024!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x357c9d0007487a5b%3A0x81e1052f3c62fe1e!2z7LyA7J207Iqk7YCY7Ja0IOuniOqzoQ!5e0!3m2!1sen!2skr!4v1764652743432!5m2!1sen!2skr\"\n    },\n    {\n      ctaRole: \"button\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uD2F0\\uC5D8\\uC528\\uBD84\\uB2F9\"\n      ],\n      lines: [\n        \"\\uACBD\\uAE30 \\uC131\\uB0A8\\uC2DC \\uBD84\\uB2F9\\uAD6C \\uC815\\uC790\\uC77C\\uB85C\\xA0197 2\\uCE35\\xA0202~203\\uD638\",\n        \"031-607-1001\"\n      ],\n      mapSrc: \"https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3170.921171208699!2d127.10295367681158!3d37.36804207209068!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x357b58360dbb8ba1%3A0x9bfc1ebaff64bae6!2s%EC%B8%B5%20202~203%ED%98%B8%2C%20197%20Jeongjail-ro%2C%20Bundang-gu%2C%20Seongnam-si%2C%20Gyeonggi-do!5e0!3m2!1sen!2skr!4v1764653043432!5m2!1sen!2skr\"\n    },\n    {\n      ctaRole: \"button\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uBA85\\uBB38\\uC5B8\\uC5B4\\uC2EC\\uB9AC\\uC13C\\uD130\"\n      ],\n      lines: [\n        \"\\uACBD\\uAE30\\uB3C4 \\uC548\\uC0B0\\uC2DC \\uB2E8\\uC6D0\\uAD6C \\uACE0\\uC794\\uB85C\\xA076\\xA0\\uACE0\\uC794\\uB3D9,\\xA0\\uC601\\uD48D\\uBE4C\\uB529\\xA0303-2, 303-3\",\n        \"031-411-7771\"\n      ],\n      mapSrc: \"https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3173.0009334359515!2d126.83228507680974!3d37.31880557210383!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x357b6f04b8ebfa83%3A0xe6ef29fb183bbc59!2z66qF66y47Ja47Ja07Ius66as7IS87YSw!5e0!3m2!1sen!2skr!4v1764653196700!5m2!1sen!2skr\"\n    },\n    {\n      ctaRole: \"button\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uC5C4\\uB9C8\\uC640\\uC544\\uAE30\\uB4E4\"\n      ],\n      lines: [\n        \"\\uC778\\uCC9C \\uC11C\\uAD6C \\uAC00\\uC815\\uB85C\\xA0388\\uC138\\uB780\\uBE4C\\uB529\\xA02\\uCE35\",\n        \"032-572-1771\"\n      ],\n      mapSrc: \"https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3164.514454384262!2d126.6707034768165!3d37.51936847205096!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x357b7ef559038def%3A0x7d139aa3ba5d37c0!2z7JeE66eI7JmA7JWE6riw65Ok7IaM7JWE6rO87J2Y7JuQ!5e0!3m2!1sen!2skr!4v1764653343469!5m2!1sen!2skr\"\n    },\n    {\n      ctaRole: \"button\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uCC38\\uC18C\\uC544\\uCCAD\\uC18C\\uB144\\uACFC\\uC758\\uC6D0\"\n      ],\n      lines: [\n        \"\\uACBD\\uAE30\\uB3C4 \\uC218\\uC6D0\\uC2DC \\uAD8C\\uC120\\uAD6C \\uAE08\\uD638\\uB85C 230\",\n        \"031-293-3392\"\n      ],\n      mapSrc: \"https://www.google.com/maps/embed?pb=!1m14!1m8!1m3!1d404351.30333337764!2d127.141232!3d37.649332!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x357cb79c0f7aba0d%3A0xc32b2672e7fe30de!2z7LC47IaM7JWE7LKt7IaM64WE6rO87J2Y7JuQ!5e0!3m2!1sko!2skr!4v1766455850296!5m2!1sko!2skr\"\n    },\n    {\n      ctaRole: \"button\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uB2E5\\uD130\\uC774\\uBBA8\\uCF00\\uC5B4\"\n      ],\n      lines: [\n        \"\\uCDA9\\uBD81 \\uCCAD\\uC8FC\\uC2DC \\uCCAD\\uC6D0\\uAD6C \\uC0AC\\uB738\\uB85C\\xA037\\xA0\\uC774\\uACBD\\uC740\\uC18C\\uC544\\uCCAD\\uC18C\\uB144\\uACFC\",\n        \"0507-1456-5962\"\n      ],\n      mapSrc: \"https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3200.372565170318!2d127.4792876767878!3d36.66554227228593!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x356527f6e6b88037%3A0xcf32f35fe026d842!2z7J206rK97J2A7IaM7JWE6rO87J2Y7JuQ!5e0!3m2!1sen!2skr!4v1764653981818!5m2!1sen!2skr\"\n    },\n    {\n      ctaRole: \"button\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uC11C\\uC6B8\\uD328\\uBC00\\uB9AC\\uBCD1\\uC6D0\\uBC1C\\uB2EC\\uC13C\\uD130\"\n      ],\n      lines: [\n        \"\\uACBD\\uB0A8 \\uCC3D\\uC6D0\\uC2DC \\uC131\\uC0B0\\uAD6C \\uB9C8\\uB514\\uBBF8\\uC11C\\uB85C\\xA054\\xA0\\uC11C\\uC6B8\\uD328\\uBC00\\uB9AC\\uBCD1\\uC6D0\\xA04\\uCE35\",\n        \"0507-1418-8511\"\n      ],\n      mapSrc: \"https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3259.4221797425307!2d128.67835877674048!3d35.220859172739466!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x3568cd315a1db2af%3A0xe336c9915a3e6d13!2z7ISc7Jq47Yyo67CA66as67OR7JuQ!5e0!3m2!1sen!2skr!4v1764654236104!5m2!1sen!2skr\"\n    },\n    {\n      ctaRole: \"button\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uC2A4\\uCE74\\uC774\\uB450\\uB1CC\\uC138\\uC6C0\\uC13C\\uD130\\uAD11\\uC8FC\\uC810\"\n      ],\n      lines: [\n        \"\\uAD11\\uC8FC\\uAD11\\uC5ED\\uC2DC \\uBD81\\uAD6C \\uC124\\uC8FD\\uB85C\\xA0346 B\\uB3D9\\xA01\\uCE35\",\n        \"062-262-7585\"\n      ],\n      mapSrc: \"https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d1630.3245678708527!2d126.89729514973274!3d35.1902965756219!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x35718db21cbf106d%3A0x978bfa16c42ccf16!2s346%20Seoljuk-ro%2C%20Buk-gu%2C%20Kwangju!5e0!3m2!1sen!2skr!4v1764653574475!5m2!1sen!2skr\"\n    },\n    {\n      ctaRole: \"button\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uC775\\uC0B0\\uC628\\uB204\\uB9AC\\uC544\\uB3D9\\uBCD1\\uC6D0\\uBC1C\\uB2EC\\uC13C\\uD130\"\n      ],\n      lines: [\n        \"\\uC804\\uBD81\\uD2B9\\uBCC4\\uC790\\uCE58\\uB3C4 \\uC775\\uC0B0\\uC2DC \\uB3D9\\uC11C\\uB85C\\xA0491\",\n        \"063-839-5500\"\n      ],\n      mapSrc: \"https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3229.7695427809936!2d126.98461507676433!3d35.95260717250088!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x3570157cd086d157%3A0xb93182dcb1aec5a1!2s491%20Dongseo-ro%2C%20Iksan%2C%20Jeonbuk%20State!5e0!3m2!1sen!2skr!4v1764654149334!5m2!1sen!2skr\"\n    },\n    {\n      ctaRole: \"button\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uC778\\uC120\\uC18C\\uC544\\uACFC\\uC758\\uC6D0\"\n      ],\n      lines: [\n        \"\\uC11C\\uC6B8 \\uC131\\uBD81\\uAD6C \\uB3CC\\uACF6\\uC774\\uB85C 47 \\uC778\\uC120\\uC18C\\uC544\\uACFC\",\n        \"02-962-2955\"\n      ],\n      mapSrc: \"https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3160.7445740199037!2d127.05685767670883!3d37.60817007202797!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x357cbb98f83d9a07%3A0x6c8c3f911255bf02!2z7J247ISg7IaM7JWE6rO87J2Y7JuQ!5e0!3m2!1sko!2skr!4v1772682636451!5m2!1sko!2skr\"\n    },\n    {\n      ctaRole: \"button\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uACF0\\uB3CC\\uC774\\uC5B8\\uC5B4\\uC5F0\\uAD6C\\uC18C\"\n      ],\n      lines: [\n        \"\\uC11C\\uC6B8 \\uC11C\\uCD08\\uAD6C \\uBC29\\uBC30\\uB85C 36\\uAE38 3, 6\\uCE35\",\n        \"\",\n        \"\"\n      ],\n      mapSrc: \"https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3165.604477176718!2d126.98767227670474!3d37.49365897205771!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x357ca1a394928ee3%3A0x3354f2669522edc3!2z7ISc7Jq47Yq567OE7IucIOyEnOy0iOq1rCDrsKnrsLDroZwzNuq4uCAzIDbsuLU!5e0!3m2!1sko!2skr!4v1772682828774!5m2!1sko!2skr\"\n    },\n    {\n      ctaRole: \"button\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uC774\\uC9C4\\uC219\\uC18C\\uC544\\uACFC\"\n      ],\n      lines: [\n        \"\\uC778\\uCC9C \\uBBF8\\uCD94\\uD640\\uAD6C \\uC778\\uD558\\uB85C 273\",\n        \"032-866-5645\"\n      ],\n      mapSrc: \"https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3167.5262967989665!2d126.67595497670314!3d37.448293872069485!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x357b7973f6809f9b%3A0x285e117ae07cb436!2z7J207KeE7IiZ7IaM7JWE6rO87J2Y7JuQ!5e0!3m2!1sko!2skr!4v1772682930074!5m2!1sko!2skr\"\n    },\n    {\n      ctaRole: \"button\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uBD09\\uD0A4\\uBCD1\\uC6D0\\uBD80\\uC124 \\uAD7F\\uB2E5\\uD130\\uC2A4\\uD589\\uB3D9\\uBC1C\\uB2EC\\uC99D\\uC9C4\\uC13C\\uD130\"\n      ],\n      lines: [\n        \"\\uB300\\uC804 \\uC720\\uC131\\uAD6C \\uACC4\\uB8E1\\uB85C 120, 9\\uCE35\",\n        \"1522-6705\"\n      ],\n      mapSrc: \"https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3213.335645433878!2d127.34114327666485!3d36.35264807237813!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x35654b83bc695ceb%3A0x59c5bf4594ab8497!2z64yA7KCE6rSR7Jet7IucIOycoOyEseq1rCDqs4Tro6HroZwgMTIwIDnsuLU!5e0!3m2!1sko!2skr!4v1772683106804!5m2!1sko!2skr\"\n    },\n    {\n      ctaRole: \"button\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uC774\\uC815\\uD76C\\uC18C\\uC544\\uCCAD\\uC18C\\uB144\\uACFC\\uC758\\uC6D0\"\n      ],\n      lines: [\n        \"\\uC11C\\uC6B8 \\uAD00\\uC545\\uAD6C \\uC740\\uCC9C\\uB85C 38-1 2\\uCE35\",\n        \"02-877-3571\"\n      ],\n      mapSrc: \"https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d12663.72306054562!2d126.92923137512804!3d37.4859601529508!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x357c9f90e11843bd%3A0xde4cf77b3feb089d!2z7J207KCV7Z2s7IaM7JWE7LKt7IaM64WE6rO87J2Y7JuQ!5e0!3m2!1sko!2skr!4v1772683251263!5m2!1sko!2skr\"\n    },\n    {\n      ctaRole: \"button\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uC6B0\\uB9AC\\uC18C\\uC544\\uCCAD\\uC18C\\uB144\\uBC1C\\uB2EC\\uC13C\\uD130\"\n      ],\n      lines: [\n        \"\\uACBD\\uAE30 \\uAE40\\uD3EC\\uC2DC \\uAE40\\uD3EC\\uD55C\\uAC154\\uB85C 507 \\uACC4\\uB9BC M\\uC2A4\\uD018\\uC5B4 7\\uCE35 706\\uD638\",\n        \"031-996-2342\"\n      ],\n      mapSrc: \"https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d12636.525135387928!2d126.61724537521926!3d37.64611745228681!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x357c80b4c45fbe19%3A0x42eeeec15cb051ec!2z6rOE66a8TeyKpO2AmOyWtA!5e0!3m2!1sko!2skr!4v1772683417512!5m2!1sko!2skr\"\n    },\n    {\n      ctaRole: \"button\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uC13C\\uD2B8\\uB7F4\\uC2E0\\uACBD\\uACFC\\uC758\\uC6D0\"\n      ],\n      lines: [\n        \"\\uACBD\\uAE30 \\uC548\\uC0B0\\uC2DC \\uB2E8\\uC6D0\\uAD6C \\uACE0\\uC794\\uB85C 76 \\uC601\\uD48D\\uBE4C\\uB529 202-1\\uD638\",\n        \"0507-1477-6112\"\n      ],\n      mapSrc: \"https://naver.me/xfbrMRSu\"\n    },\n    {\n      ctaRole: \"button\",\n      ctaText: \"\\uC624\\uC2DC\\uB294\\uAE38 \\u2192\",\n      headingParts: [\n        \"\\uC3D8\\uC6B8\\uC18C\\uC544\\uCCAD\\uC18C\\uB144\\uACFC\"\n      ],\n      lines: [\n        \"\\uC11C\\uC6B8 \\uAC15\\uB0A8\\uAD6C \\uC120\\uB989\\uB85C129\\uAE38 22 \\uACE0\\uC601\\uBE4C\\uB529 2\\uCE35\",\n        \"0507-1330-5834\",\n        \"\\u200B\"\n      ],\n      mapSrc: \"https://naver.me/G9r521HZ\"\n    }\n  ];\n\n  // centers-responsive.js\n  var CSS2 = `\n[data-center30-superseded=\"true\"] { display:none !important; }\n[data-center30-list] { box-sizing:border-box; display:flex; flex-direction:column; gap:56px; width:100%; padding:48px 24px 12px; color:#18181b; font-family:inherit; }\n[data-center30-card] { box-sizing:border-box; width:100%; display:flex; flex-direction:column; gap:24px; }\n[data-center30-card] h3 { margin:0; font-family:inherit; font-size:clamp(26px,4.8vw,36px); line-height:1.3; font-weight:650; letter-spacing:-.035em; word-break:keep-all; overflow-wrap:anywhere; }\n[data-center30-card] [data-center30-details] { margin-top:20px; }\n[data-center30-card] p { margin:0; font-family:inherit; font-size:16px; line-height:1.7; font-weight:400; word-break:keep-all; overflow-wrap:anywhere; }\n[data-center30-card] [data-center30-cta] { display:inline-flex; align-items:center; margin-top:24px; padding:0; border:0; border-radius:0; background:transparent; color:inherit; text-decoration:none; font-family:inherit; font-size:16px; line-height:1.5; font-weight:500; cursor:pointer; }\n[data-center30-card] [data-center30-cta]:focus-visible { outline:2px solid #2563eb; outline-offset:5px; }\n[data-center30-card] iframe { box-sizing:border-box; display:block; width:100%; height:clamp(220px,60vw,360px); border:0; background:#f4f4f5; }\n@media(max-width:359px) { [data-center30-list] { padding-left:18px; padding-right:18px; } }\n`;\n  function reconcileNarrowCenters({ root, nativeCards }) {\n    const document2 = root.ownerDocument;\n    if (!nativeCards.length || !nativeCards.every((card) => card.parentElement === root)) throw new Error(\"Unverified center structure\");\n    const styles = document2.createElement(\"style\");\n    styles.dataset.center30Styles = \"\";\n    styles.textContent = CSS2;\n    document2.head.append(styles);\n    const previous = nativeCards.map((node) => ({ node, hidden: node.getAttribute(\"data-center30-superseded\"), aria: node.getAttribute(\"aria-hidden\"), inert: node.getAttribute(\"inert\") }));\n    const list = document2.createElement(\"div\");\n    list.dataset.center30List = \"desktop-canonical-20\";\n    const cards = centers_desktop_canonical_default.map((entry, index) => {\n      const card = document2.createElement(\"section\");\n      card.dataset.center30Card = String(index + 1);\n      const copy = document2.createElement(\"div\");\n      const heading = document2.createElement(\"h3\");\n      entry.headingParts.forEach((part, i) => {\n        if (i) heading.append(document2.createElement(\"br\"));\n        heading.append(document2.createTextNode(part));\n      });\n      copy.append(heading);\n      const details = document2.createElement(\"div\");\n      details.dataset.center30Details = \"\";\n      entry.lines.forEach((text) => {\n        const p = document2.createElement(\"p\");\n        p.textContent = text;\n        details.append(p);\n      });\n      copy.append(details);\n      const cta = document2.createElement(entry.directionHref ? \"a\" : \"button\");\n      cta.dataset.center30Cta = \"\";\n      cta.textContent = entry.ctaText;\n      if (entry.directionHref) {\n        cta.setAttribute(\"href\", entry.directionHref);\n        cta.setAttribute(\"target\", \"_self\");\n      } else cta.setAttribute(\"type\", \"button\");\n      copy.append(cta);\n      const map = document2.createElement(\"iframe\");\n      map.setAttribute(\"src\", entry.mapSrc);\n      map.setAttribute(\"title\", entry.headingParts.join(\" \") + \" \\uC9C0\\uB3C4\");\n      map.setAttribute(\"loading\", \"lazy\");\n      map.setAttribute(\"allowfullscreen\", \"\");\n      map.setAttribute(\"referrerpolicy\", \"no-referrer-when-downgrade\");\n      card.append(copy, map);\n      list.append(card);\n      return card;\n    });\n    root.insertBefore(list, nativeCards[0]);\n    nativeCards.forEach((card) => {\n      card.dataset.center30Superseded = \"true\";\n      card.setAttribute(\"aria-hidden\", \"true\");\n      card.setAttribute(\"inert\", \"\");\n    });\n    return {\n      root,\n      list,\n      cards,\n      inspect() {\n        return { source: \"live desktop 2026-09-30\", nativeCount: nativeCards.length, count: cards.length, exact: cards.every((card, i) => card.querySelector(\"h3\").textContent === centers_desktop_canonical_default[i].headingParts.join(\"\") && JSON.stringify([...card.querySelectorAll(\"[data-center30-details] p\")].map((p) => p.textContent)) === JSON.stringify(centers_desktop_canonical_default[i].lines) && card.querySelector(\"iframe\").getAttribute(\"src\") === centers_desktop_canonical_default[i].mapSrc && card.querySelector(\"[data-center30-cta]\").textContent === centers_desktop_canonical_default[i].ctaText) };\n      },\n      destroy() {\n        list.remove();\n        styles.remove();\n        previous.forEach(({ node, hidden, aria, inert }) => {\n          for (const [key, value] of [[\"data-center30-superseded\", hidden], [\"aria-hidden\", aria], [\"inert\", inert]]) value === null ? node.removeAttribute(key) : node.setAttribute(key, value);\n        });\n      }\n    };\n  }\n\n  // cms-pagination-entry.js\n  var ROUTES = {\n    CENTERS: { path: \"/\\uC13C\\uD130\\uC18C\\uAC1C\", pageSize: 10, label: \"\\uC13C\\uD130 \\uC18C\\uAC1C\", itemLabel: \"\\uC13C\\uD130\", previewTitle: /^브레인에이블\\s+센터\\s+소개$/ },\n    ARTICLES: { path: \"/\\uCEE4\\uBBA4\\uB2C8\\uD2F0Articles\", prefix: \"/case-study/\", previewTitle: /^브레인에이블\\s+ARTICLES$/i },\n    NEWS: { path: \"/\\uCEE4\\uBBA4\\uB2C8\\uD2F0News\", prefix: \"/collection-2/\", previewTitle: /^브레인에이블\\s*\\|\\s*Brainable\\s*-\\s*커뮤니티News$/i }\n  };\n  var FLOW_CSS = `\n[data-cms30-flow] { height:auto !important; min-height:0 !important; max-height:none !important; flex-basis:auto !important; }\n[data-cms30-flow]:not([data-breakpoint]) { overflow:visible !important; }\n[data-cms30-flow][data-breakpoint] { min-height:100svh !important; }\n`;\n  function pageKind(document2) {\n    let path = \"\";\n    try {\n      path = decodeURIComponent(document2.defaultView.location.pathname).replace(/\\/$/, \"\") || \"/\";\n    } catch {\n      return null;\n    }\n    const direct = Object.entries(ROUTES).find(([, route]) => route.path === path);\n    if (direct) return direct[0];\n    const preview = /figmaiframepreview\\.figma\\.site$/i.test(document2.defaultView.location.hostname);\n    if (path === \"/\" && preview) return Object.entries(ROUTES).find(([, route]) => route.previewTitle.test(document2.title.trim()))?.[0] || null;\n    return null;\n  }\n  function hrefMatches(node, prefix) {\n    const href = node.getAttribute(\"href\");\n    if (!href) return false;\n    try {\n      return new URL(href, node.ownerDocument.baseURI).pathname.startsWith(prefix);\n    } catch {\n      return false;\n    }\n  }\n  function discoverList(document2, kind) {\n    if (kind === \"CENTERS\") {\n      const roots = [...document2.querySelectorAll('[data-breakpoint=\"true\"]')].filter((root) => root.getBoundingClientRect().width > 0);\n      const matches = roots.map((list) => ({ list, cards: [...list.children].filter((card) => card.tagName === \"SECTION\" && card.querySelector(\"h3\") && card.querySelectorAll(\"iframe\").length === 1) })).filter(({ cards }) => cards.length > 0);\n      if (matches.length !== 1) return null;\n      const match2 = matches[0];\n      return { ...match2, host: match2.list, insertBefore: match2.cards[match2.cards.length - 1].nextSibling };\n    }\n    const prefix = ROUTES[kind].prefix;\n    const links = [...document2.querySelectorAll(\"a[href]\")].filter((node) => !node.closest(\"nav,header,footer,[data-nav30-kind],[data-cms30-pagination]\") && hrefMatches(node, prefix));\n    const outer = links.filter((node) => !links.some((parent) => parent !== node && parent.contains(node)));\n    const parents = [...new Set(outer.map((node) => node.parentElement))];\n    const candidates = parents.map((list) => ({ list, cards: [...list.children].filter((node) => hrefMatches(node, prefix)) })).filter(({ list, cards }) => cards.length > 0 && cards.length === list.children.length && getComputedStyle(list).display === \"flex\" && getComputedStyle(list).flexDirection === \"column\" && list.getBoundingClientRect().width > 0);\n    if (candidates.length === 1) return candidates[0];\n    if (candidates.length > 1) return null;\n    if (!/figmaiframepreview\\.figma\\.site$/i.test(document2.defaultView.location.hostname)) return null;\n    const match = (node) => node.matches('a,[role=\"link\"]') && !!node.querySelector(\"img\") && (kind === \"ARTICLES\" ? /Read more\\s*$/.test(node.textContent.trim()) : /^\\[(NEWS|SEMINAR)\\]/.test(node.textContent.trim()));\n    const fallback = [...document2.querySelectorAll(\"div\")].filter((list) => list.children.length > 0 && [...list.children].every(match) && getComputedStyle(list).display === \"flex\" && getComputedStyle(list).flexDirection === \"column\" && list.getBoundingClientRect().width > 0 && !list.closest(\"nav,header,footer,[data-nav30-kind]\"));\n    return fallback.length === 1 ? { list: fallback[0], cards: [...fallback[0].children] } : null;\n  }\n  function allowContentHeight(list) {\n    const root = list.closest('[data-breakpoint=\"true\"]');\n    if (!root) return () => {\n    };\n    const nodes = [];\n    for (let node = list; node && node !== root; node = node.parentElement) {\n      if (node.tagName !== \"DIV\") return () => {\n      };\n      nodes.push(node);\n    }\n    nodes.push(root);\n    const saved = nodes.map((node) => ({ node, value: node.getAttribute(\"data-cms30-flow\") }));\n    nodes.forEach((node) => node.setAttribute(\"data-cms30-flow\", \"\"));\n    return () => saved.forEach(({ node, value }) => value === null ? node.removeAttribute(\"data-cms30-flow\") : node.setAttribute(\"data-cms30-flow\", value));\n  }\n  function startCMSPagination(document2 = window.document) {\n    const window2 = document2.defaultView;\n    window2.__cms30Pagination?.destroy();\n    const style = document2.createElement(\"style\");\n    style.dataset.cms30FlowStyles = \"\";\n    style.textContent = FLOW_CSS;\n    document2.head.append(style);\n    const pages = /* @__PURE__ */ new Map();\n    let active = null, centerPatch = null, restoreFlow = () => {\n    }, frame = 0, destroyed = false, error = null;\n    function teardown() {\n      if (active) {\n        pages.set(active.kind, active.controller.inspect().page);\n        active.controller.destroy();\n        active = null;\n      }\n      restoreFlow();\n      restoreFlow = () => {\n      };\n    }\n    function scan() {\n      frame = 0;\n      if (destroyed) return;\n      const kind = pageKind(document2);\n      if (!kind) {\n        teardown();\n        centerPatch?.destroy();\n        centerPatch = null;\n        return;\n      }\n      let match = discoverList(document2, kind);\n      if (kind === \"CENTERS\" && match && (window2.innerWidth <= 1023 || match.list.getBoundingClientRect().width <= 1023)) {\n        if (centerPatch?.root !== match.list) {\n          teardown();\n          centerPatch?.destroy();\n          centerPatch = reconcileNarrowCenters({ root: match.list, nativeCards: match.cards });\n        }\n        match = { list: centerPatch.list, cards: centerPatch.cards };\n      } else if (centerPatch) {\n        teardown();\n        centerPatch.destroy();\n        centerPatch = null;\n      }\n      if (!match) {\n        if (active && !active.controller.list.isConnected) teardown();\n        return;\n      }\n      if (active?.kind === kind && active.controller.list === match.list && active.controller.cards.length === match.cards.length && active.controller.cards.every((node, i) => node === match.cards[i])) return;\n      teardown();\n      try {\n        restoreFlow = allowContentHeight(match.list);\n        const controller = enhanceCMSPagination({ ...match, label: ROUTES[kind].label || kind, pageSize: ROUTES[kind].pageSize || 5, itemLabel: ROUTES[kind].itemLabel || \"\\uAC8C\\uC2DC\\uAE00\", initialPage: pages.get(kind) || 1 });\n        active = { kind, controller };\n        error = null;\n      } catch (cause) {\n        restoreFlow();\n        restoreFlow = () => {\n        };\n        error = String(cause);\n      }\n    }\n    const schedule = () => {\n      if (!frame && !destroyed) frame = window2.requestAnimationFrame(scan);\n    };\n    const observer = new MutationObserver((records) => {\n      if (records.some((record) => record.type === \"childList\" && record.target.nodeType === 1 && !record.target.closest?.(\"[data-cms30-pagination],[data-cms30-probe],[data-nav30-qa-probe]\"))) schedule();\n    });\n    observer.observe(document2.body, { childList: true, subtree: true });\n    window2.addEventListener(\"popstate\", schedule);\n    window2.addEventListener(\"resize\", schedule);\n    const api = { inspect() {\n      return { route: pageKind(document2), error, pagination: active?.controller.inspect() || null, centerReconciliation: centerPatch?.inspect() || null };\n    }, destroy() {\n      destroyed = true;\n      observer.disconnect();\n      window2.removeEventListener(\"popstate\", schedule);\n      window2.removeEventListener(\"resize\", schedule);\n      if (frame) window2.cancelAnimationFrame(frame);\n      teardown();\n      centerPatch?.destroy();\n      centerPatch = null;\n      style.remove();\n      delete window2.__cms30Pagination;\n      delete window2.brainableCMSPaginationQA;\n    } };\n    window2.__cms30Pagination = api;\n    window2.brainableCMSPaginationQA = () => api.inspect();\n    scan();\n    return api;\n  }\n  if (document.readyState === \"loading\") document.addEventListener(\"DOMContentLoaded\", () => startCMSPagination(), { once: true });\n  else startCMSPagination();\n})();\n\n;\n/* BRAINABLE production global: vision-counting */\nvar BrainableVisionCountingAbout = (() => {\n  var __defProp = Object.defineProperty;\n  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;\n  var __getOwnPropNames = Object.getOwnPropertyNames;\n  var __hasOwnProp = Object.prototype.hasOwnProperty;\n  var __export = (target, all) => {\n    for (var name in all)\n      __defProp(target, name, { get: all[name], enumerable: true });\n  };\n  var __copyProps = (to, from, except, desc) => {\n    if (from && typeof from === \"object\" || typeof from === \"function\") {\n      for (let key of __getOwnPropNames(from))\n        if (!__hasOwnProp.call(to, key) && key !== except)\n          __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n    }\n    return to;\n  };\n  var __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n  // vision-about-adapter.js\n  var vision_about_adapter_exports = {};\n  __export(vision_about_adapter_exports, {\n    installVisionCountingAboutUs: () => installVisionCountingAboutUs,\n    resolveNativeVision: () => resolveNativeVision\n  });\n\n  // vision-counting.js\n  var mounted = /* @__PURE__ */ new WeakMap();\n  var ALLOWED_TARGETS = /* @__PURE__ */ new Set([20, 50]);\n  function parseCounterText(text) {\n    const match = /^(\\s*)(20|50)(\\s*\\+?\\s*)$/.exec(text);\n    return match ? { target: Number(match[2]), prefix: match[1], suffix: match[3], original: text } : null;\n  }\n  function countAtProgress(target, progress) {\n    const t = Math.max(0, Math.min(1, progress));\n    return t >= 1 ? target : Math.min(target - 1, Math.floor(target * (1 - (1 - t) ** 2)));\n  }\n  function captureProperty(element, property) {\n    return { value: element.style.getPropertyValue(property), priority: element.style.getPropertyPriority(property) };\n  }\n  function setOwnedProperty(element, property, value, records) {\n    const before = captureProperty(element, property);\n    element.style.setProperty(property, value, \"important\");\n    records.push({ element, property, before, applied: captureProperty(element, property) });\n  }\n  function restoreOwnedProperties(records) {\n    for (const { element, property, before, applied } of records.reverse()) {\n      const current = captureProperty(element, property);\n      if (current.value !== applied.value || current.priority !== applied.priority) continue;\n      if (before.value) element.style.setProperty(property, before.value, before.priority);\n      else element.style.removeProperty(property);\n    }\n  }\n  function createVisionCounting(section, bindings, options = {}) {\n    if (mounted.has(section)) return mounted.get(section);\n    const doc = section?.ownerDocument;\n    const win = doc?.defaultView;\n    if (!win || !Array.isArray(bindings) || bindings.length !== 2) {\n      throw new TypeError(\"Pass one verified Vision section and exactly two original number bindings.\");\n    }\n    const seenTargets = /* @__PURE__ */ new Set();\n    const records = bindings.map(({ element, target }) => {\n      const parsed = parseCounterText(element?.textContent || \"\");\n      if (!section.contains(element) || element.childElementCount !== 0 || element.childNodes.length !== 1 || element.firstChild?.nodeType !== 3 || !parsed || parsed.target !== target || !ALLOWED_TARGETS.has(target) || seenTargets.has(target)) {\n        throw new TypeError(\"Each binding must be a unique, numeric-only original 20 or 50 leaf in this section.\");\n      }\n      seenTargets.add(target);\n      return { element, ...parsed, overlay: null, number: null, styles: [] };\n    });\n    const requestedDuration = Number(options.duration ?? 1e3);\n    const duration = Number.isFinite(requestedDuration) ? Math.max(800, Math.min(1200, requestedDuration)) : 1e3;\n    const threshold = Math.max(0.01, Math.min(1, Number(options.threshold) || 0.25));\n    const reducedMotion = win.matchMedia?.(\"(prefers-reduced-motion: reduce)\");\n    let status = \"waiting\";\n    let frame = 0;\n    let observer = null;\n    let completed = false;\n    let firstTime = null;\n    const removers = [];\n    function originalsUnchanged() {\n      return records.every(({ element, original, overlay }) => {\n        const originalText2 = [...element.childNodes].filter((node) => node !== overlay).map((node) => node.textContent).join(\"\");\n        return element.isConnected && section.contains(element) && originalText2 === original;\n      });\n    }\n    function cleanVisuals() {\n      for (const record of records) {\n        record.overlay?.remove();\n        record.overlay = null;\n        record.number = null;\n        restoreOwnedProperties(record.styles);\n        record.styles = [];\n      }\n    }\n    function finish(reason = \"complete\") {\n      if (status === \"destroyed\" || completed) return;\n      completed = true;\n      status = reason;\n      observer?.disconnect();\n      win.cancelAnimationFrame(frame);\n      cleanVisuals();\n      options.onComplete?.({ reason, targets: records.map(({ target }) => target), duration });\n    }\n    function makeOverlay(record) {\n      const { element, prefix, suffix } = record;\n      const computed = win.getComputedStyle(element);\n      const paint = {\n        color: computed.color,\n        fill: computed.getPropertyValue(\"-webkit-text-fill-color\") || computed.color,\n        shadow: computed.textShadow,\n        background: computed.backgroundImage,\n        clip: computed.backgroundClip,\n        backgroundSize: computed.backgroundSize,\n        backgroundPosition: computed.backgroundPosition\n      };\n      const overlay = doc.createElement(\"span\");\n      overlay.setAttribute(\"aria-hidden\", \"true\");\n      overlay.setAttribute(\"data-vision-counting-overlay\", \"\");\n      Object.assign(overlay.style, {\n        position: \"absolute\",\n        inset: \"0\",\n        display: \"block\",\n        boxSizing: \"border-box\",\n        padding: computed.padding,\n        margin: \"0\",\n        border: \"0\",\n        pointerEvents: \"none\",\n        userSelect: \"none\",\n        whiteSpace: computed.whiteSpace,\n        textAlign: computed.textAlign,\n        font: \"inherit\",\n        fontKerning: \"inherit\",\n        letterSpacing: \"inherit\",\n        lineHeight: \"inherit\",\n        fontVariantNumeric: \"inherit\",\n        textTransform: \"inherit\",\n        color: paint.color,\n        textShadow: paint.shadow,\n        webkitTextFillColor: paint.fill\n      });\n      if (paint.clip.includes(\"text\")) {\n        Object.assign(overlay.style, {\n          backgroundImage: paint.background,\n          backgroundClip: paint.clip,\n          webkitBackgroundClip: \"text\",\n          backgroundSize: paint.backgroundSize,\n          backgroundPosition: paint.backgroundPosition\n        });\n        setOwnedProperty(element, \"background-image\", \"none\", record.styles);\n      }\n      const textNode = element.firstChild;\n      const range = doc.createRange();\n      range.setStart(textNode, prefix.length);\n      range.setEnd(textNode, prefix.length + String(record.target).length);\n      const digitRect = range.getBoundingClientRect();\n      const elementRect = element.getBoundingClientRect();\n      const scale = element.offsetWidth > 0 ? elementRect.width / element.offsetWidth : 1;\n      const number = doc.createElement(\"span\");\n      number.textContent = \"0\";\n      Object.assign(number.style, {\n        display: \"inline-block\",\n        width: `${digitRect.width / (scale || 1)}px`,\n        textAlign: \"center\",\n        font: \"inherit\",\n        letterSpacing: \"inherit\",\n        lineHeight: \"inherit\",\n        verticalAlign: \"baseline\"\n      });\n      overlay.appendChild(doc.createTextNode(prefix));\n      overlay.appendChild(number);\n      overlay.appendChild(doc.createTextNode(suffix));\n      if (computed.position === \"static\") setOwnedProperty(element, \"position\", \"relative\", record.styles);\n      setOwnedProperty(element, \"color\", \"transparent\", record.styles);\n      setOwnedProperty(element, \"-webkit-text-fill-color\", \"transparent\", record.styles);\n      setOwnedProperty(element, \"text-shadow\", \"none\", record.styles);\n      record.overlay = overlay;\n      record.number = number;\n      element.appendChild(overlay);\n    }\n    function tick(time) {\n      if (status !== \"running\") return;\n      if (!originalsUnchanged()) {\n        finish(\"source-changed\");\n        return;\n      }\n      if (doc.hidden || reducedMotion?.matches) {\n        finish(\"motion-skipped\");\n        return;\n      }\n      if (firstTime === null) firstTime = time;\n      const progress = Math.min(1, (time - firstTime) / duration);\n      for (const record of records) {\n        const text = String(countAtProgress(record.target, progress));\n        if (record.number.textContent !== text) record.number.textContent = text;\n      }\n      if (progress >= 1) finish();\n      else frame = win.requestAnimationFrame(tick);\n    }\n    function start() {\n      if (status !== \"waiting\") return false;\n      if (reducedMotion?.matches || !originalsUnchanged()) {\n        finish(reducedMotion?.matches ? \"reduced-motion\" : \"source-changed\");\n        return false;\n      }\n      observer?.disconnect();\n      status = \"running\";\n      try {\n        records.forEach(makeOverlay);\n      } catch {\n        finish(\"render-unavailable\");\n        return false;\n      }\n      frame = win.requestAnimationFrame(tick);\n      return true;\n    }\n    function onMotionChange() {\n      if (reducedMotion?.matches) finish(\"reduced-motion\");\n    }\n    if (reducedMotion?.addEventListener) {\n      reducedMotion.addEventListener(\"change\", onMotionChange);\n      removers.push(() => reducedMotion.removeEventListener(\"change\", onMotionChange));\n    } else if (reducedMotion?.addListener) {\n      reducedMotion.addListener(onMotionChange);\n      removers.push(() => reducedMotion.removeListener(onMotionChange));\n    }\n    const onVisibility = () => {\n      if (doc.hidden && status === \"running\") finish(\"backgrounded\");\n    };\n    doc.addEventListener(\"visibilitychange\", onVisibility);\n    removers.push(() => doc.removeEventListener(\"visibilitychange\", onVisibility));\n    const controller = {\n      start,\n      inspect: () => ({\n        status,\n        duration,\n        targets: records.map(({ target }) => target),\n        finalTexts: records.map(({ original }) => original),\n        originalTextPreserved: originalsUnchanged(),\n        overlays: records.filter(({ overlay }) => overlay !== null).length\n      }),\n      destroy() {\n        observer?.disconnect();\n        win.cancelAnimationFrame(frame);\n        cleanVisuals();\n        removers.splice(0).forEach((remove) => remove());\n        status = \"destroyed\";\n        mounted.delete(section);\n      }\n    };\n    mounted.set(section, controller);\n    if (reducedMotion?.matches) finish(\"reduced-motion\");\n    else if (win.IntersectionObserver) {\n      observer = new win.IntersectionObserver((entries) => {\n        if (entries.some((entry) => entry.isIntersecting && entry.intersectionRatio >= threshold)) start();\n      }, { threshold: [0, threshold] });\n      records.forEach(({ element }) => observer.observe(element));\n    } else {\n      finish(\"observer-unavailable\");\n    }\n    return controller;\n  }\n\n  // vision-about-adapter.js\n  var OVERLAY = \"[data-vision-counting-overlay]\";\n  var HEADLINE = \"\\uBE0C\\uB808\\uC778\\uC5D0\\uC774\\uBE14\\uC740\\uC9C0\\uAE08\\uB3C4\\uD601\\uC2E0\\uD558\\uACE0\\uBC1C\\uC804\\uC911\\uC785\\uB2C8\\uB2E4.\";\n  var NATIVE_STATS = [\n    { label: \"Statistic 1 about Jones and Brown\", target: 20, text: \"20+20\\uB144\\uC774\\uC0C1\\uC758\\uC9C0\\uC18D\\uC801\\uC778\\uC5F0\\uAD6C\\uAC1C\\uBC1C\" },\n    { label: \"Statistic 3 about Jones and Brown\", target: 50, text: \"50+\\uD655\\uC7A5\\uC911\\uC778\\uBE0C\\uB808\\uC778\\uC5D0\\uC774\\uBE14\\uC804\\uAD6D\\uB124\\uD2B8\\uC6CC\\uD06C\" }\n  ];\n  var compact = (text) => text.replace(/\\s+/g, \"\");\n  function originalText(node) {\n    if (node.nodeType === 3) return node.textContent || \"\";\n    if (node.nodeType !== 1 || node.matches(OVERLAY)) return \"\";\n    return [...node.childNodes].map(originalText).join(\"\");\n  }\n  function resolveNativeVision(document2) {\n    const pair = NATIVE_STATS.map((spec) => {\n      const matches = [...document2.querySelectorAll(`main section[aria-label=\"${spec.label}\"]`)].filter((section3) => compact(originalText(section3)) === spec.text).filter((section3) => section3.getClientRects().length > 0 && document2.defaultView.getComputedStyle(section3).visibility === \"visible\");\n      if (matches.length !== 1) return null;\n      const section2 = matches[0];\n      const leaves = [...section2.querySelectorAll(\"p\")].filter((element) => {\n        if (element.closest(OVERLAY)) return false;\n        const originalNodes = [...element.childNodes].filter((node) => !node.matches?.(OVERLAY));\n        if (originalNodes.length !== 1 || originalNodes[0].nodeType !== 3) return false;\n        return parseCounterText(originalNodes[0].textContent)?.target === spec.target;\n      });\n      return leaves.length === 1 ? { ...spec, section: section2, element: leaves[0] } : null;\n    });\n    if (pair.some((item) => item === null)) return null;\n    const [first, second] = pair;\n    if (first.section.parentElement !== second.section.parentElement || first.section.closest(\"main\") !== second.section.closest(\"main\")) return null;\n    const section = first.section.parentElement.parentElement;\n    if (![...section.children].some((element) => compact(originalText(element)) === HEADLINE)) return null;\n    return { section, bindings: pair.map(({ element, target }) => ({ element, target })) };\n  }\n  function installVisionCountingAboutUs(document2 = window.document) {\n    const win = document2.defaultView;\n    const existing = win.__brainableVisionCountingAboutUs;\n    if (existing) return existing;\n    let mounted2 = null;\n    let frame = 0;\n    let destroyed = false;\n    let hasPlayed = false;\n    let error = null;\n    function reconcile() {\n      frame = 0;\n      if (destroyed) return;\n      if (document2.fonts?.status === \"loading\") return;\n      try {\n        const next = resolveNativeVision(document2);\n        if (mounted2 && next && mounted2.section === next.section && mounted2.bindings.every((binding, i) => binding.element === next.bindings[i].element)) return;\n        if (mounted2) {\n          const status = mounted2.controller?.inspect().status;\n          if (status && status !== \"waiting\") hasPlayed = true;\n          mounted2.controller?.destroy();\n          mounted2 = null;\n        }\n        if (!next) return;\n        const controller = hasPlayed ? null : createVisionCounting(next.section, next.bindings, {\n          duration: 1e3,\n          onComplete: () => {\n            hasPlayed = true;\n          }\n        });\n        mounted2 = { ...next, controller };\n        error = null;\n      } catch (caught) {\n        error = String(caught?.message || caught);\n        mounted2?.controller?.destroy();\n        mounted2 = null;\n      }\n    }\n    function schedule() {\n      if (!destroyed && !frame) frame = win.requestAnimationFrame(reconcile);\n    }\n    function owned(node) {\n      const element = node.nodeType === 1 ? node : node.parentElement;\n      return !!element?.closest(OVERLAY);\n    }\n    const observer = new win.MutationObserver((records) => {\n      if (records.every((record) => {\n        if (owned(record.target)) return true;\n        const changed = [...record.addedNodes, ...record.removedNodes];\n        return changed.length > 0 && changed.every(owned);\n      })) return;\n      schedule();\n    });\n    const install = {\n      inspect: () => ({\n        matched: mounted2 !== null,\n        targets: mounted2?.bindings.map(({ target }) => target) || [],\n        state: mounted2?.controller?.inspect() || (mounted2 ? { status: \"already-counted\", overlays: 0, originalTextPreserved: true } : null),\n        error\n      }),\n      destroy() {\n        destroyed = true;\n        observer.disconnect();\n        win.cancelAnimationFrame(frame);\n        mounted2?.controller?.destroy();\n        mounted2 = null;\n        win.removeEventListener(\"resize\", schedule);\n        win.removeEventListener(\"pageshow\", schedule);\n        delete win.__brainableVisionCountingAboutUs;\n      }\n    };\n    win.__brainableVisionCountingAboutUs = install;\n    observer.observe(document2.body, { childList: true, subtree: true, characterData: true });\n    win.addEventListener(\"resize\", schedule, { passive: true });\n    win.addEventListener(\"pageshow\", schedule);\n    if (document2.fonts?.status === \"loading\") document2.fonts.ready.then(schedule);\n    else reconcile();\n    return install;\n  }\n  if (typeof document !== \"undefined\") {\n    if (document.body) installVisionCountingAboutUs(document);\n    else document.addEventListener(\"DOMContentLoaded\", () => installVisionCountingAboutUs(document), { once: true });\n  }\n  return __toCommonJS(vision_about_adapter_exports);\n})();\n\n;\n/* BRAINABLE production global: home-black-hole */\nvar BrainableBlackHole=(function(C){\"use strict\";var _b=Object.defineProperty;var fs=C=>{throw TypeError(C)};var Sb=(C,F,L)=>F in C?_b(C,F,{enumerable:!0,configurable:!0,writable:!0,value:L}):C[F]=L;var m=(C,F,L)=>Sb(C,typeof F!=\"symbol\"?F+\"\":F,L),ds=(C,F,L)=>F.has(C)||fs(\"Cannot \"+L),qc=(C,F)=>Object(F)!==F?fs('Cannot use the \"in\" operator on this value'):C.has(F),l=(C,F,L)=>(ds(C,F,\"read from private field\"),L?L.call(C):F.get(C)),w=(C,F,L)=>F.has(C)?fs(\"Cannot add the same private member more than once\"):F instanceof WeakSet?F.add(C):F.set(C,L),x=(C,F,L,gr)=>(ds(C,F,\"write to private field\"),gr?gr.call(C,L):F.set(C,L),L),y=(C,F,L)=>(ds(C,F,\"access private method\"),L);/*! MIT License\n\nCopyright (c) 2025 Vercel, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n */var It,dr,Dc,oe,ye,kt,Wn,$t,fn,Tt,Pt,At,dn,hn,Hn,Rt,nt,Kn,Uc,Mc,Xn,K,rt,Ct,Yn,mn,ae,jc,Wc,Hc,hs,ms,Qn,Ft,Lt,Me,pn,it,st,B,ps,Kc,Xc,gs,Ce,gn,U,Yc,Qc,hr,Zc,Jc,eu,tu,bs,ys,Dt,bn,Zn,Jn,Ut,ws,nu,yn,wn,ru,iu,Mt,W,Ge,ot,Oe,Ve,xn,D,mr,ri,xs,vs,_s,Ss,ii,vn,_n,er,Gt,ke,we,Sn,En,In,Z,si,su,Es,ou,au,cu,kn,$n,Gc,tr,Ot,at,nr,rr,Tn,ir,sr,ct,Pn,Vt,Nt,or,ce,uu,lu,fu,oi,du,An,Bt,Rn,zt,ue,Cn,ut,lt,qt,Ne,jt,Be,ar,cr,Wt,ft,Q,hu,mu,pu,Is,ks,ai,Ht,$e,xe,Te,gu,bu,yu,wu,dt,ht,Fn,mt,ur,Ln,lr,Pe,ze,qe,Ae,Kt,je,Xt,Re,le,xu,vu,$s,pr;const F={version:1,wgsl:\"struct _vgsl_ff499267__Bake{resolution:vec2f,yaw:f32,pitch:f32,orbitRadius:f32,diskOuter:f32,fov:f32,centerX:f32,centerY:f32,roll:f32,}@group(0) @binding(0) var<uniform> bake:_vgsl_ff499267__Bake;const _vgsl_ff499267__FLAG_HOLE:f32=1.0;const _vgsl_ff499267__FLAG_ESCAPED:f32=2.0;struct _vgsl_ff499267__GBuffer{@location(0) hit1:vec2f,@location(1) hit2:vec2f,@location(2) sky:vec4f,@location(3) view:vec4f,}@fragment fn fs_main(@location(0) f:vec2f)-> _vgsl_ff499267__GBuffer{let g=d(f,bake.resolution,bake.yaw,bake.pitch,bake.orbitRadius,bake.fov,bake.centerX,bake.centerY,bake.roll,);var h=e(g.position,g.velocity,bake.diskOuter,a(bake.orbitRadius));if(h.swallowed<0.5&&h.escaped<0.5){h.swallowed=1.0;}return _vgsl_ff499267__GBuffer(h.hit1Plane,h.hit2Plane,vec4f(h.finalVelocity,h.swallowed*_vgsl_ff499267__FLAG_HOLE+h.escaped*_vgsl_ff499267__FLAG_ESCAPED),vec4f(h.hit1Direction,h.hit2Direction),);}const _vgsl_5ff25d86__HORIZON:f32=1.0;const _vgsl_5ff25d86__ISCO:f32=3.0;const _vgsl_5ff25d86__MAX_STEPS:i32=768;struct _vgsl_5ff25d86__TraceResult{hit1Plane:vec2f,hit1Direction:vec2f,hit2Plane:vec2f,hit2Direction:vec2f,hitCount:i32,swallowed:f32,escaped:f32,finalVelocity:vec3f,}struct _vgsl_5ff25d86__CameraRay{position:vec3f,velocity:vec3f,}fn a(f:f32)-> f32{return max(120.0,f+8.0);}fn b(f:vec3f)-> vec2f{return vec2f(f.y,atan2(f.z,f.x));}fn c(f:vec3f,g:vec3f)-> vec3f{let h=max(dot(f,f),0.0001);let i=cross(f,g);let j=dot(i,i);return-1.5*j*f/(h*h*sqrt(h));}fn d(f:vec2f,g:vec2f,h:f32,i:f32,j:f32,k:f32,l:f32,m:f32,n:f32,)-> _vgsl_5ff25d86__CameraRay{let o=g.x/max(g.y,1.0);let p=vec2f(f.x*2.0-1.0,1.0-f.y*2.0);let q=(p-vec2f(l,m))*vec2f(o,1.0);let r=cos(n);let s=sin(n);let t=vec2f(q.x*r-q.y*s,q.x*s+q.y*r,);let u=clamp(i,-1.319,1.319);let v=vec3f(sin(h)*cos(u)*j,sin(u)*j,cos(h)*cos(u)*j,);let w=normalize(vec3f(0.0)-v);let z=normalize(cross(w,vec3f(0.0,1.0,0.0)));let A=cross(z,w);var B:_vgsl_5ff25d86__CameraRay;B.position=v;B.velocity=normalize(w*k+z*t.x+A*t.y);return B;}fn e(f:vec3f,g:vec3f,h:f32,i:f32)-> _vgsl_5ff25d86__TraceResult{var j=f;var k=g;var l:_vgsl_5ff25d86__TraceResult;l.hit1Plane=vec2f(0.0);l.hit1Direction=vec2f(0.0);l.hit2Plane=vec2f(0.0);l.hit2Direction=vec2f(0.0);l.hitCount=0;l.swallowed=0.0;l.escaped=0.0;for(var m=0;m<_vgsl_5ff25d86__MAX_STEPS;m++){let n=length(j);if(n<_vgsl_5ff25d86__HORIZON*1.004){l.swallowed=1.0;break;}if(n> i&&dot(j,k)>0.0){l.escaped=1.0;break;}let o=clamp((n-_vgsl_5ff25d86__HORIZON)*0.035,0.0045,0.075*max(1.0,n/6.0));let p=j;let q=k;let r=c(j,k);k+=r*(0.5*o);j+=k*o;let s=c(j,k);k+=s*(0.5*o);k=normalize(k);if(l.hitCount<2){let t=select(-1.0,1.0,p.y>=0.0);let u=select(-1.0,1.0,j.y>=0.0);if(t!=u){let v=clamp(p.y/(p.y-j.y),0.0,1.0);let w=mix(p,j,v);let x=length(w.xz);if(x>=_vgsl_5ff25d86__ISCO&&x<=h){let z=b(normalize(mix(q,k,v)));if(l.hitCount==0){l.hit1Plane=w.xz;l.hit1Direction=z;}else{l.hit2Plane=w.xz;l.hit2Direction=z;}l.hitCount+=1;}}}}l.finalVelocity=k;return l;}\",functionExports:[{name:\"escapeRadiusFor\",resolvedName:\"a\",parameterNames:[\"orbitRadius\"]},{name:\"encodeDirection\",resolvedName:\"b\",parameterNames:[\"direction\"]},{name:\"cameraRay\",resolvedName:\"d\",parameterNames:[\"uv\",\"resolution\",\"yaw\",\"pitch\",\"orbitRadius\",\"fov\",\"centerX\",\"centerY\",\"roll\"]},{name:\"traceRay\",resolvedName:\"e\",parameterNames:[\"cameraPosition\",\"initialVelocity\",\"diskOuter\",\"escapeRadius\"]}]},L={version:1,wgsl:\"struct Bloom{sourceSize:vec2f,direction:vec2f,params:vec4f,}@group(0) @binding(0) var<uniform> bloom:Bloom;@group(0) @binding(1) var source:texture_2d<f32>;@group(0) @binding(2) var linearSampler:sampler;fn softThreshold(a:vec3f)-> vec3f{let b=bloom.params.x;if(b<=0.0){return a;}let c=dot(a,vec3f(0.2126,0.7152,0.0722));let d=max(min(bloom.params.y,b),0.000001);let e=clamp(c-b+d,0.0,2.0*d);let f=e*e/(4.0*d+0.0001);let g=max(c-b,f)/max(c,0.0001);return a*g;}fn downsample(a:vec2f)-> vec3f{let b=1.0/bloom.sourceSize;let c=b*0.5;let d=(textureSample(source,linearSampler,a+vec2f(-c.x,-c.y)).rgb+textureSample(source,linearSampler,a+vec2f(c.x,-c.y)).rgb+textureSample(source,linearSampler,a+vec2f(-c.x,c.y)).rgb+textureSample(source,linearSampler,a+vec2f(c.x,c.y)).rgb)*0.25;return softThreshold(d);}fn gaussianBlur(a:vec2f)-> vec3f{let b=max(bloom.params.z,0.5);let c=0.5/(b*b);let d=1.0;let e=exp(-1.0*c);let f=exp(-4.0*c);let g=exp(-9.0*c);let h=exp(-16.0*c);let i=e+f;let j=g+h;let k=(e+2.0*f)/max(i,0.000001);let l=(3.0*g+4.0*h)/max(j,0.000001);let m=d+2.0*(i+j);let n=bloom.direction/bloom.sourceSize;var o=textureSample(source,linearSampler,a).rgb*d;o+=textureSample(source,linearSampler,a+n*k).rgb*i;o+=textureSample(source,linearSampler,a-n*k).rgb*i;o+=textureSample(source,linearSampler,a+n*l).rgb*j;o+=textureSample(source,linearSampler,a-n*l).rgb*j;return o/m;}@fragment fn fs_main(@location(0) a:vec2f)-> @location(0) vec4f{var b:vec3f;if(bloom.params.w>0.5){b=gaussianBlur(a);}else{b=downsample(a);}return vec4f(b,1.0);}\",functionExports:[]},gr={version:1,wgsl:\"struct Composite{params:vec4f,}@group(0) @binding(0) var<uniform> composite:Composite;@group(0) @binding(1) var scene:texture_2d<f32>;@group(0) @binding(2) var bloomNear:texture_2d<f32>;@group(0) @binding(3) var bloomMedium:texture_2d<f32>;@group(0) @binding(4) var bloomFar:texture_2d<f32>;@group(0) @binding(5) var linearSampler:sampler;const EXPOSURE:f32=1.15;const SATURATION:f32=0.0;fn aces(a:vec3f)-> vec3f{let b=2.51;let c=0.03;let d=2.43;let e=0.59;let f=0.14;return clamp((a*(b*a+vec3f(c)))/(a*(d*a+vec3f(e))+vec3f(f)),vec3f(0.0),vec3f(1.0));}fn tonemap(a:vec3f,b:vec2f)-> vec3f{var c=aces(a*EXPOSURE);let d=b-vec2f(0.5);let e=1.0-smoothstep(0.55,1.15,length(d)*1.6);c*=mix(0.72,1.0,e);c=pow(c,vec3f(1.0/2.2));let f=dot(c,vec3f(0.2126,0.7152,0.0722));let g=mix(vec3f(0.09,0.29,0.74),vec3f(0.68,0.86,1.0),pow(f,0.65));return g*f;}@fragment fn fs_main(@location(0) a:vec2f)-> @location(0) vec4f{let b=textureSample(scene,linearSampler,a).rgb;let c=textureSample(bloomNear,linearSampler,a).rgb*0.50+textureSample(bloomMedium,linearSampler,a).rgb*0.32+textureSample(bloomFar,linearSampler,a).rgb*0.18;let d=b+c*composite.params.x;return vec4f(tonemap(d,a),1.0);}\",functionExports:[]},Ts=64,_u=\"r8unorm\",Su=13,j=Math.fround,br=e=>j(e-Math.floor(e)),Eu=j(.1031),Iu=j(.103),ku=j(.0973),ci=j(33.33);function $u(e,t,n){let r=br(j(e*Eu)),i=br(j(t*Iu)),s=br(j(n*ku));const o=j(j(j(r*j(i+ci))+j(i*j(s+ci)))+j(s*j(r+ci)));return r=j(r+o),i=j(i+o),s=j(s+o),br(j(j(r+i)*s))}function ui(e,t){return e<t/2?e:e-t}function Tu(e,t){const n=new Uint8Array(e*e*e),r=t*1024;let i=0;for(let s=0;s<e;s++){const o=ui(s,e)+r;for(let a=0;a<e;a++){const c=ui(a,e);for(let u=0;u<e;u++)n[i++]=Math.min(255,Math.round($u(ui(u,e),c,o)*255))}}return n}const Ps=new Map;function Pu(e,t){const n=`${e}:${t}`;let r=Ps.get(n);return r||(r=Tu(e,t),Ps.set(n,r)),r}function Au(e,t=Ts,n=\"black-hole-noise\"){const r=e.device.createTexture({kind:\"3d\",size:[t,t,t],format:_u,usage:[\"texture_binding\",\"copy_dst\"],label:n});try{return e.gpu.queue.writeTexture({texture:r.gpu},Pu(t,Su),{offset:0,bytesPerRow:t,rowsPerImage:t},{width:t,height:t,depthOrArrayLayers:t}),r}catch(i){try{r.destroy()}catch{}throw i}}function Ru(e,t){return e.sampler(t,{addressModeU:\"repeat\",addressModeV:\"repeat\",addressModeW:\"repeat\",minFilter:\"linear\",magFilter:\"linear\"})}const Cu={version:1,wgsl:\"struct _vgsl_6930e6de__Refine{resolution:vec2f,yaw:f32,pitch:f32,orbitRadius:f32,diskOuter:f32,fov:f32,centerX:f32,centerY:f32,roll:f32,}@group(0) @binding(0) var<uniform> refine:_vgsl_6930e6de__Refine;@group(0) @binding(1) var gHit1:texture_2d<f32>;@group(0) @binding(2) var gSky:texture_2d<f32>;const _vgsl_6930e6de__SUB_STEPS:i32=4;const _vgsl_6930e6de__MASK_RADIUS:i32=2;const _vgsl_6930e6de__GRADIENT_LIMIT:f32=0.12;const _vgsl_6930e6de__B_CRIT:f32=2.59807621;const _vgsl_6930e6de__CRITICAL_BAND:f32=0.06;fn a(g:vec2f)-> bool{return length(g)> _vgsl_5ff25d86__ISCO*0.5;}struct _vgsl_6930e6de__RefineOut{@location(0) coverage:vec2f,@location(1) geometry:vec4f,}@fragment fn fs_main(@location(0) g:vec2f)-> _vgsl_6930e6de__RefineOut{let h=vec2i(textureDimensions(gHit1,0));let i=vec2i(clamp(g*refine.resolution,vec2f(0.0),refine.resolution-vec2f(1.0)));let j=max(refine.diskOuter-_vgsl_5ff25d86__ISCO,0.001);let k=textureLoad(gHit1,i,0).xy;let l=a(k);let m=(i32(textureLoad(gSky,i,0).w+0.5)&1)!=0;let n=clamp((length(k)-_vgsl_5ff25d86__ISCO)/j,0.0,1.0);let o=e(g,refine.resolution,refine.yaw,refine.pitch,refine.orbitRadius,refine.fov,refine.centerX,refine.centerY,refine.roll,);let p=length(cross(o.position,o.velocity));var q=abs(p-_vgsl_6930e6de__B_CRIT)<_vgsl_6930e6de__CRITICAL_BAND*_vgsl_5ff25d86__HORIZON;for(var r=-_vgsl_6930e6de__MASK_RADIUS;r<=_vgsl_6930e6de__MASK_RADIUS;r++){for(var s=-_vgsl_6930e6de__MASK_RADIUS;s<=_vgsl_6930e6de__MASK_RADIUS;s++){let t=clamp(i+vec2i(s,r),vec2i(0),h-vec2i(1));let u=textureLoad(gHit1,t,0).xy;let v=a(u);let x=(i32(textureLoad(gSky,t,0).w+0.5)&1)!=0;if(v!=l||x!=m){q=true;}if(v&&l){let y=clamp((length(u)-_vgsl_5ff25d86__ISCO)/j,0.0,1.0);if(abs(y-n)> _vgsl_6930e6de__GRADIENT_LIMIT){q=true;}}}}if(!q){return _vgsl_6930e6de__RefineOut(vec2f(select(0.0,1.0,l),0.0),vec4f(0.0));}let z=b(refine.orbitRadius);var A=0.0;var B=1e9;var C=-1e9;var D=vec2f(0.0);var E=vec2f(0.0);var F=0.0;var G=1e9;for(var H=0;H<_vgsl_6930e6de__SUB_STEPS;H++){for(var I=0;I<_vgsl_6930e6de__SUB_STEPS;I++){let J=(vec2f(f32(I),f32(H))+vec2f(0.5))/f32(_vgsl_6930e6de__SUB_STEPS);let K=(vec2f(i)+J)/refine.resolution;let L=e(K,refine.resolution,refine.yaw,refine.pitch,refine.orbitRadius,refine.fov,refine.centerX,refine.centerY,refine.roll,);let M=f(L.position,L.velocity,refine.diskOuter,z);if(M.hitCount>0){let N=length(M.hit1Plane);A+=1.0;B=min(B,N);C=max(C,N);let O=length(J-vec2f(0.5));if(O<G){G=O;D=M.hit1Plane;E=M.hit1Direction;F=N;}}}}let P=A/f32(_vgsl_6930e6de__SUB_STEPS*_vgsl_6930e6de__SUB_STEPS);if(A<0.5){return _vgsl_6930e6de__RefineOut(vec2f(0.0,0.0),vec4f(0.0));}var Q=length(k);var R=0.0;var S=vec4f(0.0);if(l){R=2.0*max(abs(C-Q),abs(Q-B));}else{Q=0.5*(B+C);R=C-B;S=vec4f(D*(Q/max(F,_vgsl_5ff25d86__ISCO)),E);}return _vgsl_6930e6de__RefineOut(vec2f(P,clamp(R/j,0.0,1.0)),S);}const _vgsl_5ff25d86__HORIZON:f32=1.0;const _vgsl_5ff25d86__ISCO:f32=3.0;const _vgsl_5ff25d86__MAX_STEPS:i32=768;struct _vgsl_5ff25d86__TraceResult{hit1Plane:vec2f,hit1Direction:vec2f,hit2Plane:vec2f,hit2Direction:vec2f,hitCount:i32,swallowed:f32,escaped:f32,finalVelocity:vec3f,}struct _vgsl_5ff25d86__CameraRay{position:vec3f,velocity:vec3f,}fn b(g:f32)-> f32{return max(120.0,g+8.0);}fn c(g:vec3f)-> vec2f{return vec2f(g.y,atan2(g.z,g.x));}fn d(g:vec3f,h:vec3f)-> vec3f{let i=max(dot(g,g),0.0001);let j=cross(g,h);let k=dot(j,j);return-1.5*k*g/(i*i*sqrt(i));}fn e(g:vec2f,h:vec2f,i:f32,j:f32,k:f32,l:f32,m:f32,n:f32,o:f32,)-> _vgsl_5ff25d86__CameraRay{let p=h.x/max(h.y,1.0);let q=vec2f(g.x*2.0-1.0,1.0-g.y*2.0);let r=(q-vec2f(m,n))*vec2f(p,1.0);let s=cos(o);let t=sin(o);let u=vec2f(r.x*s-r.y*t,r.x*t+r.y*s,);let v=clamp(j,-1.319,1.319);let w=vec3f(sin(i)*cos(v)*k,sin(v)*k,cos(i)*cos(v)*k,);let z=normalize(vec3f(0.0)-w);let A=normalize(cross(z,vec3f(0.0,1.0,0.0)));let B=cross(A,z);var C:_vgsl_5ff25d86__CameraRay;C.position=w;C.velocity=normalize(z*l+A*u.x+B*u.y);return C;}fn f(g:vec3f,h:vec3f,i:f32,j:f32)-> _vgsl_5ff25d86__TraceResult{var k=g;var l=h;var m:_vgsl_5ff25d86__TraceResult;m.hit1Plane=vec2f(0.0);m.hit1Direction=vec2f(0.0);m.hit2Plane=vec2f(0.0);m.hit2Direction=vec2f(0.0);m.hitCount=0;m.swallowed=0.0;m.escaped=0.0;for(var n=0;n<_vgsl_5ff25d86__MAX_STEPS;n++){let o=length(k);if(o<_vgsl_5ff25d86__HORIZON*1.004){m.swallowed=1.0;break;}if(o> j&&dot(k,l)>0.0){m.escaped=1.0;break;}let p=clamp((o-_vgsl_5ff25d86__HORIZON)*0.035,0.0045,0.075*max(1.0,o/6.0));let q=k;let r=l;let s=d(k,l);l+=s*(0.5*p);k+=l*p;let t=d(k,l);l+=t*(0.5*p);l=normalize(l);if(m.hitCount<2){let u=select(-1.0,1.0,q.y>=0.0);let v=select(-1.0,1.0,k.y>=0.0);if(u!=v){let w=clamp(q.y/(q.y-k.y),0.0,1.0);let x=mix(q,k,w);let z=length(x.xz);if(z>=_vgsl_5ff25d86__ISCO&&z<=i){let A=c(normalize(mix(r,l,w)));if(m.hitCount==0){m.hit1Plane=x.xz;m.hit1Direction=A;}else{m.hit2Plane=x.xz;m.hit2Direction=A;}m.hitCount+=1;}}}}m.finalVelocity=l;return m;}\",functionExports:[{name:\"escapeRadiusFor\",resolvedName:\"b\",parameterNames:[\"orbitRadius\"]},{name:\"encodeDirection\",resolvedName:\"c\",parameterNames:[\"direction\"]},{name:\"cameraRay\",resolvedName:\"e\",parameterNames:[\"uv\",\"resolution\",\"yaw\",\"pitch\",\"orbitRadius\",\"fov\",\"centerX\",\"centerY\",\"roll\"]},{name:\"traceRay\",resolvedName:\"f\",parameterNames:[\"cameraPosition\",\"initialVelocity\",\"diskOuter\",\"escapeRadius\"]}]},Fu={version:1,wgsl:\"struct _vgsl_fd676da8__Shade{resolution:vec2f,time:f32,diskOuter:f32,sceneYaw:f32,centerFade:f32,}const _vgsl_fd676da8__DISK_GAIN:f32=1.35;fn b(a:f32)-> f32{let c=abs(a-0.5);return pow(smoothstep(0.08,0.38,c),2.2);}@group(0) @binding(0) var<uniform> shade:_vgsl_fd676da8__Shade;@group(0) @binding(1) var gHit1:texture_2d<f32>;@group(0) @binding(2) var gHit2:texture_2d<f32>;@group(0) @binding(3) var gSky:texture_2d<f32>;@group(0) @binding(4) var gView:texture_2d<f32>;@group(0) @binding(5) var<uniform> disk:_vgsl_ac2eea1b__DiskLook;@group(0) @binding(6) var<uniform> stars:_vgsl_045b447d__StarLook;@group(0) @binding(7) var noiseVolume:texture_3d<f32>;@group(0) @binding(8) var noiseSampler:sampler;@group(0) @binding(9) var gAa:texture_2d<f32>;@group(0) @binding(10) var gAaGeom:texture_2d<f32>;fn e(a:_vgsl_6c5789c7__GBufferSample)-> vec2f{let c=max(disk.stretch,0.05);let d=a.diskPolar.y-min(shade.time,_vgsl_ac2eea1b__SHEAR_PERIOD*0.5)*(disk.speed*0.55/pow(a.diskPolar.x,1.5));let f=vec3f(cos(d)*c,sin(d)*c,a.diskPolar.x*disk.detail,);return vec2f(max(fwidth(f.x),fwidth(f.y)),fwidth(f.z),);}fn h(a:vec2f)-> f32{return min(max(a.x,a.y),4.0);}fn j(a:vec3f,c:f32)-> vec3f{let d=cos(c);let f=sin(c);return vec3f(d*a.x+f*a.z,a.y,-f*a.x+d*a.z);}fn k(a:f32)-> f32{return a-_vgsl_6c5789c7__TAU*floor((a+_vgsl_6c5789c7__PI_CONST)/_vgsl_6c5789c7__TAU);}fn l(a:_vgsl_6c5789c7__GBufferSample,c:f32)-> _vgsl_6c5789c7__GBufferSample{var d=a;d.position=j(a.position,c);d.viewDirection=j(a.viewDirection,c);d.rayDirection=j(a.rayDirection,c);let f=k(a.diskPolar.y-c);d.diskPolar=vec2f(a.diskPolar.x,f);d.diskUv=vec2f(a.diskUv.x,(f+_vgsl_6c5789c7__PI_CONST)/_vgsl_6c5789c7__TAU);return d;}fn m(a:_vgsl_6c5789c7__GBufferLayers,c:f32)-> _vgsl_6c5789c7__GBufferLayers{var d:_vgsl_6c5789c7__GBufferLayers;d.front=l(a.front,c);d.back=l(a.back,c);return d;}const _vgsl_fd676da8__AA_TAPS:i32=6;const _vgsl_fd676da8__AA_SPAN_MIN:f32=0.15;fn o(a:_vgsl_6c5789c7__GBufferSample,c:f32,d:f32)-> _vgsl_ac2eea1b__DiskSample{let f=max(shade.diskOuter-_vgsl_6c5789c7__ISCO,0.001);let g=a.span*f;if(a.span<=_vgsl_fd676da8__AA_SPAN_MIN){return I(a,disk,shade.time,c,noiseVolume,noiseSampler);}let i=min(max(d,max(disk.detail,0.05)*(g/f32(_vgsl_fd676da8__AA_TAPS))),4.0);let n=g/f32(_vgsl_fd676da8__AA_TAPS);let p=a.diskPolar.x-g*0.5;var r=vec3f(0.0);var s=0.0;var u=0.0;for(var v=0;v<_vgsl_fd676da8__AA_TAPS;v++){let w=p+(f32(v)+0.5)*n;if(w<_vgsl_6c5789c7__ISCO||w> shade.diskOuter){continue;}let y=I(D(a,w,shade.diskOuter),disk,shade.time,i,noiseVolume,noiseSampler,);r+=y.color*y.alpha;s+=y.alpha;u+=1.0;}if(u<0.5){return I(a,disk,shade.time,c,noiseVolume,noiseSampler);}var z:_vgsl_ac2eea1b__DiskSample;let T=s/u;z.alpha=T;z.color=select(vec3f(0.0),(r/u)/max(T,1e-6),T>1e-6);return z;}fn q()-> _vgsl_ac2eea1b__DiskSample{var a:_vgsl_ac2eea1b__DiskSample;a.color=vec3f(0.0);a.alpha=0.0;return a;}fn t(a:vec3f,c:_vgsl_ac2eea1b__DiskSample)-> vec3f{return c.color*c.alpha*_vgsl_fd676da8__DISK_GAIN+a*(1.0-c.alpha);}@fragment fn fs_main(@location(0) a:vec2f)-> @location(0) vec4f{let c=vec2f(textureDimensions(gHit1,0));let d=vec2i(clamp(a*c,vec2f(0.0),c-vec2f(1.0)));let f=textureLoad(gAa,d,0).xy;let g=textureLoad(gAaGeom,d,0);let i=C(textureLoad(gHit1,d,0).xy,textureLoad(gHit2,d,0).xy,textureLoad(gSky,d,0),textureLoad(gView,d,0),shade.diskOuter,f,g,);let n=e(i.front);let p=e(i.back);let r=h(n);let s=h(p);let u=i.front.rayDirection;let v=dpdx(u);let w=dpdy(u);let z=m(i,-shade.sceneYaw);let T=z.front;let U=j(v,-shade.sceneYaw);let V=j(w,-shade.sceneYaw);var W=vec3f(0.0);if(!T.isBlackHole&&T.escaped){W=Q(T.rayDirection,stars,shade.time,U,V);}var X=q();var Y=q();if(z.back.isHit){X=I(z.back,disk,shade.time,s,noiseVolume,noiseSampler);}if(z.front.isHit){Y=o(z.front,r,n.x);Y.alpha*=z.front.coverage;}var Z=W;Z=t(Z,X);Z=t(Z,Y);let aa=mix(1.0,b(a.y),clamp(shade.centerFade,0.0,1.0),);let ab=aa;Z*=ab;return vec4f(Z,1.0);}const _vgsl_6c5789c7__HORIZON:f32=1.0;const _vgsl_6c5789c7__ISCO:f32=3.0;const _vgsl_6c5789c7__TAU:f32=6.28318530718;const _vgsl_6c5789c7__PI_CONST:f32=3.14159265359;struct _vgsl_6c5789c7__GBufferSample{position:vec3f,normal:vec3f,diskUv:vec2f,diskPolar:vec2f,rayDirection:vec3f,viewDirection:vec3f,side:f32,coverage:f32,span:f32,isHit:bool,synthesized:bool,isBlackHole:bool,escaped:bool,}struct _vgsl_6c5789c7__GBufferLayers{front:_vgsl_6c5789c7__GBufferSample,back:_vgsl_6c5789c7__GBufferSample,}fn A(a:vec2f)-> vec3f{let c=sqrt(max(1.0-a.x*a.x,0.0));return vec3f(cos(a.y)*c,a.x,sin(a.y)*c);}fn B(a:vec2f,c:vec2f,d:vec4f,f:i32,g:f32,i:vec2f,synthesized:bool,)-> _vgsl_6c5789c7__GBufferSample{var n:_vgsl_6c5789c7__GBufferSample;let p=length(a);let isHit=p> _vgsl_6c5789c7__ISCO*0.5;let r=max(p,_vgsl_6c5789c7__ISCO);let s=atan2(a.y,a.x);let u=A(c);let side=select(1.0,-1.0,u.y>0.0);n.position=select(vec3f(0.0),vec3f(a.x,0.0,a.y),isHit);n.normal=select(vec3f(0.0),vec3f(0.0,side,0.0),isHit);n.diskUv=vec2f(clamp((r-_vgsl_6c5789c7__ISCO)/max(g-_vgsl_6c5789c7__ISCO,0.001),0.0,1.0),(s+_vgsl_6c5789c7__PI_CONST)/_vgsl_6c5789c7__TAU,);n.diskPolar=vec2f(r,s);n.rayDirection=d.xyz;n.viewDirection=u;n.side=select(0.0,side,isHit);n.coverage=clamp(i.x,0.0,1.0);n.span=clamp(i.y,0.0,1.0);n.isHit=isHit;n.synthesized=synthesized&&isHit;n.isBlackHole=(f&1)!=0;n.escaped=(f&2)!=0;return n;}fn C(a:vec2f,c:vec2f,d:vec4f,f:vec4f,g:f32,i:vec2f,n:vec4f,)-> _vgsl_6c5789c7__GBufferLayers{let p=i32(d.w+0.5);let r=length(a)<=_vgsl_6c5789c7__ISCO*0.5&&length(n.xy)> _vgsl_6c5789c7__ISCO*0.5;let s=select(a,n.xy,r);let u=select(f.xy,n.zw,r);var v:_vgsl_6c5789c7__GBufferLayers;v.front=B(s,u,d,p,g,i,r);v.back=B(c,f.zw,d,p,g,vec2f(1.0,0.0),false);if(!v.front.isHit){v.back.isHit=false;v.back.side=0.0;v.back.normal=vec3f(0.0);}return v;}fn D(a:_vgsl_6c5789c7__GBufferSample,c:f32,d:f32)-> _vgsl_6c5789c7__GBufferSample{var f=a;let g=clamp(c,_vgsl_6c5789c7__ISCO,max(d,_vgsl_6c5789c7__ISCO));let i=a.diskPolar.y;f.position=vec3f(cos(i)*g,0.0,sin(i)*g);f.diskPolar=vec2f(g,i);f.diskUv=vec2f(clamp((g-_vgsl_6c5789c7__ISCO)/max(d-_vgsl_6c5789c7__ISCO,0.001),0.0,1.0),a.diskUv.y,);return f;}struct _vgsl_ac2eea1b__DiskLook{brightness:f32,speed:f32,stretch:f32,detail:f32,turbulence:f32,density:f32,doppler:f32,cloudScale:f32,cloudSpeed:f32,cloudStrength:f32,spare0:f32,spare1:f32,spare2:f32,spare3:f32,}struct _vgsl_ac2eea1b__DiskSample{color:vec3f,alpha:f32,}struct _vgsl_ac2eea1b__NoiseLattice{invSize:f32,}fn E(a:texture_3d<f32>,c:sampler,d:_vgsl_ac2eea1b__NoiseLattice,f:vec3f)-> f32{let g=floor(f);let i=f-g;let n=i*i*(3.0-2.0*i);return textureSampleLevel(a,c,(g+n+vec3f(0.5))*d.invSize,0.0).r;}fn F(a:texture_3d<f32>,c:sampler,d:_vgsl_ac2eea1b__NoiseLattice,f:f32,g:f32,i:f32,n:f32,p:i32,r:f32,s:f32,u:f32,v:f32,w:f32,)-> f32{var x:f32=0.0;var y:f32=0.0;var z:f32=0.5;var T=i;var U=n;var V=w;for(var W=0;W<p;W++){let X=clamp(1.0-1.7*max(r*T,s*U),0.0,1.0);var Y:f32=0.5;if(X>0.004){Y=mix(0.5,E(a,c,d,vec3f(cos(f)*T,sin(f)*T,g*U+V)),X,);}x+=z*Y;y+=z;T*=u;U*=v;V+=23.7;z*=0.55;}return x/max(y,0.0001);}fn G(a:texture_3d<f32>,c:sampler,d:_vgsl_ac2eea1b__NoiseLattice,f:f32,g:f32,i:f32,n:f32,p:i32,r:f32,s:f32,u:f32,v:f32,w:f32,)-> f32{var x:f32=0.0;var y:f32=0.0;var z:f32=0.5;var T=i;var U=n;var V=w;for(var W=0;W<p;W++){let X=clamp(1.0-1.7*max(r*T,s*U),0.0,1.0);var Y:f32=0.42;if(X>0.004){let Z=E(a,c,d,vec3f(cos(f)*T,sin(f)*T,g*U+V));Y=mix(0.42,pow(1.0-abs(Z*2.0-1.0),1.35),X);}x+=z*Y;y+=z;T*=u;U*=v;V+=41.9;z*=0.62;}return x/max(y,0.0001);}struct _vgsl_ac2eea1b__FieldParams{angBase:f32,radBase:f32,flowRad:f32,chaos:f32,outward:f32,dAngle:f32,dRadius:f32,}fn H(a:texture_3d<f32>,c:sampler,d:_vgsl_ac2eea1b__NoiseLattice,f:f32,g:f32,i:_vgsl_ac2eea1b__FieldParams,)-> vec2f{let n=(F(a,c,d,f,g,i.angBase*0.55,i.flowRad*1.6,2,i.dAngle,i.dRadius,1.6,2.0,3.7,))-0.5;let p=(F(a,c,d,f+2.4,g*1.13,i.angBase*2.8,i.radBase*0.45,3,i.dAngle,i.dRadius,1.7,2.0,61.3,))-0.5;let r=g+(n*1.9+p*1.25*i.outward)*i.chaos;let s=f+(p*0.9-n*0.35)*i.chaos*0.55/max(g*0.22,0.35);let u=F(a,c,d,s,r,i.angBase,i.flowRad,3,i.dAngle,i.dRadius,2.0,1.12,131.7,);let v=G(a,c,d,s,r,i.angBase*0.85,i.radBase,5,i.dAngle,i.dRadius,1.26,2.05,0.0,);let w=clamp(1.0-1.7*max(i.dAngle*i.angBase*0.85,i.dRadius*i.radBase),0.0,1.0);let x=mix(u,u*0.22+v*1.05,w);let y=(n+p*0.5)*0.9;return vec2f(f32(x),y);}const _vgsl_ac2eea1b__FIELD_MEAN=0.52;const _vgsl_ac2eea1b__SHEAR_REF_RADIUS=6.5;const _vgsl_ac2eea1b__SHEAR_PERIOD:f32=10.0;const _vgsl_ac2eea1b__TWO_PI=6.283185307;fn I(a:_vgsl_6c5789c7__GBufferSample,c:_vgsl_ac2eea1b__DiskLook,d:f32,f:f32,g:texture_3d<f32>,i:sampler,)-> _vgsl_ac2eea1b__DiskSample{var n:_vgsl_ac2eea1b__NoiseLattice;n.invSize=1.0/f32(textureDimensions(g).x);let p=vec2f(a.position.x,a.position.z);let r=a.diskPolar.x;let s=a.diskPolar.y;let u=clamp(a.diskUv.x,0.0,1.0);let viewDirection=a.viewDirection;let v=max(abs(viewDirection.y),0.022);let w=min(1.0/v,34.0);let T=normalize(vec2f(viewDirection.x,viewDirection.z)+vec2f(1e-6,0.0));let U=normalize(p+vec2f(1e-6,0.0));let V=clamp(abs(dot(U,T)),0.0,1.0);let W=sqrt(max(1.0-V*V,0.0));let X=w*w-1.0;let Y=sqrt(1.0+X*V*V);let Z=sqrt(1.0+X*W*W);let aa=max(c.detail,0.05);let ab=max(c.stretch,0.05);let ac=f/max(aa*Y,ab*Z/max(r,_vgsl_6c5789c7__ISCO));let dRadius=ac*Y;let dAngle=ac*Z/max(r,_vgsl_6c5789c7__ISCO);let ad=c.speed*0.55/pow(r,1.5);let ae=c.speed*0.55/pow(_vgsl_ac2eea1b__SHEAR_REF_RADIUS,1.5);let af=ad-ae;let ag=fract(d*ae/_vgsl_ac2eea1b__TWO_PI)*_vgsl_ac2eea1b__TWO_PI;let ah=max(0.0,0.85+c.spare1);let ai=s-ag+ah*log(r/_vgsl_6c5789c7__ISCO);let aj=d/_vgsl_ac2eea1b__SHEAR_PERIOD;let ak=fract(aj);let al=fract(aj+0.5);let am=(ak-0.5)*_vgsl_ac2eea1b__SHEAR_PERIOD;let an=(al-0.5)*_vgsl_ac2eea1b__SHEAR_PERIOD;let ao=1.0-abs(2.0*ak-1.0);let ap=1.0-ao;let aq=ai-af*am;let ar=ai-af*an;let outward=smoothstep(0.0,0.92,u);let at=max(0.0,1.0+c.spare3);let chaos=c.turbulence*(0.08+2.10*outward*outward)*at;let angBase=max(c.stretch,0.05)*0.45*(0.80+1.45*outward*at);let radBase=max(c.detail,0.05)*2.35;let flowRad=max(c.detail,0.05)*0.105;var au:_vgsl_ac2eea1b__FieldParams;au.angBase=angBase;au.radBase=radBase;au.flowRad=flowRad;au.chaos=chaos;au.outward=outward;au.dAngle=dAngle;au.dRadius=dRadius;let av=abs(af)*_vgsl_ac2eea1b__SHEAR_PERIOD*0.5*angBase*0.85;let aw=1.0-smoothstep(0.12,1.1,av);var ax:vec2f;var ay=1.0;if(aw>0.98){let az=mix(ar,aq,ao);ax=H(g,i,n,az,r,au);}else{let aA=H(g,i,n,aq,r,au);let aB=H(g,i,n,ar,r,au);ax=mix(aB,aA,ao);ay=sqrt(max(ao*ao+ap*ap+2.0*aw*ao*ap,0.25));}var aC=_vgsl_ac2eea1b__FIELD_MEAN+(ax.x-_vgsl_ac2eea1b__FIELD_MEAN)/ay;let aD=ae*c.cloudSpeed;let aE=fract(d*aD/_vgsl_ac2eea1b__TWO_PI)*_vgsl_ac2eea1b__TWO_PI;let aF=s-aE+0.32*log(r/_vgsl_6c5789c7__ISCO);let cloudScale=max(c.cloudScale,0.05);let aG=F(g,i,n,aF,r,cloudScale,cloudScale*0.34,2,dAngle,dRadius,1.72,1.86,211.7,);let aH=smoothstep(0.28,0.72,aG);let cloudStrength=clamp(c.cloudStrength,0.0,0.95);let aI=mix(1.0-cloudStrength,1.0+cloudStrength,aH);aC*=aI;let aJ=ax.y;let aK=smoothstep(0.0,0.055,u);let aL=1.0-smoothstep(0.42+aJ*0.30*at,1.0,u);let aM=aK*aL*mix(1.0,0.62,outward);let aN=max(0.2,1.0+c.spare2);let aO=0.50-0.16/aN;let aP=0.50+0.21/aN;var aQ=clamp(pow(smoothstep(aO,aP,aC),1.0+0.9*aN)*aM,0.0,1.0);let aR=clamp((aC-(aO-0.10))/max(aP-aO+0.26,0.02),0.0,1.0);let aS=(mix(0.05,1.0,pow(aR,1.35))+2.2*pow(aR,5.0))*aM;let aT=pow(w,0.62);let aU=mix(0.30,0.85,u);let aV=aQ*aU*aT*c.density*0.95;let aW=1.0-exp(-aV);let aX=pow(1.0-u,1.25);var aY=mix(vec3f(0.52,0.14,0.03),vec3f(1.0,0.56,0.17),smoothstep(0.03,0.5,aX));aY=mix(aY,vec3f(1.0,0.94,0.83),pow(aX,2.2));let aZ=normalize(vec3f(-p.y,0.0,p.x));let a0=min(0.64,0.94/sqrt(max(r-_vgsl_6c5789c7__HORIZON,0.25)));let a1=dot(aZ,-normalize(viewDirection));let a2=pow(clamp(1.0/(1.0-a0*a1),0.72,1.55),1.5*c.doppler);let a3=sqrt(max(1.0-_vgsl_6c5789c7__HORIZON/r,0.025));let a4=mix(0.82,1.0,step(0.0,a.side));let a5=pow(clamp(_vgsl_6c5789c7__ISCO/r,0.0,1.0),1.7);let a6=1.0+2.6*pow(1.0-u,5.0);let a7=max(0.0,1.0+c.spare0);let a8=smoothstep(0.16,0.75,abs(viewDirection.y));let a9=1.0+1.55*a7*a8;let baa=1.0+0.55*smoothstep(6.0,26.0,w);let bab=aY*a2*a3*a4*a5*a9*baa*a6*aS;let bac=bab*c.brightness*1.35;var bad:_vgsl_ac2eea1b__DiskSample;bad.color=vec3f(bac);bad.alpha=aW;return bad;}const _vgsl_045b447d__STAR_INTENSITY:f32=1.9;const _vgsl_045b447d__ANCHOR_CELLS:f32=36.0;const _vgsl_045b447d__ANCHOR_FILL:f32=0.75;const _vgsl_045b447d__ANCHOR_RADIUS:f32=0.00110;const _vgsl_045b447d__ANCHOR_PEAK:f32=1.0;const _vgsl_045b447d__FIELD_CELLS:f32=93.0;const _vgsl_045b447d__FIELD_FILL:f32=0.75;const _vgsl_045b447d__FIELD_RADIUS:f32=0.00070;const _vgsl_045b447d__FIELD_PEAK:f32=0.45;const _vgsl_045b447d__DUST_CELLS:f32=151.0;const _vgsl_045b447d__DUST_FILL:f32=0.75;const _vgsl_045b447d__DUST_RADIUS:f32=0.00040;const _vgsl_045b447d__DUST_PEAK:f32=0.22;const _vgsl_045b447d__COUNT_SLOPE:f32=2.0;const _vgsl_045b447d__STAR_FLUX_AREA:f32=0.5385;const _vgsl_045b447d__MAX_PREFILTER_PIXELS:f32=4.0;const _vgsl_045b447d__STAR_WARM:vec3f=vec3f(1.1741,0.9745,0.7397);const _vgsl_045b447d__STAR_COOL:vec3f=vec3f(0.8954,1.0131,1.1781);struct _vgsl_045b447d__StarLook{brightness:f32,density:f32,contrast:f32,warmth:f32,twinkle:f32,}fn J(a:vec3f)-> vec3f{let c=abs(a);if(c.x>=c.y&&c.x>=c.z){return vec3f(a.yz/c.x,select(1.0,0.0,a.x>0.0));}if(c.y>=c.z){return vec3f(a.xz/c.y,select(3.0,2.0,a.y>0.0));}return vec3f(a.xy/c.z,select(5.0,4.0,a.z>0.0));}fn K(a:vec3f,c:i32)-> vec2f{if(c==0){return a.yz/abs(a.x);}if(c==1){return a.xz/abs(a.y);}return a.xy/abs(a.z);}struct _vgsl_045b447d__SkyFilter{inverseJacobian:mat2x2f,pixelsPerFace:f32,faceMajor:f32,}fn L(a:vec3f,c:i32,d:vec3f,f:vec3f)-> _vgsl_045b447d__SkyFilter{let g=K(a,c);let i=K(a+d,c)-g;let n=K(a+f,c)-g;let p=i.x*n.y-i.y*n.x;let r=select(p,1.0e-24,abs(p)<1.0e-24);let s=mat2x2f(vec2f(n.y,-i.y),vec2f(-n.x,i.x))*(1.0/r);var u:_vgsl_045b447d__SkyFilter;u.inverseJacobian=s;u.pixelsPerFace=1.0/sqrt(max(abs(p),1.0e-24));u.faceMajor=max(length(i),length(n));return u;}struct _vgsl_045b447d__SkyState{brightness:f32,rangePower:f32,meanFlux:f32,warmth:f32,twinkle:f32,time:f32,fillScale:f32,radiusScale:f32,}fn M(a:_vgsl_045b447d__StarLook,c:vec2f,time:f32)-> _vgsl_045b447d__SkyState{let d=clamp(a.contrast,1.0,512.0);let rangePower=d*d;let f=1.0+dot(c,c);let g=sqrt(f);var i:_vgsl_045b447d__SkyState;i.brightness=max(0.0,a.brightness)*_vgsl_045b447d__STAR_INTENSITY;i.rangePower=rangePower;i.meanFlux=_vgsl_045b447d__COUNT_SLOPE/(d+_vgsl_045b447d__COUNT_SLOPE-1.0);i.warmth=clamp(a.warmth,0.0,1.0);i.twinkle=clamp(a.twinkle,0.0,1.0);i.time=time;i.fillScale=max(0.0,a.density)/(f*g);i.radiusScale=sqrt(f*g);return i;}struct _vgsl_045b447d__Species{cells:f32,fill:f32,peak:f32,faceRadius:f32,radiusPixels:f32,gain:f32,}fn N(cells:f32,fill:f32,peak:f32,a:f32,c:_vgsl_045b447d__SkyState,d:_vgsl_045b447d__SkyFilter,)-> _vgsl_045b447d__Species{let faceRadius=a*c.radiusScale;let f=faceRadius*d.pixelsPerFace;var g:_vgsl_045b447d__Species;g.cells=cells;g.fill=clamp(fill*c.fillScale,0.0,1.0);g.peak=peak*c.brightness;g.faceRadius=faceRadius;g.radiusPixels=clamp(f,1.0,_vgsl_045b447d__MAX_PREFILTER_PIXELS);g.gain=min(1.0,f*f);return g;}fn O(a:vec2f,c:vec2f,d:i32,f:i32,g:_vgsl_045b447d__Species,i:_vgsl_045b447d__SkyState,n:_vgsl_045b447d__SkyFilter,)-> vec3f{let p=R(bitcast<vec3u>(vec3i(vec2i(a),d*131+f)));let r=S(p.x);if(r> g.fill){return vec3f(0.0);}let s=vec2f(S(p.y),S(p.z))-vec2f(0.5);let u=a+vec2f(0.5)+s*0.8;let v=n.inverseJacobian*((c-u)/g.cells);let w=1.0-smoothstep(0.0,g.radiusPixels,length(v));let T=r/max(g.fill,1.0e-6);let U=inverseSqrt(1.0+T*(i.rangePower-1.0));let V=mix(vec3f(1.0),mix(_vgsl_045b447d__STAR_WARM,_vgsl_045b447d__STAR_COOL,S(p.y^p.z)),i.warmth);let W=S(p.y)*6.2831853;let X=1.0+i.twinkle*0.06*sin(i.time*(0.35+S(p.z)*0.4)+W);return V*(w*w*g.peak*U*X*g.gain);}fn P(a:vec3f,c:i32,d:_vgsl_045b447d__Species,f:_vgsl_045b447d__SkyState,g:_vgsl_045b447d__SkyFilter,)-> vec3f{let i=i32(a.z);let n=a.xy*d.cells;let p=O(floor(n),n,i,c,d,f,g);let r=d.faceRadius*d.cells;let s=d.peak*f.meanFlux*d.fill*_vgsl_045b447d__STAR_FLUX_AREA*r*r;let u=mix(vec3f(1.0),0.5*(_vgsl_045b447d__STAR_WARM+_vgsl_045b447d__STAR_COOL),f.warmth);let v=d.cells*g.faceMajor;return mix(p,u*s,smoothstep(1.0,3.0,v));}fn Q(a:vec3f,c:_vgsl_045b447d__StarLook,d:f32,f:vec3f,g:vec3f)-> vec3f{let i=normalize(a);let n=J(i);let p=L(i,i32(n.z)/2,f,g);let r=M(c,n.xy,d);return P(n,17,N(_vgsl_045b447d__ANCHOR_CELLS,_vgsl_045b447d__ANCHOR_FILL,_vgsl_045b447d__ANCHOR_PEAK,_vgsl_045b447d__ANCHOR_RADIUS,r,p),r,p,)+P(n,71,N(_vgsl_045b447d__FIELD_CELLS,_vgsl_045b447d__FIELD_FILL,_vgsl_045b447d__FIELD_PEAK,_vgsl_045b447d__FIELD_RADIUS,r,p),r,p,)+P(n,149,N(_vgsl_045b447d__DUST_CELLS,_vgsl_045b447d__DUST_FILL,_vgsl_045b447d__DUST_PEAK,_vgsl_045b447d__DUST_RADIUS,r,p),r,p,);}fn R(a:vec3u)-> vec3u{var c=a*1664525u+1013904223u;c.x=c.x+c.y*c.z;c.y=c.y+c.z*c.x;c.z=c.z+c.x*c.y;c=c^(c>> vec3u(16u));c.x=c.x+c.y*c.z;c.y=c.y+c.z*c.x;c.z=c.z+c.x*c.y;c=c^(c>> vec3u(16u));return c;}fn S(a:u32)-> f32{return f32(a>>8u)*(1.0/16777216.0);}\",functionExports:[{name:\"decodeGBuffer\",resolvedName:\"C\",parameterNames:[\"hit1\",\"hit2\",\"sky\",\"view\",\"diskOuter\",\"aa\",\"aaGeom\"]},{name:\"sampleAtRadius\",resolvedName:\"D\",parameterNames:[\"g\",\"radius\",\"diskOuter\"]},{name:\"shadeDisk\",resolvedName:\"I\",parameterNames:[\"g\",\"look\",\"time\",\"footprint\",\"noiseTex\",\"noiseSampler\"]},{name:\"shadeStars\",resolvedName:\"Q\",parameterNames:[\"direction\",\"look\",\"time\",\"ddx\",\"ddy\"]},{name:\"pcg3d\",resolvedName:\"R\",parameterNames:[\"value\"]},{name:\"unitFloat\",resolvedName:\"S\",parameterNames:[\"hash\"]}]},Lu=[\"rg32float\",\"rg32float\",\"rgba16float\",\"rgba16float\"],Du=[\"rg8unorm\",\"rgba16float\"],de=[0,0,0,1];function Uu(e,t){const n=e.sampler(t,{minFilter:\"linear\",magFilter:\"linear\"}),r=Ru(e,t);return{bake:e.effect(t,F,{label:\"optimized-black-hole-bake\"}),refine:e.effect(t,Cu,{label:\"optimized-black-hole-refine\"}),shade:e.effect(t,Fu,{label:\"optimized-black-hole-shade\"}),bloomExtract:e.effect(t,L),bloomBlurH0:e.effect(t,L),bloomBlurV0:e.effect(t,L),bloomDown1:e.effect(t,L),bloomBlurH1:e.effect(t,L),bloomBlurV1:e.effect(t,L),bloomDown2:e.effect(t,L),bloomBlurH2:e.effect(t,L),bloomBlurV2:e.effect(t,L),composite:e.effect(t,gr),postSampler:n,noiseSampler:r,noiseVolume:Au(t,Ts)}}function As(e,t,n){const r=Vu(n),i=li(r,2),s=li(r,4),o=li(r,8),a=f=>e.target(t,{size:f,colors:[{format:\"rgba16float\"}]}),c=[],u=f=>(c.push(f),f);try{return{gbuffer:u(e.target(t,{size:r,colors:Lu.map(f=>({format:f}))})),aa:u(e.target(t,{size:r,colors:Du.map(f=>({format:f}))})),scene:u(a(r)),bloom0:u(a(i)),bloomPing0:u(a(i)),bloom1:u(a(s)),bloomPing1:u(a(s)),bloom2:u(a(o)),bloomPing2:u(a(o))}}catch(f){try{Cs(c.reverse())}catch{}throw f}}function Rs(e){Cs([e.gbuffer,e.aa,e.scene,e.bloom0,e.bloomPing0,e.bloom1,e.bloomPing1,e.bloom2,e.bloomPing2])}function Cs(e){let t=!1,n;for(const r of e)try{Mu(r)}catch(i){t||(n=i),t=!0}if(t)throw n}function Mu(e){var t;(t=e==null?void 0:e.destroy)==null||t.call(e)}function Fs(e,t){const[n,r,i,s]=t.gbuffer.colors,[o,a]=t.aa.colors;e.bake.set({bake:{resolution:t.gbuffer.size}}),e.refine.set({gHit1:n,gSky:i,refine:{resolution:t.gbuffer.size}}),e.shade.set({gHit1:n,gHit2:r,gSky:i,gView:s,gAa:o,gAaGeom:a,noiseVolume:e.noiseVolume,noiseSampler:e.noiseSampler,shade:{resolution:t.gbuffer.size}});const c=t.scene.colors[0],u=t.bloom0.colors[0],f=t.bloomPing0.colors[0],d=t.bloom1.colors[0],h=t.bloomPing1.colors[0],g=t.bloom2.colors[0],b=t.bloomPing2.colors[0];e.bloomExtract.set({source:c,linearSampler:e.postSampler}),e.bloomBlurH0.set({source:u,linearSampler:e.postSampler}),e.bloomBlurV0.set({source:f,linearSampler:e.postSampler}),e.bloomDown1.set({source:u,linearSampler:e.postSampler}),e.bloomBlurH1.set({source:d,linearSampler:e.postSampler}),e.bloomBlurV1.set({source:h,linearSampler:e.postSampler}),e.bloomDown2.set({source:d,linearSampler:e.postSampler}),e.bloomBlurH2.set({source:g,linearSampler:e.postSampler}),e.bloomBlurV2.set({source:b,linearSampler:e.postSampler}),e.composite.set({scene:c,bloomNear:u,bloomMedium:d,bloomFar:g,linearSampler:e.postSampler})}function Ls(e,t,n){const r={resolution:t.gbuffer.size,yaw:0,pitch:n.cameraY,orbitRadius:n.distance,diskOuter:n.diskRadius,fov:n.fov,centerX:n.centerX,centerY:n.centerY,roll:n.cameraRoll};e.bake.set({bake:r}),e.refine.set({refine:r})}function Ds(e,t,n,r,i){e.shade.set({shade:{resolution:t.gbuffer.size,time:r,diskOuter:n.diskRadius,sceneYaw:i,centerFade:n.centerFade},disk:n.disk,stars:n.stars})}function Us(e,t,n){const r=Math.max(0,n.bloom.threshold),i=Math.max(1e-4,n.bloom.knee),s=Math.max(.1,n.bloom.radius),o=(c,u)=>({sourceSize:c,direction:[0,0],params:[u?r:-1,i,s,0]}),a=(c,u,f)=>({sourceSize:c,direction:[u,f],params:[-1,i,s,1]});e.bloomExtract.set({bloom:o(t.scene.size,!0)}),e.bloomBlurH0.set({bloom:a(t.bloom0.size,1,0)}),e.bloomBlurV0.set({bloom:a(t.bloomPing0.size,0,1)}),e.bloomDown1.set({bloom:o(t.bloom0.size,!1)}),e.bloomBlurH1.set({bloom:a(t.bloom1.size,1,0)}),e.bloomBlurV1.set({bloom:a(t.bloomPing1.size,0,1)}),e.bloomDown2.set({bloom:o(t.bloom1.size,!1)}),e.bloomBlurH2.set({bloom:a(t.bloom2.size,1,0)}),e.bloomBlurV2.set({bloom:a(t.bloomPing2.size,0,1)}),e.composite.set({composite:{params:[Math.max(0,n.bloom.strength),0,0,0]}})}async function Gu(e,t,n){const r={colors:[t.bloom0.format]};await Promise.all([e.bake.compile(t.gbuffer),e.refine.compile(t.aa),e.shade.compile(t.scene),e.bloomExtract.compile(r),e.bloomBlurH0.compile(r),e.bloomBlurV0.compile(r),e.bloomDown1.compile(r),e.bloomBlurH1.compile(r),e.bloomBlurV1.compile(r),e.bloomDown2.compile(r),e.bloomBlurH2.compile(r),e.bloomBlurV2.compile(r),e.composite.compile({colors:[n.format]})])}function Ou(e,t,n,r,i){i&&(e.pass({target:n.gbuffer,clear:de},s=>s.draw(t.bake)),e.pass({target:n.aa,clear:de},s=>s.draw(t.refine))),e.pass({target:n.scene,clear:de},s=>s.draw(t.shade)),e.pass({target:n.bloom0,clear:de},s=>s.draw(t.bloomExtract)),e.pass({target:n.bloomPing0,clear:de},s=>s.draw(t.bloomBlurH0)),e.pass({target:n.bloom0,clear:de},s=>s.draw(t.bloomBlurV0)),e.pass({target:n.bloom1,clear:de},s=>s.draw(t.bloomDown1)),e.pass({target:n.bloomPing1,clear:de},s=>s.draw(t.bloomBlurH1)),e.pass({target:n.bloom1,clear:de},s=>s.draw(t.bloomBlurV1)),e.pass({target:n.bloom2,clear:de},s=>s.draw(t.bloomDown2)),e.pass({target:n.bloomPing2,clear:de},s=>s.draw(t.bloomBlurH2)),e.pass({target:n.bloom2,clear:de},s=>s.draw(t.bloomBlurV2)),e.pass({target:r,clear:de},s=>s.draw(t.composite))}function Vu(e){return[Math.max(1,Math.floor(e[0])),Math.max(1,Math.floor(e[1]))]}function li(e,t){return[Math.max(1,Math.floor(e[0]/t)),Math.max(1,Math.floor(e[1]/t))]}function Nu(){return{cameraY:.16,distance:13.5,diskRadius:9,fov:3,centerX:.8,centerY:.3,cameraRoll:-.27,mouseYaw:.15,centerFade:0,bloom:{strength:1,threshold:0,knee:.18,radius:1.5},disk:{brightness:.75,speed:.75,stretch:5.75,detail:3.44,turbulence:4.46,density:1.38,doppler:1.21,cloudScale:20,cloudSpeed:.3,cloudStrength:.2,spare0:.43,spare1:-.25,spare2:-.67,spare3:.69},stars:{brightness:1,density:1,contrast:13,warmth:.5,twinkle:0}}}const Bu=.325,zu=.1,qu=1e3/60-2,ju=\"(max-width: 767px)\";function Wu({canvas:e,onError:t}){const n=Nu(),r={centerX:n.centerX,centerY:n.centerY,cameraRoll:n.cameraRoll,mouseYaw:n.mouseYaw,centerFade:n.centerFade},i=window.matchMedia(ju),s=window.matchMedia(\"(prefers-reduced-motion: reduce)\"),o=()=>{Object.assign(n,i.matches?{centerX:0,centerY:0,cameraRoll:0,mouseYaw:0,centerFade:1}:r)};o();const a=Math.min(Math.max(window.devicePixelRatio,1),2)/2;n.bloom.radius*=a,n.bloom.strength*=a;let c=!1,u,f,d,h,g,b,v,E,k=typeof document>\"u\"?!0:!document.hidden,I=!0,R=!1,H=0,te,X=0,z,ve=!0,pt=0,_e=0,p;const S=()=>{o(),ve=!0,We()};i.addEventListener(\"change\",S);const $=()=>{V(),ie(),We()};s.addEventListener(\"change\",$);const P=A=>{if(A.pointerType!==\"mouse\")return;const fe=Math.max(window.innerWidth,1);pt=Math.min(1,Math.max(-1,A.clientX/fe*2-1))},V=()=>{pt=0},ne=A=>{A.relatedTarget===null&&V()},q=()=>{document.hidden&&V(),k=!document.hidden,ie()};function ie(){if(!R||!f||!u)return;const A=!c&&k&&I&&!s.matches;A!==!!b&&(A?(te=void 0,p=void 0,b=pb(u,f)):(b==null||b.stop(),b=void 0))}function We(){if(!c&&R&&f&&u&&s.matches)try{u.frame(f,Oc)}catch(A){ni(A)}}function pb(A,fe){let re=!1,gt;const fr=zc=>{if(!re){if(gt===void 0||zc-gt>=qu){gt=zc;try{A.frame(fe,Oc)}catch(vb){ni(vb)}}re||(Bc=requestAnimationFrame(fr))}};let Bc=requestAnimationFrame(fr);return{stop(){re=!0,cancelAnimationFrame(Bc)}}}const gb=A=>(H+=te===void 0?0:Math.max(0,(A-te)/1e3),te=A,H),Oc=A=>{if(c||!h||!g||!d)return;const fe=Hu(),re=ve;ve=!1,re&&Ls(h,g,n),Ds(h,g,n,gb(fe),bb(fe)),Ou(A,h,g,d,re)},bb=A=>{if(n.mouseYaw<=0)return _e=0,p=A,0;const fe=p===void 0?0:Math.min(Math.max((A-p)/1e3,0),zu);p=A;const re=pt*Math.max(0,n.mouseYaw);return _e+=(re-_e)*(1-Math.exp(-fe/Bu)),_e},yb=()=>{X=0;const A=z;if(z=void 0,!(c||!A||!f||!u||!h||!g||!d))try{const fe=g,re=As(u,f,[Math.max(1,Math.round(A.width)),Math.max(1,Math.round(A.height))]);try{Fs(h,re),Us(h,re,n)}catch(gt){throw Rs(re),gt}g=re,Rs(fe),ve=!0,We()}catch(fe){ni(fe)}},wb=A=>{c||A.width<=0||A.height<=0||(z=A,X||(X=requestAnimationFrame(yb)))},Vc=()=>{wb({width:e.clientWidth,height:e.clientHeight})},Nc=()=>{c||(c=!0,b==null||b.stop(),X&&cancelAnimationFrame(X),v==null||v.disconnect(),E==null||E.disconnect(),typeof window<\"u\"&&(i.removeEventListener(\"change\",S),s.removeEventListener(\"change\",$),window.removeEventListener(\"pointermove\",P),window.removeEventListener(\"pointerout\",ne),window.removeEventListener(\"blur\",V),document.removeEventListener(\"visibilitychange\",q)),f==null||f.dispose())},xb=async()=>{const A=await Promise.resolve().then(()=>mb),{init:fe}=A;if(c)return;const re=await fe();if(c){re.dispose();return}f=re,u=A,d=A.surface(f,e,{dpr:1}),h=Uu(A,f),g=As(A,f,d.size),Ls(h,g,n),Ds(h,g,n,H,_e),Fs(h,g),Us(h,g,n),await Gu(h,g,d),!c&&(v=typeof ResizeObserver>\"u\"?void 0:new ResizeObserver(Vc),v==null||v.observe(e),window.addEventListener(\"pointermove\",P,{passive:!0}),window.addEventListener(\"pointerout\",ne,{passive:!0}),window.addEventListener(\"blur\",V),document.addEventListener(\"visibilitychange\",q),typeof IntersectionObserver<\"u\"&&(E=new IntersectionObserver(gt=>{var fr;I=((fr=gt[gt.length-1])==null?void 0:fr.isIntersecting)??I,ie()},{threshold:0}),E.observe(e)),Vc(),R=!0,k=!document.hidden,ie(),We())};function ni(A){Nc(),t==null||t(A)}return{ready:xb().catch(A=>{if(!c)throw ni(A),A}),dispose:Nc}}function Hu(){return typeof performance>\"u\"?Date.now():performance.now()}const Ku='.bh30-background{position:absolute;inset:0;overflow:hidden;pointer-events:none;background:#000;opacity:0;transition:opacity .5s ease;isolation:isolate}.bh30-background[data-ready=\"true\"]{opacity:1}.bh30-background canvas{display:block;width:100%;height:100%;pointer-events:none}.bh30-background:after{content:\"\";position:absolute;inset:0;pointer-events:none;background:linear-gradient(90deg,rgba(0,6,18,.30),rgba(0,6,18,.07) 55%,transparent 80%)}@media(prefers-reduced-motion:reduce){.bh30-background{transition:none}}';function Ms(e,t={}){const n=document.createElement(\"style\");n.setAttribute(\"data-bh30-style\",\"\"),n.textContent=Ku;const r=document.createElement(\"div\");r.className=\"bh30-background\",r.setAttribute(\"aria-hidden\",\"true\"),r.dataset.ready=\"false\";const i=document.createElement(\"canvas\");r.append(i),e.append(n,r);let s=!1,o=!1;const a=f=>{var d;o=!0,r.dataset.ready=\"false\",r.dataset.state=\"fallback\",(d=t.onError)==null||d.call(t,f)},c=Wu({canvas:i,onError:a});return{ready:c.ready.then(()=>{var f;return s||o?!1:(r.dataset.ready=\"true\",r.dataset.state=\"ready\",(f=t.onReady)==null||f.call(t),!0)}).catch(f=>(o||a(f),!1)),element:r,dispose(){s||(s=!0,c.dispose(),r.remove(),n.remove())}}}const Xu=`\n[data-bh30-native-hero]{isolation:isolate!important}\n[data-bh30-native-hero]>.bh30-background{z-index:-1}\n[data-bh30-native-position]{position:relative!important}\n[data-bh30-native-hero][data-bh30-native-ready=\"true\"]>video[data-bh30-original-video]{visibility:hidden!important}\n`,Gs=e=>String(e||\"\").replace(/\\s+/g,\" \").trim();function Yu(e){const t=new Set;for(const n of e.querySelectorAll(\"h1\")){if(Gs(n.textContent)!==\"잠재력을 깨우는 기술,\")continue;let r=n.parentElement;for(let i=0;r&&i<9;i++,r=r.parentElement)if(Array.from(r.children).some(s=>s.tagName===\"VIDEO\")){if(!Array.from(r.querySelectorAll(\"h1\")).some(s=>Gs(s.textContent).includes(\"이 함께합니다.\")))break;r.getClientRects().length&&r.getBoundingClientRect().width>0&&t.add(r);break}}return t}function Os(e=document){const t=e.createElement(\"style\");t.dataset.bh30NativeStyle=\"\",t.textContent=Xu,e.head.append(t);const n=new Map;let r=!1,i=0;const s=u=>{const f=Array.from(u.children).filter(I=>I.tagName===\"VIDEO\"),d=[],h=(I,R,H)=>{d.push([I,R,I.getAttribute(R)]),I.setAttribute(R,H)};h(u,\"data-bh30-native-hero\",\"\"),h(u,\"data-bh30-native-ready\",\"false\"),getComputedStyle(u).position===\"static\"&&h(u,\"data-bh30-native-position\",\"\"),f.forEach(I=>h(I,\"data-bh30-original-video\",\"\"));const g=f.map(I=>({video:I,wasPaused:I.paused}));let b=!1,v=!1;const E=()=>{b&&(b=!1,g.forEach(({video:I,wasPaused:R})=>{!R&&I.isConnected&&I.play().catch(()=>{})}))},k=Ms(u,{onReady(){v||(u.setAttribute(\"data-bh30-native-ready\",\"true\"),b=!0,f.forEach(I=>I.pause()))},onError(){v||(u.setAttribute(\"data-bh30-native-ready\",\"false\"),E())}});return()=>{v||(v=!0,k.dispose(),E(),d.reverse().forEach(([I,R,H])=>H===null?I.removeAttribute(R):I.setAttribute(R,H)))}},o=()=>{if(i=0,r)return;const u=Yu(e);for(const[f,d]of n)u.has(f)||(d(),n.delete(f));for(const f of u)n.has(f)||n.set(f,s(f))},a=()=>{!r&&!i&&(i=requestAnimationFrame(o))},c=new MutationObserver(a);return c.observe(e.body,{childList:!0,subtree:!0}),window.addEventListener(\"resize\",a,{passive:!0}),o(),{dispose(){if(!r){r=!0,c.disconnect(),cancelAnimationFrame(i),window.removeEventListener(\"resize\",a);for(const u of n.values())u();n.clear(),t.remove()}}}}/*! VGPU optimized black hole — Copyright (c) 2025 Vercel, Inc. MIT license. */const Vs=()=>{var t;const e=window;(t=e.__brainableBlackHole30)==null||t.dispose(),e.__brainableBlackHole30=Os(document)};document.readyState===\"loading\"?document.addEventListener(\"DOMContentLoaded\",Vs,{once:!0}):Vs();let fi=class extends Error{constructor(n){super(n.message,{cause:n.cause});m(this,\"code\");m(this,\"severity\");m(this,\"fix\");m(this,\"where\");m(this,\"cause\");m(this,\"detail\");this.name=\"VGPUError\",this.code=n.code,this.severity=n.severity??\"error\",this.fix=n.fix,this.where=n.where,this.cause=n.cause,this.detail=n.detail}};class J extends fi{constructor(t){super({...t,severity:\"error\"}),this.name=\"ValidationError\"}}function Qu(e){return new fi({code:\"VGPU-FEATURE-UNSUPPORTED\",message:`Adapter does not support requested feature(s): ${e.map(t=>`\"${t}\"`).join(\", \")}.`,fix:\"Remove the unsupported name(s) from init({ requiredFeatures: [...] }) or run on an adapter that supports them; gate optional code paths on device.features after init.\",where:\"init\"})}function Zu(e,t){if(!e)return;const n=(t??[]).filter(r=>!e.has(r));if(n.length)throw Qu(n)}const Ju={map_read:1,map_write:2,copy_src:4,copy_dst:8,index:16,vertex:32,uniform:64,storage:128,indirect:256,query_resolve:512};function Dn(e){const t=globalThis.GPUBufferUsage;return e.reduce((n,r)=>n|el(r,t),0)}function el(e,t){const n=e.toUpperCase();return(t==null?void 0:t[n])??Ju[e]}function Ns(){var e;return((e=globalThis.GPUMapMode)==null?void 0:e.READ)??1}const tl={copy_src:1,copy_dst:2,texture_binding:4,storage_binding:8,render_attachment:16};function Bs(e){const t=globalThis.GPUTextureUsage;return e.reduce((n,r)=>n|nl(r,t),0)}function nl(e,t){const n=e.toUpperCase();return(t==null?void 0:t[n])??tl[e]}function zs(e){return\"__vgpuMockBytes\"in e}function qs(e){return\"__vgpuMockBytes\"in e}let rl=1;function yr(e){return Object.freeze({kind:e,id:rl++})}class wr{constructor(){m(this,\"callbacks\",new Set);m(this,\"destroyed\",!1)}onDestroy(t,n){return this.destroyed?(n(t),()=>{}):(this.callbacks.add(n),()=>{this.callbacks.delete(n)})}emit(t){if(this.destroyed)return!1;this.destroyed=!0;const n=[...this.callbacks];this.callbacks.clear();const r=[];for(const i of n)try{i(t)}catch(s){r.push(s)}if(r.length)throw r[0];return!0}}class Se{constructor(t,n,r,i=\"owned\"){w(this,It);m(this,\"device\");m(this,\"gpu\");m(this,\"options\");m(this,\"ownership\");m(this,\"destroySignal\",new wr);m(this,\"identity\",yr(\"buffer\"));m(this,\"destroyed\",!1);this.device=t,this.gpu=n,this.options=r,this.ownership=i,Object.defineProperty(this,\"assertUsable\",{value:s=>y(this,It,dr).call(this,s)})}get resourceIdentity(){return this.identity}onDestroy(t){return this.destroySignal.onDestroy(this,t)}write(t,n=0){y(this,It,dr).call(this,\"Buffer.write\"),this.ownership===\"external\"&&this.validateExternalOperation(\"write\",n,t.byteLength,\"copy_dst\");try{this.device.queue.writeBuffer(this.gpu,n,t)}catch(r){throw this.ownership!==\"external\"?r:xr(\"Buffer.write\",\"The external GPUBuffer rejected the write operation.\",r)}}async read(t,n=0){y(this,It,dr).call(this,\"Buffer.read\"),this.ownership===\"external\"&&this.validateExternalOperation(\"read\",n,t,\"copy_src\");try{const r=await this.device.readback.read(this.gpu,t,n);return y(this,It,dr).call(this,\"Buffer.read\"),r}catch(r){throw r instanceof J||this.ownership!==\"external\"?r:xr(\"Buffer.read\",\"The external GPUBuffer rejected the read operation.\",r)}}destroy(){this.destroyed||(this.destroyed=!0,this.destroySignal.emit(this),this.ownership===\"owned\"&&!zs(this.gpu)&&this.gpu.destroy())}dispose(){this.destroy()}validateExternalOperation(t,n,r,i){if(!(Number.isSafeInteger(n)&&n>=0&&n%4===0&&Number.isSafeInteger(r)&&r>=0&&r%4===0&&n<=this.options.size&&r<=this.options.size-n))throw xr(`Buffer.${t}`,\"External buffer offsets and lengths must be non-negative, 4-byte aligned, and within the buffer size.\");if((this.gpu.usage&Dn([i]))===0)throw xr(`Buffer.${t}`,`External buffer is missing ${i.toUpperCase()} usage.`)}}It=new WeakSet,dr=function(t=\"Buffer\"){if(this.destroyed)throw new J({code:\"VGPU-BUFFER-DISPOSED\",message:\"Buffer is destroyed.\",where:t,fix:\"Wrap or create a live GPUBuffer before using it.\"});this.device.assertUsable(t)};function xr(e,t,n){return new J({code:\"VGPU-EXTERNAL-BUFFER-VALIDATION\",message:t,where:e,cause:n,fix:\"Use a buffer with the required usage flags and an aligned in-range operation.\"})}function il(e){if(al(e))throw cl();const t={version:1,mappings:[]},n={version:1,modules:[{path:\"<runtime>\",text:e}],diagnostics:[],sourceMap:t,cacheKey:sl(e)};return{kind:\"wgsl\",wgsl:e,source:{text:e,path:\"<runtime>\",imports:[]},ast:n,sourceMap:t,diagnostics:[],cacheKey:n.cacheKey,entryPoints:ol(e),stats:{lines:e.split(/\\r?\\n/).length,bytes:new TextEncoder().encode(e).byteLength,bindGroups:0}}}function sl(e){let t=2166136261;for(let n=0;n<e.length;n++)t=Math.imul(t^e.charCodeAt(n),16777619);return{default:`vgpu-wgsl-1:${(t>>>0).toString(16).padStart(8,\"0\")}`}}function ol(e){const t=[],n=/@(vertex|fragment|compute)\\s+fn\\s+([A-Za-z_][A-Za-z0-9_]*)/g;for(const r of e.matchAll(n))t.push(r[2]);return t}function al(e){const t=e.replace(/\\/\\*[\\s\\S]*?\\*\\//g,\"\").replace(/\\/\\/.*$/gm,\"\").trimStart();return t.startsWith(\"import \")||t.startsWith(\"import{\")}function cl(){const e=new Error(\"Runtime WGSL strings cannot contain import statements. Use a build-time loader or @vgpu/wgsl/runtime.\");return e.name=\"VGPUWGSLRuntimeImportError\",e.code=\"VGPU-WGSL-RUNTIME-IMPORT\",e.severity=\"error\",e.source=\"wgsl\",e}const ul=new Set([\"alias\",\"break\",\"case\",\"const\",\"const_assert\",\"continue\",\"continuing\",\"default\",\"diagnostic\",\"discard\",\"else\",\"enable\",\"false\",\"fn\",\"for\",\"if\",\"let\",\"loop\",\"override\",\"requires\",\"return\",\"struct\",\"switch\",\"true\",\"var\",\"while\"]),ll=new Set([\"import\",\"export\",\"from\",\"as\"]),js=new Set([...ul,...ll]),fl=new Set([\"NULL\",\"Self\",\"abstract\",\"active\",\"alignas\",\"alignof\",\"as\",\"asm\",\"asm_fragment\",\"async\",\"attribute\",\"auto\",\"await\",\"become\",\"cast\",\"catch\",\"class\",\"co_await\",\"co_return\",\"co_yield\",\"coherent\",\"column_major\",\"common\",\"compile\",\"compile_fragment\",\"concept\",\"const_cast\",\"consteval\",\"constexpr\",\"constinit\",\"crate\",\"debugger\",\"decltype\",\"delete\",\"demote\",\"demote_to_helper\",\"do\",\"dynamic_cast\",\"enum\",\"explicit\",\"export\",\"extends\",\"extern\",\"external\",\"fallthrough\",\"filter\",\"final\",\"finally\",\"friend\",\"from\",\"fxgroup\",\"get\",\"goto\",\"groupshared\",\"highp\",\"impl\",\"implements\",\"import\",\"inline\",\"instanceof\",\"interface\",\"layout\",\"lowp\",\"macro\",\"macro_rules\",\"match\",\"mediump\",\"meta\",\"mod\",\"module\",\"move\",\"mut\",\"mutable\",\"namespace\",\"new\",\"nil\",\"noexcept\",\"noinline\",\"nointerpolation\",\"non_coherent\",\"noncoherent\",\"noperspective\",\"null\",\"nullptr\",\"of\",\"operator\",\"package\",\"packoffset\",\"partition\",\"pass\",\"patch\",\"pixelfragment\",\"precise\",\"precision\",\"premerge\",\"priv\",\"protected\",\"pub\",\"public\",\"readonly\",\"ref\",\"regardless\",\"register\",\"reinterpret_cast\",\"require\",\"resource\",\"restrict\",\"self\",\"set\",\"shared\",\"sizeof\",\"smooth\",\"snorm\",\"static\",\"static_assert\",\"static_cast\",\"std\",\"subroutine\",\"super\",\"target\",\"template\",\"this\",\"thread_local\",\"throw\",\"trait\",\"try\",\"type\",\"typedef\",\"typeid\",\"typename\",\"typeof\",\"union\",\"unless\",\"unorm\",\"unsafe\",\"unsized\",\"use\",\"using\",\"varying\",\"virtual\",\"volatile\",\"wgsl\",\"where\",\"with\",\"writeonly\",\"yield\"]),dl=new Set([\"binding_array\"]);function hl(e){return/^[A-Za-z_][A-Za-z0-9_]*$/u.test(e)&&e!==\"_\"&&!e.startsWith(\"__\")&&!js.has(e)&&!fl.has(e)&&!dl.has(e)}function ml(e){if(typeof e!=\"object\"||e===null)return!1;try{const{name:t,resolvedName:n,parameterNames:r}=e;return di(t)&&di(n)&&pl(r)}catch{return!1}}function di(e){return typeof e==\"string\"&&hl(e)}function pl(e){if(!Array.isArray(e))return!1;const t=new Set;for(let n=0;n<e.length;n++){const r=e[n];if(!di(r)||t.has(r))return!1;t.add(r)}return!0}function gl(e,t){const n=2**t;return[Math.max(1,Math.floor(e.width/n)),Math.max(1,Math.floor(e.height/n)),e.dimension===\"3d\"?Math.max(1,Math.floor(e.depthOrArrayLayers/n)):e.depthOrArrayLayers]}function Ws(e,t,n){var a,c;const r=u=>{throw new J({code:\"VGPU-CORE-TEXTURE-READ-INVALID\",where:n,message:u,fix:'Select an allocated mip and an in-bounds region on a single-sample texture with usage \"copy_src\".'})};(!t||!Number.isSafeInteger(t.mipLevel)||t.mipLevel<0||t.mipLevel>=e.mipLevelCount)&&r(\"mipLevel must select an allocated mip using a nonnegative safe integer.\"),e.sampleCount!==1&&r(\"Texture readback requires sampleCount 1; resolve multisampled textures explicitly before reading.\"),e.usage&Bs([\"copy_src\"])||r('Texture readback requires explicit \"copy_src\" usage.');const i=gl(e,t.mipLevel),s=t.region===\"all\"?[0,0,0]:(a=t.region)==null?void 0:a.origin,o=t.region===\"all\"?i:(c=t.region)==null?void 0:c.size;(!Array.isArray(s)||s.length!==3||!Array.isArray(o)||o.length!==3)&&r('region must be \"all\" or contain origin and size triples.');for(let u=0;u<3;u++){const f=s[u],d=o[u];(!Number.isSafeInteger(f)||f<0||!Number.isSafeInteger(d)||d<=0||f>i[u]||d>i[u]-f)&&r(`Read region axis ${u} is outside mip ${t.mipLevel} extent [${i}].`)}return{mipLevel:t.mipLevel,origin:[...s],size:[...o],extent:i}}function Hs(e,t,n){const r=Math.min(t??4294967295,4294967295);if(!Number.isSafeInteger(e)||e<=0||e>r)throw new J({code:\"VGPU-CORE-TEXTURE-READ-INVALID\",where:n,message:`Readback allocation of ${e} bytes exceeds the supported limit (${r}).`,fix:\"Read a smaller region or a higher mip level.\"})}const Ks=Dn([\"copy_dst\",\"map_read\"]);class bl{constructor(t){m(this,\"device\");this.device=t}async read(t,n,r){if(zs(t))return t.__vgpuMockBytes.slice(r,r+n).buffer;const i=this.device.createBuffer({size:n,usage:Ks});try{const s=this.device.createCommandEncoder();s.copyBufferToBuffer(t,r,i,0,n),this.device.queue.submit([s.finish()]),await i.mapAsync(Ns());const o=i.getMappedRange().slice(0);return Xs(i),o}finally{Ys(i)}}async readTexture(t,n){var g,b;const r=hi(t.format,\"Readback.readTexture\"),i=Ws(t,n,\"Readback.readTexture\"),[s,o,a]=i.size,c=r.bytesPerPixel,u=yl(s*c,256),f=u*o*a;if(Hs(f,(g=this.device.limits)==null?void 0:g.maxBufferSize,\"Readback.readTexture\"),qs(t)){const v=((b=t.__vgpuMockMips)==null?void 0:b[i.mipLevel])??(i.mipLevel===0?t.__vgpuMockBytes:void 0);if(!v)throw new Error(\"Mock texture has no storage for the selected mip.\");return vl(v,i,r)}const d=this.device.createBuffer({size:f,usage:Ks});let h;try{const v=this.device.createCommandEncoder();v.copyTextureToBuffer({texture:t,mipLevel:i.mipLevel,origin:i.origin},{buffer:d,bytesPerRow:u,rowsPerImage:o},{width:s,height:o,depthOrArrayLayers:a}),this.device.queue.submit([v.finish()]),await d.mapAsync(Ns());const E=new Uint8Array(d.getMappedRange());h=new Uint8Array(s*o*a*c);for(let k=0;k<o*a;k++){const I=k*u,R=k*s*c;h.set(E.subarray(I,I+s*c),R)}Xs(d)}finally{Ys(d)}return r.swizzle===\"bgra-to-rgba\"&&Zs(h),h}destroy(){}}function Xs(e){try{e.unmap()}catch{}}function Ys(e){try{e.destroy()}catch{}}function yl(e,t){return Math.ceil(e/t)*t}const Qs={r8unorm:{bytesPerPixel:1,components:1,componentType:\"unorm8\"},rg8unorm:{bytesPerPixel:2,components:2,componentType:\"unorm8\"},rgba8unorm:{bytesPerPixel:4,components:4,componentType:\"unorm8\"},\"rgba8unorm-srgb\":{bytesPerPixel:4,components:4,componentType:\"unorm8\"},bgra8unorm:{bytesPerPixel:4,components:4,componentType:\"unorm8\",swizzle:\"bgra-to-rgba\"},\"bgra8unorm-srgb\":{bytesPerPixel:4,components:4,componentType:\"unorm8\",swizzle:\"bgra-to-rgba\"},r16float:{bytesPerPixel:2,components:1,componentType:\"float16\"},rg16float:{bytesPerPixel:4,components:2,componentType:\"float16\"},rgba16float:{bytesPerPixel:8,components:4,componentType:\"float16\"},r32float:{bytesPerPixel:4,components:1,componentType:\"float32\"},rg32float:{bytesPerPixel:8,components:2,componentType:\"float32\"},rgba32float:{bytesPerPixel:16,components:4,componentType:\"float32\"}};function hi(e,t){const n=Qs[e];if(n)return n;throw new J({code:\"VGPU-CORE-UNSUPPORTED-FORMAT\",message:`Texture.read does not support format ${e}. Supported formats: ${Object.keys(Qs).join(\", \")}.`,where:t})}function wl(e,t,n=\"Texture.readFloats\"){const r=hi(t,n),i=r.bytesPerPixel/r.components,s=Math.floor(e.byteLength/i),o=new Float32Array(s),a=new DataView(e.buffer,e.byteOffset,e.byteLength);for(let c=0;c<s;c++)r.componentType===\"unorm8\"?o[c]=a.getUint8(c)/255:r.componentType===\"float16\"?o[c]=xl(a.getUint16(c*2,!0)):o[c]=a.getFloat32(c*4,!0);return o}function xl(e){const t=e&32768?-1:1,n=e>>10&31,r=e&1023;return n===0?t*r*5960464477539063e-23:n===31?r===0?t*Number.POSITIVE_INFINITY:Number.NaN:t*(r+1024)*2**(n-25)}function vl(e,t,n){const{size:[r,i,s],origin:[o,a,c],extent:u}=t,f=r*n.bytesPerPixel,d=new Uint8Array(f*i*s);for(let h=0;h<s;h++)for(let g=0;g<i;g++){const b=(((c+h)*u[1]+a+g)*u[0]+o)*n.bytesPerPixel;d.set(e.subarray(b,b+f),(h*i+g)*f)}return n.swizzle===\"bgra-to-rgba\"&&Zs(d),d}function Zs(e){for(let t=0;t<e.length;t+=4){const n=e[t];e[t]=e[t+2],e[t+2]=n}}function _l(e){return{size:e,usage:Dn([\"copy_src\",\"copy_dst\"])}}class Sl{constructor(t,n=()=>{}){m(this,\"gpu\");m(this,\"guard\");this.gpu=t,this.guard=n}writeBuffer(t,n,r){this.guard(\"Queue.writeBuffer\"),this.gpu.writeBuffer(t,n,r)}async flush(){var t,n;this.guard(\"Queue.flush\"),await((n=(t=this.gpu).onSubmittedWorkDone)==null?void 0:n.call(t)),this.guard(\"Queue.flush\")}}class El{constructor(t,n){m(this,\"gpu\");m(this,\"resolved\");this.gpu=t,this.resolved=n}dispose(){}get kind(){return this.resolved.kind}get source(){return this.resolved.source}get code(){return this.resolved.wgsl}get entryPoints(){return this.resolved.entryPoints}get stats(){return this.resolved.stats}}const Il=new Set([\"copy_src\",\"copy_dst\",\"texture_binding\",\"storage_binding\",\"render_attachment\"]),kl=new Set([\"rgba8unorm\",\"rgba8snorm\",\"rgba8uint\",\"rgba8sint\",\"rgba16float\",\"rgba16uint\",\"rgba16sint\",\"rgba32float\",\"rgba32uint\",\"rgba32sint\",\"r32float\",\"r32uint\",\"r32sint\",\"rg32float\",\"rg32uint\",\"rg32sint\"]),$l=new Set([\"r8unorm\",\"r8snorm\",\"r8uint\",\"r8sint\",\"rg8unorm\",\"rg8snorm\",\"rg8uint\",\"rg8sint\",\"r16uint\",\"r16sint\",\"r16float\",\"rg16uint\",\"rg16sint\",\"rg16float\",\"rgb10a2uint\",\"rgb10a2unorm\",\"rg11b10ufloat\",\"r16unorm\",\"r16snorm\",\"rg16unorm\",\"rg16snorm\",\"rgba16unorm\",\"rgba16snorm\"]);function Js(e){return Object.freeze({...e,size:Object.freeze([...e.size]),usage:Object.freeze([...e.usage]),...e.viewFormats===void 0?{}:{viewFormats:Object.freeze([...e.viewFormats])}})}function eo(e){return[e.size[0],e.kind===\"1d\"?1:e.size[1],e.kind===\"2d-array\"?e.layers:e.kind===\"3d\"?e.size[2]:1]}function Tl(e,t){var d,h;const n=(g,b,v)=>{throw new J({code:g,message:b,fix:v,where:\"Device.createTexture\"})};(!e||![\"1d\",\"2d\",\"3d\",\"2d-array\"].includes(e.kind))&&n(\"VGPU-TEXTURE-KIND-REQUIRED\",\"Texture kind must be explicit.\",'Pass kind: \"1d\", \"2d\", \"3d\", or \"2d-array\".'),\"dimension\"in e&&n(\"VGPU-TEXTURE-KIND-REQUIRED\",\"Texture dimension has been replaced by kind.\",'Use kind and, for \"2d-array\", a separate layers count.');const r=e.kind===\"1d\"?1:e.kind===\"3d\"?3:2;(!Array.isArray(e.size)||e.size.length!==r||!Array.from(e.size).every(mi))&&n(\"VGPU-TEXTURE-SIZE-REQUIRED\",`Texture ${e.kind} needs ${r} positive integer spatial dimensions.`,\"Pass size with exactly the spatial dimensions of kind; put array layers in layers.\"),(e.kind===\"2d-array\"?!mi(e.layers):e.layers!==void 0)&&n(\"VGPU-TEXTURE-LAYERS-INVALID\",\"Only 2d-array textures take a positive integer layers count.\",'Use kind: \"2d-array\", size: [width, height], layers: count.'),(!Array.isArray(e.usage)||e.usage.length===0||!Array.from(e.usage).every(g=>Il.has(g)))&&n(\"VGPU-TEXTURE-USAGE-REQUIRED\",\"Texture usage must be a nonempty list of known capabilities.\",'Pass explicit usage, such as [\"texture_binding\", \"copy_dst\"]. No capabilities are added automatically.'),(typeof e.format!=\"string\"||!e.format)&&n(\"VGPU-TEXTURE-FORMAT-REQUIRED\",\"Texture format is required.\",'Pass an explicit GPUTextureFormat, such as \"rgba16float\".');const i=e.mipLevelCount??1,s=e.kind===\"1d\"?1:Math.floor(Math.log2(Math.max(...e.size)))+1;(!mi(i)||i>s)&&n(\"VGPU-TEXTURE-MIPS-INVALID\",`mipLevelCount must be between 1 and ${s}.`,\"Omit mipLevelCount for the base level, or request a valid allocation count. Contents are not generated automatically.\");const o=e.sampleCount??1;o!==1&&o!==4&&n(\"VGPU-TEXTURE-SAMPLES-INVALID\",\"sampleCount must be 1 or 4.\",\"Omit sampleCount for single-sample storage.\"),o===4&&(e.kind!==\"2d\"||i!==1||!e.usage.includes(\"render_attachment\")||e.usage.includes(\"storage_binding\"))&&n(\"VGPU-TEXTURE-SAMPLES-INVALID\",\"MSAA requires a 2d render attachment with one mip and no storage_binding.\",\"Use a single-sample texture for storage, arrays or volumes; resolve MSAA into a separate texture.\"),e.kind===\"1d\"&&(e.usage.includes(\"render_attachment\")||/^(depth|stencil|bc|etc2|eac|astc)/.test(e.format))&&n(\"VGPU-TEXTURE-KIND-INVALID\",\"1d textures cannot be render attachments or use depth/stencil/compressed formats.\",\"Use a 2d texture or a plain color format with non-attachment usage.\");const a=eo(e),c=e.kind===\"1d\"?\"maxTextureDimension1D\":e.kind===\"3d\"?\"maxTextureDimension3D\":\"maxTextureDimension2D\",u=(d=t.limits)==null?void 0:d[c];(u!==void 0&&e.size.some(g=>g>u)||e.kind===\"2d-array\"&&((h=t.limits)==null?void 0:h.maxTextureArrayLayers)!==void 0&&a[2]>t.limits.maxTextureArrayLayers)&&n(\"VGPU-TEXTURE-LIMIT\",\"Texture dimensions or layers exceed enabled device limits.\",\"Reduce the allocation or request sufficient limits when initializing the device.\");const f=g=>{var b;return((b=t.features)==null?void 0:b.has(g))??!1};e.usage.includes(\"storage_binding\")&&!kl.has(e.format)&&!(e.format===\"bgra8unorm\"&&f(\"bgra8unorm-storage\"))&&!($l.has(e.format)&&f(\"texture-formats-tier1\"))&&n(\"VGPU-TEXTURE-STORAGE-FORMAT\",`Format ${e.format} does not support storage_binding with the enabled features.`,\"Choose a supported storage format, enable the required format feature, or explicitly omit storage_binding from usage.\"),e.viewFormats!==void 0&&(!Array.isArray(e.viewFormats)||!Array.from(e.viewFormats).every(g=>typeof g==\"string\"&&g.replace(/-srgb$/,\"\")===e.format.replace(/-srgb$/,\"\")))&&n(\"VGPU-TEXTURE-VIEW-FORMAT\",\"viewFormats must list formats compatible with the texture format.\",\"Only the same format or its compatible linear/sRGB counterpart is allowed; native device restrictions also apply.\")}function mi(e){return typeof e==\"number\"&&Number.isSafeInteger(e)&&e>0}Dc=Symbol.for(\"vgpu/Texture\");class Fe{constructor(t,n,r,i=\"owned\"){m(this,\"device\");m(this,\"ownership\");m(this,Dc,!0);m(this,\"destroySignal\",new wr);m(this,\"identity\",yr(\"texture\"));m(this,\"currentGpu\");m(this,\"currentOptions\");m(this,\"defaultView\",null);m(this,\"destroyed\",!1);this.device=t,this.ownership=i,this.currentGpu=n,this.currentOptions=Js(r)}get gpu(){return this.currentGpu}get options(){return this.currentOptions}get size(){return this.options.size}get format(){return this.options.format}get usage(){return this.options.usage}get mipLevelCount(){return this.options.mipLevelCount??1}get sampleCount(){return this.options.sampleCount??1}get kind(){return this.options.kind}get layers(){return this.options.kind===\"2d-array\"?this.options.layers:1}get dimension(){return this.options.kind===\"2d-array\"?\"2d\":this.options.kind}get viewFormats(){return this.options.viewFormats??[]}get label(){return this.options.label}get resourceIdentity(){return this.identity}onDestroy(t){return this.destroySignal.onDestroy(this,t)}get view(){return this.assertAlive(),this.defaultView??(this.defaultView=this.createView()),this.defaultView}createView(t){return this.assertAlive(\"Texture.createView\"),this.gpu.createView(this.kind===\"2d-array\"?{...t,dimension:(t==null?void 0:t.dimension)??\"2d-array\"}:t)}async read(t){this.assertAlive(\"Texture.read\");const n=await this.device.readback.readTexture(this.gpu,t);return this.assertAlive(\"Texture.read\"),n}async readFloats(t){var i;this.assertAlive(\"Texture.readFloats\");const n=hi(this.options.format,\"Texture.readFloats\"),{size:r}=Ws(this.gpu,t,\"Texture.readFloats\");return Hs(r[0]*r[1]*r[2]*n.components*4,(i=this.device.gpu.limits)==null?void 0:i.maxBufferSize,\"Texture.readFloats\"),wl(await this.read(t),this.options.format)}destroy(){if(!this.destroyed){this.destroyed=!0,this.defaultView=null;try{this.destroySignal.emit(this)}finally{this.ownership!==\"external\"&&!qs(this.gpu)&&this.gpu.destroy()}}}dispose(){this.destroy()}assertAlive(t=\"Texture\"){var n,r;if(this.destroyed)throw new J({code:\"VGPU-CORE-TEXTURE-DESTROYED\",message:\"Texture is destroyed\",where:t});(r=(n=this.device).assertUsable)==null||r.call(n,t)}}function Pl(e){const[t,n,r]=eo(e),i={label:e.label,size:{width:t,height:n,depthOrArrayLayers:r},dimension:e.kind===\"2d-array\"?\"2d\":e.kind,format:e.format,usage:Bs(e.usage)};return e.mipLevelCount!==void 0&&(i.mipLevelCount=e.mipLevelCount),e.sampleCount!==void 0&&(i.sampleCount=e.sampleCount),e.viewFormats!==void 0&&(i.viewFormats=[...e.viewFormats]),e.kind===\"2d-array\"&&(i.textureBindingViewDimension=\"2d-array\"),i}class pi{constructor(t,n=null,r=\"owned\",i={}){w(this,oe);m(this,\"gpu\");m(this,\"adapterInfo\");m(this,\"queue\");m(this,\"readback\");m(this,\"isCompatibilityMode\");m(this,\"scopes\",[]);m(this,\"ownership\");m(this,\"state\",\"alive\");m(this,\"lossInfo\");m(this,\"observeLoss\",!0);this.gpu=t,this.adapterInfo=n,Object.defineProperty(this,\"assertUsable\",{value:a=>y(this,oe,ye).call(this,a)}),this.ownership=typeof r==\"string\"?r:\"owned\";const s=typeof r==\"string\"?i:r;this.isCompatibilityMode=s.isCompatibilityMode??!1,this.queue=new Sl(t.queue,a=>y(this,oe,ye).call(this,a)),this.readback=new bl(t);const o=t.lost;o&&typeof o.then==\"function\"&&Promise.resolve(o).then(a=>{!this.observeLoss||this.state!==\"alive\"||(this.lossInfo=a,this.state=\"lost\")},()=>{})}get limits(){return y(this,oe,ye).call(this,\"Device.limits\"),this.gpu.limits}get features(){return y(this,oe,ye).call(this,\"Device.features\"),this.gpu.features}createShader(t){y(this,oe,ye).call(this,\"Device.createShader\");const n=typeof t==\"string\"?il(t):t;return new El(this.gpu.createShaderModule({code:n.wgsl}),n)}createTexture(t){y(this,oe,ye).call(this,\"Device.createTexture\"),Tl(t,this.gpu);const n=Js(t);return new Fe(this,this.gpu.createTexture(Pl(n)),n)}createBuffer(t){y(this,oe,ye).call(this,\"Device.createBuffer\");const n=Al(t);n&&this.captureError(n);const r=n?_l(Math.max(4,t.size||4)):Rl(t);return new Se(this,this.gpu.createBuffer(r),t)}wrapBuffer(t){if(y(this,oe,ye).call(this,\"Device.wrapBuffer\"),!Fl(t))throw new J({code:\"VGPU-EXTERNAL-BUFFER-INVALID\",message:\"Device.wrapBuffer requires a GPUBuffer with finite size and usage properties.\",where:\"Device.wrapBuffer\",fix:\"Pass a live GPUBuffer created for this GPUDevice.\"});const n={size:t.size,usage:Dl(t.usage),...t.label?{label:t.label}:{}};return new Se(this,t,n,\"external\")}pushErrorScope(t){var n,r;y(this,oe,ye).call(this,\"Device.pushErrorScope\"),this.scopes.push([]),(r=(n=this.gpu).pushErrorScope)==null||r.call(n,t)}async popErrorScope(){var r,i;y(this,oe,ye).call(this,\"Device.popErrorScope\");const t=this.scopes.pop(),n=await((i=(r=this.gpu).popErrorScope)==null?void 0:i.call(r));return y(this,oe,ye).call(this,\"Device.popErrorScope\"),(t==null?void 0:t[0])??Cl(n)??null}destroy(){if(this.state===\"disposed\")return;const t=this.state===\"lost\";this.state=\"disposed\",this.observeLoss=!1,this.scopes.length=0,this.readback.destroy(),this.ownership===\"owned\"&&!t&&this.gpu.destroy()}dispose(){this.destroy()}captureError(t){const n=this.scopes.at(-1);if(n)n.push(t);else throw t}}oe=new WeakSet,ye=function(t){var i,s;if(this.state===\"alive\")return;if(this.state===\"disposed\")throw new J({code:\"VGPU-DEVICE-DISPOSED\",message:\"The GPU device wrapper has been disposed.\",where:t,fix:\"Create a new Gpu instance before performing more work.\"});const n=(i=this.lossInfo)==null?void 0:i.reason,r=(s=this.lossInfo)==null?void 0:s.message;throw new J({code:\"VGPU-DEVICE-LOST\",message:`The GPU device was lost${n?` (${n})`:\"\"}${r?`: ${r}`:\".\"}`,where:t,cause:this.lossInfo})};function Al(e){return!Number.isFinite(e.size)||e.size<=0?to(\"Buffer size must be greater than zero.\"):e.usage.length===0?to(\"Buffer usage must not be empty.\"):null}function to(e){return new J({code:\"VGPU-CORE-INVALID-USAGE\",message:e,where:\"Device.createBuffer\"})}function Rl(e){return{label:e.label,size:e.size,usage:Dn(e.usage)}}function Cl(e){return e?new J({code:\"VGPU-CORE-VALIDATION\",message:e.message,where:\"GPUDevice.popErrorScope\",cause:e}):null}function Fl(e){if(typeof e!=\"object\"&&typeof e!=\"function\"||e===null)return!1;const t=e;return Number.isSafeInteger(t.size)&&(t.size??-1)>=0&&Number.isSafeInteger(t.usage)&&(t.usage??-1)>=0&&typeof t.destroy==\"function\"}const Ll=[\"map_read\",\"map_write\",\"copy_src\",\"copy_dst\",\"index\",\"vertex\",\"uniform\",\"storage\",\"indirect\",\"query_resolve\"];function Dl(e){return Ll.filter(t=>(e&Dn([t]))!==0)}const no=new WeakMap,ro=new WeakMap;function io(e,t){return no.set(e,Ml(t)),e}function Yt(e){return no.get(e)}function Ul(e,t){const n=Yt(t);return n&&ro.set(e,{layout:n}),e}function so(e){return ro.get(e)}function Ml(e){return{entries:e.entries.map(t=>({...t}))}}function Gl(e,t){const n=ao(e).createBindGroupLayout({label:t.label,entries:[...t.entries]});return io(n,{entries:t.entries})}function Ol(e,t){if(!t.layout)throw new J({code:\"VGPU-CORE-BIND-GROUP-LAYOUT-REQUIRED\",message:'createBindGroup requires an explicit layout. vgpu does not use layout: \"auto\" for bind groups.',where:\"createBindGroup\"});const n=ao(e).createBindGroup({label:t.label,layout:t.layout,entries:[...t.entries]});return Ul(n,t.layout)}const oo={uniform:Vl,storage:Nl,readonlyStorage:Bl,texture:zl,storageTexture:ql,sampler:jl,resource:Wl};function Vl(e,t,n={}){return{binding:bt(e),visibility:Qt(t),buffer:{...n,type:\"uniform\"}}}function Nl(e,t,n={}){return{binding:bt(e),visibility:Qt(t),buffer:{...n,type:\"storage\"}}}function Bl(e,t,n={}){return{binding:bt(e),visibility:Qt(t),buffer:{...n,type:\"read-only-storage\"}}}function zl(e,t,n={}){return{binding:bt(e),visibility:Qt(t),texture:n}}function ql(e,t,n){return{binding:bt(e),visibility:Qt(t),storageTexture:n}}function jl(e,t,n={}){return{binding:bt(e),visibility:Qt(t),sampler:n}}function Wl(e,t){return{binding:bt(e),resource:Hl(t)}}function ao(e){return e instanceof pi||\"gpu\"in e?e.gpu:e}function Hl(e){return e instanceof Se?{buffer:e.gpu}:e instanceof Fe||Yl(e)?e.createView():Xl(e)?{buffer:e.gpu}:Kl(e)?e:co(e)?{buffer:e}:e}function Kl(e){return vr(e)&&\"buffer\"in e}function co(e){return vr(e)&&\"size\"in e&&\"usage\"in e&&typeof e.destroy==\"function\"}function Xl(e){return vr(e)&&co(e.gpu)}function Yl(e){return vr(e)&&typeof e.createView==\"function\"&&\"gpu\"in e}function bt(e){if(!Number.isInteger(e)||e<0)throw new J({code:\"VGPU-CORE-BINDING-INVALID\",message:\"Binding entries require an explicit non-negative integer binding number.\",where:\"bind\"});return e}function Qt(e){return typeof e==\"number\"?e:(typeof e==\"string\"?e.split(/[|,\\s]+/):e).reduce((n,r)=>n|Ql(r),0)}function Ql(e){const t=e.trim().toLowerCase(),n=globalThis.GPUShaderStage,i={vertex:(n==null?void 0:n.VERTEX)??1,fragment:(n==null?void 0:n.FRAGMENT)??2,compute:(n==null?void 0:n.COMPUTE)??4}[t];if(!i)throw new J({code:\"VGPU-CORE-VISIBILITY-INVALID\",message:`Unknown shader stage visibility '${e}'.`,where:\"bind\"});return i}function vr(e){return typeof e==\"object\"&&e!==null}let _=class extends fi{};function uo(e,t,n=\"resource\"){return new _({code:\"VGPU-R1-BINDING-DESTROYED\",message:`Binding '${t.name}' (@group(${t.group}) @binding(${t.binding})) in '${e}' refers to destroyed resource '${n}'.`,where:`${e}.${t.name}`,fix:`Create a live resource and call set({ ${t.name}: replacement }). Direct attachment references do not follow target.resize(); bind the Target itself to follow replacements. Re-record bundles that captured the old resource.`,detail:{binding:t.binding,bindingName:t.name,resourceName:n}})}function Zl(e,t,n,r,i,s){const o=t===\"vertex\"?\"Vertex\":\"Fragment\",a=t===\"vertex\"?\"VERTEX\":\"FRAGMENT\",c=`maxStorageBuffersIn${o}Stage`;return new _({code:`VGPU-LIMIT-STORAGE-${a}`,message:`${o} entry '${n}' in '${e}' uses ${r} storage buffer(s), but device limit ${c} is ${i}.`,fix:t===\"vertex\"?`Request init({ requiredLimits: { ${c}: ${r} } }) if the adapter supports it, or move vertex data to geometry(gpu, ...) vertex streams.`:`Request init({ requiredLimits: { ${c}: ${r} } }) if the adapter supports it, or reduce fragment storage buffers.`,where:`${e}.pipelineLayout`,detail:{stage:t,entryPoint:n,count:r,limit:i,bindings:s.map(({name:u,group:f,binding:d})=>({name:u,group:f,binding:d}))}})}function Jl(e,t,n,r,i){return new _({code:\"VGPU-SET-TEXTURE-FILTERABILITY\",message:`${r} (${n}) cannot satisfy filtering texture '${t.name}' @group(${t.group}) @binding(${t.binding}).`,fix:\"Use a filterable format; request float32-filterable for rgba32float when supported; or use textureLoad without a sampler.\",where:`${e}.set`,detail:{format:n,group:t.group,binding:t.binding,bindingName:t.name,resourceName:r,samplerName:i==null?void 0:i.name,samplerGroup:i==null?void 0:i.group,samplerBinding:i==null?void 0:i.binding}})}function ef(e,t){const n=Bf(e,t);return new _({code:\"VGPU-R1-BINDING-NEVER-SET\",message:`Unset \\`${t.name}\\` @group(${t.group}) @binding(${t.binding}) in '${e}'. Fix: ${n}; or ${e}.group(${t.group}, bindGroup).`,where:`${e}.draw`})}function lo(e,t){const n=t===\"lib\"?\"lib-owned by its first JS set()\":\"user-owned by its first resource set()\",r=t===\"lib\"?`Fix: pass a resource from the start: wave.set({ ${e}: new Uniform(gpu.device, { size: 4 }) }).`:`Fix: pass JS values from the first set(): wave.set({ ${e}: jsValue }).`;return new _({code:\"VGPU-R1-OWNERSHIP-FLIP\",message:`\\`${e}\\` is ${n}; ownership cannot change. ${r}`,where:\"set\"})}function tf(e,t){return new _({code:\"VGPU-R4-GROUP-CLAIMED\",message:`group ${t} of '${e}' is claimed; set() cannot update it.`,fix:`Call set() first, or build from ${e}.layout(${t}); pass dynamic offsets to p.draw().`,where:`${e}.set`})}function nf(e,t,n,r){return new _({code:\"VGPU-R4-GROUP-INCOMPATIBLE\",message:`claimed group ${t} in '${e}' is incompatible: ${n}.`,fix:`Build from ${e}.layout(${t}, { dynamicOffsets? }) then call ${e}.group(${t}, bindGroup).`,where:`${e}.group`,cause:r})}function Zt(e,t,n){return new _({code:\"VGPU-R4-GROUP-VALIDATION\",message:`WebGPU rejected claimed group ${t} in '${e}'.`,fix:`Build from ${e}.layout(${t}); pass offsets via p.draw(draw, { offsets: { ${t}: [...] } }).`,where:`${e}.draw`,cause:n,detail:{drawLabel:e,group:t}})}function fo(e,t){return new _({code:\"VGPU-BLEND-INVALID\",message:`Invalid blend '${String(t)}' in '${e}'.`,fix:'Use \"alpha\", \"additive\", \"premultiplied\", or { color, alpha? } components.',where:\"draw\"})}function ho(e,t){return new _({code:\"VGPU-BLEND-CONSTANT-INVALID\",message:`Invalid blendConstant in '${e}': ${t}`,fix:'Use [r, g, b, a] finite numbers with a blend whose color or alpha uses \"constant\"/\"one-minus-constant\"; omit it to keep the pass default (0, 0, 0, 0).',where:\"draw\"})}function rf(e,t){return new _({code:\"VGPU-BUNDLE-BLEND-CONSTANT\",message:`bundle '${e}' cannot record draw '${t}': blendConstant is render-pass state and render bundle encoders cannot set it.`,fix:\"Encode the draw with p.draw(...) in a frame pass, or drop blendConstant from the draw.\",where:\"bundle\"})}function mo(e,t){return new _({code:\"VGPU-WRITEMASK-INVALID\",message:`Invalid writeMask ${t} in '${e}'.`,fix:\"Use an array of r/g/b/a; omit it for all channels.\",where:\"draw\"})}function gi(e,t,n=\"draw\"){return new _({code:\"VGPU-COLORS-INVALID\",message:`Invalid colors in '${e}': ${t}`,fix:\"Use one { blend?, writeMask? } or null entry per color attachment of the target, aligned by index; omit colors to apply the top-level blend/writeMask to every attachment.\",where:n})}function sf(e,t){return new _({code:\"VGPU-CULL-INVALID\",message:`Invalid cull '${String(t)}' in '${e}'.`,fix:'Use \"none\", \"front\", or \"back\"; omit it for no culling.',where:\"draw\"})}function of(e,t){return new _({code:\"VGPU-FRONTFACE-INVALID\",message:`Invalid frontFace '${String(t)}' in '${e}'.`,fix:'Use \"ccw\" or \"cw\"; omit it for counter-clockwise.',where:\"draw\"})}function po(e,t){return new _({code:\"VGPU-UNCLIPPED-DEPTH-INVALID\",message:`Invalid unclippedDepth in '${e}': ${t}`,fix:'Use a boolean. unclippedDepth: true needs the \"depth-clip-control\" device feature — request it with init({ requiredFeatures: [\"depth-clip-control\"] }) on an adapter that supports it. Omit the option to keep depth clipping.',where:\"draw\"})}function Le(e,t){return new _({code:\"VGPU-DEPTH-INVALID\",message:`Invalid depth in '${e}': ${t}`,fix:'Use false or { write?, compare?, bias?, biasSlopeScale?, biasClamp? }; omit it for { write: true, compare: \"less-equal\" }.',where:\"draw\"})}function Jt(e,t,n=\"draw\"){return new _({code:\"VGPU-STENCIL-INVALID\",message:`Invalid stencil in '${e}': ${t}`,fix:`Use { front?, back?, readMask?, writeMask?, ref? } with GPUCompareFunction/GPUStencilOperation faces and u32 masks, against a target whose depth format has a stencil aspect (depth: \"depth24plus-stencil8\"); omit it for WebGPU's pass-through defaults.`,where:n})}function af(e,t){return new _({code:\"VGPU-BUNDLE-STENCIL-REF\",message:`bundle '${e}' cannot record draw '${t}': stencil.ref is render-pass state and render bundle encoders cannot set it.`,fix:\"Encode the draw with p.draw(...) in a frame pass, or drop ref from the draw's stencil.\",where:\"bundle\"})}function _r(e,t,n=\"draw\"){return new _({code:\"VGPU-MULTISAMPLE-INVALID\",message:`Invalid multisample in '${e}': ${t}`,fix:\"Use { alphaToCoverage?, mask? }: alphaToCoverage needs a target created with msaa: true, and mask must be an integer in [0, 0xFFFFFFFF] (bits above the target's sampleCount are ignored). Omit multisample for full-coverage defaults.\",where:n})}function Sr(e,t,n=\"draw\"){return new _({code:\"VGPU-CONSTANTS-INVALID\",message:`Invalid constants in '${e}': ${t}`,fix:\"Key WGSL `override` constants by name, or by the decimal string of N when the declaration has @id(N); values are finite numbers or booleans, converted to the override's WGSL type (bool/i32/u32/f32/f16). Every override without a default value must be provided. Omit constants to keep the WGSL defaults.\",where:n})}function Er(e,t,n=\"draw\"){return new _({code:\"VGPU-ENTRY-INVALID\",message:`Invalid entry in '${e}': ${t}`,fix:\"Name an entry point declared in the shader with the matching stage — { vertex?, fragment? } strings for draw, one @compute name string for compute. Omit entry (or a field) to use the first entry point of that stage.\",where:n})}function yt(e,t,n){return new _({code:\"VGPU-INDIRECT-INVALID\",message:`Invalid indirect in '${e}': ${t}`,fix:\"Pass a storage buffer created with storage(gpu, bytes, { indirect: true }) — bare, or as { buffer, offset? } with a 4-aligned byte offset — sized so the GPU-read arguments fit: 16 bytes for drawIndirect, 20 for drawIndexedIndirect, 12 for dispatchWorkgroupsIndirect. Omit indirect to use CPU-side counts.\",where:n})}function cf(){return new _({code:\"VGPU-PASS-PRESERVE-MSAA\",message:\"clear:false cannot preserve MSAA; use a non-MSAA target.\",fix:\"Use non-MSAA for accumulation.\",where:\"Frame.pass\"})}function go(e,t=\"expected a number in [0, 1].\",n='Use 1 (default), or 0 with depth: { compare: \"greater\" } for reversed-Z.'){return new _({code:\"VGPU-PASS-CLEARDEPTH-INVALID\",message:`clearDepth received ${String(e)}; ${t}`,fix:n,where:\"Frame.pass\"})}function De(e){return new _({code:\"VGPU-PASS-VIEWPORT-INVALID\",message:`Invalid viewport: ${e}`,fix:\"Use { x?, y?, width, height, minDepth?, maxDepth? } finite numbers within device limits; omit it for the full target.\",where:\"Frame.pass\"})}function bi(e){return new _({code:\"VGPU-PASS-SCISSOR-INVALID\",message:`Invalid scissor: ${e}`,fix:\"Use [x, y, width, height] non-negative integers with x + width and y + height within the target's current pixel size; omit it for the full target.\",where:\"Frame.pass\"})}function uf(){return new _({code:\"VGPU-PASS-PRESERVE-CLEARDEPTH\",message:\"clear:false preserves depth; clearDepth cannot apply.\",fix:\"Remove clearDepth, or let the pass clear.\",where:\"Frame.pass\"})}function bo(e){return new _({code:\"VGPU-PASS-CLEARSTENCIL-INVALID\",message:`clearStencil ${e}`,fix:`Use an integer in [0, 0xFFFFFFFF] on a target whose depth format has a stencil aspect, e.g. depth: \"depth24plus-stencil8\"; the value is masked to the stencil aspect's bit width.`,where:\"Frame.pass\"})}function lf(){return new _({code:\"VGPU-PASS-PRESERVE-CLEARSTENCIL\",message:\"clear:false preserves stencil; clearStencil cannot apply.\",fix:\"Remove clearStencil, or let the pass clear.\",where:\"Frame.pass\"})}function wt(e,t,n=\"Frame.pass\"){return new _({code:\"VGPU-PASS-DEPTH-READONLY\",message:`depthReadOnly ${e}`,fix:t,where:n})}function ff(){return new _({code:\"VGPU-PASS-DEPTH-READONLY-MSAA\",message:`depthReadOnly cannot read an MSAA target's depth: multisampled depth is stored with storeOp \"discard\", so a read-only pass tests against discarded contents.`,fix:\"Use a non-MSAA target for read-only depth, or drop depthReadOnly and let the pass own its depth.\",where:\"Frame.pass\"})}function en(e,t,n=\"timer\"){return new _({code:\"VGPU-TIMER-INVALID\",message:`Invalid timer use: ${e}`,fix:t,where:n})}function df(e,t){return new _({code:\"VGPU-TIMER-CAPACITY\",message:`frame exceeds ${e} timed spans; a timer holds one timestamp query set and WebGPU createQuerySet requires count <= ${t} (2 queries per span).`,fix:\"Time fewer passes per frame, or spread timing across frames.\",where:\"Frame.pass\"})}function tn(e,t,n=\"visibility\"){return new _({code:\"VGPU-VIS-INVALID\",message:`Invalid visibility use: ${e}`,fix:t,where:n})}function hf(e,t){return new _({code:\"VGPU-VIS-CAPACITY-LIMIT\",message:`capacity received ${String(e)}; expected an integer in [1, ${t}] — a visibility instance holds one occlusion query set and WebGPU createQuerySet requires count <= ${t}.`,fix:`Use visibility(gpu, { capacity }) with an integer capacity of at most ${t} (default 64), or create several visibility instances.`,where:\"visibility\"})}function mf(e){return new _({code:\"VGPU-VIS-CAPACITY\",message:`frame uses more than the declared ${e} occlusion query slot(s); the query set is bound to this frame's pass descriptors and cannot grow mid-frame.`,fix:\"Raise visibility(gpu, { capacity }) (max 4096), or dispose() unused query handles so fewer slots are needed per frame.\",where:\"FramePass.occlusion\"})}function pf(e){return new _({code:\"VGPU-VIS-LABEL-DUPLICATE\",message:`query label '${e}' is already live on this visibility instance.`,fix:\"Reuse the existing handle — vis.query(label) handles are stable, created once outside the loop — or dispose() the old handle first, or pick a distinct label.\",where:\"Visibility.query\"})}function yi(e,t){return new _({code:\"VGPU-VIS-DISPOSED\",message:`the ${e} is disposed.`,fix:e===\"visibility\"?\"Create a new instance with visibility(gpu).\":\"Create a new handle with vis.query(label).\",where:t})}function gf(){return new _({code:\"VGPU-VIS-NO-DEPTH\",message:'visibility is set, but the pass target has no depth attachment; without depth testing an occlusion query passes for anything rasterized, so it always reports \"visible\" and is useless for culling.',fix:\"Create the target with depth: true (or a depth format), or drop visibility from this pass.\",where:\"Frame.pass\"})}function bf(){return new _({code:\"VGPU-QUERY-NO-VISIBILITY\",message:\"occlusion() needs the pass to be opened with a visibility instance; the render pass has no occlusionQuerySet to write into.\",fix:\"Open the pass with f.pass({ target, visibility: vis }, ...) using the visibility(gpu) instance that created the query handle.\",where:\"FramePass.occlusion\"})}function yf(){return new _({code:\"VGPU-QUERY-NESTED\",message:\"occlusion() cannot nest inside an active occlusion() body; WebGPU allows one active occlusion query per pass at a time.\",fix:\"Encode each occlusion scope sequentially: p.occlusion(a, ...); p.occlusion(b, ...).\",where:\"FramePass.occlusion\"})}function wf(e){return new _({code:\"VGPU-QUERY-DUPLICATE\",message:`query '${e}' was already used this frame; a slot holds one result per frame, so reuse would silently overwrite it.`,fix:`Use one handle per measured object per frame, e.g. vis.query(\"${e}-2\") for a second scope.`,where:\"FramePass.occlusion\"})}function wi(e=\"Frame.pass\"){return new _({code:\"VGPU-TARGET-REQUIRED\",message:\"Target required. Fix: pass surface(gpu, canvas) or target(gpu, { size }) as { target }.\",where:e})}function Ee(e,t,n,r){return new _({code:e,message:`${e}: ${n}`,fix:r,where:t})}function ee(e,t){return Ee(\"VGPU-MESH-LAYOUT-INVALID\",e,t,\"Fix attributes/formats/offsets; use non-numeric names and 4-aligned stride <= 2048.\")}function yo(e,t){return Ee(\"VGPU-MESH-LIMIT-EXCEEDED\",e,t,\"Use <= 8 buffers and <= 16 attributes (or the device limits).\")}function wo(e,t){return Ee(\"VGPU-MESH-LOCATION-CONFLICT\",e,`Duplicate geometry @location(${t}).`,\"Use unique locations, or omit them for name matching.\")}function xo(e,t){return Ee(\"VGPU-MESH-DATA-MISALIGNED\",e,t,\"Fix: repack data, set matching stride, or give raw buffers an explicit count.\")}function nn(e,t){return Ee(\"VGPU-MESH-RANGE-INVALID\",e,t,\"Use index ranges for indexed geometries, vertex ranges otherwise, within geometry counts.\")}function rn(e,t){return Ee(\"VGPU-MESH-WRITE-RANGE\",e,t,\"Write within the buffer byteLength, or create a larger geometry.\")}function xf(e,t,n=[]){return Ee(\"VGPU-MESH-ATTRIBUTE-UNMATCHED\",e,`Geometry attribute '${t}' has no shader input.`,`Use shader name${n.length?` (${n.join(\",\")})`:\"\"} or { location:n }.`)}function vf(e,t,n){return Ee(\"VGPU-MESH-ATTRIBUTE-UNMATCHED\",e,`Geometry attribute '${t}' matches locations ${n.join(\",\")}.`,\"Rename inputs or set { location:n }.\")}function _f(e,t,n=[]){return Ee(\"VGPU-MESH-INPUT-MISSING\",e,`Geometry lacks shader input '${t}'.`,`Add/remove it. Geometry attributes: ${n.join(\",\")||\"none\"}.`)}function Sf(e,t,n,r){return Ee(\"VGPU-MESH-FORMAT-MISMATCH\",e,`Attribute '${t}' ${n} != shader ${r}.`,\"Match the float/sint/uint shader base type; widths may differ.\")}function Ef(e){return new _({code:\"VGPU-PIPELINE-LAYOUT-GAP\",message:`Pipeline bind group ${e} is missing.`,fix:\"Use consecutive @group() indices starting at 0.\",where:\"pipeline layout\"})}function Un(e,t,n){return new _({code:\"VGPU-COMPILE-FAILED\",message:\"WebGPU pipeline compilation failed.\",fix:\"Check WGSL, vertex layouts, and target signature.\",where:e,cause:t,detail:n?{signature:n}:void 0})}function vo(e){return new _({code:\"VGPU-COMPILE-DISPOSED\",message:\"GPU disposed during pipeline compilation.\",where:e})}function Ir(e,t){return new _({code:\"VGPU-COMPILE-SIGNATURE-INVALID\",message:`Invalid TargetSignature: ${t}`,fix:\"Pass { colors, depth?, sampleCount?:1|4 } or a Target.\",where:e})}function If(e){return new _({code:\"VGPU-TARGET-DEPTH-STENCIL-ONLY\",message:`depth received '${e}'; stencil-only depth targets are not supported yet.`,fix:'Use a format with a depth aspect such as \"depth24plus\" or \"depth24plus-stencil8\".',where:\"target\"})}function _o(){return new _({code:\"VGPU-TARGET-SIZE-REQUIRED\",message:\"Target size required. Fix: target(gpu, { size: [w,h] }); update surface-derived targets in onResize.\",where:\"target\"})}function xi(e){return new _({code:\"VGPU-SURFACE-NOT-IN-FRAME\",message:\"Surface targets are only available inside frame(gpu).\",fix:\"surface passes must run inside frame(gpu, ...); precompile against an offscreen target(gpu, ...) instead\",where:e})}function kf(){return new _({code:\"VGPU-SURFACE-CONTEXT\",message:\"Canvas WebGPU context failed. Fix: check navigator.gpu and remove any existing 2d/webgl context.\",where:\"surface\"})}function $f(e){return new _({code:\"VGPU-SURFACE-DUPLICATE\",message:`Canvas already has surface${e?` '${e}'`:\"\"}. Fix: reuse or dispose it.`,where:\"surface\"})}function Tf(e){return new _({code:\"VGPU-SURFACE-DISPOSED\",message:`Surface '${e??\"surface\"}' is disposed. Fix: call surface(gpu, canvas).`,where:\"surface\"})}function Pf(){return new _({code:\"VGPU-SURFACE-AUTORESIZE-UNSUPPORTED\",message:\"autoResize needs clientWidth. Fix: call surface.resize([w,h]) for OffscreenCanvas; onResize still fires.\",where:\"surface\"})}function Af(e){return new _({code:\"VGPU-SURFACE-RESIZE-REENTRANT\",message:`Cannot resize this surface${e?` '${e}'`:\"\"} in onResize. Fix: resize derived targets only.`,where:\"surface.resize\"})}function Rf(e){return new _({code:\"VGPU-CLEAR-COLOR-INVALID\",message:`Invalid ${e}: expected four finite numbers.`,fix:\"Assign [r, g, b, a] or a GPUColor object ({ r, g, b, a }).\",where:e})}function Cf(e){return new _({code:\"VGPU-CLOCK-DELTA-INVALID\",message:`clock.advance() received ${String(e)}; expected a finite, non-negative number of seconds.`,fix:\"Pass the elapsed seconds, e.g. clock(gpu).advance(1 / 60); use frame(gpu) alone to advance with wall-clock time.\",where:\"clock.advance\"})}function So(){return new _({code:\"VGPU-FRAME-REENTRANT\",message:\"Nested frame(gpu) is invalid. Fix: queue work for the next frame.\",where:\"frame\"})}function Ff(e,t){return new _({code:\"VGPU-QUERY-READBACK\",message:`${e} dropped a query readback: ${Of(t)}`,fix:\"Usually a lost or destroyed device: recreate the gpu (and the timer/visibility instance) before reading queries again. Results resume on the next successful readback; the frame itself is unaffected.\",where:\"QueryRing.onSubmitted\",cause:t})}function Eo(e){return new _({code:\"VGPU-FRAME-CANCELED\",message:\"the frame was canceled; its command encoder was dropped and nothing more can be encoded or submitted on it.\",fix:\"Open a new frame(gpu) for further work; cancel() is the last operation on a frame.\",where:e})}function Lf(e){return new _({code:\"VGPU-FRAME-PASS-ACTIVE\",message:\"the frame cannot be canceled while a pass callback is active.\",fix:\"Return from the frame.pass(...) callback first, then call frame.cancel(); this keeps pass descriptor resources alive until the pass is closed.\",where:e})}function Df(e){return new _({code:\"VGPU-FRAME-SUBMITTED\",message:\"the frame was already submitted; submitted GPU work cannot be canceled.\",fix:\"Call cancel() only on a frame you decided not to submit; the frame you did submit needs no cleanup.\",where:e})}function se(e,t,n){return new _({code:\"VGPU-R1-BINDING-INCOMPATIBLE-RESOURCE\",message:`binding \\`${e.name}\\` @group(${e.group}) @binding(${e.binding}) needs ${t}.`,fix:n,where:\"set\"})}function G(e,t,n){return new _({code:\"VGPU-RING1-UNSUPPORTED\",message:t,fix:n,where:e})}function Uf(e,t){return new _({code:\"VGPU-SET-VALUE-INVALID\",message:`Invalid WGSL value at '${e.path}': ${t}.`,fix:\"Pass the exact reflected structure, vector, matrix, and array shapes; use integral in-range values for i32/u32.\",where:\"set\",detail:e})}function kr(e){return Vf(e)&&e.version!==1?new _({code:\"VGPU-SHADER-SOURCE-INVALID\",message:`VGPU-SHADER-SOURCE-INVALID: unsupported ShaderSource v${String(e.version)}; expected v1. Fix: update vgpu or regenerate it.`,where:\"shader source\"}):new _({code:\"VGPU-SHADER-SOURCE-INVALID\",message:`VGPU-SHADER-SOURCE-INVALID: expected WGSL or { version, wgsl }, got ${Nf(e)}. Fix: configure @vgpu/wgsl loader-vite or loader-webpack.`,where:\"shader source\"})}function Mf(e){return new _({code:\"VGPU-R1-STORAGE-ALIASING\",message:\"`src` and writable `dst` alias. Fix: alternate them with pingPongStorage(gpu).\",where:e})}function Gf(e){return new _({code:\"VGPU-R1-SHARED-UNIFORMS-LAYOUT-MISMATCH\",message:`Uniform '${e.bindingName}' layout ${e.adoptedLayout} from ${e.adoptedSource} != ${e.incomingLayout} from ${e.incomingSource}. Fix: align structs or split uniforms.`,where:\"uniforms\"})}function Of(e){return e instanceof Error?`${e.name}: ${e.message}`:String(e)}function Vf(e){return typeof e==\"object\"&&e!==null&&\"version\"in e}function Nf(e){if(typeof e!=\"object\"||e===null)return typeof e;try{const t=JSON.stringify(e);return t.length>80?`${t.slice(0,77)}...`:t}catch{return\"object\"}}function Bf(e,t){switch(t.kind){case\"sampler\":return`${e}.set({${t.name}:sampler(gpu)})`;case\"texture\":return`${e}.set({${t.name}:scene.color})`;case\"buffer\":return t.addressSpace===\"uniform\"?`${e}.set({${t.name}:{ /* values */ }})`:`${e}.set({${t.name}:buffer})`;default:return`${e}.set({${t.name}:resource})`}}const Io=[\"scheduler\",\"resource\",\"service\"];function Mn(e){return{name:e}}const ko=new WeakMap;function zf(e){const t=ko.get(e);if(!t)throw new _({code:\"VGPU-GPU-FOREIGN\",message:\"This object was not created by init(); it has no vgpu kernel.\",fix:\"Pass the gpu returned by init() from vgpu, vgpu/node or vgpu/mock.\",where:\"gpu\"});return t}class qf{constructor(t){m(this,\"device\");w(this,kt,new Map);w(this,Wn,new Map(Io.map(t=>[t,new Set])));w(this,$t,new Set);w(this,fn,new Set);w(this,Tt,new Set);w(this,Pt,!1);this.device=t}get disposed(){return l(this,Pt)}service(t,n){const r=l(this,kt).get(t);if(r!==void 0)return r;const i=n(this);return l(this,kt).set(t,i),i}peekService(t){return l(this,kt).get(t)}own(t,n){const r=l(this,Wn).get(t);return r.add(n),()=>{r.delete(n)}}addErrorListener(t){return l(this,$t).add(t),()=>{l(this,$t).delete(t)}}reportError(t){if(l(this,Pt))return Promise.resolve();const n=Promise.resolve().then(()=>{const r=[...l(this,$t)];if(!r.length){console.error(t);return}for(const i of r)try{i(t)}catch(s){console.error(s)}});return this.trackDelivery(n)}trackDelivery(t){const n=Promise.resolve(t).then(()=>{},r=>{console.error(r)});return l(this,fn).add(n),n.finally(()=>l(this,fn).delete(n)),n}registerSettledSource(t){return l(this,Tt).add(t),()=>{l(this,Tt).delete(t)}}async settled(){const t=[...l(this,fn),...[...l(this,Tt)].flatMap(n=>n())];await Promise.allSettled(t)}dispose(){if(!l(this,Pt)){x(this,Pt,!0);for(const t of Io){const n=l(this,Wn).get(t);for(const r of[...n])r();n.clear()}l(this,kt).clear(),l(this,Tt).clear(),l(this,$t).clear(),this.device.dispose()}}}kt=new WeakMap,Wn=new WeakMap,$t=new WeakMap,fn=new WeakMap,Tt=new WeakMap,Pt=new WeakMap;function $o(e){const t=new qf(e),n={device:e,gpu:e.gpu,get disposed(){return t.disposed},onError:r=>t.addErrorListener(r),settled:()=>t.settled(),dispose:()=>{t.dispose()}};return ko.set(n,t),n}async function jf(e,t={},n){return $o(await Wf(e,t,n))}async function Wf(e,t,n){return t.adapter||n?(t.adapter??n()).requestDevice(t):Hf(t)}async function Hf(e){var i;const n=await((i=globalThis.navigator.gpu)==null?void 0:i.requestAdapter({powerPreference:e.powerPreference}));if(!n)throw G(\"init\",\"navigator.gpu.requestAdapter() returned null.\");Zu(n.features,e.requiredFeatures);const r=await n.requestDevice({requiredFeatures:e.requiredFeatures,requiredLimits:e.requiredLimits});return new pi(r,n.info??null)}function M(e,t){e.assertUsable(t)}function vi(e,t){e.assertUsable(t)}async function Kf(e){if(!Xf(e))throw Yf(\"VGPU-INIT-DEVICE-INVALID\",\"Invalid external GPUDevice shape.\");const t=new pi(e,null,\"external\");await Promise.resolve();try{return M(t,\"initFromDevice\"),$o(t)}catch(n){throw t.dispose(),n}}function Xf(e){if(typeof e!=\"object\"&&typeof e!=\"function\"||e===null)return!1;try{const t=e;return(typeof t.queue==\"object\"||typeof t.queue==\"function\")&&t.queue!==null&&typeof t.createBuffer==\"function\"&&typeof t.createCommandEncoder==\"function\"&&!!t.lost&&typeof t.lost.then==\"function\"}catch{return!1}}function Yf(e,t){return new _({code:e,message:t,where:\"initFromDevice\"})}const _i=Symbol(\"vgpu.bindingResource\");function Qf(e){return typeof(typeof e==\"object\"&&e!==null?e[_i]:void 0)==\"function\"?e:void 0}const sn=Symbol(\"vgpu.geometry.layoutResolver\");function Y(e,t){const n=zf(e);if(n.disposed)throw To(t);return n}function To(e){return new _({code:\"VGPU-GPU-DISPOSED\",message:`${e}() ran after gpu.dispose(); the device and everything it owned are gone.`,fix:\"Create resources before disposing the gpu, or init() a new one.\",where:e})}function Po(e,t){let n=()=>{};const r=t({trackSettled:i=>{e.trackDelivery(i)},errorSink:i=>e.reportError(i),onDispose:()=>{n()}});return n=e.own(\"resource\",()=>r.dispose()),r}function on(e,t,n,r){const i=e.own(\"resource\",()=>n(t));return r==null||r(i),t}class Ao{constructor(t,n){m(this,\"vertexCount\");m(this,\"indexCount\");m(this,\"instanceCount\");m(this,\"vertexBuffers\");m(this,\"indexBuffer\");m(this,\"indexFormat\");m(this,\"vertexBufferLayouts\");m(this,\"topology\");m(this,\"stripIndexFormat\");m(this,\"buffers\");w(this,At);w(this,dn);w(this,hn);w(this,Hn,new Map);w(this,Rt,new Set);w(this,nt,!1);const r=\"geometry\";if(n.buffers.length>8)throw yo(r,`${n.buffers.length} vertex buffers exceed limit 8.`);let i=0;const s=new Set,o=n.buffers.map((h,g)=>{const b=rd(t,h,`${r}.buffers[${g}]`);i+=b.attributes.length;for(const v of b.attributes)if(v.location!==void 0){if(s.has(v.location))throw wo(`${r}.buffers[${g}]`,v.location);s.add(v.location)}return b}),a=t.gpu.limits.maxVertexAttributes;if(i>a)throw yo(r,`${i} attributes exceed device limit ${a}.`);const c=n.topology??\"triangle-list\";if(!od.has(c))throw ee(r,`Invalid topology: ${String(c)}.`);const u=id(t,n,r),f=Co(o,\"vertex\"),d=Co(o,\"instance\");Fo(o,\"vertex\",n.vertexCount??f,r),Fo(o,\"instance\",n.instanceCount??d,r),Si(r,\"vertexCount\",n.vertexCount,f),Si(r,\"instanceCount\",n.instanceCount,d),Si(r,\"indexCount\",n.indexCount,u.count),this.topology=c,this.stripIndexFormat=c.endsWith(\"strip\")?u.format:void 0,x(this,hn,o),this.vertexBufferLayouts=Object.freeze(o.map(h=>h.layout)),this.vertexBuffers=Object.freeze(o.map(h=>h.gpu)),this.buffers=Object.freeze(o.map((h,g)=>new Zf(`${r}.buffers[${g}]`,h))),this.vertexCount=n.vertexCount??f,this.instanceCount=n.instanceCount??d,this.indexBuffer=u.gpu,this.indexFormat=u.format,this.indexCount=n.indexCount??u.count,x(this,At,u.owned),x(this,dn,u.byteLength),sd(this)}[sn](t,n){if(l(this,nt))throw ee(n,\"Geometry is destroyed; create a live geometry.\");const r=t.map(u=>`${u.name}:${u.location}:${$r(u.type)}`).join(\"|\"),i=l(this,Hn).get(r);if(i)return i;const s=new Set,o=l(this,hn).flatMap(u=>u.attributes.map(f=>f.name)),a=l(this,hn).map(u=>{const f=[...u.layout.attributes],d=u.attributes.map((h,g)=>{const b=h.location===void 0?t.filter(k=>k.name===h.name):[];if(h.location===void 0&&b.length===0)throw xf(n,h.name,t.map(k=>k.name));if(b.length>1)throw vf(n,h.name,b.map(k=>k.location));const v=h.location??b[0].location;if(s.has(v))throw wo(n,v);s.add(v);const E=t.find(k=>k.location===v);if(E&&ud(h.format)!==$r(E.type))throw Sf(n,h.name,h.format,$r(E.type));return Object.freeze({...f[g],shaderLocation:v})});return Object.freeze({arrayStride:u.layout.arrayStride,...u.layout.stepMode?{stepMode:u.layout.stepMode}:{},attributes:Object.freeze(d)})});for(const u of t)if(!s.has(u.location))throw _f(n,u.name,o);const c=Object.freeze(a);return l(this,Hn).set(r,c),c}slice(t={}){return new Jf(this,t)}write(t,n=0){const r=this.buffers[0];if(!r)throw rn(\"geometry.write\",\"No vertex buffer 0; add one before writing.\");r.write(t,n)}writeIndices(t,n=0){if(l(this,nt))throw rn(\"geometry.writeIndices\",\"Geometry is destroyed; create a new geometry before writing.\");if(!l(this,At)||l(this,dn)===void 0)throw rn(\"geometry.writeIndices\",\"No owned index buffer; write caller-owned buffers directly.\");Do(\"geometry.writeIndices\",l(this,dn),t.byteLength,n),l(this,At).write(t,n)}destroy(){var t;if(!l(this,nt)){x(this,nt,!0);for(const n of this.buffers)n.destroyOwned();(t=l(this,At))==null||t.destroy();for(const n of[...l(this,Rt)])n();l(this,Rt).clear()}}onDestroy(t){return l(this,nt)?(t(),()=>{}):(l(this,Rt).add(t),()=>{l(this,Rt).delete(t)})}}At=new WeakMap,dn=new WeakMap,hn=new WeakMap,Hn=new WeakMap,Rt=new WeakMap,nt=new WeakMap;class Zf{constructor(t,n){m(this,\"where\");m(this,\"inner\");m(this,\"gpu\");m(this,\"stride\");m(this,\"stepMode\");w(this,Kn,{destroyed:!1});this.where=t,this.inner=n,this.gpu=n.gpu,this.stride=n.stride,this.stepMode=n.stepMode,Object.freeze(this)}write(t,n=0){if(l(this,Kn).destroyed)throw rn(this.where,\"Geometry is destroyed; create a new geometry before writing.\");if(!this.inner.owned||this.inner.byteLength===void 0)throw rn(this.where,\"Caller-owned buffer; write it directly.\");Do(this.where,this.inner.byteLength,Lo(t),n),this.inner.owned.write(t,n)}destroyOwned(){var t;l(this,Kn).destroyed=!0,(t=this.inner.owned)==null||t.destroy()}}Kn=new WeakMap;class Jf{constructor(t,n){m(this,\"geometry\");m(this,\"vertexCount\");m(this,\"indexCount\");m(this,\"instanceCount\");m(this,\"vertexBuffers\");m(this,\"indexBuffer\");m(this,\"indexFormat\");m(this,\"vertexBufferLayouts\");m(this,\"topology\");m(this,\"stripIndexFormat\");m(this,\"firstIndex\");m(this,\"baseVertex\");m(this,\"firstVertex\");if(this.geometry=t,this.vertexBuffers=t.vertexBuffers,this.indexBuffer=t.indexBuffer,this.indexFormat=t.indexFormat,this.vertexBufferLayouts=t.vertexBufferLayouts,this.topology=t.topology,this.stripIndexFormat=t.stripIndexFormat,t.indexBuffer){if(n.firstVertex!==void 0||n.vertexCount!==void 0)throw nn(\"geometry.slice\",\"Indexed slice needs firstIndex/indexCount/baseVertex; omit vertex range fields.\");const r=n.firstIndex??0,i=t.indexCount??0,s=n.indexCount??i-r;He(\"geometry.slice\",\"firstIndex\",r,i),He(\"geometry.slice\",\"indexCount\",s,i-r),He(\"geometry.slice\",\"baseVertex\",n.baseVertex??0,Number.MAX_SAFE_INTEGER),this.firstIndex=r,this.indexCount=s,this.baseVertex=n.baseVertex??0,this.vertexCount=t.vertexCount}else{if(n.firstIndex!==void 0||n.indexCount!==void 0||n.baseVertex!==void 0)throw nn(\"geometry.slice\",\"Non-indexed slice needs firstVertex/vertexCount; omit index range fields.\");const r=n.firstVertex??0,i=t.vertexCount??0,s=n.vertexCount??i-r;He(\"geometry.slice\",\"firstVertex\",r,i),He(\"geometry.slice\",\"vertexCount\",s,i-r),this.firstVertex=r,this.vertexCount=s,this.indexCount=t.indexCount}He(\"geometry.slice\",\"instanceCount\",n.instanceCount??t.instanceCount??0,Number.MAX_SAFE_INTEGER),this.instanceCount=n.instanceCount??t.instanceCount,Object.freeze(this)}[sn](t,n){return this.geometry[sn](t,n)}}function ed(e,t){const n=Y(e,\"geometry\"),r=td(t)?t.build(n.device):t;return nd(n,new Ao(n.device,r))}function td(e){return\"build\"in e&&typeof e.build==\"function\"}function nd(e,t){return on(e,t,n=>n.destroy(),n=>{t.onDestroy(n)})}function Ro(e){if(e===\"unorm10-10-10-2\"||e===\"unorm8x4-bgra\")return 4;const t=/^(float|uint|sint|unorm|snorm)(8|16|32)(?:x([234]))?$/.exec(e);if(!t)return 0;const[,n,r,i]=t;return(r===\"32\"?/norm/.test(n):!i||i===\"3\"||r===\"8\"&&n===\"float\")?0:Number(r)/8*Number(i??1)}function rd(e,t,n){var d;if(t.data!==void 0&&t.buffer!==void 0)throw ee(n,\"Choose data or buffer, not both.\");const r=t.stepMode??\"vertex\";if(r!==\"vertex\"&&r!==\"instance\")throw ee(n,`Invalid stepMode: ${String(r)}.`);const i=[],s=[];let o=0;for(const[h,g]of Object.entries(t.attributes)){if(/^\\d+$/.test(h))throw ee(n,`Attribute '${h}' is numeric; use a non-numeric name.`);const b=typeof g==\"string\"?{format:g}:g,v=Ro(b.format);if(!v)throw ee(n,`Unknown GPUVertexFormat '${b.format}'.`);const E=b.offset??o,k=Math.min(4,v);if(!Number.isInteger(E)||E<0||E%k!==0)throw ee(n,`Attribute '${h}' offset ${String(E)} needs ${k}-byte alignment.`);if(b.location!==void 0&&(!Number.isInteger(b.location)||b.location<0||b.location>=e.gpu.limits.maxVertexAttributes))throw ee(n,`Location ${String(b.location)} for '${h}' is outside limit ${e.gpu.limits.maxVertexAttributes}.`);i.push({shaderLocation:b.location??i.length,offset:E,format:b.format}),s.push({name:h,format:b.format,location:b.location}),o+=v}const a=t.stride??cd(o);if(!Number.isInteger(a)||a<=0||a>2048||a%4!==0)throw ee(n,`Stride ${String(a)} must be 4-aligned in [4,2048].`);for(const[h,g]of i.entries()){const b=Ro(g.format);if(g.offset+b>a)throw ee(n,`Attribute '${(d=s[h])==null?void 0:d.name}' (${g.offset}+${b}) exceeds stride ${a}.`)}const c=t.data?Lo(t.data):void 0;if(c!==void 0&&c%a!==0)throw xo(n,`Data byteLength ${c} is not divisible by stride ${a}.`);const u=t.data!==void 0?e.createBuffer({label:t.label,size:Math.max(4,c??0),usage:[\"vertex\",\"copy_dst\"]}):void 0;return u&&t.data&&u.write(t.data),{layout:Object.freeze({arrayStride:a,...t.stepMode?{stepMode:r}:{},attributes:Object.freeze(i)}),attributes:Object.freeze(s),stride:a,stepMode:r,byteLength:c,gpu:(u==null?void 0:u.gpu)??ad(t.buffer,n),owned:u}}function id(e,t,n){if(t.indices!==void 0&&t.indexBuffer!==void 0)throw ee(n,\"Choose indices or indexBuffer, not both.\");if(t.indices===void 0){const c=[t.indexBuffer,t.indexFormat,t.indexCount].filter(u=>u!==void 0).length;if(c!==0&&c!==3)throw ee(n,\"Provide indexBuffer, indexFormat, and indexCount together.\");if(t.indexFormat!==void 0&&t.indexFormat!==\"uint16\"&&t.indexFormat!==\"uint32\")throw ee(n,`Unknown index format '${String(t.indexFormat)}'.`);return t.indexCount!==void 0&&He(n,\"indexCount\",t.indexCount,Number.MAX_SAFE_INTEGER),{gpu:t.indexBuffer,format:t.indexFormat,count:t.indexCount}}if(t.indexFormat!==void 0)throw ee(n,\"indices infer format; omit indexFormat.\");const r=Array.isArray(t.indices)?new Uint32Array(t.indices):t.indices,i=r instanceof Uint16Array?\"uint16\":\"uint32\",s=r.byteLength;if(s%(i===\"uint16\"?2:4)!==0)throw xo(n,`Index byteLength ${s} is invalid for ${i}.`);const o=e.createBuffer({label:t.label?`${t.label}.indices`:void 0,size:Math.max(4,s),usage:[\"index\",\"copy_dst\"]});return o.write(r),{gpu:o.gpu,owned:o,format:i,count:r.length,byteLength:s}}function Co(e,t){let n;for(const r of e)r.stepMode===t&&r.byteLength!==void 0&&(n=Math.min(n??1/0,Math.floor(r.byteLength/r.stride)));return n}function Fo(e,t,n,r){if(n===void 0&&e.some(i=>i.stepMode===t&&i.byteLength===void 0))throw ee(r,`Raw ${t} buffer needs ${t}Count.`)}function Si(e,t,n,r){n!==void 0&&He(e,t,n,r??Number.MAX_SAFE_INTEGER)}function sd(e){for(const t of Object.keys(e))t!==\"destroyed\"&&Object.defineProperty(e,t,{writable:!1,configurable:!1})}const od=new Set([\"point-list\",\"line-list\",\"line-strip\",\"triangle-list\",\"triangle-strip\"]);function ad(e,t){if(!e)throw ee(t,\"Provide geometry buffer data or buffer.\");return e}function Lo(e){return e.byteLength}function cd(e){return e+3&-4}function Do(e,t,n,r){if(!Number.isInteger(r)||r<0||r%4!==0||n%4!==0||r+n>t)throw rn(e,`Write size ${n}/offset ${String(r)} must be 4-aligned within ${t} bytes.`)}function He(e,t,n,r){if(!Number.isInteger(n)||n<0||n>r)throw nn(e,`${t}=${String(n)} must be an integer in [0,${r}].`)}function ud(e){return e.startsWith(\"sint\")?\"i32\":e.startsWith(\"uint\")?\"u32\":\"f32\"}function $r(e){return e.kind===\"scalar\"?e.name:e.kind===\"vector\"||e.kind===\"matrix\"||e.kind===\"atomic\"?$r(e.element):e.kind}const ld=(((Uc=globalThis.GPUShaderStage)==null?void 0:Uc.VERTEX)??1)|(((Mc=globalThis.GPUShaderStage)==null?void 0:Mc.FRAGMENT)??2);class fd{constructor(t,n){m(this,\"device\");m(this,\"size\");m(this,\"buffer\");m(this,\"bindGroupLayout\");m(this,\"bindGroup\");w(this,Xn,!1);this.device=t,this.size=n.size,this.buffer=t.createBuffer({size:n.size,usage:[\"uniform\",\"copy_dst\"],label:n.label}),this.bindGroupLayout=n.bindGroupLayout??Gl(t,{label:n.label?`${n.label}.bgl`:void 0,entries:[oo.uniform(0,n.visibility??ld,{minBindingSize:n.size})]}),this.bindGroup=Ol(t,{label:n.label?`${n.label}.bg`:void 0,layout:this.bindGroupLayout,entries:[oo.resource(0,this.buffer)]})}get gpu(){return this.buffer.gpu}write(t,n=0){this.buffer.write(t,n)}destroy(){l(this,Xn)||(x(this,Xn,!0),this.buffer.destroy())}dispose(){this.destroy()}}Xn=new WeakMap;class dd{constructor(t){m(this,\"gpu\");this.gpu=t}setPipeline(t){this.gpu.setPipeline(t)}setBindGroup(t,n,r){this.gpu.setBindGroup(t,n,r)}setVertexBuffer(t,n,r=0,i){this.gpu.setVertexBuffer(t,md(n),r,i)}draw(t,n=1,r=0,i=0){if(typeof t==\"number\"){this.gpu.draw(t,n,r,i);return}this.gpu.draw(t.vertexCount,t.instanceCount??1,t.firstVertex??0,t.firstInstance??0)}}function hd(e,t){const n=e.gpu.createRenderBundleEncoder({label:t.label,colorFormats:t.colorFormats,depthStencilFormat:t.depthStencilFormat,sampleCount:t.sampleCount,depthReadOnly:t.depthReadOnly,stencilReadOnly:t.stencilReadOnly});return t.record(new dd(n)),n.finish({label:t.label})}function md(e){return e instanceof Se?e.gpu:e}class Uo extends Error{constructor(n,r,i=1,s=1,o=\"error\"){super(r);m(this,\"code\");m(this,\"line\");m(this,\"column\");m(this,\"severity\");m(this,\"metadata\");m(this,\"relatedDiagnostics\");m(this,\"fix\");m(this,\"where\");m(this,\"cause\");this.name=\"VGPUError\",this.code=n,this.line=i,this.column=s,this.severity=o}}function pd(e,t,n={}){const r=new Uo(e,t,n.line??1,n.column??1,n.severity??\"error\");return n.fix!==void 0&&(r.fix=n.fix),n.where!==void 0&&(r.where=n.where),n.cause!==void 0&&(r.cause=n.cause),n.metadata!==void 0&&(r.metadata=n.metadata),r}function N(e,t,n=1,r=1){return new Uo(e,t,n,r)}const gd=new Set([\"fn\",\"struct\",\"const\",\"alias\",\"var\",\"override\"]);function bd(e){var a,c,u,f;const t=[],n=[],r=[];let i=0,s=!1,o=0;for(;i<e.length;){const d=e[i];if(d.text===\"{\"){o++,i++;continue}if(d.text===\"}\"){o=Math.max(0,o-1),i++;continue}if(ki(d)){i++;continue}if(o>0){i++;continue}if(d.text===\"import\"){if(s)throw N(\"VGPU-WGSL-IMP-ORDER\",\"Imports must precede declarations\",d.line,d.column);const[v,E]=yd(e,i);t.push(v),i=E;continue}if(d.text===\"export\"&&((a=e[i+1])==null?void 0:a.text)===\"{\")throw N(\"VGPU-WGSL-EXP-REEXPORT-CYCLE\",\"Re-export cycles are not supported\",d.line,d.column);if(d.text===\"@\"&&((c=e[i+2])==null?void 0:c.text)===\"export\"&&((u=e[i+3])==null?void 0:u.text)===\"@\")throw N(\"VGPU-WGSL-EXP-NOTDECL\",\"Repeated export attributes\",d.line,d.column);const h=d.text===\"export\"||d.text===\"@\"&&((f=e[i+2])==null?void 0:f.text)===\"export\",g=h?wd(e,d.text===\"export\"?i+1:i+3):i,b=e[g];if(b&&gd.has(b.text)){const v=xd(e,g);n.push({name:v,localName:v,kind:b.text}),h&&r.push({name:v,localName:v,kind:b.text}),s=!0,i=g+1;continue}i++}return{imports:t,exports:r,locals:n}}function yd(e,t){var o,a,c,u,f,d,h,g;let n=t+1;const r=[];if(((o=e[n])==null?void 0:o.text)===\"{\"){for(n++;e[n]&&e[n].text!==\"}\";){if(ki(e[n])){n++;continue}const b=Ii(e[n]);let v=b;n++,((a=e[n])==null?void 0:a.text)===\"as\"&&(v=Ii(e[n+1]),n+=2),r.push({imported:b,local:v}),((c=e[n])==null?void 0:c.text)===\",\"&&n++}n++,Ei(e[n],\"from\"),n++}else if(((u=e[n])==null?void 0:u.text)===\"*\")Ei(e[n+1],\"as\"),r.push({imported:\"*\",local:Ii(e[n+2]),namespace:!0}),n+=3,Ei(e[n],\"from\"),n++;else throw((f=e[n])==null?void 0:f.kind)===\"string\"?N(\"VGPU-WGSL-IMP-SIDEEFFECT\",\"Side-effect imports are not supported\",e[n].line,e[n].column):N(\"VGPU-WGSL-IMP-DEFAULT\",\"Default imports are not supported\",(d=e[n])==null?void 0:d.line,(h=e[n])==null?void 0:h.column);const i=e[n];if((i==null?void 0:i.kind)!==\"string\")throw N(\"VGPU-WGSL-RES-NOTFOUND\",\"Import path must be a string\",i==null?void 0:i.line,i==null?void 0:i.column);const s=i.text.slice(1,-1);return n++,((g=e[n])==null?void 0:g.text)===\";\"&&n++,[{from:s,bindings:r,start:e[t].start,end:e[n-1].end},n]}function wd(e,t){var n,r,i,s;for(t=Tr(e,t);((n=e[t])==null?void 0:n.text)===\"@\";){const o=Tr(e,t+1);if(t=Tr(e,o+1),((r=e[t])==null?void 0:r.text)===\"(\"){let a=0;do((i=e[t])==null?void 0:i.text)===\"(\"?a++:((s=e[t])==null?void 0:s.text)===\")\"&&a--,t++;while(e[t]&&a>0);t=Tr(e,t)}}return t}function Tr(e,t){for(;e[t]&&ki(e[t]);)t++;return t}function xd(e,t){var r,i,s,o;let n=t+1;if(((r=e[t])==null?void 0:r.text)===\"var\"&&((i=e[n])==null?void 0:i.text)===\"<\")for(;e[n]&&e[n].text!==\">\";)n++;for(;n<e.length;n++)if(e[n].kind===\"ident\")return e[n].text;throw N(\"VGPU-WGSL-EXP-NOTDECL\",\"Exported declaration has no name\",(s=e[t])==null?void 0:s.line,(o=e[t])==null?void 0:o.column)}function Ei(e,t){if((e==null?void 0:e.text)!==t)throw N(\"VGPU-WGSL-IMP-DEFAULT\",`Expected ${t}`,e==null?void 0:e.line,e==null?void 0:e.column)}function Ii(e){if((e==null?void 0:e.kind)!==\"ident\")throw N(\"VGPU-WGSL-IMP-DEFAULT\",\"Expected identifier\",e==null?void 0:e.line,e==null?void 0:e.column);return e.text}function ki(e){return e.kind===\"lineComment\"||e.kind===\"blockComment\"}function vd(e,t){return t===\"uniform\"||t===\"storage\"?\"buffer\":e.kind===\"sampler\"?\"sampler\":e.kind===\"texture\"?e.textureKind===\"texture_external\"?\"externalTexture\":\"texture\":\"unknown\"}function _d(e,t,n,r,i){if(e===\"buffer\")return Sd(t,n,i);if(r.kind===\"sampler\")return Ed(r);if(r.kind===\"texture\")return r.textureKind===\"texture_external\"?{kind:\"externalTexture\",externalTexture:{}}:r.textureKind.startsWith(\"texture_storage_\")?Id(r):kd(r)}function Sd(e,t,n){return{kind:\"buffer\",buffer:{type:e===\"uniform\"?\"uniform\":t===\"read\"?\"read-only-storage\":\"storage\",hasDynamicOffset:!1,minBindingSize:n==null?void 0:n.size}}}function Ed(e){return{kind:\"sampler\",sampler:{type:e.comparison?\"comparison\":\"filtering\"}}}function Id(e){return{kind:\"storageTexture\",storageTexture:{access:Td(e.access),format:e.texelFormat??\"rgba8unorm\",viewDimension:Mo(e.dimension)}}}function kd(e){return{kind:\"texture\",texture:{sampleType:$d(e),viewDimension:Mo(e.dimension),multisampled:e.dimension===\"multisampled_2d\"||e.dimension===\"depth_multisampled_2d\"}}}function $d(e){if(e.textureKind.startsWith(\"texture_depth_\"))return\"depth\";const t=e.sampleType;return(t==null?void 0:t.kind)===\"scalar\"&&t.name===\"i32\"?\"sint\":(t==null?void 0:t.kind)===\"scalar\"&&t.name===\"u32\"?\"uint\":\"unfilterable-float\"}function Mo(e){switch(e){case\"1d\":return\"1d\";case\"2d_array\":case\"depth_2d_array\":return\"2d-array\";case\"cube\":case\"depth_cube\":return\"cube\";case\"cube_array\":case\"depth_cube_array\":return\"cube-array\";case\"3d\":return\"3d\";default:return\"2d\"}}function Td(e){return e===\"read\"?\"read-only\":e===\"read_write\"?\"read-write\":\"write-only\"}const Pd=\"VGPU-WGSL-IDENT-NONASCII\",Ad=\"https://github.com/vercel-labs/vgpu/issues/294\";function Rd(e,t){const n=[];let r=0,i=1,s=1;const o=(c,u,f,d,h)=>n.push({kind:c,text:e.slice(u,f),start:u,end:f,line:d,column:h}),a=()=>{e[r]===`\n`?(i++,s=1):s++,r++};for(;r<e.length;){const c=e[r];if(/\\s/.test(c)){a();continue}const u=r,f=i,d=s;if(c===\"/\"&&e[r+1]===\"/\"){for(;r<e.length&&e[r]!==`\n`;)a();o(\"lineComment\",u,r,f,d);continue}if(c===\"/\"&&e[r+1]===\"*\"){let h=0;for(;r<e.length;){if(e[r]===\"/\"&&e[r+1]===\"*\"){h++,a(),a();continue}if(e[r]===\"*\"&&e[r+1]===\"/\"){if(h--,a(),a(),h===0){o(\"blockComment\",u,r,f,d);break}continue}a()}if(h!==0)throw N(\"VGPU-WGSL-LEX-UNTERM-COMMENT\",\"Unterminated block comment\",f,d);continue}if(c==='\"'||c===\"'\"){const h=c;for(a();r<e.length&&e[r]!==h;){if(e[r]===`\n`)throw N(\"VGPU-WGSL-LEX-UNTERM-STRING\",\"Unterminated string\",f,d);e[r]===\"\\\\\"&&a(),a()}if(r>=e.length)throw N(\"VGPU-WGSL-LEX-UNTERM-STRING\",\"Unterminated string\",f,d);a(),o(\"string\",u,r,f,d);continue}if(/[A-Za-z_]/.test(c)){for(;r<e.length&&/[A-Za-z0-9_]/.test(e[r]);)a();const h=e.slice(u,r);o(js.has(h)?\"keyword\":\"ident\",u,r,f,d);continue}if(/[0-9]/.test(c)||c===\".\"&&/[0-9]/.test(e[r+1]??\"\")){for(c===\".\"&&a();r<e.length;){const h=e[r];if(/[A-Za-z0-9_.]/.test(h)){a();continue}if((h===\"+\"||h===\"-\")&&Fd(e[r-1])&&/[0-9]/.test(e[r+1]??\"\")){a();continue}break}o(\"number\",u,r,f,d);continue}if(c.charCodeAt(0)>127)throw Cd(e,r,i,s,t);a(),o(\"punct\",u,r,f,d)}return n}function Cd(e,t,n,r,i){let s=t;for(;s>0&&Go(e[s-1]);)s--;let o=t+1;for(;o<e.length&&Go(e[o]);)o++;const a=e.slice(s,o),c=r-(t-s),u=i===void 0?\"\":` in ${i}`,f=pd(Pd,`Non-ASCII identifier '${a}'${u} at line ${n} column ${c}; vgpu's WGSL pipeline supports ASCII identifiers only`,{fix:`Rename '${a}' using ASCII letters, digits and '_'. Unicode (XID) identifiers are tracked in ${Ad}`,line:n,column:c});return f.range={file:i,start:{line:n,column:c}},f}function Go(e){return e.charCodeAt(0)>127||/[A-Za-z0-9_]/.test(e)}function Fd(e){return e===\"e\"||e===\"E\"||e===\"p\"||e===\"P\"}const ge=(1n<<64n)-1n,xt=11400714785074694791n,Gn=14029467366897019727n,Oo=1609587929392839161n,Vo=9650029242287828579n,No=2870177450012600261n;function Ld(e,t=0n){const n=new TextEncoder().encode(e);let r=0,i;if(n.length>=32){let s=t+xt+Gn,o=t+Gn,a=t,c=t-xt;const u=n.length-32;do s=an(s,On(n,r)),r+=8,o=an(o,On(n,r)),r+=8,a=an(a,On(n,r)),r+=8,c=an(c,On(n,r)),r+=8;while(r<=u);i=Ke(s,1n)+Ke(o,7n)+Ke(a,12n)+Ke(c,18n),i=Pr(i,s),i=Pr(i,o),i=Pr(i,a),i=Pr(i,c)}else i=t+No;for(i=i+BigInt(n.length)&ge;r+8<=n.length;)i^=an(0n,On(n,r)),i=Ke(i,27n)*xt+Vo&ge,r+=8;for(r+4<=n.length&&(i^=Dd(n,r)*xt&ge,i=Ke(i,23n)*Gn+Oo&ge,r+=4);r<n.length;)i^=BigInt(n[r])*No&ge,i=Ke(i,11n)*xt&ge,r++;return i^=i>>33n,i=i*Gn&ge,i^=i>>29n,i=i*Oo&ge,i^=i>>32n,i.toString(16).padStart(16,\"0\")}function an(e,t){return Ke(e+t*Gn&ge,31n)*xt&ge}function Pr(e,t){return e^=an(0n,t),e*xt+Vo&ge}function Ke(e,t){return(e<<t|e>>64n-t)&ge}function On(e,t){let n=0n;for(let r=7;r>=0;r--)n=(n<<8n)+BigInt(e[t+r]);return n}function Dd(e,t){return BigInt(e[t])|BigInt(e[t+1])<<8n|BigInt(e[t+2])<<16n|BigInt(e[t+3])<<24n}function Ud(e){return Ld(e)}function Md(e){return Ud(e).slice(0,8)}function Gd(e,t){return`_vgsl_${Md(e)}__${t}`}function he(e,t){const n=e.find(s=>s.name===t);if(!n)return;const r=n.args.map(s=>s.text).join(\"\"),i=Number(r.replace(/[ui]$/,\"\"));return Number.isFinite(i)?i:void 0}function $i(e){const t=[[]];let n=0,r=0;for(const i of e){if(i.text===\"<\"?n++:i.text===\">\"?n=Math.max(0,n-1):i.text===\"(\"?r++:i.text===\")\"&&(r=Math.max(0,r-1)),i.text===\",\"&&n===0&&r===0){t.push([]);continue}t[t.length-1].push(i)}return t.map(Bo).filter(i=>i.length>0)}function Bo(e){let t=0,n=e.length;for(;t<n&&e[t].text===\",\";)t++;for(;n>t&&e[n-1].text===\",\";)n--;return e.slice(t,n)}function Od(e){if(e!==void 0&&zo(e))return Number(e.replace(/[ui]$/,\"\"))}function zo(e){return/^(0|[1-9][0-9]*)([ui])?$/.test(e)}function qo(e){if(e===\"read\"||e===\"write\"||e===\"read_write\")return e}function Vd(e){return[\"f32\",\"f16\",\"i32\",\"u32\",\"bool\"].find(t=>t===e)}function Nd(e){return{kind:\"scalar\",name:e===\"f\"?\"f32\":e===\"h\"?\"f16\":e===\"i\"?\"i32\":\"u32\"}}function jo(e){return e===\"f16\"?2:4}function Ar(e,t){return Math.ceil(t/e)*e}function Ie(e){var s;const t=Bo(e);if(t.length===0)throw N(\"VGPU-WGSL-REFLECT-TYPE\",\"Expected WGSL type\");const n=t.map(o=>o.text).join(\"\"),r=Bd(n);if(r)return r;if(((s=t[1])==null?void 0:s.text)===\"<\"){const o=t[0].text,a=$i(t.slice(2,-1)),c=zd(o,a);if(c)return c}const i=qd(n);return i||jd(n)}function Bd(e){const t=Vd(e);if(t)return{kind:\"scalar\",name:t};const n=e.match(/^vec([234])([fiuh])$/);if(n)return{kind:\"vector\",width:Number(n[1]),element:Nd(n[2])};const r=e.match(/^mat([234])x([234])([fh])$/);if(r){const i=r[3]===\"h\"?{kind:\"scalar\",name:\"f16\"}:{kind:\"scalar\",name:\"f32\"};return{kind:\"matrix\",columns:Number(r[1]),rows:Number(r[2]),element:i}}}function zd(e,t){var n,r,i,s,o;if(e===\"array\"){const a=(n=t[1])==null?void 0:n.map(u=>u.text).join(\"\"),c=a===void 0?void 0:Od(a);return{kind:\"array\",element:Ie(t[0]??[]),count:c,countExpression:a}}if(e===\"atomic\")return{kind:\"atomic\",element:Ie(t[0]??[])};if(e===\"vec2\"||e===\"vec3\"||e===\"vec4\")return{kind:\"vector\",width:Number(e.slice(3)),element:Ie(t[0]??[])};if(/^mat[234]x[234]$/.test(e))return{kind:\"matrix\",columns:Number(e[3]),rows:Number(e[5]),element:Ie(t[0]??[])};if(e===\"ptr\")return{kind:\"ptr\",addressSpace:((r=t[0])==null?void 0:r.map(a=>a.text).join(\"\"))??\"\",element:Ie(t[1]??[]),access:(i=t[2])==null?void 0:i.map(a=>a.text).join(\"\")};if(e===\"sampler\")return{kind:\"sampler\",comparison:!1};if(e.startsWith(\"texture_storage_\"))return{kind:\"texture\",textureKind:e,dimension:e.slice(16),texelFormat:(s=t[0])==null?void 0:s.map(a=>a.text).join(\"\"),access:qo((o=t[1])==null?void 0:o.map(a=>a.text).join(\"\"))};if(e.startsWith(\"texture_\"))return{kind:\"texture\",textureKind:e,dimension:e.slice(8),sampleType:t[0]?Ie(t[0]):void 0}}function qd(e){if(e===\"sampler\"||e===\"sampler_comparison\")return{kind:\"sampler\",comparison:e===\"sampler_comparison\"};if(e===\"texture_external\")return{kind:\"texture\",textureKind:e};if(e.startsWith(\"texture_depth_\"))return{kind:\"texture\",textureKind:e,dimension:e.slice(8)};if(e.startsWith(\"texture_\"))return{kind:\"texture\",textureKind:e,dimension:e.slice(8)}}function jd(e){return{kind:\"identifier\",name:e}}function Xe(e){if((e==null?void 0:e.kind)!==\"ident\"&&(e==null?void 0:e.kind)!==\"keyword\")throw N(\"VGPU-WGSL-REFLECT-PARSE\",\"Expected identifier\",e==null?void 0:e.line,e==null?void 0:e.column);return e.text}function Ye(e,t,n){var r,i;for(let s=t;s<e.length;s++)if(e[s].text===n)return s;throw N(\"VGPU-WGSL-REFLECT-PARSE\",`Expected ${n}`,(r=e[t])==null?void 0:r.line,(i=e[t])==null?void 0:i.column)}function Wd(e,t,n,r){for(let i=t;i<n;i++)if(e[i].text===r)return i}function Rr(e,t,n){let r=0;for(let i=t;i<e.length;i++)if((e[i].text===\"{\"||e[i].text===\"(\")&&r++,(e[i].text===\"}\"||e[i].text===\")\")&&(r=Math.max(0,r-1)),r===0&&e[i].text===n)return i;return e.length}function Cr(e,t){var s,o;const n=e[t].text,r=n===\"(\"?\")\":n===\"{\"?\"}\":\">\";let i=0;for(let a=t;a<e.length;a++)if(e[a].text===n&&i++,e[a].text===r&&(i--,i===0))return a;throw N(\"VGPU-WGSL-REFLECT-PARSE\",`Unclosed ${n}`,(s=e[t])==null?void 0:s.line,(o=e[t])==null?void 0:o.column)}function Fr(e,t){var i,s;const n=[];let r=t;for(;((i=e[r])==null?void 0:i.text)===\"@\";){const o=e[r],a=Xe(e[r+1]);r+=2;let c=[];if(((s=e[r])==null?void 0:s.text)===\"(\"){const u=Cr(e,r);c=e.slice(r+1,u),r=u+1}n.push({name:a,args:c,token:o})}return[n,r]}function cn(e){switch(e.kind){case\"scalar\":return e.name;case\"identifier\":return e.name;case\"vector\":return`vec${e.width}<${cn(e.element)}>`;case\"matrix\":return`mat${e.columns}x${e.rows}<${cn(e.element)}>`;case\"array\":return`array<${cn(e.element)}${e.count===void 0?\"\":`,${e.count}`}>`;default:return e.kind}}function Hd(e){const t=e.find(r=>r.name===\"workgroup_size\");if(!t)return;const n=$i(t.args).map(r=>Number(r.map(i=>i.text).join(\"\")));return[n[0]??1,n[1]??1,n[2]??1]}function Kd(e,t){var i;if(((i=e[t])==null?void 0:i.text)!==\"<\")return{after:t};const n=Ye(e,t,\">\"),r=$i(e.slice(t+1,n)).map(s=>s.map(o=>o.text).join(\"\"));return{addressSpace:r[0],access:qo(r[1]),after:n+1}}function Xd(e){var f,d,h,g;const t=[],n=[],r=[],i=[],s=[],o=[],a=e.tokens.filter(b=>b.kind!==\"lineComment\"&&b.kind!==\"blockComment\");let c=0,u=0;for(;c<a.length;){const b=a[c];if(b.text===\"{\"){u++,c++;continue}if(b.text===\"}\"){u=Math.max(0,u-1),c++;continue}if(u>0){c++;continue}const v=c;let E;((f=a[c])==null?void 0:f.text)===\"export\"?(c++,[E,c]=Fr(a,c)):([E,c]=Fr(a,c),((d=a[c])==null?void 0:d.text)===\"export\"&&c++);const k=(h=a[c])==null?void 0:h.text;if(k===\"enable\"){((g=a[c+1])==null?void 0:g.kind)===\"ident\"&&o.push(a[c+1].text),c=Rr(a,c,\";\")+1;continue}if(k===\"struct\"){const I=Yd(e,a,c);I.item&&t.push(I.item),c=I.next;continue}if(k===\"alias\"){const I=Qd(e,a,c);I.item&&n.push(I.item),c=I.next;continue}if(k===\"var\"){const I=Zd(e,a,c,E);I.item&&r.push(I.item),c=I.next;continue}if(k===\"fn\"){const I=Jd(e,a,c,E,v);I.item&&i.push(I.item),c=I.next;continue}if(k===\"override\"){const I=th(a,c,E);I.item&&s.push(I.item),c=I.next;continue}c=Math.max(v+1,c+1)}return{structs:t,aliases:n,vars:r,entries:i,overrides:s,features:o}}function Yd(e,t,n,r){const i=Xe(t[n+1]),s=Ye(t,n+2,\"{\"),o=Cr(t,s);return{item:{name:i,originalName:i,mangledName:Ti(e,i,\"struct\"),members:nh(t.slice(s+1,o)),path:e.path},next:o+1}}function Qd(e,t,n,r){const i=Xe(t[n+1]),s=Ye(t,n+2,\"=\"),o=Rr(t,s+1,\";\");return{item:{name:i,originalName:i,mangledName:Ti(e,i,\"alias\"),target:Ie(t.slice(s+1,o)),path:e.path},next:o+1}}function Zd(e,t,n,r){const{addressSpace:i,access:s,after:o}=Kd(t,n+1),a=Xe(t[o]),c=Ye(t,o+1,\":\"),u=Rr(t,c+1,\";\");return{item:{path:e.path,name:a,mangledName:rh(r)?a:Ti(e,a,\"var\"),attrs:r,addressSpace:i,access:s,type:Ie(t.slice(c+1,u))},next:u+1}}function Jd(e,t,n,r,i=n){var d;const s=Xe(t[n+1]),o=(d=r.find(h=>h.name===\"vertex\"||h.name===\"fragment\"||h.name===\"compute\"))==null?void 0:d.name;if(!o)return{item:void 0,next:n+1};const a=Ye(t,n+2,\"(\"),c=Cr(t,a),u=Ye(t,c+1,\"{\"),f=Cr(t,u);return{item:{name:s,mangledName:s,stage:o,workgroupSize:Hd(r),path:e.path,params:eh(t.slice(a+1,c)),declarationStartToken:t[i],declarationEndToken:t[f]},next:f+1}}function eh(e){const t=[];let n=0;for(;n<e.length;){const[r,i]=Fr(e,n);if(n=i,!e[n]||e[n].text===\",\"){n++;continue}const s=Xe(e[n]),o=Ye(e,n+1,\":\");let a=o+1,c=0;for(;a<e.length&&(e[a].text===\"<\"&&c++,e[a].text===\">\"&&(c=Math.max(0,c-1)),!(c===0&&e[a].text===\",\"));)a++;t.push({name:s,attrs:r,type:Ie(e.slice(o+1,a))}),n=a+1}return t}function th(e,t,n){const r=Xe(e[t+1]),i=Rr(e,t+1,\";\"),s=Wd(e,t+2,i,\"=\");return{item:{name:r,mangledName:r,id:he(n,\"id\"),defaultValue:s===void 0?void 0:e.slice(s+1,i).map(o=>o.text).join(\"\")},next:i+1}}function nh(e){const t=[];let n=0;for(;n<e.length;){const[r,i]=Fr(e,n);if(n=i,!e[n]||e[n].text===\",\"||e[n].text===\";\"){n++;continue}const s=Xe(e[n]),o=Ye(e,n+1,\":\");let a=o+1,c=0;for(;a<e.length&&(e[a].text===\"<\"&&c++,e[a].text===\">\"&&(c=Math.max(0,c-1)),!(c===0&&(e[a].text===\",\"||e[a].text===\";\")));)a++;t.push({name:s,attrs:r,type:Ie(e.slice(o+1,a)),align:he(r,\"align\"),size:he(r,\"size\")}),n=a+1}return t}function Ti(e,t,n){return n===\"override\"?t:Gd(e.path,t)}function rh(e){return he(e,\"group\")!==void 0||he(e,\"binding\")!==void 0}const ih=\"literal length required for auto layout; use draw.group(n, bg) manual binding\",sh=\"VGPUError: `bool` is not host-shareable in uniform/storage. Fix: use `u32` (0 | 1) → struct Params { enabled: u32 }\",Wo=\"use a manual group claim (`draw.group(n, bg)`)\";function oh(e=1,t=1){return N(\"VGPU-WGSL-REFLECT-ARRAY-LENGTH\",ih,e,t)}function Ho(e=1,t=1){return N(\"VGPU-WGSL-REFLECT-BOOL-HOST-SHAREABLE\",sh,e,t)}function Lr(e,t,n=1,r=1){return N(\"VGPU-WGSL-REFLECT-UNKNOWN-TYPE\",`type '${e}' is unknown in ${t}; ${Wo}`,n,r)}function Ko(e,t,n=1,r=1){return N(\"VGPU-WGSL-REFLECT-NS-TYPE\",`type '${e}' is a namespace-member import; use a named import or manual @group(1+) binding`,n,r)}function Xo(e,t=1,n=1){return N(\"VGPU-WGSL-REFLECT-NON-HOST-SHAREABLE\",`Type ${e} is not host-shareable; ${Wo}`,t,n)}const un=\"wgsl-host-shareable-v1\";function ah(e,t,n){var o,a,c;const r=new Map;for(const u of t){const f=new Map;for(const d of[...u.structs,...u.aliases])f.set(d.originalName,{path:d.path,name:d.originalName,mangledName:d.mangledName,kind:\"members\"in d?\"struct\":\"alias\"});r.set(((o=u.structs[0])==null?void 0:o.path)??((a=u.aliases[0])==null?void 0:a.path)??((c=u.vars[0])==null?void 0:c.path)??\"\",f)}const i=new Map(e.map(u=>[u.path,r.get(u.path)??new Map])),s=new Map;for(const u of e){const f=new Map(i.get(u.path));for(const d of u.parsed.imports)ch(u,d,f,e,i);s.set(u.path,f)}return s}function ch(e,t,n,r,i,s){const o=lh(t,e.path,r),a=i.get(o);for(const c of t.bindings){if(c.namespace){n.set(c.local,{path:o,name:c.local,mangledName:c.local,kind:\"namespace\"});continue}const u=a==null?void 0:a.get(c.imported);u&&n.set(c.local,u)}}function uh(e,t){const n=new Map,r=new Map,i=new Map;for(const s of e){for(const o of s.structs){const a={name:o.name,mangledName:o.mangledName,members:o.members.map(c=>({name:c.name,type:vt(c.type,o.path,t),align:c.align,size:c.size}))};n.set(o.mangledName,a),i.set(o.mangledName,a)}for(const o of s.aliases){const a={name:o.name,mangledName:o.mangledName,target:vt(o.target,o.path,t)};r.set(o.mangledName,a),i.set(o.mangledName,a)}}return{structs:n,aliases:r,byMangled:i}}function vt(e,t,n,r){var i,s;switch(e.kind){case\"identifier\":{const o=e.name.indexOf(\".\");if(o>0){const c=e.name.slice(0,o),u=(i=n.get(t))==null?void 0:i.get(c);if((u==null?void 0:u.kind)===\"namespace\")throw Ko(e.name)}const a=(s=n.get(t))==null?void 0:s.get(e.name);if((a==null?void 0:a.kind)===\"namespace\")throw Ko(e.name);if(!a)throw Lr(e.name,t);return{kind:\"identifier\",name:a.name,mangledName:a.mangledName}}case\"array\":case\"atomic\":case\"vector\":case\"matrix\":case\"ptr\":return{...e,element:vt(e.element,t,n)};case\"texture\":return{...e,sampleType:e.sampleType?vt(e.sampleType,t,n):void 0};default:return e}}function Pi(e,t){if(!t||e.kind!==\"identifier\")return e;const n=t.aliases.get(e.mangledName??e.name);return n?Pi(n.target,t):e}function Dr(e,t){const n=Pi(e,t);switch(n.kind){case\"array\":case\"atomic\":case\"vector\":case\"matrix\":case\"ptr\":return{...n,element:Dr(n.element,t)};case\"texture\":return{...n,sampleType:n.sampleType?Dr(n.sampleType,t):void 0};default:return n}}function lh(e,t,n,r){const i=void 0;if(i!==void 0&&n.some(u=>u.path===i))return i;const s=e.from,o=t.slice(0,t.lastIndexOf(\"/\")+1),a=s.startsWith(\"/\")?s:fh(`${o}${s}`);return[s,a].find(u=>n.some(f=>f.path===u))??i??a}function $b(e,t,n){}function fh(e){const t=e.startsWith(\"/\"),n=[];for(const r of e.split(\"/\"))!r||r===\".\"||(r===\"..\"?n.pop():n.push(r));return`${t?\"/\":\"\"}${n.join(\"/\")}`}function Vn(e,t=cn(e),n=t,r){const i=r?Dr(e,r):e;return dh(i,t,n,r)}function dh(e,t,n,r){switch(e.kind){case\"scalar\":return hh(e,t,n);case\"atomic\":return mh(e,t,n);case\"vector\":return ph(e,t,n,r);case\"matrix\":return gh(e,t,n,r);case\"array\":return bh(e,t,n,r);case\"identifier\":return wh(e,t,n,r);default:throw Xo(cn(e))}}function hh(e,t,n){const r=jo(e.name);if(e.name===\"bool\")throw Ho();return{name:t,mangledName:n,layoutMode:un,type:e,align:r,size:r}}function mh(e,t,n){return{name:t,mangledName:n,layoutMode:un,type:e,align:4,size:4}}function ph(e,t,n,r){const s=Vn(e.element,t,n,r).size??4,o=e.width===2?s*2:s*4;return{name:t,mangledName:n,layoutMode:un,type:e,align:o,size:s*e.width}}function gh(e,t,n,r){const i={kind:\"vector\",width:e.rows,element:e.element},s=Vn(i,`${t}[]`,`${n}[]`,r),o=Ar(s.align,s.size??0);return{name:t,mangledName:n,layoutMode:un,type:e,align:s.align,size:o*e.columns,stride:o,element:s}}function bh(e,t,n,r){yh(e.countExpression);const i=Vn(e.element,`${t}[]`,`${n}[]`,r),s=Ar(Qe(e.element,r),i.size??0);return{name:t,mangledName:n,layoutMode:un,type:e,align:Qe(e,r),size:e.count===void 0?void 0:s*e.count,stride:s,element:i,runtimeSized:e.count===void 0}}function yh(e){if(e!==void 0&&!zo(e))throw oh()}function wh(e,t,n,r){if(!r)throw Lr(e.name,\"<unknown>\");const i=r.structs.get(e.mangledName??e.name);if(!i)throw Lr(e.name,\"<unknown>\");const s=[];let o=0,a=1;for(const c of i.members){const u=xh(c,o,r);s.push(u.member),o=u.offset+(u.member.size??0),a=Math.max(a,u.member.align)}return{name:t,mangledName:n,layoutMode:un,type:e,align:a,size:Ar(a,o),members:s}}function xh(e,t,n){const r=Vn(e.type,e.name,e.name,n),i=Math.max(Qe(e.type,n),e.align??1),s=Math.max(r.size??0,e.size??0),o=Ar(i,t);return{member:{name:e.name,offset:o,align:i,size:s,type:e.type,layout:r,explicitAlign:e.align,explicitSize:e.size},offset:o}}function Qe(e,t){const n=t?Dr(e,t):e;switch(n.kind){case\"scalar\":return vh(n.name);case\"atomic\":return 4;case\"vector\":return n.width===2?Qe(n.element,t)*2:Qe(n.element,t)*4;case\"matrix\":return Qe({kind:\"vector\",width:n.rows,element:n.element},t);case\"array\":return Qe(n.element,t);case\"identifier\":return _h(n,t);default:throw Xo(cn(n))}}function vh(e){if(e===\"bool\")throw Ho();return jo(e)}function _h(e,t){const n=t==null?void 0:t.structs.get(e.mangledName??e.name);if(!n)throw Lr(e.name,\"<unknown>\");return Math.max(1,...n.members.map(r=>Math.max(Qe(r.type,t),r.align??1)))}const Sh=/^_vgsl_[0-9a-f]{8,16}__[A-Za-z_][A-Za-z0-9_]*$/,Eh=new Set([\"fn\",\"struct\",\"const\",\"alias\",\"var\",\"override\"]);function Yo(e){return new Ih(e).analyze()}class Ih{constructor(t){m(this,\"tokens\");m(this,\"scopes\",[]);m(this,\"declarations\",[]);m(this,\"references\",[]);m(this,\"functions\",[]);m(this,\"preserved\",new Map);m(this,\"symbolsByScope\",new Map);m(this,\"moduleFallbackReasons\",[]);m(this,\"pendingSymbols\",[]);m(this,\"moduleScopeId\");this.tokens=t,this.moduleScopeId=this.createScope(\"module\",void 0,void 0,0)}analyze(){this.collectTopLevel();for(const t of this.functions)this.walkFunction(t);return{tokens:this.tokens,scopes:this.scopes,declarations:this.declarations,references:this.references,functions:this.functions,preservedTokens:[...this.preserved.entries()].map(([t,n])=>({tokenIndex:t,reason:n})),fallback:{wholeModule:this.moduleFallbackReasons.length>0,reasons:this.moduleFallbackReasons}}}collectTopLevel(){let t=0;for(let n=0;n<this.tokens.length;n++){const r=this.tokens[n];if(!Ue(r)){if(r.text===\"{\"){t++;continue}if(r.text===\"}\"){t--,t<0&&(this.moduleFallback(\"unmatched top-level closing brace\",n),t=0);continue}if(t===0){if(r.text===\"@\"){n=this.preserveAttribute(n);continue}if(r.text===\"enable\"||r.text===\"requires\"||r.text===\"diagnostic\"||r.text===\"const_assert\"){n=this.preserveStatement(n,\"directive\");continue}if(r.text!==\"export\"){if(r.text===\"struct\"){n=this.collectStruct(n);continue}if(r.text===\"fn\"){n=this.collectFunction(n);continue}if(r.text===\"const\"||r.text===\"alias\"||r.text===\"var\"||r.text===\"override\"){n=this.preserveGlobalDeclaration(n);continue}r.kind===\"keyword\"&&!Eh.has(r.text)&&this.moduleFallback(`unexpected top-level keyword '${r.text}'`,n)}}}}t!==0&&this.moduleFallback(\"unclosed top-level brace\",this.tokens.length-1),this.scopes[this.moduleScopeId].endToken=Math.max(0,this.tokens.length-1)}collectStruct(t){var s,o,a;const n=this.nextSig(t);if(n===void 0||((s=this.tokens[n])==null?void 0:s.kind)!==\"ident\")return this.moduleFallback(\"struct without name\",t),t;this.preserveToken(n,\"global\");const r=this.nextSig(n);if(r===void 0||((o=this.tokens[r])==null?void 0:o.text)!==\"{\")return this.moduleFallback(\"struct without body\",t),n;const i=this.findMatching(r,\"{\",\"}\");if(i===void 0)return this.moduleFallback(\"unclosed struct body\",r),r;for(let c=r;c<=i;c++)((a=this.tokens[c])==null?void 0:a.kind)===\"ident\"&&this.preserveToken(c,\"struct\");return i}collectFunction(t){var f,d;const n=this.nextSig(t);if(n===void 0||((f=this.tokens[n])==null?void 0:f.kind)!==\"ident\")return this.moduleFallback(\"function without name\",t),t;const r=this.tokens[n].text,i=Sh.test(r)&&!this.hasEntryAttributeBefore(t);this.addDeclaration(r,\"function\",n,this.moduleScopeId,void 0,i),i||this.preserveToken(n,\"global\");const s=this.nextSig(n);if(s===void 0||((d=this.tokens[s])==null?void 0:d.text)!==\"(\")return this.moduleFallback(\"function without parameter list\",n),n;const o=this.findMatching(s,\"(\",\")\");if(o===void 0)return this.moduleFallback(\"unclosed function parameter list\",s),s;const a=this.findNextText(o+1,\"{\");if(a===void 0)return this.moduleFallback(\"function without body\",o),o;this.preserveFunctionSignatureTail(o+1,a);const c=this.findMatching(a,\"{\",\"}\");if(c===void 0)return this.moduleFallback(\"unclosed function body\",a),a;const u=this.createScope(\"function\",this.moduleScopeId,this.functions.length,s);return this.functions.push({id:this.functions.length,name:r,nameTokenIndex:n,scopeId:u,bodyStartToken:a,bodyEndToken:c,skipped:!1,fallbackReasons:[]}),this.collectParams(s,o,u,this.functions.length-1),this.scopes[u].endToken=c,c}collectParams(t,n,r,i){var s;for(let o=t+1;o<n;o++){const a=this.tokens[o];if(!Ue(a)){if(a.text===\"@\"){o=this.preserveAttribute(o);continue}if(a.kind===\"ident\"&&this.nextSig(o)!==void 0&&((s=this.tokens[this.nextSig(o)])==null?void 0:s.text)===\":\"){this.addDeclaration(a.text,\"param\",o,r,i,!0);const c=this.nextSig(o);o=this.preserveTypeFrom(c+1,[\",\",\")\"],n)}}}}preserveFunctionSignatureTail(t,n){for(let r=t;r<n;r++){const i=this.tokens[r];if(!Ue(i)){if(i.text===\"@\"){r=this.preserveAttribute(r);continue}i.kind===\"ident\"&&this.preserveToken(r,\"type\")}}}preserveGlobalDeclaration(t){var s,o,a;let n=t+1;if(((s=this.tokens[t])==null?void 0:s.text)===\"var\"){const c=this.nextSig(t);if(c!==void 0&&((o=this.tokens[c])==null?void 0:o.text)===\"<\"){const u=this.findMatching(c,\"<\",\">\");if(u===void 0)return this.moduleFallback(\"unparseable top-level var template\",c),c;this.preserveRange(c,u,\"type\"),n=u+1}}const r=this.findNextIdent(n);r!==void 0&&(this.preserveToken(r,\"global\"),this.addDeclaration(this.tokens[r].text,\"global\",r,this.moduleScopeId,void 0,!1));const i=this.findStatementEnd(t);for(let c=t;c<=i;c++)((a=this.tokens[c])==null?void 0:a.kind)===\"ident\"&&this.preserveToken(c,\"global\");return i}walkFunction(t){var a,c,u;const n=[this.moduleScopeId,t.scopeId],r=[],i=(f,d)=>{const h=this.createScope(f,n[n.length-1],t.id,d);return n.push(h),h},s=f=>{if(n.length<=2){this.functionFallback(t,\"scope frame underflow\",f);return}const d=n.pop();return this.scopes[d].endToken=f,d};i(\"block\",t.bodyStartToken);let o=1;for(let f=t.bodyStartToken+1;f<t.bodyEndToken;f++){this.activatePendingSymbols(f);const d=this.tokens[f];if(Ue(d))continue;if(d.text===\"@\"){f=this.preserveAttribute(f);continue}if(d.text===\".\"){const g=this.nextSig(f);g!==void 0&&((a=this.tokens[g])==null?void 0:a.kind)===\"ident\"&&this.preserveToken(g,\"member\");continue}if(d.text===\"enable\"||d.text===\"requires\"||d.text===\"diagnostic\"){f=this.preserveStatement(f,\"directive\");continue}if(d.text===\"for\"){const g=i(\"for-init\",f),b=this.nextSig(f);(b===void 0||((c=this.tokens[b])==null?void 0:c.text)!==\"(\")&&this.functionFallback(t,\"for without parenthesized header\",f),r.push({scopeId:g,headerDepth:0,awaitingBody:!1});continue}const h=r[r.length-1];if(h&&h.bodyDepth===void 0&&(d.text===\"(\"&&h.headerDepth++,d.text===\")\"&&(h.headerDepth--,h.headerDepth<=0&&(h.awaitingBody=!0))),d.text===\"{\"){o++;const g=kh(r,b=>b.awaitingBody&&b.bodyDepth===void 0);g&&(g.bodyDepth=o),i(\"block\",f);continue}if(d.text===\"}\"){const g=o;for(s(f),o--;r.length>0&&r[r.length-1].bodyDepth===g;)s(f),r.pop();o<0&&this.functionFallback(t,\"unmatched closing brace\",f);continue}if(d.text===\":\"){f=this.preserveTypeFrom(f+1,[\"=\",\";\",\",\",\")\",\"{\"],t.bodyEndToken);continue}if(d.text===\"-\"&&((u=this.tokens[this.nextSig(f)??-1])==null?void 0:u.text)===\">\"){f=this.preserveTypeFrom((this.nextSig(f)??f)+1,[\"{\"],t.bodyEndToken);continue}if(d.text===\"let\"||d.text===\"const\"||d.text===\"var\"){f=this.collectLocalDeclaration(f,n[n.length-1],t);continue}if(d.kind===\"ident\"&&!this.preserved.has(f)){const g=this.resolve(d.text,n);g!==void 0?this.references.push({name:d.text,tokenIndex:f,declarationId:g,scopeId:n[n.length-1],functionId:t.id}):this.preserveToken(f,\"unknown\")}}for(;n.length>2;)s(t.bodyEndToken)}collectLocalDeclaration(t,n,r){var c,u;const i=this.tokens[t].text;let s=t+1;if(i===\"var\"){const f=this.nextSig(t);if(f!==void 0&&((c=this.tokens[f])==null?void 0:c.text)===\"<\"){const d=this.findMatching(f,\"<\",\">\");if(d===void 0)return this.functionFallback(r,\"unparseable var template\",f),f;this.preserveRange(f,d,\"type\"),s=d+1}}const o=this.findNextIdent(s);if(o===void 0||o>=r.bodyEndToken)return this.functionFallback(r,`${i} without identifier`,t),t;this.addDeclaration(this.tokens[o].text,i,o,n,r.id,!0,this.findStatementEnd(t));const a=this.nextSig(o);return a!==void 0&&((u=this.tokens[a])==null?void 0:u.text)===\":\"?this.preserveTypeFrom(a+1,[\"=\",\";\",\",\",\")\"],r.bodyEndToken):o}addDeclaration(t,n,r,i,s,o,a){const c=this.declarations.length;return this.declarations.push({id:c,name:t,kind:n,tokenIndex:r,scopeId:i,functionId:s,safeToRename:o}),a!==void 0?this.pendingSymbols.push({name:t,id:c,scopeId:i,activateAfter:a}):this.activateSymbol(t,c,i),c}activatePendingSymbols(t){for(let n=this.pendingSymbols.length-1;n>=0;n--){const r=this.pendingSymbols[n];r.activateAfter>=t||(this.activateSymbol(r.name,r.id,r.scopeId),this.pendingSymbols.splice(n,1))}}activateSymbol(t,n,r){let i=this.symbolsByScope.get(r);i||(i=new Map,this.symbolsByScope.set(r,i)),i.has(t)||i.set(t,n)}resolve(t,n){var r;for(let i=n.length-1;i>=0;i--){const s=(r=this.symbolsByScope.get(n[i]))==null?void 0:r.get(t);if(s!==void 0)return s}}preserveAttribute(t){var s;this.preserveToken(t,\"attribute\");const n=this.nextSig(t);if(n===void 0)return t;this.preserveToken(n,\"attribute\");const r=this.nextSig(n);if(r===void 0||((s=this.tokens[r])==null?void 0:s.text)!==\"(\")return n;const i=this.findMatching(r,\"(\",\")\");return i===void 0?(this.preserveRange(r,r,\"attribute\"),r):(this.preserveRange(r,i,\"attribute\"),i)}preserveTypeFrom(t,n,r){let i=0,s=0,o=0,a=t-1;for(let c=t;c<r;c++){const u=this.tokens[c];if(!Ue(u)){if(i===0&&s===0&&o===0&&n.includes(u.text))return Math.max(t-1,c-1);if(u.text===\"<\")i++;else if(u.text===\">\")i=Math.max(0,i-1);else if(u.text===\"(\")s++;else if(u.text===\")\"){if(s===0&&n.includes(\")\"))return Math.max(t-1,c-1);s=Math.max(0,s-1)}else u.text===\"[\"?o++:u.text===\"]\"&&(o=Math.max(0,o-1));u.kind===\"ident\"&&this.preserveToken(c,\"type\"),a=c}}return a}preserveStatement(t,n){const r=this.findStatementEnd(t);return this.preserveRange(t,r,n),r}preserveRange(t,n,r){for(let i=t;i<=n;i++)this.tokens[i]&&this.tokens[i].kind!==\"lineComment\"&&this.tokens[i].kind!==\"blockComment\"&&this.preserveToken(i,r)}preserveToken(t,n){this.preserved.has(t)||this.preserved.set(t,n)}createScope(t,n,r,i){const s=this.scopes.length;return this.scopes.push({id:s,kind:t,parentId:n,functionId:r,startToken:i}),s}nextSig(t){for(let n=t+1;n<this.tokens.length;n++)if(!Ue(this.tokens[n]))return n}findNextIdent(t){for(let n=t;n<this.tokens.length;n++){const r=this.tokens[n];if(!Ue(r)){if(r.kind===\"ident\")return n;if(r.text!==\"@\")return}}}findNextText(t,n){for(let r=t;r<this.tokens.length;r++)if(!Ue(this.tokens[r])&&this.tokens[r].text===n)return r}findStatementEnd(t){let n=0;for(let r=t;r<this.tokens.length;r++){const i=this.tokens[r].text;if(i===\"(\")n++;else if(i===\")\")n=Math.max(0,n-1);else if(n===0&&(i===\";\"||i===\"{\"||i===\"}\"))return r}return this.tokens.length-1}findMatching(t,n,r){let i=0;for(let s=t;s<this.tokens.length;s++){const o=this.tokens[s].text;if(o===n&&i++,o===r&&(i--,i===0))return s}}hasEntryAttributeBefore(t){for(let n=t-1;n>=0;n--){const r=this.tokens[n];if(!Ue(r)){if(r.text===\")\"||r.kind===\"ident\"||r.text===\"@\"){const i=r.text;if(i===\"compute\"||i===\"vertex\"||i===\"fragment\")return!0;continue}break}}return!1}moduleFallback(t,n){this.moduleFallbackReasons.push(`${t} at token ${n}`)}functionFallback(t,n,r){t.skipped=!0,t.fallbackReasons.push(`${n} at token ${r}`)}}function kh(e,t){for(let n=e.length-1;n>=0;n--)if(t(e[n]))return e[n]}function Ue(e){return e.kind===\"lineComment\"||e.kind===\"blockComment\"}const $h=new Set([\"textureSample\",\"textureSampleBias\",\"textureSampleLevel\",\"textureSampleGrad\",\"textureGather\",\"textureSampleBaseClampToEdge\"]),Th=new Set([\"textureSampleCompare\",\"textureSampleCompareLevel\",\"textureGatherCompare\"]);function Ph(e,t,n){const r=new Map;for(let i=0;i<e.length;i++){const s=e[i],o=t[i],a=Yo(s.tokens),c=new Map;for(const f of o.vars){const d=he(f.attrs,\"group\"),h=he(f.attrs,\"binding\"),g=a.declarations.find(b=>b.kind===\"global\"&&b.name===f.name);d!==void 0&&h!==void 0&&g&&c.set(g.id,{group:d,binding:h})}const u=new Map;for(const f of a.declarations){if(f.kind!==\"function\")continue;const d=a.functions.find(h=>h.nameTokenIndex===f.tokenIndex);d&&u.set(f.id,d.id)}for(const f of o.entries){const d=a.functions.find(v=>v.name===f.name),h=[];let g=a.fallback.wholeModule||!d;!g&&d&&(g=!Qo(d.id,new Map,new Set,a,c,u,h));const b=d?Lh(d.id,a,c,u):n.map(Ai);r.set(f,g?Dh(n,b):Uh(h))}}return r}function Qo(e,t,n,r,i,s,o){var d,h;const a=r.functions[e];if(!a||a.skipped)return!1;const c=`${e}|${[...t].map(([g,b])=>`${g}:${b.group}:${b.binding}`).join(\",\")}`;if(n.has(c))return!0;n.add(c);const u=r.references.filter(g=>g.functionId===e),f=new Map(u.map(g=>[g.tokenIndex,g]));for(let g=a.bodyStartToken+1;g<a.bodyEndToken;g++){const b=(d=r.tokens[g])==null?void 0:d.text,v=$h.has(b??\"\")?\"filtering\":Th.has(b??\"\")?\"comparison\":void 0,E=f.get(g),k=E&&s.get(E.declarationId);if(!v&&k===void 0)continue;const I=Fh(r,g);if(I===void 0||((h=r.tokens[I])==null?void 0:h.text)!==\"(\")continue;const R=Ch(r,I);if(!R)return!1;const H=R.map(([te,X])=>Ah(te,X,r,i,t));if(v){const te=b===\"textureGather\"&&!Rh(R[0],r,i,t)?1:0,X=H[te],z=H[te+1];if(!X||!z)return!1;o.push({texture:X,sampler:z,mode:v})}else{const te=r.declarations.filter(z=>z.kind===\"param\"&&z.functionId===k).sort((z,ve)=>z.tokenIndex-ve.tokenIndex),X=new Map;for(let z=0;z<te.length;z++)H[z]&&X.set(te[z].id,H[z]);if(!Qo(k,X,n,r,i,s,o))return!1}}return!0}function Ah(e,t,n,r,i){for(const s of n.references){if(s.tokenIndex<e||s.tokenIndex>t)continue;const o=r.get(s.declarationId)??i.get(s.declarationId);if(o)return o}}function Rh(e,t,n,r){const i=t.references.find(s=>s.tokenIndex>=e[0]&&s.tokenIndex<=e[1]);return(i==null?void 0:i.tokenIndex)===e[0]?n.get(i.declarationId)??r.get(i.declarationId):void 0}function Ch(e,t){const n=[];let r=1,i=0,s=0,o=0,a=t+1;for(let c=t+1;c<e.tokens.length;c++){const u=e.tokens[c].text;if(u===\"(\")r++;else if(u===\")\"){if(r--,r===0)return n.push([a,c-1]),n}else u===\"[\"?i++:u===\"]\"?i--:u===\"{\"?s++:u===\"}\"?s--:u===\"<\"?o++:u===\">\"?o--:u===\",\"&&r===1&&i===0&&s===0&&o===0&&(n.push([a,c-1]),a=c+1)}}function Fh(e,t){for(let n=t+1;n<e.tokens.length;n++)if(e.tokens[n].kind!==\"lineComment\"&&e.tokens[n].kind!==\"blockComment\")return n}function Lh(e,t,n,r){const i=[e],s=new Set,o=new Map;for(;i.length;){const a=i.pop();if(!s.has(a)){s.add(a);for(const c of t.references){if(c.functionId!==a)continue;const u=n.get(c.declarationId);u&&o.set(`${u.group}:${u.binding}`,u);const f=r.get(c.declarationId);f!==void 0&&i.push(f)}}}return[...o.values()]}function Dh(e,t){const n=new Set(t.map(o=>`${o.group}:${o.binding}`)),r=e.filter(o=>n.has(`${o.group}:${o.binding}`)),i=r.filter(o=>{var a;return((a=o.bindingLayout)==null?void 0:a.kind)===\"texture\"&&o.bindingLayout.texture.sampleType===\"unfilterable-float\"&&!o.bindingLayout.texture.multisampled}),s=r.filter(o=>{var a;return((a=o.bindingLayout)==null?void 0:a.kind)===\"sampler\"&&o.bindingLayout.sampler.type===\"filtering\"});return i.flatMap(o=>s.map(a=>({texture:Ai(o),sampler:Ai(a),mode:\"filtering\"})))}function Ai(e){return{group:e.group,binding:e.binding}}function Uh(e){const t=new Set;return e.filter(n=>{const r=`${n.texture.group}:${n.texture.binding}:${n.sampler.group}:${n.sampler.binding}:${n.mode}`;return t.has(r)?!1:(t.add(r),!0)})}function Mh(e,t){const n=e.map(Xd),r=ah(e,n),i=uh(n,r),s=[],o=[];for(const u of n)for(const f of u.vars){const d=he(f.attrs,\"group\"),h=he(f.attrs,\"binding\");if(d===void 0||h===void 0)continue;const g=vt(f.type,f.path,r),b=vd(g,f.addressSpace),v=f.addressSpace===\"uniform\"||f.addressSpace===\"storage\"?Vn(g,f.name,f.mangledName,i):void 0;v&&o.push(v),s.push({group:d,binding:h,name:f.name,mangledName:f.mangledName,type:g,kind:b,addressSpace:f.addressSpace,access:f.access,struct:g.kind===\"identifier\"?i.structs.get(g.mangledName??g.name):void 0,layout:v,bindingLayout:_d(b,f.addressSpace,f.access,g,v)})}s.sort((u,f)=>u.group-f.group||u.binding-f.binding);const a=Gh(e,n,s),c=Ph(e,n,s);return{bindings:s,entryPoints:n.flatMap(u=>u.entries.map(f=>Oh(f,n.flatMap(d=>d.structs),r,i,a.get(f)??s,c.get(f)??[]))),overrides:n.flatMap(u=>u.overrides),featuresRequired:[...new Set(n.flatMap(u=>u.features))],aliases:[...i.aliases.values()],structs:[...i.structs.values()],hostShareableLayouts:o}}function Gh(e,t,n){const r=new Map;for(let i=0;i<e.length;i++){const s=e[i],o=t[i],a=Yo(s.tokens),c=a.fallback.wholeModule,u=new Map;for(const d of a.declarations){if(d.kind!==\"function\")continue;const h=a.functions.find(g=>g.nameTokenIndex===d.tokenIndex);h&&u.set(d.id,h.id)}const f=new Map;for(const d of o.vars){const h=he(d.attrs,\"group\"),g=he(d.attrs,\"binding\");if(h===void 0||g===void 0)continue;const b=a.declarations.find(v=>v.kind===\"global\"&&v.name===d.name);b&&f.set(b.id,{group:h,binding:g})}for(const d of o.entries){const h=a.functions.find(E=>E.name===d.name);if(c||!h){r.set(d,n);continue}const g=[h.id],b=new Set,v=new Map;for(;g.length;){const E=g.pop();if(!b.has(E)&&(b.add(E),!!a.functions[E]))for(const k of a.references){if(k.functionId!==E)continue;const I=f.get(k.declarationId);I&&v.set(`${I.group}:${I.binding}`,I);const R=u.get(k.declarationId);R!==void 0&&g.push(R)}}r.set(d,[...v.values()].sort((E,k)=>E.group-k.group||E.binding-k.binding))}}return r}function Oh(e,t,n,r,i,s){return{name:e.name,mangledName:e.mangledName,stage:e.stage,...e.workgroupSize?{workgroupSize:e.workgroupSize}:{},bindings:i.map(({group:o,binding:a})=>({group:o,binding:a})),samplingPairs:s,...e.stage===\"vertex\"?{inputs:Vh(e,t,n,r)}:{}}}function Vh(e,t,n,r){var s;const i=[];for(const o of e.params){if(Zo(o.attrs,\"builtin\"))continue;const a=vt(o.type,e.path,n),c=he(o.attrs,\"location\");if(c!==void 0){i.push({name:o.name,location:c,type:a});continue}const u=Pi(a,r);if(u.kind!==\"identifier\")continue;const f=t.find(h=>h.mangledName===(u.mangledName??u.name)),d=r.structs.get(u.mangledName??u.name);if(f)for(let h=0;h<f.members.length;h++){const g=f.members[h];if(Zo(g.attrs,\"builtin\"))continue;const b=he(g.attrs,\"location\");b!==void 0&&i.push({name:g.name,location:b,type:((s=d==null?void 0:d.members[h])==null?void 0:s.type)??vt(g.type,f.path,n)})}}return i}function Zo(e,t){return e.some(n=>n.name===t)}function Ri(e,t=\"<runtime>\"){const n=Rd(e,t),r=bd(n);if(r.imports.length>0)throw N(\"VGPU-WGSL-REFLECT-SOURCE-IMPORT\",\"reflectSource() accepts a single raw WGSL string; use resolveShader() for WGSL import graphs.\");return Mh([{path:t,source:e,tokens:n,parsed:r}])}function Ci(){const e=new Map;return{getOrCreate(t,n,r,i){const s=r.map(Ur),o=`${t}:${n}:${s.join(\"|\")}`,a=e.get(o);if(a)return a.bindGroup;const c=i();return e.set(o,{identities:s,bindGroup:c}),c},evictIdentity(t){const n=Ur(t);for(const[r,i]of e)i.identities.includes(n)&&e.delete(r)},clearDraw(t){const n=`${t}:`;for(const r of e.keys())r.startsWith(n)&&e.delete(r)},dispose(){e.clear()}}}function Ur(e){return typeof e==\"string\"||typeof e==\"number\"?String(e):`${e.kind}:${e.id}`}function Nn(e,t,n){const r=e[t];if(!r)throw new _({code:\"VGPU-REFLECT-ENTRY-METADATA-MISSING\",message:`Entry point '${e.name}' has no reflected ${t}.`,fix:\"Pass the reflection from reflectSource()/resolveShader().\",where:n});return r}const Mr=new WeakMap;function Bn(e,t){if(!e.gpu.pushErrorScope||!e.gpu.popErrorScope)return;e.gpu.pushErrorScope(\"validation\");const n=Mr.get(e.gpu);n?n.push(t):Mr.set(e.gpu,[t])}function be(e){const t=Mr.get(e.gpu);if(!(t!=null&&t.length)||!e.gpu.popErrorScope)return;const n=t.pop();return t.length||Mr.delete(e.gpu),{context:n,error:e.gpu.popErrorScope()}}function Jo(e){const t=[];let n=be(e);for(;n;)t.push(n),n=be(e);return t}function Nh(e){const t=be(e);t&&Li(t)}function ea(e){for(const t of Jo(e))Li(t)}function me(e){for(const t of e)Li(t)}function Fi(e){var t,n;return((n=(t=e.gpu.queue).onSubmittedWorkDone)==null?void 0:n.call(t))??Promise.resolve()}function ta(e,t=[],n={}){return zh(e,t,n.errorSink??qh)}function Gr(e,t){return{context:e.context,error:Bh(e.error,t.error)}}async function Bh(e,t){const n=await Promise.allSettled([e,t]);for(const i of n)if(i.status===\"fulfilled\"&&i.value)return i.value;const r=n.find(i=>i.status===\"rejected\");if((r==null?void 0:r.status)===\"rejected\")throw r.reason;return null}async function zh(e,t,n){await Fi(e);for(const r of t)try{const i=await r.error;i&&await n(Zt(r.context.label,r.context.group,i))}catch(i){await n(Zt(r.context.label,r.context.group,i))}}function Li(e){e.error.catch(()=>{})}function qh(e){console.error(e)}function na(e,t,n,r){var i;try{t.end()}catch(s){const o=Jo(e);me(n),me(o),n.length=0;const a=((i=o[0])==null?void 0:i.context)??r;throw a?Zt(a.label,a.group,s):s}}let jh=1;const ra=new WeakMap;function Wh(e){return e===null||typeof e!=\"object\"||ArrayBuffer.isView(e)||e instanceof ArrayBuffer||Array.isArray(e)?!0:e instanceof Se||e instanceof Fe?!1:!aa(e)}function Di(e){return typeof e!=\"object\"||e===null||Array.isArray(e)||ArrayBuffer.isView(e)||e instanceof ArrayBuffer||e instanceof Se||e instanceof Fe?!1:!aa(e)}function Hh(e,t,n){var r;try{return Kh(e,t,n)}catch(i){if((i==null?void 0:i.code)===\"VGPU-CORE-TEXTURE-DESTROYED\"){const s=t instanceof Fe?t.label:(r=Or(t))==null?void 0:r.color.label;throw uo(n.sourceHint,e,s)}throw i}}function Kh(e,t,n){var r;switch((r=e.bindingLayout)==null?void 0:r.kind){case\"buffer\":return Xh(e,t,n);case\"texture\":return Yh(e,t,n);case\"sampler\":return em(e,t);case\"storageTexture\":return Qh(e,t);case\"externalTexture\":throw se(e,\"external texture\",\"Pass a compatible GPUExternalTexture.\");default:throw se(e,\"reflected resource\",\"Fix shader reflection bindingLayout.\")}}function Xh(e,t,n){const r=Qf(t);if(r)return r[_i](e,n.sourceHint);if(t instanceof Se)return vi(t,`${n.sourceHint}.set`),nm(e,t.options.usage),{resource:{buffer:t.gpu},identity:t.resourceIdentity,unsubscribe:i=>t.onDestroy(i)};if(im(t))return vi(t.buffer,`${n.sourceHint}.set`),{resource:{buffer:t.gpu,offset:0,size:t.size},identity:t.buffer.resourceIdentity,unsubscribe:i=>t.buffer.onDestroy(i)};if(ca(t))return{resource:t,identity:_t(t.buffer)};if(Mi(t))return{resource:{buffer:t},identity:_t(t)};throw se(e,\"buffer\",`Pass a compatible Buffer/Uniform: ${e.name}.set({ ${e.name}: gpu.device.createBuffer(...) }).`)}function Yh(e,t,n){var s,o;const r=((s=e.bindingLayout)==null?void 0:s.kind)===\"texture\"&&e.bindingLayout.texture.sampleType===\"depth\",i=Or(t);if(i){if(r&&!i.depth)throw se(e,\"a target with a depth attachment\",`Create it with target(gpu, { size, depth: true }) or bind a Texture: set({ ${e.name}: scene.depth }).`);const a=r?i.depth:i.color;sa(e,a,n);const c=(o=i.onTexturesRecreated)==null?void 0:o.bind(i);return{resourceLabel:a.label,resource:a.createView(oa(a)),identity:a.resourceIdentity,unsubscribe:u=>{const f=i.onDestroy(u),d=a.onDestroy(u);return()=>{f(),d()}},onRecreate:c?u=>c(u):void 0}}if(t instanceof Fe)return rm(e,t.usage),sa(e,t,n),{resourceLabel:t.label,resource:t.createView(oa(t)),identity:t.resourceIdentity,unsubscribe:a=>t.onDestroy(a)};if(Ui(t))return{resource:t.createView(),identity:t.resourceIdentity??_t(t)};if(typeof t==\"object\"&&t!==null)return{resource:t,identity:_t(t)};throw se(e,\"texture/target\",`Pass a Texture or Target: ${e.name}.set({ ${e.name}: scene.color }) or set({ ${e.name}: scene }).`)}function Qh(e,t){var s;const n=((s=e.bindingLayout)==null?void 0:s.kind)===\"storageTexture\"?e.bindingLayout.storageTexture:void 0,r={format:n==null?void 0:n.format,viewDimension:(n==null?void 0:n.viewDimension)??\"2d\"},i=`texture(gpu, { kind: \"${r.viewDimension}\", size${r.viewDimension===\"2d-array\"?\", layers\":\"\"}, format: \"${r.format??\"rgba8unorm\"}\", usage: [\"storage_binding\"] })`;if(Or(t))throw se(e,\"a storage texture, not a Target\",`Render targets are not storage textures. Create one with ${i} and set({ ${e.name}: texture }).`);if(t instanceof Fe)return Zh(e,t,r,i),{resourceLabel:t.label,resource:t.createView(ia(r.viewDimension)),identity:t.resourceIdentity,unsubscribe:o=>t.onDestroy(o)};if(Ui(t))return{resource:t.createView(ia(r.viewDimension)),identity:t.resourceIdentity??_t(t)};if(typeof t==\"object\"&&t!==null)return{resource:t,identity:_t(t)};throw se(e,\"a storage texture\",`Pass a Texture from ${i}: set({ ${e.name}: texture }).`)}function Zh(e,t,n,r){const i=t.label??\"texture\";if(!t.usage.includes(\"storage_binding\"))throw se(e,\"a texture with storage_binding usage\",`Create it with ${r}; include texture_binding too if you also sample it.`);if(n.format&&t.format!==n.format)throw se(e,`format ${n.format}`,`Texture '${i}' is ${t.format}. Create it with ${r} or declare texture_storage_${n.viewDimension.replace(\"-\",\"_\")}<${t.format}, ...> in WGSL.`);const s=Jh(n.viewDimension);if(s&&t.dimension!==s)throw se(e,`dimension \"${s}\"`,`Texture '${i}' has kind \"${t.kind}\". Create it with ${r}.`)}function ia(e){return{dimension:e,baseMipLevel:0,mipLevelCount:1}}function Jh(e){switch(e){case\"1d\":return\"1d\";case\"2d\":case\"2d-array\":return\"2d\";case\"3d\":return\"3d\";default:return}}function em(e,t){if(tm(t))return{resource:t,identity:_t(t)};throw se(e,\"sampler\",`Use the cached sampler: set({ ${e.name}: sampler(gpu) }).`)}function tm(e){return typeof e!=\"object\"||e===null||e instanceof Se||e instanceof Fe?!1:!Mi(e)&&!ca(e)&&!Ui(e)&&!Or(e)}function nm(e,t){var r;const n=((r=e.bindingLayout)==null?void 0:r.kind)===\"buffer\"?e.bindingLayout.buffer.type:void 0;if(n===\"uniform\"&&!t.includes(\"uniform\"))throw se(e,\"uniform buffer\",\"Create with usage: ['uniform','copy_dst'].\");if((n===\"storage\"||n===\"read-only-storage\")&&!t.includes(\"storage\"))throw se(e,\"storage buffer\",\"Create with usage: ['storage','copy_dst'].\")}function rm(e,t){if(!t.includes(\"texture_binding\")&&!t.includes(\"render_attachment\"))throw se(e,\"sampled texture\",\"Use texture_binding usage or a sampleable Target.\")}function sa(e,t,n){if(!(!n.filterableTexture||n.float32Filterable)&&(t.format===\"r32float\"||t.format===\"rg32float\"||t.format===\"rgba32float\"))throw Jl(n.sourceHint,e,t.format,t.label??\"texture\",n.pairedSampler)}function oa(e){return e.format.includes(\"stencil\")?{aspect:\"depth-only\"}:void 0}function Or(e){if(typeof e!=\"object\"||e===null)return;const t=e;if(!(!t.resourceIdentity||!t.color||typeof t.onDestroy!=\"function\"))return t}function aa(e){const t=e;return\"gpu\"in t||\"bindGroup\"in t||\"createView\"in t||\"resourceIdentity\"in t}function _t(e){if(typeof e!=\"object\"||e===null)return`value:${String(e)}`;let t=ra.get(e);return t||(t={kind:\"external\",id:jh++},ra.set(e,t)),t}function im(e){return typeof e==\"object\"&&e!==null&&\"gpu\"in e&&\"size\"in e&&\"buffer\"in e&&e.buffer instanceof Se}function Ui(e){return typeof e==\"object\"&&e!==null&&typeof e.createView==\"function\"}function ca(e){return typeof e==\"object\"&&e!==null&&\"buffer\"in e&&Mi(e.buffer)}function Mi(e){return typeof e==\"object\"&&e!==null&&\"size\"in e&&\"usage\"in e&&typeof e.destroy==\"function\"}function Gi(e,t){sm(e),Vi(e,t,\"$\",0,e.size);const n=new ArrayBuffer(e.size);return Oi(new DataView(n),e,0,t),n}function sm(e){if(e.size===void 0)throw G(\"set\",`No se puede inferir byteLength para layout runtime-sized '${e.name}'.`)}function Oi(e,t,n,r){if(t.members)return om(e,t.members,n,r);am(e,t,n,r)}function om(e,t,n,r){const i=r;for(const s of t)Oi(e,s.layout,n+s.offset,i==null?void 0:i[s.name])}function am(e,t,n,r){switch(t.type.kind){case\"scalar\":return Vr(e,n,t.type.name,r);case\"atomic\":return cm(e,n,t.type,r);case\"vector\":return um(e,n,t.type,r);case\"matrix\":return lm(e,t,n,r);case\"array\":return fm(e,t,n,r);default:throw G(\"set\",`No hay writer para layout ${t.type.kind}.`)}}function Vr(e,t,n,r){n===\"f32\"?e.setFloat32(t,r,!0):n===\"i32\"?e.setInt32(t,r,!0):n===\"u32\"||n===\"bool\"?e.setUint32(t,n===\"bool\"?r?1:0:r,!0):e.setUint16(t,ym(r),!0)}function cm(e,t,n,r){Vr(e,t,St(n.element),r)}function um(e,t,n,r){const i=r,s=zn(n.element);for(let o=0;o<n.width;o++)Vr(e,t+o*s,St(n.element),(i==null?void 0:i[o])??0)}function lm(e,t,n,r){const i=t.type,s=r,o=zn(i.element),a=t.stride??16;for(let c=0;c<i.columns;c++)for(let u=0;u<i.rows;u++)Vr(e,n+c*a+u*o,St(i.element),(s==null?void 0:s[c*i.rows+u])??0)}function fm(e,t,n,r){var o;const i=r,s=t.stride??((o=t.element)==null?void 0:o.size)??0;if(!t.element)throw G(\"set\",\"Array layout sin element layout.\");for(let a=0;a<i.length;a++)Oi(e,t.element,n+a*s,i[a])}function Vi(e,t,n,r,i){if(e.members){dm(e.members,t,n,r,i);return}switch(e.type.kind){case\"scalar\":Nr(e.type.name,t,n),Br(n,r,zn(e.type),i);return;case\"atomic\":Nr(St(e.type.element),t,n),Br(n,r,4,i);return;case\"vector\":hm(e.type,t,n,r,i);return;case\"matrix\":mm(e,t,n,r,i);return;case\"array\":pm(e,t,n,r,i);return;default:throw G(\"set\",`No hay validator para layout ${e.type.kind}.`)}}function dm(e,t,n,r,i){bm(t)||pe(\"type\",n,\"an object\",zr(t));const s=new Set(e.map(a=>a.name)),o=Object.keys(t).find(a=>!s.has(a));o!==void 0&&pe(\"unknown-field\",`${n}.${o}`,\"a declared field\",o);for(const a of e){const c=`${n}.${a.name}`;Object.hasOwn(t,a.name)||pe(\"missing-field\",c,\"a required field\",\"missing\"),Vi(a.layout,t[a.name],c,r+a.offset,i)}}function hm(e,t,n,r,i){const s=ua(t,n,e.width),o=St(e.element),a=zn(e.element);for(let c=0;c<e.width;c++)Nr(o,s[c],`${n}[${c}]`),Br(`${n}[${c}]`,r+c*a,a,i)}function mm(e,t,n,r,i){const s=e.type,o=s.columns*s.rows,a=ua(t,n,o),c=St(s.element),u=zn(s.element),f=e.stride;if(f===void 0)throw G(\"set\",`Matrix layout '${e.name}' sin stride.`);for(let d=0;d<s.columns;d++)for(let h=0;h<s.rows;h++){const g=d*s.rows+h,b=`${n}[${d}][${h}]`;Nr(c,a[g],b),Br(b,r+d*f+h*u,u,i)}}function pm(e,t,n,r,i){const s=la(t,n),o=e.type;o.count!==void 0&&s.length!==o.count&&pe(\"shape\",n,o.count,s.length);const a=e.stride;if(a===void 0||!e.element)throw G(\"set\",`Array layout '${e.name}' sin stride o element layout.`);if(e.runtimeSized){const c=gm(a,s.length,n),u=e.size??i-r;u!==c&&pe(\"extent\",n,c,u)}for(let c=0;c<s.length;c++)Vi(e.element,s[c],`${n}[${c}]`,r+c*a,i)}function Nr(e,t,n){if(e===\"bool\"){typeof t!=\"boolean\"&&pe(\"type\",n,\"bool\",zr(t),e);return}typeof t!=\"number\"&&pe(\"type\",n,e,zr(t),e),e===\"i32\"&&(!Number.isInteger(t)||t<-2147483648||t>2147483647)&&pe(\"integer-range\",n,\"an integer in [-2147483648, 2147483647]\",String(t),e),e===\"u32\"&&(!Number.isInteger(t)||t<0||t>4294967295)&&pe(\"integer-range\",n,\"an integer in [0, 4294967295]\",String(t),e)}function ua(e,t,n){const r=la(e,t);return r.length!==n&&pe(\"shape\",t,n,r.length),r}function la(e,t){if(Array.isArray(e)||ArrayBuffer.isView(e)&&!(e instanceof DataView)&&\"length\"in e)return e;pe(\"type\",t,\"an array or typed array\",zr(e))}function Br(e,t,n,r){(!Number.isSafeInteger(t)||!Number.isSafeInteger(n)||t<0||n<0||t>r-n)&&pe(\"buffer-range\",e,`${n} bytes inside ${r}`,t)}function gm(e,t,n){const r=e*t;return(!Number.isSafeInteger(e)||e<0||!Number.isSafeInteger(r))&&pe(\"extent\",n,\"a safe byte extent\",String(r)),r}function pe(e,t,n,r,i){const s=e===\"shape\"?`expected exactly ${n} values, received ${r}`:e===\"missing-field\"?\"required field is missing\":e===\"unknown-field\"?`field '${r}' is not declared by the layout`:e===\"integer-range\"?`${r} is outside the exact ${i} range`:e===\"extent\"?`runtime extent requires ${n} bytes, received ${r}`:e===\"buffer-range\"?`write at byte ${r} exceeds ${n}`:`expected ${n}, received ${r}`;throw Uf(i===void 0?{reason:e,path:t,expected:n,actual:r}:{reason:e,path:t,expected:n,actual:r,type:i},s)}function bm(e){if(typeof e!=\"object\"||e===null||Array.isArray(e)||ArrayBuffer.isView(e))return!1;const t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function zr(e){return e===null?\"null\":Array.isArray(e)?\"array\":ArrayBuffer.isView(e)?e.constructor.name:typeof e}function zn(e){return St(e)===\"f16\"?2:4}function St(e){if(e.kind!==\"scalar\")throw G(\"set\",`Expected scalar, got ${e.kind}`);return e.name}function ym(e){const t=new Float32Array(1),n=new Uint32Array(t.buffer);t[0]=e;const r=n[0],i=r>>16&32768,s=r&8388607,o=r>>23&255;if(o===255)return i|(s?32256:31744);const a=o-127+15;if(a>=31)return i|31744;if(a<=0)return a<-10?i:i|fa(s|8388608,14-a);const c=fa(s,13);if(c===1024){const u=a+1;return u>=31?i|31744:i|u<<10}return i|a<<10|c}function fa(e,t){const n=e>>>t,r=(1<<t)-1,i=e&r,s=1<<t-1;return i>s||i===s&&(n&1)===1?n+1:n}const da=new WeakMap;function ha(e,t){const n=new Map,r=new Set,i=new Set,s=new Set(e.filter(a=>{var c;return((c=a.bindingLayout)==null?void 0:c.kind)===\"texture\"&&a.bindingLayout.texture.sampleType===\"depth\"}).map(a=>`${a.group}:${a.binding}`));for(const a of t){const c=a.stage===\"vertex\"?1:a.stage===\"fragment\"?2:4;for(const u of Nn(a,\"bindings\",\"visibility\")){const f=`${u.group}:${u.binding}`;n.set(f,(n.get(f)??0)|c)}for(const u of Nn(a,\"samplingPairs\",\"visibility\")){if(u.mode!==\"filtering\")continue;const f=`${u.texture.group}:${u.texture.binding}`;s.has(f)?i.add(`${u.sampler.group}:${u.sampler.binding}`):r.add(f)}}const o=a=>n.get(`${a.group}:${a.binding}`)??0;return Object.defineProperty(o,\"filterable\",{value:r}),Object.defineProperty(o,\"nonFilteringSamplers\",{value:i}),o}function ma(e,t,n=Ni){return e.flatMap(r=>{var o,a;if(r.group!==t)return[];const i=n(r),s=`${r.group}:${r.binding}`;return i===0?[]:[{binding:r.binding,visibility:i,...Sm(r,((o=n.filterable)==null?void 0:o.has(s))??!1,((a=n.nonFilteringSamplers)==null?void 0:a.has(s))??!1)}]})}function pa(e,t,n,r=Ni){const i=new Map,s=n.bindings.filter(a=>r(a)!==0).map(a=>a.group),o=Math.max(-1,...s);for(let a=0;a<=o;a++)i.set(a,xm(e,t,n,a,r));return i}function wm(e,t){return e.gpu.createPipelineLayout({bindGroupLayouts:vm(t)})}function xm(e,t,n,r,i=Ni){return ga(e,`${t}.group${r}.bgl`,ma(n.bindings,r,i))}function ga(e,t,n){let r=da.get(e.gpu);r||(r=new Map,da.set(e.gpu,r));const i=JSON.stringify(n),s=r.get(i);if(s)return s;const o=io(e.gpu.createBindGroupLayout({label:t,entries:n}),{entries:n});return r.set(i,o),o}function vm(e){const t=Math.max(-1,...e.keys()),n=[];for(let r=0;r<=t;r++)n.push(_m(e,r));return n}function _m(e,t){const n=e.get(t);if(!n)throw G(\"pipelineLayout\",`Bind groups must be contiguous for pipeline layout; missing group(${t}).`);return n}function Sm(e,t,n){const r=e.bindingLayout;if(!r)throw G(\"bindGroupLayout\",`Binding '${e.name}' does not have a reflected bindingLayout.`);return t&&r.kind===\"texture\"&&r.texture.sampleType===\"unfilterable-float\"&&!r.texture.multisampled?{texture:{...r.texture,sampleType:\"float\"}}:n&&r.kind===\"sampler\"&&r.sampler.type===\"filtering\"?{sampler:{type:\"non-filtering\"}}:Em(r)}function Em(e){switch(e.kind){case\"buffer\":return{buffer:{...e.buffer}};case\"sampler\":return{sampler:{...e.sampler}};case\"texture\":return{texture:{...e.texture}};case\"storageTexture\":return{storageTexture:{...e.storageTexture}};case\"externalTexture\":return{externalTexture:{}}}}function Ni(e){const t=globalThis.GPUShaderStage,n=(t==null?void 0:t.VERTEX)??1,r=(t==null?void 0:t.FRAGMENT)??2,i=(t==null?void 0:t.COMPUTE)??4;return e.kind===\"buffer\"?n|r|i:r|i}function ba(e){const t=Im(e.reflection),n=[...e.bindGroupLayouts.keys()].sort((p,S)=>p-S),r=new Map;function i(p){const S=[];for(const[$,P]of Object.entries(p))S.push(...o($,P));return S}function s(p){var $;const S=e.bindGroupLayouts.get(p.info.group);return!!S&&!!(($=Yt(S))!=null&&$.entries.some(P=>P.binding===p.info.binding))}function o(p,S){const $=t.get(p);if($)return a($,p,S);const P=km(p,t,e.label);if(!P)throw G(`${e.label}.set`,`Binding '${p}' does not exist in '${e.label}'.`);return c(P,p,S)}function a(p,S,$){ve(p.info.group);const P=ya(p.info,$);wa(p,S,P);const V=Et(p.identity);return P===\"lib\"?u(p,Am(p.libValue,$)):d(p,$),p.ownership??(p.ownership=P),s(p)?Bi(p,V):[]}function c(p,S,$){ve(p.info.group);const P=ya(p.info,$);if(wa(p,S,P),$m(p,S,P),P!==\"lib\")throw G(`${e.label}.set`,`Member '${S}' needs a JS value; set resource '${p.info.name}' instead.`);const V=Et(p.identity),ne=p.libValue??zi(_e(p));return u(p,{...Rm(ne),[S]:$}),p.ownership??(p.ownership=P),p.memberOwnership.set(S,P),s(p)?Bi(p,V):[]}function u(p,S){const $=_e(p),P=Gi($,S);p.libValue=S,p.buffer||pt(p,$.size),p.bytes=P,p.buffer.write(P,0)}function f(p){var V,ne;const S=(V=Yt(e.bindGroupLayouts.get(p.group)))==null?void 0:V.entries.find(q=>q.binding===p.binding),$=e.reflection.entryPoints.flatMap(q=>Nn(q,\"samplingPairs\",e.label)).find(q=>q.mode===\"filtering\"&&q.texture.group===p.group&&q.texture.binding===p.binding),P=$&&e.reflection.bindings.find(q=>q.group===$.sampler.group&&q.binding===$.sampler.binding);return{sourceHint:e.label,filterableTexture:((ne=S==null?void 0:S.texture)==null?void 0:ne.sampleType)===\"float\",float32Filterable:e.device.features.has(\"float32-filterable\"),pairedSampler:P}}function d(p,S){var P,V,ne,q;const $=Hh(p.info,S,f(p.info));(P=p.unsubscribe)==null||P.call(p),(V=p.unsubscribeRecreate)==null||V.call(p),p.resource=$.resource,p.identity=$.identity,p.destroyed=!1,p.resourceLabel=$.resourceLabel,p.subscribeDestroy=$.unsubscribe,p.unsubscribe=(ne=$.unsubscribe)==null?void 0:ne.call($,()=>b(p)),p.unsubscribeRecreate=(q=$.onRecreate)==null?void 0:q.call($,()=>h(p,S))}function h(p,S){var P;const $=Et(p.identity);if(p.identity&&e.cache.evictIdentity(p.identity),d(p,S),s(p))for(const V of Bi(p,$))(P=e.onIdentityChange)==null||P.call(e,V)}function g(p,S,$){k(p),Tm(e.label,p,S,$);const P=r.has(p)?`claimed-group:${p}`:void 0;return r.set(p,S),P}function b(p){var S;p.destroyed||(p.destroyed=!0,p.identity&&e.cache.evictIdentity(p.identity),s(p)&&!r.has(p.info.group)&&((S=e.onIdentityChange)==null||S.call(e,{group:p.info.group,binding:p.info.binding,bindingName:p.info.name,bindingKind:p.info.kind,previousIdentity:Et(p.identity),newIdentity:`destroyed:${Et(p.identity)}`})))}function v(){for(const p of t.values())if(p.destroyed&&s(p)&&!r.has(p.info.group))throw uo(e.label,p.info,p.resourceLabel)}function E(p){v();const S=[];for(const $ of t.values()){if(!s($)||r.has($.info.group)||!$.subscribeDestroy)continue;const P=Et($.identity),{group:V,binding:ne,name:q,kind:ie}=$.info;S.push($.subscribeDestroy(()=>p({group:V,binding:ne,bindingName:q,bindingKind:ie,previousIdentity:P,newIdentity:`destroyed:${P}`})))}return()=>{for(const $ of S.splice(0))$()}}function k(p){const S=e.bindGroupLayouts.get(p);if(!S)throw G(`${e.label}.layout`,`@group(${p}) does not exist in '${e.label}'.`);return S}function I(){return v(),n.map(R)}function R(p){var ie;const S=r.get(p);if(S)return{group:p,bindGroup:S,offsets:[],claimValidation:H(S,p)};const $=new Set((ie=Yt(k(p)))==null?void 0:ie.entries.map(We=>We.binding)),P=e.reflection.bindings.filter(We=>We.group===p&&$.has(We.binding)),V=te(P),ne=X(P),q=e.cache.getOrCreate(e.drawId,p,ne,()=>e.device.gpu.createBindGroup({label:`${e.label}.group${p}`,layout:k(p),entries:V}));return{group:p,bindGroup:q,offsets:[]}}function H(p,S){return so(p)?void 0:{label:e.label,group:S}}function te(p){return p.map(S=>{const $=z(S);return{binding:S.binding,resource:$.resource}})}function X(p){return p.map(S=>z(S).identity)}function z(p){const S=t.get(p.name);if(!(S!=null&&S.resource)||!S.identity)throw ef(e.label,p);return S}function ve(p){if(r.has(p))throw tf(e.label,p)}function pt(p,S){p.buffer=e.device.createBuffer({size:S,usage:[\"uniform\",\"copy_dst\"],label:`${e.label}.${p.info.name}`}),p.resource={buffer:p.buffer.gpu,offset:0,size:S},p.identity=p.buffer.resourceIdentity,p.unsubscribe=p.buffer.onDestroy(()=>e.cache.evictIdentity(p.buffer.resourceIdentity))}function _e(p){var S;if(p.info.kind!==\"buffer\"||!((S=p.info.layout)!=null&&S.size))throw G(`${e.label}.set`,`Binding '${p.info.name}' needs a compatible resource, not JS.`);return p.info.layout}return{assertUsable:v,watchResources:E,get groups(){return n},set:i,claimGroup:g,layout:k,bindGroups:I,bindingState(p){const S=t.get(p);if(!(!(S!=null&&S.ownership)||!S.resource||!S.identity))return{info:S.info,ownership:S.ownership,resource:S.resource,identity:S.identity}}}}function Im(e){return new Map(e.bindings.map(t=>[t.name,{info:t,memberOwnership:new Map}]))}function km(e,t,n){var i,s;let r;for(const o of t.values())if((s=(i=o.info.layout)==null?void 0:i.members)!=null&&s.some(a=>a.name===e)){if(r)throw G(`${n}.set`,`Binding member '${e}' is ambiguous in '${n}'; set the complete binding.`);r=o}return r}function ya(e,t){var n;return((n=e.bindingLayout)==null?void 0:n.kind)===\"buffer\"&&Wh(t)?\"lib\":\"user\"}function wa(e,t,n){if(e.ownership&&e.ownership!==n)throw lo(t,e.ownership)}function $m(e,t,n){const r=e.memberOwnership.get(t);if(r&&r!==n)throw lo(t,r)}function Tm(e,t,n,r){const i=so(n);if(!i)return;const s=Yt(r);if(!s)return;const o=Pm(s.entries,i.layout.entries);if(o)throw nf(e,t,o)}function Pm(e,t){if(e.length!==t.length)return`expected ${e.length} bindings and received ${t.length}`;const n=xa(e),r=xa(t);for(const[i,s]of n){const o=r.get(i);if(!o)return`missing @binding(${i})`;if(va(s)!==va(o))return`@binding(${i}) does not match the reflected layout`}}function xa(e){return new Map(e.map(t=>[t.binding,t]))}function va(e){return JSON.stringify({binding:e.binding,visibility:e.visibility,buffer:e.buffer,sampler:e.sampler,texture:e.texture,storageTexture:e.storageTexture,externalTexture:e.externalTexture?{}:void 0})}function Bi(e,t){const n=Et(e.identity);return!n||t===n?[]:[{group:e.info.group,binding:e.info.binding,bindingName:e.info.name,bindingKind:e.info.kind,previousIdentity:t,newIdentity:n}]}function Et(e){return e===void 0?void 0:Ur(e)}function Am(e,t){return Di(e)&&Di(t)?{...e,...t}:t}function Rm(e){return Di(e)?e:{}}function zi(e){if(e.members)return Object.fromEntries(e.members.map(t=>[t.name,zi(t.layout)]));switch(e.type.kind){case\"scalar\":case\"atomic\":return 0;case\"vector\":return Array.from({length:e.type.width},()=>0);case\"matrix\":return Array.from({length:e.type.columns*e.type.rows},()=>0);case\"array\":{const t=e.element;return e.type.count===void 0||!t?[]:Array.from({length:e.type.count},()=>zi(t))}default:return}}const Cm=\"rgba8unorm\",qi=Object.freeze([0,0,0,1]);function qr(e,t){const n=e,r=Array.isArray(e)?e:[n==null?void 0:n.r,n==null?void 0:n.g,n==null?void 0:n.b,n==null?void 0:n.a];if(r.length!==4||!r.every(i=>typeof i==\"number\"&&Number.isFinite(i)))throw Rf(t);return ji(e)}function ji(e){const t=e;return Array.isArray(e)?[e[0],e[1],e[2],e[3]]:{r:t.r,g:t.g,b:t.b,a:t.a}}function jr(e){return e.colors??[{format:e.format??Cm}]}function _a(e){return e.depth===!0?\"depth24plus\":e.depth||void 0}function Sa(e){const t=e.msaa;if(t===!0||t===4)return 4;if(t===void 0||t===!1)return 1;const n=_o();throw n.code=\"VGPU-TARGET-MSAA-INVALID\",n.message=`msaa received ${t}; WebGPU 1|4; use true`,n}function Ea(e,t){if(!Array.isArray(e==null?void 0:e.size)||e.size.length!==2||!Array.from(e.size).every(r=>Number.isSafeInteger(r)&&r>0))throw _o();const n=_a(e);if(n===\"stencil8\")throw If(n);if(Sa(e)===4)for(const r of jr(e))Fm(r.format,t)}function Fm(e,t){if(t.isCompatibilityMode&&e===\"rgba16float\")throw G(\"target\",\"Dawn compatibility mode does not support rgba16float+msaa.\",\"Use rgba8unorm for MSAA here, or disable msaa.\")}function Lm(e,t,n,r){const i={view:(t??e).createView(),resolveTarget:t?e.createView():void 0,loadOp:r?\"load\":\"clear\",storeOp:t?\"discard\":\"store\"};return r||(i.clearValue=Ia(n)),i}function Dm(e,t,n,r,i){if(i){const o={view:e.createView(),depthReadOnly:!0};return qn(e.format)&&(o.stencilReadOnly=!0),o}const s={view:e.createView(),depthLoadOp:t?\"load\":\"clear\",depthStoreOp:e.sampleCount>1?\"discard\":\"store\"};return t||(s.depthClearValue=n??1),e.format&&qn(e.format)&&(s.stencilLoadOp=t?\"load\":\"clear\",s.stencilStoreOp=e.sampleCount>1?\"discard\":\"store\",t||(s.stencilClearValue=r??0)),s}function qn(e){return!!e&&e.includes(\"stencil\")}function Ia(e){return Array.isArray(e)?{r:e[0],g:e[1],b:e[2],a:e[3]}:e}function ka(e,t){return e[0]===t[0]&&e[1]===t[1]}function Wr(e){return typeof e==\"object\"&&e!==null&&typeof e.renderPassDescriptor==\"function\"}let Um=1,Mm=1;const Gm=new WeakMap,Om=new WeakMap;function $a(e){var t;return Wr(e)?{colors:e.colors.map(n=>n.format),depth:(t=e.depth)==null?void 0:t.format,sampleCount:e.sampleCount}:typeof e!=\"object\"||e===null?{colors:[]}:{colors:Array.isArray(e.colors)?[...e.colors]:e.colors??[],depth:e.depth,sampleCount:e.sampleCount??1}}function Hr(e){return`${e.colors.join(\",\")}:${e.depth??\"none\"}:${e.sampleCount??1}`}function Ta(e,t){if(!Array.isArray(e.colors)||e.colors.length===0)throw Ir(t,\"colors must be a non-empty array.\");const n=e.colors.find(i=>typeof i!=\"string\"||i.length===0);if(n!==void 0)throw Ir(t,`colors must contain only GPUTextureFormat strings; received ${String(n)}.`);if(e.depth!==void 0&&(typeof e.depth!=\"string\"||e.depth.length===0))throw Ir(t,\"depth must be a GPUTextureFormat string.\");const r=e.sampleCount??1;if(r!==1&&r!==4)throw Ir(t,`sampleCount must be 1 or 4; received ${String(r)}.`)}function Vm(e){const t=`${Da(Gm,e.module,()=>Um++)}|${Da(Om,e.pipelineLayout,()=>Mm++)}|${jm(e.vertexBufferLayouts??[])}|${Hr(e.signature)}`,n=e.topology||e.stripIndexFormat?`${t}|${e.topology??\"triangle-list\"}|${e.stripIndexFormat??\"none\"}`:t,r=e.cullMode||e.frontFace?`${n}|${e.cullMode??\"none\"}|${e.frontFace??\"ccw\"}`:n,i=e.unclippedDepth?`${r}|unclipped`:r,s=e.depthKey?`${i}|${e.depthKey}`:i,o=e.stencilKey?`${s}|${e.stencilKey}`:s,a=e.multisampleKey?`${o}|${e.multisampleKey}`:o,c=e.constantsKey?`${a}|${e.constantsKey}`:a,u=e.entryKey?`${c}|${e.entryKey}`:c;return e.fragmentKey?`${u}|${e.fragmentKey}`:u}function Wi(e,t,n,r,i){if(r===void 0)return t.find(o=>o.stage===n);if(typeof r!=\"string\")throw Er(e,`${n} received ${Hi(r)}; expected an entry point name string.`,i);const s=t.find(o=>o.name===r);if(!s)throw Er(e,`\"${r}\" matches no entry point in the shader; available entry points: ${Pa(t)}.`,i);if(s.stage!==n)throw Er(e,`\"${r}\" is a @${s.stage} entry point, not @${n}; available entry points: ${Pa(t)}.`,i);return s}function Pa(e){return e.length?e.map(t=>`\"${t.name}\" (@${t.stage})`).join(\", \"):\"none\"}function Aa(e,t,n,r){if(t!==void 0&&(typeof t!=\"object\"||t===null||Array.isArray(t)))throw Sr(e,`received ${Hi(t)}; expected { overrideNameOrId: number | boolean }.`,r);const i=new Map(n.map(o=>[Ra(o),o])),s={};for(const[o,a]of Object.entries(t??{})){if(!i.has(o))throw Sr(e,`\"${o}\" matches no override in the shader; available overrides: ${Nm(n)}.`,r);if(typeof a==\"boolean\"){s[o]=a?1:0;continue}if(typeof a!=\"number\"||!Number.isFinite(a))throw Sr(e,`\"${o}\" received ${Hi(a)}; use a finite number or a boolean (WebGPU converts the value to the override's WGSL type, and NaN/Infinity fail that conversion).`,r);s[o]=a}for(const o of n){const a=Ra(o);if(o.defaultValue===void 0&&!(a in s))throw Sr(e,`override '${o.name}' has no default value and must be provided; add constants: { \"${a}\": value }.`,r)}return Object.keys(s).length===0?{}:{constants:s,constantsKey:Bm(s)}}function Ra(e){return e.id!==void 0?String(e.id):e.name}function Nm(e){return e.length?e.map(t=>t.id!==void 0?`\"${t.id}\" (@id of ${t.name})`:`\"${t.name}\"`).join(\", \"):\"none\"}function Bm(e){return`cn~${Object.entries(e).sort(([t],[n])=>t<n?-1:t>n?1:0).map(([t,n])=>`${t}=${n}`).join(\"~\")}`}function Hi(e){if(typeof e==\"string\")return`\"${e}\"`;try{return JSON.stringify(e)??String(e)}catch{return String(e)}}function Ca(e){const t=new Map;return{get(n,r){let i=t.get(n);return i||(i=e.gpu.createShaderModule({label:r,code:n}),t.set(n,i)),i},dispose(){t.clear()}}}function Fa(e){const t=new Map;return{get(n){const r=Wm(n);let i=t.get(r);return i||(i=e.gpu.createPipelineLayout({bindGroupLayouts:Hm(n)}),t.set(r,i)),i},dispose(){t.clear()}}}function La(e,t={}){return new zm(e,t)}class zm{constructor(t,n){w(this,ae);m(this,\"device\");w(this,K,new Map);w(this,rt,new Set);w(this,Ct);w(this,Yn);w(this,mn,!1);var r;this.device=t,x(this,Ct,n.errorSink??(()=>{})),x(this,Yn,(r=n.registerSettledSource)==null?void 0:r.call(n,()=>[...l(this,rt)]))}getReady(t){var n;return(n=l(this,K).get(t))==null?void 0:n.pipeline}getSync(t,n,r){var a;y(this,ae,hs).call(this,r.where);const i=l(this,K).get(t);if(i!=null&&i.pipeline)return i.pipeline;const s=i??{};i||l(this,K).set(t,s);const o=y(this,ae,jc).call(this,t,s,n,r);if(!o){s.pending||l(this,K).delete(t);return}return s.pipeline=o,(a=s.pending)==null||a.resolve(o),s.pending=void 0,o}getAsync(t,n,r){y(this,ae,hs).call(this,r.where);const i=l(this,K).get(t);if(i!=null&&i.pipeline)return Promise.resolve(i.pipeline);if(i!=null&&i.pending)return i.pending.promise;const s={},o=qm();s.pending=o,l(this,K).set(t,s);let a;try{a=n()}catch(c){const u=Un(r.where,c,r.signature);return o.reject(u),l(this,K).delete(t),o.promise}return y(this,ae,ms).call(this,a),a.then(c=>{l(this,K).get(t)!==s||s.pipeline||s.pending!==o||(s.pipeline=c,s.pending=void 0,o.resolve(c))},c=>{l(this,K).get(t)!==s||s.pipeline||s.pending!==o||(s.pending=void 0,l(this,K).delete(t),o.reject(Un(r.where,c,r.signature)))}),o.promise}dispose(){var n,r;if(l(this,mn))return;x(this,mn,!0);const t=vo(\"gpu.dispose\");for(const i of l(this,K).values())(n=i.pending)==null||n.reject(t);l(this,K).clear(),l(this,rt).clear(),(r=l(this,Yn))==null||r.call(this)}}K=new WeakMap,rt=new WeakMap,Ct=new WeakMap,Yn=new WeakMap,mn=new WeakMap,ae=new WeakSet,jc=function(t,n,r,i){const s=this.device.gpu,o=typeof s.pushErrorScope==\"function\"&&typeof s.popErrorScope==\"function\";o&&s.pushErrorScope(\"validation\");try{const a=r();return o&&y(this,ae,Wc).call(this,t,n,i),a}catch(a){o&&y(this,ae,Hc).call(this);const c=Un(i.where,a,i.signature);l(this,Ct).call(this,c);return}},Wc=function(t,n,r){const i=this.device.gpu.popErrorScope().then(s=>{if(!s)return;const o=Un(r.where,s,r.signature);return l(this,K).get(t)===n&&l(this,K).delete(t),l(this,Ct).call(this,o)},s=>{const o=Un(r.where,s,r.signature);return l(this,K).get(t)===n&&l(this,K).delete(t),l(this,Ct).call(this,o)});y(this,ae,ms).call(this,i)},Hc=function(){var n,r;const t=(r=(n=this.device.gpu).popErrorScope)==null?void 0:r.call(n);t&&t.catch(()=>{})},hs=function(t){if(l(this,mn))throw vo(t)},ms=function(t){l(this,rt).add(t),t.catch(()=>{}).then(()=>l(this,rt).delete(t),()=>l(this,rt).delete(t))};function qm(){let e,t;const n=new Promise((r,i)=>{e=r,t=i});return n.catch(()=>{}),{promise:n,resolve:e,reject:t}}function Da(e,t,n){let r=e.get(t);return r||(r=n(),e.set(t,r)),r}function jm(e){return JSON.stringify(e.map(t=>({arrayStride:t.arrayStride,stepMode:t.stepMode??\"vertex\",attributes:[...t.attributes].map(n=>({shaderLocation:n.shaderLocation,offset:n.offset,format:n.format}))})))}function Wm(e){return JSON.stringify([...e.entries()].map(([t,n])=>({group:t,entries:Xm(n)})))}function Hm(e){const t=Math.max(-1,...e.keys()),n=[];for(let r=0;r<=t;r++)n.push(Km(e,r));return n}function Km(e,t){const n=e.get(t);if(!n)throw Ef(t);return n}function Xm(e){var t;return(((t=Yt(e))==null?void 0:t.entries)??[]).map(n=>({binding:n.binding,visibility:n.visibility,buffer:n.buffer?{...n.buffer}:void 0,sampler:n.sampler?{...n.sampler}:void 0,texture:n.texture?{...n.texture}:void 0,storageTexture:n.storageTexture?{...n.storageTexture}:void 0,externalTexture:n.externalTexture?{...n.externalTexture}:void 0}))}const Ym=Mn(\"frame-state\");function Kr(e){return e.service(Ym,Qm)}function Qm(){const e=new Set;let t=Ua(),n=!1,r=!1;const i={time:0,deltaTime:0,frameCount:0,advanceBy(s){i.deltaTime=s,i.time+=s,r=!0},tick(){if(n)throw So();n=!0;try{const s=Ua();r?r=!1:(i.deltaTime=Math.max(0,(s-t)/1e3),i.time+=i.deltaTime),t=s,i.frameCount+=1;for(const o of[...e])o()}finally{n=!1}},onAdvance(s){return e.add(s),()=>{e.delete(s)}}};return i}function Ua(){var e,t;return((t=(e=globalThis.performance)==null?void 0:e.now)==null?void 0:t.call(e))??Date.now()}function Zm(e,t,n={}){const r=Y(e,\"surface\"),i=ep(r),s=i.get(t);if(s&&!s.disposed)throw $f(s.label);const o=new Ga(r.device,t,n,u=>{i.get(u.canvas)===u&&i.delete(u.canvas),a(),c()}),a=Kr(r).onAdvance(()=>o.applyAutoResize()),c=r.own(\"resource\",()=>o.dispose());return i.set(t,o),o}const Jm=Mn(\"surfaces\");function ep(e){return e.service(Jm,()=>new Map)}let jn=0,Ki=0;function tp(){return jn>0}function Ma(){return Ki>0}function np(){Ki+=1}function rp(){Ki-=1}function Xi(e){return e instanceof Ga}class Ga{constructor(t,n,r,i){w(this,B);m(this,\"device\");m(this,\"canvas\");m(this,\"options\");m(this,\"unregister\");m(this,\"resourceIdentity\",yr(\"render-target\"));m(this,\"label\");m(this,\"context\");m(this,\"autoResize\");m(this,\"layoutBacked\");m(this,\"format\");w(this,Qn,new wr);w(this,Ft,new Set);w(this,Lt,new Set);w(this,Me);w(this,pn);w(this,it,!1);w(this,st,!1);this.device=t,this.canvas=n,this.options=r,this.unregister=i,this.label=r.label,x(this,pn,r.clearColor===void 0?qi:qr(r.clearColor,\"surface.clearColor\"));const s=n.getContext(\"webgpu\");if(!s)throw kf();if(this.context=s,this.layoutBacked=ip(n),r.autoResize===!0&&!this.layoutBacked)throw Pf();this.autoResize=r.autoResize??(r.size?!1:this.layoutBacked),x(this,Me,Na(r.dpr)),this.format=r.format??op();const o=sp(n,r,this.layoutBacked,l(this,Me));(r.size||this.layoutBacked)&&Va(n,o),s.configure({device:t.gpu,format:this.format,alphaMode:r.alphaMode??\"premultiplied\",colorSpace:r.colorSpace??\"srgb\",usage:ap()})}get gpu(){return this.context}get size(){return y(this,B,Ce).call(this),Xr(this.canvas)}get texelSize(){const t=this.size;return[1/t[0],1/t[1]]}get color(){return y(this,B,Ce).call(this),new Fe(this.device,this.context.getCurrentTexture(),{kind:\"2d\",size:this.size,format:this.format,usage:[\"render_attachment\",\"texture_binding\",\"copy_src\"],label:this.options.label?`${this.options.label}.color`:\"surface.color\"},\"external\")}get colors(){return[this.color]}get depth(){y(this,B,Ce).call(this)}get sampleCount(){return y(this,B,Ce).call(this),1}get dpr(){return l(this,Me)}get clearColor(){return ji(l(this,pn))}set clearColor(t){x(this,pn,qr(t,\"surface.clearColor\"))}get disposed(){return l(this,it)}resize(t){if(y(this,B,Ce).call(this),l(this,st))throw Af(this.options.label);y(this,B,ps).call(this,Yr(t),l(this,Me),!0)}applyAutoResize(){if(l(this,it)||!this.autoResize||!this.layoutBacked)return;const t=Na(this.options.dpr),n=Oa(this.canvas,t);y(this,B,ps).call(this,n,t,!0)}onResize(t){y(this,B,Ce).call(this),l(this,Ft).add(t),x(this,st,!0),jn+=1;try{t(y(this,B,gs).call(this))}finally{jn-=1,x(this,st,!1)}return()=>{l(this,Ft).delete(t)}}onDestroy(t){return y(this,B,Ce).call(this),l(this,Qn).onDestroy(this,t)}onTexturesRecreated(t){return y(this,B,Ce).call(this),l(this,Lt).add(t),()=>{l(this,Lt).delete(t)}}renderPassDescriptor(t={}){const{clear:n=[0,0,0,1],preserve:r}=t;y(this,B,Ce).call(this);const i={view:this.context.getCurrentTexture().createView(),loadOp:r?\"load\":\"clear\",storeOp:\"store\"};return r||(i.clearValue=Ia(n)),{colorAttachments:[i]}}dispose(){var t,n;if(!l(this,it)){x(this,it,!0);try{(n=(t=this.context).unconfigure)==null||n.call(t)}catch{}this.unregister(this),l(this,Ft).clear(),l(this,Lt).clear(),l(this,Qn).emit(this)}}}Qn=new WeakMap,Ft=new WeakMap,Lt=new WeakMap,Me=new WeakMap,pn=new WeakMap,it=new WeakMap,st=new WeakMap,B=new WeakSet,ps=function(t,n,r){const i=!ka(Xr(this.canvas),t);x(this,Me,n),i&&(Va(this.canvas,t),y(this,B,Kc).call(this),r&&y(this,B,Xc).call(this))},Kc=function(){for(const t of[...l(this,Lt)])t()},Xc=function(){x(this,st,!0),jn+=1;try{const t=y(this,B,gs).call(this);for(const n of[...l(this,Ft)])n(t)}finally{jn-=1,x(this,st,!1)}},gs=function(){const t=Xr(this.canvas);return{width:t[0],height:t[1],dpr:l(this,Me),surface:this}},Ce=function(){if(l(this,it))throw Tf(this.options.label)};function ip(e){return typeof e.clientWidth==\"number\"}function sp(e,t,n,r){return t.size?Yr(t.size):n?Oa(e,r):Yr(Xr(e))}function Oa(e,t){const n=e;return Yr([Math.round(n.clientWidth*t),Math.round(n.clientHeight*t)])}function Xr(e){const t=e;return[t.width,t.height]}function Va(e,t){const n=e;n.width=t[0],n.height=t[1]}function Yr(e){return[Math.max(1,Math.floor(e[0])),Math.max(1,Math.floor(e[1]))]}function Na(e){const t=globalThis.devicePixelRatio??1;return Array.isArray(e)?Math.min(e[1],Math.max(e[0],t)):typeof e==\"number\"?e:t}function op(){var e,t,n;return((n=(t=(e=globalThis.navigator)==null?void 0:e.gpu)==null?void 0:t.getPreferredCanvasFormat)==null?void 0:n.call(t))??\"bgra8unorm\"}function ap(){const e=globalThis.GPUTextureUsage;return e?e.RENDER_ATTACHMENT|e.TEXTURE_BINDING|e.COPY_SRC:void 0}const cp={drawIndirect:{bytes:16,args:\"4 u32 values: vertexCount, instanceCount, firstVertex, firstInstance\"},drawIndexedIndirect:{bytes:20,args:\"5 32-bit values: indexCount, instanceCount, firstIndex, baseVertex (signed), firstInstance\"},dispatchWorkgroupsIndirect:{bytes:12,args:\"3 u32 values: workgroupCountX, workgroupCountY, workgroupCountZ\"}};function Ba(e,t,n,r){const i=typeof n==\"object\"&&n!==null?n.buffer:void 0,s=za(n)?n:za(i)?i:void 0;if(!s)throw yt(e,`received ${qa(n)}; expected a StorageBuffer or { buffer, offset? }.`,t);const o=s===n?0:n.offset??0;if(typeof o!=\"number\"||!Number.isInteger(o)||o<0)throw yt(e,`offset must be an integer >= 0; received ${qa(o)}.`,t);if(o%4!==0)throw yt(e,`offset must be a multiple of 4 (WebGPU requires \"indirectOffset is a multiple of 4\"); received ${o}.`,t);if(!s.buffer.options.usage.includes(\"indirect\"))throw yt(e,`the buffer lacks the \"indirect\" usage (WebGPU requires \"indirectBuffer.usage contains INDIRECT\"); create it with storage(gpu, ${s.size}, { indirect: true }).`,t);const{bytes:a,args:c}=cp[r];if(o+a>s.size)throw yt(e,`${r} reads ${a} bytes (${c}) at offset ${o}, but offset + ${a} = ${o+a} exceeds the buffer size ${s.size}.`,t);return{buffer:s.gpu,offset:o}}function za(e){return typeof e==\"object\"&&e!==null&&\"gpu\"in e&&\"size\"in e&&e.buffer instanceof Se}function qa(e){if(typeof e==\"string\")return`\"${e}\"`;try{return JSON.stringify(e)??String(e)}catch{return String(e)}}const Qr=Symbol(\"vgpu.frame.drawable\");function up(e){return e==null?void 0:e[Qr]}const ja=Symbol(\"vgpu.frame.bundle\");function lp(e){return e==null?void 0:e[ja]}const Zr=Symbol(\"vgpu.frame.passAttachment\");function fp(e){return typeof(e==null?void 0:e[Zr])==\"function\"?e:void 0}function dp(e,t){return Jr(Y(e,\"sampler\")).sampler(t)}let Wa=1;function hp(e){const t=new Map,n=new WeakMap;return{sampler(r={}){const i=Yi(r);let s=t.get(i);return s||(s=e.gpu.createSampler(r),t.set(i,s),n.set(s,{kind:\"sampler\",id:Wa++})),s},identity(r){let i=n.get(r);return i||(i={kind:\"sampler\",id:Wa++},n.set(r,i)),i}}}function Yi(e){if(e===null||typeof e!=\"object\")return JSON.stringify(e);if(Array.isArray(e))return`[${e.map(Yi).join(\",\")}]`;const t=e;return`{${Object.keys(t).sort().map(n=>`${JSON.stringify(n)}:${Yi(t[n])}`).join(\",\")}}`}const mp=Mn(\"render-service\");function Jr(e){return e.service(mp,pp)}function pp(e){const t=e.device,n=Ci(),r=La(t,{errorSink:a=>e.reportError(a),registerSettledSource:a=>e.registerSettledSource(a)}),i=Ca(t),s=Fa(t),o=hp(t);return e.own(\"service\",()=>{r.dispose(),i.dispose(),s.dispose(),n.dispose()}),{binds:n,pipelines:r,shaderModules:i,pipelineLayouts:s,sampler:a=>o.sampler(a)}}function Qi(e){if(typeof e==\"string\")return e;if(!gp(e)||!(\"version\"in e)||e.version!==1)throw kr(e);const n=e.wgsl;if(typeof n!=\"string\")throw kr(e);return n}function gp(e){return typeof e==\"object\"&&e!==null}function bp(e,t){const n=Y(e,\"draw\"),r=Jr(n),i=Qi(t.shader);return new Ka(n.device,i,{...t,shader:i},r.binds,void 0,r.pipelines,r.shaderModules,r.pipelineLayouts,s=>n.reportError(s),s=>{n.trackDelivery(s)})}let yp=1;const Ha=new WeakMap;class Ka{constructor(t,n,r,i=Ci(),s,o=La(t),a=Ca(t),c=Fa(t),u,f){w(this,U);m(this,\"source\");m(this,\"label\");w(this,gn,new Map);this.source=n,M(t,\"Draw.constructor\"),this.label=r.label??\"draw\";const d=yp++,h=Ri(n,`${this.label}.wgsl`),g=$p(this.label,r.entry),b=Wi(this.label,h.entryPoints,\"vertex\",g.vertex,\"draw\"),v=Wi(this.label,h.entryPoints,\"fragment\",g.fragment,\"draw\"),E=Tp(h,b,v),k=[b,v].filter(ie=>!!ie),I=ha(h.bindings,k);wp(t,this.label,h.bindings,k,I);const R=r.geometry,H=b?Nn(b,\"inputs\",this.label):[],te=R&&sn in R?R[sn](H,`${this.label}.geometry`):R==null?void 0:R.vertexBufferLayouts,X=new Map(pa(t,this.label,h,I)),z=c.get(X),ve=a.get(n,`${this.label}.shader`),pt=Kp(),_e=_p(this.label,r),p=Ep(this.label,r,_e),S=Pp(t,this.label,r),$=Fp(t,this.label,r),P=Mp(this.label,r),V=Op(this.label,r),ne=Aa(this.label,r.constants,h.overrides,\"draw\"),q=ba({device:t,label:this.label,drawId:d,reflection:h,bindGroupLayouts:X,cache:i,onIdentityChange:ie=>pt.markStale({kind:\"binding-identity\",drawLabel:this.label,...ie})});Ha.set(this,{id:d,device:t,opts:r,vertexBufferLayouts:te,cache:i,defaultTarget:s,reflection:h,visibility:I,vertexEntry:(b==null?void 0:b.name)??\"vs_main\",fragmentEntry:(v==null?void 0:v.name)??\"fs_main\",entryKey:E,setCore:q,bindGroupLayouts:X,pipelineLayout:z,shaderModule:ve,pipelineStore:o,pipelineLayouts:c,errorSink:u,trackSettled:f,resolvedPipelineKeys:new Set,recordedIn:pt,..._e,...p,...S,...$,...P,...V,...ne}),r.set&&this.set(r.set);for(const ie of r.targets??[])this.compileSync(ie)}get gpu(){const t=T(this);for(const n of t.resolvedPipelineKeys){const r=t.pipelineStore.getReady(n);if(r)return r}}get targets(){return T(this).opts.targets}get[Qr](){return this}writesDepth(){return Wp(this)}stencilWritingOps(){return Hp(this)}set(t){const n=T(this);M(n.device,`${this.label}.set`);for(const r of n.setCore.set(t))n.recordedIn.markStale({kind:\"binding-identity\",drawLabel:this.label,...r});return this}group(t,n){const r=T(this);M(r.device,`${this.label}.group`);const i=l(this,gn).get(t)??this.layout(t),s=r.setCore.claimGroup(t,n,i);return r.recordedIn.markStale({kind:\"group-claim\",drawLabel:this.label,group:t,previousIdentity:s,newIdentity:`claimed-group:${t}`}),this}layout(t,n={}){return M(T(this).device,`${this.label}.layout`),n.dynamicOffsets?y(this,U,Yc).call(this,t):T(this).setCore.layout(t)}draw(t={}){var d,h,g,b;M(T(this).device,`${this.label}.draw`);const n=Wr(t)?{target:t}:t,r=T(this),i=n.target??r.defaultTarget;if(!i)throw wi(`${this.label}.draw`);pc(i,`${this.label}.draw`);const s=r.device.gpu.createCommandEncoder(),o=s.beginRenderPass(i.renderPassDescriptor()),a=[];try{this.encode(o,i,n,v=>a.push(v))}catch(v){me(a),ea(r.device);try{o.end()}catch{}throw v}na(r.device,o,a,(d=a[0])==null?void 0:d.context);let c;const u=(h=a[0])==null?void 0:h.context;u&&Bn(r.device,u);try{c=s.finish()}catch(v){const E=u?be(r.device):void 0;me(a),E&&me([E]);const k=(E==null?void 0:E.context)??u;if(k){mc(r,k.label,k.group,v);return}throw v}if(u){const v=be(r.device);v&&(a[0]=a[0]?Gr(v,a[0]):v)}const f=(g=a[0])==null?void 0:g.context;f&&Bn(r.device,f);try{r.device.gpu.queue.submit([c])}catch(v){const E=f?be(r.device):void 0;me(a),E&&me([E]);const k=(E==null?void 0:E.context)??f;if(k){mc(r,k.label,k.group,v);return}throw v}if(f){const v=be(r.device);v&&(a[0]=a[0]?Gr(v,a[0]):v)}if(a.length){const v=ta(r.device,a,{errorSink:r.errorSink});(b=r.trackSettled)==null||b.call(r,v)}}encode(t,n,r={},i){M(T(this).device,`${this.label}.encode`),T(this).setCore.assertUsable();const s=this.pipelineFor(n,!0);if(!s)return;t.setPipeline(s);const o=T(this);o.blendConstant&&t.setBlendConstant(o.blendConstant),o.stencilRef!==void 0&&t.setStencilReference(o.stencilRef);for(const a of o.setCore.bindGroups())y(this,U,Qc).call(this,t,a,r,i);y(this,U,eu).call(this,t,r)}compile(t){M(T(this).device,`${this.label}.compile`);const{key:n,signature:r,signatureKey:i}=y(this,U,hr).call(this,t,`${this.label}.compile`);return T(this).pipelineStore.getAsync(n,()=>y(this,U,ys).call(this,r),{where:`${this.label}.compile`,signature:i}).then(()=>(M(T(this).device,`${this.label}.compile`),T(this).resolvedPipelineKeys.add(n),this))}compileSync(t){M(T(this).device,`${this.label}.compileSync`);const{key:n,signature:r,signatureKey:i}=y(this,U,hr).call(this,t,`${this.label}.compileSync`);return T(this).pipelineStore.getSync(n,()=>y(this,U,bs).call(this,r),{where:`${this.label}.compileSync`,signature:i})&&T(this).resolvedPipelineKeys.add(n),this}pipelineFor(t,n=!1){M(T(this).device,`${this.label}.pipelineFor`);const{key:r,signature:i,signatureKey:s}=y(this,U,hr).call(this,t,`${this.label}.pipelineFor`,n),o=T(this).pipelineStore.getSync(r,()=>y(this,U,bs).call(this,i),{where:`${this.label}.pipelineFor`,signature:s});return o&&T(this).resolvedPipelineKeys.add(r),o}pipelineForAsync(t){M(T(this).device,`${this.label}.pipelineForAsync`);const{key:n,signature:r,signatureKey:i}=y(this,U,hr).call(this,t,`${this.label}.pipelineForAsync`);return T(this).pipelineStore.getAsync(n,()=>y(this,U,ys).call(this,r),{where:`${this.label}.pipelineForAsync`,signature:i}).then(o=>(M(T(this).device,`${this.label}.pipelineForAsync`),T(this).resolvedPipelineKeys.add(n),o))}}gn=new WeakMap,U=new WeakSet,Yc=function(t){const n=T(this);n.setCore.layout(t);const r=l(this,gn).get(t);if(r)return r;const i=Yp(this,t),s=ga(n.device,`${this.label}.group${t}.dynamic.bgl`,i);return l(this,gn).set(t,s),n.bindGroupLayouts.set(t,s),n.pipelineLayout=n.pipelineLayouts.get(n.bindGroupLayouts),s},Qc=function(t,n,r,i){const s=Xp(r.offsets,n.group,n.offsets);if(!n.claimValidation||!i){t.setBindGroup(n.group,n.bindGroup,s);return}Bn(T(this).device,n.claimValidation);try{t.setBindGroup(n.group,n.bindGroup,s)}catch(a){throw Nh(T(this).device),Zt(n.claimValidation.label,n.claimValidation.group,a)}const o=be(T(this).device);o&&i(o)},hr=function(t,n,r=!1){const i=y(this,U,Zc).call(this,t,n,r),s=Hr(i);return{signature:i,signatureKey:s,key:y(this,U,Jc).call(this,i)}},Zc=function(t,n,r=!1){var a;const i=T(this),s=t??i.defaultTarget;if(!s)throw wi(n);r||pc(s,n);const o=$a(s);if(Ta(o,n),i.colorStates&&i.colorStates.length!==o.colors.length)throw gi(this.label,`expected one entry per color attachment; colors has ${i.colorStates.length}, but the target signature has ${o.colors.length}.`,n);if((a=i.multisampleState)!=null&&a.alphaToCoverageEnabled&&(o.sampleCount??1)<=1)throw _r(this.label,`alphaToCoverage requires a multisampled target, but the target signature has sampleCount ${o.sampleCount??1}; create the target with msaa: true.`,n);if((i.stencilState||i.stencilRef!==void 0)&&!qn(o.depth))throw Jt(this.label,`stencil requires a depth format with a stencil aspect, but the target signature has ${o.depth?`\"${o.depth}\"`:\"no depth\"}; create the target with depth: \"depth24plus-stencil8\".`,n);return o},Jc=function(t){const n=T(this),r=n.opts.geometry;return Vm({module:n.shaderModule,pipelineLayout:n.pipelineLayout,vertexBufferLayouts:n.vertexBufferLayouts,signature:t,fragmentKey:n.fragmentKey,topology:r==null?void 0:r.topology,stripIndexFormat:Ya(r),cullMode:n.cullMode,frontFace:n.frontFace,unclippedDepth:n.unclippedDepth,depthKey:n.depthKey,stencilKey:n.stencilKey,multisampleKey:n.multisampleKey,constantsKey:n.constantsKey,entryKey:n.entryKey})},eu=function(t,n={}){const r=T(this).opts.geometry;if(r!=null&&r.vertexBuffers&&r.vertexBuffers.forEach((s,o)=>t.setVertexBuffer(o,s)),n.indirect!==void 0)return y(this,U,tu).call(this,t,r,n);const i=vp(this.label,r,T(this).opts,n);if(!(r!=null&&r.indexBuffer))return t.draw(i.vertexCount,i.instanceCount,i.firstVertex,i.firstInstance);t.setIndexBuffer(r.indexBuffer,r.indexFormat??\"uint32\"),t.drawIndexed(i.indexCount,i.instanceCount,i.firstIndex,i.baseVertex,i.firstInstance)},tu=function(t,n,r){const i=`${this.label}.draw`,s=xp.find(u=>r[u]!==void 0);if(s!==void 0)throw yt(this.label,`indirect cannot be combined with ${s} in the same call; the GPU reads the draw arguments from the buffer, so the CPU-side value would be ignored.`,i);const o=!!(n!=null&&n.indexBuffer),{buffer:a,offset:c}=Ba(this.label,i,r.indirect,o?\"drawIndexedIndirect\":\"drawIndirect\");if(!o)return t.drawIndirect(a,c);t.setIndexBuffer(n.indexBuffer,n.indexFormat??\"uint32\"),t.drawIndexedIndirect(a,c)},bs=function(t){const n=T(this);return n.device.gpu.createRenderPipeline({label:`${this.label}.pipeline`,layout:n.pipelineLayout,vertex:{module:n.shaderModule,entryPoint:n.vertexEntry,buffers:[...n.vertexBufferLayouts??[]],...n.constants?{constants:n.constants}:{}},fragment:{module:n.shaderModule,entryPoint:n.fragmentEntry,targets:Xa(t,n),...n.constants?{constants:n.constants}:{}},primitive:Qa(n.opts.geometry,n.cullMode,n.frontFace,n.unclippedDepth),depthStencil:oc(t,n),multisample:uc(t,n)})},ys=function(t){const n=T(this);return n.device.gpu.createRenderPipelineAsync({label:`${this.label}.pipeline`,layout:n.pipelineLayout,vertex:{module:n.shaderModule,entryPoint:n.vertexEntry,buffers:[...n.vertexBufferLayouts??[]],...n.constants?{constants:n.constants}:{}},fragment:{module:n.shaderModule,entryPoint:n.fragmentEntry,targets:Xa(t,n),...n.constants?{constants:n.constants}:{}},primitive:Qa(n.opts.geometry,n.cullMode,n.frontFace,n.unclippedDepth),depthStencil:oc(t,n),multisample:uc(t,n)})};function wp(e,t,n,r,i){const s=e.limits;for(const[o,a,c]of[[\"vertex\",1,\"maxStorageBuffersInVertexStage\"],[\"fragment\",2,\"maxStorageBuffersInFragmentStage\"]]){const u=r.find(h=>h.stage===o);if(!u)continue;const f=n.filter(h=>{var g;return((g=h.bindingLayout)==null?void 0:g.kind)===\"buffer\"&&h.bindingLayout.buffer.type!==\"uniform\"&&i(h)&a}),d=s[c]??s.maxStorageBuffersPerShaderStage;if(d!==void 0&&f.length>d)throw Zl(t,o,u.name,f.length,d,f)}}const xp=[\"vertices\",\"indices\",\"instances\",\"firstVertex\",\"firstIndex\",\"baseVertex\",\"firstInstance\"];function Xa(e,t){return e.colors.map((n,r)=>{var c;const i=(c=t.colorStates)==null?void 0:c[r],s=(i==null?void 0:i.blendState)??t.blendState,o=(i==null?void 0:i.writeMask)??t.writeMask,a={format:n};return s&&(a.blend=s),o!==void 0&&(a.writeMask=o),a})}function vp(e,t,n,r){Je(e,\"DrawOptions.instances\",n.instances),Je(e,\"DrawOptions.vertices\",n.vertices),Je(e,\"DrawOptions.firstInstance\",n.firstInstance),Je(e,\"DrawCallOptions.instances\",r.instances),Ze(e,\"DrawCallOptions.vertices\",r.vertices),Ze(e,\"DrawCallOptions.indices\",r.indices),Ze(e,\"DrawCallOptions.firstVertex\",r.firstVertex),Ze(e,\"DrawCallOptions.firstIndex\",r.firstIndex),Ze(e,\"DrawCallOptions.baseVertex\",r.baseVertex),Je(e,\"DrawCallOptions.firstInstance\",r.firstInstance),Je(e,\"GeometryLike.vertexCount\",t==null?void 0:t.vertexCount),Je(e,\"GeometryLike.indexCount\",t==null?void 0:t.indexCount),Je(e,\"GeometryLike.instanceCount\",t==null?void 0:t.instanceCount),Ze(e,\"GeometryLike.firstVertex\",t==null?void 0:t.firstVertex),Ze(e,\"GeometryLike.firstIndex\",t==null?void 0:t.firstIndex),Ze(e,\"GeometryLike.baseVertex\",t==null?void 0:t.baseVertex);const i=!!(t!=null&&t.indexBuffer),o=(t==null?void 0:t.geometry)??(t&&sn in t?t:void 0),a=r.firstVertex??(t==null?void 0:t.firstVertex)??0,c=r.vertices??(t==null?void 0:t.vertexCount)??n.vertices??3,u=r.firstIndex??(t==null?void 0:t.firstIndex)??0,f=r.indices??(t==null?void 0:t.indexCount)??0,d=r.baseVertex??(t==null?void 0:t.baseVertex)??0;if(i)Za(e,\"index\",u,f,o==null?void 0:o.indexCount);else if(r.indices!==void 0||r.firstIndex!==void 0||r.baseVertex!==void 0)throw nn(`${e}.draw`,\"Index range needs an indexed geometry.\");return i||Za(e,\"vertex\",a,c,o==null?void 0:o.vertexCount),{instanceCount:r.instances??n.instances??(t==null?void 0:t.instanceCount)??1,firstInstance:r.firstInstance??n.firstInstance??0,vertexCount:c,firstVertex:a,indexCount:f,firstIndex:u,baseVertex:d}}function Ya(e){const t=(e==null?void 0:e.topology)??\"triangle-list\";return(e==null?void 0:e.stripIndexFormat)??(t.endsWith(\"strip\")?e==null?void 0:e.indexFormat:void 0)}function Qa(e,t,n,r){const i=(e==null?void 0:e.topology)??\"triangle-list\",s=Ya(e),o=s?{topology:i,stripIndexFormat:s}:{topology:i};return t!==void 0&&(o.cullMode=t),n!==void 0&&(o.frontFace=n),r&&(o.unclippedDepth=!0),o}function Za(e,t,n,r,i){if(!(i===void 0||n+r<=i))throw nn(`${e}.draw`,`${t} range [${n}, ${n+r}) exceeds parent geometry ${t} count ${i}.`)}function Ze(e,t,n){if(!(n===void 0||Number.isInteger(n)&&n>=0))throw nn(`${e}.draw`,`${t} must be an integer >= 0; received ${String(n)}.`)}function Je(e,t,n){if(n!==void 0&&!(Number.isInteger(n)&&n>=0))throw new _({code:\"VGPU-R1-DRAW-COUNT\",message:`${t} of '${e}' must be an integer >= 0; received ${String(n)}. Use 0 only when you want to issue a valid draw with no vertices/instances.`,where:`${e}.draw`})}function _p(e,t){const n=t.blend===void 0?void 0:Ja(e,t.blend),r=t.writeMask===void 0?void 0:lc(e,t.writeMask),i=t.colors===void 0?void 0:Sp(e,t.colors),s=i?`${fc(n,r)}@${i.map(Np).join(\"@\")}`:n||r!==void 0?fc(n,r):void 0;return{blendState:n,writeMask:r,colorStates:i,fragmentKey:s}}function Sp(e,t){if(!Array.isArray(t))throw gi(e,`colors must be an array; received ${O(t)}.`);return t.map((n,r)=>{if(n==null)return null;if(typeof n!=\"object\"||Array.isArray(n))throw gi(e,`colors[${r}] must be null or { blend?, writeMask? }; received ${O(n)}.`);const i=n.blend===void 0?void 0:Ja(`${e}.colors[${r}]`,n.blend),s=n.writeMask===void 0?void 0:lc(`${e}.colors[${r}]`,n.writeMask);return!i&&s===void 0?null:{blendState:i,writeMask:s}})}function Ja(e,t){if(t===\"alpha\")return ei({src:\"src-alpha\",dst:\"one-minus-src-alpha\"},{src:\"one\",dst:\"one-minus-src-alpha\"});if(t===\"premultiplied\")return ei({src:\"one\",dst:\"one-minus-src-alpha\"},{src:\"one\",dst:\"one-minus-src-alpha\"});if(t===\"additive\")return ei({src:\"one\",dst:\"one\"},{src:\"one\",dst:\"one\"});if(typeof t!=\"object\"||t===null||!ec(t.color))throw fo(e,t);const n=t.color,r=t.alpha;if(r!==void 0&&!ec(r))throw fo(e,t);return ei(n,r??n)}function ec(e){return typeof e==\"object\"&&e!==null&&typeof e.src==\"string\"&&typeof e.dst==\"string\"}function ei(e,t){return{color:tc(e),alpha:tc(t)}}function tc(e){return{srcFactor:e.src,dstFactor:e.dst,operation:e.op??\"add\"}}function Ep(e,t,n){if(t.blendConstant===void 0)return{};const r=t.blendConstant;if(!Array.isArray(r)||r.length!==4||r.some(i=>typeof i!=\"number\"||!Number.isFinite(i)))throw ho(e,`received ${O(r)}; expected [r, g, b, a] finite numbers.`);if(!Ip(n).some(i=>i&&kp(i)))throw ho(e,`no color target's effective blend uses a \"constant\"/\"one-minus-constant\" factor (colors[i].blend replaces the top-level blend for that target), so blendConstant would have no effect.`);return{blendConstant:{r:r[0],g:r[1],b:r[2],a:r[3]}}}function Ip(e){return e.colorStates?e.colorStates.map(t=>(t==null?void 0:t.blendState)??e.blendState):[e.blendState]}function kp(e){return[e.color.srcFactor,e.color.dstFactor,e.alpha.srcFactor,e.alpha.dstFactor].some(t=>t===\"constant\"||t===\"one-minus-constant\")}function $p(e,t){if(t===void 0)return{};if(typeof t!=\"object\"||t===null||Array.isArray(t))throw Er(e,`received ${O(t)}; expected { vertex?, fragment? } entry point names.`);return t}function Tp(e,t,n){const r=e.entryPoints.find(s=>s.stage===\"vertex\"),i=e.entryPoints.find(s=>s.stage===\"fragment\");if(!(t===r&&n===i))return`en~${(t==null?void 0:t.name)??\"\"}~${(n==null?void 0:n.name)??\"\"}`}function Pp(e,t,n){const r=n.cull===void 0?void 0:Rp(t,n.cull),i=n.frontFace===void 0?void 0:Cp(t,n.frontFace),s=n.unclippedDepth===void 0?void 0:Ap(e,t,n.unclippedDepth);return{cullMode:r,frontFace:i,unclippedDepth:s}}function Ap(e,t,n){if(typeof n!=\"boolean\")throw po(t,`received ${O(n)}; expected a boolean.`);if(n){if(!e.features.has(\"depth-clip-control\"))throw po(t,'the device lacks the \"depth-clip-control\" feature; request it at init: init({ requiredFeatures: [\"depth-clip-control\"] }) on an adapter that supports it.');return!0}}function Rp(e,t){if(t===\"none\"||t===\"front\"||t===\"back\")return t;throw sf(e,t)}function Cp(e,t){if(t===\"ccw\"||t===\"cw\")return t;throw of(e,t)}const nc={depthWriteEnabled:!0,depthCompare:\"less-equal\"},rc=[\"never\",\"less\",\"equal\",\"less-equal\",\"greater\",\"not-equal\",\"greater-equal\",\"always\"],ic=-2147483648,sc=2147483647;function oc(e,t){if(e.depth)return{format:e.depth,...t.depthState??nc,...t.stencilState??{}}}function Fp(e,t,n){var i;if(n.depth===void 0)return{};const r=Lp(e,t,n.depth,((i=n.geometry)==null?void 0:i.topology)??\"triangle-list\");return{depthState:r,depthKey:Dp(r)}}function Lp(e,t,n,r){if(n===!1)return{depthWriteEnabled:!1,depthCompare:\"always\"};if(typeof n!=\"object\"||n===null)throw Le(t,`received ${O(n)}.`);if(n.write!==void 0&&typeof n.write!=\"boolean\")throw Le(t,`write must be a boolean; received ${O(n.write)}.`);if(n.compare!==void 0&&!rc.includes(n.compare))throw Le(t,`compare must be a GPUCompareFunction; received ${O(n.compare)}.`);if(n.bias!==void 0&&!Number.isInteger(n.bias))throw Le(t,`bias must be an integer (WebGPU depthBias is i32); received ${O(n.bias)}.`);if(n.bias!==void 0&&(n.bias<ic||n.bias>sc))throw Le(t,`bias must fit in the i32 range [${ic}, ${sc}] (WebGPU depthBias is i32); received ${O(n.bias)}.`);if(n.biasSlopeScale!==void 0&&!Number.isFinite(n.biasSlopeScale))throw Le(t,`biasSlopeScale must be a finite number; received ${O(n.biasSlopeScale)}.`);if(n.biasClamp!==void 0&&!Number.isFinite(n.biasClamp))throw Le(t,`biasClamp must be a finite number; received ${O(n.biasClamp)}.`);const i=n.bias??0,s=n.biasSlopeScale??0,o=n.biasClamp??0;if((i!==0||s!==0||o!==0)&&!r.startsWith(\"triangle\"))throw Le(t,`bias, biasSlopeScale, and biasClamp must be 0 for \"${r}\" topology.`);if(o!==0&&e.isCompatibilityMode)throw Le(t,`biasClamp must be 0 on a compatibility-mode device; received ${O(n.biasClamp)}.`);return{depthWriteEnabled:n.write??!0,depthCompare:n.compare??\"less-equal\",...i!==0?{depthBias:i}:{},...s!==0?{depthBiasSlopeScale:s}:{},...o!==0?{depthBiasClamp:o}:{}}}function Dp(e){return`${e.depthWriteEnabled?1:0}~${e.depthCompare}~${e.depthBias??0}~${e.depthBiasSlopeScale??0}~${e.depthBiasClamp??0}`}const Up=[\"keep\",\"zero\",\"replace\",\"invert\",\"increment-clamp\",\"decrement-clamp\",\"increment-wrap\",\"decrement-wrap\"];function Mp(e,t){if(t.stencil===void 0)return{};const n=t.stencil;if(typeof n!=\"object\"||n===null||Array.isArray(n))throw Jt(e,`received ${O(n)}; expected { front?, back?, readMask?, writeMask?, ref? }.`);const r=n.front===void 0?void 0:ac(e,\"front\",n.front),i=n.back===void 0?void 0:ac(e,\"back\",n.back);Zi(e,\"readMask\",n.readMask),Zi(e,\"writeMask\",n.writeMask),Zi(e,\"ref\",n.ref);const s={...r?{stencilFront:r}:{},...i??r?{stencilBack:i??{...r}}:{},...n.readMask!==void 0?{stencilReadMask:n.readMask}:{},...n.writeMask!==void 0?{stencilWriteMask:n.writeMask}:{}},o=s.stencilFront!==void 0||s.stencilBack!==void 0||s.stencilReadMask!==void 0||s.stencilWriteMask!==void 0;return!o&&n.ref===void 0?{}:{...o?{stencilState:s,stencilKey:Gp(s)}:{},...n.ref!==void 0?{stencilRef:n.ref}:{}}}function ac(e,t,n){if(typeof n!=\"object\"||n===null||Array.isArray(n))throw Jt(e,`${t} must be a { compare?, fail?, depthFail?, pass? } object; received ${O(n)}.`);if(n.compare!==void 0&&!rc.includes(n.compare))throw Jt(e,`${t}.compare must be a GPUCompareFunction; received ${O(n.compare)}.`);for(const[r,i]of[[\"fail\",n.fail],[\"depthFail\",n.depthFail],[\"pass\",n.pass]])if(i!==void 0&&!Up.includes(i))throw Jt(e,`${t}.${r} must be a GPUStencilOperation; received ${O(i)}.`);return{compare:n.compare??\"always\",failOp:n.fail??\"keep\",depthFailOp:n.depthFail??\"keep\",passOp:n.pass??\"keep\"}}function Zi(e,t,n){if(n!==void 0&&(typeof n!=\"number\"||!Number.isInteger(n)||n<0||n>4294967295))throw Jt(e,`${t} must be an integer in [0, 0xFFFFFFFF] (WebGPU GPUStencilValue is u32); received ${O(n)}.`)}function Gp(e){return`st~${cc(e.stencilFront)}~${cc(e.stencilBack)}~${e.stencilReadMask??4294967295}~${e.stencilWriteMask??4294967295}`}function cc(e){return e?`${e.compare},${e.failOp},${e.depthFailOp},${e.passOp}`:\"default\"}function uc(e,t){return{count:e.sampleCount??1,...t.multisampleState??{}}}function Op(e,t){if(t.multisample===void 0)return{};const n=t.multisample;if(typeof n!=\"object\"||n===null||Array.isArray(n))throw _r(e,`received ${O(n)}; expected { alphaToCoverage?, mask? }.`);if(n.alphaToCoverage!==void 0&&typeof n.alphaToCoverage!=\"boolean\")throw _r(e,`alphaToCoverage must be a boolean; received ${O(n.alphaToCoverage)}.`);if(n.mask!==void 0&&(typeof n.mask!=\"number\"||!Number.isInteger(n.mask)||n.mask<0||n.mask>4294967295))throw _r(e,`mask must be an integer in [0, 0xFFFFFFFF] (WebGPU GPUSampleMask is u32); received ${O(n.mask)}.`);const r={...n.alphaToCoverage!==void 0?{alphaToCoverageEnabled:n.alphaToCoverage}:{},...n.mask!==void 0?{mask:n.mask}:{}};return r.alphaToCoverageEnabled===void 0&&r.mask===void 0?{}:{multisampleState:r,multisampleKey:Vp(r)}}function Vp(e){return`ms~${e.alphaToCoverageEnabled?1:0}~${e.mask??4294967295}`}function lc(e,t){if(!Array.isArray(t))throw mo(e,O(t));let n=0;for(const r of t)if(r===\"r\")n|=1;else if(r===\"g\")n|=2;else if(r===\"b\")n|=4;else if(r===\"a\")n|=8;else throw mo(e,O(r));return n}function fc(e,t){return`${dc(e)};${t??15}`}function dc(e){if(!e)return\"none;none\";const t=e.color,n=e.alpha;return`${t.srcFactor},${t.dstFactor},${t.operation};${n.srcFactor},${n.dstFactor},${n.operation}`}function Np(e){return e?`${e.blendState?dc(e.blendState):\"inherit\"};${e.writeMask??\"inherit\"}`:\"inherit\"}function O(e){if(typeof e==\"string\")return`\"${e}\"`;try{return JSON.stringify(e)??String(e)}catch{return String(e)}}function Bp(e,t){return T(e).setCore.watchResources(n=>t({kind:\"binding-identity\",drawLabel:e.label,...n}))}function zp(e,t){T(e).recordedIn.add(t)}function qp(e){return T(e).blendConstant!==void 0}function jp(e){return T(e).stencilRef!==void 0}function Wp(e){return(T(e).depthState??nc).depthWriteEnabled}function Hp(e){const t=T(e),n=t.stencilState;if(!n||n.stencilWriteMask===0)return[];const r=t.cullMode??\"none\",i=[],s=(o,a)=>{if(a)for(const[c,u]of[[\"fail\",a.failOp],[\"depthFail\",a.depthFailOp],[\"pass\",a.passOp]])u!==void 0&&u!==\"keep\"&&i.push(`${o}.${c}: \"${u}\"`)};return r!==\"front\"&&s(\"front\",n.stencilFront),r!==\"back\"&&s(\"back\",n.stencilBack),i}function hc(e,t,n,r={},i){e.encode(t,n,r,i)}function T(e){const t=Ha.get(e);if(!t)throw new TypeError(\"Invalid Draw instance\");return t}function mc(e,t,n,r){var s;const i=(async()=>{await Fi(e.device),M(e.device,`${t}.validation`);const o=Zt(t,n,r);e.errorSink?await e.errorSink(o):console.error(o)})();return(s=e.trackSettled)==null||s.call(e,i),i}function Kp(){const e=new Set;return{add(t){e.add(t)},delete(t){e.delete(t)},list(){return[...e]},markStale(t){for(const n of e)n.markStale(t)}}}function Xp(e,t,n){return e?Array.isArray(e)?e:e[t]??n:n}function Yp(e,t){const n=T(e);return ma(n.reflection.bindings,t,n.visibility).map(Qp)}function Qp(e){return e.buffer?{...e,buffer:{...e.buffer,hasDynamicOffset:!0}}:e}function pc(e,t){if(Xi(e)&&!Ma())throw xi(t)}function Zp(e,t,n={}){if(\"geometry\"in n)throw G(\"effect\",\"effect() never accepts vertex buffers; use draw(gpu, { shader, geometry: geometry(gpu, descriptor) }).\");const r=Y(e,\"effect\"),i=Jr(r);return new bc(r.device,Qi(t),n,i.binds,void 0,i.pipelines,i.shaderModules,i.pipelineLayouts,s=>r.reportError(s),s=>{r.trackDelivery(s)})}const gc=new WeakMap;class bc{get gpu(){return et(this).gpu}constructor(t,n,r={},i,s,o,a,c,u,f){const d=eg(n),h=new Ka(t,d,{shader:d,set:r.set,label:r.label??\"effect\",blend:r.blend,writeMask:r.writeMask},i,s,o,a,c,u,f);gc.set(this,h)}set(t){return et(this).set(t),this}draw(t={}){et(this).draw(Wr(t)?{target:t}:t)}compile(t){return et(this).compile(t).then(()=>this)}compileSync(t){return et(this).compileSync(t),this}encode(t,n,r={},i){hc(et(this),t,n,r,i)}get[Qr](){return et(this)[Qr]}}function Jp(e){return et(e)}function et(e){const t=gc.get(e);if(!t)throw new TypeError(\"Invalid Effect instance\");return t}function eg(e){return tg(e)?e:`\nstruct VgpuFullscreenVertexOut {\n  @builtin(position) position: vec4f,\n  @location(0) uv: vec2f,\n};\n@vertex fn vgpu_fullscreen_vs(@builtin(vertex_index) vi: u32) -> VgpuFullscreenVertexOut {\n  var pos = array<vec2f, 3>(vec2f(-1.0, -1.0), vec2f(3.0, -1.0), vec2f(-1.0, 3.0));\n  var uv = array<vec2f, 3>(vec2f(0.0, 1.0), vec2f(2.0, 1.0), vec2f(0.0, -1.0));\n  var out: VgpuFullscreenVertexOut;\n  out.position = vec4f(pos[vi], 0.0, 1.0);\n  out.uv = uv[vi];\n  return out;\n}\n${e}`}function tg(e){return Ri(e,\"effect.wgsl\").entryPoints.some(t=>t.stage===\"vertex\")}function ng(e,t,n){return ig(Y(e,\"bundle\").device,t,n)}let rg=1,Ji=0;function ig(e,t,n){const r=t.label??`bundle${rg++}`;if(Xi(t.target)&&!Ma())throw xi(\"bundle\");const i=yc(t.target),s=new sg(e,r,i);return s.record(n),s}class sg{constructor(t,n,r){w(this,Ut);m(this,\"device\");m(this,\"id\");m(this,\"signature\");m(this,\"gpu\");w(this,Dt);w(this,bn);w(this,Zn,new Set);w(this,Jn,[]);this.device=t,this.id=n,this.signature=r,x(this,bn,Hr(r))}record(t){try{this.gpu=hd(this.device,{label:this.id,colorFormats:this.signature.colors,depthStencilFormat:this.signature.depth,sampleCount:this.signature.sampleCount??1,record:n=>y(this,Ut,nu).call(this,t,n.gpu)})}catch(n){throw y(this,Ut,ws).call(this),n}for(const n of l(this,Zn))zp(n,this)}get[ja](){return this}markStale(t){Ji>0&&!(t.kind===\"binding-identity\"&&t.newIdentity.startsWith(\"destroyed:\"))||(l(this,Dt)??x(this,Dt,t),y(this,Ut,ws).call(this))}assertReplayable(t){const n=yc(t),r=Hr(n);if(l(this,bn)!==r)throw wc(this.id,ag(this.id,l(this,bn),r));if(l(this,Dt))throw wc(this.id,cg(this.id,l(this,Dt)))}remember(t){l(this,Zn).add(t),l(this,Dt)||l(this,Jn).push(Bp(t,n=>this.markStale(n)))}}Dt=new WeakMap,bn=new WeakMap,Zn=new WeakMap,Jn=new WeakMap,Ut=new WeakSet,ws=function(){for(const t of l(this,Jn).splice(0))t()},nu=function(t,n){Ji+=1;try{t(new og(this,n))}finally{Ji-=1}};class og{constructor(t,n){m(this,\"bundle\");m(this,\"encoder\");this.bundle=t,this.encoder=n}draw(t,n={}){const r=t instanceof bc?Jp(t):t;if(qp(r))throw rf(this.bundle.id,r.label);if(jp(r))throw af(this.bundle.id,r.label);this.bundle.remember(r),hc(r,this.encoder,this.bundle.signature,n)}}function yc(e){const t=$a(e);return Ta(t,\"bundle\"),t}function ag(e,t,n){return`bundle '${e}' is stale: the replay target signature does not match the recorded signature. Bundles freeze format/depth/sampleCount and bind groups.\n  Recorded signature: ${t}\n  Actual signature: ${n}\n  Fix: re-record the bundle for this target → ${e} = bundle(gpu, { target: scene }, ...)\n  (re-recording is always your responsibility; the library only detects this).`}function cg(e,t){return t.kind===\"group-claim\"?`bundle '${e}' is stale: group ${t.group} of draw\n  '${t.drawLabel}' changed bind group after recording. Bundles freeze commands and bind groups.\n  Fix: re-record it → ${e} = bundle(gpu, { target: scene }, ...)\n  (re-recording is always your responsibility; the library only detects this).`:`bundle '${e}' is stale: binding \\`${t.bindingName}\\` (@group(${t.group}) @binding(${t.binding})) of draw\n  '${t.drawLabel}' changed resource after recording. Bundles freeze commands and bind groups.\n  Fix: re-record it → ${e} = bundle(gpu, { target: scene }, ...)\n  (re-recording is always your responsibility; the library only detects this).`}function wc(e,t){return new _({code:\"VGPU-R3-BUNDLE-STALE\",message:t,where:`bundle '${e}' replay`})}const ug=Mn(\"clock\");function lg(e){return fg(Y(e,\"clock\"))}function fg(e){return e.service(ug,t=>{const n=Kr(t),r=i=>{if(t.disposed)throw To(i);M(t.device,i)};return{get time(){return r(\"clock.time\"),n.time},get deltaTime(){return r(\"clock.deltaTime\"),n.deltaTime},get frameCount(){return r(\"clock.frameCount\"),n.frameCount},advance(i){if(r(\"clock.advance\"),typeof i!=\"number\"||!Number.isFinite(i)||i<0)throw Cf(i);n.advanceBy(i)}}})}function dg(e,t,n={}){const r=Y(e,\"compute\");return new mg(r.device,Qi(t),n,Jr(r).binds)}let hg=1;class mg{constructor(t,n,r={},i=Ci()){w(this,wn);m(this,\"device\");m(this,\"source\");m(this,\"opts\");m(this,\"cache\");m(this,\"id\",hg++);m(this,\"label\");m(this,\"reflection\");m(this,\"entryPoint\");m(this,\"setCore\");m(this,\"bindGroupLayouts\");m(this,\"pipelineLayout\");m(this,\"shaderModule\");m(this,\"pipeline\");w(this,yn);this.device=t,this.source=n,this.opts=r,this.cache=i,M(t,\"Compute.constructor\"),this.label=r.label??\"compute\",this.reflection=Ri(n,`${this.label}.wgsl`);const s=pg(this.reflection,this.label,r.entry);this.entryPoint=s.name;const{constants:o}=Aa(this.label,r.constants,this.reflection.overrides,\"compute\");this.bindGroupLayouts=pa(t,this.label,this.reflection,ha(this.reflection.bindings,[s])),this.pipelineLayout=wm(t,this.bindGroupLayouts),this.shaderModule=t.gpu.createShaderModule({label:`${this.label}.shader`,code:n}),this.pipeline=t.gpu.createComputePipeline({label:`${this.label}.pipeline`,layout:this.pipelineLayout,compute:{module:this.shaderModule,entryPoint:this.entryPoint,...o?{constants:o}:{}}}),this.setCore=ba({device:t,label:this.label,drawId:`compute:${this.id}`,reflection:this.reflection,bindGroupLayouts:this.bindGroupLayouts,cache:this.cache});const a=new Set(Nn(s,\"bindings\",this.label).map(c=>`${c.group}:${c.binding}`));x(this,yn,this.reflection.bindings.filter(c=>c.kind===\"buffer\"&&c.addressSpace===\"storage\"&&a.has(`${c.group}:${c.binding}`))),r.set&&this.set(r.set)}set(t){return M(this.device,`${this.label}.set`),this.setCore.set(t),this}dispatch(t,n,r){M(this.device,`${this.label}.dispatch`);const i=typeof t==\"object\"&&t!==null?y(this,wn,ru).call(this,t,n,r):void 0;y(this,wn,iu).call(this);const s=this.setCore.bindGroups(),o=this.device.gpu.createCommandEncoder({label:`${this.label}.encoder`}),a=o.beginComputePass({label:`${this.label}.pass`});a.setPipeline(this.pipeline);for(const c of s)a.setBindGroup(c.group,c.bindGroup,c.offsets);i?a.dispatchWorkgroupsIndirect(i.buffer,i.offset):a.dispatchWorkgroups(t,n??1,r??1),a.end(),this.device.gpu.queue.submit([o.finish()])}}yn=new WeakMap,wn=new WeakSet,ru=function(t,n,r){const i=`${this.label}.dispatch`;if(n!==void 0||r!==void 0)throw yt(this.label,\"indirect cannot be combined with explicit workgroup counts in the same call; the GPU reads the counts from the buffer, so the CPU-side values would be ignored.\",i);return Ba(this.label,i,t.indirect,\"dispatchWorkgroupsIndirect\")},iu=function(){if(!l(this,yn).length)return;const t=new Map;for(const n of l(this,yn)){const r=this.setCore.bindingState(n.name);if(!r)continue;const i=Ur(r.identity);t.has(i)||t.set(i,[]),t.get(i).push({identity:r.identity,writable:n.access!==\"read\"})}for(const n of t.values())if(!(n.length<2)&&n.some(r=>r.writable))throw Mf(`${this.label}.dispatch`)};function pg(e,t,n){const r=Wi(t,e.entryPoints,\"compute\",n,\"compute\");if(!r)throw G(`${t}.compute`,\"The compute shader requires a @compute entry point.\");return r}function gg(e,t){return vc(Y(e,\"frame\")).frame(t)}function bg(e,t,n={}){return vc(Y(e,\"frameLoop\")).loop(t,n)}let xc;const yg=Mn(\"frame-runner\");function vc(e){return e.service(yg,t=>{const n=Kr(t);return new Pg(()=>{let r=()=>{};const i=new wg(t.device,void 0,s=>t.reportError(s),s=>{t.trackDelivery(s)},()=>r());return r=t.own(\"scheduler\",()=>i.cancel()),i},()=>n.tick(),r=>t.own(\"scheduler\",()=>r.stop()))})}class wg{constructor(t,n,r,i,s){w(this,D);m(this,\"device\");m(this,\"defaultTarget\");m(this,\"errorSink\");m(this,\"trackSettled\");m(this,\"releaseLifecycle\");m(this,\"done\",Promise.resolve());w(this,Mt);w(this,W,[]);w(this,Ge,new Set);w(this,ot,new Set);w(this,Oe,!1);w(this,Ve,!1);w(this,xn,!1);this.device=t,this.defaultTarget=n,this.errorSink=r,this.trackSettled=i,this.releaseLifecycle=s,M(t,\"Frame.constructor\"),x(this,Mt,t.gpu.createCommandEncoder({label:\"vgpu.frame\"}))}pass(t,n){var v;if(l(this,Ve))throw Eo(\"Frame.pass\");M(this.device,\"Frame.pass\");const r=Wr(t),i=typeof n==\"function\"?n:E=>E.draw(n),s=r?t:t.target??this.defaultTarget;if(!s)throw wi(\"Frame.pass\");if(Xi(s)&&l(this,Oe))throw xi(\"Frame.pass\");const o=r?void 0:t.clear,a=o===!1;if(a&&s.sampleCount===4)throw cf();const c=r?void 0:t.clearDepth;if(c!==void 0){if(typeof c!=\"number\"||!(c>=0&&c<=1))throw go(c);if(a)throw uf();if(!s.depth)throw go(c,\"but the target has no depth attachment, so clearDepth would have no effect.\",\"Create the target with depth: true (or a depth format), or drop clearDepth.\")}const u=r?void 0:t.clearStencil;if(u!==void 0){if(typeof u!=\"number\"||!Number.isInteger(u)||u<0||u>4294967295)throw bo(`received ${String(u)}; expected an integer in [0, 0xFFFFFFFF] (WebGPU GPUStencilValue).`);if(a)throw lf();const E=(v=s.depth)==null?void 0:v.format;if(!qn(E))throw bo(`received ${String(u)}, but the target's depth format ${E?`\"${E}\"`:\"(none)\"} has no stencil aspect, so clearStencil would have no effect.`)}const f=r?void 0:t.depthReadOnly;if(f!==void 0&&typeof f!=\"boolean\")throw wt(`received ${tt(f)}; expected a boolean.`,\"Pass depthReadOnly: true to open the pass with a read-only depth attachment, or omit it.\");if(f){if(!s.depth)throw wt(\"is set, but the target has no depth attachment, so there is nothing to make read-only.\",\"Create the target with depth: true (or a depth format), or drop depthReadOnly.\");if(s.sampleCount===4)throw ff();if(c!==void 0)throw wt(\"cannot be combined with clearDepth; a read-only depth aspect omits its load/store ops and is never cleared.\",\"Remove clearDepth, or drop depthReadOnly.\");if(u!==void 0)throw wt(\"cannot be combined with clearStencil; a read-only stencil aspect omits its load/store ops and is never cleared.\",\"Remove clearStencil, or drop depthReadOnly.\")}const d=r?void 0:kg(t.viewport,this.device.gpu.limits,s.size),h=r?void 0:$g(t.scissor,s.size),g=[];let b;try{const E=r||t.timer===void 0?void 0:y(this,D,_s).call(this,t.timer,s,g,Eg),k=r||t.visibility===void 0?void 0:y(this,D,_s).call(this,t.visibility,s,g,Ig),I=k==null?void 0:k.occlusion;let R=s.renderPassDescriptor({clear:o===void 0||o===!0||o===!1?s.clearColor??qi:o,preserve:a,clearDepth:c,clearStencil:u,depthReadOnly:f});E!=null&&E.timestampWrites&&(R={...R,timestampWrites:E.timestampWrites}),I&&(R={...R,occlusionQuerySet:I.querySet}),b=l(this,Mt).beginRenderPass(R),d&&b.setViewport(d.x,d.y,d.width,d.height,d.minDepth,d.maxDepth),h&&b.setScissorRect(h[0],h[1],h[2],h[3]),x(this,xn,!0);try{i(new xg(b,s,l(this,W),f===!0,I,this,H=>{if(M(this.device,H),l(this,Ve))throw Eo(H)}))}finally{x(this,xn,!1)}}catch(E){y(this,D,xs).call(this,g),me(l(this,W)),l(this,W).length=0,ea(this.device);try{b==null||b.end()}catch{}throw E}na(this.device,b,l(this,W))}submit(){var i,s,o;if(l(this,Oe)||l(this,Ve))return;M(this.device,\"Frame.submit\"),x(this,Oe,!0),(i=this.releaseLifecycle)==null||i.call(this);for(const a of y(this,D,vs).call(this))a.finalizeFrame(this,l(this,Mt));let t;const n=(s=l(this,W)[0])==null?void 0:s.context;n&&Bn(this.device,n);try{t=l(this,Mt).finish()}catch(a){y(this,D,mr).call(this,y(this,D,ri).call(this));const c=n?be(this.device):void 0;me(l(this,W)),c&&me([c]);const u=(c==null?void 0:c.context)??n;if(!u)throw a;this.done=y(this,D,ii).call(this,y(this,D,Ss).call(this,u.label,u.group,a));return}if(n){const a=be(this.device);a&&(l(this,W)[0]=l(this,W)[0]?Gr(a,l(this,W)[0]):a)}const r=(o=l(this,W)[0])==null?void 0:o.context;r&&Bn(this.device,r);try{this.device.gpu.queue.submit([t])}catch(a){y(this,D,mr).call(this,y(this,D,ri).call(this));const c=r?be(this.device):void 0;me(l(this,W)),c&&me([c]);const u=(c==null?void 0:c.context)??r;if(!u)throw a;this.done=y(this,D,ii).call(this,y(this,D,Ss).call(this,u.label,u.group,a));return}if(r){const a=be(this.device);a&&(l(this,W)[0]=l(this,W)[0]?Gr(a,l(this,W)[0]):a)}for(const a of y(this,D,vs).call(this))a.frameSubmitted(this);y(this,D,mr).call(this,l(this,ot)),this.done=y(this,D,ii).call(this,ta(this.device,l(this,W),{errorSink:this.errorSink}))}cancel(){var t;if(!l(this,Ve)){if(l(this,Oe))throw Df(\"Frame.cancel\");if(l(this,xn))throw Lf(\"Frame.cancel\");x(this,Ve,!0),(t=this.releaseLifecycle)==null||t.call(this),y(this,D,mr).call(this,y(this,D,ri).call(this)),l(this,Ge).clear(),l(this,ot).clear(),me(l(this,W)),l(this,W).length=0}}}Mt=new WeakMap,W=new WeakMap,Ge=new WeakMap,ot=new WeakMap,Oe=new WeakMap,Ve=new WeakMap,xn=new WeakMap,D=new WeakSet,mr=function(t){for(const n of[...t])n.frameAbandoned(this)},ri=function(){return[...l(this,Ge),...l(this,ot)]},xs=function(t){for(const n of[...t])l(this,Ge).delete(n),l(this,ot).add(n)},vs=function(){return[...l(this,Ge)].filter(t=>!l(this,ot).has(t))},_s=function(t,n,r,i){const s=fp(t);if(!s)throw i(t);let o;try{o=s[Zr]({frame:this,device:this.device,target:n})}catch(a){throw y(this,D,xs).call(this,l(this,Ge)),a}return l(this,Ge).add(o.owner),r.push(o.owner),o},Ss=async function(t,n,r){await Fi(this.device),M(this.device,\"Frame.validation\");const i=Zt(t,n,r);this.errorSink?await this.errorSink(i):console.error(i)},ii=function(t){var n;return(n=this.trackSettled)==null||n.call(this,t),t},xc=t=>!qc(Oe,t)||!l(t,Oe)&&!l(t,Ve);class xg{constructor(t,n,r,i=!1,s,o,a){m(this,\"encoder\");m(this,\"target\");m(this,\"validations\");m(this,\"depthReadOnly\");m(this,\"occlusionSource\");m(this,\"frame\");m(this,\"assertFrameOpen\");w(this,vn,!1);this.encoder=t,this.target=n,this.validations=r,this.depthReadOnly=i,this.occlusionSource=s,this.frame=o,this.assertFrameOpen=a}draw(t,n={}){var i;(i=this.assertFrameOpen)==null||i.call(this,\"FramePass.draw\");const r=_g(t);this.depthReadOnly&&vg(r,this.target),r.encode(this.encoder,this.target,n,s=>this.validations.push(s))}occlusion(t,n){var i;if((i=this.assertFrameOpen)==null||i.call(this,\"FramePass.occlusion\"),!this.occlusionSource)throw bf();if(l(this,vn))throw yf();const r=this.occlusionSource.beginQuery(t,this.frame);this.encoder.beginOcclusionQuery(r),x(this,vn,!0);try{typeof n==\"function\"?n():this.draw(n)}finally{x(this,vn,!1),this.encoder.endOcclusionQuery()}}bundles(...t){var r;if((r=this.assertFrameOpen)==null||r.call(this,\"FramePass.bundles\"),this.depthReadOnly)throw wt(\"pass cannot replay bundles: bundle records bundles with writable depth/stencil, and WebGPU only executes read-only-recorded bundles in a read-only pass.\",\"Encode the draws directly with pass.draw(...) inside the depthReadOnly pass.\",\"FramePass.bundles\");const n=t.map(i=>lp(i)??Sg());for(const i of n)i.assertReplayable(this.target);this.encoder.executeBundles(n.map(i=>i.gpu))}}vn=new WeakMap;function vg(e,t){var n;if(e.writesDepth())throw wt(`pass cannot encode draw '${e.label}': its depth state writes depth (the default is write: true). Give the draw depth: { write: false } (or depth: false to disable depth testing).`,\"Use depth: { write: false } on the draw, or open the pass without depthReadOnly.\",\"FramePass.draw\");if(qn((n=t.depth)==null?void 0:n.format)){const r=e.stencilWritingOps();if(r.length)throw wt(`pass cannot encode draw '${e.label}': its stencil ops can write (${r.join(\", \")}), and the pass's stencil aspect is read-only too.`,'Use \"keep\" for those ops or stencil writeMask: 0, or open the pass without depthReadOnly.',\"FramePass.draw\")}}function _g(e){const t=up(e);if(!t)throw new TypeError(\"Invalid Effect instance: pass.draw() expects a Draw or an Effect created by this library.\");return t}function Sg(){throw new _({code:\"VGPU-R3-BUNDLE-INVALID\",message:\"p.bundles() expected bundles created by bundle(gpu, { target }, cb).\",where:\"FramePass.bundles\"})}function Eg(e){return en(`FramePassOptions.timer received ${tt(e)}; expected a TimerSpan from timer.span(name).`,'Create const passTimer = timer(gpu) once, then pass passTimer.span(\"name\") per pass.',\"Frame.pass\")}function Ig(e){return tn(`FramePassOptions.visibility received ${tt(e)}; expected a Visibility from visibility(gpu).`,\"Create const vis = visibility(gpu) once, then pass { target, visibility: vis } per pass.\",\"Frame.pass\")}function kg(e,t,n){if(e===void 0)return;if(typeof e!=\"object\"||e===null||Array.isArray(e))throw De(`received ${tt(e)}; expected { x?, y?, width, height, minDepth?, maxDepth? }.`);const{x:r=0,y:i=0,width:s,height:o,minDepth:a=0,maxDepth:c=1}=e;for(const[h,g]of[[\"x\",r],[\"y\",i],[\"width\",s],[\"height\",o],[\"minDepth\",a],[\"maxDepth\",c]])if(typeof g!=\"number\"||!Number.isFinite(g))throw De(`${h} received ${tt(g)}; expected a finite number.`);const u=t.maxTextureDimension2D,f=u*2,d=`target is ${n[0]}x${n[1]}px, device maxTextureDimension2D is ${u}`;if(!(s>=0&&s<=u))throw De(`width ${s} is outside [0, ${u}] (${d}).`);if(!(o>=0&&o<=u))throw De(`height ${o} is outside [0, ${u}] (${d}).`);if(!(r>=-f&&r+s<=f-1))throw De(`x ${r} with width ${s} is outside [${-f}, ${f-1}] (${d}).`);if(!(i>=-f&&i+o<=f-1))throw De(`y ${i} with height ${o} is outside [${-f}, ${f-1}] (${d}).`);if(!(a>=0&&a<=1))throw De(`minDepth ${a} is outside [0, 1].`);if(!(c>=0&&c<=1))throw De(`maxDepth ${c} is outside [0, 1].`);if(!(a<=c))throw De(`minDepth ${a} exceeds maxDepth ${c}.`);return{x:r,y:i,width:s,height:o,minDepth:a,maxDepth:c}}function $g(e,t){if(e===void 0)return;if(!Array.isArray(e)||e.length!==4)throw bi(`received ${tt(e)}; expected [x, y, width, height].`);const[n,r,i,s]=e;for(const[c,u]of[[\"x\",n],[\"y\",r],[\"width\",i],[\"height\",s]])if(typeof u!=\"number\"||!Number.isInteger(u)||u<0)throw bi(`${c} received ${tt(u)}; expected a non-negative integer.`);const[o,a]=t;if(n+i>o||r+s>a)throw bi(`[${n}, ${r}, ${i}, ${s}] exceeds the target's current size ${o}x${a}px (x + width <= ${o}, y + height <= ${a}).`);return[n,r,i,s]}function tt(e){return typeof e==\"string\"?`'${e}'`:Array.isArray(e)?`[${e.map(t=>tt(t)).join(\", \")}]`:typeof e==\"object\"&&e!==null?\"an object\":String(e)}function Tg(e){const t=e==null?void 0:e.code;return t===\"VGPU-DEVICE-DISPOSED\"||t===\"VGPU-DEVICE-LOST\"}class Pg{constructor(t,n,r){m(this,\"createFrame\");m(this,\"advance\");m(this,\"trackLoop\");w(this,_n,!1);this.createFrame=t,this.advance=n,this.trackLoop=r}frame(t){if(l(this,_n)||tp())throw So();x(this,_n,!0),np();try{this.advance();const n=this.createFrame();if(t){try{t(n)}catch(r){if(xc(n))try{n.cancel()}catch{}throw r}try{n.submit()}catch(r){if(!Tg(r))throw r}}return n}finally{rp(),x(this,_n,!1)}}loop(t,n={}){var g;let r=!1;const i=globalThis.requestAnimationFrame??(b=>setTimeout(()=>b(performance.now()),16)),s=globalThis.cancelAnimationFrame??(b=>clearTimeout(b)),o=n.fps&&n.fps>0?1e3/n.fps:0;let a,c=0,u;const f=()=>{r=!0,s(c),u==null||u(),u=void 0},d=b=>{if(!r){if(Rg(b,a,o)){a=b;try{this.frame(t)}catch(v){throw f(),v}}r||(c=i(d))}};c=i(d);const h={stop:f};return u=(g=this.trackLoop)==null?void 0:g.call(this,h),h}}_n=new WeakMap;const Ag=1;function Rg(e,t,n){return t===void 0||n<=0?!0:e-t>=n-Ag}function es(e){const t=[];for(const n of e)try{n.destroy()}catch(r){t.push(r)}if(t.length)throw t[0]}function Cg(e,t){return new ts(Y(e,\"target\").device,t)}class ts{constructor(t,n){w(this,Z);m(this,\"device\");m(this,\"resourceIdentity\",yr(\"render-target\"));w(this,er,new wr);w(this,Gt,new Set);w(this,ke);w(this,we);w(this,Sn);w(this,En,!1);w(this,In,!1);m(this,\"options\");this.device=t,Ea(n,t),this.options=Object.freeze({...n,size:Object.freeze([...n.size]),...n.colors?{colors:Object.freeze(n.colors.map(r=>Object.freeze({...r})))}:{}}),x(this,Sn,n.clearColor===void 0?qi:qr(n.clearColor,\"target.clearColor\")),x(this,ke,this.options.size),x(this,we,y(this,Z,Es).call(this,l(this,ke)))}get gpu(){return this.color.gpu}get size(){return l(this,ke)}get texelSize(){return[1/l(this,ke)[0],1/l(this,ke)[1]]}get color(){return l(this,we).colors[0]}get colors(){return l(this,we).colors}get depth(){return l(this,we).depth}get format(){var t;return((t=jr(this.options)[0])==null?void 0:t.format)??\"rgba8unorm\"}get clearColor(){return ji(l(this,Sn))}set clearColor(t){x(this,Sn,qr(t,\"target.clearColor\"))}get sampleCount(){return Sa(this.options)}resize(t){if(y(this,Z,si).call(this,\"Target.resize\"),l(this,In))throw new _({code:\"VGPU-TARGET-RESIZE-REENTRANT\",message:\"Cannot resize a target from its replacement callbacks.\",where:\"Target.resize\"});if(Ea({...this.options,size:t},this.device),!ka(l(this,ke),t)){x(this,In,!0);try{const n=Object.freeze([...t]),r=y(this,Z,Es).call(this,n),i=l(this,we);x(this,ke,n),x(this,we,r);try{y(this,Z,su).call(this)}finally{es(i.all)}}finally{x(this,In,!1)}}}onDestroy(t){return l(this,er).onDestroy(this,t)}onTexturesRecreated(t){return y(this,Z,si).call(this,\"Target.onTexturesRecreated\"),l(this,Gt).add(t),()=>{l(this,Gt).delete(t)}}destroy(){if(!l(this,En)){x(this,En,!0);try{l(this,er).emit(this)}finally{l(this,Gt).clear(),es(l(this,we).all)}}}renderPassDescriptor(t={}){y(this,Z,si).call(this,\"Target.renderPassDescriptor\");const{clear:n=[0,0,0,1],preserve:r,clearDepth:i,clearStencil:s,depthReadOnly:o}=t;return{colorAttachments:this.colors.map((a,c)=>{var u;return Lm(a,(u=l(this,we).msaaColors)==null?void 0:u[c],n,r)}),depthStencilAttachment:this.depth?Dm(this.depth,r,i,s,o):void 0}}}er=new WeakMap,Gt=new WeakMap,ke=new WeakMap,we=new WeakMap,Sn=new WeakMap,En=new WeakMap,In=new WeakMap,Z=new WeakSet,si=function(t){if(l(this,En))throw new _({code:\"VGPU-TARGET-DESTROYED\",message:`Target '${this.options.label??\"target\"}' is destroyed.`,where:t,fix:\"Create a new target; destroyed targets cannot be resized or rendered.\"});M(this.device,t)},su=function(){const t=[];for(const n of[...l(this,Gt)])try{n()}catch(r){t.push(r)}if(t.length)throw t[0]},Es=function(t){const n=[],r=i=>{const s=this.device.createTexture(i);return n.push(s),s};try{const i=y(this,Z,ou).call(this,t,r),s=this.sampleCount===4?y(this,Z,au).call(this,t,r):void 0,o=y(this,Z,cu).call(this,t,r);return{colors:Object.freeze(i),msaaColors:s&&Object.freeze(s),depth:o,all:n}}catch(i){try{es(n)}catch{}throw i}},ou=function(t,n){return jr(this.options).map((r,i)=>n({kind:\"2d\",size:t,format:r.format,usage:[\"render_attachment\",\"texture_binding\",\"copy_src\"],sampleCount:1,label:this.options.label?`${this.options.label}.color${i}.resolve`:void 0}))},au=function(t,n){return jr(this.options).map((r,i)=>n({kind:\"2d\",size:t,format:r.format,usage:[\"render_attachment\"],sampleCount:4,label:this.options.label?`${this.options.label}.color${i}`:void 0}))},cu=function(t,n){const r=_a(this.options);return r?n({kind:\"2d\",size:t,format:r,usage:[\"render_attachment\",\"texture_binding\"],sampleCount:this.sampleCount,label:this.options.label?`${this.options.label}.depth`:void 0}):void 0};function Fg(e,t,n=\"read-write\"){const r=Y(e,\"storage\"),i=typeof n==\"string\"?{access:n}:n,s=rs(r.device,t,i.access??\"read-write\",void 0,i.indirect??!1);return on(r,s,o=>o.destroy(),o=>{s.onDestroy(o)})}class ns{constructor(t,n){m(this,\"size\");m(this,\"access\");m(this,\"buffer\");this.buffer=t,this.access=n,this.size=t.options.size}static create(t,n,r,i,s=!1){const o=s?[\"storage\",\"copy_dst\",\"copy_src\",\"indirect\"]:[\"storage\",\"copy_dst\",\"copy_src\"],a=t.createBuffer({size:n,usage:o,label:i});return new ns(a,r)}read(){return this.buffer.read(this.size)}write(t,n=0){this.buffer.write(Lg(t),n)}get gpu(){return this.buffer.gpu}get resourceIdentity(){return this.buffer.resourceIdentity}onDestroy(t){return this.buffer.onDestroy(t)}destroy(){this.buffer.destroy()}}function rs(e,t,n,r,i=!1){return ns.create(e,t,n,r,i)}function Lg(e){if(e instanceof ArrayBuffer||ArrayBuffer.isView(e))return e;throw new TypeError(\"StorageBuffer.write() requires ArrayBuffer or ArrayBufferView.\")}function Dg(e,t,n,r={}){const i=Y(e,\"pingPong\");return Og(i.device,t,n,r,s=>Mg(i,s))}function Ug(e,t){const n=Y(e,\"pingPongStorage\");return Vg(n.device,t,\"read-write\",r=>Gg(n,r))}function Mg(e,t){return on(e,t,n=>n.destroy(),n=>{t.onDestroy(n)})}function Gg(e,t){return on(e,t,n=>n.destroy(),n=>{t.onDestroy(n)})}function Og(e,t,n,r={},i=_c){const s=[Sc(t),Sc(n)],o={...r,size:s},a=i(new ts(e,Ec(o,r.label,\"ping\")));try{const c=i(new ts(e,Ec(o,r.label,\"pong\")));return new Ng([a,c])}catch(c){try{a.destroy()}catch{}throw c}}function Vg(e,t,n=\"read-write\",r=_c){const i=r(rs(e,t,n,void 0)),s=r(rs(e,t,n,void 0));return new Bg([i,s])}function _c(e){return e}class Ng{constructor(t){m(this,\"halves\");w(this,kn,0);this.halves=t}get read(){return this.halves[l(this,kn)]}get write(){return this.halves[l(this,kn)^1]}swap(){x(this,kn,l(this,kn)^1)}}kn=new WeakMap;class Bg{constructor(t){m(this,\"halves\");w(this,$n,0);this.halves=t}get read(){return this.halves[l(this,$n)]}get write(){return this.halves[l(this,$n)^1]}swap(){x(this,$n,l(this,$n)^1)}}$n=new WeakMap;function Sc(e){return Math.max(1,Math.floor(e))}function Ec(e,t,n){return t?{...e,label:`${t}.${n}`}:e}function zg(e,t){const n=Y(e,\"texture\"),r=n.device.createTexture(t);return on(n,r,i=>i.destroy(),i=>{r.onDestroy(i)})}const is=8,qg=((Gc=globalThis.GPUMapMode)==null?void 0:Gc.READ)??1;function Ic(e,t){return new jg(e,t)}class jg{constructor(t,n){w(this,ce);m(this,\"querySet\");m(this,\"capacity\");w(this,tr);w(this,Ot);w(this,at);w(this,nr);w(this,rr);w(this,Tn,0);w(this,ir,0);w(this,sr,-1);w(this,ct);w(this,Pn,0);w(this,Vt,0);w(this,Nt,!1);w(this,or,!1);this.capacity=n.capacity;const r=n.label??\"vgpu.query-ring\";x(this,tr,r);const i=n.capacity*is;this.querySet=t.gpu.createQuerySet({type:n.type,count:n.capacity,label:r}),x(this,Ot,t.createBuffer({size:i,usage:[\"query_resolve\",\"copy_src\"],label:`${r}.resolve`})),x(this,at,Array.from({length:n.depth??3},(s,o)=>({buffer:t.createBuffer({size:i,usage:[\"map_read\",\"copy_dst\"],label:`${r}.staging${o}`}),mapPending:!1,retired:!1}))),x(this,nr,n.trackSettled),x(this,rr,n.errorSink)}encodeResolve(t,n){if(x(this,ct,void 0),l(this,Nt)||n<=0)return!1;const r=y(this,ce,uu).call(this);if(!r)return!1;const i=Math.min(n,this.capacity);return t.resolveQuerySet(this.querySet,0,i,l(this,Ot).gpu,0),t.copyBufferToBuffer(l(this,Ot).gpu,0,r.buffer.gpu,0,i*is),x(this,ct,{staging:r,usedCount:i,seq:l(this,ir)}),x(this,ir,l(this,ir)+1),x(this,Tn,l(this,Tn)+1),!0}onSubmitted(t){var i;const n=l(this,ct);if(x(this,ct,void 0),!n)return;n.staging.mapPending=!0,x(this,Pn,l(this,Pn)+1);const r=n.staging.buffer.gpu.mapAsync(qg).then(()=>{const s=y(this,ce,lu).call(this,n);n.seq<=l(this,sr)||(x(this,sr,n.seq),t(s))}).catch(s=>{y(this,ce,du).call(this,s)}).finally(()=>{n.staging.mapPending=!1,x(this,Pn,l(this,Pn)-1),y(this,ce,oi).call(this)});(i=l(this,nr))==null||i.call(this,r)}retain(){x(this,Vt,l(this,Vt)+1)}release(){l(this,Vt)>0&&x(this,Vt,l(this,Vt)-1),y(this,ce,oi).call(this)}dispose(){l(this,Nt)||(x(this,Nt,!0),x(this,ct,void 0),y(this,ce,oi).call(this))}}tr=new WeakMap,Ot=new WeakMap,at=new WeakMap,nr=new WeakMap,rr=new WeakMap,Tn=new WeakMap,ir=new WeakMap,sr=new WeakMap,ct=new WeakMap,Pn=new WeakMap,Vt=new WeakMap,Nt=new WeakMap,or=new WeakMap,ce=new WeakSet,uu=function(){for(let t=0;t<l(this,at).length;t+=1){const n=l(this,at)[l(this,Tn)%l(this,at).length];if(!n.retired)return n.mapPending?void 0:n;x(this,Tn,l(this,Tn)+1)}},lu=function(t){let n;try{n=new BigUint64Array(t.staging.buffer.gpu.getMappedRange().slice(0,t.usedCount*is))}catch(r){throw y(this,ce,fu).call(this,t.staging),r}try{t.staging.buffer.gpu.unmap()}catch(r){throw t.staging.retired=!0,r}return n},fu=function(t){try{t.buffer.gpu.unmap()}catch{t.retired=!0}},oi=function(){if(!(!l(this,Nt)||l(this,or)||l(this,Pn)>0||l(this,Vt)>0)){x(this,or,!0),this.querySet.destroy(),l(this,Ot).dispose();for(const t of l(this,at))t.buffer.dispose()}},du=function(t){const n=Ff(l(this,tr),t),r=l(this,rr);if(!r){console.error(n);return}try{Promise.resolve(r(n)).catch(i=>{console.error(i)})}catch(i){console.error(i)}};const kc=32,ss=4096,$c=ss/2,Wg=1/1e6;class Hg{constructor(t,n){m(this,\"name\");m(this,\"owner\");this.name=t,this.owner=n}[Zr](t){return{owner:this.owner,timestampWrites:this.owner.attachSpan(this,t.frame,t.device)}}}function Kg(e){const t=Y(e,\"timer\");return Po(t,n=>new Xg(t.device,n))}class Xg{constructor(t,n={}){w(this,Q);w(this,An);w(this,Bt);w(this,Rn,new Map);w(this,zt,new Set);w(this,ue);w(this,Cn,kc*2);w(this,ut,kc*2);w(this,lt);w(this,qt,[]);w(this,Ne,new Set);w(this,jt,0);w(this,Be);w(this,ar,0);w(this,cr,-1);w(this,Wt,new Map);w(this,ft,!1);if(!t.features.has(\"timestamp-query\"))throw en('timer(gpu) needs the \"timestamp-query\" device feature — request it at init: init({ requiredFeatures: [\"timestamp-query\"] }).','Pass init({ requiredFeatures: [\"timestamp-query\"] }) on an adapter that supports it; gate optional timing on gpu.device.features.has(\"timestamp-query\").');x(this,An,t),x(this,Bt,n),x(this,ue,y(this,Q,ks).call(this))}span(t){if(y(this,Q,ai).call(this,\"Timer.span\"),typeof t!=\"string\"||t.length===0)throw en(`span name received ${Qg(t)}; expected a non-empty string.`,'Name each timed pass, e.g. timer.span(\"shadows\").',\"Timer.span\");let n=l(this,Rn).get(t);return n||(n=new Hg(t,this),l(this,Rn).set(t,n)),n}onResults(t){return y(this,Q,ai).call(this,\"Timer.onResults\"),l(this,zt).add(t),()=>{l(this,zt).delete(t)}}dispose(){var t,n;l(this,ft)||(x(this,ft,!0),l(this,zt).clear(),l(this,Rn).clear(),l(this,Ne).clear(),x(this,qt,[]),x(this,Be,void 0),l(this,ue).dispose(),(n=(t=l(this,Bt)).onDispose)==null||n.call(t))}attachSpan(t,n,r){if(y(this,Q,ai).call(this,\"Frame.pass\"),r!==l(this,An))throw en(`span '${t.name}' belongs to a timer created on a different gpu; timestamp queries cannot cross devices.`,\"Create one timer(gpu) per gpu and use its spans only with that gpu's frames.\",\"Frame.pass\");if(n!==l(this,lt)&&y(this,Q,hu).call(this,n),l(this,Ne).has(t.name))throw en(`duplicate span '${t.name}' in one frame; each result key holds a single begin/end pair per frame.`,`Use one timer.span(name) per pass per frame, e.g. timer.span(\"${t.name}-2\") for the second pass.`,\"Frame.pass\");if(l(this,Ne).size>=$c)throw df($c,ss);l(this,Ne).add(t.name);const i=l(this,Ne).size*2-2;if(l(this,ut)<i+2&&x(this,ut,i+2),!(i+2>l(this,ue).capacity))return x(this,jt,i+2),l(this,qt).push({name:t.name,begin:i}),y(this,Q,pu).call(this,n),{querySet:l(this,ue).querySet,beginningOfPassWriteIndex:i,endOfPassWriteIndex:i+1}}finalizeFrame(t,n){x(this,Be,void 0),!(l(this,ft)||t!==l(this,lt)||l(this,jt)===0)&&l(this,ue).encodeResolve(n,l(this,jt))&&x(this,Be,[...l(this,qt)])}frameSubmitted(t){if(y(this,Q,Is).call(this,t),t!==l(this,lt)||l(this,ft))return;const n=l(this,Be);if(x(this,Be,void 0),!n||n.length===0)return;const r=l(this,ar);x(this,ar,l(this,ar)+1),l(this,ue).onSubmitted(i=>{r<=l(this,cr)||(x(this,cr,r),y(this,Q,mu).call(this,n,i))})}frameAbandoned(t){t===l(this,lt)&&x(this,Be,void 0),y(this,Q,Is).call(this,t)}}An=new WeakMap,Bt=new WeakMap,Rn=new WeakMap,zt=new WeakMap,ue=new WeakMap,Cn=new WeakMap,ut=new WeakMap,lt=new WeakMap,qt=new WeakMap,Ne=new WeakMap,jt=new WeakMap,Be=new WeakMap,ar=new WeakMap,cr=new WeakMap,Wt=new WeakMap,ft=new WeakMap,Q=new WeakSet,hu=function(t){l(this,ut)>l(this,ue).capacity&&(l(this,ue).dispose(),x(this,Cn,Math.min(ss,Yg(l(this,ut)))),x(this,ue,y(this,Q,ks).call(this))),x(this,ut,l(this,Cn)),x(this,lt,t),x(this,qt,[]),l(this,Ne).clear(),x(this,jt,0)},mu=function(t,n){const r={};for(const{name:s,begin:o}of t){const a=n[o]??0n,c=n[o+1]??0n;r[s]=c>a?Number(c-a)*Wg:0}const i=Object.freeze(r);for(const s of[...l(this,zt)])try{s(i)}catch(o){console.error(o)}},pu=function(t){l(this,Wt).has(t)||(l(this,Wt).set(t,l(this,ue)),l(this,ue).retain())},Is=function(t){const n=l(this,Wt).get(t);n&&(l(this,Wt).delete(t),n.release())},ks=function(){return Ic(l(this,An),{type:\"timestamp\",capacity:l(this,Cn),label:\"vgpu.timer\",trackSettled:l(this,Bt).trackSettled,errorSink:l(this,Bt).errorSink})},ai=function(t){if(l(this,ft))throw en(\"the timer is disposed.\",\"Create a new timer with timer(gpu).\",t)};function Yg(e){let t=1;for(;t<e;)t*=2;return t}function Qg(e){return typeof e==\"string\"?`'${e}'`:String(e)}function Tc(e){return JSON.stringify(os(e))}function ti(e,t={}){var n;return(n=e.members)!=null&&n.length?Jg(e.members,t.abbreviated===!0):e.element?eb(e):as(e.type)}function os(e){var t;return{type:ln(e.type),align:e.align,size:e.size,stride:e.stride,members:(t=e.members)==null?void 0:t.map(Zg),element:e.element?os(e.element):void 0}}function Zg(e){return{name:e.name,offset:e.offset,align:e.align,size:e.size,explicitAlign:e.explicitAlign,explicitSize:e.explicitSize,type:ln(e.type),layout:os(e.layout)}}function ln(e){switch(e.kind){case\"scalar\":return{scalar:e.name};case\"vector\":return{vector:e.width,element:ln(e.element)};case\"matrix\":return{matrix:[e.columns,e.rows],element:ln(e.element)};case\"array\":return{array:ln(e.element),count:e.count??e.countExpression};case\"atomic\":return{atomic:ln(e.element)};default:return e.kind}}function Jg(e,t){const n=t?e.slice(0,1):e,r=t&&e.length>1?\", ...\":\"\";return`{ ${n.map(tb).join(\", \")}${r} }`}function eb(e){const t=rb(e.type),n=t===void 0?\"\":`, ${t}`;return`array<${ti(e.element)}${n}>`}function tb(e){return`${e.name}: ${ti(e.layout)}`}function as(e){switch(e.kind){case\"scalar\":return e.name;case\"vector\":return`vec${e.width}${Pc(e.element)}`;case\"matrix\":return`mat${e.columns}x${e.rows}${Pc(e.element)}`;case\"array\":return nb(e);case\"identifier\":return e.name;case\"atomic\":return`atomic<${as(e.element)}>`;default:return e.kind}}function nb(e){const t=e.count??e.countExpression,n=t===void 0?\"\":`, ${t}`;return`array<${as(e.element)}${n}>`}function Pc(e){return e.kind!==\"scalar\"?\"\":e.name===\"bool\"?\"b\":e.name.slice(0,1)}function rb(e){return e.kind===\"array\"?e.count??e.countExpression:void 0}class ib{constructor(t,n){w(this,Te);m(this,\"device\");w(this,Ht);w(this,$e);w(this,xe);this.device=t,x(this,Ht,cs(n))}get buffer(){return l(this,xe)}get gpu(){var t;return(t=l(this,xe))==null?void 0:t.gpu}get size(){var t;return(t=l(this,$e))==null?void 0:t.layout.size}set(t){const n=cs(l(this,Ht));if(Ac(n,t),l(this,$e)&&l(this,xe)){const r=Gi(l(this,$e).layout,n);l(this,xe).write(r,0)}x(this,Ht,n)}[_i](t,n){ob(t);const r=y(this,Te,gu).call(this,t,n),i=y(this,Te,wu).call(this);return vi(i,`${n}.set`),{resource:{buffer:i.gpu,offset:0,size:r.layout.size},identity:i.resourceIdentity,unsubscribe:s=>i.onDestroy(s)}}destroy(){var t;(t=l(this,xe))==null||t.destroy()}}Ht=new WeakMap,$e=new WeakMap,xe=new WeakMap,Te=new WeakSet,gu=function(t,n){const r=ab(t),i=ub(t.addressSpace);return l(this,$e)?(y(this,Te,yu).call(this,t,r,i,n),l(this,$e)):y(this,Te,bu).call(this,t,r,i,n)},bu=function(t,n,r,i){const s=Gi(n,l(this,Ht)),o={layout:n,layoutSignature:Tc(n),layoutText:ti(n),sourceHint:i,bindingName:t.name,addressSpace:r},a=this.device.createBuffer({size:n.size,usage:r===\"storage\"?[\"storage\",\"copy_dst\"]:[\"uniform\",\"copy_dst\"],label:`${t.name}.sharedUniform`});try{a.write(s,0)}catch(c){throw a.destroy(),c}return x(this,$e,o),x(this,xe,a),o},yu=function(t,n,r,i){const s=l(this,$e);if(s.addressSpace!==r)throw G(\"uniforms\",`shared uniforms '${s.bindingName}' already adopted address space ${s.addressSpace}; '${t.name}' uses ${r}.`);if(Tc(n)!==s.layoutSignature)throw Gf({bindingName:s.bindingName,adoptedLayout:s.layoutText,adoptedSource:s.sourceHint,incomingLayout:ti(n,{abbreviated:!0}),incomingSource:i})},wu=function(){if(!l(this,xe))throw G(\"uniforms\",\"shared uniforms have not adopted a layout yet.\");return l(this,xe)};function sb(e,t){const n=Y(e,\"uniforms\");return on(n,new ib(n.device,t),r=>r.destroy())}function ob(e){var t,n;if(((t=e.bindingLayout)==null?void 0:t.kind)!==\"buffer\")throw G(\"uniforms\",`Binding '${e.name}' does not accept shared uniforms; the shader reflected ${((n=e.bindingLayout)==null?void 0:n.kind)??\"none\"}.`)}function ab(e){if(!e.layout)throw G(\"uniforms\",`Binding '${e.name}' does not expose a host-shareable layout.`);if(e.layout.size===void 0)throw G(\"uniforms\",`Binding '${e.name}' has a runtime-sized layout; it cannot be shared.`);return e.layout}function Ac(e,t){for(const[n,r]of Object.entries(t))Rc(n)||(ls(r)&&ls(e[n])?Ac(e[n],r):e[n]=us(r))}function cs(e){const t={};for(const[n,r]of Object.entries(e))Rc(n)||(t[n]=us(r));return t}function Rc(e){return e===\"__proto__\"||e===\"constructor\"||e===\"prototype\"}function us(e){return Array.isArray(e)?e.map(us):ArrayBuffer.isView(e)?cb(e):ls(e)?cs(e):e}function cb(e){return e instanceof Float32Array||e instanceof Uint32Array||e instanceof Int32Array?e.slice():e}function ls(e){return typeof e==\"object\"&&e!==null&&!Array.isArray(e)&&!ArrayBuffer.isView(e)}function ub(e){return e===\"storage\"?\"storage\":\"uniform\"}const Cc=4096,lb=64;function fb(e,t={}){const n=Y(e,\"visibility\");return Po(n,r=>new db(n.device,t,()=>Kr(n).frameCount,r))}class Fc{constructor(t,n){m(this,\"label\");m(this,\"owner\");w(this,dt,\"unknown\");w(this,ht);w(this,Fn,0);w(this,mt,!1);this.label=t,this.owner=n}get hidden(){return l(this,dt)===\"hidden\"}get state(){return l(this,dt)}get age(){return l(this,ht)===void 0?1/0:this.owner.currentFrame()-l(this,ht)}reset(){if(l(this,mt))throw yi(\"query handle\",\"VisibilityQuery.reset\");x(this,dt,\"unknown\"),x(this,ht,void 0),x(this,Fn,l(this,Fn)+1)}dispose(){l(this,mt)||(x(this,mt,!0),x(this,dt,\"unknown\"),x(this,ht,void 0),this.owner.releaseLabel(this))}get disposed(){return l(this,mt)}get generation(){return l(this,Fn)}applyResult(t,n,r){l(this,mt)||n!==l(this,Fn)||(x(this,dt,t!==0n?\"visible\":\"hidden\"),x(this,ht,r))}}dt=new WeakMap,ht=new WeakMap,Fn=new WeakMap,mt=new WeakMap;class db{constructor(t,n,r,i={}){w(this,le);w(this,ur);w(this,Ln);w(this,lr);w(this,Pe);m(this,\"capacity\");w(this,ze,new Map);w(this,qe);w(this,Ae,[]);w(this,Kt,new Set);w(this,je);w(this,Xt,new Map);w(this,Re,!1);const s=n.capacity??lb;if(typeof s!=\"number\"||!Number.isInteger(s)||s<1||s>Cc)throw hf(s,Cc);x(this,ur,t),x(this,Ln,r),x(this,lr,i),this.capacity=s,x(this,Pe,Ic(t,{type:\"occlusion\",capacity:s,label:\"vgpu.visibility\",trackSettled:i.trackSettled,errorSink:i.errorSink}))}query(t){if(y(this,le,pr).call(this,\"Visibility.query\"),typeof t!=\"string\"||t.length===0)throw tn(`query label received ${Lc(t)}; expected a non-empty string.`,'Label each queried object, e.g. vis.query(\"statue\").',\"Visibility.query\");if(l(this,ze).has(t))throw pf(t);const n=new Fc(t,this);return l(this,ze).set(t,n),n}reset(){y(this,le,pr).call(this,\"Visibility.reset\");for(const t of l(this,ze).values())t.reset()}dispose(){var t,n;l(this,Re)||(x(this,Re,!0),l(this,ze).clear(),x(this,Ae,[]),l(this,Kt).clear(),x(this,je,void 0),l(this,Pe).dispose(),(n=(t=l(this,lr)).onDispose)==null||n.call(t))}get disposed(){return l(this,Re)}currentFrame(){return l(this,Ln).call(this)}releaseLabel(t){l(this,ze).get(t.label)===t&&l(this,ze).delete(t.label)}get querySet(){return l(this,Pe).querySet}[Zr](t){if(!t.target.depth)throw gf();return this.attachFrame(t.frame,t.device),{owner:this,occlusion:{querySet:this.querySet,beginQuery:(n,r)=>this.beginQuery(n,r)}}}attachFrame(t,n){if(y(this,le,pr).call(this,\"Frame.pass\"),n!==l(this,ur))throw tn(\"the visibility instance belongs to a different gpu; occlusion queries cannot cross devices.\",\"Create one visibility(gpu) per gpu and use it only with that gpu's frames.\",\"Frame.pass\");t!==l(this,qe)&&y(this,le,xu).call(this,t),y(this,le,vu).call(this,t)}beginQuery(t,n){if(y(this,le,pr).call(this,\"FramePass.occlusion\"),!(t instanceof Fc))throw tn(`occlusion() received ${Lc(t)}; expected a VisibilityQuery from vis.query(label).`,`Create const q = vis.query(\"label\") once from the pass's visibility instance, then p.occlusion(q, body).`,\"FramePass.occlusion\");if(t.owner!==this)throw tn(`query '${t.label}' belongs to a different visibility instance than the one this pass was opened with.`,\"Use handles from the same visibility(gpu) instance passed as the pass's visibility option.\",\"FramePass.occlusion\");if(t.disposed)throw yi(\"query handle\",\"FramePass.occlusion\");if(n!==l(this,qe))throw tn(\"the pass is not part of the current frame; occlusion() must run inside the frame that opened the pass.\",\"Encode occlusion scopes inside the pass callback of the current frame(gpu).\",\"FramePass.occlusion\");if(l(this,Kt).has(t))throw wf(t.label);const r=l(this,Ae).length;if(r>=this.capacity)throw mf(this.capacity);return l(this,Kt).add(t),l(this,Ae).push({query:t,generation:t.generation}),r}finalizeFrame(t,n){x(this,je,void 0),!(l(this,Re)||t!==l(this,qe)||l(this,Ae).length===0)&&l(this,Pe).encodeResolve(n,l(this,Ae).length)&&x(this,je,[...l(this,Ae)])}frameSubmitted(t){if(y(this,le,$s).call(this,t),t!==l(this,qe)||l(this,Re))return;const n=l(this,je);x(this,je,void 0),!(!n||n.length===0)&&l(this,Pe).onSubmitted(r=>{if(l(this,Re))return;const i=l(this,Ln).call(this);for(let s=0;s<n.length;s++){const o=n[s],a=r[s];a!==void 0&&o.query.applyResult(a,o.generation,i)}})}frameAbandoned(t){t===l(this,qe)&&x(this,je,void 0),y(this,le,$s).call(this,t)}}ur=new WeakMap,Ln=new WeakMap,lr=new WeakMap,Pe=new WeakMap,ze=new WeakMap,qe=new WeakMap,Ae=new WeakMap,Kt=new WeakMap,je=new WeakMap,Xt=new WeakMap,Re=new WeakMap,le=new WeakSet,xu=function(t){x(this,qe,t),x(this,Ae,[]),l(this,Kt).clear()},vu=function(t){l(this,Xt).has(t)||(l(this,Xt).set(t,l(this,Pe)),l(this,Pe).retain())},$s=function(t){const n=l(this,Xt).get(t);n&&(l(this,Xt).delete(t),n.release())},pr=function(t){if(l(this,Re))throw yi(\"visibility\",t)};function Lc(e){return typeof e==\"string\"?`'${e}'`:String(e)}function hb(e){return jf(\"browser\",e)}const mb=Object.freeze(Object.defineProperty({__proto__:null,Geometry:Ao,Uniform:fd,VGPUError:_,bundle:ng,clock:lg,compute:dg,draw:bp,effect:Zp,frame:gg,frameLoop:bg,geometry:ed,init:hb,initFromDevice:Kf,isShaderFunctionExport:ml,pingPong:Dg,pingPongStorage:Ug,sampler:dp,storage:Fg,surface:Zm,target:Cg,texture:zg,timer:Kg,uniforms:sb,visibility:fb},Symbol.toStringTag,{value:\"Module\"}));return C.installNativeHomeBlackHole=Os,C.mountBlueBlackHole=Ms,Object.defineProperty(C,Symbol.toStringTag,{value:\"Module\"}),C})({});\n\n;\n/* BRAINABLE production global: home-responsive */\n/** Scoped, reversible HOME reflow for the observed native Figma DOM. No text/action/media replacement. */\n(()=>{\n const KEY='__brainableHomeResponsive30';window[KEY]?.dispose();\n const CSS=`\n@media(max-width:1279px){\n[data-hf30-page]{width:100%!important;min-width:0!important;max-width:100%!important;height:auto!important;min-height:100svh!important;gap:0!important;align-items:stretch!important}\n[data-hf30-main]{box-sizing:border-box!important;width:100%!important;max-width:100%!important;min-width:0!important;height:auto!important;padding:0!important;align-items:stretch!important;justify-content:flex-start!important}\n[data-hf30-main]>[data-hf30-section]{box-sizing:border-box!important;width:100%!important;max-width:100%!important;min-width:0!important;height:auto!important;min-height:0!important;flex-shrink:0!important;inset:auto!important;transform:none!important}\n[data-hf30-flow]{box-sizing:border-box!important;width:100%!important;max-width:100%!important;min-width:0!important;height:auto!important;min-height:0!important;max-height:none!important;position:relative!important;inset:auto!important;transform:none!important;opacity:1!important;overflow:visible!important;display:flex!important;flex-direction:column!important;flex-wrap:nowrap!important;align-items:stretch!important;justify-content:flex-start!important;gap:16px!important;flex-shrink:0!important;margin:0!important;padding:0!important;grid-template-columns:minmax(0,1fr)!important;grid-template-rows:none!important}\n[data-hf30-main] p,[data-hf30-footer] p{box-sizing:border-box!important;max-width:100%!important;min-width:0!important;width:auto!important;height:auto!important;min-height:0!important;margin:0!important;white-space:normal!important;word-break:keep-all!important;overflow-wrap:anywhere!important;font-size:14px!important;line-height:1.65!important}\n[data-hf30-main] h2{letter-spacing:-.02em!important;max-width:100%!important;width:auto!important;height:auto!important;min-height:0!important;margin:0!important;font-size:clamp(20px,4vw,30px)!important;line-height:1.35!important;white-space:normal!important;overflow-wrap:anywhere!important}\n[data-hf30-flow].textContents{display:block!important}\n[data-hf30-prose] p{display:inline!important}\n[data-hf30-prose] p:after{content:\" \"}\n[data-hf30-blank]{height:0!important;min-height:0!important;line-height:0!important;margin:0!important;padding:0!important;display:none!important}\n[data-hf30-intro]{padding:clamp(32px,6vw,64px) clamp(20px,5vw,56px)!important}\n[data-hf30-intro]>div,[data-hf30-intro]>div>div{width:100%!important;height:auto!important;min-height:0!important;overflow:visible!important;padding:0!important}\n[data-hf30-main]>[data-hf30-banner]{height:clamp(200px,36vw,300px)!important;min-height:200px!important}\n[data-hf30-banner] [data-hf30-flow]{height:100%!important;justify-content:center!important;padding:0 24px!important;text-align:center!important}\n[data-hf30-banner]>div:first-child{width:100%!important;height:100%!important}\n[data-hf30-banner] [data-hf30-flow].textContents{display:flex!important;justify-content:center!important;gap:0!important}\n[data-hf30-banner] img{width:100%!important;height:100%!important;object-fit:cover!important}\n[data-hf30-products]{background:#000!important;padding:48px clamp(20px,5vw,56px)!important;isolation:isolate}\n[data-hf30-products]>video{width:100%!important;height:100%!important;object-fit:cover!important;inset:0!important;z-index:-1;opacity:.4!important}\n[data-hf30-products]>[data-hf30-flow]{gap:28px!important}\n[data-hf30-products] [data-hf30-product-grid]{gap:36px!important}\n[data-hf30-products] [data-hf30-card]{gap:12px!important}\n[data-hf30-category]{order:0!important;width:auto!important;height:auto!important;min-height:0!important;font-size:13px!important;line-height:1.5!important;letter-spacing:.12em!important}\n[data-hf30-name]{order:1!important;gap:0!important}\n[data-hf30-name] p,[data-hf30-name] span{font-size:20px!important;line-height:1.35!important;letter-spacing:.14em!important}\n[data-hf30-description]{order:2!important;gap:0!important}\n[data-hf30-description] p{display:block!important}\n[data-hf30-description] [data-hf30-blank]{display:none!important}\n[data-hf30-review]{padding:48px clamp(20px,5vw,56px)!important}\n[data-hf30-review]>[data-hf30-flow]{gap:28px!important}\n[data-hf30-review] [data-hf30-flow]{text-align:center!important}\n[data-hf30-review] [data-hf30-quote]{padding:16px 0!important;gap:24px!important}\n[data-hf30-controls]{width:auto!important;max-width:100%!important;height:44px!important;min-height:44px!important;display:flex!important;flex-direction:row!important;align-items:center!important;justify-content:center!important;gap:14px!important;margin:0 auto!important}\n[data-hf30-controls]>button{width:32px!important;height:32px!important;min-width:32px!important;min-height:32px!important;flex-shrink:0!important}\n[data-hf30-action]{box-sizing:border-box!important;padding:10px 16px!important;display:inline-flex!important;align-items:center!important;justify-content:center!important;width:max-content!important;max-width:100%!important;min-height:40px!important;margin:8px auto 0!important;flex-shrink:0!important}\n[data-hf30-action-inner]{position:relative!important;inset:auto!important;transform:none!important;width:auto!important;height:auto!important;min-height:0!important;padding:0!important;margin:0!important;display:flex!important;align-items:center!important;justify-content:center!important}\n[data-hf30-main] [data-hf30-action] p{font-size:13px!important;letter-spacing:0!important;padding:0 2px!important;white-space:nowrap!important}\n[data-hf30-footer]{box-sizing:border-box!important;width:100%!important;max-width:100%!important;min-width:0!important;height:auto!important;min-height:0!important;padding:40px clamp(20px,5vw,56px)!important;flex-shrink:0!important}\n[data-hf30-footer]>div{width:100%!important;min-width:0!important;height:auto!important;min-height:0!important;padding:0!important}\n[data-hf30-footer] [data-hf30-flow]{gap:12px!important;text-align:left!important}\n[data-hf30-hero]{box-sizing:border-box!important;width:100%!important;min-width:0!important;max-width:100%!important;height:calc(100svh - 64px)!important;min-height:280px!important;flex-shrink:0!important;position:relative!important;overflow:hidden!important;--hf30-pad:clamp(20px,5vw,56px);--hf30-type:clamp(19px,4.3vw,32px);--hf30-logo:clamp(104px,24vw,168px)}\n[data-hf30-hero]>video{width:100%!important;height:100%!important;object-fit:cover!important;inset:0!important}\n[data-hf30-hero-wrap]{display:contents!important;transform:none!important;opacity:1!important}\n[data-hf30-headline]{box-sizing:border-box!important;position:absolute!important;left:var(--hf30-pad)!important;right:var(--hf30-pad)!important;top:auto!important;bottom:56px!important;width:auto!important;height:auto!important;min-width:0!important;min-height:0!important;transform:none!important;opacity:1!important;display:flex!important;flex-direction:column!important;justify-content:flex-start!important;align-items:stretch!important;gap:6px!important}\n[data-hf30-headline] h1,[data-hf30-headline] span{font-size:var(--hf30-type)!important;line-height:1.4!important;letter-spacing:0!important}\n[data-hf30-headline] h1{width:100%!important;height:auto!important;min-height:0!important;margin:0!important;white-space:normal!important}\n[data-hf30-spacer]{display:inline-block!important;width:calc(var(--hf30-logo) + 8px)!important;font-size:0!important}\n[data-hf30-wordmark]{position:absolute!important;left:var(--hf30-pad)!important;right:auto!important;top:auto!important;bottom:calc(56px + var(--hf30-type)*.15)!important;width:var(--hf30-logo)!important;height:calc(var(--hf30-logo)*.14552)!important;transform:none!important;opacity:1!important}\n[data-hf30-wordmark] img{width:100%!important;height:100%!important;object-fit:contain!important}\n[data-hf30-tagline]{position:absolute!important;left:var(--hf30-pad)!important;right:var(--hf30-pad)!important;top:auto!important;bottom:calc(88px + var(--hf30-type)*2.8)!important;width:auto!important;height:auto!important;min-height:0!important;transform:none!important;opacity:1!important;display:block!important}\n[data-hf30-tagline] p{font-size:12px!important;line-height:1.5!important;letter-spacing:.04em!important;width:auto!important;height:auto!important;margin:0!important}\n[data-hf30-meta]{position:absolute!important;left:var(--hf30-pad)!important;right:var(--hf30-pad)!important;top:auto!important;bottom:20px!important;width:auto!important;height:auto!important;transform:none!important;opacity:1!important;display:block!important}\n[data-hf30-meta] h3{width:auto!important;height:auto!important;margin:0!important;font-size:10px!important;line-height:1.4!important}\n}\n@media(min-width:680px) and (max-width:1279px){\n[data-hf30-products] [data-hf30-product-grid]{display:grid!important;grid-template-columns:repeat(3,minmax(0,1fr))!important;gap:24px!important;align-items:start!important}\n[data-hf30-products] [data-hf30-card]{display:flex!important;grid-area:auto!important}\n[data-hf30-main] p{font-size:15px!important}\n[data-hf30-intro]>div>div>[data-hf30-flow],[data-hf30-review]>[data-hf30-flow]{max-width:820px!important;margin:0 auto!important}\n}\n@media(min-width:1024px) and (max-width:1279px){[data-hf30-hero]{height:calc(100svh - 80px)!important}}\n@media(max-width:359px){[data-hf30-main] p{font-size:13px!important}[data-hf30-products]{padding-top:32px!important;padding-bottom:32px!important}[data-hf30-products] [data-hf30-product-grid]{gap:28px!important}[data-hf30-name] p,[data-hf30-name] span{font-size:18px!important}}\n`;\n const style=document.createElement('style');style.dataset.hf30Style='';style.textContent=CSS;document.head.append(style);\n const originals=new Map();let raf=0,disposed=false;\n const mark=(e,key)=>{if(!e)return;const attr='data-hf30-'+key;let m=originals.get(e);if(!m){m=new Map();originals.set(e,m)}if(!m.has(attr))m.set(attr,e.getAttribute(attr));e.setAttribute(attr,'')};\n const clean=s=>String(s||'').replace(/[\\s\\u200b-\\u200d]/g,'');\n function release(e,attrs){for(const[k,v]of attrs)v===null?e.removeAttribute(k):e.setAttribute(k,v);originals.delete(e)}\n function reflow(){raf=0;if(disposed)return;for(const[e,attrs]of originals)if(!e.isConnected)release(e,attrs);const main=[...document.querySelectorAll('main')].find(e=>e.textContent.includes('BrainAble, 두뇌의 가능성을 깨우다')&&e.textContent.includes('Hear From Our Clients'));if(!main){for(const[e,attrs]of originals)release(e,attrs);return;}\n  mark(main,'main');mark(main.parentElement,'page');const sections=[...main.children];sections.forEach(e=>mark(e,'section'));mark(sections[0],'intro');mark(sections[1],'banner');mark(sections[2],'products');mark(sections[3],'review');\n  for(const e of main.querySelectorAll('div'))if(['회사소개','CONTACTS'].includes(clean(e.textContent))&&clean(e.parentElement?.textContent)!==clean(e.textContent)&&getComputedStyle(e).cursor==='pointer'){mark(e,'action');for(const child of e.querySelectorAll('div'))if(clean(child.textContent))mark(child,'action-inner')};\n  const footer=main.parentElement.querySelector(':scope>footer');mark(footer,'footer');\n  for(const root of [main,footer].filter(Boolean))for(const e of root.querySelectorAll('div'))if(clean(e.textContent)&&!e.closest('[data-hf30-action]')&&!e.closest('button'))mark(e,'flow');\n  for(const p of main.querySelectorAll('p'))if(!clean(p.textContent))mark(p,'blank');\n  for(const e of sections[0].querySelectorAll('.textContents'))if(e.querySelectorAll(':scope>p').length>2)mark(e,'prose');\n  const products=sections[2];const cards=[...products.querySelectorAll('div')].filter(e=>e.children.length===3&&[...e.children].some(c=>c.tagName==='P')&&[...e.children].some(c=>/^(LASERABLE|READINGABLE|LISTENINGABLE)$/.test(clean(c.textContent))));\n  for(const card of cards){mark(card,'card');mark(card.parentElement,'product-grid');for(const c of card.children){if(c.tagName==='P')mark(c,'category');else if(/^(LASERABLE|READINGABLE|LISTENINGABLE)$/.test(clean(c.textContent)))mark(c,'name');else mark(c,'description')}}\n  const review=sections[3];const previous=review.querySelector('button');if(previous){const controls=previous.parentElement;mark(controls,'controls');mark(controls.parentElement,'quote');for(const e of controls.parentElement.querySelectorAll('.textContents'))if(e.querySelectorAll(':scope>p').length>1)mark(e,'prose');}\n  const h=[...document.querySelectorAll('h1')].find(e=>clean(e.textContent)==='잠재력을깨우는기술,');if(!h)return;let hero=h;while(hero&&!([...hero.children].some(c=>c.tagName==='VIDEO')))hero=hero.parentElement;if(!hero)return;mark(hero,'hero');\n  for(const e of hero.querySelectorAll('div'))if(e.contains(h)&&e!==h.parentElement)mark(e,'hero-wrap');\n  mark(h.parentElement,'headline');const second=[...h.parentElement.querySelectorAll('h1')][1];const spacer=second&&[...second.children].find(e=>!clean(e.textContent));mark(spacer,'spacer');\n  const wordmark=hero.querySelector('img');mark(wordmark?.parentElement,'wordmark');const tagline=[...hero.querySelectorAll('p')].find(e=>e.textContent.includes('Pioneer'));mark(tagline?.parentElement,'tagline');mark(hero.querySelector('h3')?.parentElement,'meta');\n }\n const schedule=()=>{if(!disposed&&!raf)raf=requestAnimationFrame(reflow)};const observer=new MutationObserver(schedule);observer.observe(document.body,{childList:true,subtree:true});window.addEventListener('resize',schedule,{passive:true});reflow();\n window[KEY]={dispose(){if(disposed)return;disposed=true;observer.disconnect();cancelAnimationFrame(raf);window.removeEventListener('resize',schedule);style.remove();for(const[e,attrs]of originals)release(e,attrs);originals.clear()}};\n})();\n\n;\n/* BRAINABLE production global: laserable-native-responsive */\n/** Local candidate: native wrapper correction only; approved code contents remain untouched. */\n(()=>{\n const KEY='__brainableLaserableNative31';window[KEY]?.dispose();\n const style=document.createElement('style');style.textContent=`\n@media(max-width:1279px){\n[data-lp31-width]{box-sizing:border-box!important;width:100%!important;min-width:0!important;max-width:100%!important;padding-left:0!important;padding-right:0!important}\n[data-lp31-natural]{height:auto!important;min-height:0!important;max-height:none!important;flex-shrink:0!important;padding-top:0!important;padding-bottom:0!important;gap:0!important}\n[data-lp31-intro]{display:block!important;box-sizing:border-box!important;width:100%!important;min-width:0!important;max-width:100%!important;height:auto!important;min-height:0!important;max-height:none!important;position:relative!important;inset:auto!important;transform:none!important;flex-shrink:0!important;padding:28px clamp(20px,5vw,48px)!important;margin:0!important}\n[data-lp31-intro-flow]{box-sizing:border-box!important;width:100%!important;min-width:0!important;max-width:100%!important;height:auto!important;min-height:0!important;max-height:none!important;position:relative!important;inset:auto!important;transform:none!important;display:flex!important;flex-direction:column!important;align-items:stretch!important;justify-content:flex-start!important;gap:20px!important;padding:0!important;margin:0!important;flex-shrink:0!important;grid-area:auto!important}\n[data-lp31-intro] .textContents{display:block!important;line-height:1.65!important}\n[data-lp31-intro] p,[data-lp31-intro] h1,[data-lp31-intro] h2,[data-lp31-intro] h3{box-sizing:border-box!important;width:auto!important;max-width:100%!important;min-width:0!important;height:auto!important;min-height:0!important;position:relative!important;inset:auto!important;transform:none!important;margin:0!important;font-size:16px!important;line-height:1.65!important;white-space:normal!important;word-break:keep-all!important;overflow-wrap:anywhere!important}\n[data-lp31-intro] span{font-size:inherit!important;line-height:inherit!important}\n[data-lp31-intro-image]{box-sizing:border-box!important;position:relative!important;inset:auto!important;transform:none!important;width:auto!important;min-width:0!important;max-width:min(100%,720px)!important;height:auto!important;min-height:0!important;max-height:72svh!important;object-fit:contain!important;display:block!important;margin:0 auto!important}\n[data-lp31-map]{order:2!important}\n[data-lp31-caption]{order:3!important;padding-top:0!important;padding-bottom:28px!important}\n[data-lp31-caption] p{font-size:12px!important}\n[data-lp31-host]{order:4!important}\n[data-lp31-logo]{position:relative!important;inset:auto!important;transform:none!important;order:-1!important;width:clamp(180px,60vw,320px)!important;max-width:calc(100% - 40px)!important;min-width:0!important;height:auto!important;min-height:0!important;margin:32px auto 20px!important;flex-shrink:0!important}\n[data-lp31-logo] img{position:relative!important;inset:auto!important;width:100%!important;height:auto!important;max-width:100%!important;object-fit:contain!important;display:block!important;transform:none!important}\n[data-lp31-cta]{box-sizing:border-box!important;width:100%!important;min-width:0!important;max-width:100%!important;height:auto!important;min-height:0!important;gap:24px!important;padding:48px 20px!important;flex-shrink:0!important}\n[data-lp31-cta-copy]{width:100%!important;max-width:100%!important;min-width:0!important;height:auto!important;min-height:0!important;white-space:normal!important}\n[data-lp31-cta-copy] p{width:auto!important;height:auto!important;margin:0!important;font-size:clamp(20px,5vw,26px)!important;line-height:1.45!important;word-break:keep-all!important;white-space:normal!important}\n[data-lp31-blank]{display:none!important}\n}\n`;style.dataset.lp31Style='';document.head.append(style);\n const owned=new Map();let raf=0,dead=false;const clean=s=>String(s||'').replace(/[\\s\\u200b-\\u200d]/g,'');\n const mark=(e,key)=>{const k='data-lp31-'+key;if(!owned.has(e))owned.set(e,new Map());const attrs=owned.get(e);if(!attrs.has(k))attrs.set(k,e.getAttribute(k));e.setAttribute(k,'')};\n const restore=(e,attrs)=>{for(const[k,v]of attrs)v===null?e.removeAttribute(k):e.setAttribute(k,v);owned.delete(e)};\n const inFlow=e=>{const s=getComputedStyle(e);return s.display!=='none'&&s.position!=='absolute'&&s.position!=='fixed'};\n function sync(){raf=0;if(dead)return;for(const[e,a]of owned)if(!e.isConnected)restore(e,a);\n  const root=document.querySelector('.laserable-renewal.le29-spatial');if(!root){for(const[e,a]of owned)restore(e,a);return;}\n  let chain=[];for(let e=root.parentElement,i=0;e&&e!==document.body&&e!==document.documentElement&&i<12;e=e.parentElement,i++){chain.push(e);if(e.id==='container')break;}\n  // Only the observed code-to-container host path is eligible, never app internals.\n  chain.forEach(e=>mark(e,'width'));\n  const intro=[...document.querySelectorAll('p')].find(e=>!root.contains(e)&&e.textContent.includes('브레인에이블이 개발한 레이저에이블'));\n  const common=intro&&chain.find(e=>e.contains(intro));if(!common)return;\n  // Measured production shape: code host -> intro group -> padded body ->\n  // inner frame -> MAIN. None includes the preceding everyday hero/header.\n  const nativeMain=root.closest('main');const mainIndex=chain.indexOf(nativeMain);\n  if(mainIndex<0)return;for(let i=0;i<=mainIndex;i++)mark(chain[i],'natural');\n  mark(root.parentElement,'host');\n  for(const wrapper of chain.slice(1,mainIndex+1))for(const child of wrapper.children){\n   if(child.contains(root))continue;\n   const image=child.querySelector('img');\n   if(!clean(child.textContent)&&image&&image.naturalWidth/image.naturalHeight>3&&getComputedStyle(child).position==='absolute')mark(child,'logo');\n   if(clean(child.textContent).startsWith('지금바로브레인에이블과상담해보세요.')){mark(child,'cta');for(const item of child.children)if(clean(item.textContent)==='지금바로브레인에이블과상담해보세요.')mark(item,'cta-copy');}\n  }\n  for(const branch of common.children){if(branch.contains(root))continue;const hasCopy=!!clean(branch.textContent),map=getComputedStyle(branch).display==='contents'&&!!branch.querySelector('img');if(!hasCopy&&!map)continue;mark(branch,'intro');if(map)mark(branch,'map');if(branch.textContent.includes('*Transcranial Photo-Bio-Modulation'))mark(branch,'caption');\n   for(const e of branch.querySelectorAll('div'))if(clean(e.textContent)||e.querySelector('img'))mark(e,'intro-flow');\n   for(const image of branch.querySelectorAll('img')){mark(image,'intro-image');for(let p=image.parentElement;p&&p!==branch;p=p.parentElement)mark(p,'intro-flow');}\n   for(const p of branch.querySelectorAll('p'))if(!clean(p.textContent))mark(p,'blank');\n  }\n }\n const schedule=()=>{if(!dead&&!raf)raf=requestAnimationFrame(sync)};const observer=new MutationObserver(schedule);observer.observe(document.body,{childList:true,subtree:true});window.addEventListener('resize',schedule,{passive:true});document.addEventListener('load',schedule,true);sync();\n window[KEY]={dispose(){if(dead)return;dead=true;observer.disconnect();window.removeEventListener('resize',schedule);document.removeEventListener('load',schedule,true);cancelAnimationFrame(raf);style.remove();for(const[e,a]of owned)restore(e,a)},status(){return{marked:owned.size,codeRoot:!!document.querySelector('.laserable-renewal.le29-spatial')}}};\n})();\n\n;\n/* BRAINABLE production global: laserable-first-scene-fit */\n/** Local candidate: preserve approved sizing/logo handling; bind every rendered Everyday instance. */\n(() => {\n  const KEY = '__brainableFirstScene31';\n  window[KEY]?.dispose();\n  const style = document.createElement('style');\n  style.textContent = `\n[data-lp31-first-scene]{--lp31-first-nav:64px;scroll-margin-top:var(--lp31-first-nav)!important;height:calc(100svh - var(--lp31-first-nav))!important;min-height:calc(100svh - var(--lp31-first-nav))!important}\n[data-lp31-first-host]{--lp31-first-nav:64px;flex-shrink:0!important;height:calc(100svh - var(--lp31-first-nav))!important;min-height:calc(100svh - var(--lp31-first-nav))!important;max-height:none!important}\n@media(min-width:1024px){[data-lp31-first-scene],[data-lp31-first-host]{--lp31-first-nav:80px}}\n[data-lp31-hero-logo-flow]{box-sizing:border-box!important;position:relative!important;inset:auto!important;transform:none!important;flex-shrink:0!important;width:clamp(180px,60vw,320px)!important;max-width:calc(100% - 40px)!important;height:auto!important;min-height:0!important;max-height:none!important;margin:24px auto!important;padding:0!important;order:0!important}\n[data-lp31-hero-logo-flow] img{display:block!important;position:relative!important;inset:auto!important;transform:none!important;width:100%!important;max-width:100%!important;height:auto!important;min-height:0!important;max-height:none!important;object-fit:contain!important;object-position:center!important}\n[data-lp31-hero-logo-duplicate]{display:none!important}\n`;\n  document.head.append(style);\n  const exactLogo = /(?:^|[^a-f0-9])a99b21091db44b74702c6452c8847c11eba1f575\\.png(?:[?#&]|$)/i;\n  const ownsLogoAsset = image => exactLogo.test(image?.getAttribute('src') || '');\n  const active = new Map();\n  let frame = 0, dead = false;\n  function rendered(element) {\n    // Off-screen is still rendered: scrolling must not remove height ownership.\n    if (!element.isConnected || !element.getClientRects().length) return false;\n    const rect = element.getBoundingClientRect();\n    if (!(rect.width > 0 && rect.height > 0)) return false;\n    for (let node = element; node && node !== document.body; node = node.parentElement) {\n      const css = getComputedStyle(node);\n      if (css.display === 'none' || css.visibility === 'hidden' || css.visibility === 'collapse') return false;\n    }\n    return true;\n  }\n  const exactHeroMedia = /(?:^|[^a-f0-9])(?:5825f5c24257920bc2ed005b92017332dce7f54d|ae8e9d361a42018efe03cf28d63ebb21fbf3379e)(?=$|[^a-f0-9])/i;\n  function restoredNativeHero(page, host) {\n    return [...page.children].some(header => {\n      if (header.tagName !== 'HEADER' || !rendered(header) ||\n          !(header.compareDocumentPosition(host) & Node.DOCUMENT_POSITION_FOLLOWING) ||\n          header.querySelector('nav,a,button,[role=\"navigation\"]')) return false;\n      const media = [header, ...header.querySelectorAll('video,source,img,[style]')];\n      return media.some(node => [\n        node.currentSrc, node.getAttribute('src'), node.getAttribute('srcset'),\n        node.getAttribute('poster'), node.getAttribute('style'),\n        getComputedStyle(node).backgroundImage,\n      ].some(value => value && exactHeroMedia.test(value)));\n    });\n  }\n  function createBinding(target, host) {\n    const attrs = new Map();\n    let logo = null, homeParent = null, homeNext = null;\n    let moved = false;\n    const mark = (element, name, value = '') => {\n      let saved = attrs.get(element);\n      if (!saved) attrs.set(element, saved = new Map());\n      if (!saved.has(name)) saved.set(name, element.getAttribute(name));\n      if (element.getAttribute(name) !== value) element.setAttribute(name, value);\n    };\n    const unmark = (element, name) => {\n      const saved = attrs.get(element);\n      if (!saved?.has(name)) return;\n      const value = saved.get(name);\n      value === null ? element.removeAttribute(name) : element.setAttribute(name, value);\n      saved.delete(name);\n      if (!saved.size) attrs.delete(element);\n    };\n    function restore(element) {\n      for (const name of [...(attrs.get(element)?.keys() || [])]) unmark(element, name);\n    }\n    function releaseLogo() {\n      if (logo) {\n        restore(logo);\n        if (moved && homeParent) {\n          if (homeNext?.parentElement === homeParent) homeParent.insertBefore(logo, homeNext);\n          else homeParent.append(logo);\n        }\n      }\n      logo = homeParent = homeNext = null;\n      moved = false;\n    }\n    function release() {\n      releaseLogo();\n      if (target) restore(target);\n      if (host) restore(host);\n  \n    }\n    function syncLogo() {\n      const page = host?.parentElement;\n      if (!page) { releaseLogo(); return; }\n      // The restored original video hero owns this wordmark, not Everyday.\n      if (restoredNativeHero(page, host)) { releaseLogo(); return; }\n      const nextMain = [...page.children].find(node => node.tagName === 'MAIN' && (host.compareDocumentPosition(node) & Node.DOCUMENT_POSITION_FOLLOWING));\n      if (!nextMain) { releaseLogo(); return; }\n      const nextLogo = [...page.children].find(node => {\n        if (node.tagName !== 'DIV' || node.textContent.trim() || node === host) return false;\n        const images = node.querySelectorAll('img');\n        return images.length === 1 && ownsLogoAsset(images[0]) &&\n          (node === logo || getComputedStyle(node).position === 'absolute');\n      });\n      if (nextLogo !== logo) {\n        releaseLogo();\n        if (nextLogo) { logo = nextLogo; homeParent = logo.parentElement; homeNext = logo.nextSibling; }\n      }\n      if (!logo) return;\n      const duplicate = [...nextMain.querySelectorAll('img')].some(image => ownsLogoAsset(image) && rendered(image));\n      if (duplicate) {\n        unmark(logo, 'data-lp31-hero-logo-flow');\n        mark(logo, 'data-lp31-hero-logo-duplicate');\n        mark(logo, 'aria-hidden', 'true');\n      } else {\n        unmark(logo, 'data-lp31-hero-logo-duplicate');\n        unmark(logo, 'aria-hidden');\n        mark(logo, 'data-lp31-hero-logo-flow');\n        if (host.nextSibling !== logo) { host.after(logo); moved = true; }\n      }\n    }\n    mark(target, 'data-lp31-first-scene');\n    if (host) mark(host, 'data-lp31-first-host');\n    return { host, syncLogo, release };\n  }\n  function sync() {\n    frame = 0;\n    if (dead) return;\n    const next = new Map();\n    for (const target of document.querySelectorAll('.le28-everyday')) {\n      if (!rendered(target)) continue;\n      const parent = target.parentElement;\n      const host = parent?.classList.contains('tailwind') && parent.parentElement &&\n        getComputedStyle(parent.parentElement).display.includes('flex') ? parent : null;\n      next.set(target, host);\n    }\n    // Release hidden/unmounted breakpoint ownership before activating its replacement.\n    for (const [target, binding] of active) {\n      if (!next.has(target) || next.get(target) !== binding.host) {\n        binding.release();\n        active.delete(target);\n      }\n    }\n    for (const [target, host] of next) {\n      if (!active.has(target)) active.set(target, createBinding(target, host));\n      active.get(target).syncLogo();\n    }\n  }\n  const schedule = () => { if (!dead && !frame) frame = requestAnimationFrame(sync); };\n  const observer = new MutationObserver(schedule);\n  observer.observe(document.body, {childList:true, subtree:true});\n  window.addEventListener('resize', schedule, {passive:true});\n  document.addEventListener('load', schedule, true);\n  sync();\n  window[KEY] = {\n    dispose() {\n      if (dead) return;\n      dead = true; observer.disconnect(); cancelAnimationFrame(frame);\n      window.removeEventListener('resize', schedule);\n      document.removeEventListener('load', schedule, true);\n      for (const binding of active.values()) binding.release();\n      active.clear(); style.remove();\n    }\n  };\n})();\n\n;\n/* BRAINABLE production global: laserable-native-hero-fit */\n/* Restored native LASERABLE opening hero: keep its original video, crop and logo node. */\n(() => {\n  const KEY = '__brainableNativeHero31';\n  window[KEY]?.dispose();\n  const exactMedia = /(?:^|[^a-f0-9])(?:5825f5c24257920bc2ed005b92017332dce7f54d|ae8e9d361a42018efe03cf28d63ebb21fbf3379e)(?=$|[^a-f0-9])/i;\n  const exactLogo = /(?:^|[^a-f0-9])a99b21091db44b74702c6452c8847c11eba1f575\\.png(?:[?#&]|$)/i;\n  const style = document.createElement('style');\n  style.dataset.lh31Styles = '';\n  style.textContent = `\n[data-lh31-native-hero]{--lh31-nav:64px;--lh31-height:calc(100svh - var(--lh31-nav));box-sizing:border-box!important;position:relative!important;width:100%!important;min-width:0!important;max-width:none!important;height:var(--lh31-height)!important;min-height:var(--lh31-height)!important;max-height:var(--lh31-height)!important;flex-grow:0!important;flex-shrink:0!important;align-self:stretch!important;padding:0!important;scroll-snap-align:start;scroll-margin-top:var(--lh31-nav)}\n[data-lh31-hero-wordmark]{box-sizing:border-box!important;position:absolute!important;inset:auto!important;left:var(--lh31-logo-left)!important;top:var(--lh31-logo-top)!important;transform:none!important;width:var(--lh31-logo-width)!important;height:var(--lh31-logo-height)!important;min-width:0!important;max-width:none!important;min-height:0!important;max-height:none!important;margin:0!important;padding:0!important;flex:none!important;z-index:2;pointer-events:none}\n[data-lh31-hero-wordmark] img{box-sizing:border-box!important;position:absolute!important;inset:0!important;transform:none!important;width:100%!important;height:100%!important;min-width:0!important;min-height:0!important;max-width:100%!important;max-height:100%!important;object-fit:contain!important;object-position:center!important}\n[data-lh31-native-hero][data-lh31-wide]{background-color:#02060e!important;overflow:hidden!important}\n[data-lh31-native-hero][data-lh31-wide] [data-lh31-video-layer]{box-sizing:border-box!important;position:absolute!important;inset:0!important;width:100%!important;height:100%!important;min-width:0!important;min-height:0!important;max-width:none!important;max-height:none!important;margin:0!important;padding:0!important;transform:none!important;overflow:hidden!important;background-color:#02060e!important}\n[data-lh31-native-hero][data-lh31-wide] video[data-lh31-video]{box-sizing:border-box!important;position:absolute!important;inset:0!important;width:100%!important;height:100%!important;min-width:0!important;min-height:0!important;max-width:100%!important;max-height:100%!important;margin:0!important;transform:none!important;object-fit:contain!important;object-position:center!important;background-color:#02060e!important}\n[data-lh31-native-hero][data-lh31-wide][data-lh31-portrait-fill] video[data-lh31-video]{object-fit:cover!important;object-position:75% center!important}\n@media(min-width:1024px){[data-lh31-native-hero]{--lh31-nav:80px}}\n`;\n  document.head.append(style);\n  const active = new Map();\n  let frame = 0, dead = false;\n  function rendered(node) {\n    if (!node?.isConnected || !node.getClientRects().length) return false;\n    const rect = node.getBoundingClientRect();\n    if (!(rect.width > 0 && rect.height > 0)) return false;\n    for (let element = node; element && element !== document.body; element = element.parentElement) {\n      const css = getComputedStyle(element);\n      if (css.display === 'none' || css.visibility === 'hidden' || css.visibility === 'collapse') return false;\n    }\n    return true;\n  }\n  function isExactHero(header, host) {\n    if (header.tagName !== 'HEADER' || !rendered(header) ||\n        !(header.compareDocumentPosition(host) & Node.DOCUMENT_POSITION_FOLLOWING) ||\n        header.querySelector('nav,a,button,[role=\"navigation\"]')) return false;\n    return [header, ...header.querySelectorAll('video,source,img,[style]')].some(node => [\n      node.currentSrc, node.getAttribute('src'), node.getAttribute('srcset'),\n      node.getAttribute('poster'), node.getAttribute('style'), getComputedStyle(node).backgroundImage,\n    ].some(value => value && exactMedia.test(value)));\n  }\n  function findWordmark(page, hero) {\n    const owned = active.get(hero)?.logo;\n    if (owned?.isConnected && owned.parentElement === page && rendered(owned)) return owned;\n    const candidates = [...page.children].filter(node => {\n      if (node.tagName !== 'DIV' || node.textContent.trim() || !rendered(node)) return false;\n      const images = node.querySelectorAll('img');\n      return images.length === 1 && exactLogo.test(images[0].getAttribute('src') || '') &&\n        getComputedStyle(node).position === 'absolute';\n    });\n    return candidates.length === 1 ? candidates[0] : null;\n  }\n  function bind(hero, logo) {\n    const heroAttr = hero.getAttribute('data-lh31-native-hero');\n    const logoAttr = logo.getAttribute('data-lh31-hero-wordmark');\n    const wideAttr = hero.getAttribute('data-lh31-wide');\n    const portraitFillAttr = hero.getAttribute('data-lh31-portrait-fill');\n    const mediaMarks = new Map();\n    function releaseMedia() {\n      for (const [node, saved] of mediaMarks) {\n        saved.value === null ? node.removeAttribute(saved.name) : node.setAttribute(saved.name, saved.value);\n      }\n      mediaMarks.clear();\n      wideAttr === null ? hero.removeAttribute('data-lh31-wide') : hero.setAttribute('data-lh31-wide', wideAttr);\n      portraitFillAttr === null ? hero.removeAttribute('data-lh31-portrait-fill') : hero.setAttribute('data-lh31-portrait-fill', portraitFillAttr);\n    }\n    function fitWideMedia(wide) {\n      if (!wide) { releaseMedia(); return; }\n      const videos = [...hero.querySelectorAll('video')].filter(video =>\n        [video, ...video.querySelectorAll('source')].some(node =>\n          [node.currentSrc, node.getAttribute('src'), node.getAttribute('poster')]\n            .some(value => value && exactMedia.test(value))));\n      if (videos.length !== 1) { releaseMedia(); return; }\n      const video = videos[0], next = new Map([[video, 'data-lh31-video']]);\n      for (let node = video.parentElement; node && node !== hero; node = node.parentElement) {\n        if (node.tagName !== 'DIV' || node.textContent.trim() ||\n            node.querySelector('nav,a,button,[data-lh31-hero-wordmark]')) break;\n        next.set(node, 'data-lh31-video-layer');\n      }\n      for (const [node, saved] of mediaMarks) if (!next.has(node)) {\n        saved.value === null ? node.removeAttribute(saved.name) : node.setAttribute(saved.name, saved.value);\n        mediaMarks.delete(node);\n      }\n      for (const [node, name] of next) if (!mediaMarks.has(node)) {\n        mediaMarks.set(node, {name, value:node.getAttribute(name)});\n        node.setAttribute(name, '');\n      }\n      if (!hero.hasAttribute('data-lh31-wide')) hero.setAttribute('data-lh31-wide', '');\n      return video;\n    }\n\n    const hadStyle = logo.hasAttribute('style');\n    // Figma may choose its authored mobile frame above a usual CSS breakpoint.\n    // The unchanged wordmark widths identify those three original compositions.\n    const authoredWidth = Number.parseFloat(getComputedStyle(logo).width);\n    const authored = Math.abs(authoredWidth - 321) < 2 ? 'mobile' :\n      Math.abs(authoredWidth - 567) < 2 ? 'tablet' :\n      Math.abs(authoredWidth - 778.666626) < 2 ? 'desktop' : null;\n\n    const names = ['--lh31-logo-left','--lh31-logo-top','--lh31-logo-width','--lh31-logo-height'];\n    const original = names.map(name => [name, logo.style.getPropertyValue(name), logo.style.getPropertyPriority(name)]);\n    hero.setAttribute('data-lh31-native-hero', '');\n    logo.setAttribute('data-lh31-hero-wordmark', '');\n    return {logo, syncPosition() {\n      const rect = hero.getBoundingClientRect();\n      const parent = logo.offsetParent || logo.parentElement;\n      if (!parent || !rect.width || !rect.height) return;\n      const base = parent.getBoundingClientRect();\n      const viewport = document.documentElement.clientWidth || window.innerWidth;\n      const viewportHeight = document.documentElement.clientHeight || window.innerHeight;\n      const nativeMobile = authored === 'mobile' || (!authored && viewport < 800);\n      const aspect = rect.width / rect.height;\n      const trulyWide = aspect > 1.2 || viewport > viewportHeight;\n      const portraitFill = !trulyWide && nativeMobile && aspect > .72;\n      const adjustedVideo = fitWideMedia(trulyWide || portraitFill);\n      if (portraitFill && adjustedVideo) hero.setAttribute('data-lh31-portrait-fill', '');\n      else portraitFillAttr === null ? hero.removeAttribute('data-lh31-portrait-fill') : hero.setAttribute('data-lh31-portrait-fill', portraitFillAttr);\n      const wideVideo = trulyWide ? adjustedVideo : null;\n      const ratio = wideVideo?.videoWidth > 0 && wideVideo?.videoHeight > 0 ? wideVideo.videoWidth / wideVideo.videoHeight : 16 / 9;\n      const imageWidth = wideVideo ? Math.min(rect.width, rect.height * ratio) : rect.width;\n      const imageHeight = wideVideo ? imageWidth / ratio : rect.height;\n      const imageLeft = (rect.width - imageWidth) / 2, imageTop = (rect.height - imageHeight) / 2;\n      const mobile = authored ? authored === 'mobile' : viewport < 800;\n      const tablet = authored ? authored === 'tablet' : viewport < 1280 && !mobile;\n      // Retain the measured original composition at each authored breakpoint.\n      const anchorY = wideVideo ? .82 : mobile ? .54 : tablet ? .662 : .821;\n      const widthFraction = wideVideo ? .6 : mobile ? .856 : tablet ? .70875 : .60833333;\n      const width = portraitFill && adjustedVideo ? rect.width * .856 : Math.min(imageWidth * widthFraction, imageHeight * .73);\n      const left = imageLeft + (mobile ? (imageWidth - width) / 2 : imageWidth * (wideVideo ? .1 : tablet ? .0625 : .1));\n      const values = [\n        rect.left - base.left - (parent.clientLeft || 0) + (parent.scrollLeft || 0) + left,\n        rect.top - base.top - (parent.clientTop || 0) + (parent.scrollTop || 0) + imageTop + imageHeight * anchorY,\n        width, width * 144 / 876,\n      ];\n      names.forEach((name, index) => {\n        const value = `${Math.round(values[index] * 1000) / 1000}px`;\n        if (logo.style.getPropertyValue(name) !== value) logo.style.setProperty(name, value);\n      });\n    }, release() {\n      releaseMedia();\n      heroAttr === null ? hero.removeAttribute('data-lh31-native-hero') : hero.setAttribute('data-lh31-native-hero', heroAttr);\n      logoAttr === null ? logo.removeAttribute('data-lh31-hero-wordmark') : logo.setAttribute('data-lh31-hero-wordmark', logoAttr);\n      for (const [name, value, priority] of original) value ? logo.style.setProperty(name, value, priority) : logo.style.removeProperty(name);\n      if (!hadStyle && !logo.getAttribute('style')) logo.removeAttribute('style');\n    }};\n  }\n  function sync() {\n    frame = 0;\n    if (dead) return;\n    const next = new Map();\n    for (const scene of document.querySelectorAll('.le28-everyday')) {\n      if (!rendered(scene)) continue;\n      const host = scene.parentElement, page = host?.parentElement;\n      if (!host?.classList.contains('tailwind') || !page || !getComputedStyle(page).display.includes('flex')) continue;\n      const heroes = [...page.children].filter(header => isExactHero(header, host));\n      if (heroes.length !== 1) continue;\n      const hero = heroes[0], logo = findWordmark(page, hero);\n      if (logo) next.set(hero, logo);\n    }\n    for (const [hero, binding] of active) {\n      if (next.get(hero) !== binding.logo) {binding.release(); active.delete(hero);}\n    }\n    for (const [hero, logo] of next) {\n      if (!active.has(hero)) active.set(hero, bind(hero, logo));\n      active.get(hero).syncPosition();\n    }\n  }\n  const schedule = () => {if (!dead && !frame) frame = requestAnimationFrame(sync);};\n  const observer = new MutationObserver(schedule);\n  observer.observe(document.body, {childList:true, subtree:true, attributes:true, attributeFilter:['src','poster','class','style']});\n  window.addEventListener('resize', schedule, {passive:true});\n  document.addEventListener('load', schedule, true);\n  sync();\n  window[KEY] = {dispose() {\n    if (dead) return;\n    dead = true; observer.disconnect(); cancelAnimationFrame(frame);\n    window.removeEventListener('resize', schedule);\n    document.removeEventListener('load', schedule, true);\n    for (const binding of active.values()) binding.release();\n    active.clear(); style.remove();\n  }};\n})();\n\n;\n/* BRAINABLE production global: laserable-desktop-clip */\n/** LOCAL CANDIDATE ONLY. Waits for the existing final12 hydration gate. */\n(() => {\n  const KEY='__brainableDesktopClip31';\n  window[KEY]?.dispose();\n  const CSS=\"/* LOCAL CANDIDATE. Scope: visible product code → closest native MAIN only. */\\n@media (min-width:1280px) {\\n  [data-dc31-native-width] {\\n    box-sizing:border-box!important;\\n    width:100%!important;\\n    min-width:0!important;\\n    max-width:none!important;\\n    padding-left:0!important;\\n    padding-right:0!important;\\n    align-self:stretch!important;\\n  }\\n  .laserable-renewal.le29-spatial[data-dc31-root] {\\n    width:100%!important;\\n    min-width:0!important;\\n    max-width:none!important;\\n  }\\n}\\n\\n/* Keep the white canvas full-width; bound content with padding, not the canvas. */\\n@media (min-width:921px) {\\n  .laserable-renewal.le29-spatial[data-dc31-root] > .te30-scene[data-dc31-scene][data-layout=\\\"a\\\"] {\\n    --dc31-fit:1;\\n    --dc31-available-height:calc(100svh - var(--te30-header-height,0px));\\n    --dc31-pad-y:max(14px,calc(clamp(28px,5svh,56px) * var(--dc31-fit)));\\n    box-sizing:border-box;\\n    width:100%;\\n    max-width:none;\\n    min-width:0;\\n    margin-inline:0;\\n    height:var(--dc31-available-height);\\n    min-height:0;\\n    max-height:none;\\n    padding-block:var(--dc31-pad-y);\\n    padding-inline:max(clamp(28px,4.5vw,72px),calc((100% - 1600px) / 2));\\n    column-gap:clamp(24px,3vw,48px);\\n    row-gap:max(10px,calc(clamp(18px,2.3svh,26px) * var(--dc31-fit)));\\n    grid-template-columns:minmax(0,44fr) minmax(0,56fr);\\n    grid-template-rows:auto auto auto;\\n    align-content:center;\\n    overflow:visible;\\n    scroll-snap-align:start;\\n  }\\n  .laserable-renewal.le29-spatial[data-dc31-root] > .te30-scene[data-dc31-scene] > .brand {\\n    width:max(220px,calc(clamp(260px,24vw,350px) * var(--dc31-fit)));\\n    max-width:100%;\\n  }\\n  .laserable-renewal.le29-spatial[data-dc31-root] > .te30-scene[data-dc31-scene] .headline {\\n    font-size:max(24px,calc(clamp(29px,2.65vw,38px) * var(--dc31-fit)));\\n    line-height:1.27;\\n    overflow-wrap:normal;\\n    word-break:keep-all;\\n  }\\n  .laserable-renewal.le29-spatial[data-dc31-root] > .te30-scene[data-dc31-scene] .expertise {\\n    font-size:max(13px,calc(clamp(16px,1.27vw,18px) * var(--dc31-fit)));\\n    line-height:1.6;\\n    margin-top:max(10px,calc(clamp(16px,2svh,24px) * var(--dc31-fit)));\\n  }\\n  .laserable-renewal.le29-spatial[data-dc31-root] > .te30-scene[data-dc31-scene] > .engines {\\n    gap:max(8px,calc(clamp(16px,2svh,22px) * var(--dc31-fit)));\\n  }\\n  .laserable-renewal.le29-spatial[data-dc31-root] > .te30-scene[data-dc31-scene] .engine h2 {\\n    font-size:max(14px,calc(clamp(16px,1.28vw,18px) * var(--dc31-fit)));\\n    margin-bottom:max(4px,calc(7px * var(--dc31-fit)));\\n    line-height:1.35;\\n  }\\n  .laserable-renewal.le29-spatial[data-dc31-root] > .te30-scene[data-dc31-scene] .engine p {\\n    font-size:max(13px,calc(clamp(14px,1.12vw,16px) * var(--dc31-fit)));\\n    line-height:1.55;\\n  }\\n  .laserable-renewal.le29-spatial[data-dc31-root] > .te30-scene[data-dc31-scene] > .visual {\\n    min-height:0;\\n    max-height:100%;\\n    align-self:stretch;\\n  }\\n  .laserable-renewal.le29-spatial[data-dc31-root] > .te30-scene[data-dc31-scene] .art-composite {\\n    width:min(100%,calc((var(--dc31-available-height) - 2 * var(--dc31-pad-y)) * 4 / 3));\\n    max-width:100%;\\n    aspect-ratio:4 / 3;\\n  }\\n  .laserable-renewal.le29-spatial[data-dc31-root] > .te30-scene[data-dc31-scene] .approved-art {\\n    width:100%;\\n    height:100%;\\n    max-height:100%;\\n    object-fit:contain;\\n    object-position:center;\\n  }\\n  .laserable-renewal.le29-spatial[data-dc31-root] > .monitor-dark.md30-scene {\\n    scroll-snap-align:start;\\n  }\\n  /* Readable fallback for exceptionally short windows: flow instead of hiding copy. */\\n  .laserable-renewal.le29-spatial[data-dc31-root] > .te30-scene[data-dc31-scene][data-dc31-fit-state=\\\"flow\\\"] {\\n    height:auto;\\n    min-height:var(--dc31-available-height);\\n    align-content:start;\\n    scroll-snap-align:none;\\n  }\\n}\\n\\n/* Figma uses a column NAV below1280px; enhancer desktop starts at1024px.\\n * Normalize only the explicit noncompact native state. Compact rules are untouched. */\\n[data-brnav-header][data-nav30-kind=\\\"native\\\"][data-brnav-compact=\\\"false\\\"] [data-brnav-menu] {\\n  flex-direction:row!important;\\n  flex-wrap:nowrap!important;\\n  height:auto!important;\\n  max-height:none!important;\\n}\\n\";\n  const owned=new Map(), scenes=new Map();\n  let style=null, observer=null, resize=null, frame=0, retry=0, dead=false, phase='waiting-for-final12';\n  const attr=(node,key,value='')=>{\n    let record=owned.get(node); if(!record)owned.set(node,record=new Map());\n    if(!record.has(key))record.set(key,node.getAttribute(key));\n    if(node.getAttribute(key)!==value)node.setAttribute(key,value);\n  };\n  function restore(node){\n    const record=owned.get(node); if(!record)return;\n    for(const[key,value]of record)value===null?node.removeAttribute(key):node.setAttribute(key,value);\n    owned.delete(node);\n  }\n  function isRendered(node){\n    if(!node?.isConnected||!node.getClientRects().length)return false;\n    const rect=node.getBoundingClientRect();if(!(rect.width>0&&rect.height>0))return false;\n    for(let current=node;current&&current!==document.body;current=current.parentElement){\n      const css=getComputedStyle(current);if(css.display==='none'||css.visibility==='hidden')return false;\n    }\n    return true;\n  }\n  const px=value=>Number.parseFloat(value)||0;\n  function restoreFit(scene,record){\n    if(scene.style.getPropertyValue('--dc31-fit')===record.written){\n      if(record.fit)scene.style.setProperty('--dc31-fit',record.fit,record.priority);\n      else scene.style.removeProperty('--dc31-fit');\n    }\n    resize?.unobserve(scene);\n    record.parts.forEach(node=>resize?.unobserve(node));\n    scenes.delete(scene);\n  }\n  function setFit(scene,record,value){\n    const next=String(Math.round(value*1000)/1000);\n    if(scene.style.getPropertyValue('--dc31-fit')!==next)scene.style.setProperty('--dc31-fit',next);\n    record.written=next;\n  }\n  function fitScene(scene){\n    let record=scenes.get(scene);\n    if(!record){\n      const parts=['brand','intro','engines'].map(name=>[...scene.children].find(node=>node.classList.contains(name)));\n      if(parts.some(node=>!node))return;\n      record={fit:scene.style.getPropertyValue('--dc31-fit'),priority:scene.style.getPropertyPriority('--dc31-fit'),written:'',parts,last:null};\n      scenes.set(scene,record);resize?.observe(scene);parts.forEach(node=>resize?.observe(node));\n    }\n    if(window.innerWidth<921){\n      if(record.written&&scene.style.getPropertyValue('--dc31-fit')===record.written){\n        if(record.fit)scene.style.setProperty('--dc31-fit',record.fit,record.priority);else scene.style.removeProperty('--dc31-fit');\n      }\n      record.written='';attr(scene,'data-dc31-fit-state','original');return;\n    }\n    attr(scene,'data-dc31-fit-state','fit');\n    setFit(scene,record,1);\n    const viewport=document.documentElement.clientHeight||window.innerHeight;\n    const required=()=>{\n      const css=getComputedStyle(scene);\n      return record.parts.reduce((sum,node)=>sum+node.offsetHeight,0)+2*px(css.rowGap)+px(css.paddingTop)+px(css.paddingBottom);\n    };\n    const available=Math.max(1,viewport-px(getComputedStyle(scene).getPropertyValue('--te30-header-height')));\n    let needed=required(), fit=1;\n    // At most three bounded measurement passes; no source/bitmap transform scaling.\n    for(let pass=0;pass<3&&needed>available-2&&fit>.82;pass++){\n      fit=Math.max(.82,Math.min(fit-.01,fit*(available-2)/needed));\n      setFit(scene,record,fit);needed=required();\n    }\n    const state=needed>available+1?'flow':'fit';\n    attr(scene,'data-dc31-fit-state',state);\n    record.last={available,required:Math.round(needed*100)/100,fit:Number(record.written),state};\n  }\n  function scan(){\n    frame=0;if(dead||phase!=='active')return;\n    const eligible=new Set();\n    const roots=[...document.querySelectorAll('.laserable-renewal.le29-spatial')].filter(isRendered);\n    for(const root of roots){\n      const host=root.parentElement,main=host?.closest('main');\n      // Refuse an unknown host shape and never walk above the native MAIN.\n      if(!main||main===root||!host?.classList.contains('tailwind'))continue;\n      let reached=false;const path=[];\n      for(let node=host,depth=0;node&&depth<10;node=node.parentElement,depth++){\n        path.push(node);if(node===main){reached=true;break;}\n      }\n      if(!reached)continue;\n      attr(root,'data-dc31-root');eligible.add(root);\n      for(const node of path){attr(node,'data-dc31-native-width');eligible.add(node);}\n      for(const scene of root.querySelectorAll(':scope > .te30-scene[data-layout=\"a\"]')){\n        attr(scene,'data-dc31-scene');eligible.add(scene);fitScene(scene);\n      }\n    }\n    for(const[scene,record]of scenes)if(!eligible.has(scene))restoreFit(scene,record);\n    for(const node of [...owned.keys()])if(!eligible.has(node)||!node.isConnected)restore(node);\n  }\n  function schedule(){if(!dead&&phase==='active'&&!frame)frame=requestAnimationFrame(scan);}\n  function start(){\n    retry=0;if(dead)return;\n    const gatePhase=window.__brainableHydrationGate31?.inspect?.().phase;\n    if(gatePhase!=='active'&&gatePhase!=='starting'){\n      phase='waiting-for-final12';retry=setTimeout(start,250);return;\n    }\n    phase='active';style=document.createElement('style');style.dataset.dc31Style='';style.textContent=CSS;document.head.append(style);\n    resize=typeof ResizeObserver==='undefined'?null:new ResizeObserver(schedule);\n    observer=new MutationObserver(schedule);observer.observe(document.body,{childList:true,subtree:true});\n    window.addEventListener('resize',schedule,{passive:true});window.addEventListener('popstate',schedule);\n    document.fonts?.ready.then(schedule);document.addEventListener('load',schedule,true);\n    scan();\n  }\n  window[KEY]={\n    inspect:()=>({phase,owned:owned.size,scenes:[...scenes.entries()].map(([scene,record])=>({connected:scene.isConnected,...record.last}))}),\n    dispose(){\n      if(dead)return;dead=true;phase='disposed';clearTimeout(retry);cancelAnimationFrame(frame);\n      observer?.disconnect();resize?.disconnect();window.removeEventListener('resize',schedule);window.removeEventListener('popstate',schedule);document.removeEventListener('load',schedule,true);\n      for(const[scene,record]of [...scenes])restoreFit(scene,record);\n      for(const node of [...owned.keys()])restore(node);\n      style?.remove();delete window[KEY];\n    }\n  };\n  start();\n})();\n\n;\n/* BRAINABLE production global: laserable-tpbm-native-layout */\n/** Narrow native tPBM intro reflow. Approved text, media and code nodes stay in place. */\n(() => {\n  const KEY='__brainableTPBMNative20';\n  window[KEY]?.dispose();\n  const CSS=`\n/* This group is identified by exact native copy, mechanism art and product code host. */\n[data-tp20-group] {\n  --tp20-gutter:clamp(24px,5vw,88px);\n  box-sizing:border-box!important;position:relative!important;inset:auto!important;\n  transform:none!important;width:100%!important;min-width:0!important;max-width:none!important;\n  height:auto!important;min-height:0!important;max-height:none!important;\n  display:grid!important;grid-template-columns:minmax(var(--tp20-gutter),1fr) minmax(0,520px) clamp(32px,5vw,88px) minmax(0,560px) minmax(var(--tp20-gutter),1fr)!important;\n  grid-template-rows:auto auto auto auto!important;gap:0!important;\n  align-items:center!important;justify-content:stretch!important;padding:0!important;margin:0!important;\n  flex-shrink:0!important;overflow:visible!important;\n}\n[data-tp20-group] > [data-tp20-lead],\n[data-tp20-group] > [data-tp20-copy],\n[data-tp20-group] > [data-tp20-diagram],\n[data-tp20-group] > [data-tp20-caption] {\n  box-sizing:border-box!important;position:relative!important;inset:auto!important;transform:none!important;\n  width:100%!important;min-width:0!important;max-width:none!important;height:auto!important;\n  min-height:0!important;max-height:none!important;display:block!important;flex-shrink:0!important;\n  margin:0!important;padding:0!important;order:0!important;overflow:visible!important;\n}\n[data-tp20-group] > [data-tp20-lead] {grid-column:2 / 5!important;grid-row:1!important;text-align:center!important;padding-bottom:clamp(40px,5vw,72px)!important;font-size:clamp(18px,1.5vw,22px)!important;line-height:1.6!important;letter-spacing:.035em!important;}\n[data-tp20-group] > [data-tp20-copy] {grid-column:2!important;grid-row:2!important;text-align:left!important;font-size:16px!important;line-height:1.8!important;letter-spacing:.02em!important;}\n[data-tp20-group] > [data-tp20-diagram] {grid-column:4!important;grid-row:2!important;align-self:center!important;}\n[data-tp20-group] > [data-tp20-caption] {grid-column:4!important;grid-row:3!important;padding-top:16px!important;font-size:12px!important;line-height:1.5!important;text-align:left!important;letter-spacing:.01em!important;}\n[data-tp20-group] > [data-tp20-host] {grid-column:1 / -1!important;grid-row:4!important;width:100%!important;min-width:0!important;max-width:none!important;height:auto!important;min-height:0!important;max-height:none!important;position:relative!important;inset:auto!important;transform:none!important;margin-top:clamp(56px,7vw,100px)!important;order:0!important;}\n[data-tp20-group] [data-tp20-lead] p,\n[data-tp20-group] [data-tp20-copy] p,\n[data-tp20-group] [data-tp20-caption] p {\n  position:relative!important;inset:auto!important;transform:none!important;box-sizing:border-box!important;\n  width:auto!important;min-width:0!important;max-width:100%!important;height:auto!important;min-height:0!important;\n  margin:0!important;font-size:inherit!important;line-height:inherit!important;letter-spacing:inherit!important;\n  white-space:normal!important;word-break:keep-all!important;overflow-wrap:break-word!important;\n}\n[data-tp20-group] [data-tp20-copy] p:first-child {font-size:clamp(22px,1.8vw,28px)!important;line-height:1.5!important;letter-spacing:.025em!important;}\n[data-tp20-group] [data-tp20-copy] p:nth-child(2) {font-size:24px!important;line-height:1.5!important;margin-top:6px!important;}\n[data-tp20-group] [data-tp20-copy] p:nth-child(3) {font-size:14px!important;line-height:1.6!important;margin:2px 0 24px!important;}\n[data-tp20-group] [data-tp20-copy] span,\n[data-tp20-group] [data-tp20-lead] span,\n[data-tp20-group] [data-tp20-caption] span {font-size:inherit!important;line-height:inherit!important;letter-spacing:inherit!important;white-space:normal!important;word-break:keep-all!important;overflow-wrap:break-word!important;}\n[data-tp20-group] [data-tp20-copy] [data-tp20-empty] {display:none!important;}\n[data-tp20-group] [data-tp20-image-layer] {box-sizing:border-box!important;display:block!important;position:relative!important;inset:auto!important;transform:none!important;width:100%!important;min-width:0!important;max-width:none!important;height:auto!important;min-height:0!important;max-height:none!important;padding:0!important;margin:0!important;}\n[data-tp20-group] [data-tp20-image-frame] {aspect-ratio:663 / 581!important;}\n[data-tp20-group] [data-tp20-diagram] img[data-tp20-image] {box-sizing:border-box!important;display:block!important;position:absolute!important;inset:0!important;transform:none!important;width:100%!important;min-width:0!important;max-width:100%!important;height:100%!important;min-height:0!important;max-height:none!important;object-fit:contain!important;margin:0!important;}\n@media(max-width:799px) {\n  [data-tp20-group] {grid-template-columns:var(--tp20-gutter) minmax(0,1fr) var(--tp20-gutter)!important;grid-template-rows:auto auto auto auto auto!important;}\n  [data-tp20-group] > [data-tp20-lead] {grid-column:2!important;grid-row:1!important;text-align:left!important;padding-bottom:32px!important;}\n  [data-tp20-group] > [data-tp20-copy] {grid-column:2!important;grid-row:2!important;}\n  [data-tp20-group] > [data-tp20-diagram] {grid-column:2!important;grid-row:3!important;margin-top:32px!important;max-width:560px!important;justify-self:center!important;}\n  [data-tp20-group] > [data-tp20-caption] {grid-column:2!important;grid-row:4!important;max-width:560px!important;justify-self:center!important;}\n  [data-tp20-group] > [data-tp20-host] {grid-row:5!important;}\n}\n`;\n  const owned=new Map();let style=null,observer=null,raf=0,dead=false;\n  const normalize=value=>String(value||'').replace(/[\\s\\u200b-\\u200d]/g,'');\n  const exactImage=image=>[image.getAttribute('src'),image.getAttribute('srcset'),image.currentSrc].some(value=>/(?:^|[^a-f0-9])77031a29c81d3a07cd0fcea7245b5c692922a786(?:[^a-f0-9]|$)/i.test(value||''));\n  const visible=node=>{\n    if(!node?.isConnected||!node.getClientRects().length)return false;\n    for(let current=node;current&&current!==document.body;current=current.parentElement){\n      const css=getComputedStyle(current);if(css.display==='none'||css.visibility==='hidden')return false;\n    }\n    return true;\n  };\n  const mark=(node,key,eligible)=>{\n    const attribute='data-tp20-'+key;\n    if(!owned.has(node))owned.set(node,new Map());\n    const record=owned.get(node);if(!record.has(attribute))record.set(attribute,node.getAttribute(attribute));\n    if(!node.hasAttribute(attribute))node.setAttribute(attribute,'');eligible.add(node);\n  };\n  const restore=node=>{\n    const record=owned.get(node);if(!record)return;\n    for(const[key,value]of record)value===null?node.removeAttribute(key):node.setAttribute(key,value);\n    owned.delete(node);\n  };\n  function scan(){\n    raf=0;if(dead)return;const eligible=new Set();\n    for(const root of document.querySelectorAll('.laserable-renewal.le29-spatial')){\n      if(!visible(root))continue;\n      const nativeMain=root.parentElement?.closest('main');if(!nativeMain||nativeMain===root)continue;\n      for(let group=root.parentElement,depth=0;group&&group!==nativeMain&&depth<8;group=group.parentElement,depth++){\n        const children=[...group.children],host=children.find(child=>child.contains(root));\n        const copy=children.find(child=>!child.contains(root)&&normalize(child.textContent).startsWith('비침습적경두개근적외선광조사tPBM')&&normalize(child.textContent).includes('(Transcranial-Photo-Bio-Modulation)'));\n        const lead=children.find(child=>!child.contains(root)&&normalize(child.textContent).startsWith('브레인에이블이개발한레이저에이블은'));\n        const diagram=children.find(child=>!child.contains(root)&&[...child.querySelectorAll('img')].some(exactImage));\n        const caption=children.find(child=>!child.contains(root)&&normalize(child.textContent)==='*TranscranialPhoto-Bio-Modulation(t-PBM)Mechanism');\n        if(!copy||!lead||!diagram||!caption||!host||!host.classList.contains('tailwind'))continue;\n        mark(group,'group',eligible);mark(lead,'lead',eligible);mark(copy,'copy',eligible);\n        mark(diagram,'diagram',eligible);mark(caption,'caption',eligible);mark(host,'host',eligible);\n        for(const paragraph of copy.querySelectorAll('p'))if(!normalize(paragraph.textContent))mark(paragraph,'empty',eligible);\n        for(const image of diagram.querySelectorAll('img'))if(exactImage(image)){\n          mark(image,'image',eligible);mark(image.parentElement,'image-frame',eligible);\n          for(let layer=image.parentElement;layer&&layer!==diagram;layer=layer.parentElement)mark(layer,'image-layer',eligible);\n        }\n        break;\n      }\n    }\n    for(const node of [...owned.keys()])if(!eligible.has(node)||!node.isConnected)restore(node);\n  }\n  const schedule=()=>{if(!dead&&!raf)raf=requestAnimationFrame(scan);};\n  style=document.createElement('style');style.dataset.tp20Style='';style.textContent=CSS;document.head.append(style);\n  observer=new MutationObserver(schedule);observer.observe(document.body,{childList:true,subtree:true});\n  window.addEventListener('resize',schedule,{passive:true});window.addEventListener('popstate',schedule);\n  document.addEventListener('load',schedule,true);document.fonts?.ready.then(schedule);scan();\n  window[KEY]={\n    inspect:()=>({groups:document.querySelectorAll('[data-tp20-group]').length,owned:owned.size}),\n    dispose(){if(dead)return;dead=true;observer.disconnect();cancelAnimationFrame(raf);window.removeEventListener('resize',schedule);window.removeEventListener('popstate',schedule);document.removeEventListener('load',schedule,true);style.remove();for(const node of [...owned.keys()])restore(node);delete window[KEY];}\n  };\n})();\n\n;\n/* BRAINABLE production global: laserable-ending-cta-recovery */\n/* Final20 v4: center the native ending CTA, double its original visual interval, and remove only its preceding native bottom divider.\n * Restore only the copied native LASERABLE ending CTA when its link was lost.\n * Original public Figma nodes: Desktop 10:3445, Mobile 2148:3571.\n * Both navigate to /센터소개; original Mobile (<1280px) opens a new tab.\n * Existing semantic links/buttons and all code-component CTAs are untouched.\n */\n(function () {\n  'use strict';\n  if (window.__brainableEndingCTA31) return;\n  const HEADING = '지금 바로 브레인에이블과 상담해 보세요.';\n  const LABEL = '상담문의';\n  const DESTINATION = '/센터소개';\n  const EXCLUDE = 'nav,header,footer,.laserable-renewal,.le28-everyday,[data-nav30-kind],[data-cms30-pagination],[data-center30-card]';\n  const ACTION = 'a[href],button,[role=\"link\"],[role=\"button\"]';\n  const records = new Map();\n  const normalize = value => (value || '').replace(/\\s+/g, ' ').trim();\n  let observer, frame = 0, stopped = false;\n\n  const style = document.createElement('style');\n  style.setAttribute('data-cr31-style', '');\n  style.textContent = `\n    [data-cr31-anchor] {\n      position:relative!important;display:inline-flex!important;align-items:center!important;justify-content:center!important;\n      flex:0 0 auto!important;box-sizing:border-box!important;width:max-content!important;max-width:100%!important;\n      height:auto!important;min-width:114px!important;min-height:48px!important;max-height:none!important;\n      inset:auto!important;transform:none!important;translate:none!important;scale:none!important;rotate:none!important;\n      padding:12px 24px!important;margin:0!important;opacity:1!important;visibility:visible!important;\n      font-size:16px!important;font-weight:500!important;line-height:1.4!important;white-space:nowrap!important;\n      text-decoration:none!important;color:#fff!important;-webkit-text-fill-color:#fff!important;\n      background:#000;border-radius:999px;box-shadow:inset 0 0 0 1px #4c4c55;cursor:pointer!important;\n    }\n    [data-cr31-zone] {\n      display:flex!important;flex-direction:column!important;align-items:center!important;justify-content:center!important;\n      height:auto!important;min-height:var(--cr31-zone-height,0px)!important;max-height:none!important;flex-shrink:0!important;gap:24px!important;overflow:visible!important;align-self:center!important;text-align:center!important;\n    }\n    [data-cr31-heading], [data-cr31-heading] :is(p,h1,h2,h3,span) {\n      box-sizing:border-box!important;width:100%!important;min-width:0!important;max-width:100%!important;\n      height:auto!important;min-height:0!important;max-height:none!important;\n      white-space:normal!important;word-break:keep-all!important;overflow-wrap:normal!important;word-wrap:normal!important;text-wrap:balance!important;text-align:center!important;margin-inline:auto!important;\n    }\n    [data-cr31-anchor] [data-cr31-path] {\n      display:contents!important;position:static!important;inset:auto!important;\n      width:auto!important;height:auto!important;min-width:0!important;min-height:0!important;max-height:none!important;\n      margin:0!important;padding:0!important;transform:none!important;translate:none!important;scale:none!important;rotate:none!important;\n      opacity:1!important;visibility:visible!important;overflow:visible!important;\n      font-size:16px!important;font-weight:500!important;line-height:1.4!important;white-space:nowrap!important;\n      color:#fff!important;-webkit-text-fill-color:#fff!important;\n    }\n    [data-cr31-anchor] [data-cr31-fill] {display:none!important;background:transparent!important;}\n    [data-cr31-native-divider] {border-bottom-width:0!important;}\n    [data-cr31-flow], [data-cr31-page] {height:auto!important;min-height:0!important;max-height:none!important;flex-shrink:0!important;}\n    [data-cr31-anchor]:focus-visible {outline:2px solid #aebaff;outline-offset:4px;}\n  `;\n\n  function isProduct() {\n    let path;\n    try { path = decodeURIComponent(location.pathname).replace(/\\/+$/, '') || '/'; } catch (_) { return false; }\n    if (path === '/laserable') return true;\n    // Native Figma preview uses '/' for all pages; require the approved product body.\n    return path === '/' && !!document.querySelector('.laserable-renewal.le29-spatial');\n  }\n  function updateTarget(record) {\n    const mobile = window.matchMedia('(width < 1280px)').matches;\n    const target = mobile ? '_blank' : '_self';\n    if (record.anchor.getAttribute('target') !== target) record.anchor.setAttribute('target', target);\n    if (mobile) record.anchor.setAttribute('rel', 'noopener');\n    else record.anchor.removeAttribute('rel');\n  }\n  function mark(record, node, name) {\n    if (!record.attributes.some(item => item.node === node && item.name === name)) {\n      record.attributes.push({node, name, previous:node.getAttribute(name)});\n    }\n    node.setAttribute(name, '');\n  }\n\n  function isRendered(node, allowZeroHeight = false) {\n    if (!node?.isConnected || !node.getClientRects?.().length) return false;\n    const rect = node.getBoundingClientRect();\n    if (!(rect.width > 0 && (allowZeroHeight || rect.height > 0))) return false;\n    for (let current = node; current && current !== document.body; current = current.parentElement) {\n      const css = getComputedStyle(current);\n      if (css.display === 'none' || css.visibility === 'hidden' || css.visibility === 'collapse') return false;\n    }\n    return true;\n  }\n  const px = value => Number.parseFloat(value) || 0;\n  function updateLayout(record) {\n    if (typeof getComputedStyle !== 'function' || !isRendered(record.zone, true)) return;\n    const zone = record.zone, parent = zone.parentElement, nativeMain = zone.closest('main');\n    if (!parent || !nativeMain) return;\n    const branch = [...parent.children].find(node => node !== zone && node.querySelector('.laserable-renewal.le29-spatial'));\n    if (!branch) return;\n    const divider = [...branch.children].find(node => node.getAttribute('aria-hidden') === 'true' && !node.children.length && !normalize(node.textContent) &&\n      (node.hasAttribute('data-cr31-native-divider') || px(getComputedStyle(node).borderBottomWidth) > 0));\n    if (!divider || !isRendered(divider)) return;\n    const page = nativeMain.closest('[data-breakpoint-id]') || nativeMain.parentElement;\n    const footers = [...page.querySelectorAll('footer,[role=\"contentinfo\"]')]\n      .filter(node => !nativeMain.contains(node) && isRendered(node) && (zone.compareDocumentPosition(node) & Node.DOCUMENT_POSITION_FOLLOWING));\n    const footer = footers.sort((a,b) => a.getBoundingClientRect().top - b.getBoundingClientRect().top)[0];\n    if (!footer) return;\n    mark(record, divider, 'data-cr31-native-divider');\n    if (!record.zoneHeightStyle) record.zoneHeightStyle = {\n      value:zone.style.getPropertyValue('--cr31-zone-height'), priority:zone.style.getPropertyPriority('--cr31-zone-height'), hadStyle:zone.hasAttribute('style')\n    };\n    const beforeMeasure = zone.style.getPropertyValue('--cr31-zone-height');\n    const beforePriority = zone.style.getPropertyPriority('--cr31-zone-height');\n    const hadStyle = zone.hasAttribute('style');\n    const restoreMeasure = () => {\n      if (beforeMeasure) zone.style.setProperty('--cr31-zone-height', beforeMeasure, beforePriority);\n      else zone.style.removeProperty('--cr31-zone-height');\n      if (!hadStyle && !zone.style.length) zone.removeAttribute('style');\n    };\n    zone.style.setProperty('--cr31-zone-height', '0px');\n    // Unlock only this native CTA-to-MAIN chain before reading geometry. A taller\n    // code host can otherwise leave the fixed-height footer above the divider.\n    const path = [];\n    for (let node = parent, depth = 0; node && depth < 6; node = node.parentElement, depth++) {\n      path.push(node);\n      if (node === nativeMain) break;\n    }\n    if (path[path.length - 1] !== nativeMain) { restoreMeasure(); return; }\n    for (const node of path) mark(record, node, 'data-cr31-flow');\n    // The native product breakpoint root also has a fixed inline height plus\n    // overflow:clip. Let its relative children establish document scroll height;\n    // preserve its width, overflow, navigation, hero and absolute wordmark.\n    if (page.hasAttribute('data-breakpoint-id')) mark(record, page, 'data-cr31-page');\n    const natural = zone.getBoundingClientRect().height;\n    const parentStyle = getComputedStyle(parent);\n    const gap = px(parentStyle.rowGap || parentStyle.gap), padding = px(parentStyle.paddingBottom);\n    if (!(natural > 0)) { restoreMeasure(); return; }\n    // Public1772x1000 evidence establishes a minimum desktop baseline of418px.\n    // Never derive slack from footer geometry: breakpoint remounts can inherit an\n    // already-expanded footer, creating cumulative growth. Recompute solely from\n    // the current natural CTA height and authored surrounding gap/padding.\n    const desktopMinimum = window.matchMedia('(width >= 1280px)').matches ? 418 : 0;\n    const baseline = Math.max(natural + gap + padding, desktopMinimum);\n    const height = baseline * 2 - gap - padding;\n    record.writtenHeight = `${Math.round(height * 1000) / 1000}px`;\n    zone.style.setProperty('--cr31-zone-height', record.writtenHeight);\n    record.layout = {naturalHeight:natural, gap, paddingBottom:padding, desktopMinimum,\n      baselineInterval:baseline, requestedInterval:baseline * 2, zoneMinHeight:height};\n  }\n\n  function release(record) {\n    // Keep every original node (and any native listeners) when restoring structure.\n    if (record.anchor.parentNode && record.button.parentNode === record.anchor) {\n      record.anchor.replaceWith(record.button);\n    } else record.anchor.remove();\n    for (const item of record.attributes) {\n      if (item.previous === null) item.node.removeAttribute(item.name);\n      else item.node.setAttribute(item.name, item.previous);\n    }\n    for (const node of record.hidden) node.setAttribute('hidden', '');\n    if (record.zoneHeightStyle && record.zone.style.getPropertyValue('--cr31-zone-height') === record.writtenHeight) {\n      const saved = record.zoneHeightStyle;\n      if (saved.value) record.zone.style.setProperty('--cr31-zone-height', saved.value, saved.priority);\n      else record.zone.style.removeProperty('--cr31-zone-height');\n      if (!saved.hadStyle && !record.zone.style.length) record.zone.removeAttribute('style');\n    }\n    records.delete(record.button);\n  }\n  function candidates() {\n    const result = [];\n    // Find a minimal native section with exactly the original heading and CTA.\n    const headings = [...document.querySelectorAll('main p,main h1,main h2,main h3,main .textContents')]\n      .filter(node => normalize(node.textContent) === HEADING && !node.closest(EXCLUDE));\n    for (const heading of headings) {\n      let zone = heading.parentElement;\n      for (let depth = 0; zone && depth < 5; depth++, zone = zone.parentElement) {\n        if (zone.tagName === 'MAIN' || zone.closest(EXCLUDE)) break;\n        if (normalize(zone.textContent).replace(/\\s/g, '') !== (HEADING + LABEL).replace(/\\s/g, '')) continue;\n        const label = [...zone.querySelectorAll('p,span,.textContents')]\n          .find(node => normalize(node.textContent) === LABEL && !node.closest(EXCLUDE));\n        if (!label) break;\n        let button = label;\n        while (button.parentElement && button.parentElement !== zone && normalize(button.parentElement.textContent) === LABEL) button = button.parentElement;\n        // Any existing native semantic action is authoritative and never replaced.\n        if (!button.matches(ACTION) && !button.querySelector(ACTION) && !button.closest(ACTION) && !records.has(button)) {\n          result.push({zone, button, label, heading});\n        }\n        break;\n      }\n    }\n    return result.filter((item, index) => result.findIndex(other => other.button === item.button) === index);\n  }\n  function scan() {\n    frame = 0;\n    if (stopped) return;\n    const product = isProduct();\n    for (const record of [...records.values()]) {\n      if (!product || !record.anchor.isConnected || !record.button.isConnected || normalize(record.button.textContent) !== LABEL) release(record);\n      else updateTarget(record);\n    }\n    if (!product) return;\n    for (const candidate of candidates()) {\n      const {button, label, zone, heading} = candidate;\n      if (!button.parentNode) continue;\n      const anchor = document.createElement('a');\n      anchor.setAttribute('href', DESTINATION);\n      anchor.setAttribute('data-cr31-anchor', '');\n      const record = {button, label, zone, anchor, attributes:[], hidden:[]};\n      records.set(button, record);\n      updateTarget(record);\n      mark(record, zone, 'data-cr31-zone');\n      mark(record, heading, 'data-cr31-heading');\n      // Wrapper keeps original contents, styling, events, and layout classes intact.\n      button.before(anchor);\n      anchor.append(button);\n      const path = [button, ...button.querySelectorAll('*')].filter(node => normalize(node.textContent) === LABEL && node.getAttribute('aria-hidden') !== 'true');\n      for (const node of path) {\n        mark(record, node, 'data-cr31-path');\n        if (node.hasAttribute('hidden')) {record.hidden.push(node);node.removeAttribute('hidden');}\n      }\n      for (const node of button.querySelectorAll('[aria-hidden=\"true\"]')) {\n        if (!node.children.length) mark(record, node, 'data-cr31-fill');\n      }\n    }\n    for (const record of records.values()) updateLayout(record);\n  }\n  function schedule() {if (!stopped && !frame) frame = window.requestAnimationFrame(scan);}\n  function start() {\n    if (stopped) return;\n    document.head.append(style);\n    observer = new MutationObserver(changes => {\n      if (changes.some(change => change.type === 'childList' || change.type === 'characterData')) schedule();\n    });\n    observer.observe(document.body, {childList:true, characterData:true, subtree:true});\n    window.addEventListener('resize', schedule);\n    window.addEventListener('popstate', schedule);\n    document.addEventListener('load', schedule, true);\n    document.fonts?.ready.then(schedule);\n    scan();\n  }\n  window.__brainableEndingCTA31 = {\n    inspect: () => [...records.values()].map(record => ({\n      label:normalize(record.button.textContent), href:record.anchor.getAttribute('href'), target:record.anchor.getAttribute('target'),\n      connected:record.anchor.isConnected, originalNodePreserved:record.button.parentNode === record.anchor, layout:record.layout || null\n    })),\n    scan,\n    destroy() {\n      stopped = true;\n      observer?.disconnect();\n      if (frame) window.cancelAnimationFrame(frame);\n      document.removeEventListener('DOMContentLoaded', start);\n      window.removeEventListener('resize', schedule);\n      window.removeEventListener('popstate', schedule);\n      document.removeEventListener('load', schedule, true);\n      [...records.values()].forEach(release);\n      style.remove();\n      delete window.__brainableEndingCTA31;\n    }\n  };\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', start, {once:true}); else start();\n})();\n\n;\n/* BRAINABLE production global: consultation-cta */\n(() => {\n  // cta-shiny-paint.css\n  var cta_shiny_paint_default = '/* The approved ShinyButton paint, adapted to leave native layout and border widths intact. */\\n@property --cta30-angle { syntax:\"<angle>\"; initial-value:0deg; inherits:false; }\\n@property --cta30-offset { syntax:\"<angle>\"; initial-value:0deg; inherits:true; }\\n@property --cta30-percent { syntax:\"<percentage>\"; initial-value:5%; inherits:true; }\\n@property --cta30-shine { syntax:\"<color>\"; initial-value:white; inherits:true; }\\n\\n[data-cta30-shiny] {\\n  isolation:isolate;\\n  overflow:hidden;\\n  border-radius:999px !important;\\n  background:#000 !important;\\n  color:#fff !important;\\n  box-shadow:inset 0 0 0 1px #1a1818 !important;\\n  outline-offset:4px;\\n  transition:--cta30-offset 800ms cubic-bezier(.25,1,.5,1),--cta30-percent 800ms cubic-bezier(.25,1,.5,1),--cta30-shine 800ms cubic-bezier(.25,1,.5,1);\\n}\\n[data-cta30-shiny] :where(p,span,a,[role=\"link\"]) {\\n  color:#fff !important;\\n  -webkit-text-fill-color:#fff !important;\\n}\\n[data-cta30-paint=\"fill\"] { background:transparent !important; }\\n\\n[data-cta30-shiny]::before,\\n[data-cta30-shiny]::after {\\n  content:\"\";\\n  position:absolute;\\n  pointer-events:none;\\n  z-index:-1;\\n}\\n[data-cta30-shiny]::before {\\n  inset:0;\\n  padding:1px;\\n  border-radius:inherit;\\n  background:conic-gradient(from calc(var(--cta30-angle) - var(--cta30-offset)),transparent,#0000ff var(--cta30-percent),var(--cta30-shine) calc(var(--cta30-percent) * 2),#0000ff calc(var(--cta30-percent) * 3),transparent calc(var(--cta30-percent) * 4));\\n  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);\\n  -webkit-mask-composite:xor;\\n  mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);\\n  mask-composite:exclude;\\n  animation:cta30-edge 3s linear infinite;\\n}\\n[data-cta30-shiny]::after {\\n  inset-inline-start:50%;\\n  inset-block-start:50%;\\n  width:100%;\\n  aspect-ratio:1;\\n  translate:-50% -50%;\\n  background:radial-gradient(circle at 2px 2px,#fff .5px,transparent 0) 0 0 / 4px 4px,linear-gradient(-50deg,transparent,#0000ff,transparent);\\n  -webkit-mask-image:radial-gradient(circle at bottom,transparent 40%,#000);\\n  mask-image:radial-gradient(circle at bottom,transparent 40%,#000);\\n  opacity:.6;\\n  animation:cta30-shimmer 3s linear infinite;\\n}\\n[data-cta30-shiny]:is(:hover,:focus-visible) {\\n  --cta30-percent:20%;\\n  --cta30-offset:95deg;\\n  --cta30-shine:#8484ff;\\n}\\n[data-cta30-shiny]:focus-visible { outline:2px solid #aebaff; }\\n@keyframes cta30-edge { to { --cta30-angle:360deg; } }\\n@keyframes cta30-shimmer { to { rotate:360deg; } }\\n@media(prefers-reduced-motion:reduce) {\\n  [data-cta30-shiny],[data-cta30-shiny]::before,[data-cta30-shiny]::after { animation:none !important; transition:none !important; }\\n  [data-cta30-shiny]::before { --cta30-angle:35deg; }\\n}\\n';\n\n  // cta-global-entry.js\n  var LABELS = /* @__PURE__ */ new Set([\"\\uC0C1\\uB2F4\\uBB38\\uC758\", \"CONTACTS\", \"\\uC81C\\uD488\\xB7\\uB3C4\\uC785 \\uC0C1\\uB2F4\"]);\n  var CONTROL = 'a,button,[role=\"link\"],[role=\"button\"]';\n  var EXCLUDE = \"nav,header,footer,[data-nav30-kind],[data-cms30-pagination],[data-center30-card]\";\n  var normalize = (text) => text.replace(/\\s+/g, \" \").trim();\n  var geometryKeys = [\"display\", \"position\", \"boxSizing\", \"width\", \"height\", \"padding\", \"margin\", \"borderTopWidth\", \"borderRightWidth\", \"borderBottomWidth\", \"borderLeftWidth\", \"fontSize\", \"fontWeight\", \"lineHeight\", \"letterSpacing\", \"transform\"];\n  function layout(node) {\n    const style = getComputedStyle(node);\n    return Object.fromEntries(geometryKeys.map((key) => [key, style[key]]));\n  }\n  function existingShiny(node) {\n    const paints = [getComputedStyle(node), getComputedStyle(node, \"::before\"), getComputedStyle(node, \"::after\")];\n    return !!node.closest(\".brainable-consult-cta,[data-shiny-button],[data-cta30-shiny]\") || /shiny/i.test(node.className) || paints.some((paint) => /brainable-cta|shiny/i.test(paint.animationName) || paint.backgroundImage.includes(\"conic-gradient\"));\n  }\n  function startConsultCTA(document2 = window.document) {\n    const window2 = document2.defaultView;\n    window2.__brainableCTA30?.destroy();\n    const style = document2.createElement(\"style\");\n    style.dataset.cta30Styles = \"\";\n    style.textContent = cta_shiny_paint_default;\n    document2.head.append(style);\n    const records = /* @__PURE__ */ new Map();\n    let frame = 0, destroyed = false;\n    function release(record) {\n      record.node.removeAttribute(\"data-cta30-shiny\");\n      record.fills.forEach((node) => node.removeAttribute(\"data-cta30-paint\"));\n      records.delete(record.node);\n    }\n    function scan() {\n      frame = 0;\n      if (destroyed) return;\n      for (const record of records.values()) if (!record.node.isConnected || !LABELS.has(normalize(record.node.textContent)) || record.node.closest(EXCLUDE)) release(record);\n      const matches = [...document2.querySelectorAll(CONTROL)].filter((node) => LABELS.has(normalize(node.textContent)) && !node.closest(EXCLUDE));\n      const outer = matches.filter((node) => !matches.some((parent) => parent !== node && parent.contains(node)));\n      for (const node of outer) {\n        if (records.has(node) || existingShiny(node)) continue;\n        const rect = node.getBoundingClientRect(), computed = getComputedStyle(node);\n        if (rect.width < 44 || rect.height < 28 || rect.width > 560 || rect.height > 180 || computed.position === \"static\") continue;\n        if ([\"::before\", \"::after\"].some((pseudo) => ![\"none\", \"normal\", '\"\"'].includes(getComputedStyle(node, pseudo).content))) continue;\n        const nodes = [node, ...node.querySelectorAll(\"*\")];\n        const snapshot = nodes.map((child) => ({ node: child, layout: layout(child), href: child.getAttribute(\"href\"), target: child.getAttribute(\"target\"), rel: child.getAttribute(\"rel\"), role: child.getAttribute(\"role\"), text: child.textContent, onclick: child.onclick }));\n        const children = [...node.childNodes];\n        const fills = [...node.children].filter((child) => child.getAttribute(\"aria-hidden\") === \"true\" && child.children.length === 0 && getComputedStyle(child).position === \"absolute\");\n        const record = { node, label: normalize(node.textContent), snapshot, children, fills };\n        records.set(node, record);\n        fills.forEach((fill) => fill.dataset.cta30Paint = \"fill\");\n        node.dataset.cta30Shiny = \"\";\n      }\n    }\n    const schedule = () => {\n      if (!frame && !destroyed) frame = window2.requestAnimationFrame(scan);\n    };\n    const observer = new MutationObserver((records2) => {\n      if (records2.some((record) => record.type === \"childList\")) schedule();\n    });\n    observer.observe(document2.body, { childList: true, subtree: true });\n    window2.addEventListener(\"resize\", schedule);\n    window2.addEventListener(\"popstate\", schedule);\n    const api = { inspect() {\n      return [...records.values()].map((record) => ({ label: record.label, connected: record.node.isConnected, descendantsUnchanged: record.children.length === record.node.childNodes.length && record.children.every((node, i) => node === record.node.childNodes[i]), contentAndActionsPreserved: record.snapshot.every((s) => s.node.textContent === s.text && s.node.getAttribute(\"href\") === s.href && s.node.getAttribute(\"target\") === s.target && s.node.getAttribute(\"rel\") === s.rel && s.node.getAttribute(\"role\") === s.role && s.node.onclick === s.onclick), geometryPreserved: record.snapshot.every((s) => JSON.stringify(layout(s.node)) === JSON.stringify(s.layout)) }));\n    }, destroy() {\n      destroyed = true;\n      observer.disconnect();\n      window2.removeEventListener(\"resize\", schedule);\n      window2.removeEventListener(\"popstate\", schedule);\n      if (frame) window2.cancelAnimationFrame(frame);\n      [...records.values()].forEach(release);\n      style.remove();\n      delete window2.__brainableCTA30;\n    } };\n    window2.__brainableCTA30 = api;\n    scan();\n    return api;\n  }\n  if (document.readyState === \"loading\") document.addEventListener(\"DOMContentLoaded\", () => startConsultCTA(), { once: true });\n  else startConsultCTA();\n})();\n\n/* BRAINABLE production global: vision-spiral */\n/*\nHextaUI Gradient Tracing adaptation.\nMIT License\n\nCopyright (c) 2025 Preet Suthar\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n/* Gradient Tracing adaptation from HextaUI, Copyright (c) 2025 Preet Suthar.\n * MIT license and pinned upstream source: ./reference/LICENSE.upstream.txt.\n * Only the /about_us VISION header is changed. Native text nodes are retained.\n */\n(function brainableVisionSpiral() {\n  'use strict';\n  const KEY = '__brainableVisionSpiral';\n  if (window[KEY]) return;\n  const statements = [\n    '우리는 모든 사람이 자신의 뇌를 최대한 활용할 수 있는 세상을 만들어갑니다.',\n    '브레인에이블은 단순한 뇌기능 개선을 넘어, 건강한 뇌를 기반으로 행복한 삶을 실현하는 것을 목표로 합니다.',\n    '유아부터 성인 그리고 노인에 이르기까지 각 생애주기에 따른 맞춤형 두뇌 기능 향상 솔루션을 제공하여 더 나은 삶으로 안내합니다.'\n  ];\n  const compact = s => s.replace(/\\s+/g, '');\n  const PATH = 'M100,100 m0,-75 a75,75 0 1,1 -0.1,0 z';\n  let current = null, raf = 0, started = 0, elapsed = 0, scanFrame = 0, dead = false;\n  let visible = true;\n  const motion = matchMedia('(prefers-reduced-motion: reduce)');\n  const style = document.createElement('style');\n  style.id = 'brainable-vision-spiral-style';\n  style.textContent = `\n    [data-bvs=\"hero\"]{box-sizing:border-box!important;position:relative!important;isolation:isolate;\n      width:100%!important;max-width:100%!important;height:auto!important;min-height:calc(100svh - var(--bvs-nav,80px))!important;\n      display:flex!important;align-items:center!important;background:#000000!important;overflow:clip!important;\n      padding:clamp(40px,7svh,100px) clamp(24px,7.5vw,140px)!important;}\n    [data-bvs=\"old-background\"]{display:none!important;}\n    [data-bvs=\"wrap\"]{box-sizing:border-box!important;position:relative!important;inset:auto!important;\n      width:100%!important;max-width:100%!important;min-width:0!important;height:auto!important;min-height:0!important;\n      padding:0!important;margin:0!important;display:block!important;flex:none!important;transform:none!important;}\n    [data-bvs=\"content\"]{position:relative!important;z-index:1!important;display:flex!important;flex-direction:column!important;\n      gap:clamp(30px,5.5svh,72px)!important;width:100%!important;max-width:1450px!important;min-width:0!important;\n      height:auto!important;min-height:0!important;margin:0 auto!important;padding:0!important;}\n    [data-bvs=\"title-wrap\"],[data-bvs=\"copy-wrap\"]{display:block!important;position:relative!important;\n      width:100%!important;max-width:100%!important;min-width:0!important;height:auto!important;min-height:0!important;\n      padding:0!important;margin:0!important;opacity:1!important;transform:none!important;flex:none!important;}\n    [data-bvs=\"title-wrap\"] p{margin:0!important;white-space:normal!important;font-size:clamp(36px,4.3vw,60px)!important;\n      line-height:1.15!important;letter-spacing:.1em!important;color:#fff!important;}\n    [data-bvs=\"copy-wrap\"] h1{box-sizing:border-box!important;display:block!important;width:auto!important;max-width:100%!important;\n      margin:0!important;white-space:normal!important;word-break:keep-all!important;overflow-wrap:break-word!important;\n      font-size:clamp(15px,1.25vw,20px)!important;line-height:1.75!important;letter-spacing:.035em!important;\n      color:#f2f3f8!important;text-wrap:pretty;text-shadow:0 1px 10px #000000;}\n    [data-bvs=\"copy-wrap\"] h1+h1{margin-top:.3em!important;}\n    [data-bvs=\"background\"]{position:absolute;inset:0;z-index:0;pointer-events:none;overflow:hidden;}\n    [data-bvs=\"background\"] svg{position:absolute;right:1%;top:50%;width:min(82svh,72vw);height:auto;aspect-ratio:1;\n      transform:translateY(-50%);opacity:.78;overflow:visible;}\n    @media(max-width:900px){\n      [data-bvs=\"hero\"]{padding:40px clamp(24px,6vw,64px)!important;}\n      [data-bvs=\"background\"] svg{right:0;width:min(100%,80svh);opacity:.54;}\n      [data-bvs=\"copy-wrap\"] h1{font-size:16px!important;line-height:1.75!important;}\n      [data-bvs=\"copy-wrap\"] h1+h1{margin-top:.6em!important;}\n    }\n    @media(max-width:480px){\n      [data-bvs=\"hero\"]{padding:32px 24px!important;}\n      [data-bvs=\"content\"]{gap:30px!important;}\n      [data-bvs=\"copy-wrap\"] h1{font-size:14px!important;line-height:1.7!important;letter-spacing:.015em!important;}\n      [data-bvs=\"background\"] svg{width:100%;opacity:.42;}\n    }\n    @media(max-height:500px) and (min-width:600px){\n      [data-bvs=\"hero\"]{padding:24px clamp(28px,6vw,80px)!important;}\n      [data-bvs=\"content\"]{gap:20px!important;}\n      [data-bvs=\"title-wrap\"] p{font-size:32px!important;}\n      [data-bvs=\"copy-wrap\"] h1{font-size:13.5px!important;line-height:1.55!important;letter-spacing:.02em!important;}\n      [data-bvs=\"copy-wrap\"] h1+h1{margin-top:.25em!important;}\n      [data-bvs=\"background\"] svg{width:min(75svh,50vw);opacity:.6;}\n    }\n  `;\n  document.head.appendChild(style);\n  function gradientAt(ms) {\n    if (!current) return;\n    const phase = (ms % 2000) / 2000;\n    current.gradient.setAttribute('x1', String(phase * 400));\n    current.gradient.setAttribute('x2', String(phase * 200));\n  }\n  function stop() {\n    if (raf) { cancelAnimationFrame(raf); raf = 0; elapsed += performance.now() - started; }\n  }\n  function tick(now) {\n    gradientAt(elapsed + now - started);\n    raf = requestAnimationFrame(tick);\n  }\n  function sync() {\n    if (!current || motion.matches || document.hidden || !visible) {\n      stop();\n      if (motion.matches) gradientAt(760);\n      return;\n    }\n    if (!raf) { started = performance.now(); raf = requestAnimationFrame(tick); }\n  }\n  const intersection = new IntersectionObserver(entries => {\n    const e = entries.find(e => e.target === current?.hero);\n    if (e) { visible = e.isIntersecting && e.intersectionRatio > .01; sync(); }\n  }, { threshold: [0, .01] });\n  function mark(el, value, records) {\n    records.push([el, el.getAttribute('data-bvs')]); el.setAttribute('data-bvs', value);\n  }\n  function clear() {\n    stop();\n    if (!current) return;\n    intersection.unobserve(current.hero);\n    current.background.remove();\n    if (current.oldNav) current.hero.style.setProperty('--bvs-nav', current.oldNav);\n    else current.hero.style.removeProperty('--bvs-nav');\n    current.records.forEach(([el, old]) => old === null ? el.removeAttribute('data-bvs') : el.setAttribute('data-bvs', old));\n    current = null;\n  }\n  function measureNav() {\n    if (!current) return;\n    const height = current.hero.getBoundingClientRect().top + window.scrollY;\n    current.hero.style.setProperty('--bvs-nav', `${height && height < 150 ? height : 80}px`);\n  }\n  function scan() {\n    scanFrame = 0;\n    if (dead) return;\n    if (!/^\\/about_us\\/?$/.test(location.pathname)) { clear(); return; }\n    const candidates = Array.from(document.querySelectorAll('header')).filter(h => {\n      const title = Array.from(h.querySelectorAll('p')).find(p => p.textContent.trim() === 'VISION');\n      const copy = Array.from(h.querySelectorAll('h1'));\n      return title && copy.length === 3 && copy.every((p,i) => compact(p.textContent) === compact(statements[i]));\n    });\n    if (candidates.length !== 1) { if (current && !candidates.includes(current.hero)) clear(); return; }\n    const hero = candidates[0];\n    if (current?.hero === hero) { measureNav(); return; }\n    clear();\n    const title = Array.from(hero.querySelectorAll('p')).find(p => p.textContent.trim() === 'VISION');\n    const titleWrap = title.parentElement;\n    const content = titleWrap.parentElement;\n    const copyWrap = hero.querySelector('h1').parentElement;\n    const oldBackground = hero.querySelector(':scope > [aria-hidden=\"true\"]');\n    if (!oldBackground || !content.contains(copyWrap)) return;\n    const records = [];\n    mark(hero,'hero',records); mark(oldBackground,'old-background',records);\n    mark(titleWrap,'title-wrap',records); mark(copyWrap,'copy-wrap',records); mark(content,'content',records);\n    for(let n=content.parentElement;n&&n!==hero;n=n.parentElement) mark(n,'wrap',records);\n    const background = document.createElement('div');\n    background.setAttribute('data-bvs','background'); background.setAttribute('aria-hidden','true');\n    background.innerHTML = `<svg viewBox=\"0 0 200 200\" fill=\"none\" preserveAspectRatio=\"xMidYMid meet\" focusable=\"false\">\n      <path d=\"${PATH}\" stroke=\"#7B68EE\" stroke-opacity=\".12\" stroke-width=\"1\"/>\n      <path d=\"${PATH}\" stroke=\"url(#brainable-vision-spiral-gradient)\" stroke-linecap=\"round\" stroke-width=\"2\"/>\n      <defs><linearGradient id=\"brainable-vision-spiral-gradient\" gradientUnits=\"userSpaceOnUse\" x1=\"152\" x2=\"76\">\n        <stop stop-color=\"#7B68EE\" stop-opacity=\"0\"/><stop stop-color=\"#7B68EE\"/>\n        <stop offset=\"1\" stop-color=\"#3498DB\" stop-opacity=\"0\"/>\n      </linearGradient></defs></svg>`;\n    hero.prepend(background);\n    current = { hero, records, background, oldNav:hero.style.getPropertyValue('--bvs-nav'), gradient:background.querySelector('linearGradient') };\n    elapsed = 760; visible = true;\n    measureNav(); intersection.observe(hero); sync();\n  }\n  function schedule() { if (!scanFrame && !dead) scanFrame = requestAnimationFrame(scan); }\n  const observer = new MutationObserver(records => {\n    if (records.some(r => !r.target.closest?.('[data-bvs=\"background\"]'))) schedule();\n  });\n  observer.observe(document.body,{ childList:true,subtree:true });\n  window.addEventListener('resize',schedule,{passive:true});\n  window.addEventListener('pageshow',schedule); window.addEventListener('popstate',schedule);\n  document.addEventListener('visibilitychange',sync); motion.addEventListener('change',sync);\n  window[KEY] = {\n    version:'vision-spiral-1',\n    inspect:()=>({matched:!!current,running:!!raf,reducedMotion:motion.matches,inViewport:visible,\n      originalTextRetained:current ? Array.from(current.hero.querySelectorAll('h1')).every((h,i)=>compact(h.textContent)===compact(statements[i])) : null,\n      path:PATH,duration:2000,colors:['#7B68EE','#7B68EE','#3498DB']}),\n    destroy(){dead=true;observer.disconnect();intersection.disconnect();if(scanFrame)cancelAnimationFrame(scanFrame);\n      window.removeEventListener('resize',schedule);window.removeEventListener('pageshow',schedule);window.removeEventListener('popstate',schedule);\n      document.removeEventListener('visibilitychange',sync);motion.removeEventListener('change',sync);clear();style.remove();delete window[KEY];}\n  };\n  scan();\n})();\n\n\n/* BRAINABLE production global: vision-wave */\n/* BRAINABLE statistics Blue Halftone, 2026-09-30.\n * Independent recreation of Gabriel Hochart's public Blue Halftone preview.\n * Public component implementation is access-controlled; no locked source used.\n * Palette and cursor swirl follow the public component description.\n * Native copy, counters and existing responsive Wave layout remain identical.\n */\n(function () {\n  'use strict';\n  if (window.__brainableVisionWave) window.__brainableVisionWave.destroy();\n  const CONFIG = Object.freeze({ effect: 'blue-halftone', palette: ['#3B82F6','#2563EB','#1D4ED8','#1E40AF','#1E3A8A'], backgroundColor: '#000000', maxFPS: 30, maxDPR: 1.5, cellSize: 12, speed: 0.22 });\n  const owned = 'data-brainable-vision-wave';\n  const compact = value => (value || '').replace(/\\s+/g, '');\n  const expected = {\n    first: '20+20년이상의지속적인연구개발',\n    second: '50+확장중인브레인에이블전국네트워크',\n    headline: '브레인에이블은지금도혁신하고발전중입니다.'\n  };\n  let current = null, dead = false, pending = false;\n  const mq = window.matchMedia('(prefers-reduced-motion: reduce)');\n  const stats = { frames: 0, drawTimeLast: 0, drawTimeMax: 0, totalDrawTime: 0, error: null };\n  function visible(el) { return !!el && el.isConnected && el.getClientRects().length > 0 && getComputedStyle(el).display !== 'none'; }\n  function originalText(el) {\n    if (!el) return '';\n    const clone = el.cloneNode(true);\n    clone.querySelectorAll('[data-brainable-counting-owned], [data-brainable-vision-counting-overlay], [aria-hidden=\"true\"]').forEach(n => n.remove());\n    return compact(clone.textContent);\n  }\n  function match() {\n    if (location.pathname.replace(/\\/+$/, '') !== '/about_us') return null;\n    const first = [...document.querySelectorAll('main section[aria-label=\"Statistic 1 about Jones and Brown\"]')].find(visible);\n    const second = [...document.querySelectorAll('main section[aria-label=\"Statistic 3 about Jones and Brown\"]')].find(visible);\n    if (!first || !second) return null;\n    // Counting overlays can temporarily alter the numeric text; lock on approved captions.\n    if (!compact(first.textContent).includes('20년이상의지속적인연구개발') || !compact(second.textContent).includes('확장중인브레인에이블전국네트워크')) return null;\n    let hero = first.parentElement;\n    while (hero && hero !== document.body) {\n      if (hero.tagName === 'SECTION' && hero.contains(second) && [...hero.querySelectorAll('video')].some(v => v.getAttribute('aria-label') === 'Statistics about John and Brown Legal')) break;\n      hero = hero.parentElement;\n    }\n    if (!hero || hero === document.body) return null;\n    const video = hero.querySelector('video[aria-label=\"Statistics about John and Brown Legal\"]');\n    const headline = [...hero.querySelectorAll('h1,h2,h3,p,div')].find(n => compact(n.textContent) === expected.headline);\n    if (!video || !headline) return null;\n    let content = first.parentElement;\n    while (content && content !== hero && !content.contains(headline)) content = content.parentElement;\n    if (!content || content === hero) return null;\n    return { hero, video, content, first, second, headline };\n  }\n  function makeHalftoneRenderer(canvas, state) {\n    let gl=null, program=null, buffer=null, uniforms=null, disposed=false, lost=false, fallback=null, ctx=null, w=1,h=1,dpr=1;\n    const mouse = [.5,.5];\n    const vertex = 'attribute vec2 aPosition;void main(){gl_Position=vec4(aPosition,0.0,1.0);}';\n    // Original implementation from the observed public preview appearance, not source extraction.\n    const fragment = `precision highp float;\n      uniform vec2 uResolution; uniform vec2 uMouse; uniform float uTime; uniform float uDpr;\n      float hash(vec2 p){return fract(sin(dot(p,vec2(127.1,311.7)))*43758.5453);}\n      vec3 palette(float a){\n        vec3 c0=vec3(59.,130.,246.)/255.;vec3 c1=vec3(37.,99.,235.)/255.;\n        vec3 c2=vec3(29.,78.,216.)/255.;vec3 c3=vec3(30.,64.,175.)/255.;vec3 c4=vec3(30.,58.,138.)/255.;\n        float k=clamp(a,0.,.999)*4.;\n        if(k<1.)return mix(c4,c3,k);if(k<2.)return mix(c3,c2,k-1.);if(k<3.)return mix(c2,c1,k-2.);return mix(c1,c0,k-3.);\n      }\n      void main(){\n        vec2 pixel=gl_FragCoord.xy/uDpr;\n        vec2 uv=pixel/uResolution;uv.y=1.-uv.y;\n        vec2 p=(uv-.5)*vec2(uResolution.x/uResolution.y,1.);\n        vec2 cursor=(uMouse-.5)*vec2(uResolution.x/uResolution.y,1.);\n        float dist=length(p-cursor);float swirl=exp(-dist*3.)*.26;\n        float angle=.11+sin(uTime*.16)*.025+swirl;\n        mat2 turn=mat2(cos(angle),-sin(angle),sin(angle),cos(angle));\n        vec2 q=turn*p;\n        q+=vec2(sin(q.y*3.2+uTime*.55),cos(q.x*2.6-uTime*.43))*.028;\n        float field=.5+.20*sin(q.x*4.6+uTime*.52)+.17*cos(q.y*5.1-uTime*.41)+.12*sin((q.x+q.y)*3.5+uTime*.30);\n        field=clamp(field,0.,1.);\n        vec2 cell=q*uResolution.y/12.;vec2 center=floor(cell)+.5;\n        float radius=.18+field*.15;\n        float dotShape=1.-smoothstep(radius-.045,radius+.035,length(fract(cell)-.5));\n        float vignette=1.-smoothstep(.30,1.05,length(p*vec2(.65,1.)));\n        float blueField=pow(field,1.65)*.17;\n        vec3 color=palette(field)*(blueField+dotShape*(.035+field*.075))*vignette;\n        float grain=(hash(pixel+floor(uTime*20.))-.5)*.026;\n        color=max(vec3(0.),color+grain*vec3(.42,.52,.70));\n        // A black edge joins the adjacent black sections without a rectangular seam.\n        float edge=smoothstep(0.,.07,uv.y)*smoothstep(0.,.07,1.-uv.y);\n        gl_FragColor=vec4(color*edge,1.);\n      }`;\n    function init(){\n      try {\n        gl=canvas.getContext('webgl',{alpha:false,antialias:false,depth:false,stencil:false,powerPreference:'low-power',preserveDrawingBuffer:false});\n        if(!gl) throw new Error('WebGL unavailable');\n        const compile=(type,source)=>{const s=gl.createShader(type);gl.shaderSource(s,source);gl.compileShader(s);if(!gl.getShaderParameter(s,gl.COMPILE_STATUS)){gl.deleteShader(s);throw new Error('Shader compile failed');}return s;};\n        const vs=compile(gl.VERTEX_SHADER,vertex),fs=compile(gl.FRAGMENT_SHADER,fragment);\n        program=gl.createProgram();gl.attachShader(program,vs);gl.attachShader(program,fs);gl.linkProgram(program);gl.deleteShader(vs);gl.deleteShader(fs);\n        if(!gl.getProgramParameter(program,gl.LINK_STATUS))throw new Error('Shader link failed');\n        buffer=gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER,buffer);gl.bufferData(gl.ARRAY_BUFFER,new Float32Array([-1,-1,1,-1,-1,1,-1,1,1,-1,1,1]),gl.STATIC_DRAW);\n        gl.useProgram(program);const pos=gl.getAttribLocation(program,'aPosition');gl.enableVertexAttribArray(pos);gl.vertexAttribPointer(pos,2,gl.FLOAT,false,0,0);\n        uniforms={resolution:gl.getUniformLocation(program,'uResolution'),mouse:gl.getUniformLocation(program,'uMouse'),time:gl.getUniformLocation(program,'uTime'),dpr:gl.getUniformLocation(program,'uDpr')};\n      }catch(error){showFallback();}\n    }\n    function showFallback(){\n      lost=true;canvas.style.visibility='hidden';\n      if(!fallback){fallback=document.createElement('canvas');fallback.setAttribute('aria-hidden','true');fallback.setAttribute('data-brainable-blue-halftone','static-fallback');fallback.style.cssText=canvas.style.cssText;fallback.style.visibility='visible';canvas.parentElement.insertBefore(fallback,canvas.nextSibling);ctx=fallback.getContext('2d',{alpha:false});}\n      staticFrame();\n    }\n    function staticFrame(){\n      if(!fallback||!ctx)return;\n      fallback.width=Math.round(w*dpr);fallback.height=Math.round(h*dpr);ctx.setTransform(dpr,0,0,dpr,0,0);ctx.fillStyle='#000';ctx.fillRect(0,0,w,h);\n      const g=ctx.createRadialGradient(w*.5,h*.5,0,w*.5,h*.5,Math.max(w,h)*.7);g.addColorStop(0,'#07142d');g.addColorStop(.65,'#020713');g.addColorStop(1,'#000');ctx.fillStyle=g;ctx.fillRect(0,0,w,h);\n      ctx.save();ctx.translate(w*.5,h*.5);ctx.rotate(.11);ctx.fillStyle='#123174';\n      for(let y=-h*.8;y<h*.8;y+=12)for(let x=-w*.8;x<w*.8;x+=12){const f=.5+.2*Math.sin(x/Math.max(h,1)*4.6)+.17*Math.cos(y/Math.max(h,1)*5.1);ctx.globalAlpha=Math.max(0,.1+.18*f);ctx.beginPath();ctx.arc(x,y,2.16+f*1.8,0,Math.PI*2);ctx.fill();}ctx.restore();ctx.globalAlpha=1;\n      const edge=ctx.createLinearGradient(0,0,0,h);edge.addColorStop(0,'#000');edge.addColorStop(.07,'#0000');edge.addColorStop(.93,'#0000');edge.addColorStop(1,'#000');ctx.fillStyle=edge;ctx.fillRect(0,0,w,h);\n    }\n    function onLost(event){event.preventDefault();if(disposed)return;showFallback();}\n    canvas.addEventListener('webglcontextlost',onLost);\n    init();\n    return {\n      kind:()=>lost?'static-fallback':'webgl',\n      pointer:(x,y)=>{mouse[0]=Math.max(0,Math.min(1,x));mouse[1]=Math.max(0,Math.min(1,y));},\n      resize:(width,height,ratio)=>{w=width;h=height;dpr=ratio;if(lost){staticFrame();return;}gl.viewport(0,0,canvas.width,canvas.height);},\n      draw:time=>{if(disposed)return;if(lost)return;gl.useProgram(program);gl.uniform2f(uniforms.resolution,w,h);gl.uniform2f(uniforms.mouse,mouse[0],mouse[1]);gl.uniform1f(uniforms.time,time);gl.uniform1f(uniforms.dpr,dpr);gl.drawArrays(gl.TRIANGLES,0,6);},\n      dispose:()=>{disposed=true;canvas.removeEventListener('webglcontextlost',onLost);if(fallback)fallback.remove();if(gl&&!lost){if(buffer)gl.deleteBuffer(buffer);if(program)gl.deleteProgram(program);const lose=gl.getExtension('WEBGL_lose_context');if(lose)lose.loseContext();}}\n    };\n  }\n\n  function create(target) {\n    const state = { ...target, canvas: document.createElement('canvas'), inView: false, w: 0, h: 0, dpr: 1,\n      points: [], raf: 0, lastDraw: 0, lastTick: 0, elapsed: 0, wasPlaying: !target.video.paused,\n      videoTime: target.video.currentTime, attributes: [], priorPosition: target.hero.style.position,\n      positionChanged: false, framePoints: 0, stopped: false };\n    const mark = (el, name) => {\n      state.attributes.push([el, owned, el.getAttribute(owned)]);\n      el.setAttribute(owned, name);\n    };\n    mark(state.hero, 'section'); mark(state.video, 'original-video'); mark(state.content, 'content');\n    mark(state.first.parentElement,'stat-row');\n    mark(state.first,'first'); mark(state.second,'second');\n    let headlineWrap=state.headline;\n    while(headlineWrap.parentElement!==state.content) headlineWrap=headlineWrap.parentElement;\n    mark(headlineWrap,'headline');\n    for(let n=state.content.parentElement;n&&n!==state.hero;n=n.parentElement) mark(n,'wrap');\n    [state.first,state.second].forEach(stat=>{\n      mark(stat.children[0],'number'); mark(stat.children[1],'caption');\n    });\n    if (getComputedStyle(state.hero).position === 'static') { state.hero.style.position = 'relative'; state.positionChanged = true; }\n    const canvas = state.canvas;\n    canvas.setAttribute(owned, 'canvas'); canvas.setAttribute('aria-hidden', 'true');\n    canvas.style.cssText = 'position:absolute;inset:0;width:100%;height:100%;display:block;pointer-events:none;z-index:0;';\n    state.hero.insertBefore(canvas, state.hero.firstChild);\n    const renderer = makeHalftoneRenderer(canvas, state);\n    state.renderer = renderer;\n    state.video.pause();\n    state.onPlay = () => state.video.pause();\n    state.video.addEventListener('play', state.onPlay);\n    function stop() { if (state.raf) cancelAnimationFrame(state.raf); state.raf = 0; state.lastTick = 0; }\n    function draw() {\n      if (!state.w || !state.h || state.stopped) return;\n      const start = performance.now();\n      renderer.draw(state.elapsed);\n      state.framePoints = 0;\n      const cost = performance.now() - start;\n      stats.frames++; stats.drawTimeLast = cost; stats.drawTimeMax = Math.max(stats.drawTimeMax, cost); stats.totalDrawTime += cost;\n    }\n    function tick(now) {\n      state.raf = 0;\n      if (state.stopped || !state.inView || document.hidden || mq.matches) { state.lastTick = 0; return; }\n      if (state.lastTick) state.elapsed += Math.min(0.1, (now - state.lastTick) / 1000);\n      state.lastTick = now;\n      if (now - state.lastDraw >= 1000 / CONFIG.maxFPS - 0.5) { state.lastDraw = now; draw(); }\n      state.raf = requestAnimationFrame(tick);\n    }\n    function sync() {\n      if (state.stopped) return;\n      if (!state.inView || document.hidden || mq.matches) { stop(); if (mq.matches) draw(); }\n      else if (!state.raf) { state.lastDraw = 0; state.raf = requestAnimationFrame(tick); }\n    }\n    function resize() {\n      if (state.stopped) return;\n      const rect = state.hero.getBoundingClientRect();\n      const w = Math.max(1, Math.round(rect.width)), h = Math.max(1, Math.round(rect.height));\n      const dpr = Math.min(CONFIG.maxDPR, window.devicePixelRatio || 1);\n      if (w === state.w && h === state.h && dpr === state.dpr) return;\n      state.w = w; state.h = h; state.dpr = dpr;\n      canvas.width = Math.round(w * dpr); canvas.height = Math.round(h * dpr);\n      renderer.resize(w, h, dpr);\n      draw(); sync();\n    }\n    state.io = new IntersectionObserver(entries => { state.inView = entries[0].isIntersecting && entries[0].intersectionRatio > .01; sync(); }, { threshold: [0,.01] });\n    state.io.observe(state.hero);\n    state.ro = new ResizeObserver(resize); state.ro.observe(state.hero);\n    state.sync = sync; state.resize = resize;\n    state.onPointer = event => { const r=state.hero.getBoundingClientRect(); renderer.pointer((event.clientX-r.left)/r.width,(event.clientY-r.top)/r.height); };\n    state.onLeave = () => renderer.pointer(.5,.5);\n    state.hero.addEventListener('pointermove',state.onPointer,{passive:true}); state.hero.addEventListener('pointerleave',state.onLeave,{passive:true});\n    state.dispose = function () {\n      state.stopped = true; stop(); state.io.disconnect(); state.ro.disconnect();\n      state.hero.removeEventListener('pointermove',state.onPointer); state.hero.removeEventListener('pointerleave',state.onLeave);\n      state.video.removeEventListener('play', state.onPlay); renderer.dispose(); canvas.remove();\n      for (const [el, name, before] of state.attributes) { if (before === null) el.removeAttribute(name); else el.setAttribute(name, before); }\n      if (state.positionChanged) state.hero.style.position = state.priorPosition;\n      if (state.wasPlaying && state.video.isConnected && !document.hidden) state.video.play().catch(() => {});\n    };\n    resize();\n    return state;\n  }\n  const style = document.createElement('style');\n  style.setAttribute(owned, 'style');\n  style.textContent = `\n    [data-brainable-vision-wave=\"section\"]{box-sizing:border-box!important;background:#000!important;isolation:isolate;\n      width:100%!important;max-width:100%!important;height:auto!important;min-height:100svh!important;\n      padding:clamp(40px,7svh,100px) clamp(24px,7vw,130px)!important;display:flex!important;align-items:center!important;overflow:clip!important;}\n    [data-brainable-vision-wave=\"original-video\"]{display:none!important;}\n    [data-brainable-vision-wave=\"wrap\"]{width:100%!important;height:auto!important;min-width:0!important;padding:0!important;display:block!important;}\n    [data-brainable-vision-wave=\"content\"]{position:relative!important;inset:auto!important;z-index:1;display:grid!important;\n      grid-template-columns:minmax(0,1fr) minmax(0,2fr) minmax(0,1fr)!important;align-items:center!important;gap:28px!important;\n      width:100%!important;max-width:1540px!important;height:auto!important;min-width:0!important;margin:0 auto!important;padding:0!important;}\n    [data-brainable-vision-wave=\"stat-row\"]{display:contents!important;}\n    [data-brainable-vision-wave=\"headline\"]{grid-column:2;grid-row:1;position:relative!important;inset:auto!important;\n      transform:none!important;width:auto!important;max-width:100%!important;height:auto!important;min-width:0!important;\n      text-align:center!important;font-size:clamp(18px,1.8vw,28px)!important;line-height:1.6!important;letter-spacing:.02em!important;}\n    [data-brainable-vision-wave=\"headline\"] p,[data-brainable-vision-wave=\"headline\"] span{font-size:inherit!important;line-height:inherit!important;white-space:normal!important;word-break:keep-all!important;overflow-wrap:break-word!important;}\n    [data-brainable-vision-wave=\"first\"],[data-brainable-vision-wave=\"second\"]{grid-row:1;position:relative!important;inset:auto!important;\n      transform:none!important;width:100%!important;max-width:100%!important;min-width:0!important;height:auto!important;\n      display:flex!important;flex-direction:column!important;align-items:center!important;align-self:start!important;gap:36px!important;padding:0!important;}\n    [data-brainable-vision-wave=\"first\"]{grid-column:1;}\n    [data-brainable-vision-wave=\"second\"]{grid-column:3;}\n    [data-brainable-vision-wave=\"number\"]{font-size:clamp(80px,8.5vw,144px)!important;line-height:1.08!important;\n      width:2.15ch!important;max-width:100%!important;height:2.16em!important;min-height:0!important;margin:0!important;\n      position:relative!important;inset:auto!important;text-align:center!important;display:block!important;white-space:normal!important;overflow-wrap:anywhere!important;letter-spacing:0!important;}\n    [data-brainable-vision-wave=\"number\"] p,[data-brainable-vision-wave=\"number\"] span{font-size:inherit!important;line-height:inherit!important;letter-spacing:0!important;}\n    [data-brainable-vision-wave=\"caption\"]{position:relative!important;inset:auto!important;width:100%!important;max-width:100%!important;\n      height:auto!important;min-height:0!important;display:block!important;text-align:center!important;font-size:clamp(13px,1.25vw,20px)!important;line-height:1.65!important;}\n    [data-brainable-vision-wave=\"caption\"] p,[data-brainable-vision-wave=\"caption\"] span{font-size:inherit!important;line-height:inherit!important;\n      margin:0!important;white-space:normal!important;word-break:keep-all!important;overflow-wrap:break-word!important;letter-spacing:.025em!important;}\n    @media(max-width:900px){\n      [data-brainable-vision-wave=\"content\"]{grid-template-columns:repeat(2,minmax(0,1fr))!important;gap:36px 24px!important;}\n      [data-brainable-vision-wave=\"headline\"]{grid-column:1/-1;grid-row:1;font-size:clamp(18px,3vw,24px)!important;}\n      [data-brainable-vision-wave=\"first\"],[data-brainable-vision-wave=\"second\"]{grid-row:2;gap:22px!important;}\n      [data-brainable-vision-wave=\"second\"]{grid-column:2;}\n      [data-brainable-vision-wave=\"number\"]{font-size:clamp(64px,11vw,104px)!important;}\n    }\n    @media(max-height:500px) and (min-width:600px){\n      [data-brainable-vision-wave=\"section\"]{padding:24px 40px!important;}\n      [data-brainable-vision-wave=\"content\"]{grid-template-columns:minmax(0,1fr) minmax(0,2fr) minmax(0,1fr)!important;gap:24px!important;}\n      [data-brainable-vision-wave=\"headline\"]{grid-column:2;grid-row:1;font-size:18px!important;}\n      [data-brainable-vision-wave=\"first\"],[data-brainable-vision-wave=\"second\"]{grid-row:1;gap:18px!important;}\n      [data-brainable-vision-wave=\"second\"]{grid-column:3;}\n      [data-brainable-vision-wave=\"number\"]{font-size:60px!important;}\n    }\n  `;\n  document.head.appendChild(style);\n  function rescan() {\n    pending = false;\n    if (dead) return;\n    try {\n      const next = match();\n      if (current && next && current.hero === next.hero && current.video === next.video && current.content === next.content) { current.resize(); return; }\n      if (current) { current.dispose(); current = null; }\n      if (next) current = create(next);\n    } catch (error) { stats.error = String(error); }\n  }\n  function schedule() { if (!pending && !dead) { pending = true; requestAnimationFrame(rescan); } }\n  const mo = new MutationObserver(records => {\n    const relevant = records.some(record => [...record.addedNodes, ...record.removedNodes].some(node => {\n      if (node.nodeType !== 1) return false;\n      if (node.hasAttribute(owned) || node.closest('[' + owned + '=\"canvas\"]')) return false;\n      // Ignore counter overlays, but retain native breakpoint tree replacements.\n      const attrs = [...node.attributes].map(a => a.name).join(' ');\n      return !/brainable.*(count|overlay)/.test(attrs);\n    }));\n    if (relevant) schedule();\n  });\n  mo.observe(document.documentElement, { childList: true, subtree: true });\n  const visibility = () => current && current.sync();\n  document.addEventListener('visibilitychange', visibility);\n  mq.addEventListener('change', visibility);\n  window.addEventListener('resize', schedule); window.addEventListener('pageshow', schedule); window.addEventListener('popstate', schedule);\n  window.__brainableVisionWave = {\n    inspect: () => ({ active: !!current, state: !current ? 'unmatched' : mq.matches ? 'reduced-motion' : document.hidden ? 'hidden' : current.inView ? 'running' : 'offscreen',\n      config: CONFIG, renderer: current ? current.renderer.kind() : null, color: CONFIG.palette[0], palette: CONFIG.palette, background: CONFIG.backgroundColor, frames: stats.frames,\n      width: current ? current.w : 0, height: current ? current.h : 0, dpr: current ? current.dpr : 0,\n      sampledPoints: current ? current.points.length : 0, paintedPoints: current ? current.framePoints : 0,\n      elapsed: current ? current.elapsed : 0, renderCost: { lastMs: stats.drawTimeLast, maxMs: stats.drawTimeMax, meanMs: stats.frames ? stats.totalDrawTime / stats.frames : 0 }, error: stats.error }),\n    refresh: schedule,\n    destroy: () => { if (dead) return; dead = true; mo.disconnect(); if (current) current.dispose(); current = null; style.remove();\n      document.removeEventListener('visibilitychange', visibility); mq.removeEventListener('change', visibility);\n      window.removeEventListener('resize', schedule); window.removeEventListener('pageshow', schedule); window.removeEventListener('popstate', schedule);\n      delete window.__brainableVisionWave; delete window.__brainableBlueHalftone; }\n  };\n  window.__brainableBlueHalftone = window.__brainableVisionWave;\n  rescan();\n})();\n\n\n/* BRAINABLE production global: innovation-flux */\n/* Flux Vortex author license:\nMIT License\n\nCopyright (c) 2026 Meng To\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\nThree.js runtime license:\nThe MIT License\n\nCopyright © 2010-2023 three.js authors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n*/\n(()=>{/**\n * @license\n * Copyright 2010-2023 Three.js Authors\n * SPDX-License-Identifier: MIT\n */var xl=0,_a=1,vl=2;var Xo=1,yl=2,tn=3,gn=0,we=1,nn=2;var Ye=0,ni=1,_n=2,xa=3,va=4,Ml=5,Cn=100,Sl=101,bl=102,ya=103,Ma=104,El=200,wl=201,Tl=202,Al=203,Sr=204,br=205,Cl=206,Rl=207,Pl=208,Ll=209,Il=210,Ul=211,Dl=212,Nl=213,Fl=214,Ol=0,Bl=1,zl=2,ls=3,Vl=4,kl=5,Hl=6,Gl=7,qo=0,Wl=1,Xl=2,pn=0,ql=1,Yl=2,Zl=3,sa=4,Jl=5,$l=6;var Yo=300,ri=301,ai=302,Er=303,wr=304,Is=306,Tr=1e3,ze=1001,Ar=1002,xe=1003,Sa=1004;var Ws=1005;var Ue=1006,Kl=1007;var Ei=1008;var mn=1009,Ql=1010,jl=1011,ra=1012,Zo=1013,un=1014,dn=1015,ke=1016,Jo=1017,$o=1018,Pn=1020,tc=1021,Ve=1023,ec=1024,nc=1025,Ln=1026,oi=1027,ic=1028,Ko=1029,sc=1030,Qo=1031,jo=1033,Xs=33776,qs=33777,Ys=33778,Zs=33779,ba=35840,Ea=35841,wa=35842,Ta=35843,tl=36196,Aa=37492,Ca=37496,Ra=37808,Pa=37809,La=37810,Ia=37811,Ua=37812,Da=37813,Na=37814,Fa=37815,Oa=37816,Ba=37817,za=37818,Va=37819,ka=37820,Ha=37821,Js=36492,Ga=36494,Wa=36495,rc=36283,Xa=36284,qa=36285,Ya=36286;var cs=2300,hs=2301,$s=2302,Za=2400,Ja=2401,$a=2402;var el=3e3,In=3001,ac=3200,oc=3201,lc=0,cc=1,De=\"\",ce=\"srgb\",rn=\"srgb-linear\",aa=\"display-p3\",Us=\"display-p3-linear\",us=\"linear\",Jt=\"srgb\",ds=\"rec709\",fs=\"p3\";var On=7680;var Ka=519,hc=512,uc=513,dc=514,nl=515,fc=516,pc=517,mc=518,gc=519,Qa=35044;var ja=\"300 es\",Cr=1035,sn=2e3,ps=2001,xn=class{addEventListener(t,e){this._listeners===void 0&&(this._listeners={});let n=this._listeners;n[t]===void 0&&(n[t]=[]),n[t].indexOf(e)===-1&&n[t].push(e)}hasEventListener(t,e){if(this._listeners===void 0)return!1;let n=this._listeners;return n[t]!==void 0&&n[t].indexOf(e)!==-1}removeEventListener(t,e){if(this._listeners===void 0)return;let s=this._listeners[t];if(s!==void 0){let r=s.indexOf(e);r!==-1&&s.splice(r,1)}}dispatchEvent(t){if(this._listeners===void 0)return;let n=this._listeners[t.type];if(n!==void 0){t.target=this;let s=n.slice(0);for(let r=0,o=s.length;r<o;r++)s[r].call(this,t);t.target=null}}},fe=[\"00\",\"01\",\"02\",\"03\",\"04\",\"05\",\"06\",\"07\",\"08\",\"09\",\"0a\",\"0b\",\"0c\",\"0d\",\"0e\",\"0f\",\"10\",\"11\",\"12\",\"13\",\"14\",\"15\",\"16\",\"17\",\"18\",\"19\",\"1a\",\"1b\",\"1c\",\"1d\",\"1e\",\"1f\",\"20\",\"21\",\"22\",\"23\",\"24\",\"25\",\"26\",\"27\",\"28\",\"29\",\"2a\",\"2b\",\"2c\",\"2d\",\"2e\",\"2f\",\"30\",\"31\",\"32\",\"33\",\"34\",\"35\",\"36\",\"37\",\"38\",\"39\",\"3a\",\"3b\",\"3c\",\"3d\",\"3e\",\"3f\",\"40\",\"41\",\"42\",\"43\",\"44\",\"45\",\"46\",\"47\",\"48\",\"49\",\"4a\",\"4b\",\"4c\",\"4d\",\"4e\",\"4f\",\"50\",\"51\",\"52\",\"53\",\"54\",\"55\",\"56\",\"57\",\"58\",\"59\",\"5a\",\"5b\",\"5c\",\"5d\",\"5e\",\"5f\",\"60\",\"61\",\"62\",\"63\",\"64\",\"65\",\"66\",\"67\",\"68\",\"69\",\"6a\",\"6b\",\"6c\",\"6d\",\"6e\",\"6f\",\"70\",\"71\",\"72\",\"73\",\"74\",\"75\",\"76\",\"77\",\"78\",\"79\",\"7a\",\"7b\",\"7c\",\"7d\",\"7e\",\"7f\",\"80\",\"81\",\"82\",\"83\",\"84\",\"85\",\"86\",\"87\",\"88\",\"89\",\"8a\",\"8b\",\"8c\",\"8d\",\"8e\",\"8f\",\"90\",\"91\",\"92\",\"93\",\"94\",\"95\",\"96\",\"97\",\"98\",\"99\",\"9a\",\"9b\",\"9c\",\"9d\",\"9e\",\"9f\",\"a0\",\"a1\",\"a2\",\"a3\",\"a4\",\"a5\",\"a6\",\"a7\",\"a8\",\"a9\",\"aa\",\"ab\",\"ac\",\"ad\",\"ae\",\"af\",\"b0\",\"b1\",\"b2\",\"b3\",\"b4\",\"b5\",\"b6\",\"b7\",\"b8\",\"b9\",\"ba\",\"bb\",\"bc\",\"bd\",\"be\",\"bf\",\"c0\",\"c1\",\"c2\",\"c3\",\"c4\",\"c5\",\"c6\",\"c7\",\"c8\",\"c9\",\"ca\",\"cb\",\"cc\",\"cd\",\"ce\",\"cf\",\"d0\",\"d1\",\"d2\",\"d3\",\"d4\",\"d5\",\"d6\",\"d7\",\"d8\",\"d9\",\"da\",\"db\",\"dc\",\"dd\",\"de\",\"df\",\"e0\",\"e1\",\"e2\",\"e3\",\"e4\",\"e5\",\"e6\",\"e7\",\"e8\",\"e9\",\"ea\",\"eb\",\"ec\",\"ed\",\"ee\",\"ef\",\"f0\",\"f1\",\"f2\",\"f3\",\"f4\",\"f5\",\"f6\",\"f7\",\"f8\",\"f9\",\"fa\",\"fb\",\"fc\",\"fd\",\"fe\",\"ff\"];var Ks=Math.PI/180,Rr=180/Math.PI;function Ii(){let i=Math.random()*4294967295|0,t=Math.random()*4294967295|0,e=Math.random()*4294967295|0,n=Math.random()*4294967295|0;return(fe[i&255]+fe[i>>8&255]+fe[i>>16&255]+fe[i>>24&255]+\"-\"+fe[t&255]+fe[t>>8&255]+\"-\"+fe[t>>16&15|64]+fe[t>>24&255]+\"-\"+fe[e&63|128]+fe[e>>8&255]+\"-\"+fe[e>>16&255]+fe[e>>24&255]+fe[n&255]+fe[n>>8&255]+fe[n>>16&255]+fe[n>>24&255]).toLowerCase()}function Ee(i,t,e){return Math.max(t,Math.min(e,i))}function _c(i,t){return(i%t+t)%t}function Qs(i,t,e){return(1-e)*i+e*t}function to(i){return(i&i-1)===0&&i!==0}function Pr(i){return Math.pow(2,Math.floor(Math.log(i)/Math.LN2))}function _i(i,t){switch(t.constructor){case Float32Array:return i;case Uint32Array:return i/4294967295;case Uint16Array:return i/65535;case Uint8Array:return i/255;case Int32Array:return Math.max(i/2147483647,-1);case Int16Array:return Math.max(i/32767,-1);case Int8Array:return Math.max(i/127,-1);default:throw new Error(\"Invalid component type.\")}}function be(i,t){switch(t.constructor){case Float32Array:return i;case Uint32Array:return Math.round(i*4294967295);case Uint16Array:return Math.round(i*65535);case Uint8Array:return Math.round(i*255);case Int32Array:return Math.round(i*2147483647);case Int16Array:return Math.round(i*32767);case Int8Array:return Math.round(i*127);default:throw new Error(\"Invalid component type.\")}}var Lt=class i{constructor(t=0,e=0){i.prototype.isVector2=!0,this.x=t,this.y=e}get width(){return this.x}set width(t){this.x=t}get height(){return this.y}set height(t){this.y=t}set(t,e){return this.x=t,this.y=e,this}setScalar(t){return this.x=t,this.y=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;default:throw new Error(\"index is out of range: \"+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;default:throw new Error(\"index is out of range: \"+t)}}clone(){return new this.constructor(this.x,this.y)}copy(t){return this.x=t.x,this.y=t.y,this}add(t){return this.x+=t.x,this.y+=t.y,this}addScalar(t){return this.x+=t,this.y+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this}subScalar(t){return this.x-=t,this.y-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this}multiply(t){return this.x*=t.x,this.y*=t.y,this}multiplyScalar(t){return this.x*=t,this.y*=t,this}divide(t){return this.x/=t.x,this.y/=t.y,this}divideScalar(t){return this.multiplyScalar(1/t)}applyMatrix3(t){let e=this.x,n=this.y,s=t.elements;return this.x=s[0]*e+s[3]*n+s[6],this.y=s[1]*e+s[4]*n+s[7],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this}clamp(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this}clampScalar(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this}clampLength(t,e){let n=this.length();return this.divideScalar(n||1).multiplyScalar(Math.max(t,Math.min(e,n)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(t){let e=Math.sqrt(this.lengthSq()*t.lengthSq());if(e===0)return Math.PI/2;let n=this.dot(t)/e;return Math.acos(Ee(n,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){let e=this.x-t.x,n=this.y-t.y;return e*e+n*n}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this}lerpVectors(t,e,n){return this.x=t.x+(e.x-t.x)*n,this.y=t.y+(e.y-t.y)*n,this}equals(t){return t.x===this.x&&t.y===this.y}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this}rotateAround(t,e){let n=Math.cos(e),s=Math.sin(e),r=this.x-t.x,o=this.y-t.y;return this.x=r*n-o*s+t.x,this.y=r*s+o*n+t.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}},zt=class i{constructor(t,e,n,s,r,o,a,l,c){i.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1],t!==void 0&&this.set(t,e,n,s,r,o,a,l,c)}set(t,e,n,s,r,o,a,l,c){let h=this.elements;return h[0]=t,h[1]=s,h[2]=a,h[3]=e,h[4]=r,h[5]=l,h[6]=n,h[7]=o,h[8]=c,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(t){let e=this.elements,n=t.elements;return e[0]=n[0],e[1]=n[1],e[2]=n[2],e[3]=n[3],e[4]=n[4],e[5]=n[5],e[6]=n[6],e[7]=n[7],e[8]=n[8],this}extractBasis(t,e,n){return t.setFromMatrix3Column(this,0),e.setFromMatrix3Column(this,1),n.setFromMatrix3Column(this,2),this}setFromMatrix4(t){let e=t.elements;return this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){let n=t.elements,s=e.elements,r=this.elements,o=n[0],a=n[3],l=n[6],c=n[1],h=n[4],d=n[7],f=n[2],m=n[5],g=n[8],x=s[0],p=s[3],u=s[6],w=s[1],v=s[4],P=s[7],U=s[2],R=s[5],C=s[8];return r[0]=o*x+a*w+l*U,r[3]=o*p+a*v+l*R,r[6]=o*u+a*P+l*C,r[1]=c*x+h*w+d*U,r[4]=c*p+h*v+d*R,r[7]=c*u+h*P+d*C,r[2]=f*x+m*w+g*U,r[5]=f*p+m*v+g*R,r[8]=f*u+m*P+g*C,this}multiplyScalar(t){let e=this.elements;return e[0]*=t,e[3]*=t,e[6]*=t,e[1]*=t,e[4]*=t,e[7]*=t,e[2]*=t,e[5]*=t,e[8]*=t,this}determinant(){let t=this.elements,e=t[0],n=t[1],s=t[2],r=t[3],o=t[4],a=t[5],l=t[6],c=t[7],h=t[8];return e*o*h-e*a*c-n*r*h+n*a*l+s*r*c-s*o*l}invert(){let t=this.elements,e=t[0],n=t[1],s=t[2],r=t[3],o=t[4],a=t[5],l=t[6],c=t[7],h=t[8],d=h*o-a*c,f=a*l-h*r,m=c*r-o*l,g=e*d+n*f+s*m;if(g===0)return this.set(0,0,0,0,0,0,0,0,0);let x=1/g;return t[0]=d*x,t[1]=(s*c-h*n)*x,t[2]=(a*n-s*o)*x,t[3]=f*x,t[4]=(h*e-s*l)*x,t[5]=(s*r-a*e)*x,t[6]=m*x,t[7]=(n*l-c*e)*x,t[8]=(o*e-n*r)*x,this}transpose(){let t,e=this.elements;return t=e[1],e[1]=e[3],e[3]=t,t=e[2],e[2]=e[6],e[6]=t,t=e[5],e[5]=e[7],e[7]=t,this}getNormalMatrix(t){return this.setFromMatrix4(t).invert().transpose()}transposeIntoArray(t){let e=this.elements;return t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8],this}setUvTransform(t,e,n,s,r,o,a){let l=Math.cos(r),c=Math.sin(r);return this.set(n*l,n*c,-n*(l*o+c*a)+o+t,-s*c,s*l,-s*(-c*o+l*a)+a+e,0,0,1),this}scale(t,e){return this.premultiply(js.makeScale(t,e)),this}rotate(t){return this.premultiply(js.makeRotation(-t)),this}translate(t,e){return this.premultiply(js.makeTranslation(t,e)),this}makeTranslation(t,e){return t.isVector2?this.set(1,0,t.x,0,1,t.y,0,0,1):this.set(1,0,t,0,1,e,0,0,1),this}makeRotation(t){let e=Math.cos(t),n=Math.sin(t);return this.set(e,-n,0,n,e,0,0,0,1),this}makeScale(t,e){return this.set(t,0,0,0,e,0,0,0,1),this}equals(t){let e=this.elements,n=t.elements;for(let s=0;s<9;s++)if(e[s]!==n[s])return!1;return!0}fromArray(t,e=0){for(let n=0;n<9;n++)this.elements[n]=t[n+e];return this}toArray(t=[],e=0){let n=this.elements;return t[e]=n[0],t[e+1]=n[1],t[e+2]=n[2],t[e+3]=n[3],t[e+4]=n[4],t[e+5]=n[5],t[e+6]=n[6],t[e+7]=n[7],t[e+8]=n[8],t}clone(){return new this.constructor().fromArray(this.elements)}},js=new zt;function il(i){for(let t=i.length-1;t>=0;--t)if(i[t]>=65535)return!0;return!1}function ms(i){return document.createElementNS(\"http://www.w3.org/1999/xhtml\",i)}function xc(){let i=ms(\"canvas\");return i.style.display=\"block\",i}var eo={};function Si(i){i in eo||(eo[i]=!0,console.warn(i))}var no=new zt().set(.8224621,.177538,0,.0331941,.9668058,0,.0170827,.0723974,.9105199),io=new zt().set(1.2249401,-.2249404,0,-.0420569,1.0420571,0,-.0196376,-.0786361,1.0982735),Fi={[rn]:{transfer:us,primaries:ds,toReference:i=>i,fromReference:i=>i},[ce]:{transfer:Jt,primaries:ds,toReference:i=>i.convertSRGBToLinear(),fromReference:i=>i.convertLinearToSRGB()},[Us]:{transfer:us,primaries:fs,toReference:i=>i.applyMatrix3(io),fromReference:i=>i.applyMatrix3(no)},[aa]:{transfer:Jt,primaries:fs,toReference:i=>i.convertSRGBToLinear().applyMatrix3(io),fromReference:i=>i.applyMatrix3(no).convertLinearToSRGB()}},vc=new Set([rn,Us]),Wt={enabled:!0,_workingColorSpace:rn,get workingColorSpace(){return this._workingColorSpace},set workingColorSpace(i){if(!vc.has(i))throw new Error(`Unsupported working color space, \"${i}\".`);this._workingColorSpace=i},convert:function(i,t,e){if(this.enabled===!1||t===e||!t||!e)return i;let n=Fi[t].toReference,s=Fi[e].fromReference;return s(n(i))},fromWorkingColorSpace:function(i,t){return this.convert(i,this._workingColorSpace,t)},toWorkingColorSpace:function(i,t){return this.convert(i,t,this._workingColorSpace)},getPrimaries:function(i){return Fi[i].primaries},getTransfer:function(i){return i===De?us:Fi[i].transfer}};function ii(i){return i<.04045?i*.0773993808:Math.pow(i*.9478672986+.0521327014,2.4)}function tr(i){return i<.0031308?i*12.92:1.055*Math.pow(i,.41666)-.055}var Bn,gs=class{static getDataURL(t){if(/^data:/i.test(t.src)||typeof HTMLCanvasElement>\"u\")return t.src;let e;if(t instanceof HTMLCanvasElement)e=t;else{Bn===void 0&&(Bn=ms(\"canvas\")),Bn.width=t.width,Bn.height=t.height;let n=Bn.getContext(\"2d\");t instanceof ImageData?n.putImageData(t,0,0):n.drawImage(t,0,0,t.width,t.height),e=Bn}return e.width>2048||e.height>2048?(console.warn(\"THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons\",t),e.toDataURL(\"image/jpeg\",.6)):e.toDataURL(\"image/png\")}static sRGBToLinear(t){if(typeof HTMLImageElement<\"u\"&&t instanceof HTMLImageElement||typeof HTMLCanvasElement<\"u\"&&t instanceof HTMLCanvasElement||typeof ImageBitmap<\"u\"&&t instanceof ImageBitmap){let e=ms(\"canvas\");e.width=t.width,e.height=t.height;let n=e.getContext(\"2d\");n.drawImage(t,0,0,t.width,t.height);let s=n.getImageData(0,0,t.width,t.height),r=s.data;for(let o=0;o<r.length;o++)r[o]=ii(r[o]/255)*255;return n.putImageData(s,0,0),e}else if(t.data){let e=t.data.slice(0);for(let n=0;n<e.length;n++)e instanceof Uint8Array||e instanceof Uint8ClampedArray?e[n]=Math.floor(ii(e[n]/255)*255):e[n]=ii(e[n]);return{data:e,width:t.width,height:t.height}}else return console.warn(\"THREE.ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied.\"),t}},yc=0,_s=class{constructor(t=null){this.isSource=!0,Object.defineProperty(this,\"id\",{value:yc++}),this.uuid=Ii(),this.data=t,this.version=0}set needsUpdate(t){t===!0&&this.version++}toJSON(t){let e=t===void 0||typeof t==\"string\";if(!e&&t.images[this.uuid]!==void 0)return t.images[this.uuid];let n={uuid:this.uuid,url:\"\"},s=this.data;if(s!==null){let r;if(Array.isArray(s)){r=[];for(let o=0,a=s.length;o<a;o++)s[o].isDataTexture?r.push(er(s[o].image)):r.push(er(s[o]))}else r=er(s);n.url=r}return e||(t.images[this.uuid]=n),n}};function er(i){return typeof HTMLImageElement<\"u\"&&i instanceof HTMLImageElement||typeof HTMLCanvasElement<\"u\"&&i instanceof HTMLCanvasElement||typeof ImageBitmap<\"u\"&&i instanceof ImageBitmap?gs.getDataURL(i):i.data?{data:Array.from(i.data),width:i.width,height:i.height,type:i.data.constructor.name}:(console.warn(\"THREE.Texture: Unable to serialize Texture.\"),{})}var Mc=0,He=class i extends xn{constructor(t=i.DEFAULT_IMAGE,e=i.DEFAULT_MAPPING,n=ze,s=ze,r=Ue,o=Ei,a=Ve,l=mn,c=i.DEFAULT_ANISOTROPY,h=De){super(),this.isTexture=!0,Object.defineProperty(this,\"id\",{value:Mc++}),this.uuid=Ii(),this.name=\"\",this.source=new _s(t),this.mipmaps=[],this.mapping=e,this.channel=0,this.wrapS=n,this.wrapT=s,this.magFilter=r,this.minFilter=o,this.anisotropy=c,this.format=a,this.internalFormat=null,this.type=l,this.offset=new Lt(0,0),this.repeat=new Lt(1,1),this.center=new Lt(0,0),this.rotation=0,this.matrixAutoUpdate=!0,this.matrix=new zt,this.generateMipmaps=!0,this.premultiplyAlpha=!1,this.flipY=!0,this.unpackAlignment=4,typeof h==\"string\"?this.colorSpace=h:(Si(\"THREE.Texture: Property .encoding has been replaced by .colorSpace.\"),this.colorSpace=h===In?ce:De),this.userData={},this.version=0,this.onUpdate=null,this.isRenderTargetTexture=!1,this.needsPMREMUpdate=!1}get image(){return this.source.data}set image(t=null){this.source.data=t}updateMatrix(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)}clone(){return new this.constructor().copy(this)}copy(t){return this.name=t.name,this.source=t.source,this.mipmaps=t.mipmaps.slice(0),this.mapping=t.mapping,this.channel=t.channel,this.wrapS=t.wrapS,this.wrapT=t.wrapT,this.magFilter=t.magFilter,this.minFilter=t.minFilter,this.anisotropy=t.anisotropy,this.format=t.format,this.internalFormat=t.internalFormat,this.type=t.type,this.offset.copy(t.offset),this.repeat.copy(t.repeat),this.center.copy(t.center),this.rotation=t.rotation,this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrix.copy(t.matrix),this.generateMipmaps=t.generateMipmaps,this.premultiplyAlpha=t.premultiplyAlpha,this.flipY=t.flipY,this.unpackAlignment=t.unpackAlignment,this.colorSpace=t.colorSpace,this.userData=JSON.parse(JSON.stringify(t.userData)),this.needsUpdate=!0,this}toJSON(t){let e=t===void 0||typeof t==\"string\";if(!e&&t.textures[this.uuid]!==void 0)return t.textures[this.uuid];let n={metadata:{version:4.6,type:\"Texture\",generator:\"Texture.toJSON\"},uuid:this.uuid,name:this.name,image:this.source.toJSON(t).uuid,mapping:this.mapping,channel:this.channel,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,internalFormat:this.internalFormat,type:this.type,colorSpace:this.colorSpace,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,generateMipmaps:this.generateMipmaps,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};return Object.keys(this.userData).length>0&&(n.userData=this.userData),e||(t.textures[this.uuid]=n),n}dispose(){this.dispatchEvent({type:\"dispose\"})}transformUv(t){if(this.mapping!==Yo)return t;if(t.applyMatrix3(this.matrix),t.x<0||t.x>1)switch(this.wrapS){case Tr:t.x=t.x-Math.floor(t.x);break;case ze:t.x=t.x<0?0:1;break;case Ar:Math.abs(Math.floor(t.x)%2)===1?t.x=Math.ceil(t.x)-t.x:t.x=t.x-Math.floor(t.x);break}if(t.y<0||t.y>1)switch(this.wrapT){case Tr:t.y=t.y-Math.floor(t.y);break;case ze:t.y=t.y<0?0:1;break;case Ar:Math.abs(Math.floor(t.y)%2)===1?t.y=Math.ceil(t.y)-t.y:t.y=t.y-Math.floor(t.y);break}return this.flipY&&(t.y=1-t.y),t}set needsUpdate(t){t===!0&&(this.version++,this.source.needsUpdate=!0)}get encoding(){return Si(\"THREE.Texture: Property .encoding has been replaced by .colorSpace.\"),this.colorSpace===ce?In:el}set encoding(t){Si(\"THREE.Texture: Property .encoding has been replaced by .colorSpace.\"),this.colorSpace=t===In?ce:De}};He.DEFAULT_IMAGE=null;He.DEFAULT_MAPPING=Yo;He.DEFAULT_ANISOTROPY=1;var he=class i{constructor(t=0,e=0,n=0,s=1){i.prototype.isVector4=!0,this.x=t,this.y=e,this.z=n,this.w=s}get width(){return this.z}set width(t){this.z=t}get height(){return this.w}set height(t){this.w=t}set(t,e,n,s){return this.x=t,this.y=e,this.z=n,this.w=s,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this.w=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setW(t){return this.w=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;case 3:this.w=e;break;default:throw new Error(\"index is out of range: \"+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error(\"index is out of range: \"+t)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=t.w!==void 0?t.w:1,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this.w+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this.w=t.w+e.w,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this.w+=t.w*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this.w-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this.w=t.w-e.w,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this.w*=t.w,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this}applyMatrix4(t){let e=this.x,n=this.y,s=this.z,r=this.w,o=t.elements;return this.x=o[0]*e+o[4]*n+o[8]*s+o[12]*r,this.y=o[1]*e+o[5]*n+o[9]*s+o[13]*r,this.z=o[2]*e+o[6]*n+o[10]*s+o[14]*r,this.w=o[3]*e+o[7]*n+o[11]*s+o[15]*r,this}divideScalar(t){return this.multiplyScalar(1/t)}setAxisAngleFromQuaternion(t){this.w=2*Math.acos(t.w);let e=Math.sqrt(1-t.w*t.w);return e<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=t.x/e,this.y=t.y/e,this.z=t.z/e),this}setAxisAngleFromRotationMatrix(t){let e,n,s,r,l=t.elements,c=l[0],h=l[4],d=l[8],f=l[1],m=l[5],g=l[9],x=l[2],p=l[6],u=l[10];if(Math.abs(h-f)<.01&&Math.abs(d-x)<.01&&Math.abs(g-p)<.01){if(Math.abs(h+f)<.1&&Math.abs(d+x)<.1&&Math.abs(g+p)<.1&&Math.abs(c+m+u-3)<.1)return this.set(1,0,0,0),this;e=Math.PI;let v=(c+1)/2,P=(m+1)/2,U=(u+1)/2,R=(h+f)/4,C=(d+x)/4,Y=(g+p)/4;return v>P&&v>U?v<.01?(n=0,s=.707106781,r=.707106781):(n=Math.sqrt(v),s=R/n,r=C/n):P>U?P<.01?(n=.707106781,s=0,r=.707106781):(s=Math.sqrt(P),n=R/s,r=Y/s):U<.01?(n=.707106781,s=.707106781,r=0):(r=Math.sqrt(U),n=C/r,s=Y/r),this.set(n,s,r,e),this}let w=Math.sqrt((p-g)*(p-g)+(d-x)*(d-x)+(f-h)*(f-h));return Math.abs(w)<.001&&(w=1),this.x=(p-g)/w,this.y=(d-x)/w,this.z=(f-h)/w,this.w=Math.acos((c+m+u-1)/2),this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this.w=Math.min(this.w,t.w),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this.w=Math.max(this.w,t.w),this}clamp(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this.z=Math.max(t.z,Math.min(e.z,this.z)),this.w=Math.max(t.w,Math.min(e.w,this.w)),this}clampScalar(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this.z=Math.max(t,Math.min(e,this.z)),this.w=Math.max(t,Math.min(e,this.w)),this}clampLength(t,e){let n=this.length();return this.divideScalar(n||1).multiplyScalar(Math.max(t,Math.min(e,n)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this.w=Math.trunc(this.w),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z+this.w*t.w}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this.w+=(t.w-this.w)*e,this}lerpVectors(t,e,n){return this.x=t.x+(e.x-t.x)*n,this.y=t.y+(e.y-t.y)*n,this.z=t.z+(e.z-t.z)*n,this.w=t.w+(e.w-t.w)*n,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z&&t.w===this.w}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this.w=t[e+3],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t[e+3]=this.w,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this.w=t.getW(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this.w=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z,yield this.w}},Lr=class extends xn{constructor(t=1,e=1,n={}){super(),this.isRenderTarget=!0,this.width=t,this.height=e,this.depth=1,this.scissor=new he(0,0,t,e),this.scissorTest=!1,this.viewport=new he(0,0,t,e);let s={width:t,height:e,depth:1};n.encoding!==void 0&&(Si(\"THREE.WebGLRenderTarget: option.encoding has been replaced by option.colorSpace.\"),n.colorSpace=n.encoding===In?ce:De),n=Object.assign({generateMipmaps:!1,internalFormat:null,minFilter:Ue,depthBuffer:!0,stencilBuffer:!1,depthTexture:null,samples:0},n),this.texture=new He(s,n.mapping,n.wrapS,n.wrapT,n.magFilter,n.minFilter,n.format,n.type,n.anisotropy,n.colorSpace),this.texture.isRenderTargetTexture=!0,this.texture.flipY=!1,this.texture.generateMipmaps=n.generateMipmaps,this.texture.internalFormat=n.internalFormat,this.depthBuffer=n.depthBuffer,this.stencilBuffer=n.stencilBuffer,this.depthTexture=n.depthTexture,this.samples=n.samples}setSize(t,e,n=1){(this.width!==t||this.height!==e||this.depth!==n)&&(this.width=t,this.height=e,this.depth=n,this.texture.image.width=t,this.texture.image.height=e,this.texture.image.depth=n,this.dispose()),this.viewport.set(0,0,t,e),this.scissor.set(0,0,t,e)}clone(){return new this.constructor().copy(this)}copy(t){this.width=t.width,this.height=t.height,this.depth=t.depth,this.scissor.copy(t.scissor),this.scissorTest=t.scissorTest,this.viewport.copy(t.viewport),this.texture=t.texture.clone(),this.texture.isRenderTargetTexture=!0;let e=Object.assign({},t.texture.image);return this.texture.source=new _s(e),this.depthBuffer=t.depthBuffer,this.stencilBuffer=t.stencilBuffer,t.depthTexture!==null&&(this.depthTexture=t.depthTexture.clone()),this.samples=t.samples,this}dispose(){this.dispatchEvent({type:\"dispose\"})}},Me=class extends Lr{constructor(t=1,e=1,n={}){super(t,e,n),this.isWebGLRenderTarget=!0}},xs=class extends He{constructor(t=null,e=1,n=1,s=1){super(null),this.isDataArrayTexture=!0,this.image={data:t,width:e,height:n,depth:s},this.magFilter=xe,this.minFilter=xe,this.wrapR=ze,this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1}};var Ir=class extends He{constructor(t=null,e=1,n=1,s=1){super(null),this.isData3DTexture=!0,this.image={data:t,width:e,height:n,depth:s},this.magFilter=xe,this.minFilter=xe,this.wrapR=ze,this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1}};var vn=class{constructor(t=0,e=0,n=0,s=1){this.isQuaternion=!0,this._x=t,this._y=e,this._z=n,this._w=s}static slerpFlat(t,e,n,s,r,o,a){let l=n[s+0],c=n[s+1],h=n[s+2],d=n[s+3],f=r[o+0],m=r[o+1],g=r[o+2],x=r[o+3];if(a===0){t[e+0]=l,t[e+1]=c,t[e+2]=h,t[e+3]=d;return}if(a===1){t[e+0]=f,t[e+1]=m,t[e+2]=g,t[e+3]=x;return}if(d!==x||l!==f||c!==m||h!==g){let p=1-a,u=l*f+c*m+h*g+d*x,w=u>=0?1:-1,v=1-u*u;if(v>Number.EPSILON){let U=Math.sqrt(v),R=Math.atan2(U,u*w);p=Math.sin(p*R)/U,a=Math.sin(a*R)/U}let P=a*w;if(l=l*p+f*P,c=c*p+m*P,h=h*p+g*P,d=d*p+x*P,p===1-a){let U=1/Math.sqrt(l*l+c*c+h*h+d*d);l*=U,c*=U,h*=U,d*=U}}t[e]=l,t[e+1]=c,t[e+2]=h,t[e+3]=d}static multiplyQuaternionsFlat(t,e,n,s,r,o){let a=n[s],l=n[s+1],c=n[s+2],h=n[s+3],d=r[o],f=r[o+1],m=r[o+2],g=r[o+3];return t[e]=a*g+h*d+l*m-c*f,t[e+1]=l*g+h*f+c*d-a*m,t[e+2]=c*g+h*m+a*f-l*d,t[e+3]=h*g-a*d-l*f-c*m,t}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get w(){return this._w}set w(t){this._w=t,this._onChangeCallback()}set(t,e,n,s){return this._x=t,this._y=e,this._z=n,this._w=s,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this._onChangeCallback(),this}setFromEuler(t,e=!0){let n=t._x,s=t._y,r=t._z,o=t._order,a=Math.cos,l=Math.sin,c=a(n/2),h=a(s/2),d=a(r/2),f=l(n/2),m=l(s/2),g=l(r/2);switch(o){case\"XYZ\":this._x=f*h*d+c*m*g,this._y=c*m*d-f*h*g,this._z=c*h*g+f*m*d,this._w=c*h*d-f*m*g;break;case\"YXZ\":this._x=f*h*d+c*m*g,this._y=c*m*d-f*h*g,this._z=c*h*g-f*m*d,this._w=c*h*d+f*m*g;break;case\"ZXY\":this._x=f*h*d-c*m*g,this._y=c*m*d+f*h*g,this._z=c*h*g+f*m*d,this._w=c*h*d-f*m*g;break;case\"ZYX\":this._x=f*h*d-c*m*g,this._y=c*m*d+f*h*g,this._z=c*h*g-f*m*d,this._w=c*h*d+f*m*g;break;case\"YZX\":this._x=f*h*d+c*m*g,this._y=c*m*d+f*h*g,this._z=c*h*g-f*m*d,this._w=c*h*d-f*m*g;break;case\"XZY\":this._x=f*h*d-c*m*g,this._y=c*m*d-f*h*g,this._z=c*h*g+f*m*d,this._w=c*h*d+f*m*g;break;default:console.warn(\"THREE.Quaternion: .setFromEuler() encountered an unknown order: \"+o)}return e===!0&&this._onChangeCallback(),this}setFromAxisAngle(t,e){let n=e/2,s=Math.sin(n);return this._x=t.x*s,this._y=t.y*s,this._z=t.z*s,this._w=Math.cos(n),this._onChangeCallback(),this}setFromRotationMatrix(t){let e=t.elements,n=e[0],s=e[4],r=e[8],o=e[1],a=e[5],l=e[9],c=e[2],h=e[6],d=e[10],f=n+a+d;if(f>0){let m=.5/Math.sqrt(f+1);this._w=.25/m,this._x=(h-l)*m,this._y=(r-c)*m,this._z=(o-s)*m}else if(n>a&&n>d){let m=2*Math.sqrt(1+n-a-d);this._w=(h-l)/m,this._x=.25*m,this._y=(s+o)/m,this._z=(r+c)/m}else if(a>d){let m=2*Math.sqrt(1+a-n-d);this._w=(r-c)/m,this._x=(s+o)/m,this._y=.25*m,this._z=(l+h)/m}else{let m=2*Math.sqrt(1+d-n-a);this._w=(o-s)/m,this._x=(r+c)/m,this._y=(l+h)/m,this._z=.25*m}return this._onChangeCallback(),this}setFromUnitVectors(t,e){let n=t.dot(e)+1;return n<Number.EPSILON?(n=0,Math.abs(t.x)>Math.abs(t.z)?(this._x=-t.y,this._y=t.x,this._z=0,this._w=n):(this._x=0,this._y=-t.z,this._z=t.y,this._w=n)):(this._x=t.y*e.z-t.z*e.y,this._y=t.z*e.x-t.x*e.z,this._z=t.x*e.y-t.y*e.x,this._w=n),this.normalize()}angleTo(t){return 2*Math.acos(Math.abs(Ee(this.dot(t),-1,1)))}rotateTowards(t,e){let n=this.angleTo(t);if(n===0)return this;let s=Math.min(1,e/n);return this.slerp(t,s),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let t=this.length();return t===0?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x=this._x*t,this._y=this._y*t,this._z=this._z*t,this._w=this._w*t),this._onChangeCallback(),this}multiply(t){return this.multiplyQuaternions(this,t)}premultiply(t){return this.multiplyQuaternions(t,this)}multiplyQuaternions(t,e){let n=t._x,s=t._y,r=t._z,o=t._w,a=e._x,l=e._y,c=e._z,h=e._w;return this._x=n*h+o*a+s*c-r*l,this._y=s*h+o*l+r*a-n*c,this._z=r*h+o*c+n*l-s*a,this._w=o*h-n*a-s*l-r*c,this._onChangeCallback(),this}slerp(t,e){if(e===0)return this;if(e===1)return this.copy(t);let n=this._x,s=this._y,r=this._z,o=this._w,a=o*t._w+n*t._x+s*t._y+r*t._z;if(a<0?(this._w=-t._w,this._x=-t._x,this._y=-t._y,this._z=-t._z,a=-a):this.copy(t),a>=1)return this._w=o,this._x=n,this._y=s,this._z=r,this;let l=1-a*a;if(l<=Number.EPSILON){let m=1-e;return this._w=m*o+e*this._w,this._x=m*n+e*this._x,this._y=m*s+e*this._y,this._z=m*r+e*this._z,this.normalize(),this}let c=Math.sqrt(l),h=Math.atan2(c,a),d=Math.sin((1-e)*h)/c,f=Math.sin(e*h)/c;return this._w=o*d+this._w*f,this._x=n*d+this._x*f,this._y=s*d+this._y*f,this._z=r*d+this._z*f,this._onChangeCallback(),this}slerpQuaternions(t,e,n){return this.copy(t).slerp(e,n)}random(){let t=Math.random(),e=Math.sqrt(1-t),n=Math.sqrt(t),s=2*Math.PI*Math.random(),r=2*Math.PI*Math.random();return this.set(e*Math.cos(s),n*Math.sin(r),n*Math.cos(r),e*Math.sin(s))}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._w===this._w}fromArray(t,e=0){return this._x=t[e],this._y=t[e+1],this._z=t[e+2],this._w=t[e+3],this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._w,t}fromBufferAttribute(t,e){return this._x=t.getX(e),this._y=t.getY(e),this._z=t.getZ(e),this._w=t.getW(e),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}},N=class i{constructor(t=0,e=0,n=0){i.prototype.isVector3=!0,this.x=t,this.y=e,this.z=n}set(t,e,n){return n===void 0&&(n=this.z),this.x=t,this.y=e,this.z=n,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error(\"index is out of range: \"+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error(\"index is out of range: \"+t)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}multiplyVectors(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this}applyEuler(t){return this.applyQuaternion(so.setFromEuler(t))}applyAxisAngle(t,e){return this.applyQuaternion(so.setFromAxisAngle(t,e))}applyMatrix3(t){let e=this.x,n=this.y,s=this.z,r=t.elements;return this.x=r[0]*e+r[3]*n+r[6]*s,this.y=r[1]*e+r[4]*n+r[7]*s,this.z=r[2]*e+r[5]*n+r[8]*s,this}applyNormalMatrix(t){return this.applyMatrix3(t).normalize()}applyMatrix4(t){let e=this.x,n=this.y,s=this.z,r=t.elements,o=1/(r[3]*e+r[7]*n+r[11]*s+r[15]);return this.x=(r[0]*e+r[4]*n+r[8]*s+r[12])*o,this.y=(r[1]*e+r[5]*n+r[9]*s+r[13])*o,this.z=(r[2]*e+r[6]*n+r[10]*s+r[14])*o,this}applyQuaternion(t){let e=this.x,n=this.y,s=this.z,r=t.x,o=t.y,a=t.z,l=t.w,c=2*(o*s-a*n),h=2*(a*e-r*s),d=2*(r*n-o*e);return this.x=e+l*c+o*d-a*h,this.y=n+l*h+a*c-r*d,this.z=s+l*d+r*h-o*c,this}project(t){return this.applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix)}unproject(t){return this.applyMatrix4(t.projectionMatrixInverse).applyMatrix4(t.matrixWorld)}transformDirection(t){let e=this.x,n=this.y,s=this.z,r=t.elements;return this.x=r[0]*e+r[4]*n+r[8]*s,this.y=r[1]*e+r[5]*n+r[9]*s,this.z=r[2]*e+r[6]*n+r[10]*s,this.normalize()}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this}divideScalar(t){return this.multiplyScalar(1/t)}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this}clamp(t,e){return this.x=Math.max(t.x,Math.min(e.x,this.x)),this.y=Math.max(t.y,Math.min(e.y,this.y)),this.z=Math.max(t.z,Math.min(e.z,this.z)),this}clampScalar(t,e){return this.x=Math.max(t,Math.min(e,this.x)),this.y=Math.max(t,Math.min(e,this.y)),this.z=Math.max(t,Math.min(e,this.z)),this}clampLength(t,e){let n=this.length();return this.divideScalar(n||1).multiplyScalar(Math.max(t,Math.min(e,n)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this}lerpVectors(t,e,n){return this.x=t.x+(e.x-t.x)*n,this.y=t.y+(e.y-t.y)*n,this.z=t.z+(e.z-t.z)*n,this}cross(t){return this.crossVectors(this,t)}crossVectors(t,e){let n=t.x,s=t.y,r=t.z,o=e.x,a=e.y,l=e.z;return this.x=s*l-r*a,this.y=r*o-n*l,this.z=n*a-s*o,this}projectOnVector(t){let e=t.lengthSq();if(e===0)return this.set(0,0,0);let n=t.dot(this)/e;return this.copy(t).multiplyScalar(n)}projectOnPlane(t){return nr.copy(this).projectOnVector(t),this.sub(nr)}reflect(t){return this.sub(nr.copy(t).multiplyScalar(2*this.dot(t)))}angleTo(t){let e=Math.sqrt(this.lengthSq()*t.lengthSq());if(e===0)return Math.PI/2;let n=this.dot(t)/e;return Math.acos(Ee(n,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){let e=this.x-t.x,n=this.y-t.y,s=this.z-t.z;return e*e+n*n+s*s}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)}setFromSpherical(t){return this.setFromSphericalCoords(t.radius,t.phi,t.theta)}setFromSphericalCoords(t,e,n){let s=Math.sin(e)*t;return this.x=s*Math.sin(n),this.y=Math.cos(e)*t,this.z=s*Math.cos(n),this}setFromCylindrical(t){return this.setFromCylindricalCoords(t.radius,t.theta,t.y)}setFromCylindricalCoords(t,e,n){return this.x=t*Math.sin(e),this.y=n,this.z=t*Math.cos(e),this}setFromMatrixPosition(t){let e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this}setFromMatrixScale(t){let e=this.setFromMatrixColumn(t,0).length(),n=this.setFromMatrixColumn(t,1).length(),s=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=n,this.z=s,this}setFromMatrixColumn(t,e){return this.fromArray(t.elements,e*4)}setFromMatrix3Column(t,e){return this.fromArray(t.elements,e*3)}setFromEuler(t){return this.x=t._x,this.y=t._y,this.z=t._z,this}setFromColor(t){return this.x=t.r,this.y=t.g,this.z=t.b,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){let t=(Math.random()-.5)*2,e=Math.random()*Math.PI*2,n=Math.sqrt(1-t**2);return this.x=n*Math.cos(e),this.y=n*Math.sin(e),this.z=t,this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}},nr=new N,so=new vn,Un=class{constructor(t=new N(1/0,1/0,1/0),e=new N(-1/0,-1/0,-1/0)){this.isBox3=!0,this.min=t,this.max=e}set(t,e){return this.min.copy(t),this.max.copy(e),this}setFromArray(t){this.makeEmpty();for(let e=0,n=t.length;e<n;e+=3)this.expandByPoint(Fe.fromArray(t,e));return this}setFromBufferAttribute(t){this.makeEmpty();for(let e=0,n=t.count;e<n;e++)this.expandByPoint(Fe.fromBufferAttribute(t,e));return this}setFromPoints(t){this.makeEmpty();for(let e=0,n=t.length;e<n;e++)this.expandByPoint(t[e]);return this}setFromCenterAndSize(t,e){let n=Fe.copy(e).multiplyScalar(.5);return this.min.copy(t).sub(n),this.max.copy(t).add(n),this}setFromObject(t,e=!1){return this.makeEmpty(),this.expandByObject(t,e)}clone(){return new this.constructor().copy(this)}copy(t){return this.min.copy(t.min),this.max.copy(t.max),this}makeEmpty(){return this.min.x=this.min.y=this.min.z=1/0,this.max.x=this.max.y=this.max.z=-1/0,this}isEmpty(){return this.max.x<this.min.x||this.max.y<this.min.y||this.max.z<this.min.z}getCenter(t){return this.isEmpty()?t.set(0,0,0):t.addVectors(this.min,this.max).multiplyScalar(.5)}getSize(t){return this.isEmpty()?t.set(0,0,0):t.subVectors(this.max,this.min)}expandByPoint(t){return this.min.min(t),this.max.max(t),this}expandByVector(t){return this.min.sub(t),this.max.add(t),this}expandByScalar(t){return this.min.addScalar(-t),this.max.addScalar(t),this}expandByObject(t,e=!1){t.updateWorldMatrix(!1,!1);let n=t.geometry;if(n!==void 0){let r=n.getAttribute(\"position\");if(e===!0&&r!==void 0&&t.isInstancedMesh!==!0)for(let o=0,a=r.count;o<a;o++)t.isMesh===!0?t.getVertexPosition(o,Fe):Fe.fromBufferAttribute(r,o),Fe.applyMatrix4(t.matrixWorld),this.expandByPoint(Fe);else t.boundingBox!==void 0?(t.boundingBox===null&&t.computeBoundingBox(),Oi.copy(t.boundingBox)):(n.boundingBox===null&&n.computeBoundingBox(),Oi.copy(n.boundingBox)),Oi.applyMatrix4(t.matrixWorld),this.union(Oi)}let s=t.children;for(let r=0,o=s.length;r<o;r++)this.expandByObject(s[r],e);return this}containsPoint(t){return!(t.x<this.min.x||t.x>this.max.x||t.y<this.min.y||t.y>this.max.y||t.z<this.min.z||t.z>this.max.z)}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y&&this.min.z<=t.min.z&&t.max.z<=this.max.z}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y),(t.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(t){return!(t.max.x<this.min.x||t.min.x>this.max.x||t.max.y<this.min.y||t.min.y>this.max.y||t.max.z<this.min.z||t.min.z>this.max.z)}intersectsSphere(t){return this.clampPoint(t.center,Fe),Fe.distanceToSquared(t.center)<=t.radius*t.radius}intersectsPlane(t){let e,n;return t.normal.x>0?(e=t.normal.x*this.min.x,n=t.normal.x*this.max.x):(e=t.normal.x*this.max.x,n=t.normal.x*this.min.x),t.normal.y>0?(e+=t.normal.y*this.min.y,n+=t.normal.y*this.max.y):(e+=t.normal.y*this.max.y,n+=t.normal.y*this.min.y),t.normal.z>0?(e+=t.normal.z*this.min.z,n+=t.normal.z*this.max.z):(e+=t.normal.z*this.max.z,n+=t.normal.z*this.min.z),e<=-t.constant&&n>=-t.constant}intersectsTriangle(t){if(this.isEmpty())return!1;this.getCenter(xi),Bi.subVectors(this.max,xi),zn.subVectors(t.a,xi),Vn.subVectors(t.b,xi),kn.subVectors(t.c,xi),an.subVectors(Vn,zn),on.subVectors(kn,Vn),bn.subVectors(zn,kn);let e=[0,-an.z,an.y,0,-on.z,on.y,0,-bn.z,bn.y,an.z,0,-an.x,on.z,0,-on.x,bn.z,0,-bn.x,-an.y,an.x,0,-on.y,on.x,0,-bn.y,bn.x,0];return!ir(e,zn,Vn,kn,Bi)||(e=[1,0,0,0,1,0,0,0,1],!ir(e,zn,Vn,kn,Bi))?!1:(zi.crossVectors(an,on),e=[zi.x,zi.y,zi.z],ir(e,zn,Vn,kn,Bi))}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return this.clampPoint(t,Fe).distanceTo(t)}getBoundingSphere(t){return this.isEmpty()?t.makeEmpty():(this.getCenter(t.center),t.radius=this.getSize(Fe).length()*.5),t}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}applyMatrix4(t){return this.isEmpty()?this:(Je[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),Je[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),Je[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),Je[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),Je[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),Je[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),Je[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),Je[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.setFromPoints(Je),this)}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}},Je=[new N,new N,new N,new N,new N,new N,new N,new N],Fe=new N,Oi=new Un,zn=new N,Vn=new N,kn=new N,an=new N,on=new N,bn=new N,xi=new N,Bi=new N,zi=new N,En=new N;function ir(i,t,e,n,s){for(let r=0,o=i.length-3;r<=o;r+=3){En.fromArray(i,r);let a=s.x*Math.abs(En.x)+s.y*Math.abs(En.y)+s.z*Math.abs(En.z),l=t.dot(En),c=e.dot(En),h=n.dot(En);if(Math.max(-Math.max(l,c,h),Math.min(l,c,h))>a)return!1}return!0}var Sc=new Un,vi=new N,sr=new N,Dn=class{constructor(t=new N,e=-1){this.isSphere=!0,this.center=t,this.radius=e}set(t,e){return this.center.copy(t),this.radius=e,this}setFromPoints(t,e){let n=this.center;e!==void 0?n.copy(e):Sc.setFromPoints(t).getCenter(n);let s=0;for(let r=0,o=t.length;r<o;r++)s=Math.max(s,n.distanceToSquared(t[r]));return this.radius=Math.sqrt(s),this}copy(t){return this.center.copy(t.center),this.radius=t.radius,this}isEmpty(){return this.radius<0}makeEmpty(){return this.center.set(0,0,0),this.radius=-1,this}containsPoint(t){return t.distanceToSquared(this.center)<=this.radius*this.radius}distanceToPoint(t){return t.distanceTo(this.center)-this.radius}intersectsSphere(t){let e=this.radius+t.radius;return t.center.distanceToSquared(this.center)<=e*e}intersectsBox(t){return t.intersectsSphere(this)}intersectsPlane(t){return Math.abs(t.distanceToPoint(this.center))<=this.radius}clampPoint(t,e){let n=this.center.distanceToSquared(t);return e.copy(t),n>this.radius*this.radius&&(e.sub(this.center).normalize(),e.multiplyScalar(this.radius).add(this.center)),e}getBoundingBox(t){return this.isEmpty()?(t.makeEmpty(),t):(t.set(this.center,this.center),t.expandByScalar(this.radius),t)}applyMatrix4(t){return this.center.applyMatrix4(t),this.radius=this.radius*t.getMaxScaleOnAxis(),this}translate(t){return this.center.add(t),this}expandByPoint(t){if(this.isEmpty())return this.center.copy(t),this.radius=0,this;vi.subVectors(t,this.center);let e=vi.lengthSq();if(e>this.radius*this.radius){let n=Math.sqrt(e),s=(n-this.radius)*.5;this.center.addScaledVector(vi,s/n),this.radius+=s}return this}union(t){return t.isEmpty()?this:this.isEmpty()?(this.copy(t),this):(this.center.equals(t.center)===!0?this.radius=Math.max(this.radius,t.radius):(sr.subVectors(t.center,this.center).setLength(t.radius),this.expandByPoint(vi.copy(t.center).add(sr)),this.expandByPoint(vi.copy(t.center).sub(sr))),this)}equals(t){return t.center.equals(this.center)&&t.radius===this.radius}clone(){return new this.constructor().copy(this)}},$e=new N,rr=new N,Vi=new N,ln=new N,ar=new N,ki=new N,or=new N,wi=class{constructor(t=new N,e=new N(0,0,-1)){this.origin=t,this.direction=e}set(t,e){return this.origin.copy(t),this.direction.copy(e),this}copy(t){return this.origin.copy(t.origin),this.direction.copy(t.direction),this}at(t,e){return e.copy(this.origin).addScaledVector(this.direction,t)}lookAt(t){return this.direction.copy(t).sub(this.origin).normalize(),this}recast(t){return this.origin.copy(this.at(t,$e)),this}closestPointToPoint(t,e){e.subVectors(t,this.origin);let n=e.dot(this.direction);return n<0?e.copy(this.origin):e.copy(this.origin).addScaledVector(this.direction,n)}distanceToPoint(t){return Math.sqrt(this.distanceSqToPoint(t))}distanceSqToPoint(t){let e=$e.subVectors(t,this.origin).dot(this.direction);return e<0?this.origin.distanceToSquared(t):($e.copy(this.origin).addScaledVector(this.direction,e),$e.distanceToSquared(t))}distanceSqToSegment(t,e,n,s){rr.copy(t).add(e).multiplyScalar(.5),Vi.copy(e).sub(t).normalize(),ln.copy(this.origin).sub(rr);let r=t.distanceTo(e)*.5,o=-this.direction.dot(Vi),a=ln.dot(this.direction),l=-ln.dot(Vi),c=ln.lengthSq(),h=Math.abs(1-o*o),d,f,m,g;if(h>0)if(d=o*l-a,f=o*a-l,g=r*h,d>=0)if(f>=-g)if(f<=g){let x=1/h;d*=x,f*=x,m=d*(d+o*f+2*a)+f*(o*d+f+2*l)+c}else f=r,d=Math.max(0,-(o*f+a)),m=-d*d+f*(f+2*l)+c;else f=-r,d=Math.max(0,-(o*f+a)),m=-d*d+f*(f+2*l)+c;else f<=-g?(d=Math.max(0,-(-o*r+a)),f=d>0?-r:Math.min(Math.max(-r,-l),r),m=-d*d+f*(f+2*l)+c):f<=g?(d=0,f=Math.min(Math.max(-r,-l),r),m=f*(f+2*l)+c):(d=Math.max(0,-(o*r+a)),f=d>0?r:Math.min(Math.max(-r,-l),r),m=-d*d+f*(f+2*l)+c);else f=o>0?-r:r,d=Math.max(0,-(o*f+a)),m=-d*d+f*(f+2*l)+c;return n&&n.copy(this.origin).addScaledVector(this.direction,d),s&&s.copy(rr).addScaledVector(Vi,f),m}intersectSphere(t,e){$e.subVectors(t.center,this.origin);let n=$e.dot(this.direction),s=$e.dot($e)-n*n,r=t.radius*t.radius;if(s>r)return null;let o=Math.sqrt(r-s),a=n-o,l=n+o;return l<0?null:a<0?this.at(l,e):this.at(a,e)}intersectsSphere(t){return this.distanceSqToPoint(t.center)<=t.radius*t.radius}distanceToPlane(t){let e=t.normal.dot(this.direction);if(e===0)return t.distanceToPoint(this.origin)===0?0:null;let n=-(this.origin.dot(t.normal)+t.constant)/e;return n>=0?n:null}intersectPlane(t,e){let n=this.distanceToPlane(t);return n===null?null:this.at(n,e)}intersectsPlane(t){let e=t.distanceToPoint(this.origin);return e===0||t.normal.dot(this.direction)*e<0}intersectBox(t,e){let n,s,r,o,a,l,c=1/this.direction.x,h=1/this.direction.y,d=1/this.direction.z,f=this.origin;return c>=0?(n=(t.min.x-f.x)*c,s=(t.max.x-f.x)*c):(n=(t.max.x-f.x)*c,s=(t.min.x-f.x)*c),h>=0?(r=(t.min.y-f.y)*h,o=(t.max.y-f.y)*h):(r=(t.max.y-f.y)*h,o=(t.min.y-f.y)*h),n>o||r>s||((r>n||isNaN(n))&&(n=r),(o<s||isNaN(s))&&(s=o),d>=0?(a=(t.min.z-f.z)*d,l=(t.max.z-f.z)*d):(a=(t.max.z-f.z)*d,l=(t.min.z-f.z)*d),n>l||a>s)||((a>n||n!==n)&&(n=a),(l<s||s!==s)&&(s=l),s<0)?null:this.at(n>=0?n:s,e)}intersectsBox(t){return this.intersectBox(t,$e)!==null}intersectTriangle(t,e,n,s,r){ar.subVectors(e,t),ki.subVectors(n,t),or.crossVectors(ar,ki);let o=this.direction.dot(or),a;if(o>0){if(s)return null;a=1}else if(o<0)a=-1,o=-o;else return null;ln.subVectors(this.origin,t);let l=a*this.direction.dot(ki.crossVectors(ln,ki));if(l<0)return null;let c=a*this.direction.dot(ar.cross(ln));if(c<0||l+c>o)return null;let h=-a*ln.dot(or);return h<0?null:this.at(h/o,r)}applyMatrix4(t){return this.origin.applyMatrix4(t),this.direction.transformDirection(t),this}equals(t){return t.origin.equals(this.origin)&&t.direction.equals(this.direction)}clone(){return new this.constructor().copy(this)}},oe=class i{constructor(t,e,n,s,r,o,a,l,c,h,d,f,m,g,x,p){i.prototype.isMatrix4=!0,this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],t!==void 0&&this.set(t,e,n,s,r,o,a,l,c,h,d,f,m,g,x,p)}set(t,e,n,s,r,o,a,l,c,h,d,f,m,g,x,p){let u=this.elements;return u[0]=t,u[4]=e,u[8]=n,u[12]=s,u[1]=r,u[5]=o,u[9]=a,u[13]=l,u[2]=c,u[6]=h,u[10]=d,u[14]=f,u[3]=m,u[7]=g,u[11]=x,u[15]=p,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return new i().fromArray(this.elements)}copy(t){let e=this.elements,n=t.elements;return e[0]=n[0],e[1]=n[1],e[2]=n[2],e[3]=n[3],e[4]=n[4],e[5]=n[5],e[6]=n[6],e[7]=n[7],e[8]=n[8],e[9]=n[9],e[10]=n[10],e[11]=n[11],e[12]=n[12],e[13]=n[13],e[14]=n[14],e[15]=n[15],this}copyPosition(t){let e=this.elements,n=t.elements;return e[12]=n[12],e[13]=n[13],e[14]=n[14],this}setFromMatrix3(t){let e=t.elements;return this.set(e[0],e[3],e[6],0,e[1],e[4],e[7],0,e[2],e[5],e[8],0,0,0,0,1),this}extractBasis(t,e,n){return t.setFromMatrixColumn(this,0),e.setFromMatrixColumn(this,1),n.setFromMatrixColumn(this,2),this}makeBasis(t,e,n){return this.set(t.x,e.x,n.x,0,t.y,e.y,n.y,0,t.z,e.z,n.z,0,0,0,0,1),this}extractRotation(t){let e=this.elements,n=t.elements,s=1/Hn.setFromMatrixColumn(t,0).length(),r=1/Hn.setFromMatrixColumn(t,1).length(),o=1/Hn.setFromMatrixColumn(t,2).length();return e[0]=n[0]*s,e[1]=n[1]*s,e[2]=n[2]*s,e[3]=0,e[4]=n[4]*r,e[5]=n[5]*r,e[6]=n[6]*r,e[7]=0,e[8]=n[8]*o,e[9]=n[9]*o,e[10]=n[10]*o,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromEuler(t){let e=this.elements,n=t.x,s=t.y,r=t.z,o=Math.cos(n),a=Math.sin(n),l=Math.cos(s),c=Math.sin(s),h=Math.cos(r),d=Math.sin(r);if(t.order===\"XYZ\"){let f=o*h,m=o*d,g=a*h,x=a*d;e[0]=l*h,e[4]=-l*d,e[8]=c,e[1]=m+g*c,e[5]=f-x*c,e[9]=-a*l,e[2]=x-f*c,e[6]=g+m*c,e[10]=o*l}else if(t.order===\"YXZ\"){let f=l*h,m=l*d,g=c*h,x=c*d;e[0]=f+x*a,e[4]=g*a-m,e[8]=o*c,e[1]=o*d,e[5]=o*h,e[9]=-a,e[2]=m*a-g,e[6]=x+f*a,e[10]=o*l}else if(t.order===\"ZXY\"){let f=l*h,m=l*d,g=c*h,x=c*d;e[0]=f-x*a,e[4]=-o*d,e[8]=g+m*a,e[1]=m+g*a,e[5]=o*h,e[9]=x-f*a,e[2]=-o*c,e[6]=a,e[10]=o*l}else if(t.order===\"ZYX\"){let f=o*h,m=o*d,g=a*h,x=a*d;e[0]=l*h,e[4]=g*c-m,e[8]=f*c+x,e[1]=l*d,e[5]=x*c+f,e[9]=m*c-g,e[2]=-c,e[6]=a*l,e[10]=o*l}else if(t.order===\"YZX\"){let f=o*l,m=o*c,g=a*l,x=a*c;e[0]=l*h,e[4]=x-f*d,e[8]=g*d+m,e[1]=d,e[5]=o*h,e[9]=-a*h,e[2]=-c*h,e[6]=m*d+g,e[10]=f-x*d}else if(t.order===\"XZY\"){let f=o*l,m=o*c,g=a*l,x=a*c;e[0]=l*h,e[4]=-d,e[8]=c*h,e[1]=f*d+x,e[5]=o*h,e[9]=m*d-g,e[2]=g*d-m,e[6]=a*h,e[10]=x*d+f}return e[3]=0,e[7]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromQuaternion(t){return this.compose(bc,t,Ec)}lookAt(t,e,n){let s=this.elements;return Ae.subVectors(t,e),Ae.lengthSq()===0&&(Ae.z=1),Ae.normalize(),cn.crossVectors(n,Ae),cn.lengthSq()===0&&(Math.abs(n.z)===1?Ae.x+=1e-4:Ae.z+=1e-4,Ae.normalize(),cn.crossVectors(n,Ae)),cn.normalize(),Hi.crossVectors(Ae,cn),s[0]=cn.x,s[4]=Hi.x,s[8]=Ae.x,s[1]=cn.y,s[5]=Hi.y,s[9]=Ae.y,s[2]=cn.z,s[6]=Hi.z,s[10]=Ae.z,this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){let n=t.elements,s=e.elements,r=this.elements,o=n[0],a=n[4],l=n[8],c=n[12],h=n[1],d=n[5],f=n[9],m=n[13],g=n[2],x=n[6],p=n[10],u=n[14],w=n[3],v=n[7],P=n[11],U=n[15],R=s[0],C=s[4],Y=s[8],S=s[12],b=s[1],H=s[5],K=s[9],T=s[13],E=s[2],L=s[6],F=s[10],I=s[14],G=s[3],X=s[7],Z=s[11],$=s[15];return r[0]=o*R+a*b+l*E+c*G,r[4]=o*C+a*H+l*L+c*X,r[8]=o*Y+a*K+l*F+c*Z,r[12]=o*S+a*T+l*I+c*$,r[1]=h*R+d*b+f*E+m*G,r[5]=h*C+d*H+f*L+m*X,r[9]=h*Y+d*K+f*F+m*Z,r[13]=h*S+d*T+f*I+m*$,r[2]=g*R+x*b+p*E+u*G,r[6]=g*C+x*H+p*L+u*X,r[10]=g*Y+x*K+p*F+u*Z,r[14]=g*S+x*T+p*I+u*$,r[3]=w*R+v*b+P*E+U*G,r[7]=w*C+v*H+P*L+U*X,r[11]=w*Y+v*K+P*F+U*Z,r[15]=w*S+v*T+P*I+U*$,this}multiplyScalar(t){let e=this.elements;return e[0]*=t,e[4]*=t,e[8]*=t,e[12]*=t,e[1]*=t,e[5]*=t,e[9]*=t,e[13]*=t,e[2]*=t,e[6]*=t,e[10]*=t,e[14]*=t,e[3]*=t,e[7]*=t,e[11]*=t,e[15]*=t,this}determinant(){let t=this.elements,e=t[0],n=t[4],s=t[8],r=t[12],o=t[1],a=t[5],l=t[9],c=t[13],h=t[2],d=t[6],f=t[10],m=t[14],g=t[3],x=t[7],p=t[11],u=t[15];return g*(+r*l*d-s*c*d-r*a*f+n*c*f+s*a*m-n*l*m)+x*(+e*l*m-e*c*f+r*o*f-s*o*m+s*c*h-r*l*h)+p*(+e*c*d-e*a*m-r*o*d+n*o*m+r*a*h-n*c*h)+u*(-s*a*h-e*l*d+e*a*f+s*o*d-n*o*f+n*l*h)}transpose(){let t=this.elements,e;return e=t[1],t[1]=t[4],t[4]=e,e=t[2],t[2]=t[8],t[8]=e,e=t[6],t[6]=t[9],t[9]=e,e=t[3],t[3]=t[12],t[12]=e,e=t[7],t[7]=t[13],t[13]=e,e=t[11],t[11]=t[14],t[14]=e,this}setPosition(t,e,n){let s=this.elements;return t.isVector3?(s[12]=t.x,s[13]=t.y,s[14]=t.z):(s[12]=t,s[13]=e,s[14]=n),this}invert(){let t=this.elements,e=t[0],n=t[1],s=t[2],r=t[3],o=t[4],a=t[5],l=t[6],c=t[7],h=t[8],d=t[9],f=t[10],m=t[11],g=t[12],x=t[13],p=t[14],u=t[15],w=d*p*c-x*f*c+x*l*m-a*p*m-d*l*u+a*f*u,v=g*f*c-h*p*c-g*l*m+o*p*m+h*l*u-o*f*u,P=h*x*c-g*d*c+g*a*m-o*x*m-h*a*u+o*d*u,U=g*d*l-h*x*l-g*a*f+o*x*f+h*a*p-o*d*p,R=e*w+n*v+s*P+r*U;if(R===0)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);let C=1/R;return t[0]=w*C,t[1]=(x*f*r-d*p*r-x*s*m+n*p*m+d*s*u-n*f*u)*C,t[2]=(a*p*r-x*l*r+x*s*c-n*p*c-a*s*u+n*l*u)*C,t[3]=(d*l*r-a*f*r-d*s*c+n*f*c+a*s*m-n*l*m)*C,t[4]=v*C,t[5]=(h*p*r-g*f*r+g*s*m-e*p*m-h*s*u+e*f*u)*C,t[6]=(g*l*r-o*p*r-g*s*c+e*p*c+o*s*u-e*l*u)*C,t[7]=(o*f*r-h*l*r+h*s*c-e*f*c-o*s*m+e*l*m)*C,t[8]=P*C,t[9]=(g*d*r-h*x*r-g*n*m+e*x*m+h*n*u-e*d*u)*C,t[10]=(o*x*r-g*a*r+g*n*c-e*x*c-o*n*u+e*a*u)*C,t[11]=(h*a*r-o*d*r-h*n*c+e*d*c+o*n*m-e*a*m)*C,t[12]=U*C,t[13]=(h*x*s-g*d*s+g*n*f-e*x*f-h*n*p+e*d*p)*C,t[14]=(g*a*s-o*x*s-g*n*l+e*x*l+o*n*p-e*a*p)*C,t[15]=(o*d*s-h*a*s+h*n*l-e*d*l-o*n*f+e*a*f)*C,this}scale(t){let e=this.elements,n=t.x,s=t.y,r=t.z;return e[0]*=n,e[4]*=s,e[8]*=r,e[1]*=n,e[5]*=s,e[9]*=r,e[2]*=n,e[6]*=s,e[10]*=r,e[3]*=n,e[7]*=s,e[11]*=r,this}getMaxScaleOnAxis(){let t=this.elements,e=t[0]*t[0]+t[1]*t[1]+t[2]*t[2],n=t[4]*t[4]+t[5]*t[5]+t[6]*t[6],s=t[8]*t[8]+t[9]*t[9]+t[10]*t[10];return Math.sqrt(Math.max(e,n,s))}makeTranslation(t,e,n){return t.isVector3?this.set(1,0,0,t.x,0,1,0,t.y,0,0,1,t.z,0,0,0,1):this.set(1,0,0,t,0,1,0,e,0,0,1,n,0,0,0,1),this}makeRotationX(t){let e=Math.cos(t),n=Math.sin(t);return this.set(1,0,0,0,0,e,-n,0,0,n,e,0,0,0,0,1),this}makeRotationY(t){let e=Math.cos(t),n=Math.sin(t);return this.set(e,0,n,0,0,1,0,0,-n,0,e,0,0,0,0,1),this}makeRotationZ(t){let e=Math.cos(t),n=Math.sin(t);return this.set(e,-n,0,0,n,e,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(t,e){let n=Math.cos(e),s=Math.sin(e),r=1-n,o=t.x,a=t.y,l=t.z,c=r*o,h=r*a;return this.set(c*o+n,c*a-s*l,c*l+s*a,0,c*a+s*l,h*a+n,h*l-s*o,0,c*l-s*a,h*l+s*o,r*l*l+n,0,0,0,0,1),this}makeScale(t,e,n){return this.set(t,0,0,0,0,e,0,0,0,0,n,0,0,0,0,1),this}makeShear(t,e,n,s,r,o){return this.set(1,n,r,0,t,1,o,0,e,s,1,0,0,0,0,1),this}compose(t,e,n){let s=this.elements,r=e._x,o=e._y,a=e._z,l=e._w,c=r+r,h=o+o,d=a+a,f=r*c,m=r*h,g=r*d,x=o*h,p=o*d,u=a*d,w=l*c,v=l*h,P=l*d,U=n.x,R=n.y,C=n.z;return s[0]=(1-(x+u))*U,s[1]=(m+P)*U,s[2]=(g-v)*U,s[3]=0,s[4]=(m-P)*R,s[5]=(1-(f+u))*R,s[6]=(p+w)*R,s[7]=0,s[8]=(g+v)*C,s[9]=(p-w)*C,s[10]=(1-(f+x))*C,s[11]=0,s[12]=t.x,s[13]=t.y,s[14]=t.z,s[15]=1,this}decompose(t,e,n){let s=this.elements,r=Hn.set(s[0],s[1],s[2]).length(),o=Hn.set(s[4],s[5],s[6]).length(),a=Hn.set(s[8],s[9],s[10]).length();this.determinant()<0&&(r=-r),t.x=s[12],t.y=s[13],t.z=s[14],Oe.copy(this);let c=1/r,h=1/o,d=1/a;return Oe.elements[0]*=c,Oe.elements[1]*=c,Oe.elements[2]*=c,Oe.elements[4]*=h,Oe.elements[5]*=h,Oe.elements[6]*=h,Oe.elements[8]*=d,Oe.elements[9]*=d,Oe.elements[10]*=d,e.setFromRotationMatrix(Oe),n.x=r,n.y=o,n.z=a,this}makePerspective(t,e,n,s,r,o,a=sn){let l=this.elements,c=2*r/(e-t),h=2*r/(n-s),d=(e+t)/(e-t),f=(n+s)/(n-s),m,g;if(a===sn)m=-(o+r)/(o-r),g=-2*o*r/(o-r);else if(a===ps)m=-o/(o-r),g=-o*r/(o-r);else throw new Error(\"THREE.Matrix4.makePerspective(): Invalid coordinate system: \"+a);return l[0]=c,l[4]=0,l[8]=d,l[12]=0,l[1]=0,l[5]=h,l[9]=f,l[13]=0,l[2]=0,l[6]=0,l[10]=m,l[14]=g,l[3]=0,l[7]=0,l[11]=-1,l[15]=0,this}makeOrthographic(t,e,n,s,r,o,a=sn){let l=this.elements,c=1/(e-t),h=1/(n-s),d=1/(o-r),f=(e+t)*c,m=(n+s)*h,g,x;if(a===sn)g=(o+r)*d,x=-2*d;else if(a===ps)g=r*d,x=-1*d;else throw new Error(\"THREE.Matrix4.makeOrthographic(): Invalid coordinate system: \"+a);return l[0]=2*c,l[4]=0,l[8]=0,l[12]=-f,l[1]=0,l[5]=2*h,l[9]=0,l[13]=-m,l[2]=0,l[6]=0,l[10]=x,l[14]=-g,l[3]=0,l[7]=0,l[11]=0,l[15]=1,this}equals(t){let e=this.elements,n=t.elements;for(let s=0;s<16;s++)if(e[s]!==n[s])return!1;return!0}fromArray(t,e=0){for(let n=0;n<16;n++)this.elements[n]=t[n+e];return this}toArray(t=[],e=0){let n=this.elements;return t[e]=n[0],t[e+1]=n[1],t[e+2]=n[2],t[e+3]=n[3],t[e+4]=n[4],t[e+5]=n[5],t[e+6]=n[6],t[e+7]=n[7],t[e+8]=n[8],t[e+9]=n[9],t[e+10]=n[10],t[e+11]=n[11],t[e+12]=n[12],t[e+13]=n[13],t[e+14]=n[14],t[e+15]=n[15],t}},Hn=new N,Oe=new oe,bc=new N(0,0,0),Ec=new N(1,1,1),cn=new N,Hi=new N,Ae=new N,ro=new oe,ao=new vn,vs=class i{constructor(t=0,e=0,n=0,s=i.DEFAULT_ORDER){this.isEuler=!0,this._x=t,this._y=e,this._z=n,this._order=s}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get order(){return this._order}set order(t){this._order=t,this._onChangeCallback()}set(t,e,n,s=this._order){return this._x=t,this._y=e,this._z=n,this._order=s,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(t){return this._x=t._x,this._y=t._y,this._z=t._z,this._order=t._order,this._onChangeCallback(),this}setFromRotationMatrix(t,e=this._order,n=!0){let s=t.elements,r=s[0],o=s[4],a=s[8],l=s[1],c=s[5],h=s[9],d=s[2],f=s[6],m=s[10];switch(e){case\"XYZ\":this._y=Math.asin(Ee(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(-h,m),this._z=Math.atan2(-o,r)):(this._x=Math.atan2(f,c),this._z=0);break;case\"YXZ\":this._x=Math.asin(-Ee(h,-1,1)),Math.abs(h)<.9999999?(this._y=Math.atan2(a,m),this._z=Math.atan2(l,c)):(this._y=Math.atan2(-d,r),this._z=0);break;case\"ZXY\":this._x=Math.asin(Ee(f,-1,1)),Math.abs(f)<.9999999?(this._y=Math.atan2(-d,m),this._z=Math.atan2(-o,c)):(this._y=0,this._z=Math.atan2(l,r));break;case\"ZYX\":this._y=Math.asin(-Ee(d,-1,1)),Math.abs(d)<.9999999?(this._x=Math.atan2(f,m),this._z=Math.atan2(l,r)):(this._x=0,this._z=Math.atan2(-o,c));break;case\"YZX\":this._z=Math.asin(Ee(l,-1,1)),Math.abs(l)<.9999999?(this._x=Math.atan2(-h,c),this._y=Math.atan2(-d,r)):(this._x=0,this._y=Math.atan2(a,m));break;case\"XZY\":this._z=Math.asin(-Ee(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(f,c),this._y=Math.atan2(a,r)):(this._x=Math.atan2(-h,m),this._y=0);break;default:console.warn(\"THREE.Euler: .setFromRotationMatrix() encountered an unknown order: \"+e)}return this._order=e,n===!0&&this._onChangeCallback(),this}setFromQuaternion(t,e,n){return ro.makeRotationFromQuaternion(t),this.setFromRotationMatrix(ro,e,n)}setFromVector3(t,e=this._order){return this.set(t.x,t.y,t.z,e)}reorder(t){return ao.setFromEuler(this),this.setFromQuaternion(ao,t)}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._order===this._order}fromArray(t){return this._x=t[0],this._y=t[1],this._z=t[2],t[3]!==void 0&&(this._order=t[3]),this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._order,t}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}};vs.DEFAULT_ORDER=\"XYZ\";var ys=class{constructor(){this.mask=1}set(t){this.mask=(1<<t|0)>>>0}enable(t){this.mask|=1<<t|0}enableAll(){this.mask=-1}toggle(t){this.mask^=1<<t|0}disable(t){this.mask&=~(1<<t|0)}disableAll(){this.mask=0}test(t){return(this.mask&t.mask)!==0}isEnabled(t){return(this.mask&(1<<t|0))!==0}},wc=0,oo=new N,Gn=new vn,Ke=new oe,Gi=new N,yi=new N,Tc=new N,Ac=new vn,lo=new N(1,0,0),co=new N(0,1,0),ho=new N(0,0,1),Cc={type:\"added\"},Rc={type:\"removed\"},Pe=class i extends xn{constructor(){super(),this.isObject3D=!0,Object.defineProperty(this,\"id\",{value:wc++}),this.uuid=Ii(),this.name=\"\",this.type=\"Object3D\",this.parent=null,this.children=[],this.up=i.DEFAULT_UP.clone();let t=new N,e=new vs,n=new vn,s=new N(1,1,1);function r(){n.setFromEuler(e,!1)}function o(){e.setFromQuaternion(n,void 0,!1)}e._onChange(r),n._onChange(o),Object.defineProperties(this,{position:{configurable:!0,enumerable:!0,value:t},rotation:{configurable:!0,enumerable:!0,value:e},quaternion:{configurable:!0,enumerable:!0,value:n},scale:{configurable:!0,enumerable:!0,value:s},modelViewMatrix:{value:new oe},normalMatrix:{value:new zt}}),this.matrix=new oe,this.matrixWorld=new oe,this.matrixAutoUpdate=i.DEFAULT_MATRIX_AUTO_UPDATE,this.matrixWorldAutoUpdate=i.DEFAULT_MATRIX_WORLD_AUTO_UPDATE,this.matrixWorldNeedsUpdate=!1,this.layers=new ys,this.visible=!0,this.castShadow=!1,this.receiveShadow=!1,this.frustumCulled=!0,this.renderOrder=0,this.animations=[],this.userData={}}onBeforeShadow(){}onAfterShadow(){}onBeforeRender(){}onAfterRender(){}applyMatrix4(t){this.matrixAutoUpdate&&this.updateMatrix(),this.matrix.premultiply(t),this.matrix.decompose(this.position,this.quaternion,this.scale)}applyQuaternion(t){return this.quaternion.premultiply(t),this}setRotationFromAxisAngle(t,e){this.quaternion.setFromAxisAngle(t,e)}setRotationFromEuler(t){this.quaternion.setFromEuler(t,!0)}setRotationFromMatrix(t){this.quaternion.setFromRotationMatrix(t)}setRotationFromQuaternion(t){this.quaternion.copy(t)}rotateOnAxis(t,e){return Gn.setFromAxisAngle(t,e),this.quaternion.multiply(Gn),this}rotateOnWorldAxis(t,e){return Gn.setFromAxisAngle(t,e),this.quaternion.premultiply(Gn),this}rotateX(t){return this.rotateOnAxis(lo,t)}rotateY(t){return this.rotateOnAxis(co,t)}rotateZ(t){return this.rotateOnAxis(ho,t)}translateOnAxis(t,e){return oo.copy(t).applyQuaternion(this.quaternion),this.position.add(oo.multiplyScalar(e)),this}translateX(t){return this.translateOnAxis(lo,t)}translateY(t){return this.translateOnAxis(co,t)}translateZ(t){return this.translateOnAxis(ho,t)}localToWorld(t){return this.updateWorldMatrix(!0,!1),t.applyMatrix4(this.matrixWorld)}worldToLocal(t){return this.updateWorldMatrix(!0,!1),t.applyMatrix4(Ke.copy(this.matrixWorld).invert())}lookAt(t,e,n){t.isVector3?Gi.copy(t):Gi.set(t,e,n);let s=this.parent;this.updateWorldMatrix(!0,!1),yi.setFromMatrixPosition(this.matrixWorld),this.isCamera||this.isLight?Ke.lookAt(yi,Gi,this.up):Ke.lookAt(Gi,yi,this.up),this.quaternion.setFromRotationMatrix(Ke),s&&(Ke.extractRotation(s.matrixWorld),Gn.setFromRotationMatrix(Ke),this.quaternion.premultiply(Gn.invert()))}add(t){if(arguments.length>1){for(let e=0;e<arguments.length;e++)this.add(arguments[e]);return this}return t===this?(console.error(\"THREE.Object3D.add: object can't be added as a child of itself.\",t),this):(t&&t.isObject3D?(t.parent!==null&&t.parent.remove(t),t.parent=this,this.children.push(t),t.dispatchEvent(Cc)):console.error(\"THREE.Object3D.add: object not an instance of THREE.Object3D.\",t),this)}remove(t){if(arguments.length>1){for(let n=0;n<arguments.length;n++)this.remove(arguments[n]);return this}let e=this.children.indexOf(t);return e!==-1&&(t.parent=null,this.children.splice(e,1),t.dispatchEvent(Rc)),this}removeFromParent(){let t=this.parent;return t!==null&&t.remove(this),this}clear(){return this.remove(...this.children)}attach(t){return this.updateWorldMatrix(!0,!1),Ke.copy(this.matrixWorld).invert(),t.parent!==null&&(t.parent.updateWorldMatrix(!0,!1),Ke.multiply(t.parent.matrixWorld)),t.applyMatrix4(Ke),this.add(t),t.updateWorldMatrix(!1,!0),this}getObjectById(t){return this.getObjectByProperty(\"id\",t)}getObjectByName(t){return this.getObjectByProperty(\"name\",t)}getObjectByProperty(t,e){if(this[t]===e)return this;for(let n=0,s=this.children.length;n<s;n++){let o=this.children[n].getObjectByProperty(t,e);if(o!==void 0)return o}}getObjectsByProperty(t,e,n=[]){this[t]===e&&n.push(this);let s=this.children;for(let r=0,o=s.length;r<o;r++)s[r].getObjectsByProperty(t,e,n);return n}getWorldPosition(t){return this.updateWorldMatrix(!0,!1),t.setFromMatrixPosition(this.matrixWorld)}getWorldQuaternion(t){return this.updateWorldMatrix(!0,!1),this.matrixWorld.decompose(yi,t,Tc),t}getWorldScale(t){return this.updateWorldMatrix(!0,!1),this.matrixWorld.decompose(yi,Ac,t),t}getWorldDirection(t){this.updateWorldMatrix(!0,!1);let e=this.matrixWorld.elements;return t.set(e[8],e[9],e[10]).normalize()}raycast(){}traverse(t){t(this);let e=this.children;for(let n=0,s=e.length;n<s;n++)e[n].traverse(t)}traverseVisible(t){if(this.visible===!1)return;t(this);let e=this.children;for(let n=0,s=e.length;n<s;n++)e[n].traverseVisible(t)}traverseAncestors(t){let e=this.parent;e!==null&&(t(e),e.traverseAncestors(t))}updateMatrix(){this.matrix.compose(this.position,this.quaternion,this.scale),this.matrixWorldNeedsUpdate=!0}updateMatrixWorld(t){this.matrixAutoUpdate&&this.updateMatrix(),(this.matrixWorldNeedsUpdate||t)&&(this.parent===null?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1,t=!0);let e=this.children;for(let n=0,s=e.length;n<s;n++){let r=e[n];(r.matrixWorldAutoUpdate===!0||t===!0)&&r.updateMatrixWorld(t)}}updateWorldMatrix(t,e){let n=this.parent;if(t===!0&&n!==null&&n.matrixWorldAutoUpdate===!0&&n.updateWorldMatrix(!0,!1),this.matrixAutoUpdate&&this.updateMatrix(),this.parent===null?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),e===!0){let s=this.children;for(let r=0,o=s.length;r<o;r++){let a=s[r];a.matrixWorldAutoUpdate===!0&&a.updateWorldMatrix(!1,!0)}}}toJSON(t){let e=t===void 0||typeof t==\"string\",n={};e&&(t={geometries:{},materials:{},textures:{},images:{},shapes:{},skeletons:{},animations:{},nodes:{}},n.metadata={version:4.6,type:\"Object\",generator:\"Object3D.toJSON\"});let s={};s.uuid=this.uuid,s.type=this.type,this.name!==\"\"&&(s.name=this.name),this.castShadow===!0&&(s.castShadow=!0),this.receiveShadow===!0&&(s.receiveShadow=!0),this.visible===!1&&(s.visible=!1),this.frustumCulled===!1&&(s.frustumCulled=!1),this.renderOrder!==0&&(s.renderOrder=this.renderOrder),Object.keys(this.userData).length>0&&(s.userData=this.userData),s.layers=this.layers.mask,s.matrix=this.matrix.toArray(),s.up=this.up.toArray(),this.matrixAutoUpdate===!1&&(s.matrixAutoUpdate=!1),this.isInstancedMesh&&(s.type=\"InstancedMesh\",s.count=this.count,s.instanceMatrix=this.instanceMatrix.toJSON(),this.instanceColor!==null&&(s.instanceColor=this.instanceColor.toJSON())),this.isBatchedMesh&&(s.type=\"BatchedMesh\",s.perObjectFrustumCulled=this.perObjectFrustumCulled,s.sortObjects=this.sortObjects,s.drawRanges=this._drawRanges,s.reservedRanges=this._reservedRanges,s.visibility=this._visibility,s.active=this._active,s.bounds=this._bounds.map(a=>({boxInitialized:a.boxInitialized,boxMin:a.box.min.toArray(),boxMax:a.box.max.toArray(),sphereInitialized:a.sphereInitialized,sphereRadius:a.sphere.radius,sphereCenter:a.sphere.center.toArray()})),s.maxGeometryCount=this._maxGeometryCount,s.maxVertexCount=this._maxVertexCount,s.maxIndexCount=this._maxIndexCount,s.geometryInitialized=this._geometryInitialized,s.geometryCount=this._geometryCount,s.matricesTexture=this._matricesTexture.toJSON(t),this.boundingSphere!==null&&(s.boundingSphere={center:s.boundingSphere.center.toArray(),radius:s.boundingSphere.radius}),this.boundingBox!==null&&(s.boundingBox={min:s.boundingBox.min.toArray(),max:s.boundingBox.max.toArray()}));function r(a,l){return a[l.uuid]===void 0&&(a[l.uuid]=l.toJSON(t)),l.uuid}if(this.isScene)this.background&&(this.background.isColor?s.background=this.background.toJSON():this.background.isTexture&&(s.background=this.background.toJSON(t).uuid)),this.environment&&this.environment.isTexture&&this.environment.isRenderTargetTexture!==!0&&(s.environment=this.environment.toJSON(t).uuid);else if(this.isMesh||this.isLine||this.isPoints){s.geometry=r(t.geometries,this.geometry);let a=this.geometry.parameters;if(a!==void 0&&a.shapes!==void 0){let l=a.shapes;if(Array.isArray(l))for(let c=0,h=l.length;c<h;c++){let d=l[c];r(t.shapes,d)}else r(t.shapes,l)}}if(this.isSkinnedMesh&&(s.bindMode=this.bindMode,s.bindMatrix=this.bindMatrix.toArray(),this.skeleton!==void 0&&(r(t.skeletons,this.skeleton),s.skeleton=this.skeleton.uuid)),this.material!==void 0)if(Array.isArray(this.material)){let a=[];for(let l=0,c=this.material.length;l<c;l++)a.push(r(t.materials,this.material[l]));s.material=a}else s.material=r(t.materials,this.material);if(this.children.length>0){s.children=[];for(let a=0;a<this.children.length;a++)s.children.push(this.children[a].toJSON(t).object)}if(this.animations.length>0){s.animations=[];for(let a=0;a<this.animations.length;a++){let l=this.animations[a];s.animations.push(r(t.animations,l))}}if(e){let a=o(t.geometries),l=o(t.materials),c=o(t.textures),h=o(t.images),d=o(t.shapes),f=o(t.skeletons),m=o(t.animations),g=o(t.nodes);a.length>0&&(n.geometries=a),l.length>0&&(n.materials=l),c.length>0&&(n.textures=c),h.length>0&&(n.images=h),d.length>0&&(n.shapes=d),f.length>0&&(n.skeletons=f),m.length>0&&(n.animations=m),g.length>0&&(n.nodes=g)}return n.object=s,n;function o(a){let l=[];for(let c in a){let h=a[c];delete h.metadata,l.push(h)}return l}}clone(t){return new this.constructor().copy(this,t)}copy(t,e=!0){if(this.name=t.name,this.up.copy(t.up),this.position.copy(t.position),this.rotation.order=t.rotation.order,this.quaternion.copy(t.quaternion),this.scale.copy(t.scale),this.matrix.copy(t.matrix),this.matrixWorld.copy(t.matrixWorld),this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrixWorldAutoUpdate=t.matrixWorldAutoUpdate,this.matrixWorldNeedsUpdate=t.matrixWorldNeedsUpdate,this.layers.mask=t.layers.mask,this.visible=t.visible,this.castShadow=t.castShadow,this.receiveShadow=t.receiveShadow,this.frustumCulled=t.frustumCulled,this.renderOrder=t.renderOrder,this.animations=t.animations.slice(),this.userData=JSON.parse(JSON.stringify(t.userData)),e===!0)for(let n=0;n<t.children.length;n++){let s=t.children[n];this.add(s.clone())}return this}};Pe.DEFAULT_UP=new N(0,1,0);Pe.DEFAULT_MATRIX_AUTO_UPDATE=!0;Pe.DEFAULT_MATRIX_WORLD_AUTO_UPDATE=!0;var Be=new N,Qe=new N,lr=new N,je=new N,Wn=new N,Xn=new N,uo=new N,cr=new N,hr=new N,ur=new N,Wi=!1,jn=class i{constructor(t=new N,e=new N,n=new N){this.a=t,this.b=e,this.c=n}static getNormal(t,e,n,s){s.subVectors(n,e),Be.subVectors(t,e),s.cross(Be);let r=s.lengthSq();return r>0?s.multiplyScalar(1/Math.sqrt(r)):s.set(0,0,0)}static getBarycoord(t,e,n,s,r){Be.subVectors(s,e),Qe.subVectors(n,e),lr.subVectors(t,e);let o=Be.dot(Be),a=Be.dot(Qe),l=Be.dot(lr),c=Qe.dot(Qe),h=Qe.dot(lr),d=o*c-a*a;if(d===0)return r.set(0,0,0),null;let f=1/d,m=(c*l-a*h)*f,g=(o*h-a*l)*f;return r.set(1-m-g,g,m)}static containsPoint(t,e,n,s){return this.getBarycoord(t,e,n,s,je)===null?!1:je.x>=0&&je.y>=0&&je.x+je.y<=1}static getUV(t,e,n,s,r,o,a,l){return Wi===!1&&(console.warn(\"THREE.Triangle.getUV() has been renamed to THREE.Triangle.getInterpolation().\"),Wi=!0),this.getInterpolation(t,e,n,s,r,o,a,l)}static getInterpolation(t,e,n,s,r,o,a,l){return this.getBarycoord(t,e,n,s,je)===null?(l.x=0,l.y=0,\"z\"in l&&(l.z=0),\"w\"in l&&(l.w=0),null):(l.setScalar(0),l.addScaledVector(r,je.x),l.addScaledVector(o,je.y),l.addScaledVector(a,je.z),l)}static isFrontFacing(t,e,n,s){return Be.subVectors(n,e),Qe.subVectors(t,e),Be.cross(Qe).dot(s)<0}set(t,e,n){return this.a.copy(t),this.b.copy(e),this.c.copy(n),this}setFromPointsAndIndices(t,e,n,s){return this.a.copy(t[e]),this.b.copy(t[n]),this.c.copy(t[s]),this}setFromAttributeAndIndices(t,e,n,s){return this.a.fromBufferAttribute(t,e),this.b.fromBufferAttribute(t,n),this.c.fromBufferAttribute(t,s),this}clone(){return new this.constructor().copy(this)}copy(t){return this.a.copy(t.a),this.b.copy(t.b),this.c.copy(t.c),this}getArea(){return Be.subVectors(this.c,this.b),Qe.subVectors(this.a,this.b),Be.cross(Qe).length()*.5}getMidpoint(t){return t.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(t){return i.getNormal(this.a,this.b,this.c,t)}getPlane(t){return t.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(t,e){return i.getBarycoord(t,this.a,this.b,this.c,e)}getUV(t,e,n,s,r){return Wi===!1&&(console.warn(\"THREE.Triangle.getUV() has been renamed to THREE.Triangle.getInterpolation().\"),Wi=!0),i.getInterpolation(t,this.a,this.b,this.c,e,n,s,r)}getInterpolation(t,e,n,s,r){return i.getInterpolation(t,this.a,this.b,this.c,e,n,s,r)}containsPoint(t){return i.containsPoint(t,this.a,this.b,this.c)}isFrontFacing(t){return i.isFrontFacing(this.a,this.b,this.c,t)}intersectsBox(t){return t.intersectsTriangle(this)}closestPointToPoint(t,e){let n=this.a,s=this.b,r=this.c,o,a;Wn.subVectors(s,n),Xn.subVectors(r,n),cr.subVectors(t,n);let l=Wn.dot(cr),c=Xn.dot(cr);if(l<=0&&c<=0)return e.copy(n);hr.subVectors(t,s);let h=Wn.dot(hr),d=Xn.dot(hr);if(h>=0&&d<=h)return e.copy(s);let f=l*d-h*c;if(f<=0&&l>=0&&h<=0)return o=l/(l-h),e.copy(n).addScaledVector(Wn,o);ur.subVectors(t,r);let m=Wn.dot(ur),g=Xn.dot(ur);if(g>=0&&m<=g)return e.copy(r);let x=m*c-l*g;if(x<=0&&c>=0&&g<=0)return a=c/(c-g),e.copy(n).addScaledVector(Xn,a);let p=h*g-m*d;if(p<=0&&d-h>=0&&m-g>=0)return uo.subVectors(r,s),a=(d-h)/(d-h+(m-g)),e.copy(s).addScaledVector(uo,a);let u=1/(p+x+f);return o=x*u,a=f*u,e.copy(n).addScaledVector(Wn,o).addScaledVector(Xn,a)}equals(t){return t.a.equals(this.a)&&t.b.equals(this.b)&&t.c.equals(this.c)}},sl={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},hn={h:0,s:0,l:0},Xi={h:0,s:0,l:0};function dr(i,t,e){return e<0&&(e+=1),e>1&&(e-=1),e<1/6?i+(t-i)*6*e:e<1/2?t:e<2/3?i+(t-i)*6*(2/3-e):i}var Pt=class{constructor(t,e,n){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(t,e,n)}set(t,e,n){if(e===void 0&&n===void 0){let s=t;s&&s.isColor?this.copy(s):typeof s==\"number\"?this.setHex(s):typeof s==\"string\"&&this.setStyle(s)}else this.setRGB(t,e,n);return this}setScalar(t){return this.r=t,this.g=t,this.b=t,this}setHex(t,e=ce){return t=Math.floor(t),this.r=(t>>16&255)/255,this.g=(t>>8&255)/255,this.b=(t&255)/255,Wt.toWorkingColorSpace(this,e),this}setRGB(t,e,n,s=Wt.workingColorSpace){return this.r=t,this.g=e,this.b=n,Wt.toWorkingColorSpace(this,s),this}setHSL(t,e,n,s=Wt.workingColorSpace){if(t=_c(t,1),e=Ee(e,0,1),n=Ee(n,0,1),e===0)this.r=this.g=this.b=n;else{let r=n<=.5?n*(1+e):n+e-n*e,o=2*n-r;this.r=dr(o,r,t+1/3),this.g=dr(o,r,t),this.b=dr(o,r,t-1/3)}return Wt.toWorkingColorSpace(this,s),this}setStyle(t,e=ce){function n(r){r!==void 0&&parseFloat(r)<1&&console.warn(\"THREE.Color: Alpha component of \"+t+\" will be ignored.\")}let s;if(s=/^(\\w+)\\(([^\\)]*)\\)/.exec(t)){let r,o=s[1],a=s[2];switch(o){case\"rgb\":case\"rgba\":if(r=/^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec(a))return n(r[4]),this.setRGB(Math.min(255,parseInt(r[1],10))/255,Math.min(255,parseInt(r[2],10))/255,Math.min(255,parseInt(r[3],10))/255,e);if(r=/^\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec(a))return n(r[4]),this.setRGB(Math.min(100,parseInt(r[1],10))/100,Math.min(100,parseInt(r[2],10))/100,Math.min(100,parseInt(r[3],10))/100,e);break;case\"hsl\":case\"hsla\":if(r=/^\\s*(\\d*\\.?\\d+)\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec(a))return n(r[4]),this.setHSL(parseFloat(r[1])/360,parseFloat(r[2])/100,parseFloat(r[3])/100,e);break;default:console.warn(\"THREE.Color: Unknown color model \"+t)}}else if(s=/^\\#([A-Fa-f\\d]+)$/.exec(t)){let r=s[1],o=r.length;if(o===3)return this.setRGB(parseInt(r.charAt(0),16)/15,parseInt(r.charAt(1),16)/15,parseInt(r.charAt(2),16)/15,e);if(o===6)return this.setHex(parseInt(r,16),e);console.warn(\"THREE.Color: Invalid hex color \"+t)}else if(t&&t.length>0)return this.setColorName(t,e);return this}setColorName(t,e=ce){let n=sl[t.toLowerCase()];return n!==void 0?this.setHex(n,e):console.warn(\"THREE.Color: Unknown color \"+t),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(t){return this.r=t.r,this.g=t.g,this.b=t.b,this}copySRGBToLinear(t){return this.r=ii(t.r),this.g=ii(t.g),this.b=ii(t.b),this}copyLinearToSRGB(t){return this.r=tr(t.r),this.g=tr(t.g),this.b=tr(t.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(t=ce){return Wt.fromWorkingColorSpace(pe.copy(this),t),Math.round(Ee(pe.r*255,0,255))*65536+Math.round(Ee(pe.g*255,0,255))*256+Math.round(Ee(pe.b*255,0,255))}getHexString(t=ce){return(\"000000\"+this.getHex(t).toString(16)).slice(-6)}getHSL(t,e=Wt.workingColorSpace){Wt.fromWorkingColorSpace(pe.copy(this),e);let n=pe.r,s=pe.g,r=pe.b,o=Math.max(n,s,r),a=Math.min(n,s,r),l,c,h=(a+o)/2;if(a===o)l=0,c=0;else{let d=o-a;switch(c=h<=.5?d/(o+a):d/(2-o-a),o){case n:l=(s-r)/d+(s<r?6:0);break;case s:l=(r-n)/d+2;break;case r:l=(n-s)/d+4;break}l/=6}return t.h=l,t.s=c,t.l=h,t}getRGB(t,e=Wt.workingColorSpace){return Wt.fromWorkingColorSpace(pe.copy(this),e),t.r=pe.r,t.g=pe.g,t.b=pe.b,t}getStyle(t=ce){Wt.fromWorkingColorSpace(pe.copy(this),t);let e=pe.r,n=pe.g,s=pe.b;return t!==ce?`color(${t} ${e.toFixed(3)} ${n.toFixed(3)} ${s.toFixed(3)})`:`rgb(${Math.round(e*255)},${Math.round(n*255)},${Math.round(s*255)})`}offsetHSL(t,e,n){return this.getHSL(hn),this.setHSL(hn.h+t,hn.s+e,hn.l+n)}add(t){return this.r+=t.r,this.g+=t.g,this.b+=t.b,this}addColors(t,e){return this.r=t.r+e.r,this.g=t.g+e.g,this.b=t.b+e.b,this}addScalar(t){return this.r+=t,this.g+=t,this.b+=t,this}sub(t){return this.r=Math.max(0,this.r-t.r),this.g=Math.max(0,this.g-t.g),this.b=Math.max(0,this.b-t.b),this}multiply(t){return this.r*=t.r,this.g*=t.g,this.b*=t.b,this}multiplyScalar(t){return this.r*=t,this.g*=t,this.b*=t,this}lerp(t,e){return this.r+=(t.r-this.r)*e,this.g+=(t.g-this.g)*e,this.b+=(t.b-this.b)*e,this}lerpColors(t,e,n){return this.r=t.r+(e.r-t.r)*n,this.g=t.g+(e.g-t.g)*n,this.b=t.b+(e.b-t.b)*n,this}lerpHSL(t,e){this.getHSL(hn),t.getHSL(Xi);let n=Qs(hn.h,Xi.h,e),s=Qs(hn.s,Xi.s,e),r=Qs(hn.l,Xi.l,e);return this.setHSL(n,s,r),this}setFromVector3(t){return this.r=t.x,this.g=t.y,this.b=t.z,this}applyMatrix3(t){let e=this.r,n=this.g,s=this.b,r=t.elements;return this.r=r[0]*e+r[3]*n+r[6]*s,this.g=r[1]*e+r[4]*n+r[7]*s,this.b=r[2]*e+r[5]*n+r[8]*s,this}equals(t){return t.r===this.r&&t.g===this.g&&t.b===this.b}fromArray(t,e=0){return this.r=t[e],this.g=t[e+1],this.b=t[e+2],this}toArray(t=[],e=0){return t[e]=this.r,t[e+1]=this.g,t[e+2]=this.b,t}fromBufferAttribute(t,e){return this.r=t.getX(e),this.g=t.getY(e),this.b=t.getZ(e),this}toJSON(){return this.getHex()}*[Symbol.iterator](){yield this.r,yield this.g,yield this.b}},pe=new Pt;Pt.NAMES=sl;var Pc=0,yn=class extends xn{constructor(){super(),this.isMaterial=!0,Object.defineProperty(this,\"id\",{value:Pc++}),this.uuid=Ii(),this.name=\"\",this.type=\"Material\",this.blending=ni,this.side=gn,this.vertexColors=!1,this.opacity=1,this.transparent=!1,this.alphaHash=!1,this.blendSrc=Sr,this.blendDst=br,this.blendEquation=Cn,this.blendSrcAlpha=null,this.blendDstAlpha=null,this.blendEquationAlpha=null,this.blendColor=new Pt(0,0,0),this.blendAlpha=0,this.depthFunc=ls,this.depthTest=!0,this.depthWrite=!0,this.stencilWriteMask=255,this.stencilFunc=Ka,this.stencilRef=0,this.stencilFuncMask=255,this.stencilFail=On,this.stencilZFail=On,this.stencilZPass=On,this.stencilWrite=!1,this.clippingPlanes=null,this.clipIntersection=!1,this.clipShadows=!1,this.shadowSide=null,this.colorWrite=!0,this.precision=null,this.polygonOffset=!1,this.polygonOffsetFactor=0,this.polygonOffsetUnits=0,this.dithering=!1,this.alphaToCoverage=!1,this.premultipliedAlpha=!1,this.forceSinglePass=!1,this.visible=!0,this.toneMapped=!0,this.userData={},this.version=0,this._alphaTest=0}get alphaTest(){return this._alphaTest}set alphaTest(t){this._alphaTest>0!=t>0&&this.version++,this._alphaTest=t}onBuild(){}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(t){if(t!==void 0)for(let e in t){let n=t[e];if(n===void 0){console.warn(`THREE.Material: parameter '${e}' has value of undefined.`);continue}let s=this[e];if(s===void 0){console.warn(`THREE.Material: '${e}' is not a property of THREE.${this.type}.`);continue}s&&s.isColor?s.set(n):s&&s.isVector3&&n&&n.isVector3?s.copy(n):this[e]=n}}toJSON(t){let e=t===void 0||typeof t==\"string\";e&&(t={textures:{},images:{}});let n={metadata:{version:4.6,type:\"Material\",generator:\"Material.toJSON\"}};n.uuid=this.uuid,n.type=this.type,this.name!==\"\"&&(n.name=this.name),this.color&&this.color.isColor&&(n.color=this.color.getHex()),this.roughness!==void 0&&(n.roughness=this.roughness),this.metalness!==void 0&&(n.metalness=this.metalness),this.sheen!==void 0&&(n.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(n.sheenColor=this.sheenColor.getHex()),this.sheenRoughness!==void 0&&(n.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(n.emissive=this.emissive.getHex()),this.emissiveIntensity&&this.emissiveIntensity!==1&&(n.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(n.specular=this.specular.getHex()),this.specularIntensity!==void 0&&(n.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(n.specularColor=this.specularColor.getHex()),this.shininess!==void 0&&(n.shininess=this.shininess),this.clearcoat!==void 0&&(n.clearcoat=this.clearcoat),this.clearcoatRoughness!==void 0&&(n.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(n.clearcoatMap=this.clearcoatMap.toJSON(t).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(n.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(t).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(n.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(t).uuid,n.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.iridescence!==void 0&&(n.iridescence=this.iridescence),this.iridescenceIOR!==void 0&&(n.iridescenceIOR=this.iridescenceIOR),this.iridescenceThicknessRange!==void 0&&(n.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(n.iridescenceMap=this.iridescenceMap.toJSON(t).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(n.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(t).uuid),this.anisotropy!==void 0&&(n.anisotropy=this.anisotropy),this.anisotropyRotation!==void 0&&(n.anisotropyRotation=this.anisotropyRotation),this.anisotropyMap&&this.anisotropyMap.isTexture&&(n.anisotropyMap=this.anisotropyMap.toJSON(t).uuid),this.map&&this.map.isTexture&&(n.map=this.map.toJSON(t).uuid),this.matcap&&this.matcap.isTexture&&(n.matcap=this.matcap.toJSON(t).uuid),this.alphaMap&&this.alphaMap.isTexture&&(n.alphaMap=this.alphaMap.toJSON(t).uuid),this.lightMap&&this.lightMap.isTexture&&(n.lightMap=this.lightMap.toJSON(t).uuid,n.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(n.aoMap=this.aoMap.toJSON(t).uuid,n.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(n.bumpMap=this.bumpMap.toJSON(t).uuid,n.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(n.normalMap=this.normalMap.toJSON(t).uuid,n.normalMapType=this.normalMapType,n.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(n.displacementMap=this.displacementMap.toJSON(t).uuid,n.displacementScale=this.displacementScale,n.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(n.roughnessMap=this.roughnessMap.toJSON(t).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(n.metalnessMap=this.metalnessMap.toJSON(t).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(n.emissiveMap=this.emissiveMap.toJSON(t).uuid),this.specularMap&&this.specularMap.isTexture&&(n.specularMap=this.specularMap.toJSON(t).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(n.specularIntensityMap=this.specularIntensityMap.toJSON(t).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(n.specularColorMap=this.specularColorMap.toJSON(t).uuid),this.envMap&&this.envMap.isTexture&&(n.envMap=this.envMap.toJSON(t).uuid,this.combine!==void 0&&(n.combine=this.combine)),this.envMapIntensity!==void 0&&(n.envMapIntensity=this.envMapIntensity),this.reflectivity!==void 0&&(n.reflectivity=this.reflectivity),this.refractionRatio!==void 0&&(n.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(n.gradientMap=this.gradientMap.toJSON(t).uuid),this.transmission!==void 0&&(n.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(n.transmissionMap=this.transmissionMap.toJSON(t).uuid),this.thickness!==void 0&&(n.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(n.thicknessMap=this.thicknessMap.toJSON(t).uuid),this.attenuationDistance!==void 0&&this.attenuationDistance!==1/0&&(n.attenuationDistance=this.attenuationDistance),this.attenuationColor!==void 0&&(n.attenuationColor=this.attenuationColor.getHex()),this.size!==void 0&&(n.size=this.size),this.shadowSide!==null&&(n.shadowSide=this.shadowSide),this.sizeAttenuation!==void 0&&(n.sizeAttenuation=this.sizeAttenuation),this.blending!==ni&&(n.blending=this.blending),this.side!==gn&&(n.side=this.side),this.vertexColors===!0&&(n.vertexColors=!0),this.opacity<1&&(n.opacity=this.opacity),this.transparent===!0&&(n.transparent=!0),this.blendSrc!==Sr&&(n.blendSrc=this.blendSrc),this.blendDst!==br&&(n.blendDst=this.blendDst),this.blendEquation!==Cn&&(n.blendEquation=this.blendEquation),this.blendSrcAlpha!==null&&(n.blendSrcAlpha=this.blendSrcAlpha),this.blendDstAlpha!==null&&(n.blendDstAlpha=this.blendDstAlpha),this.blendEquationAlpha!==null&&(n.blendEquationAlpha=this.blendEquationAlpha),this.blendColor&&this.blendColor.isColor&&(n.blendColor=this.blendColor.getHex()),this.blendAlpha!==0&&(n.blendAlpha=this.blendAlpha),this.depthFunc!==ls&&(n.depthFunc=this.depthFunc),this.depthTest===!1&&(n.depthTest=this.depthTest),this.depthWrite===!1&&(n.depthWrite=this.depthWrite),this.colorWrite===!1&&(n.colorWrite=this.colorWrite),this.stencilWriteMask!==255&&(n.stencilWriteMask=this.stencilWriteMask),this.stencilFunc!==Ka&&(n.stencilFunc=this.stencilFunc),this.stencilRef!==0&&(n.stencilRef=this.stencilRef),this.stencilFuncMask!==255&&(n.stencilFuncMask=this.stencilFuncMask),this.stencilFail!==On&&(n.stencilFail=this.stencilFail),this.stencilZFail!==On&&(n.stencilZFail=this.stencilZFail),this.stencilZPass!==On&&(n.stencilZPass=this.stencilZPass),this.stencilWrite===!0&&(n.stencilWrite=this.stencilWrite),this.rotation!==void 0&&this.rotation!==0&&(n.rotation=this.rotation),this.polygonOffset===!0&&(n.polygonOffset=!0),this.polygonOffsetFactor!==0&&(n.polygonOffsetFactor=this.polygonOffsetFactor),this.polygonOffsetUnits!==0&&(n.polygonOffsetUnits=this.polygonOffsetUnits),this.linewidth!==void 0&&this.linewidth!==1&&(n.linewidth=this.linewidth),this.dashSize!==void 0&&(n.dashSize=this.dashSize),this.gapSize!==void 0&&(n.gapSize=this.gapSize),this.scale!==void 0&&(n.scale=this.scale),this.dithering===!0&&(n.dithering=!0),this.alphaTest>0&&(n.alphaTest=this.alphaTest),this.alphaHash===!0&&(n.alphaHash=!0),this.alphaToCoverage===!0&&(n.alphaToCoverage=!0),this.premultipliedAlpha===!0&&(n.premultipliedAlpha=!0),this.forceSinglePass===!0&&(n.forceSinglePass=!0),this.wireframe===!0&&(n.wireframe=!0),this.wireframeLinewidth>1&&(n.wireframeLinewidth=this.wireframeLinewidth),this.wireframeLinecap!==\"round\"&&(n.wireframeLinecap=this.wireframeLinecap),this.wireframeLinejoin!==\"round\"&&(n.wireframeLinejoin=this.wireframeLinejoin),this.flatShading===!0&&(n.flatShading=!0),this.visible===!1&&(n.visible=!1),this.toneMapped===!1&&(n.toneMapped=!1),this.fog===!1&&(n.fog=!1),Object.keys(this.userData).length>0&&(n.userData=this.userData);function s(r){let o=[];for(let a in r){let l=r[a];delete l.metadata,o.push(l)}return o}if(e){let r=s(t.textures),o=s(t.images);r.length>0&&(n.textures=r),o.length>0&&(n.images=o)}return n}clone(){return new this.constructor().copy(this)}copy(t){this.name=t.name,this.blending=t.blending,this.side=t.side,this.vertexColors=t.vertexColors,this.opacity=t.opacity,this.transparent=t.transparent,this.blendSrc=t.blendSrc,this.blendDst=t.blendDst,this.blendEquation=t.blendEquation,this.blendSrcAlpha=t.blendSrcAlpha,this.blendDstAlpha=t.blendDstAlpha,this.blendEquationAlpha=t.blendEquationAlpha,this.blendColor.copy(t.blendColor),this.blendAlpha=t.blendAlpha,this.depthFunc=t.depthFunc,this.depthTest=t.depthTest,this.depthWrite=t.depthWrite,this.stencilWriteMask=t.stencilWriteMask,this.stencilFunc=t.stencilFunc,this.stencilRef=t.stencilRef,this.stencilFuncMask=t.stencilFuncMask,this.stencilFail=t.stencilFail,this.stencilZFail=t.stencilZFail,this.stencilZPass=t.stencilZPass,this.stencilWrite=t.stencilWrite;let e=t.clippingPlanes,n=null;if(e!==null){let s=e.length;n=new Array(s);for(let r=0;r!==s;++r)n[r]=e[r].clone()}return this.clippingPlanes=n,this.clipIntersection=t.clipIntersection,this.clipShadows=t.clipShadows,this.shadowSide=t.shadowSide,this.colorWrite=t.colorWrite,this.precision=t.precision,this.polygonOffset=t.polygonOffset,this.polygonOffsetFactor=t.polygonOffsetFactor,this.polygonOffsetUnits=t.polygonOffsetUnits,this.dithering=t.dithering,this.alphaTest=t.alphaTest,this.alphaHash=t.alphaHash,this.alphaToCoverage=t.alphaToCoverage,this.premultipliedAlpha=t.premultipliedAlpha,this.forceSinglePass=t.forceSinglePass,this.visible=t.visible,this.toneMapped=t.toneMapped,this.userData=JSON.parse(JSON.stringify(t.userData)),this}dispose(){this.dispatchEvent({type:\"dispose\"})}set needsUpdate(t){t===!0&&this.version++}},li=class extends yn{constructor(t){super(),this.isMeshBasicMaterial=!0,this.type=\"MeshBasicMaterial\",this.color=new Pt(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=qo,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap=\"round\",this.wireframeLinejoin=\"round\",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.fog=t.fog,this}};var ee=new N,qi=new Lt,ye=class{constructor(t,e,n=!1){if(Array.isArray(t))throw new TypeError(\"THREE.BufferAttribute: array should be a Typed Array.\");this.isBufferAttribute=!0,this.name=\"\",this.array=t,this.itemSize=e,this.count=t!==void 0?t.length/e:0,this.normalized=n,this.usage=Qa,this._updateRange={offset:0,count:-1},this.updateRanges=[],this.gpuType=dn,this.version=0}onUploadCallback(){}set needsUpdate(t){t===!0&&this.version++}get updateRange(){return console.warn(\"THREE.BufferAttribute: updateRange() is deprecated and will be removed in r169. Use addUpdateRange() instead.\"),this._updateRange}setUsage(t){return this.usage=t,this}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}copy(t){return this.name=t.name,this.array=new t.array.constructor(t.array),this.itemSize=t.itemSize,this.count=t.count,this.normalized=t.normalized,this.usage=t.usage,this.gpuType=t.gpuType,this}copyAt(t,e,n){t*=this.itemSize,n*=e.itemSize;for(let s=0,r=this.itemSize;s<r;s++)this.array[t+s]=e.array[n+s];return this}copyArray(t){return this.array.set(t),this}applyMatrix3(t){if(this.itemSize===2)for(let e=0,n=this.count;e<n;e++)qi.fromBufferAttribute(this,e),qi.applyMatrix3(t),this.setXY(e,qi.x,qi.y);else if(this.itemSize===3)for(let e=0,n=this.count;e<n;e++)ee.fromBufferAttribute(this,e),ee.applyMatrix3(t),this.setXYZ(e,ee.x,ee.y,ee.z);return this}applyMatrix4(t){for(let e=0,n=this.count;e<n;e++)ee.fromBufferAttribute(this,e),ee.applyMatrix4(t),this.setXYZ(e,ee.x,ee.y,ee.z);return this}applyNormalMatrix(t){for(let e=0,n=this.count;e<n;e++)ee.fromBufferAttribute(this,e),ee.applyNormalMatrix(t),this.setXYZ(e,ee.x,ee.y,ee.z);return this}transformDirection(t){for(let e=0,n=this.count;e<n;e++)ee.fromBufferAttribute(this,e),ee.transformDirection(t),this.setXYZ(e,ee.x,ee.y,ee.z);return this}set(t,e=0){return this.array.set(t,e),this}getComponent(t,e){let n=this.array[t*this.itemSize+e];return this.normalized&&(n=_i(n,this.array)),n}setComponent(t,e,n){return this.normalized&&(n=be(n,this.array)),this.array[t*this.itemSize+e]=n,this}getX(t){let e=this.array[t*this.itemSize];return this.normalized&&(e=_i(e,this.array)),e}setX(t,e){return this.normalized&&(e=be(e,this.array)),this.array[t*this.itemSize]=e,this}getY(t){let e=this.array[t*this.itemSize+1];return this.normalized&&(e=_i(e,this.array)),e}setY(t,e){return this.normalized&&(e=be(e,this.array)),this.array[t*this.itemSize+1]=e,this}getZ(t){let e=this.array[t*this.itemSize+2];return this.normalized&&(e=_i(e,this.array)),e}setZ(t,e){return this.normalized&&(e=be(e,this.array)),this.array[t*this.itemSize+2]=e,this}getW(t){let e=this.array[t*this.itemSize+3];return this.normalized&&(e=_i(e,this.array)),e}setW(t,e){return this.normalized&&(e=be(e,this.array)),this.array[t*this.itemSize+3]=e,this}setXY(t,e,n){return t*=this.itemSize,this.normalized&&(e=be(e,this.array),n=be(n,this.array)),this.array[t+0]=e,this.array[t+1]=n,this}setXYZ(t,e,n,s){return t*=this.itemSize,this.normalized&&(e=be(e,this.array),n=be(n,this.array),s=be(s,this.array)),this.array[t+0]=e,this.array[t+1]=n,this.array[t+2]=s,this}setXYZW(t,e,n,s,r){return t*=this.itemSize,this.normalized&&(e=be(e,this.array),n=be(n,this.array),s=be(s,this.array),r=be(r,this.array)),this.array[t+0]=e,this.array[t+1]=n,this.array[t+2]=s,this.array[t+3]=r,this}onUpload(t){return this.onUploadCallback=t,this}clone(){return new this.constructor(this.array,this.itemSize).copy(this)}toJSON(){let t={itemSize:this.itemSize,type:this.array.constructor.name,array:Array.from(this.array),normalized:this.normalized};return this.name!==\"\"&&(t.name=this.name),this.usage!==Qa&&(t.usage=this.usage),t}};var Ms=class extends ye{constructor(t,e,n){super(new Uint16Array(t),e,n)}};var Ss=class extends ye{constructor(t,e,n){super(new Uint32Array(t),e,n)}};var Re=class extends ye{constructor(t,e,n){super(new Float32Array(t),e,n)}};var Lc=0,Ie=new oe,fr=new Pe,qn=new N,Ce=new Un,Mi=new Un,ae=new N,Se=class i extends xn{constructor(){super(),this.isBufferGeometry=!0,Object.defineProperty(this,\"id\",{value:Lc++}),this.uuid=Ii(),this.name=\"\",this.type=\"BufferGeometry\",this.index=null,this.attributes={},this.morphAttributes={},this.morphTargetsRelative=!1,this.groups=[],this.boundingBox=null,this.boundingSphere=null,this.drawRange={start:0,count:1/0},this.userData={}}getIndex(){return this.index}setIndex(t){return Array.isArray(t)?this.index=new(il(t)?Ss:Ms)(t,1):this.index=t,this}getAttribute(t){return this.attributes[t]}setAttribute(t,e){return this.attributes[t]=e,this}deleteAttribute(t){return delete this.attributes[t],this}hasAttribute(t){return this.attributes[t]!==void 0}addGroup(t,e,n=0){this.groups.push({start:t,count:e,materialIndex:n})}clearGroups(){this.groups=[]}setDrawRange(t,e){this.drawRange.start=t,this.drawRange.count=e}applyMatrix4(t){let e=this.attributes.position;e!==void 0&&(e.applyMatrix4(t),e.needsUpdate=!0);let n=this.attributes.normal;if(n!==void 0){let r=new zt().getNormalMatrix(t);n.applyNormalMatrix(r),n.needsUpdate=!0}let s=this.attributes.tangent;return s!==void 0&&(s.transformDirection(t),s.needsUpdate=!0),this.boundingBox!==null&&this.computeBoundingBox(),this.boundingSphere!==null&&this.computeBoundingSphere(),this}applyQuaternion(t){return Ie.makeRotationFromQuaternion(t),this.applyMatrix4(Ie),this}rotateX(t){return Ie.makeRotationX(t),this.applyMatrix4(Ie),this}rotateY(t){return Ie.makeRotationY(t),this.applyMatrix4(Ie),this}rotateZ(t){return Ie.makeRotationZ(t),this.applyMatrix4(Ie),this}translate(t,e,n){return Ie.makeTranslation(t,e,n),this.applyMatrix4(Ie),this}scale(t,e,n){return Ie.makeScale(t,e,n),this.applyMatrix4(Ie),this}lookAt(t){return fr.lookAt(t),fr.updateMatrix(),this.applyMatrix4(fr.matrix),this}center(){return this.computeBoundingBox(),this.boundingBox.getCenter(qn).negate(),this.translate(qn.x,qn.y,qn.z),this}setFromPoints(t){let e=[];for(let n=0,s=t.length;n<s;n++){let r=t[n];e.push(r.x,r.y,r.z||0)}return this.setAttribute(\"position\",new Re(e,3)),this}computeBoundingBox(){this.boundingBox===null&&(this.boundingBox=new Un);let t=this.attributes.position,e=this.morphAttributes.position;if(t&&t.isGLBufferAttribute){console.error('THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box. Alternatively set \"mesh.frustumCulled\" to \"false\".',this),this.boundingBox.set(new N(-1/0,-1/0,-1/0),new N(1/0,1/0,1/0));return}if(t!==void 0){if(this.boundingBox.setFromBufferAttribute(t),e)for(let n=0,s=e.length;n<s;n++){let r=e[n];Ce.setFromBufferAttribute(r),this.morphTargetsRelative?(ae.addVectors(this.boundingBox.min,Ce.min),this.boundingBox.expandByPoint(ae),ae.addVectors(this.boundingBox.max,Ce.max),this.boundingBox.expandByPoint(ae)):(this.boundingBox.expandByPoint(Ce.min),this.boundingBox.expandByPoint(Ce.max))}}else this.boundingBox.makeEmpty();(isNaN(this.boundingBox.min.x)||isNaN(this.boundingBox.min.y)||isNaN(this.boundingBox.min.z))&&console.error('THREE.BufferGeometry.computeBoundingBox(): Computed min/max have NaN values. The \"position\" attribute is likely to have NaN values.',this)}computeBoundingSphere(){this.boundingSphere===null&&(this.boundingSphere=new Dn);let t=this.attributes.position,e=this.morphAttributes.position;if(t&&t.isGLBufferAttribute){console.error('THREE.BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere. Alternatively set \"mesh.frustumCulled\" to \"false\".',this),this.boundingSphere.set(new N,1/0);return}if(t){let n=this.boundingSphere.center;if(Ce.setFromBufferAttribute(t),e)for(let r=0,o=e.length;r<o;r++){let a=e[r];Mi.setFromBufferAttribute(a),this.morphTargetsRelative?(ae.addVectors(Ce.min,Mi.min),Ce.expandByPoint(ae),ae.addVectors(Ce.max,Mi.max),Ce.expandByPoint(ae)):(Ce.expandByPoint(Mi.min),Ce.expandByPoint(Mi.max))}Ce.getCenter(n);let s=0;for(let r=0,o=t.count;r<o;r++)ae.fromBufferAttribute(t,r),s=Math.max(s,n.distanceToSquared(ae));if(e)for(let r=0,o=e.length;r<o;r++){let a=e[r],l=this.morphTargetsRelative;for(let c=0,h=a.count;c<h;c++)ae.fromBufferAttribute(a,c),l&&(qn.fromBufferAttribute(t,c),ae.add(qn)),s=Math.max(s,n.distanceToSquared(ae))}this.boundingSphere.radius=Math.sqrt(s),isNaN(this.boundingSphere.radius)&&console.error('THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.',this)}}computeTangents(){let t=this.index,e=this.attributes;if(t===null||e.position===void 0||e.normal===void 0||e.uv===void 0){console.error(\"THREE.BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)\");return}let n=t.array,s=e.position.array,r=e.normal.array,o=e.uv.array,a=s.length/3;this.hasAttribute(\"tangent\")===!1&&this.setAttribute(\"tangent\",new ye(new Float32Array(4*a),4));let l=this.getAttribute(\"tangent\").array,c=[],h=[];for(let b=0;b<a;b++)c[b]=new N,h[b]=new N;let d=new N,f=new N,m=new N,g=new Lt,x=new Lt,p=new Lt,u=new N,w=new N;function v(b,H,K){d.fromArray(s,b*3),f.fromArray(s,H*3),m.fromArray(s,K*3),g.fromArray(o,b*2),x.fromArray(o,H*2),p.fromArray(o,K*2),f.sub(d),m.sub(d),x.sub(g),p.sub(g);let T=1/(x.x*p.y-p.x*x.y);isFinite(T)&&(u.copy(f).multiplyScalar(p.y).addScaledVector(m,-x.y).multiplyScalar(T),w.copy(m).multiplyScalar(x.x).addScaledVector(f,-p.x).multiplyScalar(T),c[b].add(u),c[H].add(u),c[K].add(u),h[b].add(w),h[H].add(w),h[K].add(w))}let P=this.groups;P.length===0&&(P=[{start:0,count:n.length}]);for(let b=0,H=P.length;b<H;++b){let K=P[b],T=K.start,E=K.count;for(let L=T,F=T+E;L<F;L+=3)v(n[L+0],n[L+1],n[L+2])}let U=new N,R=new N,C=new N,Y=new N;function S(b){C.fromArray(r,b*3),Y.copy(C);let H=c[b];U.copy(H),U.sub(C.multiplyScalar(C.dot(H))).normalize(),R.crossVectors(Y,H);let T=R.dot(h[b])<0?-1:1;l[b*4]=U.x,l[b*4+1]=U.y,l[b*4+2]=U.z,l[b*4+3]=T}for(let b=0,H=P.length;b<H;++b){let K=P[b],T=K.start,E=K.count;for(let L=T,F=T+E;L<F;L+=3)S(n[L+0]),S(n[L+1]),S(n[L+2])}}computeVertexNormals(){let t=this.index,e=this.getAttribute(\"position\");if(e!==void 0){let n=this.getAttribute(\"normal\");if(n===void 0)n=new ye(new Float32Array(e.count*3),3),this.setAttribute(\"normal\",n);else for(let f=0,m=n.count;f<m;f++)n.setXYZ(f,0,0,0);let s=new N,r=new N,o=new N,a=new N,l=new N,c=new N,h=new N,d=new N;if(t)for(let f=0,m=t.count;f<m;f+=3){let g=t.getX(f+0),x=t.getX(f+1),p=t.getX(f+2);s.fromBufferAttribute(e,g),r.fromBufferAttribute(e,x),o.fromBufferAttribute(e,p),h.subVectors(o,r),d.subVectors(s,r),h.cross(d),a.fromBufferAttribute(n,g),l.fromBufferAttribute(n,x),c.fromBufferAttribute(n,p),a.add(h),l.add(h),c.add(h),n.setXYZ(g,a.x,a.y,a.z),n.setXYZ(x,l.x,l.y,l.z),n.setXYZ(p,c.x,c.y,c.z)}else for(let f=0,m=e.count;f<m;f+=3)s.fromBufferAttribute(e,f+0),r.fromBufferAttribute(e,f+1),o.fromBufferAttribute(e,f+2),h.subVectors(o,r),d.subVectors(s,r),h.cross(d),n.setXYZ(f+0,h.x,h.y,h.z),n.setXYZ(f+1,h.x,h.y,h.z),n.setXYZ(f+2,h.x,h.y,h.z);this.normalizeNormals(),n.needsUpdate=!0}}normalizeNormals(){let t=this.attributes.normal;for(let e=0,n=t.count;e<n;e++)ae.fromBufferAttribute(t,e),ae.normalize(),t.setXYZ(e,ae.x,ae.y,ae.z)}toNonIndexed(){function t(a,l){let c=a.array,h=a.itemSize,d=a.normalized,f=new c.constructor(l.length*h),m=0,g=0;for(let x=0,p=l.length;x<p;x++){a.isInterleavedBufferAttribute?m=l[x]*a.data.stride+a.offset:m=l[x]*h;for(let u=0;u<h;u++)f[g++]=c[m++]}return new ye(f,h,d)}if(this.index===null)return console.warn(\"THREE.BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed.\"),this;let e=new i,n=this.index.array,s=this.attributes;for(let a in s){let l=s[a],c=t(l,n);e.setAttribute(a,c)}let r=this.morphAttributes;for(let a in r){let l=[],c=r[a];for(let h=0,d=c.length;h<d;h++){let f=c[h],m=t(f,n);l.push(m)}e.morphAttributes[a]=l}e.morphTargetsRelative=this.morphTargetsRelative;let o=this.groups;for(let a=0,l=o.length;a<l;a++){let c=o[a];e.addGroup(c.start,c.count,c.materialIndex)}return e}toJSON(){let t={metadata:{version:4.6,type:\"BufferGeometry\",generator:\"BufferGeometry.toJSON\"}};if(t.uuid=this.uuid,t.type=this.type,this.name!==\"\"&&(t.name=this.name),Object.keys(this.userData).length>0&&(t.userData=this.userData),this.parameters!==void 0){let l=this.parameters;for(let c in l)l[c]!==void 0&&(t[c]=l[c]);return t}t.data={attributes:{}};let e=this.index;e!==null&&(t.data.index={type:e.array.constructor.name,array:Array.prototype.slice.call(e.array)});let n=this.attributes;for(let l in n){let c=n[l];t.data.attributes[l]=c.toJSON(t.data)}let s={},r=!1;for(let l in this.morphAttributes){let c=this.morphAttributes[l],h=[];for(let d=0,f=c.length;d<f;d++){let m=c[d];h.push(m.toJSON(t.data))}h.length>0&&(s[l]=h,r=!0)}r&&(t.data.morphAttributes=s,t.data.morphTargetsRelative=this.morphTargetsRelative);let o=this.groups;o.length>0&&(t.data.groups=JSON.parse(JSON.stringify(o)));let a=this.boundingSphere;return a!==null&&(t.data.boundingSphere={center:a.center.toArray(),radius:a.radius}),t}clone(){return new this.constructor().copy(this)}copy(t){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;let e={};this.name=t.name;let n=t.index;n!==null&&this.setIndex(n.clone(e));let s=t.attributes;for(let c in s){let h=s[c];this.setAttribute(c,h.clone(e))}let r=t.morphAttributes;for(let c in r){let h=[],d=r[c];for(let f=0,m=d.length;f<m;f++)h.push(d[f].clone(e));this.morphAttributes[c]=h}this.morphTargetsRelative=t.morphTargetsRelative;let o=t.groups;for(let c=0,h=o.length;c<h;c++){let d=o[c];this.addGroup(d.start,d.count,d.materialIndex)}let a=t.boundingBox;a!==null&&(this.boundingBox=a.clone());let l=t.boundingSphere;return l!==null&&(this.boundingSphere=l.clone()),this.drawRange.start=t.drawRange.start,this.drawRange.count=t.drawRange.count,this.userData=t.userData,this}dispose(){this.dispatchEvent({type:\"dispose\"})}},fo=new oe,wn=new wi,Yi=new Dn,po=new N,Yn=new N,Zn=new N,Jn=new N,pr=new N,Zi=new N,Ji=new Lt,$i=new Lt,Ki=new Lt,mo=new N,go=new N,_o=new N,Qi=new N,ji=new N,Ne=class extends Pe{constructor(t=new Se,e=new li){super(),this.isMesh=!0,this.type=\"Mesh\",this.geometry=t,this.material=e,this.updateMorphTargets()}copy(t,e){return super.copy(t,e),t.morphTargetInfluences!==void 0&&(this.morphTargetInfluences=t.morphTargetInfluences.slice()),t.morphTargetDictionary!==void 0&&(this.morphTargetDictionary=Object.assign({},t.morphTargetDictionary)),this.material=Array.isArray(t.material)?t.material.slice():t.material,this.geometry=t.geometry,this}updateMorphTargets(){let e=this.geometry.morphAttributes,n=Object.keys(e);if(n.length>0){let s=e[n[0]];if(s!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,o=s.length;r<o;r++){let a=s[r].name||String(r);this.morphTargetInfluences.push(0),this.morphTargetDictionary[a]=r}}}}getVertexPosition(t,e){let n=this.geometry,s=n.attributes.position,r=n.morphAttributes.position,o=n.morphTargetsRelative;e.fromBufferAttribute(s,t);let a=this.morphTargetInfluences;if(r&&a){Zi.set(0,0,0);for(let l=0,c=r.length;l<c;l++){let h=a[l],d=r[l];h!==0&&(pr.fromBufferAttribute(d,t),o?Zi.addScaledVector(pr,h):Zi.addScaledVector(pr.sub(e),h))}e.add(Zi)}return e}raycast(t,e){let n=this.geometry,s=this.material,r=this.matrixWorld;s!==void 0&&(n.boundingSphere===null&&n.computeBoundingSphere(),Yi.copy(n.boundingSphere),Yi.applyMatrix4(r),wn.copy(t.ray).recast(t.near),!(Yi.containsPoint(wn.origin)===!1&&(wn.intersectSphere(Yi,po)===null||wn.origin.distanceToSquared(po)>(t.far-t.near)**2))&&(fo.copy(r).invert(),wn.copy(t.ray).applyMatrix4(fo),!(n.boundingBox!==null&&wn.intersectsBox(n.boundingBox)===!1)&&this._computeIntersections(t,e,wn)))}_computeIntersections(t,e,n){let s,r=this.geometry,o=this.material,a=r.index,l=r.attributes.position,c=r.attributes.uv,h=r.attributes.uv1,d=r.attributes.normal,f=r.groups,m=r.drawRange;if(a!==null)if(Array.isArray(o))for(let g=0,x=f.length;g<x;g++){let p=f[g],u=o[p.materialIndex],w=Math.max(p.start,m.start),v=Math.min(a.count,Math.min(p.start+p.count,m.start+m.count));for(let P=w,U=v;P<U;P+=3){let R=a.getX(P),C=a.getX(P+1),Y=a.getX(P+2);s=ts(this,u,t,n,c,h,d,R,C,Y),s&&(s.faceIndex=Math.floor(P/3),s.face.materialIndex=p.materialIndex,e.push(s))}}else{let g=Math.max(0,m.start),x=Math.min(a.count,m.start+m.count);for(let p=g,u=x;p<u;p+=3){let w=a.getX(p),v=a.getX(p+1),P=a.getX(p+2);s=ts(this,o,t,n,c,h,d,w,v,P),s&&(s.faceIndex=Math.floor(p/3),e.push(s))}}else if(l!==void 0)if(Array.isArray(o))for(let g=0,x=f.length;g<x;g++){let p=f[g],u=o[p.materialIndex],w=Math.max(p.start,m.start),v=Math.min(l.count,Math.min(p.start+p.count,m.start+m.count));for(let P=w,U=v;P<U;P+=3){let R=P,C=P+1,Y=P+2;s=ts(this,u,t,n,c,h,d,R,C,Y),s&&(s.faceIndex=Math.floor(P/3),s.face.materialIndex=p.materialIndex,e.push(s))}}else{let g=Math.max(0,m.start),x=Math.min(l.count,m.start+m.count);for(let p=g,u=x;p<u;p+=3){let w=p,v=p+1,P=p+2;s=ts(this,o,t,n,c,h,d,w,v,P),s&&(s.faceIndex=Math.floor(p/3),e.push(s))}}}};function Ic(i,t,e,n,s,r,o,a){let l;if(t.side===we?l=n.intersectTriangle(o,r,s,!0,a):l=n.intersectTriangle(s,r,o,t.side===gn,a),l===null)return null;ji.copy(a),ji.applyMatrix4(i.matrixWorld);let c=e.ray.origin.distanceTo(ji);return c<e.near||c>e.far?null:{distance:c,point:ji.clone(),object:i}}function ts(i,t,e,n,s,r,o,a,l,c){i.getVertexPosition(a,Yn),i.getVertexPosition(l,Zn),i.getVertexPosition(c,Jn);let h=Ic(i,t,e,n,Yn,Zn,Jn,Qi);if(h){s&&(Ji.fromBufferAttribute(s,a),$i.fromBufferAttribute(s,l),Ki.fromBufferAttribute(s,c),h.uv=jn.getInterpolation(Qi,Yn,Zn,Jn,Ji,$i,Ki,new Lt)),r&&(Ji.fromBufferAttribute(r,a),$i.fromBufferAttribute(r,l),Ki.fromBufferAttribute(r,c),h.uv1=jn.getInterpolation(Qi,Yn,Zn,Jn,Ji,$i,Ki,new Lt),h.uv2=h.uv1),o&&(mo.fromBufferAttribute(o,a),go.fromBufferAttribute(o,l),_o.fromBufferAttribute(o,c),h.normal=jn.getInterpolation(Qi,Yn,Zn,Jn,mo,go,_o,new N),h.normal.dot(n.direction)>0&&h.normal.multiplyScalar(-1));let d={a,b:l,c,normal:new N,materialIndex:0};jn.getNormal(Yn,Zn,Jn,d.normal),h.face=d}return h}var Ti=class i extends Se{constructor(t=1,e=1,n=1,s=1,r=1,o=1){super(),this.type=\"BoxGeometry\",this.parameters={width:t,height:e,depth:n,widthSegments:s,heightSegments:r,depthSegments:o};let a=this;s=Math.floor(s),r=Math.floor(r),o=Math.floor(o);let l=[],c=[],h=[],d=[],f=0,m=0;g(\"z\",\"y\",\"x\",-1,-1,n,e,t,o,r,0),g(\"z\",\"y\",\"x\",1,-1,n,e,-t,o,r,1),g(\"x\",\"z\",\"y\",1,1,t,n,e,s,o,2),g(\"x\",\"z\",\"y\",1,-1,t,n,-e,s,o,3),g(\"x\",\"y\",\"z\",1,-1,t,e,n,s,r,4),g(\"x\",\"y\",\"z\",-1,-1,t,e,-n,s,r,5),this.setIndex(l),this.setAttribute(\"position\",new Re(c,3)),this.setAttribute(\"normal\",new Re(h,3)),this.setAttribute(\"uv\",new Re(d,2));function g(x,p,u,w,v,P,U,R,C,Y,S){let b=P/C,H=U/Y,K=P/2,T=U/2,E=R/2,L=C+1,F=Y+1,I=0,G=0,X=new N;for(let Z=0;Z<F;Z++){let $=Z*H-T;for(let et=0;et<L;et++){let W=et*b-K;X[x]=W*w,X[p]=$*v,X[u]=E,c.push(X.x,X.y,X.z),X[x]=0,X[p]=0,X[u]=R>0?1:-1,h.push(X.x,X.y,X.z),d.push(et/C),d.push(1-Z/Y),I+=1}}for(let Z=0;Z<Y;Z++)for(let $=0;$<C;$++){let et=f+$+L*Z,W=f+$+L*(Z+1),q=f+($+1)+L*(Z+1),st=f+($+1)+L*Z;l.push(et,W,st),l.push(W,q,st),G+=6}a.addGroup(m,G,S),m+=G,f+=I}}copy(t){return super.copy(t),this.parameters=Object.assign({},t.parameters),this}static fromJSON(t){return new i(t.width,t.height,t.depth,t.widthSegments,t.heightSegments,t.depthSegments)}};function ci(i){let t={};for(let e in i){t[e]={};for(let n in i[e]){let s=i[e][n];s&&(s.isColor||s.isMatrix3||s.isMatrix4||s.isVector2||s.isVector3||s.isVector4||s.isTexture||s.isQuaternion)?s.isRenderTargetTexture?(console.warn(\"UniformsUtils: Textures of render targets cannot be cloned via cloneUniforms() or mergeUniforms().\"),t[e][n]=null):t[e][n]=s.clone():Array.isArray(s)?t[e][n]=s.slice():t[e][n]=s}}return t}function _e(i){let t={};for(let e=0;e<i.length;e++){let n=ci(i[e]);for(let s in n)t[s]=n[s]}return t}function Uc(i){let t=[];for(let e=0;e<i.length;e++)t.push(i[e].clone());return t}function rl(i){return i.getRenderTarget()===null?i.outputColorSpace:Wt.workingColorSpace}var di={clone:ci,merge:_e},Dc=`void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}`,Nc=`void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}`,ue=class extends yn{constructor(t){super(),this.isShaderMaterial=!0,this.type=\"ShaderMaterial\",this.defines={},this.uniforms={},this.uniformsGroups=[],this.vertexShader=Dc,this.fragmentShader=Nc,this.linewidth=1,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.lights=!1,this.clipping=!1,this.forceSinglePass=!0,this.extensions={derivatives:!1,fragDepth:!1,drawBuffers:!1,shaderTextureLOD:!1,clipCullDistance:!1},this.defaultAttributeValues={color:[1,1,1],uv:[0,0],uv1:[0,0]},this.index0AttributeName=void 0,this.uniformsNeedUpdate=!1,this.glslVersion=null,t!==void 0&&this.setValues(t)}copy(t){return super.copy(t),this.fragmentShader=t.fragmentShader,this.vertexShader=t.vertexShader,this.uniforms=ci(t.uniforms),this.uniformsGroups=Uc(t.uniformsGroups),this.defines=Object.assign({},t.defines),this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.fog=t.fog,this.lights=t.lights,this.clipping=t.clipping,this.extensions=Object.assign({},t.extensions),this.glslVersion=t.glslVersion,this}toJSON(t){let e=super.toJSON(t);e.glslVersion=this.glslVersion,e.uniforms={};for(let s in this.uniforms){let o=this.uniforms[s].value;o&&o.isTexture?e.uniforms[s]={type:\"t\",value:o.toJSON(t).uuid}:o&&o.isColor?e.uniforms[s]={type:\"c\",value:o.getHex()}:o&&o.isVector2?e.uniforms[s]={type:\"v2\",value:o.toArray()}:o&&o.isVector3?e.uniforms[s]={type:\"v3\",value:o.toArray()}:o&&o.isVector4?e.uniforms[s]={type:\"v4\",value:o.toArray()}:o&&o.isMatrix3?e.uniforms[s]={type:\"m3\",value:o.toArray()}:o&&o.isMatrix4?e.uniforms[s]={type:\"m4\",value:o.toArray()}:e.uniforms[s]={value:o}}Object.keys(this.defines).length>0&&(e.defines=this.defines),e.vertexShader=this.vertexShader,e.fragmentShader=this.fragmentShader,e.lights=this.lights,e.clipping=this.clipping;let n={};for(let s in this.extensions)this.extensions[s]===!0&&(n[s]=!0);return Object.keys(n).length>0&&(e.extensions=n),e}},bs=class extends Pe{constructor(){super(),this.isCamera=!0,this.type=\"Camera\",this.matrixWorldInverse=new oe,this.projectionMatrix=new oe,this.projectionMatrixInverse=new oe,this.coordinateSystem=sn}copy(t,e){return super.copy(t,e),this.matrixWorldInverse.copy(t.matrixWorldInverse),this.projectionMatrix.copy(t.projectionMatrix),this.projectionMatrixInverse.copy(t.projectionMatrixInverse),this.coordinateSystem=t.coordinateSystem,this}getWorldDirection(t){return super.getWorldDirection(t).negate()}updateMatrixWorld(t){super.updateMatrixWorld(t),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(t,e){super.updateWorldMatrix(t,e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return new this.constructor().copy(this)}},ve=class extends bs{constructor(t=50,e=1,n=.1,s=2e3){super(),this.isPerspectiveCamera=!0,this.type=\"PerspectiveCamera\",this.fov=t,this.zoom=1,this.near=n,this.far=s,this.focus=10,this.aspect=e,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(t,e){return super.copy(t,e),this.fov=t.fov,this.zoom=t.zoom,this.near=t.near,this.far=t.far,this.focus=t.focus,this.aspect=t.aspect,this.view=t.view===null?null:Object.assign({},t.view),this.filmGauge=t.filmGauge,this.filmOffset=t.filmOffset,this}setFocalLength(t){let e=.5*this.getFilmHeight()/t;this.fov=Rr*2*Math.atan(e),this.updateProjectionMatrix()}getFocalLength(){let t=Math.tan(Ks*.5*this.fov);return .5*this.getFilmHeight()/t}getEffectiveFOV(){return Rr*2*Math.atan(Math.tan(Ks*.5*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}setViewOffset(t,e,n,s,r,o){this.aspect=t/e,this.view===null&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=n,this.view.offsetY=s,this.view.width=r,this.view.height=o,this.updateProjectionMatrix()}clearViewOffset(){this.view!==null&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){let t=this.near,e=t*Math.tan(Ks*.5*this.fov)/this.zoom,n=2*e,s=this.aspect*n,r=-.5*s,o=this.view;if(this.view!==null&&this.view.enabled){let l=o.fullWidth,c=o.fullHeight;r+=o.offsetX*s/l,e-=o.offsetY*n/c,s*=o.width/l,n*=o.height/c}let a=this.filmOffset;a!==0&&(r+=t*a/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+s,e,e-n,t,this.far,this.coordinateSystem),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(t){let e=super.toJSON(t);return e.object.fov=this.fov,e.object.zoom=this.zoom,e.object.near=this.near,e.object.far=this.far,e.object.focus=this.focus,e.object.aspect=this.aspect,this.view!==null&&(e.object.view=Object.assign({},this.view)),e.object.filmGauge=this.filmGauge,e.object.filmOffset=this.filmOffset,e}},$n=-90,Kn=1,Ur=class extends Pe{constructor(t,e,n){super(),this.type=\"CubeCamera\",this.renderTarget=n,this.coordinateSystem=null,this.activeMipmapLevel=0;let s=new ve($n,Kn,t,e);s.layers=this.layers,this.add(s);let r=new ve($n,Kn,t,e);r.layers=this.layers,this.add(r);let o=new ve($n,Kn,t,e);o.layers=this.layers,this.add(o);let a=new ve($n,Kn,t,e);a.layers=this.layers,this.add(a);let l=new ve($n,Kn,t,e);l.layers=this.layers,this.add(l);let c=new ve($n,Kn,t,e);c.layers=this.layers,this.add(c)}updateCoordinateSystem(){let t=this.coordinateSystem,e=this.children.concat(),[n,s,r,o,a,l]=e;for(let c of e)this.remove(c);if(t===sn)n.up.set(0,1,0),n.lookAt(1,0,0),s.up.set(0,1,0),s.lookAt(-1,0,0),r.up.set(0,0,-1),r.lookAt(0,1,0),o.up.set(0,0,1),o.lookAt(0,-1,0),a.up.set(0,1,0),a.lookAt(0,0,1),l.up.set(0,1,0),l.lookAt(0,0,-1);else if(t===ps)n.up.set(0,-1,0),n.lookAt(-1,0,0),s.up.set(0,-1,0),s.lookAt(1,0,0),r.up.set(0,0,1),r.lookAt(0,1,0),o.up.set(0,0,-1),o.lookAt(0,-1,0),a.up.set(0,-1,0),a.lookAt(0,0,1),l.up.set(0,-1,0),l.lookAt(0,0,-1);else throw new Error(\"THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: \"+t);for(let c of e)this.add(c),c.updateMatrixWorld()}update(t,e){this.parent===null&&this.updateMatrixWorld();let{renderTarget:n,activeMipmapLevel:s}=this;this.coordinateSystem!==t.coordinateSystem&&(this.coordinateSystem=t.coordinateSystem,this.updateCoordinateSystem());let[r,o,a,l,c,h]=this.children,d=t.getRenderTarget(),f=t.getActiveCubeFace(),m=t.getActiveMipmapLevel(),g=t.xr.enabled;t.xr.enabled=!1;let x=n.texture.generateMipmaps;n.texture.generateMipmaps=!1,t.setRenderTarget(n,0,s),t.render(e,r),t.setRenderTarget(n,1,s),t.render(e,o),t.setRenderTarget(n,2,s),t.render(e,a),t.setRenderTarget(n,3,s),t.render(e,l),t.setRenderTarget(n,4,s),t.render(e,c),n.texture.generateMipmaps=x,t.setRenderTarget(n,5,s),t.render(e,h),t.setRenderTarget(d,f,m),t.xr.enabled=g,n.texture.needsPMREMUpdate=!0}},Es=class extends He{constructor(t,e,n,s,r,o,a,l,c,h){t=t!==void 0?t:[],e=e!==void 0?e:ri,super(t,e,n,s,r,o,a,l,c,h),this.isCubeTexture=!0,this.flipY=!1}get images(){return this.image}set images(t){this.image=t}},Dr=class extends Me{constructor(t=1,e={}){super(t,t,e),this.isWebGLCubeRenderTarget=!0;let n={width:t,height:t,depth:1},s=[n,n,n,n,n,n];e.encoding!==void 0&&(Si(\"THREE.WebGLCubeRenderTarget: option.encoding has been replaced by option.colorSpace.\"),e.colorSpace=e.encoding===In?ce:De),this.texture=new Es(s,e.mapping,e.wrapS,e.wrapT,e.magFilter,e.minFilter,e.format,e.type,e.anisotropy,e.colorSpace),this.texture.isRenderTargetTexture=!0,this.texture.generateMipmaps=e.generateMipmaps!==void 0?e.generateMipmaps:!1,this.texture.minFilter=e.minFilter!==void 0?e.minFilter:Ue}fromEquirectangularTexture(t,e){this.texture.type=e.type,this.texture.colorSpace=e.colorSpace,this.texture.generateMipmaps=e.generateMipmaps,this.texture.minFilter=e.minFilter,this.texture.magFilter=e.magFilter;let n={uniforms:{tEquirect:{value:null}},vertexShader:`\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include <begin_vertex>\n\t\t\t\t\t#include <project_vertex>\n\n\t\t\t\t}\n\t\t\t`,fragmentShader:`\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include <common>\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t`},s=new Ti(5,5,5),r=new ue({name:\"CubemapFromEquirect\",uniforms:ci(n.uniforms),vertexShader:n.vertexShader,fragmentShader:n.fragmentShader,side:we,blending:Ye});r.uniforms.tEquirect.value=e;let o=new Ne(s,r),a=e.minFilter;return e.minFilter===Ei&&(e.minFilter=Ue),new Ur(1,10,this).update(t,o),e.minFilter=a,o.geometry.dispose(),o.material.dispose(),this}clear(t,e,n,s){let r=t.getRenderTarget();for(let o=0;o<6;o++)t.setRenderTarget(this,o),t.clear(e,n,s);t.setRenderTarget(r)}},mr=new N,Fc=new N,Oc=new zt,en=class{constructor(t=new N(1,0,0),e=0){this.isPlane=!0,this.normal=t,this.constant=e}set(t,e){return this.normal.copy(t),this.constant=e,this}setComponents(t,e,n,s){return this.normal.set(t,e,n),this.constant=s,this}setFromNormalAndCoplanarPoint(t,e){return this.normal.copy(t),this.constant=-e.dot(this.normal),this}setFromCoplanarPoints(t,e,n){let s=mr.subVectors(n,e).cross(Fc.subVectors(t,e)).normalize();return this.setFromNormalAndCoplanarPoint(s,t),this}copy(t){return this.normal.copy(t.normal),this.constant=t.constant,this}normalize(){let t=1/this.normal.length();return this.normal.multiplyScalar(t),this.constant*=t,this}negate(){return this.constant*=-1,this.normal.negate(),this}distanceToPoint(t){return this.normal.dot(t)+this.constant}distanceToSphere(t){return this.distanceToPoint(t.center)-t.radius}projectPoint(t,e){return e.copy(t).addScaledVector(this.normal,-this.distanceToPoint(t))}intersectLine(t,e){let n=t.delta(mr),s=this.normal.dot(n);if(s===0)return this.distanceToPoint(t.start)===0?e.copy(t.start):null;let r=-(t.start.dot(this.normal)+this.constant)/s;return r<0||r>1?null:e.copy(t.start).addScaledVector(n,r)}intersectsLine(t){let e=this.distanceToPoint(t.start),n=this.distanceToPoint(t.end);return e<0&&n>0||n<0&&e>0}intersectsBox(t){return t.intersectsPlane(this)}intersectsSphere(t){return t.intersectsPlane(this)}coplanarPoint(t){return t.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(t,e){let n=e||Oc.getNormalMatrix(t),s=this.coplanarPoint(mr).applyMatrix4(t),r=this.normal.applyMatrix3(n).normalize();return this.constant=-s.dot(r),this}translate(t){return this.constant-=t.dot(this.normal),this}equals(t){return t.normal.equals(this.normal)&&t.constant===this.constant}clone(){return new this.constructor().copy(this)}},Tn=new Dn,es=new N,ws=class{constructor(t=new en,e=new en,n=new en,s=new en,r=new en,o=new en){this.planes=[t,e,n,s,r,o]}set(t,e,n,s,r,o){let a=this.planes;return a[0].copy(t),a[1].copy(e),a[2].copy(n),a[3].copy(s),a[4].copy(r),a[5].copy(o),this}copy(t){let e=this.planes;for(let n=0;n<6;n++)e[n].copy(t.planes[n]);return this}setFromProjectionMatrix(t,e=sn){let n=this.planes,s=t.elements,r=s[0],o=s[1],a=s[2],l=s[3],c=s[4],h=s[5],d=s[6],f=s[7],m=s[8],g=s[9],x=s[10],p=s[11],u=s[12],w=s[13],v=s[14],P=s[15];if(n[0].setComponents(l-r,f-c,p-m,P-u).normalize(),n[1].setComponents(l+r,f+c,p+m,P+u).normalize(),n[2].setComponents(l+o,f+h,p+g,P+w).normalize(),n[3].setComponents(l-o,f-h,p-g,P-w).normalize(),n[4].setComponents(l-a,f-d,p-x,P-v).normalize(),e===sn)n[5].setComponents(l+a,f+d,p+x,P+v).normalize();else if(e===ps)n[5].setComponents(a,d,x,v).normalize();else throw new Error(\"THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: \"+e);return this}intersectsObject(t){if(t.boundingSphere!==void 0)t.boundingSphere===null&&t.computeBoundingSphere(),Tn.copy(t.boundingSphere).applyMatrix4(t.matrixWorld);else{let e=t.geometry;e.boundingSphere===null&&e.computeBoundingSphere(),Tn.copy(e.boundingSphere).applyMatrix4(t.matrixWorld)}return this.intersectsSphere(Tn)}intersectsSprite(t){return Tn.center.set(0,0,0),Tn.radius=.7071067811865476,Tn.applyMatrix4(t.matrixWorld),this.intersectsSphere(Tn)}intersectsSphere(t){let e=this.planes,n=t.center,s=-t.radius;for(let r=0;r<6;r++)if(e[r].distanceToPoint(n)<s)return!1;return!0}intersectsBox(t){let e=this.planes;for(let n=0;n<6;n++){let s=e[n];if(es.x=s.normal.x>0?t.max.x:t.min.x,es.y=s.normal.y>0?t.max.y:t.min.y,es.z=s.normal.z>0?t.max.z:t.min.z,s.distanceToPoint(es)<0)return!1}return!0}containsPoint(t){let e=this.planes;for(let n=0;n<6;n++)if(e[n].distanceToPoint(t)<0)return!1;return!0}clone(){return new this.constructor().copy(this)}};function al(){let i=null,t=!1,e=null,n=null;function s(r,o){e(r,o),n=i.requestAnimationFrame(s)}return{start:function(){t!==!0&&e!==null&&(n=i.requestAnimationFrame(s),t=!0)},stop:function(){i.cancelAnimationFrame(n),t=!1},setAnimationLoop:function(r){e=r},setContext:function(r){i=r}}}function Bc(i,t){let e=t.isWebGL2,n=new WeakMap;function s(c,h){let d=c.array,f=c.usage,m=d.byteLength,g=i.createBuffer();i.bindBuffer(h,g),i.bufferData(h,d,f),c.onUploadCallback();let x;if(d instanceof Float32Array)x=i.FLOAT;else if(d instanceof Uint16Array)if(c.isFloat16BufferAttribute)if(e)x=i.HALF_FLOAT;else throw new Error(\"THREE.WebGLAttributes: Usage of Float16BufferAttribute requires WebGL2.\");else x=i.UNSIGNED_SHORT;else if(d instanceof Int16Array)x=i.SHORT;else if(d instanceof Uint32Array)x=i.UNSIGNED_INT;else if(d instanceof Int32Array)x=i.INT;else if(d instanceof Int8Array)x=i.BYTE;else if(d instanceof Uint8Array)x=i.UNSIGNED_BYTE;else if(d instanceof Uint8ClampedArray)x=i.UNSIGNED_BYTE;else throw new Error(\"THREE.WebGLAttributes: Unsupported buffer data format: \"+d);return{buffer:g,type:x,bytesPerElement:d.BYTES_PER_ELEMENT,version:c.version,size:m}}function r(c,h,d){let f=h.array,m=h._updateRange,g=h.updateRanges;if(i.bindBuffer(d,c),m.count===-1&&g.length===0&&i.bufferSubData(d,0,f),g.length!==0){for(let x=0,p=g.length;x<p;x++){let u=g[x];e?i.bufferSubData(d,u.start*f.BYTES_PER_ELEMENT,f,u.start,u.count):i.bufferSubData(d,u.start*f.BYTES_PER_ELEMENT,f.subarray(u.start,u.start+u.count))}h.clearUpdateRanges()}m.count!==-1&&(e?i.bufferSubData(d,m.offset*f.BYTES_PER_ELEMENT,f,m.offset,m.count):i.bufferSubData(d,m.offset*f.BYTES_PER_ELEMENT,f.subarray(m.offset,m.offset+m.count)),m.count=-1),h.onUploadCallback()}function o(c){return c.isInterleavedBufferAttribute&&(c=c.data),n.get(c)}function a(c){c.isInterleavedBufferAttribute&&(c=c.data);let h=n.get(c);h&&(i.deleteBuffer(h.buffer),n.delete(c))}function l(c,h){if(c.isGLBufferAttribute){let f=n.get(c);(!f||f.version<c.version)&&n.set(c,{buffer:c.buffer,type:c.type,bytesPerElement:c.elementSize,version:c.version});return}c.isInterleavedBufferAttribute&&(c=c.data);let d=n.get(c);if(d===void 0)n.set(c,s(c,h));else if(d.version<c.version){if(d.size!==c.array.byteLength)throw new Error(\"THREE.WebGLAttributes: The size of the buffer attribute's array buffer does not match the original size. Resizing buffer attributes is not supported.\");r(d.buffer,c,h),d.version=c.version}}return{get:o,remove:a,update:l}}var Nr=class i extends Se{constructor(t=1,e=1,n=1,s=1){super(),this.type=\"PlaneGeometry\",this.parameters={width:t,height:e,widthSegments:n,heightSegments:s};let r=t/2,o=e/2,a=Math.floor(n),l=Math.floor(s),c=a+1,h=l+1,d=t/a,f=e/l,m=[],g=[],x=[],p=[];for(let u=0;u<h;u++){let w=u*f-o;for(let v=0;v<c;v++){let P=v*d-r;g.push(P,-w,0),x.push(0,0,1),p.push(v/a),p.push(1-u/l)}}for(let u=0;u<l;u++)for(let w=0;w<a;w++){let v=w+c*u,P=w+c*(u+1),U=w+1+c*(u+1),R=w+1+c*u;m.push(v,P,R),m.push(P,U,R)}this.setIndex(m),this.setAttribute(\"position\",new Re(g,3)),this.setAttribute(\"normal\",new Re(x,3)),this.setAttribute(\"uv\",new Re(p,2))}copy(t){return super.copy(t),this.parameters=Object.assign({},t.parameters),this}static fromJSON(t){return new i(t.width,t.height,t.widthSegments,t.heightSegments)}},zc=`#ifdef USE_ALPHAHASH\n\tif ( diffuseColor.a < getAlphaHashThreshold( vPosition ) ) discard;\n#endif`,Vc=`#ifdef USE_ALPHAHASH\n\tconst float ALPHA_HASH_SCALE = 0.05;\n\tfloat hash2D( vec2 value ) {\n\t\treturn fract( 1.0e4 * sin( 17.0 * value.x + 0.1 * value.y ) * ( 0.1 + abs( sin( 13.0 * value.y + value.x ) ) ) );\n\t}\n\tfloat hash3D( vec3 value ) {\n\t\treturn hash2D( vec2( hash2D( value.xy ), value.z ) );\n\t}\n\tfloat getAlphaHashThreshold( vec3 position ) {\n\t\tfloat maxDeriv = max(\n\t\t\tlength( dFdx( position.xyz ) ),\n\t\t\tlength( dFdy( position.xyz ) )\n\t\t);\n\t\tfloat pixScale = 1.0 / ( ALPHA_HASH_SCALE * maxDeriv );\n\t\tvec2 pixScales = vec2(\n\t\t\texp2( floor( log2( pixScale ) ) ),\n\t\t\texp2( ceil( log2( pixScale ) ) )\n\t\t);\n\t\tvec2 alpha = vec2(\n\t\t\thash3D( floor( pixScales.x * position.xyz ) ),\n\t\t\thash3D( floor( pixScales.y * position.xyz ) )\n\t\t);\n\t\tfloat lerpFactor = fract( log2( pixScale ) );\n\t\tfloat x = ( 1.0 - lerpFactor ) * alpha.x + lerpFactor * alpha.y;\n\t\tfloat a = min( lerpFactor, 1.0 - lerpFactor );\n\t\tvec3 cases = vec3(\n\t\t\tx * x / ( 2.0 * a * ( 1.0 - a ) ),\n\t\t\t( x - 0.5 * a ) / ( 1.0 - a ),\n\t\t\t1.0 - ( ( 1.0 - x ) * ( 1.0 - x ) / ( 2.0 * a * ( 1.0 - a ) ) )\n\t\t);\n\t\tfloat threshold = ( x < ( 1.0 - a ) )\n\t\t\t? ( ( x < a ) ? cases.x : cases.y )\n\t\t\t: cases.z;\n\t\treturn clamp( threshold , 1.0e-6, 1.0 );\n\t}\n#endif`,kc=`#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vAlphaMapUv ).g;\n#endif`,Hc=`#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif`,Gc=`#ifdef USE_ALPHATEST\n\tif ( diffuseColor.a < alphaTest ) discard;\n#endif`,Wc=`#ifdef USE_ALPHATEST\n\tuniform float alphaTest;\n#endif`,Xc=`#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vAoMapUv ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_CLEARCOAT ) \n\t\tclearcoatSpecularIndirect *= ambientOcclusion;\n\t#endif\n\t#if defined( USE_SHEEN ) \n\t\tsheenSpecularIndirect *= ambientOcclusion;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD )\n\t\tfloat dotNV = saturate( dot( geometryNormal, geometryViewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );\n\t#endif\n#endif`,qc=`#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif`,Yc=`#ifdef USE_BATCHING\n\tattribute float batchId;\n\tuniform highp sampler2D batchingTexture;\n\tmat4 getBatchingMatrix( const in float i ) {\n\t\tint size = textureSize( batchingTexture, 0 ).x;\n\t\tint j = int( i ) * 4;\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\tvec4 v1 = texelFetch( batchingTexture, ivec2( x, y ), 0 );\n\t\tvec4 v2 = texelFetch( batchingTexture, ivec2( x + 1, y ), 0 );\n\t\tvec4 v3 = texelFetch( batchingTexture, ivec2( x + 2, y ), 0 );\n\t\tvec4 v4 = texelFetch( batchingTexture, ivec2( x + 3, y ), 0 );\n\t\treturn mat4( v1, v2, v3, v4 );\n\t}\n#endif`,Zc=`#ifdef USE_BATCHING\n\tmat4 batchingMatrix = getBatchingMatrix( batchId );\n#endif`,Jc=`vec3 transformed = vec3( position );\n#ifdef USE_ALPHAHASH\n\tvPosition = vec3( position );\n#endif`,$c=`vec3 objectNormal = vec3( normal );\n#ifdef USE_TANGENT\n\tvec3 objectTangent = vec3( tangent.xyz );\n#endif`,Kc=`float G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, 1.0, dotVH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n} // validated`,Qc=`#ifdef USE_IRIDESCENCE\n\tconst mat3 XYZ_TO_REC709 = mat3(\n\t\t 3.2404542, -0.9692660,  0.0556434,\n\t\t-1.5371385,  1.8760108, -0.2040259,\n\t\t-0.4985314,  0.0415560,  1.0572252\n\t);\n\tvec3 Fresnel0ToIor( vec3 fresnel0 ) {\n\t\tvec3 sqrtF0 = sqrt( fresnel0 );\n\t\treturn ( vec3( 1.0 ) + sqrtF0 ) / ( vec3( 1.0 ) - sqrtF0 );\n\t}\n\tvec3 IorToFresnel0( vec3 transmittedIor, float incidentIor ) {\n\t\treturn pow2( ( transmittedIor - vec3( incidentIor ) ) / ( transmittedIor + vec3( incidentIor ) ) );\n\t}\n\tfloat IorToFresnel0( float transmittedIor, float incidentIor ) {\n\t\treturn pow2( ( transmittedIor - incidentIor ) / ( transmittedIor + incidentIor ));\n\t}\n\tvec3 evalSensitivity( float OPD, vec3 shift ) {\n\t\tfloat phase = 2.0 * PI * OPD * 1.0e-9;\n\t\tvec3 val = vec3( 5.4856e-13, 4.4201e-13, 5.2481e-13 );\n\t\tvec3 pos = vec3( 1.6810e+06, 1.7953e+06, 2.2084e+06 );\n\t\tvec3 var = vec3( 4.3278e+09, 9.3046e+09, 6.6121e+09 );\n\t\tvec3 xyz = val * sqrt( 2.0 * PI * var ) * cos( pos * phase + shift ) * exp( - pow2( phase ) * var );\n\t\txyz.x += 9.7470e-14 * sqrt( 2.0 * PI * 4.5282e+09 ) * cos( 2.2399e+06 * phase + shift[ 0 ] ) * exp( - 4.5282e+09 * pow2( phase ) );\n\t\txyz /= 1.0685e-7;\n\t\tvec3 rgb = XYZ_TO_REC709 * xyz;\n\t\treturn rgb;\n\t}\n\tvec3 evalIridescence( float outsideIOR, float eta2, float cosTheta1, float thinFilmThickness, vec3 baseF0 ) {\n\t\tvec3 I;\n\t\tfloat iridescenceIOR = mix( outsideIOR, eta2, smoothstep( 0.0, 0.03, thinFilmThickness ) );\n\t\tfloat sinTheta2Sq = pow2( outsideIOR / iridescenceIOR ) * ( 1.0 - pow2( cosTheta1 ) );\n\t\tfloat cosTheta2Sq = 1.0 - sinTheta2Sq;\n\t\tif ( cosTheta2Sq < 0.0 ) {\n\t\t\treturn vec3( 1.0 );\n\t\t}\n\t\tfloat cosTheta2 = sqrt( cosTheta2Sq );\n\t\tfloat R0 = IorToFresnel0( iridescenceIOR, outsideIOR );\n\t\tfloat R12 = F_Schlick( R0, 1.0, cosTheta1 );\n\t\tfloat T121 = 1.0 - R12;\n\t\tfloat phi12 = 0.0;\n\t\tif ( iridescenceIOR < outsideIOR ) phi12 = PI;\n\t\tfloat phi21 = PI - phi12;\n\t\tvec3 baseIOR = Fresnel0ToIor( clamp( baseF0, 0.0, 0.9999 ) );\t\tvec3 R1 = IorToFresnel0( baseIOR, iridescenceIOR );\n\t\tvec3 R23 = F_Schlick( R1, 1.0, cosTheta2 );\n\t\tvec3 phi23 = vec3( 0.0 );\n\t\tif ( baseIOR[ 0 ] < iridescenceIOR ) phi23[ 0 ] = PI;\n\t\tif ( baseIOR[ 1 ] < iridescenceIOR ) phi23[ 1 ] = PI;\n\t\tif ( baseIOR[ 2 ] < iridescenceIOR ) phi23[ 2 ] = PI;\n\t\tfloat OPD = 2.0 * iridescenceIOR * thinFilmThickness * cosTheta2;\n\t\tvec3 phi = vec3( phi21 ) + phi23;\n\t\tvec3 R123 = clamp( R12 * R23, 1e-5, 0.9999 );\n\t\tvec3 r123 = sqrt( R123 );\n\t\tvec3 Rs = pow2( T121 ) * R23 / ( vec3( 1.0 ) - R123 );\n\t\tvec3 C0 = R12 + Rs;\n\t\tI = C0;\n\t\tvec3 Cm = Rs - T121;\n\t\tfor ( int m = 1; m <= 2; ++ m ) {\n\t\t\tCm *= r123;\n\t\t\tvec3 Sm = 2.0 * evalSensitivity( float( m ) * OPD, float( m ) * phi );\n\t\t\tI += Cm * Sm;\n\t\t}\n\t\treturn max( I, vec3( 0.0 ) );\n\t}\n#endif`,jc=`#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vBumpMapUv );\n\t\tvec2 dSTdy = dFdy( vBumpMapUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vBumpMapUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\n\t\tvec3 vSigmaX = normalize( dFdx( surf_pos.xyz ) );\n\t\tvec3 vSigmaY = normalize( dFdy( surf_pos.xyz ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 ) * faceDirection;\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif`,th=`#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#pragma unroll_loop_end\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\tif ( clipped ) discard;\n\t#endif\n#endif`,eh=`#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif`,nh=`#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif`,ih=`#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif`,sh=`#if defined( USE_COLOR_ALPHA )\n\tdiffuseColor *= vColor;\n#elif defined( USE_COLOR )\n\tdiffuseColor.rgb *= vColor;\n#endif`,rh=`#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR )\n\tvarying vec3 vColor;\n#endif`,ah=`#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvarying vec3 vColor;\n#endif`,oh=`#if defined( USE_COLOR_ALPHA )\n\tvColor = vec4( 1.0 );\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.xyz *= instanceColor.xyz;\n#endif`,lh=`#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nvec3 pow2( const in vec3 x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract( sin( sn ) * c );\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\n#ifdef USE_ALPHAHASH\n\tvarying vec3 vPosition;\n#endif\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat luminance( const in vec3 rgb ) {\n\tconst vec3 weights = vec3( 0.2126729, 0.7151522, 0.0721750 );\n\treturn dot( weights, rgb );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}\nvec3 BRDF_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n}\nfloat F_Schlick( const in float f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n} // validated`,ch=`#ifdef ENVMAP_TYPE_CUBE_UV\n\t#define cubeUV_minMipLevel 4.0\n\t#define cubeUV_minTileSize 16.0\n\tfloat getFace( vec3 direction ) {\n\t\tvec3 absDirection = abs( direction );\n\t\tfloat face = - 1.0;\n\t\tif ( absDirection.x > absDirection.z ) {\n\t\t\tif ( absDirection.x > absDirection.y )\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t} else {\n\t\t\tif ( absDirection.z > absDirection.y )\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t}\n\t\treturn face;\n\t}\n\tvec2 getUV( vec3 direction, float face ) {\n\t\tvec2 uv;\n\t\tif ( face == 0.0 ) {\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 1.0 ) {\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\n\t\t} else if ( face == 2.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\n\t\t} else if ( face == 3.0 ) {\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 4.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\n\t\t} else {\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\n\t\t}\n\t\treturn 0.5 * ( uv + 1.0 );\n\t}\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\t\tfloat face = getFace( direction );\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\t\tfloat faceSize = exp2( mipInt );\n\t\thighp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\n\t\tif ( face > 2.0 ) {\n\t\t\tuv.y += faceSize;\n\t\t\tface -= 3.0;\n\t\t}\n\t\tuv.x += face * faceSize;\n\t\tuv.x += filterInt * 3.0 * cubeUV_minTileSize;\n\t\tuv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\n\t\tuv.x *= CUBEUV_TEXEL_WIDTH;\n\t\tuv.y *= CUBEUV_TEXEL_HEIGHT;\n\t\t#ifdef texture2DGradEXT\n\t\t\treturn texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\n\t\t#else\n\t\t\treturn texture2D( envMap, uv ).rgb;\n\t\t#endif\n\t}\n\t#define cubeUV_r0 1.0\n\t#define cubeUV_m0 - 2.0\n\t#define cubeUV_r1 0.8\n\t#define cubeUV_m1 - 1.0\n\t#define cubeUV_r4 0.4\n\t#define cubeUV_m4 2.0\n\t#define cubeUV_r5 0.305\n\t#define cubeUV_m5 3.0\n\t#define cubeUV_r6 0.21\n\t#define cubeUV_m6 4.0\n\tfloat roughnessToMip( float roughness ) {\n\t\tfloat mip = 0.0;\n\t\tif ( roughness >= cubeUV_r1 ) {\n\t\t\tmip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0;\n\t\t} else if ( roughness >= cubeUV_r4 ) {\n\t\t\tmip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1;\n\t\t} else if ( roughness >= cubeUV_r5 ) {\n\t\t\tmip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4;\n\t\t} else if ( roughness >= cubeUV_r6 ) {\n\t\t\tmip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5;\n\t\t} else {\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness );\t\t}\n\t\treturn mip;\n\t}\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\t\tfloat mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP );\n\t\tfloat mipF = fract( mip );\n\t\tfloat mipInt = floor( mip );\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\t\tif ( mipF == 0.0 ) {\n\t\t\treturn vec4( color0, 1.0 );\n\t\t} else {\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\t\t}\n\t}\n#endif`,hh=`vec3 transformedNormal = objectNormal;\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = objectTangent;\n#endif\n#ifdef USE_BATCHING\n\tmat3 bm = mat3( batchingMatrix );\n\ttransformedNormal /= vec3( dot( bm[ 0 ], bm[ 0 ] ), dot( bm[ 1 ], bm[ 1 ] ), dot( bm[ 2 ], bm[ 2 ] ) );\n\ttransformedNormal = bm * transformedNormal;\n\t#ifdef USE_TANGENT\n\t\ttransformedTangent = bm * transformedTangent;\n\t#endif\n#endif\n#ifdef USE_INSTANCING\n\tmat3 im = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( im[ 0 ], im[ 0 ] ), dot( im[ 1 ], im[ 1 ] ), dot( im[ 2 ], im[ 2 ] ) );\n\ttransformedNormal = im * transformedNormal;\n\t#ifdef USE_TANGENT\n\t\ttransformedTangent = im * transformedTangent;\n\t#endif\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\ttransformedTangent = ( modelViewMatrix * vec4( transformedTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif`,uh=`#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif`,dh=`#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias );\n#endif`,fh=`#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv );\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif`,ph=`#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif`,mh=\"gl_FragColor = linearToOutputTexel( gl_FragColor );\",gh=`\nconst mat3 LINEAR_SRGB_TO_LINEAR_DISPLAY_P3 = mat3(\n\tvec3( 0.8224621, 0.177538, 0.0 ),\n\tvec3( 0.0331941, 0.9668058, 0.0 ),\n\tvec3( 0.0170827, 0.0723974, 0.9105199 )\n);\nconst mat3 LINEAR_DISPLAY_P3_TO_LINEAR_SRGB = mat3(\n\tvec3( 1.2249401, - 0.2249404, 0.0 ),\n\tvec3( - 0.0420569, 1.0420571, 0.0 ),\n\tvec3( - 0.0196376, - 0.0786361, 1.0982735 )\n);\nvec4 LinearSRGBToLinearDisplayP3( in vec4 value ) {\n\treturn vec4( value.rgb * LINEAR_SRGB_TO_LINEAR_DISPLAY_P3, value.a );\n}\nvec4 LinearDisplayP3ToLinearSRGB( in vec4 value ) {\n\treturn vec4( value.rgb * LINEAR_DISPLAY_P3_TO_LINEAR_SRGB, value.a );\n}\nvec4 LinearTransferOETF( in vec4 value ) {\n\treturn value;\n}\nvec4 sRGBTransferOETF( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn sRGBTransferOETF( value );\n}`,_h=`#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif`,xh=`#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\t\n#endif`,vh=`#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif`,yh=`#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif`,Mh=`#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif`,Sh=`#ifdef USE_FOG\n\tvFogDepth = - mvPosition.z;\n#endif`,bh=`#ifdef USE_FOG\n\tvarying float vFogDepth;\n#endif`,Eh=`#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif`,wh=`#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float vFogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif`,Th=`#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn vec3( texture2D( gradientMap, coord ).r );\n\t#else\n\t\tvec2 fw = fwidth( coord ) * 0.5;\n\t\treturn mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) );\n\t#endif\n}`,Ah=`#ifdef USE_LIGHTMAP\n\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\treflectedLight.indirectDiffuse += lightMapIrradiance;\n#endif`,Ch=`#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif`,Rh=`LambertMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularStrength = specularStrength;`,Ph=`varying vec3 vViewPosition;\nstruct LambertMaterial {\n\tvec3 diffuseColor;\n\tfloat specularStrength;\n};\nvoid RE_Direct_Lambert( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Lambert\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Lambert`,Lh=`uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\n#if defined( USE_LIGHT_PROBES )\n\tuniform vec3 lightProbe[ 9 ];\n#endif\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\n\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\treturn irradiance;\n}\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\t#if defined ( LEGACY_LIGHTS )\n\t\tif ( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\t\t\treturn pow( saturate( - lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\t\t}\n\t\treturn 1.0;\n\t#else\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tif ( cutoffDistance > 0.0 ) {\n\t\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\t}\n\t\treturn distanceFalloff;\n\t#endif\n}\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\n\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, out IncidentLight light ) {\n\t\tlight.color = directionalLight.color;\n\t\tlight.direction = directionalLight.direction;\n\t\tlight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointLightInfo( const in PointLight pointLight, const in vec3 geometryPosition, out IncidentLight light ) {\n\t\tvec3 lVector = pointLight.position - geometryPosition;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tlight.color = pointLight.color;\n\t\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\n\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotLightInfo( const in SpotLight spotLight, const in vec3 geometryPosition, out IncidentLight light ) {\n\t\tvec3 lVector = spotLight.position - geometryPosition;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat angleCos = dot( light.direction, spotLight.direction );\n\t\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\tif ( spotAttenuation > 0.0 ) {\n\t\t\tfloat lightDistance = length( lVector );\n\t\t\tlight.color = spotLight.color * spotAttenuation;\n\t\t\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t\t} else {\n\t\t\tlight.color = vec3( 0.0 );\n\t\t\tlight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\n\t\tfloat dotNL = dot( normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\treturn irradiance;\n\t}\n#endif`,Ih=`#ifdef USE_ENVMAP\n\tvec3 getIBLIrradiance( const in vec3 normal ) {\n\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\n\t\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\n\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\tvec3 reflectVec = reflect( - viewDir, normal );\n\t\t\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\n\t\t\treturn envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\t#ifdef USE_ANISOTROPY\n\t\tvec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {\n\t\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\t\tvec3 bentNormal = cross( bitangent, viewDir );\n\t\t\t\tbentNormal = normalize( cross( bentNormal, bitangent ) );\n\t\t\t\tbentNormal = normalize( mix( bentNormal, normal, pow2( pow2( 1.0 - anisotropy * ( 1.0 - roughness ) ) ) ) );\n\t\t\t\treturn getIBLRadiance( viewDir, bentNormal, roughness );\n\t\t\t#else\n\t\t\t\treturn vec3( 0.0 );\n\t\t\t#endif\n\t\t}\n\t#endif\n#endif`,Uh=`ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;`,Dh=`varying vec3 vViewPosition;\nstruct ToonMaterial {\n\tvec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometryNormal, directLight.direction ) * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon`,Nh=`BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;`,Fh=`varying vec3 vViewPosition;\nstruct BlinnPhongMaterial {\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometryViewDir, geometryNormal, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong`,Oh=`PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\nmaterial.roughness = min( material.roughness, 1.0 );\n#ifdef IOR\n\tmaterial.ior = ior;\n\t#ifdef USE_SPECULAR\n\t\tfloat specularIntensityFactor = specularIntensity;\n\t\tvec3 specularColorFactor = specularColor;\n\t\t#ifdef USE_SPECULAR_COLORMAP\n\t\t\tspecularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb;\n\t\t#endif\n\t\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\t\tspecularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a;\n\t\t#endif\n\t\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\n\t#else\n\t\tfloat specularIntensityFactor = 1.0;\n\t\tvec3 specularColorFactor = vec3( 1.0 );\n\t\tmaterial.specularF90 = 1.0;\n\t#endif\n\tmaterial.specularColor = mix( min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.specularF90 = 1.0;\n#endif\n#ifdef USE_CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\tmaterial.clearcoatF0 = vec3( 0.04 );\n\tmaterial.clearcoatF90 = 1.0;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vClearcoatMapUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_IRIDESCENCE\n\tmaterial.iridescence = iridescence;\n\tmaterial.iridescenceIOR = iridescenceIOR;\n\t#ifdef USE_IRIDESCENCEMAP\n\t\tmaterial.iridescence *= texture2D( iridescenceMap, vIridescenceMapUv ).r;\n\t#endif\n\t#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\t\tmaterial.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).g + iridescenceThicknessMinimum;\n\t#else\n\t\tmaterial.iridescenceThickness = iridescenceThicknessMaximum;\n\t#endif\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheenColor;\n\t#ifdef USE_SHEEN_COLORMAP\n\t\tmaterial.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb;\n\t#endif\n\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\t#ifdef USE_ANISOTROPYMAP\n\t\tmat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x );\n\t\tvec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb;\n\t\tvec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b;\n\t#else\n\t\tvec2 anisotropyV = anisotropyVector;\n\t#endif\n\tmaterial.anisotropy = length( anisotropyV );\n\tif( material.anisotropy == 0.0 ) {\n\t\tanisotropyV = vec2( 1.0, 0.0 );\n\t} else {\n\t\tanisotropyV /= material.anisotropy;\n\t\tmaterial.anisotropy = saturate( material.anisotropy );\n\t}\n\tmaterial.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) );\n\tmaterial.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y;\n\tmaterial.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y;\n#endif`,Bh=`struct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat roughness;\n\tvec3 specularColor;\n\tfloat specularF90;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat clearcoat;\n\t\tfloat clearcoatRoughness;\n\t\tvec3 clearcoatF0;\n\t\tfloat clearcoatF90;\n\t#endif\n\t#ifdef USE_IRIDESCENCE\n\t\tfloat iridescence;\n\t\tfloat iridescenceIOR;\n\t\tfloat iridescenceThickness;\n\t\tvec3 iridescenceFresnel;\n\t\tvec3 iridescenceF0;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tvec3 sheenColor;\n\t\tfloat sheenRoughness;\n\t#endif\n\t#ifdef IOR\n\t\tfloat ior;\n\t#endif\n\t#ifdef USE_TRANSMISSION\n\t\tfloat transmission;\n\t\tfloat transmissionAlpha;\n\t\tfloat thickness;\n\t\tfloat attenuationDistance;\n\t\tvec3 attenuationColor;\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat anisotropy;\n\t\tfloat alphaT;\n\t\tvec3 anisotropyT;\n\t\tvec3 anisotropyB;\n\t#endif\n};\nvec3 clearcoatSpecularDirect = vec3( 0.0 );\nvec3 clearcoatSpecularIndirect = vec3( 0.0 );\nvec3 sheenSpecularDirect = vec3( 0.0 );\nvec3 sheenSpecularIndirect = vec3(0.0 );\nvec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {\n    float x = clamp( 1.0 - dotVH, 0.0, 1.0 );\n    float x2 = x * x;\n    float x5 = clamp( x * x2 * x2, 0.0, 0.9999 );\n    return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 );\n}\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\n#ifdef USE_ANISOTROPY\n\tfloat V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) {\n\t\tfloat gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\n\t\tfloat gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\n\t\tfloat v = 0.5 / ( gv + gl );\n\t\treturn saturate(v);\n\t}\n\tfloat D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\n\t\tfloat a2 = alphaT * alphaB;\n\t\thighp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\n\t\thighp float v2 = dot( v, v );\n\t\tfloat w2 = a2 / v2;\n\t\treturn RECIPROCAL_PI * a2 * pow2 ( w2 );\n\t}\n#endif\n#ifdef USE_CLEARCOAT\n\tvec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\n\t\tvec3 f0 = material.clearcoatF0;\n\t\tfloat f90 = material.clearcoatF90;\n\t\tfloat roughness = material.clearcoatRoughness;\n\t\tfloat alpha = pow2( roughness );\n\t\tvec3 halfDir = normalize( lightDir + viewDir );\n\t\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\t\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\t\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\t\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\t\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t\treturn F * ( V * D );\n\t}\n#endif\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n\tvec3 f0 = material.specularColor;\n\tfloat f90 = material.specularF90;\n\tfloat roughness = material.roughness;\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t#ifdef USE_IRIDESCENCE\n\t\tF = mix( F, material.iridescenceFresnel, material.iridescence );\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat dotTL = dot( material.anisotropyT, lightDir );\n\t\tfloat dotTV = dot( material.anisotropyT, viewDir );\n\t\tfloat dotTH = dot( material.anisotropyT, halfDir );\n\t\tfloat dotBL = dot( material.anisotropyB, lightDir );\n\t\tfloat dotBV = dot( material.anisotropyB, viewDir );\n\t\tfloat dotBH = dot( material.anisotropyB, halfDir );\n\t\tfloat V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\n\t\tfloat D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\n\t#else\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t#endif\n\treturn F * ( V * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie( float roughness, float dotNH ) {\n\tfloat alpha = pow2( roughness );\n\tfloat invAlpha = 1.0 / alpha;\n\tfloat cos2h = dotNH * dotNH;\n\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\n\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n}\nfloat V_Neubelt( float dotNV, float dotNL ) {\n\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\n}\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat D = D_Charlie( sheenRoughness, dotNH );\n\tfloat V = V_Neubelt( dotNV, dotNL );\n\treturn sheenColor * ( D * V );\n}\n#endif\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat r2 = roughness * roughness;\n\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\n\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\n\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\n\treturn saturate( DG * RECIPROCAL_PI );\n}\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw;\n\treturn fab;\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\treturn specularColor * fab.x + specularF90 * fab.y;\n}\n#ifdef USE_IRIDESCENCE\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#else\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#endif\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\t#ifdef USE_IRIDESCENCE\n\t\tvec3 Fr = mix( specularColor, iridescenceF0, iridescence );\n\t#else\n\t\tvec3 Fr = specularColor;\n\t#endif\n\tvec3 FssEss = Fr * fab.x + specularF90 * fab.y;\n\tfloat Ess = fab.x + fab.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometryNormal;\n\t\tvec3 viewDir = geometryViewDir;\n\t\tvec3 position = geometryPosition;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.roughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3(    0, 1,    0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\t\tclearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\n\t#endif\n\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometryViewDir, geometryNormal, material );\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n\t#endif\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\t#ifdef USE_IRIDESCENCE\n\t\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );\n\t#else\n\t\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\n\t#endif\n\tvec3 totalScattering = singleScattering + multiScattering;\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) );\n\treflectedLight.indirectSpecular += radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}`,zh=`\nvec3 geometryPosition = - vViewPosition;\nvec3 geometryNormal = normal;\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\nvec3 geometryClearcoatNormal = vec3( 0.0 );\n#ifdef USE_CLEARCOAT\n\tgeometryClearcoatNormal = clearcoatNormal;\n#endif\n#ifdef USE_IRIDESCENCE\n\tfloat dotNVi = saturate( dot( normal, geometryViewDir ) );\n\tif ( material.iridescenceThickness == 0.0 ) {\n\t\tmaterial.iridescence = 0.0;\n\t} else {\n\t\tmaterial.iridescence = saturate( material.iridescence );\n\t}\n\tif ( material.iridescence > 0.0 ) {\n\t\tmaterial.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\n\t\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\n\t}\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointLightInfo( pointLight, geometryPosition, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tvec4 spotColor;\n\tvec3 spotLightCoord;\n\tbool inSpotLightMap;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotLightInfo( spotLight, geometryPosition, directLight );\n\t\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\n\t\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\n\t\t#else\n\t\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#endif\n\t\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\n\t\t\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\n\t\t\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\n\t\t\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\n\t\t\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\n\t\t#endif\n\t\t#undef SPOT_LIGHT_MAP_INDEX\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalLightInfo( directionalLight, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#if defined( USE_LIGHT_PROBES )\n\t\tirradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif`,Vh=`#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\t\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getIBLIrradiance( geometryNormal );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\t#ifdef USE_ANISOTROPY\n\t\tradiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );\n\t#else\n\t\tradiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );\n\t#endif\n#endif`,kh=`#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif`,Hh=`#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif`,Gh=`#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif`,Wh=`#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t\tvarying float vIsPerspective;\n\t#else\n\t\tuniform float logDepthBufFC;\n\t#endif\n#endif`,Xh=`#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n\t#else\n\t\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\n\t\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\t\tgl_Position.z *= gl_Position.w;\n\t\t}\n\t#endif\n#endif`,qh=`#ifdef USE_MAP\n\tvec4 sampledDiffuseColor = texture2D( map, vMapUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\tsampledDiffuseColor = vec4( mix( pow( sampledDiffuseColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), sampledDiffuseColor.rgb * 0.0773993808, vec3( lessThanEqual( sampledDiffuseColor.rgb, vec3( 0.04045 ) ) ) ), sampledDiffuseColor.w );\n\t\n\t#endif\n\tdiffuseColor *= sampledDiffuseColor;\n#endif`,Yh=`#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif`,Zh=`#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\t#if defined( USE_POINTS_UV )\n\t\tvec2 uv = vUv;\n\t#else\n\t\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\t#endif\n#endif\n#ifdef USE_MAP\n\tdiffuseColor *= texture2D( map, uv );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif`,Jh=`#if defined( USE_POINTS_UV )\n\tvarying vec2 vUv;\n#else\n\t#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\t\tuniform mat3 uvTransform;\n\t#endif\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif`,$h=`float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vMetalnessMapUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif`,Kh=`#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif`,Qh=`#if defined( USE_MORPHCOLORS ) && defined( MORPHTARGETS_TEXTURE )\n\tvColor *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t#if defined( USE_COLOR_ALPHA )\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ];\n\t\t#elif defined( USE_COLOR )\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ];\n\t\t#endif\n\t}\n#endif`,jh=`#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\t#ifdef MORPHTARGETS_TEXTURE\n\t\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];\n\t\t}\n\t#else\n\t\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\n\t\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\n\t\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\n\t\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\n\t#endif\n#endif`,tu=`#ifdef USE_MORPHTARGETS\n\tuniform float morphTargetBaseInfluence;\n\t#ifdef MORPHTARGETS_TEXTURE\n\t\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\t\tuniform sampler2DArray morphTargetsTexture;\n\t\tuniform ivec2 morphTargetsTextureSize;\n\t\tvec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\n\t\t\tint texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\n\t\t\tint y = texelIndex / morphTargetsTextureSize.x;\n\t\t\tint x = texelIndex - y * morphTargetsTextureSize.x;\n\t\t\tivec3 morphUV = ivec3( x, y, morphTargetIndex );\n\t\t\treturn texelFetch( morphTargetsTexture, morphUV, 0 );\n\t\t}\n\t#else\n\t\t#ifndef USE_MORPHNORMALS\n\t\t\tuniform float morphTargetInfluences[ 8 ];\n\t\t#else\n\t\t\tuniform float morphTargetInfluences[ 4 ];\n\t\t#endif\n\t#endif\n#endif`,eu=`#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\t#ifdef MORPHTARGETS_TEXTURE\n\t\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\n\t\t}\n\t#else\n\t\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\n\t\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\n\t\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\n\t\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\n\t\t#ifndef USE_MORPHNORMALS\n\t\t\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\n\t\t\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\n\t\t\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\n\t\t\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\n\t\t#endif\n\t#endif\n#endif`,nu=`float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\n#ifdef FLAT_SHADED\n\tvec3 fdx = dFdx( vViewPosition );\n\tvec3 fdy = dFdy( vViewPosition );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal *= faceDirection;\n\t#endif\n#endif\n#if defined( USE_NORMALMAP_TANGENTSPACE ) || defined( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY )\n\t#ifdef USE_TANGENT\n\t\tmat3 tbn = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n\t#else\n\t\tmat3 tbn = getTangentFrame( - vViewPosition, normal,\n\t\t#if defined( USE_NORMALMAP )\n\t\t\tvNormalMapUv\n\t\t#elif defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tvClearcoatNormalMapUv\n\t\t#else\n\t\t\tvUv\n\t\t#endif\n\t\t);\n\t#endif\n\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n\t\ttbn[0] *= faceDirection;\n\t\ttbn[1] *= faceDirection;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\t#ifdef USE_TANGENT\n\t\tmat3 tbn2 = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n\t#else\n\t\tmat3 tbn2 = getTangentFrame( - vViewPosition, normal, vClearcoatNormalMapUv );\n\t#endif\n\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n\t\ttbn2[0] *= faceDirection;\n\t\ttbn2[1] *= faceDirection;\n\t#endif\n#endif\nvec3 nonPerturbedNormal = normal;`,iu=`#ifdef USE_NORMALMAP_OBJECTSPACE\n\tnormal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\n\t#ifdef FLIP_SIDED\n\t\tnormal = - normal;\n\t#endif\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\tnormal = normalize( normalMatrix * normal );\n#elif defined( USE_NORMALMAP_TANGENTSPACE )\n\tvec3 mapN = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\tnormal = normalize( tbn * mapN );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\n#endif`,su=`#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif`,ru=`#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif`,au=`#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif`,ou=`#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef USE_NORMALMAP_OBJECTSPACE\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( USE_NORMALMAP_TANGENTSPACE ) || defined ( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY ) )\n\tmat3 getTangentFrame( vec3 eye_pos, vec3 surf_norm, vec2 uv ) {\n\t\tvec3 q0 = dFdx( eye_pos.xyz );\n\t\tvec3 q1 = dFdy( eye_pos.xyz );\n\t\tvec2 st0 = dFdx( uv.st );\n\t\tvec2 st1 = dFdy( uv.st );\n\t\tvec3 N = surf_norm;\n\t\tvec3 q1perp = cross( q1, N );\n\t\tvec3 q0perp = cross( N, q0 );\n\t\tvec3 T = q1perp * st0.x + q0perp * st1.x;\n\t\tvec3 B = q1perp * st0.y + q0perp * st1.y;\n\t\tfloat det = max( dot( T, T ), dot( B, B ) );\n\t\tfloat scale = ( det == 0.0 ) ? 0.0 : inversesqrt( det );\n\t\treturn mat3( T * scale, B * scale, N );\n\t}\n#endif`,lu=`#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal = nonPerturbedNormal;\n#endif`,cu=`#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\tclearcoatNormal = normalize( tbn2 * clearcoatMapN );\n#endif`,hu=`#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif`,uu=`#ifdef USE_IRIDESCENCEMAP\n\tuniform sampler2D iridescenceMap;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tuniform sampler2D iridescenceThicknessMap;\n#endif`,du=`#ifdef OPAQUE\ndiffuseColor.a = 1.0;\n#endif\n#ifdef USE_TRANSMISSION\ndiffuseColor.a *= material.transmissionAlpha;\n#endif\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );`,fu=`vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nvec2 packDepthToRG( in highp float v ) {\n\treturn packDepthToRGBA( v ).yx;\n}\nfloat unpackRGToDepth( const in highp vec2 v ) {\n\treturn unpackRGBAToDepth( vec4( v.xy, 0.0, 0.0 ) );\n}\nvec4 pack2HalfToRGBA( vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\n}\nvec2 unpackRGBATo2Half( vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float depth, const in float near, const in float far ) {\n\treturn depth * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * depth - far );\n}`,pu=`#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif`,mu=`vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_BATCHING\n\tmvPosition = batchingMatrix * mvPosition;\n#endif\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;`,gu=`#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif`,_u=`#ifdef DITHERING\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif`,xu=`float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vRoughnessMapUv );\n\troughnessFactor *= texelRoughness.g;\n#endif`,vu=`#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif`,yu=`#if NUM_SPOT_LIGHT_COORDS > 0\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#if NUM_SPOT_LIGHT_MAPS > 0\n\tuniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\t}\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\t\tfloat occlusion = 1.0;\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\t\tfloat hard_shadow = step( compare , distribution.x );\n\t\tif (hard_shadow != 1.0 ) {\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance );\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\t\t}\n\t\treturn occlusion;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t  texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t  f.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t  texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t  f.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif`,Mu=`#if NUM_SPOT_LIGHT_COORDS > 0\n\tuniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif`,Su=`#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )\n\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\tvec4 shadowWorldPosition;\n#endif\n#if defined( USE_SHADOWMAP )\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if NUM_SPOT_LIGHT_COORDS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition;\n\t\t#if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t\tshadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;\n\t\t#endif\n\t\tvSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n#endif`,bu=`float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\n}`,Eu=`#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif`,wu=`#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\tuniform highp sampler2D boneTexture;\n\tmat4 getBoneMatrix( const in float i ) {\n\t\tint size = textureSize( boneTexture, 0 ).x;\n\t\tint j = int( i ) * 4;\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\tvec4 v1 = texelFetch( boneTexture, ivec2( x, y ), 0 );\n\t\tvec4 v2 = texelFetch( boneTexture, ivec2( x + 1, y ), 0 );\n\t\tvec4 v3 = texelFetch( boneTexture, ivec2( x + 2, y ), 0 );\n\t\tvec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 );\n\t\treturn mat4( v1, v2, v3, v4 );\n\t}\n#endif`,Tu=`#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif`,Au=`#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif`,Cu=`float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vSpecularMapUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif`,Ru=`#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif`,Pu=`#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif`,Lu=`#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn saturate( toneMappingExposure * color );\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 RRTAndODTFit( vec3 v ) {\n\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\treturn a / b;\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ),\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3(  1.60475, -0.10208, -0.00327 ),\t\tvec3( -0.53108,  1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605,  1.07602 )\n\t);\n\tcolor *= toneMappingExposure / 0.6;\n\tcolor = ACESInputMat * color;\n\tcolor = RRTAndODTFit( color );\n\tcolor = ACESOutputMat * color;\n\treturn saturate( color );\n}\nconst mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3(\n\tvec3( 1.6605, - 0.1246, - 0.0182 ),\n\tvec3( - 0.5876, 1.1329, - 0.1006 ),\n\tvec3( - 0.0728, - 0.0083, 1.1187 )\n);\nconst mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3(\n\tvec3( 0.6274, 0.0691, 0.0164 ),\n\tvec3( 0.3293, 0.9195, 0.0880 ),\n\tvec3( 0.0433, 0.0113, 0.8956 )\n);\nvec3 agxDefaultContrastApprox( vec3 x ) {\n\tvec3 x2 = x * x;\n\tvec3 x4 = x2 * x2;\n\treturn + 15.5 * x4 * x2\n\t\t- 40.14 * x4 * x\n\t\t+ 31.96 * x4\n\t\t- 6.868 * x2 * x\n\t\t+ 0.4298 * x2\n\t\t+ 0.1191 * x\n\t\t- 0.00232;\n}\nvec3 AgXToneMapping( vec3 color ) {\n\tconst mat3 AgXInsetMatrix = mat3(\n\t\tvec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ),\n\t\tvec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ),\n\t\tvec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 )\n\t);\n\tconst mat3 AgXOutsetMatrix = mat3(\n\t\tvec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ),\n\t\tvec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ),\n\t\tvec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 )\n\t);\n\tconst float AgxMinEv = - 12.47393;\tconst float AgxMaxEv = 4.026069;\n\tcolor = LINEAR_SRGB_TO_LINEAR_REC2020 * color;\n\tcolor *= toneMappingExposure;\n\tcolor = AgXInsetMatrix * color;\n\tcolor = max( color, 1e-10 );\tcolor = log2( color );\n\tcolor = ( color - AgxMinEv ) / ( AgxMaxEv - AgxMinEv );\n\tcolor = clamp( color, 0.0, 1.0 );\n\tcolor = agxDefaultContrastApprox( color );\n\tcolor = AgXOutsetMatrix * color;\n\tcolor = pow( max( vec3( 0.0 ), color ), vec3( 2.2 ) );\n\tcolor = LINEAR_REC2020_TO_LINEAR_SRGB * color;\n\treturn color;\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }`,Iu=`#ifdef USE_TRANSMISSION\n\tmaterial.transmission = transmission;\n\tmaterial.transmissionAlpha = 1.0;\n\tmaterial.thickness = thickness;\n\tmaterial.attenuationDistance = attenuationDistance;\n\tmaterial.attenuationColor = attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tmaterial.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tmaterial.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;\n\t#endif\n\tvec3 pos = vWorldPosition;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 n = inverseTransformDirection( normal, viewMatrix );\n\tvec4 transmitted = getIBLVolumeRefraction(\n\t\tn, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, material.ior, material.thickness,\n\t\tmaterial.attenuationColor, material.attenuationDistance );\n\tmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );\n\ttotalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission );\n#endif`,Uu=`#ifdef USE_TRANSMISSION\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tuniform sampler2D transmissionMap;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tuniform sampler2D thicknessMap;\n\t#endif\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\tvarying vec3 vWorldPosition;\n\tfloat w0( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\n\t}\n\tfloat w1( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a *  a * ( 3.0 * a - 6.0 ) + 4.0 );\n\t}\n\tfloat w2( float a ){\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\n\t}\n\tfloat w3( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * a );\n\t}\n\tfloat g0( float a ) {\n\t\treturn w0( a ) + w1( a );\n\t}\n\tfloat g1( float a ) {\n\t\treturn w2( a ) + w3( a );\n\t}\n\tfloat h0( float a ) {\n\t\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\n\t}\n\tfloat h1( float a ) {\n\t\treturn 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\n\t}\n\tvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) {\n\t\tuv = uv * texelSize.zw + 0.5;\n\t\tvec2 iuv = floor( uv );\n\t\tvec2 fuv = fract( uv );\n\t\tfloat g0x = g0( fuv.x );\n\t\tfloat g1x = g1( fuv.x );\n\t\tfloat h0x = h0( fuv.x );\n\t\tfloat h1x = h1( fuv.x );\n\t\tfloat h0y = h0( fuv.y );\n\t\tfloat h1y = h1( fuv.y );\n\t\tvec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\n\t\t\tg1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\n\t}\n\tvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\n\t\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\n\t\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\n\t\tvec2 fLodSizeInv = 1.0 / fLodSize;\n\t\tvec2 cLodSizeInv = 1.0 / cLodSize;\n\t\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) );\n\t\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) );\n\t\treturn mix( fSample, cSample, fract( lod ) );\n\t}\n\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\t}\n\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\t}\n\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\n\t\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\n\t}\n\tvec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tif ( isinf( attenuationDistance ) ) {\n\t\t\treturn vec3( 1.0 );\n\t\t} else {\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\t\t\treturn transmittance;\n\t\t}\n\t}\n\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n\t\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\n\t\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float ior, const in float thickness,\n\t\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\trefractionCoords += 1.0;\n\t\trefractionCoords /= 2.0;\n\t\tvec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\t\tvec3 transmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\tvec3 attenuatedColor = transmittance * transmittedLight.rgb;\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\t\tfloat transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0;\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor );\n\t}\n#endif`,Du=`#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvarying vec2 vUv;\n#endif\n#ifdef USE_MAP\n\tvarying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n\tvarying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n\tvarying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n\tvarying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n\tvarying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n\tvarying vec2 vNormalMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tvarying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n\tvarying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tvarying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tvarying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tvarying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tvarying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tvarying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tvarying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tvarying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tvarying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tvarying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n\tvarying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tvarying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tvarying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tuniform mat3 transmissionMapTransform;\n\tvarying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n\tuniform mat3 thicknessMapTransform;\n\tvarying vec2 vThicknessMapUv;\n#endif`,Nu=`#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvarying vec2 vUv;\n#endif\n#ifdef USE_MAP\n\tuniform mat3 mapTransform;\n\tvarying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform mat3 alphaMapTransform;\n\tvarying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n\tuniform mat3 lightMapTransform;\n\tvarying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n\tuniform mat3 aoMapTransform;\n\tvarying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n\tuniform mat3 bumpMapTransform;\n\tvarying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n\tuniform mat3 normalMapTransform;\n\tvarying vec2 vNormalMapUv;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n\tuniform mat3 displacementMapTransform;\n\tvarying vec2 vDisplacementMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tuniform mat3 emissiveMapTransform;\n\tvarying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n\tuniform mat3 metalnessMapTransform;\n\tvarying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tuniform mat3 roughnessMapTransform;\n\tvarying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tuniform mat3 anisotropyMapTransform;\n\tvarying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tuniform mat3 clearcoatMapTransform;\n\tvarying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform mat3 clearcoatNormalMapTransform;\n\tvarying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform mat3 clearcoatRoughnessMapTransform;\n\tvarying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tuniform mat3 sheenColorMapTransform;\n\tvarying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tuniform mat3 sheenRoughnessMapTransform;\n\tvarying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tuniform mat3 iridescenceMapTransform;\n\tvarying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tuniform mat3 iridescenceThicknessMapTransform;\n\tvarying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n\tuniform mat3 specularMapTransform;\n\tvarying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tuniform mat3 specularColorMapTransform;\n\tvarying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tuniform mat3 specularIntensityMapTransform;\n\tvarying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tuniform mat3 transmissionMapTransform;\n\tvarying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n\tuniform mat3 thicknessMapTransform;\n\tvarying vec2 vThicknessMapUv;\n#endif`,Fu=`#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvUv = vec3( uv, 1 ).xy;\n#endif\n#ifdef USE_MAP\n\tvMapUv = ( mapTransform * vec3( MAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ALPHAMAP\n\tvAlphaMapUv = ( alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_LIGHTMAP\n\tvLightMapUv = ( lightMapTransform * vec3( LIGHTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_AOMAP\n\tvAoMapUv = ( aoMapTransform * vec3( AOMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_BUMPMAP\n\tvBumpMapUv = ( bumpMapTransform * vec3( BUMPMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_NORMALMAP\n\tvNormalMapUv = ( normalMapTransform * vec3( NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n\tvDisplacementMapUv = ( displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tvEmissiveMapUv = ( emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_METALNESSMAP\n\tvMetalnessMapUv = ( metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tvRoughnessMapUv = ( roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tvAnisotropyMapUv = ( anisotropyMapTransform * vec3( ANISOTROPYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tvClearcoatMapUv = ( clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tvClearcoatNormalMapUv = ( clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tvClearcoatRoughnessMapUv = ( clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tvIridescenceMapUv = ( iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tvIridescenceThicknessMapUv = ( iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tvSheenColorMapUv = ( sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tvSheenRoughnessMapUv = ( sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULARMAP\n\tvSpecularMapUv = ( specularMapTransform * vec3( SPECULARMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tvSpecularColorMapUv = ( specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tvSpecularIntensityMapUv = ( specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tvTransmissionMapUv = ( transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_THICKNESSMAP\n\tvThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy;\n#endif`,Ou=`#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_BATCHING\n\t\tworldPosition = batchingMatrix * worldPosition;\n\t#endif\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif`,Bu=`varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}`,zu=`uniform sampler2D t2D;\nuniform float backgroundIntensity;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\ttexColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n}`,Vu=`varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\tgl_Position.z = gl_Position.w;\n}`,ku=`#ifdef ENVMAP_TYPE_CUBE\n\tuniform samplerCube envMap;\n#elif defined( ENVMAP_TYPE_CUBE_UV )\n\tuniform sampler2D envMap;\n#endif\nuniform float flipEnvMap;\nuniform float backgroundBlurriness;\nuniform float backgroundIntensity;\nvarying vec3 vWorldDirection;\n#include <cube_uv_reflection_fragment>\nvoid main() {\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 texColor = textureCube( envMap, vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 texColor = textureCubeUV( envMap, vWorldDirection, backgroundBlurriness );\n\t#else\n\t\tvec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n}`,Hu=`varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\tgl_Position.z = gl_Position.w;\n}`,Gu=`uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldDirection;\nvoid main() {\n\tvec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\n\tgl_FragColor = texColor;\n\tgl_FragColor.a *= opacity;\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n}`,Wu=`#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include <uv_vertex>\n\t#include <batching_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvHighPrecisionZW = gl_Position.zw;\n}`,Xu=`#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\t#include <logdepthbuf_fragment>\n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\t#endif\n}`,qu=`#define DISTANCE\nvarying vec3 vWorldPosition;\n#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <batching_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\tvWorldPosition = worldPosition.xyz;\n}`,Yu=`#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main () {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}`,Zu=`varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}`,Ju=`uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n}`,$u=`uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include <common>\n#include <uv_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\t#include <morphcolor_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}`,Ku=`uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}`,Qu=`#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\t#include <morphcolor_vertex>\n\t#include <batching_vertex>\n\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinbase_vertex>\n\t\t#include <skinnormal_vertex>\n\t\t#include <defaultnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <fog_vertex>\n}`,ju=`uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\t#include <specularmap_fragment>\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\t\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include <aomap_fragment>\n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include <envmap_fragment>\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}`,td=`#define LAMBERT\nvarying vec3 vViewPosition;\n#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\t#include <morphcolor_vertex>\n\t#include <batching_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}`,ed=`#define LAMBERT\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <normal_pars_fragment>\n#include <lights_lambert_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_lambert_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}`,nd=`#define MATCAP\nvarying vec3 vViewPosition;\n#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <color_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\t#include <morphcolor_vertex>\n\t#include <batching_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n\tvViewPosition = - mvPosition.xyz;\n}`,id=`#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#include <common>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <fog_pars_fragment>\n#include <normal_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t#else\n\t\tvec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}`,sd=`#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvarying vec3 vViewPosition;\n#endif\n#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <batching_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}`,rd=`#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvarying vec3 vViewPosition;\n#endif\n#include <packing>\n#include <uv_pars_fragment>\n#include <normal_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\t#include <logdepthbuf_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n\t#ifdef OPAQUE\n\t\tgl_FragColor.a = 1.0;\n\t#endif\n}`,ad=`#define PHONG\nvarying vec3 vViewPosition;\n#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\t#include <morphcolor_vertex>\n\t#include <batching_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}`,od=`#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <normal_pars_fragment>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_phong_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}`,ld=`#define STANDARD\nvarying vec3 vViewPosition;\n#ifdef USE_TRANSMISSION\n\tvarying vec3 vWorldPosition;\n#endif\n#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\t#include <morphcolor_vertex>\n\t#include <batching_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n#ifdef USE_TRANSMISSION\n\tvWorldPosition = worldPosition.xyz;\n#endif\n}`,cd=`#define STANDARD\n#ifdef PHYSICAL\n\t#define IOR\n\t#define USE_SPECULAR\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef IOR\n\tuniform float ior;\n#endif\n#ifdef USE_SPECULAR\n\tuniform float specularIntensity;\n\tuniform vec3 specularColor;\n\t#ifdef USE_SPECULAR_COLORMAP\n\t\tuniform sampler2D specularColorMap;\n\t#endif\n\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\tuniform sampler2D specularIntensityMap;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_IRIDESCENCE\n\tuniform float iridescence;\n\tuniform float iridescenceIOR;\n\tuniform float iridescenceThicknessMinimum;\n\tuniform float iridescenceThicknessMaximum;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheenColor;\n\tuniform float sheenRoughness;\n\t#ifdef USE_SHEEN_COLORMAP\n\t\tuniform sampler2D sheenColorMap;\n\t#endif\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tuniform sampler2D sheenRoughnessMap;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\tuniform vec2 anisotropyVector;\n\t#ifdef USE_ANISOTROPYMAP\n\t\tuniform sampler2D anisotropyMap;\n\t#endif\n#endif\nvarying vec3 vViewPosition;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <iridescence_fragment>\n#include <cube_uv_reflection_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_physical_pars_fragment>\n#include <fog_pars_fragment>\n#include <lights_pars_begin>\n#include <normal_pars_fragment>\n#include <lights_physical_pars_fragment>\n#include <transmission_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <clearcoat_pars_fragment>\n#include <iridescence_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <clearcoat_normal_fragment_begin>\n\t#include <clearcoat_normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n\t#include <transmission_fragment>\n\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\n\t#ifdef USE_SHEEN\n\t\tfloat sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\n\t\toutgoingLight = outgoingLight * sheenEnergyComp + sheenSpecularDirect + sheenSpecularIndirect;\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNVcc = saturate( dot( geometryClearcoatNormal, geometryViewDir ) );\n\t\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\n\t\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat;\n\t#endif\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}`,hd=`#define TOON\nvarying vec3 vViewPosition;\n#include <common>\n#include <batching_pars_vertex>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\t#include <morphcolor_vertex>\n\t#include <batching_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}`,ud=`#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <gradientmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <normal_pars_fragment>\n#include <lights_toon_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_toon_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}`,dd=`uniform float size;\nuniform float scale;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n#ifdef USE_POINTS_UV\n\tvarying vec2 vUv;\n\tuniform mat3 uvTransform;\n#endif\nvoid main() {\n\t#ifdef USE_POINTS_UV\n\t\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\t#endif\n\t#include <color_vertex>\n\t#include <morphcolor_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <fog_vertex>\n}`,fd=`uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}`,pd=`#include <common>\n#include <batching_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <batching_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}`,md=`uniform vec3 color;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <logdepthbuf_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\t#include <logdepthbuf_fragment>\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n}`,gd=`uniform float rotation;\nuniform vec2 center;\n#include <common>\n#include <uv_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}`,_d=`uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n}`,Dt={alphahash_fragment:zc,alphahash_pars_fragment:Vc,alphamap_fragment:kc,alphamap_pars_fragment:Hc,alphatest_fragment:Gc,alphatest_pars_fragment:Wc,aomap_fragment:Xc,aomap_pars_fragment:qc,batching_pars_vertex:Yc,batching_vertex:Zc,begin_vertex:Jc,beginnormal_vertex:$c,bsdfs:Kc,iridescence_fragment:Qc,bumpmap_pars_fragment:jc,clipping_planes_fragment:th,clipping_planes_pars_fragment:eh,clipping_planes_pars_vertex:nh,clipping_planes_vertex:ih,color_fragment:sh,color_pars_fragment:rh,color_pars_vertex:ah,color_vertex:oh,common:lh,cube_uv_reflection_fragment:ch,defaultnormal_vertex:hh,displacementmap_pars_vertex:uh,displacementmap_vertex:dh,emissivemap_fragment:fh,emissivemap_pars_fragment:ph,colorspace_fragment:mh,colorspace_pars_fragment:gh,envmap_fragment:_h,envmap_common_pars_fragment:xh,envmap_pars_fragment:vh,envmap_pars_vertex:yh,envmap_physical_pars_fragment:Ih,envmap_vertex:Mh,fog_vertex:Sh,fog_pars_vertex:bh,fog_fragment:Eh,fog_pars_fragment:wh,gradientmap_pars_fragment:Th,lightmap_fragment:Ah,lightmap_pars_fragment:Ch,lights_lambert_fragment:Rh,lights_lambert_pars_fragment:Ph,lights_pars_begin:Lh,lights_toon_fragment:Uh,lights_toon_pars_fragment:Dh,lights_phong_fragment:Nh,lights_phong_pars_fragment:Fh,lights_physical_fragment:Oh,lights_physical_pars_fragment:Bh,lights_fragment_begin:zh,lights_fragment_maps:Vh,lights_fragment_end:kh,logdepthbuf_fragment:Hh,logdepthbuf_pars_fragment:Gh,logdepthbuf_pars_vertex:Wh,logdepthbuf_vertex:Xh,map_fragment:qh,map_pars_fragment:Yh,map_particle_fragment:Zh,map_particle_pars_fragment:Jh,metalnessmap_fragment:$h,metalnessmap_pars_fragment:Kh,morphcolor_vertex:Qh,morphnormal_vertex:jh,morphtarget_pars_vertex:tu,morphtarget_vertex:eu,normal_fragment_begin:nu,normal_fragment_maps:iu,normal_pars_fragment:su,normal_pars_vertex:ru,normal_vertex:au,normalmap_pars_fragment:ou,clearcoat_normal_fragment_begin:lu,clearcoat_normal_fragment_maps:cu,clearcoat_pars_fragment:hu,iridescence_pars_fragment:uu,opaque_fragment:du,packing:fu,premultiplied_alpha_fragment:pu,project_vertex:mu,dithering_fragment:gu,dithering_pars_fragment:_u,roughnessmap_fragment:xu,roughnessmap_pars_fragment:vu,shadowmap_pars_fragment:yu,shadowmap_pars_vertex:Mu,shadowmap_vertex:Su,shadowmask_pars_fragment:bu,skinbase_vertex:Eu,skinning_pars_vertex:wu,skinning_vertex:Tu,skinnormal_vertex:Au,specularmap_fragment:Cu,specularmap_pars_fragment:Ru,tonemapping_fragment:Pu,tonemapping_pars_fragment:Lu,transmission_fragment:Iu,transmission_pars_fragment:Uu,uv_pars_fragment:Du,uv_pars_vertex:Nu,uv_vertex:Fu,worldpos_vertex:Ou,background_vert:Bu,background_frag:zu,backgroundCube_vert:Vu,backgroundCube_frag:ku,cube_vert:Hu,cube_frag:Gu,depth_vert:Wu,depth_frag:Xu,distanceRGBA_vert:qu,distanceRGBA_frag:Yu,equirect_vert:Zu,equirect_frag:Ju,linedashed_vert:$u,linedashed_frag:Ku,meshbasic_vert:Qu,meshbasic_frag:ju,meshlambert_vert:td,meshlambert_frag:ed,meshmatcap_vert:nd,meshmatcap_frag:id,meshnormal_vert:sd,meshnormal_frag:rd,meshphong_vert:ad,meshphong_frag:od,meshphysical_vert:ld,meshphysical_frag:cd,meshtoon_vert:hd,meshtoon_frag:ud,points_vert:dd,points_frag:fd,shadow_vert:pd,shadow_frag:md,sprite_vert:gd,sprite_frag:_d},it={common:{diffuse:{value:new Pt(16777215)},opacity:{value:1},map:{value:null},mapTransform:{value:new zt},alphaMap:{value:null},alphaMapTransform:{value:new zt},alphaTest:{value:0}},specularmap:{specularMap:{value:null},specularMapTransform:{value:new zt}},envmap:{envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1},aoMapTransform:{value:new zt}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1},lightMapTransform:{value:new zt}},bumpmap:{bumpMap:{value:null},bumpMapTransform:{value:new zt},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalMapTransform:{value:new zt},normalScale:{value:new Lt(1,1)}},displacementmap:{displacementMap:{value:null},displacementMapTransform:{value:new zt},displacementScale:{value:1},displacementBias:{value:0}},emissivemap:{emissiveMap:{value:null},emissiveMapTransform:{value:new zt}},metalnessmap:{metalnessMap:{value:null},metalnessMapTransform:{value:new zt}},roughnessmap:{roughnessMap:{value:null},roughnessMapTransform:{value:new zt}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new Pt(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotLightMap:{value:[]},spotShadowMap:{value:[]},spotLightMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new Pt(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaMapTransform:{value:new zt},alphaTest:{value:0},uvTransform:{value:new zt}},sprite:{diffuse:{value:new Pt(16777215)},opacity:{value:1},center:{value:new Lt(.5,.5)},rotation:{value:0},map:{value:null},mapTransform:{value:new zt},alphaMap:{value:null},alphaMapTransform:{value:new zt},alphaTest:{value:0}}},qe={basic:{uniforms:_e([it.common,it.specularmap,it.envmap,it.aomap,it.lightmap,it.fog]),vertexShader:Dt.meshbasic_vert,fragmentShader:Dt.meshbasic_frag},lambert:{uniforms:_e([it.common,it.specularmap,it.envmap,it.aomap,it.lightmap,it.emissivemap,it.bumpmap,it.normalmap,it.displacementmap,it.fog,it.lights,{emissive:{value:new Pt(0)}}]),vertexShader:Dt.meshlambert_vert,fragmentShader:Dt.meshlambert_frag},phong:{uniforms:_e([it.common,it.specularmap,it.envmap,it.aomap,it.lightmap,it.emissivemap,it.bumpmap,it.normalmap,it.displacementmap,it.fog,it.lights,{emissive:{value:new Pt(0)},specular:{value:new Pt(1118481)},shininess:{value:30}}]),vertexShader:Dt.meshphong_vert,fragmentShader:Dt.meshphong_frag},standard:{uniforms:_e([it.common,it.envmap,it.aomap,it.lightmap,it.emissivemap,it.bumpmap,it.normalmap,it.displacementmap,it.roughnessmap,it.metalnessmap,it.fog,it.lights,{emissive:{value:new Pt(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:Dt.meshphysical_vert,fragmentShader:Dt.meshphysical_frag},toon:{uniforms:_e([it.common,it.aomap,it.lightmap,it.emissivemap,it.bumpmap,it.normalmap,it.displacementmap,it.gradientmap,it.fog,it.lights,{emissive:{value:new Pt(0)}}]),vertexShader:Dt.meshtoon_vert,fragmentShader:Dt.meshtoon_frag},matcap:{uniforms:_e([it.common,it.bumpmap,it.normalmap,it.displacementmap,it.fog,{matcap:{value:null}}]),vertexShader:Dt.meshmatcap_vert,fragmentShader:Dt.meshmatcap_frag},points:{uniforms:_e([it.points,it.fog]),vertexShader:Dt.points_vert,fragmentShader:Dt.points_frag},dashed:{uniforms:_e([it.common,it.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:Dt.linedashed_vert,fragmentShader:Dt.linedashed_frag},depth:{uniforms:_e([it.common,it.displacementmap]),vertexShader:Dt.depth_vert,fragmentShader:Dt.depth_frag},normal:{uniforms:_e([it.common,it.bumpmap,it.normalmap,it.displacementmap,{opacity:{value:1}}]),vertexShader:Dt.meshnormal_vert,fragmentShader:Dt.meshnormal_frag},sprite:{uniforms:_e([it.sprite,it.fog]),vertexShader:Dt.sprite_vert,fragmentShader:Dt.sprite_frag},background:{uniforms:{uvTransform:{value:new zt},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:Dt.background_vert,fragmentShader:Dt.background_frag},backgroundCube:{uniforms:{envMap:{value:null},flipEnvMap:{value:-1},backgroundBlurriness:{value:0},backgroundIntensity:{value:1}},vertexShader:Dt.backgroundCube_vert,fragmentShader:Dt.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:Dt.cube_vert,fragmentShader:Dt.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:Dt.equirect_vert,fragmentShader:Dt.equirect_frag},distanceRGBA:{uniforms:_e([it.common,it.displacementmap,{referencePosition:{value:new N},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:Dt.distanceRGBA_vert,fragmentShader:Dt.distanceRGBA_frag},shadow:{uniforms:_e([it.lights,it.fog,{color:{value:new Pt(0)},opacity:{value:1}}]),vertexShader:Dt.shadow_vert,fragmentShader:Dt.shadow_frag}};qe.physical={uniforms:_e([qe.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatMapTransform:{value:new zt},clearcoatNormalMap:{value:null},clearcoatNormalMapTransform:{value:new zt},clearcoatNormalScale:{value:new Lt(1,1)},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatRoughnessMapTransform:{value:new zt},iridescence:{value:0},iridescenceMap:{value:null},iridescenceMapTransform:{value:new zt},iridescenceIOR:{value:1.3},iridescenceThicknessMinimum:{value:100},iridescenceThicknessMaximum:{value:400},iridescenceThicknessMap:{value:null},iridescenceThicknessMapTransform:{value:new zt},sheen:{value:0},sheenColor:{value:new Pt(0)},sheenColorMap:{value:null},sheenColorMapTransform:{value:new zt},sheenRoughness:{value:1},sheenRoughnessMap:{value:null},sheenRoughnessMapTransform:{value:new zt},transmission:{value:0},transmissionMap:{value:null},transmissionMapTransform:{value:new zt},transmissionSamplerSize:{value:new Lt},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},thicknessMapTransform:{value:new zt},attenuationDistance:{value:0},attenuationColor:{value:new Pt(0)},specularColor:{value:new Pt(1,1,1)},specularColorMap:{value:null},specularColorMapTransform:{value:new zt},specularIntensity:{value:1},specularIntensityMap:{value:null},specularIntensityMapTransform:{value:new zt},anisotropyVector:{value:new Lt},anisotropyMap:{value:null},anisotropyMapTransform:{value:new zt}}]),vertexShader:Dt.meshphysical_vert,fragmentShader:Dt.meshphysical_frag};var ns={r:0,b:0,g:0};function xd(i,t,e,n,s,r,o){let a=new Pt(0),l=r===!0?0:1,c,h,d=null,f=0,m=null;function g(p,u){let w=!1,v=u.isScene===!0?u.background:null;v&&v.isTexture&&(v=(u.backgroundBlurriness>0?e:t).get(v)),v===null?x(a,l):v&&v.isColor&&(x(v,1),w=!0);let P=i.xr.getEnvironmentBlendMode();P===\"additive\"?n.buffers.color.setClear(0,0,0,1,o):P===\"alpha-blend\"&&n.buffers.color.setClear(0,0,0,0,o),(i.autoClear||w)&&i.clear(i.autoClearColor,i.autoClearDepth,i.autoClearStencil),v&&(v.isCubeTexture||v.mapping===Is)?(h===void 0&&(h=new Ne(new Ti(1,1,1),new ue({name:\"BackgroundCubeMaterial\",uniforms:ci(qe.backgroundCube.uniforms),vertexShader:qe.backgroundCube.vertexShader,fragmentShader:qe.backgroundCube.fragmentShader,side:we,depthTest:!1,depthWrite:!1,fog:!1})),h.geometry.deleteAttribute(\"normal\"),h.geometry.deleteAttribute(\"uv\"),h.onBeforeRender=function(U,R,C){this.matrixWorld.copyPosition(C.matrixWorld)},Object.defineProperty(h.material,\"envMap\",{get:function(){return this.uniforms.envMap.value}}),s.update(h)),h.material.uniforms.envMap.value=v,h.material.uniforms.flipEnvMap.value=v.isCubeTexture&&v.isRenderTargetTexture===!1?-1:1,h.material.uniforms.backgroundBlurriness.value=u.backgroundBlurriness,h.material.uniforms.backgroundIntensity.value=u.backgroundIntensity,h.material.toneMapped=Wt.getTransfer(v.colorSpace)!==Jt,(d!==v||f!==v.version||m!==i.toneMapping)&&(h.material.needsUpdate=!0,d=v,f=v.version,m=i.toneMapping),h.layers.enableAll(),p.unshift(h,h.geometry,h.material,0,0,null)):v&&v.isTexture&&(c===void 0&&(c=new Ne(new Nr(2,2),new ue({name:\"BackgroundMaterial\",uniforms:ci(qe.background.uniforms),vertexShader:qe.background.vertexShader,fragmentShader:qe.background.fragmentShader,side:gn,depthTest:!1,depthWrite:!1,fog:!1})),c.geometry.deleteAttribute(\"normal\"),Object.defineProperty(c.material,\"map\",{get:function(){return this.uniforms.t2D.value}}),s.update(c)),c.material.uniforms.t2D.value=v,c.material.uniforms.backgroundIntensity.value=u.backgroundIntensity,c.material.toneMapped=Wt.getTransfer(v.colorSpace)!==Jt,v.matrixAutoUpdate===!0&&v.updateMatrix(),c.material.uniforms.uvTransform.value.copy(v.matrix),(d!==v||f!==v.version||m!==i.toneMapping)&&(c.material.needsUpdate=!0,d=v,f=v.version,m=i.toneMapping),c.layers.enableAll(),p.unshift(c,c.geometry,c.material,0,0,null))}function x(p,u){p.getRGB(ns,rl(i)),n.buffers.color.setClear(ns.r,ns.g,ns.b,u,o)}return{getClearColor:function(){return a},setClearColor:function(p,u=1){a.set(p),l=u,x(a,l)},getClearAlpha:function(){return l},setClearAlpha:function(p){l=p,x(a,l)},render:g}}function vd(i,t,e,n){let s=i.getParameter(i.MAX_VERTEX_ATTRIBS),r=n.isWebGL2?null:t.get(\"OES_vertex_array_object\"),o=n.isWebGL2||r!==null,a={},l=p(null),c=l,h=!1;function d(E,L,F,I,G){let X=!1;if(o){let Z=x(I,F,L);c!==Z&&(c=Z,m(c.object)),X=u(E,I,F,G),X&&w(E,I,F,G)}else{let Z=L.wireframe===!0;(c.geometry!==I.id||c.program!==F.id||c.wireframe!==Z)&&(c.geometry=I.id,c.program=F.id,c.wireframe=Z,X=!0)}G!==null&&e.update(G,i.ELEMENT_ARRAY_BUFFER),(X||h)&&(h=!1,Y(E,L,F,I),G!==null&&i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,e.get(G).buffer))}function f(){return n.isWebGL2?i.createVertexArray():r.createVertexArrayOES()}function m(E){return n.isWebGL2?i.bindVertexArray(E):r.bindVertexArrayOES(E)}function g(E){return n.isWebGL2?i.deleteVertexArray(E):r.deleteVertexArrayOES(E)}function x(E,L,F){let I=F.wireframe===!0,G=a[E.id];G===void 0&&(G={},a[E.id]=G);let X=G[L.id];X===void 0&&(X={},G[L.id]=X);let Z=X[I];return Z===void 0&&(Z=p(f()),X[I]=Z),Z}function p(E){let L=[],F=[],I=[];for(let G=0;G<s;G++)L[G]=0,F[G]=0,I[G]=0;return{geometry:null,program:null,wireframe:!1,newAttributes:L,enabledAttributes:F,attributeDivisors:I,object:E,attributes:{},index:null}}function u(E,L,F,I){let G=c.attributes,X=L.attributes,Z=0,$=F.getAttributes();for(let et in $)if($[et].location>=0){let q=G[et],st=X[et];if(st===void 0&&(et===\"instanceMatrix\"&&E.instanceMatrix&&(st=E.instanceMatrix),et===\"instanceColor\"&&E.instanceColor&&(st=E.instanceColor)),q===void 0||q.attribute!==st||st&&q.data!==st.data)return!0;Z++}return c.attributesNum!==Z||c.index!==I}function w(E,L,F,I){let G={},X=L.attributes,Z=0,$=F.getAttributes();for(let et in $)if($[et].location>=0){let q=X[et];q===void 0&&(et===\"instanceMatrix\"&&E.instanceMatrix&&(q=E.instanceMatrix),et===\"instanceColor\"&&E.instanceColor&&(q=E.instanceColor));let st={};st.attribute=q,q&&q.data&&(st.data=q.data),G[et]=st,Z++}c.attributes=G,c.attributesNum=Z,c.index=I}function v(){let E=c.newAttributes;for(let L=0,F=E.length;L<F;L++)E[L]=0}function P(E){U(E,0)}function U(E,L){let F=c.newAttributes,I=c.enabledAttributes,G=c.attributeDivisors;F[E]=1,I[E]===0&&(i.enableVertexAttribArray(E),I[E]=1),G[E]!==L&&((n.isWebGL2?i:t.get(\"ANGLE_instanced_arrays\"))[n.isWebGL2?\"vertexAttribDivisor\":\"vertexAttribDivisorANGLE\"](E,L),G[E]=L)}function R(){let E=c.newAttributes,L=c.enabledAttributes;for(let F=0,I=L.length;F<I;F++)L[F]!==E[F]&&(i.disableVertexAttribArray(F),L[F]=0)}function C(E,L,F,I,G,X,Z){Z===!0?i.vertexAttribIPointer(E,L,F,G,X):i.vertexAttribPointer(E,L,F,I,G,X)}function Y(E,L,F,I){if(n.isWebGL2===!1&&(E.isInstancedMesh||I.isInstancedBufferGeometry)&&t.get(\"ANGLE_instanced_arrays\")===null)return;v();let G=I.attributes,X=F.getAttributes(),Z=L.defaultAttributeValues;for(let $ in X){let et=X[$];if(et.location>=0){let W=G[$];if(W===void 0&&($===\"instanceMatrix\"&&E.instanceMatrix&&(W=E.instanceMatrix),$===\"instanceColor\"&&E.instanceColor&&(W=E.instanceColor)),W!==void 0){let q=W.normalized,st=W.itemSize,pt=e.get(W);if(pt===void 0)continue;let dt=pt.buffer,bt=pt.type,Et=pt.bytesPerElement,vt=n.isWebGL2===!0&&(bt===i.INT||bt===i.UNSIGNED_INT||W.gpuType===Zo);if(W.isInterleavedBufferAttribute){let kt=W.data,O=kt.stride,le=W.offset;if(kt.isInstancedInterleavedBuffer){for(let _t=0;_t<et.locationSize;_t++)U(et.location+_t,kt.meshPerAttribute);E.isInstancedMesh!==!0&&I._maxInstanceCount===void 0&&(I._maxInstanceCount=kt.meshPerAttribute*kt.count)}else for(let _t=0;_t<et.locationSize;_t++)P(et.location+_t);i.bindBuffer(i.ARRAY_BUFFER,dt);for(let _t=0;_t<et.locationSize;_t++)C(et.location+_t,st/et.locationSize,bt,q,O*Et,(le+st/et.locationSize*_t)*Et,vt)}else{if(W.isInstancedBufferAttribute){for(let kt=0;kt<et.locationSize;kt++)U(et.location+kt,W.meshPerAttribute);E.isInstancedMesh!==!0&&I._maxInstanceCount===void 0&&(I._maxInstanceCount=W.meshPerAttribute*W.count)}else for(let kt=0;kt<et.locationSize;kt++)P(et.location+kt);i.bindBuffer(i.ARRAY_BUFFER,dt);for(let kt=0;kt<et.locationSize;kt++)C(et.location+kt,st/et.locationSize,bt,q,st*Et,st/et.locationSize*kt*Et,vt)}}else if(Z!==void 0){let q=Z[$];if(q!==void 0)switch(q.length){case 2:i.vertexAttrib2fv(et.location,q);break;case 3:i.vertexAttrib3fv(et.location,q);break;case 4:i.vertexAttrib4fv(et.location,q);break;default:i.vertexAttrib1fv(et.location,q)}}}}R()}function S(){K();for(let E in a){let L=a[E];for(let F in L){let I=L[F];for(let G in I)g(I[G].object),delete I[G];delete L[F]}delete a[E]}}function b(E){if(a[E.id]===void 0)return;let L=a[E.id];for(let F in L){let I=L[F];for(let G in I)g(I[G].object),delete I[G];delete L[F]}delete a[E.id]}function H(E){for(let L in a){let F=a[L];if(F[E.id]===void 0)continue;let I=F[E.id];for(let G in I)g(I[G].object),delete I[G];delete F[E.id]}}function K(){T(),h=!0,c!==l&&(c=l,m(c.object))}function T(){l.geometry=null,l.program=null,l.wireframe=!1}return{setup:d,reset:K,resetDefaultState:T,dispose:S,releaseStatesOfGeometry:b,releaseStatesOfProgram:H,initAttributes:v,enableAttribute:P,disableUnusedAttributes:R}}function yd(i,t,e,n){let s=n.isWebGL2,r;function o(h){r=h}function a(h,d){i.drawArrays(r,h,d),e.update(d,r,1)}function l(h,d,f){if(f===0)return;let m,g;if(s)m=i,g=\"drawArraysInstanced\";else if(m=t.get(\"ANGLE_instanced_arrays\"),g=\"drawArraysInstancedANGLE\",m===null){console.error(\"THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.\");return}m[g](r,h,d,f),e.update(d,r,f)}function c(h,d,f){if(f===0)return;let m=t.get(\"WEBGL_multi_draw\");if(m===null)for(let g=0;g<f;g++)this.render(h[g],d[g]);else{m.multiDrawArraysWEBGL(r,h,0,d,0,f);let g=0;for(let x=0;x<f;x++)g+=d[x];e.update(g,r,1)}}this.setMode=o,this.render=a,this.renderInstances=l,this.renderMultiDraw=c}function Md(i,t,e){let n;function s(){if(n!==void 0)return n;if(t.has(\"EXT_texture_filter_anisotropic\")===!0){let C=t.get(\"EXT_texture_filter_anisotropic\");n=i.getParameter(C.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else n=0;return n}function r(C){if(C===\"highp\"){if(i.getShaderPrecisionFormat(i.VERTEX_SHADER,i.HIGH_FLOAT).precision>0&&i.getShaderPrecisionFormat(i.FRAGMENT_SHADER,i.HIGH_FLOAT).precision>0)return\"highp\";C=\"mediump\"}return C===\"mediump\"&&i.getShaderPrecisionFormat(i.VERTEX_SHADER,i.MEDIUM_FLOAT).precision>0&&i.getShaderPrecisionFormat(i.FRAGMENT_SHADER,i.MEDIUM_FLOAT).precision>0?\"mediump\":\"lowp\"}let o=typeof WebGL2RenderingContext<\"u\"&&i.constructor.name===\"WebGL2RenderingContext\",a=e.precision!==void 0?e.precision:\"highp\",l=r(a);l!==a&&(console.warn(\"THREE.WebGLRenderer:\",a,\"not supported, using\",l,\"instead.\"),a=l);let c=o||t.has(\"WEBGL_draw_buffers\"),h=e.logarithmicDepthBuffer===!0,d=i.getParameter(i.MAX_TEXTURE_IMAGE_UNITS),f=i.getParameter(i.MAX_VERTEX_TEXTURE_IMAGE_UNITS),m=i.getParameter(i.MAX_TEXTURE_SIZE),g=i.getParameter(i.MAX_CUBE_MAP_TEXTURE_SIZE),x=i.getParameter(i.MAX_VERTEX_ATTRIBS),p=i.getParameter(i.MAX_VERTEX_UNIFORM_VECTORS),u=i.getParameter(i.MAX_VARYING_VECTORS),w=i.getParameter(i.MAX_FRAGMENT_UNIFORM_VECTORS),v=f>0,P=o||t.has(\"OES_texture_float\"),U=v&&P,R=o?i.getParameter(i.MAX_SAMPLES):0;return{isWebGL2:o,drawBuffers:c,getMaxAnisotropy:s,getMaxPrecision:r,precision:a,logarithmicDepthBuffer:h,maxTextures:d,maxVertexTextures:f,maxTextureSize:m,maxCubemapSize:g,maxAttributes:x,maxVertexUniforms:p,maxVaryings:u,maxFragmentUniforms:w,vertexTextures:v,floatFragmentTextures:P,floatVertexTextures:U,maxSamples:R}}function Sd(i){let t=this,e=null,n=0,s=!1,r=!1,o=new en,a=new zt,l={value:null,needsUpdate:!1};this.uniform=l,this.numPlanes=0,this.numIntersection=0,this.init=function(d,f){let m=d.length!==0||f||n!==0||s;return s=f,n=d.length,m},this.beginShadows=function(){r=!0,h(null)},this.endShadows=function(){r=!1},this.setGlobalState=function(d,f){e=h(d,f,0)},this.setState=function(d,f,m){let g=d.clippingPlanes,x=d.clipIntersection,p=d.clipShadows,u=i.get(d);if(!s||g===null||g.length===0||r&&!p)r?h(null):c();else{let w=r?0:n,v=w*4,P=u.clippingState||null;l.value=P,P=h(g,f,v,m);for(let U=0;U!==v;++U)P[U]=e[U];u.clippingState=P,this.numIntersection=x?this.numPlanes:0,this.numPlanes+=w}};function c(){l.value!==e&&(l.value=e,l.needsUpdate=n>0),t.numPlanes=n,t.numIntersection=0}function h(d,f,m,g){let x=d!==null?d.length:0,p=null;if(x!==0){if(p=l.value,g!==!0||p===null){let u=m+x*4,w=f.matrixWorldInverse;a.getNormalMatrix(w),(p===null||p.length<u)&&(p=new Float32Array(u));for(let v=0,P=m;v!==x;++v,P+=4)o.copy(d[v]).applyMatrix4(w,a),o.normal.toArray(p,P),p[P+3]=o.constant}l.value=p,l.needsUpdate=!0}return t.numPlanes=x,t.numIntersection=0,p}}function bd(i){let t=new WeakMap;function e(o,a){return a===Er?o.mapping=ri:a===wr&&(o.mapping=ai),o}function n(o){if(o&&o.isTexture){let a=o.mapping;if(a===Er||a===wr)if(t.has(o)){let l=t.get(o).texture;return e(l,o.mapping)}else{let l=o.image;if(l&&l.height>0){let c=new Dr(l.height/2);return c.fromEquirectangularTexture(i,o),t.set(o,c),o.addEventListener(\"dispose\",s),e(c.texture,o.mapping)}else return null}}return o}function s(o){let a=o.target;a.removeEventListener(\"dispose\",s);let l=t.get(a);l!==void 0&&(t.delete(a),l.dispose())}function r(){t=new WeakMap}return{get:n,dispose:r}}var Ai=class extends bs{constructor(t=-1,e=1,n=1,s=-1,r=.1,o=2e3){super(),this.isOrthographicCamera=!0,this.type=\"OrthographicCamera\",this.zoom=1,this.view=null,this.left=t,this.right=e,this.top=n,this.bottom=s,this.near=r,this.far=o,this.updateProjectionMatrix()}copy(t,e){return super.copy(t,e),this.left=t.left,this.right=t.right,this.top=t.top,this.bottom=t.bottom,this.near=t.near,this.far=t.far,this.zoom=t.zoom,this.view=t.view===null?null:Object.assign({},t.view),this}setViewOffset(t,e,n,s,r,o){this.view===null&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=n,this.view.offsetY=s,this.view.width=r,this.view.height=o,this.updateProjectionMatrix()}clearViewOffset(){this.view!==null&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){let t=(this.right-this.left)/(2*this.zoom),e=(this.top-this.bottom)/(2*this.zoom),n=(this.right+this.left)/2,s=(this.top+this.bottom)/2,r=n-t,o=n+t,a=s+e,l=s-e;if(this.view!==null&&this.view.enabled){let c=(this.right-this.left)/this.view.fullWidth/this.zoom,h=(this.top-this.bottom)/this.view.fullHeight/this.zoom;r+=c*this.view.offsetX,o=r+c*this.view.width,a-=h*this.view.offsetY,l=a-h*this.view.height}this.projectionMatrix.makeOrthographic(r,o,a,l,this.near,this.far,this.coordinateSystem),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(t){let e=super.toJSON(t);return e.object.zoom=this.zoom,e.object.left=this.left,e.object.right=this.right,e.object.top=this.top,e.object.bottom=this.bottom,e.object.near=this.near,e.object.far=this.far,this.view!==null&&(e.object.view=Object.assign({},this.view)),e}},ti=4,xo=[.125,.215,.35,.446,.526,.582],Rn=20,gr=new Ai,vo=new Pt,_r=null,xr=0,vr=0,An=(1+Math.sqrt(5))/2,Qn=1/An,yo=[new N(1,1,1),new N(-1,1,1),new N(1,1,-1),new N(-1,1,-1),new N(0,An,Qn),new N(0,An,-Qn),new N(Qn,0,An),new N(-Qn,0,An),new N(An,Qn,0),new N(-An,Qn,0)],Ts=class{constructor(t){this._renderer=t,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._blurMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._compileMaterial(this._blurMaterial)}fromScene(t,e=0,n=.1,s=100){_r=this._renderer.getRenderTarget(),xr=this._renderer.getActiveCubeFace(),vr=this._renderer.getActiveMipmapLevel(),this._setSize(256);let r=this._allocateTargets();return r.depthBuffer=!0,this._sceneToCubeUV(t,n,s,r),e>0&&this._blur(r,0,0,e),this._applyPMREM(r),this._cleanup(r),r}fromEquirectangular(t,e=null){return this._fromTexture(t,e)}fromCubemap(t,e=null){return this._fromTexture(t,e)}compileCubemapShader(){this._cubemapMaterial===null&&(this._cubemapMaterial=bo(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){this._equirectMaterial===null&&(this._equirectMaterial=So(),this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),this._cubemapMaterial!==null&&this._cubemapMaterial.dispose(),this._equirectMaterial!==null&&this._equirectMaterial.dispose()}_setSize(t){this._lodMax=Math.floor(Math.log2(t)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){this._blurMaterial!==null&&this._blurMaterial.dispose(),this._pingPongRenderTarget!==null&&this._pingPongRenderTarget.dispose();for(let t=0;t<this._lodPlanes.length;t++)this._lodPlanes[t].dispose()}_cleanup(t){this._renderer.setRenderTarget(_r,xr,vr),t.scissorTest=!1,is(t,0,0,t.width,t.height)}_fromTexture(t,e){t.mapping===ri||t.mapping===ai?this._setSize(t.image.length===0?16:t.image[0].width||t.image[0].image.width):this._setSize(t.image.width/4),_r=this._renderer.getRenderTarget(),xr=this._renderer.getActiveCubeFace(),vr=this._renderer.getActiveMipmapLevel();let n=e||this._allocateTargets();return this._textureToCubeUV(t,n),this._applyPMREM(n),this._cleanup(n),n}_allocateTargets(){let t=3*Math.max(this._cubeSize,112),e=4*this._cubeSize,n={magFilter:Ue,minFilter:Ue,generateMipmaps:!1,type:ke,format:Ve,colorSpace:rn,depthBuffer:!1},s=Mo(t,e,n);if(this._pingPongRenderTarget===null||this._pingPongRenderTarget.width!==t||this._pingPongRenderTarget.height!==e){this._pingPongRenderTarget!==null&&this._dispose(),this._pingPongRenderTarget=Mo(t,e,n);let{_lodMax:r}=this;({sizeLods:this._sizeLods,lodPlanes:this._lodPlanes,sigmas:this._sigmas}=Ed(r)),this._blurMaterial=wd(r,t,e)}return s}_compileMaterial(t){let e=new Ne(this._lodPlanes[0],t);this._renderer.compile(e,gr)}_sceneToCubeUV(t,e,n,s){let a=new ve(90,1,e,n),l=[1,-1,1,1,1,1],c=[1,1,1,-1,-1,-1],h=this._renderer,d=h.autoClear,f=h.toneMapping;h.getClearColor(vo),h.toneMapping=pn,h.autoClear=!1;let m=new li({name:\"PMREM.Background\",side:we,depthWrite:!1,depthTest:!1}),g=new Ne(new Ti,m),x=!1,p=t.background;p?p.isColor&&(m.color.copy(p),t.background=null,x=!0):(m.color.copy(vo),x=!0);for(let u=0;u<6;u++){let w=u%3;w===0?(a.up.set(0,l[u],0),a.lookAt(c[u],0,0)):w===1?(a.up.set(0,0,l[u]),a.lookAt(0,c[u],0)):(a.up.set(0,l[u],0),a.lookAt(0,0,c[u]));let v=this._cubeSize;is(s,w*v,u>2?v:0,v,v),h.setRenderTarget(s),x&&h.render(g,a),h.render(t,a)}g.geometry.dispose(),g.material.dispose(),h.toneMapping=f,h.autoClear=d,t.background=p}_textureToCubeUV(t,e){let n=this._renderer,s=t.mapping===ri||t.mapping===ai;s?(this._cubemapMaterial===null&&(this._cubemapMaterial=bo()),this._cubemapMaterial.uniforms.flipEnvMap.value=t.isRenderTargetTexture===!1?-1:1):this._equirectMaterial===null&&(this._equirectMaterial=So());let r=s?this._cubemapMaterial:this._equirectMaterial,o=new Ne(this._lodPlanes[0],r),a=r.uniforms;a.envMap.value=t;let l=this._cubeSize;is(e,0,0,3*l,2*l),n.setRenderTarget(e),n.render(o,gr)}_applyPMREM(t){let e=this._renderer,n=e.autoClear;e.autoClear=!1;for(let s=1;s<this._lodPlanes.length;s++){let r=Math.sqrt(this._sigmas[s]*this._sigmas[s]-this._sigmas[s-1]*this._sigmas[s-1]),o=yo[(s-1)%yo.length];this._blur(t,s-1,s,r,o)}e.autoClear=n}_blur(t,e,n,s,r){let o=this._pingPongRenderTarget;this._halfBlur(t,o,e,n,s,\"latitudinal\",r),this._halfBlur(o,t,n,n,s,\"longitudinal\",r)}_halfBlur(t,e,n,s,r,o,a){let l=this._renderer,c=this._blurMaterial;o!==\"latitudinal\"&&o!==\"longitudinal\"&&console.error(\"blur direction must be either latitudinal or longitudinal!\");let h=3,d=new Ne(this._lodPlanes[s],c),f=c.uniforms,m=this._sizeLods[n]-1,g=isFinite(r)?Math.PI/(2*m):2*Math.PI/(2*Rn-1),x=r/g,p=isFinite(r)?1+Math.floor(h*x):Rn;p>Rn&&console.warn(`sigmaRadians, ${r}, is too large and will clip, as it requested ${p} samples when the maximum is set to ${Rn}`);let u=[],w=0;for(let C=0;C<Rn;++C){let Y=C/x,S=Math.exp(-Y*Y/2);u.push(S),C===0?w+=S:C<p&&(w+=2*S)}for(let C=0;C<u.length;C++)u[C]=u[C]/w;f.envMap.value=t.texture,f.samples.value=p,f.weights.value=u,f.latitudinal.value=o===\"latitudinal\",a&&(f.poleAxis.value=a);let{_lodMax:v}=this;f.dTheta.value=g,f.mipInt.value=v-n;let P=this._sizeLods[s],U=3*P*(s>v-ti?s-v+ti:0),R=4*(this._cubeSize-P);is(e,U,R,3*P,2*P),l.setRenderTarget(e),l.render(d,gr)}};function Ed(i){let t=[],e=[],n=[],s=i,r=i-ti+1+xo.length;for(let o=0;o<r;o++){let a=Math.pow(2,s);e.push(a);let l=1/a;o>i-ti?l=xo[o-i+ti-1]:o===0&&(l=0),n.push(l);let c=1/(a-2),h=-c,d=1+c,f=[h,h,d,h,d,d,h,h,d,d,h,d],m=6,g=6,x=3,p=2,u=1,w=new Float32Array(x*g*m),v=new Float32Array(p*g*m),P=new Float32Array(u*g*m);for(let R=0;R<m;R++){let C=R%3*2/3-1,Y=R>2?0:-1,S=[C,Y,0,C+2/3,Y,0,C+2/3,Y+1,0,C,Y,0,C+2/3,Y+1,0,C,Y+1,0];w.set(S,x*g*R),v.set(f,p*g*R);let b=[R,R,R,R,R,R];P.set(b,u*g*R)}let U=new Se;U.setAttribute(\"position\",new ye(w,x)),U.setAttribute(\"uv\",new ye(v,p)),U.setAttribute(\"faceIndex\",new ye(P,u)),t.push(U),s>ti&&s--}return{lodPlanes:t,sizeLods:e,sigmas:n}}function Mo(i,t,e){let n=new Me(i,t,e);return n.texture.mapping=Is,n.texture.name=\"PMREM.cubeUv\",n.scissorTest=!0,n}function is(i,t,e,n,s){i.viewport.set(t,e,n,s),i.scissor.set(t,e,n,s)}function wd(i,t,e){let n=new Float32Array(Rn),s=new N(0,1,0);return new ue({name:\"SphericalGaussianBlur\",defines:{n:Rn,CUBEUV_TEXEL_WIDTH:1/t,CUBEUV_TEXEL_HEIGHT:1/e,CUBEUV_MAX_MIP:`${i}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:n},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:s}},vertexShader:oa(),fragmentShader:`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include <cube_uv_reflection_fragment>\n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t`,blending:Ye,depthTest:!1,depthWrite:!1})}function So(){return new ue({name:\"EquirectangularToCubeUV\",uniforms:{envMap:{value:null}},vertexShader:oa(),fragmentShader:`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\n\t\t\t#include <common>\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tgl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 );\n\n\t\t\t}\n\t\t`,blending:Ye,depthTest:!1,depthWrite:!1})}function bo(){return new ue({name:\"CubemapToCubeUV\",uniforms:{envMap:{value:null},flipEnvMap:{value:-1}},vertexShader:oa(),fragmentShader:`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tuniform float flipEnvMap;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) );\n\n\t\t\t}\n\t\t`,blending:Ye,depthTest:!1,depthWrite:!1})}function oa(){return`\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t`}function Td(i){let t=new WeakMap,e=null;function n(a){if(a&&a.isTexture){let l=a.mapping,c=l===Er||l===wr,h=l===ri||l===ai;if(c||h)if(a.isRenderTargetTexture&&a.needsPMREMUpdate===!0){a.needsPMREMUpdate=!1;let d=t.get(a);return e===null&&(e=new Ts(i)),d=c?e.fromEquirectangular(a,d):e.fromCubemap(a,d),t.set(a,d),d.texture}else{if(t.has(a))return t.get(a).texture;{let d=a.image;if(c&&d&&d.height>0||h&&d&&s(d)){e===null&&(e=new Ts(i));let f=c?e.fromEquirectangular(a):e.fromCubemap(a);return t.set(a,f),a.addEventListener(\"dispose\",r),f.texture}else return null}}}return a}function s(a){let l=0,c=6;for(let h=0;h<c;h++)a[h]!==void 0&&l++;return l===c}function r(a){let l=a.target;l.removeEventListener(\"dispose\",r);let c=t.get(l);c!==void 0&&(t.delete(l),c.dispose())}function o(){t=new WeakMap,e!==null&&(e.dispose(),e=null)}return{get:n,dispose:o}}function Ad(i){let t={};function e(n){if(t[n]!==void 0)return t[n];let s;switch(n){case\"WEBGL_depth_texture\":s=i.getExtension(\"WEBGL_depth_texture\")||i.getExtension(\"MOZ_WEBGL_depth_texture\")||i.getExtension(\"WEBKIT_WEBGL_depth_texture\");break;case\"EXT_texture_filter_anisotropic\":s=i.getExtension(\"EXT_texture_filter_anisotropic\")||i.getExtension(\"MOZ_EXT_texture_filter_anisotropic\")||i.getExtension(\"WEBKIT_EXT_texture_filter_anisotropic\");break;case\"WEBGL_compressed_texture_s3tc\":s=i.getExtension(\"WEBGL_compressed_texture_s3tc\")||i.getExtension(\"MOZ_WEBGL_compressed_texture_s3tc\")||i.getExtension(\"WEBKIT_WEBGL_compressed_texture_s3tc\");break;case\"WEBGL_compressed_texture_pvrtc\":s=i.getExtension(\"WEBGL_compressed_texture_pvrtc\")||i.getExtension(\"WEBKIT_WEBGL_compressed_texture_pvrtc\");break;default:s=i.getExtension(n)}return t[n]=s,s}return{has:function(n){return e(n)!==null},init:function(n){n.isWebGL2?(e(\"EXT_color_buffer_float\"),e(\"WEBGL_clip_cull_distance\")):(e(\"WEBGL_depth_texture\"),e(\"OES_texture_float\"),e(\"OES_texture_half_float\"),e(\"OES_texture_half_float_linear\"),e(\"OES_standard_derivatives\"),e(\"OES_element_index_uint\"),e(\"OES_vertex_array_object\"),e(\"ANGLE_instanced_arrays\")),e(\"OES_texture_float_linear\"),e(\"EXT_color_buffer_half_float\"),e(\"WEBGL_multisampled_render_to_texture\")},get:function(n){let s=e(n);return s===null&&console.warn(\"THREE.WebGLRenderer: \"+n+\" extension not supported.\"),s}}}function Cd(i,t,e,n){let s={},r=new WeakMap;function o(d){let f=d.target;f.index!==null&&t.remove(f.index);for(let g in f.attributes)t.remove(f.attributes[g]);for(let g in f.morphAttributes){let x=f.morphAttributes[g];for(let p=0,u=x.length;p<u;p++)t.remove(x[p])}f.removeEventListener(\"dispose\",o),delete s[f.id];let m=r.get(f);m&&(t.remove(m),r.delete(f)),n.releaseStatesOfGeometry(f),f.isInstancedBufferGeometry===!0&&delete f._maxInstanceCount,e.memory.geometries--}function a(d,f){return s[f.id]===!0||(f.addEventListener(\"dispose\",o),s[f.id]=!0,e.memory.geometries++),f}function l(d){let f=d.attributes;for(let g in f)t.update(f[g],i.ARRAY_BUFFER);let m=d.morphAttributes;for(let g in m){let x=m[g];for(let p=0,u=x.length;p<u;p++)t.update(x[p],i.ARRAY_BUFFER)}}function c(d){let f=[],m=d.index,g=d.attributes.position,x=0;if(m!==null){let w=m.array;x=m.version;for(let v=0,P=w.length;v<P;v+=3){let U=w[v+0],R=w[v+1],C=w[v+2];f.push(U,R,R,C,C,U)}}else if(g!==void 0){let w=g.array;x=g.version;for(let v=0,P=w.length/3-1;v<P;v+=3){let U=v+0,R=v+1,C=v+2;f.push(U,R,R,C,C,U)}}else return;let p=new(il(f)?Ss:Ms)(f,1);p.version=x;let u=r.get(d);u&&t.remove(u),r.set(d,p)}function h(d){let f=r.get(d);if(f){let m=d.index;m!==null&&f.version<m.version&&c(d)}else c(d);return r.get(d)}return{get:a,update:l,getWireframeAttribute:h}}function Rd(i,t,e,n){let s=n.isWebGL2,r;function o(m){r=m}let a,l;function c(m){a=m.type,l=m.bytesPerElement}function h(m,g){i.drawElements(r,g,a,m*l),e.update(g,r,1)}function d(m,g,x){if(x===0)return;let p,u;if(s)p=i,u=\"drawElementsInstanced\";else if(p=t.get(\"ANGLE_instanced_arrays\"),u=\"drawElementsInstancedANGLE\",p===null){console.error(\"THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.\");return}p[u](r,g,a,m*l,x),e.update(g,r,x)}function f(m,g,x){if(x===0)return;let p=t.get(\"WEBGL_multi_draw\");if(p===null)for(let u=0;u<x;u++)this.render(m[u]/l,g[u]);else{p.multiDrawElementsWEBGL(r,g,0,a,m,0,x);let u=0;for(let w=0;w<x;w++)u+=g[w];e.update(u,r,1)}}this.setMode=o,this.setIndex=c,this.render=h,this.renderInstances=d,this.renderMultiDraw=f}function Pd(i){let t={geometries:0,textures:0},e={frame:0,calls:0,triangles:0,points:0,lines:0};function n(r,o,a){switch(e.calls++,o){case i.TRIANGLES:e.triangles+=a*(r/3);break;case i.LINES:e.lines+=a*(r/2);break;case i.LINE_STRIP:e.lines+=a*(r-1);break;case i.LINE_LOOP:e.lines+=a*r;break;case i.POINTS:e.points+=a*r;break;default:console.error(\"THREE.WebGLInfo: Unknown draw mode:\",o);break}}function s(){e.calls=0,e.triangles=0,e.points=0,e.lines=0}return{memory:t,render:e,programs:null,autoReset:!0,reset:s,update:n}}function Ld(i,t){return i[0]-t[0]}function Id(i,t){return Math.abs(t[1])-Math.abs(i[1])}function Ud(i,t,e){let n={},s=new Float32Array(8),r=new WeakMap,o=new he,a=[];for(let c=0;c<8;c++)a[c]=[c,0];function l(c,h,d){let f=c.morphTargetInfluences;if(t.isWebGL2===!0){let m=h.morphAttributes.position||h.morphAttributes.normal||h.morphAttributes.color,g=m!==void 0?m.length:0,x=r.get(h);if(x===void 0||x.count!==g){let E=function(){K.dispose(),r.delete(h),h.removeEventListener(\"dispose\",E)};x!==void 0&&x.texture.dispose();let w=h.morphAttributes.position!==void 0,v=h.morphAttributes.normal!==void 0,P=h.morphAttributes.color!==void 0,U=h.morphAttributes.position||[],R=h.morphAttributes.normal||[],C=h.morphAttributes.color||[],Y=0;w===!0&&(Y=1),v===!0&&(Y=2),P===!0&&(Y=3);let S=h.attributes.position.count*Y,b=1;S>t.maxTextureSize&&(b=Math.ceil(S/t.maxTextureSize),S=t.maxTextureSize);let H=new Float32Array(S*b*4*g),K=new xs(H,S,b,g);K.type=dn,K.needsUpdate=!0;let T=Y*4;for(let L=0;L<g;L++){let F=U[L],I=R[L],G=C[L],X=S*b*4*L;for(let Z=0;Z<F.count;Z++){let $=Z*T;w===!0&&(o.fromBufferAttribute(F,Z),H[X+$+0]=o.x,H[X+$+1]=o.y,H[X+$+2]=o.z,H[X+$+3]=0),v===!0&&(o.fromBufferAttribute(I,Z),H[X+$+4]=o.x,H[X+$+5]=o.y,H[X+$+6]=o.z,H[X+$+7]=0),P===!0&&(o.fromBufferAttribute(G,Z),H[X+$+8]=o.x,H[X+$+9]=o.y,H[X+$+10]=o.z,H[X+$+11]=G.itemSize===4?o.w:1)}}x={count:g,texture:K,size:new Lt(S,b)},r.set(h,x),h.addEventListener(\"dispose\",E)}let p=0;for(let w=0;w<f.length;w++)p+=f[w];let u=h.morphTargetsRelative?1:1-p;d.getUniforms().setValue(i,\"morphTargetBaseInfluence\",u),d.getUniforms().setValue(i,\"morphTargetInfluences\",f),d.getUniforms().setValue(i,\"morphTargetsTexture\",x.texture,e),d.getUniforms().setValue(i,\"morphTargetsTextureSize\",x.size)}else{let m=f===void 0?0:f.length,g=n[h.id];if(g===void 0||g.length!==m){g=[];for(let v=0;v<m;v++)g[v]=[v,0];n[h.id]=g}for(let v=0;v<m;v++){let P=g[v];P[0]=v,P[1]=f[v]}g.sort(Id);for(let v=0;v<8;v++)v<m&&g[v][1]?(a[v][0]=g[v][0],a[v][1]=g[v][1]):(a[v][0]=Number.MAX_SAFE_INTEGER,a[v][1]=0);a.sort(Ld);let x=h.morphAttributes.position,p=h.morphAttributes.normal,u=0;for(let v=0;v<8;v++){let P=a[v],U=P[0],R=P[1];U!==Number.MAX_SAFE_INTEGER&&R?(x&&h.getAttribute(\"morphTarget\"+v)!==x[U]&&h.setAttribute(\"morphTarget\"+v,x[U]),p&&h.getAttribute(\"morphNormal\"+v)!==p[U]&&h.setAttribute(\"morphNormal\"+v,p[U]),s[v]=R,u+=R):(x&&h.hasAttribute(\"morphTarget\"+v)===!0&&h.deleteAttribute(\"morphTarget\"+v),p&&h.hasAttribute(\"morphNormal\"+v)===!0&&h.deleteAttribute(\"morphNormal\"+v),s[v]=0)}let w=h.morphTargetsRelative?1:1-u;d.getUniforms().setValue(i,\"morphTargetBaseInfluence\",w),d.getUniforms().setValue(i,\"morphTargetInfluences\",s)}}return{update:l}}function Dd(i,t,e,n){let s=new WeakMap;function r(l){let c=n.render.frame,h=l.geometry,d=t.get(l,h);if(s.get(d)!==c&&(t.update(d),s.set(d,c)),l.isInstancedMesh&&(l.hasEventListener(\"dispose\",a)===!1&&l.addEventListener(\"dispose\",a),s.get(l)!==c&&(e.update(l.instanceMatrix,i.ARRAY_BUFFER),l.instanceColor!==null&&e.update(l.instanceColor,i.ARRAY_BUFFER),s.set(l,c))),l.isSkinnedMesh){let f=l.skeleton;s.get(f)!==c&&(f.update(),s.set(f,c))}return d}function o(){s=new WeakMap}function a(l){let c=l.target;c.removeEventListener(\"dispose\",a),e.remove(c.instanceMatrix),c.instanceColor!==null&&e.remove(c.instanceColor)}return{update:r,dispose:o}}var As=class extends He{constructor(t,e,n,s,r,o,a,l,c,h){if(h=h!==void 0?h:Ln,h!==Ln&&h!==oi)throw new Error(\"DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat\");n===void 0&&h===Ln&&(n=un),n===void 0&&h===oi&&(n=Pn),super(null,s,r,o,a,l,h,n,c),this.isDepthTexture=!0,this.image={width:t,height:e},this.magFilter=a!==void 0?a:xe,this.minFilter=l!==void 0?l:xe,this.flipY=!1,this.generateMipmaps=!1,this.compareFunction=null}copy(t){return super.copy(t),this.compareFunction=t.compareFunction,this}toJSON(t){let e=super.toJSON(t);return this.compareFunction!==null&&(e.compareFunction=this.compareFunction),e}},ol=new He,ll=new As(1,1);ll.compareFunction=nl;var cl=new xs,hl=new Ir,ul=new Es,Eo=[],wo=[],To=new Float32Array(16),Ao=new Float32Array(9),Co=new Float32Array(4);function fi(i,t,e){let n=i[0];if(n<=0||n>0)return i;let s=t*e,r=Eo[s];if(r===void 0&&(r=new Float32Array(s),Eo[s]=r),t!==0){n.toArray(r,0);for(let o=1,a=0;o!==t;++o)a+=e,i[o].toArray(r,a)}return r}function ne(i,t){if(i.length!==t.length)return!1;for(let e=0,n=i.length;e<n;e++)if(i[e]!==t[e])return!1;return!0}function ie(i,t){for(let e=0,n=t.length;e<n;e++)i[e]=t[e]}function Ds(i,t){let e=wo[t];e===void 0&&(e=new Int32Array(t),wo[t]=e);for(let n=0;n!==t;++n)e[n]=i.allocateTextureUnit();return e}function Nd(i,t){let e=this.cache;e[0]!==t&&(i.uniform1f(this.addr,t),e[0]=t)}function Fd(i,t){let e=this.cache;if(t.x!==void 0)(e[0]!==t.x||e[1]!==t.y)&&(i.uniform2f(this.addr,t.x,t.y),e[0]=t.x,e[1]=t.y);else{if(ne(e,t))return;i.uniform2fv(this.addr,t),ie(e,t)}}function Od(i,t){let e=this.cache;if(t.x!==void 0)(e[0]!==t.x||e[1]!==t.y||e[2]!==t.z)&&(i.uniform3f(this.addr,t.x,t.y,t.z),e[0]=t.x,e[1]=t.y,e[2]=t.z);else if(t.r!==void 0)(e[0]!==t.r||e[1]!==t.g||e[2]!==t.b)&&(i.uniform3f(this.addr,t.r,t.g,t.b),e[0]=t.r,e[1]=t.g,e[2]=t.b);else{if(ne(e,t))return;i.uniform3fv(this.addr,t),ie(e,t)}}function Bd(i,t){let e=this.cache;if(t.x!==void 0)(e[0]!==t.x||e[1]!==t.y||e[2]!==t.z||e[3]!==t.w)&&(i.uniform4f(this.addr,t.x,t.y,t.z,t.w),e[0]=t.x,e[1]=t.y,e[2]=t.z,e[3]=t.w);else{if(ne(e,t))return;i.uniform4fv(this.addr,t),ie(e,t)}}function zd(i,t){let e=this.cache,n=t.elements;if(n===void 0){if(ne(e,t))return;i.uniformMatrix2fv(this.addr,!1,t),ie(e,t)}else{if(ne(e,n))return;Co.set(n),i.uniformMatrix2fv(this.addr,!1,Co),ie(e,n)}}function Vd(i,t){let e=this.cache,n=t.elements;if(n===void 0){if(ne(e,t))return;i.uniformMatrix3fv(this.addr,!1,t),ie(e,t)}else{if(ne(e,n))return;Ao.set(n),i.uniformMatrix3fv(this.addr,!1,Ao),ie(e,n)}}function kd(i,t){let e=this.cache,n=t.elements;if(n===void 0){if(ne(e,t))return;i.uniformMatrix4fv(this.addr,!1,t),ie(e,t)}else{if(ne(e,n))return;To.set(n),i.uniformMatrix4fv(this.addr,!1,To),ie(e,n)}}function Hd(i,t){let e=this.cache;e[0]!==t&&(i.uniform1i(this.addr,t),e[0]=t)}function Gd(i,t){let e=this.cache;if(t.x!==void 0)(e[0]!==t.x||e[1]!==t.y)&&(i.uniform2i(this.addr,t.x,t.y),e[0]=t.x,e[1]=t.y);else{if(ne(e,t))return;i.uniform2iv(this.addr,t),ie(e,t)}}function Wd(i,t){let e=this.cache;if(t.x!==void 0)(e[0]!==t.x||e[1]!==t.y||e[2]!==t.z)&&(i.uniform3i(this.addr,t.x,t.y,t.z),e[0]=t.x,e[1]=t.y,e[2]=t.z);else{if(ne(e,t))return;i.uniform3iv(this.addr,t),ie(e,t)}}function Xd(i,t){let e=this.cache;if(t.x!==void 0)(e[0]!==t.x||e[1]!==t.y||e[2]!==t.z||e[3]!==t.w)&&(i.uniform4i(this.addr,t.x,t.y,t.z,t.w),e[0]=t.x,e[1]=t.y,e[2]=t.z,e[3]=t.w);else{if(ne(e,t))return;i.uniform4iv(this.addr,t),ie(e,t)}}function qd(i,t){let e=this.cache;e[0]!==t&&(i.uniform1ui(this.addr,t),e[0]=t)}function Yd(i,t){let e=this.cache;if(t.x!==void 0)(e[0]!==t.x||e[1]!==t.y)&&(i.uniform2ui(this.addr,t.x,t.y),e[0]=t.x,e[1]=t.y);else{if(ne(e,t))return;i.uniform2uiv(this.addr,t),ie(e,t)}}function Zd(i,t){let e=this.cache;if(t.x!==void 0)(e[0]!==t.x||e[1]!==t.y||e[2]!==t.z)&&(i.uniform3ui(this.addr,t.x,t.y,t.z),e[0]=t.x,e[1]=t.y,e[2]=t.z);else{if(ne(e,t))return;i.uniform3uiv(this.addr,t),ie(e,t)}}function Jd(i,t){let e=this.cache;if(t.x!==void 0)(e[0]!==t.x||e[1]!==t.y||e[2]!==t.z||e[3]!==t.w)&&(i.uniform4ui(this.addr,t.x,t.y,t.z,t.w),e[0]=t.x,e[1]=t.y,e[2]=t.z,e[3]=t.w);else{if(ne(e,t))return;i.uniform4uiv(this.addr,t),ie(e,t)}}function $d(i,t,e){let n=this.cache,s=e.allocateTextureUnit();n[0]!==s&&(i.uniform1i(this.addr,s),n[0]=s);let r=this.type===i.SAMPLER_2D_SHADOW?ll:ol;e.setTexture2D(t||r,s)}function Kd(i,t,e){let n=this.cache,s=e.allocateTextureUnit();n[0]!==s&&(i.uniform1i(this.addr,s),n[0]=s),e.setTexture3D(t||hl,s)}function Qd(i,t,e){let n=this.cache,s=e.allocateTextureUnit();n[0]!==s&&(i.uniform1i(this.addr,s),n[0]=s),e.setTextureCube(t||ul,s)}function jd(i,t,e){let n=this.cache,s=e.allocateTextureUnit();n[0]!==s&&(i.uniform1i(this.addr,s),n[0]=s),e.setTexture2DArray(t||cl,s)}function tf(i){switch(i){case 5126:return Nd;case 35664:return Fd;case 35665:return Od;case 35666:return Bd;case 35674:return zd;case 35675:return Vd;case 35676:return kd;case 5124:case 35670:return Hd;case 35667:case 35671:return Gd;case 35668:case 35672:return Wd;case 35669:case 35673:return Xd;case 5125:return qd;case 36294:return Yd;case 36295:return Zd;case 36296:return Jd;case 35678:case 36198:case 36298:case 36306:case 35682:return $d;case 35679:case 36299:case 36307:return Kd;case 35680:case 36300:case 36308:case 36293:return Qd;case 36289:case 36303:case 36311:case 36292:return jd}}function ef(i,t){i.uniform1fv(this.addr,t)}function nf(i,t){let e=fi(t,this.size,2);i.uniform2fv(this.addr,e)}function sf(i,t){let e=fi(t,this.size,3);i.uniform3fv(this.addr,e)}function rf(i,t){let e=fi(t,this.size,4);i.uniform4fv(this.addr,e)}function af(i,t){let e=fi(t,this.size,4);i.uniformMatrix2fv(this.addr,!1,e)}function of(i,t){let e=fi(t,this.size,9);i.uniformMatrix3fv(this.addr,!1,e)}function lf(i,t){let e=fi(t,this.size,16);i.uniformMatrix4fv(this.addr,!1,e)}function cf(i,t){i.uniform1iv(this.addr,t)}function hf(i,t){i.uniform2iv(this.addr,t)}function uf(i,t){i.uniform3iv(this.addr,t)}function df(i,t){i.uniform4iv(this.addr,t)}function ff(i,t){i.uniform1uiv(this.addr,t)}function pf(i,t){i.uniform2uiv(this.addr,t)}function mf(i,t){i.uniform3uiv(this.addr,t)}function gf(i,t){i.uniform4uiv(this.addr,t)}function _f(i,t,e){let n=this.cache,s=t.length,r=Ds(e,s);ne(n,r)||(i.uniform1iv(this.addr,r),ie(n,r));for(let o=0;o!==s;++o)e.setTexture2D(t[o]||ol,r[o])}function xf(i,t,e){let n=this.cache,s=t.length,r=Ds(e,s);ne(n,r)||(i.uniform1iv(this.addr,r),ie(n,r));for(let o=0;o!==s;++o)e.setTexture3D(t[o]||hl,r[o])}function vf(i,t,e){let n=this.cache,s=t.length,r=Ds(e,s);ne(n,r)||(i.uniform1iv(this.addr,r),ie(n,r));for(let o=0;o!==s;++o)e.setTextureCube(t[o]||ul,r[o])}function yf(i,t,e){let n=this.cache,s=t.length,r=Ds(e,s);ne(n,r)||(i.uniform1iv(this.addr,r),ie(n,r));for(let o=0;o!==s;++o)e.setTexture2DArray(t[o]||cl,r[o])}function Mf(i){switch(i){case 5126:return ef;case 35664:return nf;case 35665:return sf;case 35666:return rf;case 35674:return af;case 35675:return of;case 35676:return lf;case 5124:case 35670:return cf;case 35667:case 35671:return hf;case 35668:case 35672:return uf;case 35669:case 35673:return df;case 5125:return ff;case 36294:return pf;case 36295:return mf;case 36296:return gf;case 35678:case 36198:case 36298:case 36306:case 35682:return _f;case 35679:case 36299:case 36307:return xf;case 35680:case 36300:case 36308:case 36293:return vf;case 36289:case 36303:case 36311:case 36292:return yf}}var Fr=class{constructor(t,e,n){this.id=t,this.addr=n,this.cache=[],this.type=e.type,this.setValue=tf(e.type)}},Or=class{constructor(t,e,n){this.id=t,this.addr=n,this.cache=[],this.type=e.type,this.size=e.size,this.setValue=Mf(e.type)}},Br=class{constructor(t){this.id=t,this.seq=[],this.map={}}setValue(t,e,n){let s=this.seq;for(let r=0,o=s.length;r!==o;++r){let a=s[r];a.setValue(t,e[a.id],n)}}},yr=/(\\w+)(\\])?(\\[|\\.)?/g;function Ro(i,t){i.seq.push(t),i.map[t.id]=t}function Sf(i,t,e){let n=i.name,s=n.length;for(yr.lastIndex=0;;){let r=yr.exec(n),o=yr.lastIndex,a=r[1],l=r[2]===\"]\",c=r[3];if(l&&(a=a|0),c===void 0||c===\"[\"&&o+2===s){Ro(e,c===void 0?new Fr(a,i,t):new Or(a,i,t));break}else{let d=e.map[a];d===void 0&&(d=new Br(a),Ro(e,d)),e=d}}}var si=class{constructor(t,e){this.seq=[],this.map={};let n=t.getProgramParameter(e,t.ACTIVE_UNIFORMS);for(let s=0;s<n;++s){let r=t.getActiveUniform(e,s),o=t.getUniformLocation(e,r.name);Sf(r,o,this)}}setValue(t,e,n,s){let r=this.map[e];r!==void 0&&r.setValue(t,n,s)}setOptional(t,e,n){let s=e[n];s!==void 0&&this.setValue(t,n,s)}static upload(t,e,n,s){for(let r=0,o=e.length;r!==o;++r){let a=e[r],l=n[a.id];l.needsUpdate!==!1&&a.setValue(t,l.value,s)}}static seqWithValue(t,e){let n=[];for(let s=0,r=t.length;s!==r;++s){let o=t[s];o.id in e&&n.push(o)}return n}};function Po(i,t,e){let n=i.createShader(t);return i.shaderSource(n,e),i.compileShader(n),n}var bf=37297,Ef=0;function wf(i,t){let e=i.split(`\n`),n=[],s=Math.max(t-6,0),r=Math.min(t+6,e.length);for(let o=s;o<r;o++){let a=o+1;n.push(`${a===t?\">\":\" \"} ${a}: ${e[o]}`)}return n.join(`\n`)}function Tf(i){let t=Wt.getPrimaries(Wt.workingColorSpace),e=Wt.getPrimaries(i),n;switch(t===e?n=\"\":t===fs&&e===ds?n=\"LinearDisplayP3ToLinearSRGB\":t===ds&&e===fs&&(n=\"LinearSRGBToLinearDisplayP3\"),i){case rn:case Us:return[n,\"LinearTransferOETF\"];case ce:case aa:return[n,\"sRGBTransferOETF\"];default:return console.warn(\"THREE.WebGLProgram: Unsupported color space:\",i),[n,\"LinearTransferOETF\"]}}function Lo(i,t,e){let n=i.getShaderParameter(t,i.COMPILE_STATUS),s=i.getShaderInfoLog(t).trim();if(n&&s===\"\")return\"\";let r=/ERROR: 0:(\\d+)/.exec(s);if(r){let o=parseInt(r[1]);return e.toUpperCase()+`\n\n`+s+`\n\n`+wf(i.getShaderSource(t),o)}else return s}function Af(i,t){let e=Tf(t);return`vec4 ${i}( vec4 value ) { return ${e[0]}( ${e[1]}( value ) ); }`}function Cf(i,t){let e;switch(t){case ql:e=\"Linear\";break;case Yl:e=\"Reinhard\";break;case Zl:e=\"OptimizedCineon\";break;case sa:e=\"ACESFilmic\";break;case $l:e=\"AgX\";break;case Jl:e=\"Custom\";break;default:console.warn(\"THREE.WebGLProgram: Unsupported toneMapping:\",t),e=\"Linear\"}return\"vec3 \"+i+\"( vec3 color ) { return \"+e+\"ToneMapping( color ); }\"}function Rf(i){return[i.extensionDerivatives||i.envMapCubeUVHeight||i.bumpMap||i.normalMapTangentSpace||i.clearcoatNormalMap||i.flatShading||i.shaderID===\"physical\"?\"#extension GL_OES_standard_derivatives : enable\":\"\",(i.extensionFragDepth||i.logarithmicDepthBuffer)&&i.rendererExtensionFragDepth?\"#extension GL_EXT_frag_depth : enable\":\"\",i.extensionDrawBuffers&&i.rendererExtensionDrawBuffers?\"#extension GL_EXT_draw_buffers : require\":\"\",(i.extensionShaderTextureLOD||i.envMap||i.transmission)&&i.rendererExtensionShaderTextureLod?\"#extension GL_EXT_shader_texture_lod : enable\":\"\"].filter(ei).join(`\n`)}function Pf(i){return[i.extensionClipCullDistance?\"#extension GL_ANGLE_clip_cull_distance : require\":\"\"].filter(ei).join(`\n`)}function Lf(i){let t=[];for(let e in i){let n=i[e];n!==!1&&t.push(\"#define \"+e+\" \"+n)}return t.join(`\n`)}function If(i,t){let e={},n=i.getProgramParameter(t,i.ACTIVE_ATTRIBUTES);for(let s=0;s<n;s++){let r=i.getActiveAttrib(t,s),o=r.name,a=1;r.type===i.FLOAT_MAT2&&(a=2),r.type===i.FLOAT_MAT3&&(a=3),r.type===i.FLOAT_MAT4&&(a=4),e[o]={type:r.type,location:i.getAttribLocation(t,o),locationSize:a}}return e}function ei(i){return i!==\"\"}function Io(i,t){let e=t.numSpotLightShadows+t.numSpotLightMaps-t.numSpotLightShadowsWithMaps;return i.replace(/NUM_DIR_LIGHTS/g,t.numDirLights).replace(/NUM_SPOT_LIGHTS/g,t.numSpotLights).replace(/NUM_SPOT_LIGHT_MAPS/g,t.numSpotLightMaps).replace(/NUM_SPOT_LIGHT_COORDS/g,e).replace(/NUM_RECT_AREA_LIGHTS/g,t.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,t.numPointLights).replace(/NUM_HEMI_LIGHTS/g,t.numHemiLights).replace(/NUM_DIR_LIGHT_SHADOWS/g,t.numDirLightShadows).replace(/NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS/g,t.numSpotLightShadowsWithMaps).replace(/NUM_SPOT_LIGHT_SHADOWS/g,t.numSpotLightShadows).replace(/NUM_POINT_LIGHT_SHADOWS/g,t.numPointLightShadows)}function Uo(i,t){return i.replace(/NUM_CLIPPING_PLANES/g,t.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,t.numClippingPlanes-t.numClipIntersection)}var Uf=/^[ \\t]*#include +<([\\w\\d./]+)>/gm;function zr(i){return i.replace(Uf,Nf)}var Df=new Map([[\"encodings_fragment\",\"colorspace_fragment\"],[\"encodings_pars_fragment\",\"colorspace_pars_fragment\"],[\"output_fragment\",\"opaque_fragment\"]]);function Nf(i,t){let e=Dt[t];if(e===void 0){let n=Df.get(t);if(n!==void 0)e=Dt[n],console.warn('THREE.WebGLRenderer: Shader chunk \"%s\" has been deprecated. Use \"%s\" instead.',t,n);else throw new Error(\"Can not resolve #include <\"+t+\">\")}return zr(e)}var Ff=/#pragma unroll_loop_start\\s+for\\s*\\(\\s*int\\s+i\\s*=\\s*(\\d+)\\s*;\\s*i\\s*<\\s*(\\d+)\\s*;\\s*i\\s*\\+\\+\\s*\\)\\s*{([\\s\\S]+?)}\\s+#pragma unroll_loop_end/g;function Do(i){return i.replace(Ff,Of)}function Of(i,t,e,n){let s=\"\";for(let r=parseInt(t);r<parseInt(e);r++)s+=n.replace(/\\[\\s*i\\s*\\]/g,\"[ \"+r+\" ]\").replace(/UNROLLED_LOOP_INDEX/g,r);return s}function No(i){let t=\"precision \"+i.precision+` float;\nprecision `+i.precision+\" int;\";return i.precision===\"highp\"?t+=`\n#define HIGH_PRECISION`:i.precision===\"mediump\"?t+=`\n#define MEDIUM_PRECISION`:i.precision===\"lowp\"&&(t+=`\n#define LOW_PRECISION`),t}function Bf(i){let t=\"SHADOWMAP_TYPE_BASIC\";return i.shadowMapType===Xo?t=\"SHADOWMAP_TYPE_PCF\":i.shadowMapType===yl?t=\"SHADOWMAP_TYPE_PCF_SOFT\":i.shadowMapType===tn&&(t=\"SHADOWMAP_TYPE_VSM\"),t}function zf(i){let t=\"ENVMAP_TYPE_CUBE\";if(i.envMap)switch(i.envMapMode){case ri:case ai:t=\"ENVMAP_TYPE_CUBE\";break;case Is:t=\"ENVMAP_TYPE_CUBE_UV\";break}return t}function Vf(i){let t=\"ENVMAP_MODE_REFLECTION\";if(i.envMap)switch(i.envMapMode){case ai:t=\"ENVMAP_MODE_REFRACTION\";break}return t}function kf(i){let t=\"ENVMAP_BLENDING_NONE\";if(i.envMap)switch(i.combine){case qo:t=\"ENVMAP_BLENDING_MULTIPLY\";break;case Wl:t=\"ENVMAP_BLENDING_MIX\";break;case Xl:t=\"ENVMAP_BLENDING_ADD\";break}return t}function Hf(i){let t=i.envMapCubeUVHeight;if(t===null)return null;let e=Math.log2(t)-2,n=1/t;return{texelWidth:1/(3*Math.max(Math.pow(2,e),112)),texelHeight:n,maxMip:e}}function Gf(i,t,e,n){let s=i.getContext(),r=e.defines,o=e.vertexShader,a=e.fragmentShader,l=Bf(e),c=zf(e),h=Vf(e),d=kf(e),f=Hf(e),m=e.isWebGL2?\"\":Rf(e),g=Pf(e),x=Lf(r),p=s.createProgram(),u,w,v=e.glslVersion?\"#version \"+e.glslVersion+`\n`:\"\";e.isRawShaderMaterial?(u=[\"#define SHADER_TYPE \"+e.shaderType,\"#define SHADER_NAME \"+e.shaderName,x].filter(ei).join(`\n`),u.length>0&&(u+=`\n`),w=[m,\"#define SHADER_TYPE \"+e.shaderType,\"#define SHADER_NAME \"+e.shaderName,x].filter(ei).join(`\n`),w.length>0&&(w+=`\n`)):(u=[No(e),\"#define SHADER_TYPE \"+e.shaderType,\"#define SHADER_NAME \"+e.shaderName,x,e.extensionClipCullDistance?\"#define USE_CLIP_DISTANCE\":\"\",e.batching?\"#define USE_BATCHING\":\"\",e.instancing?\"#define USE_INSTANCING\":\"\",e.instancingColor?\"#define USE_INSTANCING_COLOR\":\"\",e.useFog&&e.fog?\"#define USE_FOG\":\"\",e.useFog&&e.fogExp2?\"#define FOG_EXP2\":\"\",e.map?\"#define USE_MAP\":\"\",e.envMap?\"#define USE_ENVMAP\":\"\",e.envMap?\"#define \"+h:\"\",e.lightMap?\"#define USE_LIGHTMAP\":\"\",e.aoMap?\"#define USE_AOMAP\":\"\",e.bumpMap?\"#define USE_BUMPMAP\":\"\",e.normalMap?\"#define USE_NORMALMAP\":\"\",e.normalMapObjectSpace?\"#define USE_NORMALMAP_OBJECTSPACE\":\"\",e.normalMapTangentSpace?\"#define USE_NORMALMAP_TANGENTSPACE\":\"\",e.displacementMap?\"#define USE_DISPLACEMENTMAP\":\"\",e.emissiveMap?\"#define USE_EMISSIVEMAP\":\"\",e.anisotropy?\"#define USE_ANISOTROPY\":\"\",e.anisotropyMap?\"#define USE_ANISOTROPYMAP\":\"\",e.clearcoatMap?\"#define USE_CLEARCOATMAP\":\"\",e.clearcoatRoughnessMap?\"#define USE_CLEARCOAT_ROUGHNESSMAP\":\"\",e.clearcoatNormalMap?\"#define USE_CLEARCOAT_NORMALMAP\":\"\",e.iridescenceMap?\"#define USE_IRIDESCENCEMAP\":\"\",e.iridescenceThicknessMap?\"#define USE_IRIDESCENCE_THICKNESSMAP\":\"\",e.specularMap?\"#define USE_SPECULARMAP\":\"\",e.specularColorMap?\"#define USE_SPECULAR_COLORMAP\":\"\",e.specularIntensityMap?\"#define USE_SPECULAR_INTENSITYMAP\":\"\",e.roughnessMap?\"#define USE_ROUGHNESSMAP\":\"\",e.metalnessMap?\"#define USE_METALNESSMAP\":\"\",e.alphaMap?\"#define USE_ALPHAMAP\":\"\",e.alphaHash?\"#define USE_ALPHAHASH\":\"\",e.transmission?\"#define USE_TRANSMISSION\":\"\",e.transmissionMap?\"#define USE_TRANSMISSIONMAP\":\"\",e.thicknessMap?\"#define USE_THICKNESSMAP\":\"\",e.sheenColorMap?\"#define USE_SHEEN_COLORMAP\":\"\",e.sheenRoughnessMap?\"#define USE_SHEEN_ROUGHNESSMAP\":\"\",e.mapUv?\"#define MAP_UV \"+e.mapUv:\"\",e.alphaMapUv?\"#define ALPHAMAP_UV \"+e.alphaMapUv:\"\",e.lightMapUv?\"#define LIGHTMAP_UV \"+e.lightMapUv:\"\",e.aoMapUv?\"#define AOMAP_UV \"+e.aoMapUv:\"\",e.emissiveMapUv?\"#define EMISSIVEMAP_UV \"+e.emissiveMapUv:\"\",e.bumpMapUv?\"#define BUMPMAP_UV \"+e.bumpMapUv:\"\",e.normalMapUv?\"#define NORMALMAP_UV \"+e.normalMapUv:\"\",e.displacementMapUv?\"#define DISPLACEMENTMAP_UV \"+e.displacementMapUv:\"\",e.metalnessMapUv?\"#define METALNESSMAP_UV \"+e.metalnessMapUv:\"\",e.roughnessMapUv?\"#define ROUGHNESSMAP_UV \"+e.roughnessMapUv:\"\",e.anisotropyMapUv?\"#define ANISOTROPYMAP_UV \"+e.anisotropyMapUv:\"\",e.clearcoatMapUv?\"#define CLEARCOATMAP_UV \"+e.clearcoatMapUv:\"\",e.clearcoatNormalMapUv?\"#define CLEARCOAT_NORMALMAP_UV \"+e.clearcoatNormalMapUv:\"\",e.clearcoatRoughnessMapUv?\"#define CLEARCOAT_ROUGHNESSMAP_UV \"+e.clearcoatRoughnessMapUv:\"\",e.iridescenceMapUv?\"#define IRIDESCENCEMAP_UV \"+e.iridescenceMapUv:\"\",e.iridescenceThicknessMapUv?\"#define IRIDESCENCE_THICKNESSMAP_UV \"+e.iridescenceThicknessMapUv:\"\",e.sheenColorMapUv?\"#define SHEEN_COLORMAP_UV \"+e.sheenColorMapUv:\"\",e.sheenRoughnessMapUv?\"#define SHEEN_ROUGHNESSMAP_UV \"+e.sheenRoughnessMapUv:\"\",e.specularMapUv?\"#define SPECULARMAP_UV \"+e.specularMapUv:\"\",e.specularColorMapUv?\"#define SPECULAR_COLORMAP_UV \"+e.specularColorMapUv:\"\",e.specularIntensityMapUv?\"#define SPECULAR_INTENSITYMAP_UV \"+e.specularIntensityMapUv:\"\",e.transmissionMapUv?\"#define TRANSMISSIONMAP_UV \"+e.transmissionMapUv:\"\",e.thicknessMapUv?\"#define THICKNESSMAP_UV \"+e.thicknessMapUv:\"\",e.vertexTangents&&e.flatShading===!1?\"#define USE_TANGENT\":\"\",e.vertexColors?\"#define USE_COLOR\":\"\",e.vertexAlphas?\"#define USE_COLOR_ALPHA\":\"\",e.vertexUv1s?\"#define USE_UV1\":\"\",e.vertexUv2s?\"#define USE_UV2\":\"\",e.vertexUv3s?\"#define USE_UV3\":\"\",e.pointsUvs?\"#define USE_POINTS_UV\":\"\",e.flatShading?\"#define FLAT_SHADED\":\"\",e.skinning?\"#define USE_SKINNING\":\"\",e.morphTargets?\"#define USE_MORPHTARGETS\":\"\",e.morphNormals&&e.flatShading===!1?\"#define USE_MORPHNORMALS\":\"\",e.morphColors&&e.isWebGL2?\"#define USE_MORPHCOLORS\":\"\",e.morphTargetsCount>0&&e.isWebGL2?\"#define MORPHTARGETS_TEXTURE\":\"\",e.morphTargetsCount>0&&e.isWebGL2?\"#define MORPHTARGETS_TEXTURE_STRIDE \"+e.morphTextureStride:\"\",e.morphTargetsCount>0&&e.isWebGL2?\"#define MORPHTARGETS_COUNT \"+e.morphTargetsCount:\"\",e.doubleSided?\"#define DOUBLE_SIDED\":\"\",e.flipSided?\"#define FLIP_SIDED\":\"\",e.shadowMapEnabled?\"#define USE_SHADOWMAP\":\"\",e.shadowMapEnabled?\"#define \"+l:\"\",e.sizeAttenuation?\"#define USE_SIZEATTENUATION\":\"\",e.numLightProbes>0?\"#define USE_LIGHT_PROBES\":\"\",e.useLegacyLights?\"#define LEGACY_LIGHTS\":\"\",e.logarithmicDepthBuffer?\"#define USE_LOGDEPTHBUF\":\"\",e.logarithmicDepthBuffer&&e.rendererExtensionFragDepth?\"#define USE_LOGDEPTHBUF_EXT\":\"\",\"uniform mat4 modelMatrix;\",\"uniform mat4 modelViewMatrix;\",\"uniform mat4 projectionMatrix;\",\"uniform mat4 viewMatrix;\",\"uniform mat3 normalMatrix;\",\"uniform vec3 cameraPosition;\",\"uniform bool isOrthographic;\",\"#ifdef USE_INSTANCING\",\"\tattribute mat4 instanceMatrix;\",\"#endif\",\"#ifdef USE_INSTANCING_COLOR\",\"\tattribute vec3 instanceColor;\",\"#endif\",\"attribute vec3 position;\",\"attribute vec3 normal;\",\"attribute vec2 uv;\",\"#ifdef USE_UV1\",\"\tattribute vec2 uv1;\",\"#endif\",\"#ifdef USE_UV2\",\"\tattribute vec2 uv2;\",\"#endif\",\"#ifdef USE_UV3\",\"\tattribute vec2 uv3;\",\"#endif\",\"#ifdef USE_TANGENT\",\"\tattribute vec4 tangent;\",\"#endif\",\"#if defined( USE_COLOR_ALPHA )\",\"\tattribute vec4 color;\",\"#elif defined( USE_COLOR )\",\"\tattribute vec3 color;\",\"#endif\",\"#if ( defined( USE_MORPHTARGETS ) && ! defined( MORPHTARGETS_TEXTURE ) )\",\"\tattribute vec3 morphTarget0;\",\"\tattribute vec3 morphTarget1;\",\"\tattribute vec3 morphTarget2;\",\"\tattribute vec3 morphTarget3;\",\"\t#ifdef USE_MORPHNORMALS\",\"\t\tattribute vec3 morphNormal0;\",\"\t\tattribute vec3 morphNormal1;\",\"\t\tattribute vec3 morphNormal2;\",\"\t\tattribute vec3 morphNormal3;\",\"\t#else\",\"\t\tattribute vec3 morphTarget4;\",\"\t\tattribute vec3 morphTarget5;\",\"\t\tattribute vec3 morphTarget6;\",\"\t\tattribute vec3 morphTarget7;\",\"\t#endif\",\"#endif\",\"#ifdef USE_SKINNING\",\"\tattribute vec4 skinIndex;\",\"\tattribute vec4 skinWeight;\",\"#endif\",`\n`].filter(ei).join(`\n`),w=[m,No(e),\"#define SHADER_TYPE \"+e.shaderType,\"#define SHADER_NAME \"+e.shaderName,x,e.useFog&&e.fog?\"#define USE_FOG\":\"\",e.useFog&&e.fogExp2?\"#define FOG_EXP2\":\"\",e.map?\"#define USE_MAP\":\"\",e.matcap?\"#define USE_MATCAP\":\"\",e.envMap?\"#define USE_ENVMAP\":\"\",e.envMap?\"#define \"+c:\"\",e.envMap?\"#define \"+h:\"\",e.envMap?\"#define \"+d:\"\",f?\"#define CUBEUV_TEXEL_WIDTH \"+f.texelWidth:\"\",f?\"#define CUBEUV_TEXEL_HEIGHT \"+f.texelHeight:\"\",f?\"#define CUBEUV_MAX_MIP \"+f.maxMip+\".0\":\"\",e.lightMap?\"#define USE_LIGHTMAP\":\"\",e.aoMap?\"#define USE_AOMAP\":\"\",e.bumpMap?\"#define USE_BUMPMAP\":\"\",e.normalMap?\"#define USE_NORMALMAP\":\"\",e.normalMapObjectSpace?\"#define USE_NORMALMAP_OBJECTSPACE\":\"\",e.normalMapTangentSpace?\"#define USE_NORMALMAP_TANGENTSPACE\":\"\",e.emissiveMap?\"#define USE_EMISSIVEMAP\":\"\",e.anisotropy?\"#define USE_ANISOTROPY\":\"\",e.anisotropyMap?\"#define USE_ANISOTROPYMAP\":\"\",e.clearcoat?\"#define USE_CLEARCOAT\":\"\",e.clearcoatMap?\"#define USE_CLEARCOATMAP\":\"\",e.clearcoatRoughnessMap?\"#define USE_CLEARCOAT_ROUGHNESSMAP\":\"\",e.clearcoatNormalMap?\"#define USE_CLEARCOAT_NORMALMAP\":\"\",e.iridescence?\"#define USE_IRIDESCENCE\":\"\",e.iridescenceMap?\"#define USE_IRIDESCENCEMAP\":\"\",e.iridescenceThicknessMap?\"#define USE_IRIDESCENCE_THICKNESSMAP\":\"\",e.specularMap?\"#define USE_SPECULARMAP\":\"\",e.specularColorMap?\"#define USE_SPECULAR_COLORMAP\":\"\",e.specularIntensityMap?\"#define USE_SPECULAR_INTENSITYMAP\":\"\",e.roughnessMap?\"#define USE_ROUGHNESSMAP\":\"\",e.metalnessMap?\"#define USE_METALNESSMAP\":\"\",e.alphaMap?\"#define USE_ALPHAMAP\":\"\",e.alphaTest?\"#define USE_ALPHATEST\":\"\",e.alphaHash?\"#define USE_ALPHAHASH\":\"\",e.sheen?\"#define USE_SHEEN\":\"\",e.sheenColorMap?\"#define USE_SHEEN_COLORMAP\":\"\",e.sheenRoughnessMap?\"#define USE_SHEEN_ROUGHNESSMAP\":\"\",e.transmission?\"#define USE_TRANSMISSION\":\"\",e.transmissionMap?\"#define USE_TRANSMISSIONMAP\":\"\",e.thicknessMap?\"#define USE_THICKNESSMAP\":\"\",e.vertexTangents&&e.flatShading===!1?\"#define USE_TANGENT\":\"\",e.vertexColors||e.instancingColor?\"#define USE_COLOR\":\"\",e.vertexAlphas?\"#define USE_COLOR_ALPHA\":\"\",e.vertexUv1s?\"#define USE_UV1\":\"\",e.vertexUv2s?\"#define USE_UV2\":\"\",e.vertexUv3s?\"#define USE_UV3\":\"\",e.pointsUvs?\"#define USE_POINTS_UV\":\"\",e.gradientMap?\"#define USE_GRADIENTMAP\":\"\",e.flatShading?\"#define FLAT_SHADED\":\"\",e.doubleSided?\"#define DOUBLE_SIDED\":\"\",e.flipSided?\"#define FLIP_SIDED\":\"\",e.shadowMapEnabled?\"#define USE_SHADOWMAP\":\"\",e.shadowMapEnabled?\"#define \"+l:\"\",e.premultipliedAlpha?\"#define PREMULTIPLIED_ALPHA\":\"\",e.numLightProbes>0?\"#define USE_LIGHT_PROBES\":\"\",e.useLegacyLights?\"#define LEGACY_LIGHTS\":\"\",e.decodeVideoTexture?\"#define DECODE_VIDEO_TEXTURE\":\"\",e.logarithmicDepthBuffer?\"#define USE_LOGDEPTHBUF\":\"\",e.logarithmicDepthBuffer&&e.rendererExtensionFragDepth?\"#define USE_LOGDEPTHBUF_EXT\":\"\",\"uniform mat4 viewMatrix;\",\"uniform vec3 cameraPosition;\",\"uniform bool isOrthographic;\",e.toneMapping!==pn?\"#define TONE_MAPPING\":\"\",e.toneMapping!==pn?Dt.tonemapping_pars_fragment:\"\",e.toneMapping!==pn?Cf(\"toneMapping\",e.toneMapping):\"\",e.dithering?\"#define DITHERING\":\"\",e.opaque?\"#define OPAQUE\":\"\",Dt.colorspace_pars_fragment,Af(\"linearToOutputTexel\",e.outputColorSpace),e.useDepthPacking?\"#define DEPTH_PACKING \"+e.depthPacking:\"\",`\n`].filter(ei).join(`\n`)),o=zr(o),o=Io(o,e),o=Uo(o,e),a=zr(a),a=Io(a,e),a=Uo(a,e),o=Do(o),a=Do(a),e.isWebGL2&&e.isRawShaderMaterial!==!0&&(v=`#version 300 es\n`,u=[g,\"precision mediump sampler2DArray;\",\"#define attribute in\",\"#define varying out\",\"#define texture2D texture\"].join(`\n`)+`\n`+u,w=[\"precision mediump sampler2DArray;\",\"#define varying in\",e.glslVersion===ja?\"\":\"layout(location = 0) out highp vec4 pc_fragColor;\",e.glslVersion===ja?\"\":\"#define gl_FragColor pc_fragColor\",\"#define gl_FragDepthEXT gl_FragDepth\",\"#define texture2D texture\",\"#define textureCube texture\",\"#define texture2DProj textureProj\",\"#define texture2DLodEXT textureLod\",\"#define texture2DProjLodEXT textureProjLod\",\"#define textureCubeLodEXT textureLod\",\"#define texture2DGradEXT textureGrad\",\"#define texture2DProjGradEXT textureProjGrad\",\"#define textureCubeGradEXT textureGrad\"].join(`\n`)+`\n`+w);let P=v+u+o,U=v+w+a,R=Po(s,s.VERTEX_SHADER,P),C=Po(s,s.FRAGMENT_SHADER,U);s.attachShader(p,R),s.attachShader(p,C),e.index0AttributeName!==void 0?s.bindAttribLocation(p,0,e.index0AttributeName):e.morphTargets===!0&&s.bindAttribLocation(p,0,\"position\"),s.linkProgram(p);function Y(K){if(i.debug.checkShaderErrors){let T=s.getProgramInfoLog(p).trim(),E=s.getShaderInfoLog(R).trim(),L=s.getShaderInfoLog(C).trim(),F=!0,I=!0;if(s.getProgramParameter(p,s.LINK_STATUS)===!1)if(F=!1,typeof i.debug.onShaderError==\"function\")i.debug.onShaderError(s,p,R,C);else{let G=Lo(s,R,\"vertex\"),X=Lo(s,C,\"fragment\");console.error(\"THREE.WebGLProgram: Shader Error \"+s.getError()+\" - VALIDATE_STATUS \"+s.getProgramParameter(p,s.VALIDATE_STATUS)+`\n\nProgram Info Log: `+T+`\n`+G+`\n`+X)}else T!==\"\"?console.warn(\"THREE.WebGLProgram: Program Info Log:\",T):(E===\"\"||L===\"\")&&(I=!1);I&&(K.diagnostics={runnable:F,programLog:T,vertexShader:{log:E,prefix:u},fragmentShader:{log:L,prefix:w}})}s.deleteShader(R),s.deleteShader(C),S=new si(s,p),b=If(s,p)}let S;this.getUniforms=function(){return S===void 0&&Y(this),S};let b;this.getAttributes=function(){return b===void 0&&Y(this),b};let H=e.rendererExtensionParallelShaderCompile===!1;return this.isReady=function(){return H===!1&&(H=s.getProgramParameter(p,bf)),H},this.destroy=function(){n.releaseStatesOfProgram(this),s.deleteProgram(p),this.program=void 0},this.type=e.shaderType,this.name=e.shaderName,this.id=Ef++,this.cacheKey=t,this.usedTimes=1,this.program=p,this.vertexShader=R,this.fragmentShader=C,this}var Wf=0,Vr=class{constructor(){this.shaderCache=new Map,this.materialCache=new Map}update(t){let e=t.vertexShader,n=t.fragmentShader,s=this._getShaderStage(e),r=this._getShaderStage(n),o=this._getShaderCacheForMaterial(t);return o.has(s)===!1&&(o.add(s),s.usedTimes++),o.has(r)===!1&&(o.add(r),r.usedTimes++),this}remove(t){let e=this.materialCache.get(t);for(let n of e)n.usedTimes--,n.usedTimes===0&&this.shaderCache.delete(n.code);return this.materialCache.delete(t),this}getVertexShaderID(t){return this._getShaderStage(t.vertexShader).id}getFragmentShaderID(t){return this._getShaderStage(t.fragmentShader).id}dispose(){this.shaderCache.clear(),this.materialCache.clear()}_getShaderCacheForMaterial(t){let e=this.materialCache,n=e.get(t);return n===void 0&&(n=new Set,e.set(t,n)),n}_getShaderStage(t){let e=this.shaderCache,n=e.get(t);return n===void 0&&(n=new kr(t),e.set(t,n)),n}},kr=class{constructor(t){this.id=Wf++,this.code=t,this.usedTimes=0}};function Xf(i,t,e,n,s,r,o){let a=new ys,l=new Vr,c=[],h=s.isWebGL2,d=s.logarithmicDepthBuffer,f=s.vertexTextures,m=s.precision,g={MeshDepthMaterial:\"depth\",MeshDistanceMaterial:\"distanceRGBA\",MeshNormalMaterial:\"normal\",MeshBasicMaterial:\"basic\",MeshLambertMaterial:\"lambert\",MeshPhongMaterial:\"phong\",MeshToonMaterial:\"toon\",MeshStandardMaterial:\"physical\",MeshPhysicalMaterial:\"physical\",MeshMatcapMaterial:\"matcap\",LineBasicMaterial:\"basic\",LineDashedMaterial:\"dashed\",PointsMaterial:\"points\",ShadowMaterial:\"shadow\",SpriteMaterial:\"sprite\"};function x(S){return S===0?\"uv\":`uv${S}`}function p(S,b,H,K,T){let E=K.fog,L=T.geometry,F=S.isMeshStandardMaterial?K.environment:null,I=(S.isMeshStandardMaterial?e:t).get(S.envMap||F),G=I&&I.mapping===Is?I.image.height:null,X=g[S.type];S.precision!==null&&(m=s.getMaxPrecision(S.precision),m!==S.precision&&console.warn(\"THREE.WebGLProgram.getParameters:\",S.precision,\"not supported, using\",m,\"instead.\"));let Z=L.morphAttributes.position||L.morphAttributes.normal||L.morphAttributes.color,$=Z!==void 0?Z.length:0,et=0;L.morphAttributes.position!==void 0&&(et=1),L.morphAttributes.normal!==void 0&&(et=2),L.morphAttributes.color!==void 0&&(et=3);let W,q,st,pt;if(X){let me=qe[X];W=me.vertexShader,q=me.fragmentShader}else W=S.vertexShader,q=S.fragmentShader,l.update(S),st=l.getVertexShaderID(S),pt=l.getFragmentShaderID(S);let dt=i.getRenderTarget(),bt=T.isInstancedMesh===!0,Et=T.isBatchedMesh===!0,vt=!!S.map,kt=!!S.matcap,O=!!I,le=!!S.aoMap,_t=!!S.lightMap,At=!!S.bumpMap,ht=!!S.normalMap,Xt=!!S.displacementMap,gt=!!S.emissiveMap,M=!!S.metalnessMap,_=!!S.roughnessMap,B=S.anisotropy>0,Q=S.clearcoat>0,J=S.iridescence>0,tt=S.sheen>0,ft=S.transmission>0,rt=B&&!!S.anisotropyMap,ct=Q&&!!S.clearcoatMap,yt=Q&&!!S.clearcoatNormalMap,Nt=Q&&!!S.clearcoatRoughnessMap,j=J&&!!S.iridescenceMap,Gt=J&&!!S.iridescenceThicknessMap,Vt=tt&&!!S.sheenColorMap,Ct=tt&&!!S.sheenRoughnessMap,xt=!!S.specularMap,ut=!!S.specularColorMap,Ut=!!S.specularIntensityMap,Ht=ft&&!!S.transmissionMap,Qt=ft&&!!S.thicknessMap,Ot=!!S.gradientMap,nt=!!S.alphaMap,A=S.alphaTest>0,at=!!S.alphaHash,ot=!!S.extensions,wt=!!L.attributes.uv1,Mt=!!L.attributes.uv2,qt=!!L.attributes.uv3,Yt=pn;return S.toneMapped&&(dt===null||dt.isXRRenderTarget===!0)&&(Yt=i.toneMapping),{isWebGL2:h,shaderID:X,shaderType:S.type,shaderName:S.name,vertexShader:W,fragmentShader:q,defines:S.defines,customVertexShaderID:st,customFragmentShaderID:pt,isRawShaderMaterial:S.isRawShaderMaterial===!0,glslVersion:S.glslVersion,precision:m,batching:Et,instancing:bt,instancingColor:bt&&T.instanceColor!==null,supportsVertexTextures:f,outputColorSpace:dt===null?i.outputColorSpace:dt.isXRRenderTarget===!0?dt.texture.colorSpace:rn,map:vt,matcap:kt,envMap:O,envMapMode:O&&I.mapping,envMapCubeUVHeight:G,aoMap:le,lightMap:_t,bumpMap:At,normalMap:ht,displacementMap:f&&Xt,emissiveMap:gt,normalMapObjectSpace:ht&&S.normalMapType===cc,normalMapTangentSpace:ht&&S.normalMapType===lc,metalnessMap:M,roughnessMap:_,anisotropy:B,anisotropyMap:rt,clearcoat:Q,clearcoatMap:ct,clearcoatNormalMap:yt,clearcoatRoughnessMap:Nt,iridescence:J,iridescenceMap:j,iridescenceThicknessMap:Gt,sheen:tt,sheenColorMap:Vt,sheenRoughnessMap:Ct,specularMap:xt,specularColorMap:ut,specularIntensityMap:Ut,transmission:ft,transmissionMap:Ht,thicknessMap:Qt,gradientMap:Ot,opaque:S.transparent===!1&&S.blending===ni,alphaMap:nt,alphaTest:A,alphaHash:at,combine:S.combine,mapUv:vt&&x(S.map.channel),aoMapUv:le&&x(S.aoMap.channel),lightMapUv:_t&&x(S.lightMap.channel),bumpMapUv:At&&x(S.bumpMap.channel),normalMapUv:ht&&x(S.normalMap.channel),displacementMapUv:Xt&&x(S.displacementMap.channel),emissiveMapUv:gt&&x(S.emissiveMap.channel),metalnessMapUv:M&&x(S.metalnessMap.channel),roughnessMapUv:_&&x(S.roughnessMap.channel),anisotropyMapUv:rt&&x(S.anisotropyMap.channel),clearcoatMapUv:ct&&x(S.clearcoatMap.channel),clearcoatNormalMapUv:yt&&x(S.clearcoatNormalMap.channel),clearcoatRoughnessMapUv:Nt&&x(S.clearcoatRoughnessMap.channel),iridescenceMapUv:j&&x(S.iridescenceMap.channel),iridescenceThicknessMapUv:Gt&&x(S.iridescenceThicknessMap.channel),sheenColorMapUv:Vt&&x(S.sheenColorMap.channel),sheenRoughnessMapUv:Ct&&x(S.sheenRoughnessMap.channel),specularMapUv:xt&&x(S.specularMap.channel),specularColorMapUv:ut&&x(S.specularColorMap.channel),specularIntensityMapUv:Ut&&x(S.specularIntensityMap.channel),transmissionMapUv:Ht&&x(S.transmissionMap.channel),thicknessMapUv:Qt&&x(S.thicknessMap.channel),alphaMapUv:nt&&x(S.alphaMap.channel),vertexTangents:!!L.attributes.tangent&&(ht||B),vertexColors:S.vertexColors,vertexAlphas:S.vertexColors===!0&&!!L.attributes.color&&L.attributes.color.itemSize===4,vertexUv1s:wt,vertexUv2s:Mt,vertexUv3s:qt,pointsUvs:T.isPoints===!0&&!!L.attributes.uv&&(vt||nt),fog:!!E,useFog:S.fog===!0,fogExp2:E&&E.isFogExp2,flatShading:S.flatShading===!0,sizeAttenuation:S.sizeAttenuation===!0,logarithmicDepthBuffer:d,skinning:T.isSkinnedMesh===!0,morphTargets:L.morphAttributes.position!==void 0,morphNormals:L.morphAttributes.normal!==void 0,morphColors:L.morphAttributes.color!==void 0,morphTargetsCount:$,morphTextureStride:et,numDirLights:b.directional.length,numPointLights:b.point.length,numSpotLights:b.spot.length,numSpotLightMaps:b.spotLightMap.length,numRectAreaLights:b.rectArea.length,numHemiLights:b.hemi.length,numDirLightShadows:b.directionalShadowMap.length,numPointLightShadows:b.pointShadowMap.length,numSpotLightShadows:b.spotShadowMap.length,numSpotLightShadowsWithMaps:b.numSpotLightShadowsWithMaps,numLightProbes:b.numLightProbes,numClippingPlanes:o.numPlanes,numClipIntersection:o.numIntersection,dithering:S.dithering,shadowMapEnabled:i.shadowMap.enabled&&H.length>0,shadowMapType:i.shadowMap.type,toneMapping:Yt,useLegacyLights:i._useLegacyLights,decodeVideoTexture:vt&&S.map.isVideoTexture===!0&&Wt.getTransfer(S.map.colorSpace)===Jt,premultipliedAlpha:S.premultipliedAlpha,doubleSided:S.side===nn,flipSided:S.side===we,useDepthPacking:S.depthPacking>=0,depthPacking:S.depthPacking||0,index0AttributeName:S.index0AttributeName,extensionDerivatives:ot&&S.extensions.derivatives===!0,extensionFragDepth:ot&&S.extensions.fragDepth===!0,extensionDrawBuffers:ot&&S.extensions.drawBuffers===!0,extensionShaderTextureLOD:ot&&S.extensions.shaderTextureLOD===!0,extensionClipCullDistance:ot&&S.extensions.clipCullDistance&&n.has(\"WEBGL_clip_cull_distance\"),rendererExtensionFragDepth:h||n.has(\"EXT_frag_depth\"),rendererExtensionDrawBuffers:h||n.has(\"WEBGL_draw_buffers\"),rendererExtensionShaderTextureLod:h||n.has(\"EXT_shader_texture_lod\"),rendererExtensionParallelShaderCompile:n.has(\"KHR_parallel_shader_compile\"),customProgramCacheKey:S.customProgramCacheKey()}}function u(S){let b=[];if(S.shaderID?b.push(S.shaderID):(b.push(S.customVertexShaderID),b.push(S.customFragmentShaderID)),S.defines!==void 0)for(let H in S.defines)b.push(H),b.push(S.defines[H]);return S.isRawShaderMaterial===!1&&(w(b,S),v(b,S),b.push(i.outputColorSpace)),b.push(S.customProgramCacheKey),b.join()}function w(S,b){S.push(b.precision),S.push(b.outputColorSpace),S.push(b.envMapMode),S.push(b.envMapCubeUVHeight),S.push(b.mapUv),S.push(b.alphaMapUv),S.push(b.lightMapUv),S.push(b.aoMapUv),S.push(b.bumpMapUv),S.push(b.normalMapUv),S.push(b.displacementMapUv),S.push(b.emissiveMapUv),S.push(b.metalnessMapUv),S.push(b.roughnessMapUv),S.push(b.anisotropyMapUv),S.push(b.clearcoatMapUv),S.push(b.clearcoatNormalMapUv),S.push(b.clearcoatRoughnessMapUv),S.push(b.iridescenceMapUv),S.push(b.iridescenceThicknessMapUv),S.push(b.sheenColorMapUv),S.push(b.sheenRoughnessMapUv),S.push(b.specularMapUv),S.push(b.specularColorMapUv),S.push(b.specularIntensityMapUv),S.push(b.transmissionMapUv),S.push(b.thicknessMapUv),S.push(b.combine),S.push(b.fogExp2),S.push(b.sizeAttenuation),S.push(b.morphTargetsCount),S.push(b.morphAttributeCount),S.push(b.numDirLights),S.push(b.numPointLights),S.push(b.numSpotLights),S.push(b.numSpotLightMaps),S.push(b.numHemiLights),S.push(b.numRectAreaLights),S.push(b.numDirLightShadows),S.push(b.numPointLightShadows),S.push(b.numSpotLightShadows),S.push(b.numSpotLightShadowsWithMaps),S.push(b.numLightProbes),S.push(b.shadowMapType),S.push(b.toneMapping),S.push(b.numClippingPlanes),S.push(b.numClipIntersection),S.push(b.depthPacking)}function v(S,b){a.disableAll(),b.isWebGL2&&a.enable(0),b.supportsVertexTextures&&a.enable(1),b.instancing&&a.enable(2),b.instancingColor&&a.enable(3),b.matcap&&a.enable(4),b.envMap&&a.enable(5),b.normalMapObjectSpace&&a.enable(6),b.normalMapTangentSpace&&a.enable(7),b.clearcoat&&a.enable(8),b.iridescence&&a.enable(9),b.alphaTest&&a.enable(10),b.vertexColors&&a.enable(11),b.vertexAlphas&&a.enable(12),b.vertexUv1s&&a.enable(13),b.vertexUv2s&&a.enable(14),b.vertexUv3s&&a.enable(15),b.vertexTangents&&a.enable(16),b.anisotropy&&a.enable(17),b.alphaHash&&a.enable(18),b.batching&&a.enable(19),S.push(a.mask),a.disableAll(),b.fog&&a.enable(0),b.useFog&&a.enable(1),b.flatShading&&a.enable(2),b.logarithmicDepthBuffer&&a.enable(3),b.skinning&&a.enable(4),b.morphTargets&&a.enable(5),b.morphNormals&&a.enable(6),b.morphColors&&a.enable(7),b.premultipliedAlpha&&a.enable(8),b.shadowMapEnabled&&a.enable(9),b.useLegacyLights&&a.enable(10),b.doubleSided&&a.enable(11),b.flipSided&&a.enable(12),b.useDepthPacking&&a.enable(13),b.dithering&&a.enable(14),b.transmission&&a.enable(15),b.sheen&&a.enable(16),b.opaque&&a.enable(17),b.pointsUvs&&a.enable(18),b.decodeVideoTexture&&a.enable(19),S.push(a.mask)}function P(S){let b=g[S.type],H;if(b){let K=qe[b];H=di.clone(K.uniforms)}else H=S.uniforms;return H}function U(S,b){let H;for(let K=0,T=c.length;K<T;K++){let E=c[K];if(E.cacheKey===b){H=E,++H.usedTimes;break}}return H===void 0&&(H=new Gf(i,b,S,r),c.push(H)),H}function R(S){if(--S.usedTimes===0){let b=c.indexOf(S);c[b]=c[c.length-1],c.pop(),S.destroy()}}function C(S){l.remove(S)}function Y(){l.dispose()}return{getParameters:p,getProgramCacheKey:u,getUniforms:P,acquireProgram:U,releaseProgram:R,releaseShaderCache:C,programs:c,dispose:Y}}function qf(){let i=new WeakMap;function t(r){let o=i.get(r);return o===void 0&&(o={},i.set(r,o)),o}function e(r){i.delete(r)}function n(r,o,a){i.get(r)[o]=a}function s(){i=new WeakMap}return{get:t,remove:e,update:n,dispose:s}}function Yf(i,t){return i.groupOrder!==t.groupOrder?i.groupOrder-t.groupOrder:i.renderOrder!==t.renderOrder?i.renderOrder-t.renderOrder:i.material.id!==t.material.id?i.material.id-t.material.id:i.z!==t.z?i.z-t.z:i.id-t.id}function Fo(i,t){return i.groupOrder!==t.groupOrder?i.groupOrder-t.groupOrder:i.renderOrder!==t.renderOrder?i.renderOrder-t.renderOrder:i.z!==t.z?t.z-i.z:i.id-t.id}function Oo(){let i=[],t=0,e=[],n=[],s=[];function r(){t=0,e.length=0,n.length=0,s.length=0}function o(d,f,m,g,x,p){let u=i[t];return u===void 0?(u={id:d.id,object:d,geometry:f,material:m,groupOrder:g,renderOrder:d.renderOrder,z:x,group:p},i[t]=u):(u.id=d.id,u.object=d,u.geometry=f,u.material=m,u.groupOrder=g,u.renderOrder=d.renderOrder,u.z=x,u.group=p),t++,u}function a(d,f,m,g,x,p){let u=o(d,f,m,g,x,p);m.transmission>0?n.push(u):m.transparent===!0?s.push(u):e.push(u)}function l(d,f,m,g,x,p){let u=o(d,f,m,g,x,p);m.transmission>0?n.unshift(u):m.transparent===!0?s.unshift(u):e.unshift(u)}function c(d,f){e.length>1&&e.sort(d||Yf),n.length>1&&n.sort(f||Fo),s.length>1&&s.sort(f||Fo)}function h(){for(let d=t,f=i.length;d<f;d++){let m=i[d];if(m.id===null)break;m.id=null,m.object=null,m.geometry=null,m.material=null,m.group=null}}return{opaque:e,transmissive:n,transparent:s,init:r,push:a,unshift:l,finish:h,sort:c}}function Zf(){let i=new WeakMap;function t(n,s){let r=i.get(n),o;return r===void 0?(o=new Oo,i.set(n,[o])):s>=r.length?(o=new Oo,r.push(o)):o=r[s],o}function e(){i=new WeakMap}return{get:t,dispose:e}}function Jf(){let i={};return{get:function(t){if(i[t.id]!==void 0)return i[t.id];let e;switch(t.type){case\"DirectionalLight\":e={direction:new N,color:new Pt};break;case\"SpotLight\":e={position:new N,direction:new N,color:new Pt,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case\"PointLight\":e={position:new N,color:new Pt,distance:0,decay:0};break;case\"HemisphereLight\":e={direction:new N,skyColor:new Pt,groundColor:new Pt};break;case\"RectAreaLight\":e={color:new Pt,position:new N,halfWidth:new N,halfHeight:new N};break}return i[t.id]=e,e}}}function $f(){let i={};return{get:function(t){if(i[t.id]!==void 0)return i[t.id];let e;switch(t.type){case\"DirectionalLight\":e={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new Lt};break;case\"SpotLight\":e={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new Lt};break;case\"PointLight\":e={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new Lt,shadowCameraNear:1,shadowCameraFar:1e3};break}return i[t.id]=e,e}}}var Kf=0;function Qf(i,t){return(t.castShadow?2:0)-(i.castShadow?2:0)+(t.map?1:0)-(i.map?1:0)}function jf(i,t){let e=new Jf,n=$f(),s={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1,numSpotMaps:-1,numLightProbes:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotLightMap:[],spotShadow:[],spotShadowMap:[],spotLightMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],numSpotLightShadowsWithMaps:0,numLightProbes:0};for(let h=0;h<9;h++)s.probe.push(new N);let r=new N,o=new oe,a=new oe;function l(h,d){let f=0,m=0,g=0;for(let K=0;K<9;K++)s.probe[K].set(0,0,0);let x=0,p=0,u=0,w=0,v=0,P=0,U=0,R=0,C=0,Y=0,S=0;h.sort(Qf);let b=d===!0?Math.PI:1;for(let K=0,T=h.length;K<T;K++){let E=h[K],L=E.color,F=E.intensity,I=E.distance,G=E.shadow&&E.shadow.map?E.shadow.map.texture:null;if(E.isAmbientLight)f+=L.r*F*b,m+=L.g*F*b,g+=L.b*F*b;else if(E.isLightProbe){for(let X=0;X<9;X++)s.probe[X].addScaledVector(E.sh.coefficients[X],F);S++}else if(E.isDirectionalLight){let X=e.get(E);if(X.color.copy(E.color).multiplyScalar(E.intensity*b),E.castShadow){let Z=E.shadow,$=n.get(E);$.shadowBias=Z.bias,$.shadowNormalBias=Z.normalBias,$.shadowRadius=Z.radius,$.shadowMapSize=Z.mapSize,s.directionalShadow[x]=$,s.directionalShadowMap[x]=G,s.directionalShadowMatrix[x]=E.shadow.matrix,P++}s.directional[x]=X,x++}else if(E.isSpotLight){let X=e.get(E);X.position.setFromMatrixPosition(E.matrixWorld),X.color.copy(L).multiplyScalar(F*b),X.distance=I,X.coneCos=Math.cos(E.angle),X.penumbraCos=Math.cos(E.angle*(1-E.penumbra)),X.decay=E.decay,s.spot[u]=X;let Z=E.shadow;if(E.map&&(s.spotLightMap[C]=E.map,C++,Z.updateMatrices(E),E.castShadow&&Y++),s.spotLightMatrix[u]=Z.matrix,E.castShadow){let $=n.get(E);$.shadowBias=Z.bias,$.shadowNormalBias=Z.normalBias,$.shadowRadius=Z.radius,$.shadowMapSize=Z.mapSize,s.spotShadow[u]=$,s.spotShadowMap[u]=G,R++}u++}else if(E.isRectAreaLight){let X=e.get(E);X.color.copy(L).multiplyScalar(F),X.halfWidth.set(E.width*.5,0,0),X.halfHeight.set(0,E.height*.5,0),s.rectArea[w]=X,w++}else if(E.isPointLight){let X=e.get(E);if(X.color.copy(E.color).multiplyScalar(E.intensity*b),X.distance=E.distance,X.decay=E.decay,E.castShadow){let Z=E.shadow,$=n.get(E);$.shadowBias=Z.bias,$.shadowNormalBias=Z.normalBias,$.shadowRadius=Z.radius,$.shadowMapSize=Z.mapSize,$.shadowCameraNear=Z.camera.near,$.shadowCameraFar=Z.camera.far,s.pointShadow[p]=$,s.pointShadowMap[p]=G,s.pointShadowMatrix[p]=E.shadow.matrix,U++}s.point[p]=X,p++}else if(E.isHemisphereLight){let X=e.get(E);X.skyColor.copy(E.color).multiplyScalar(F*b),X.groundColor.copy(E.groundColor).multiplyScalar(F*b),s.hemi[v]=X,v++}}w>0&&(t.isWebGL2?i.has(\"OES_texture_float_linear\")===!0?(s.rectAreaLTC1=it.LTC_FLOAT_1,s.rectAreaLTC2=it.LTC_FLOAT_2):(s.rectAreaLTC1=it.LTC_HALF_1,s.rectAreaLTC2=it.LTC_HALF_2):i.has(\"OES_texture_float_linear\")===!0?(s.rectAreaLTC1=it.LTC_FLOAT_1,s.rectAreaLTC2=it.LTC_FLOAT_2):i.has(\"OES_texture_half_float_linear\")===!0?(s.rectAreaLTC1=it.LTC_HALF_1,s.rectAreaLTC2=it.LTC_HALF_2):console.error(\"THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.\")),s.ambient[0]=f,s.ambient[1]=m,s.ambient[2]=g;let H=s.hash;(H.directionalLength!==x||H.pointLength!==p||H.spotLength!==u||H.rectAreaLength!==w||H.hemiLength!==v||H.numDirectionalShadows!==P||H.numPointShadows!==U||H.numSpotShadows!==R||H.numSpotMaps!==C||H.numLightProbes!==S)&&(s.directional.length=x,s.spot.length=u,s.rectArea.length=w,s.point.length=p,s.hemi.length=v,s.directionalShadow.length=P,s.directionalShadowMap.length=P,s.pointShadow.length=U,s.pointShadowMap.length=U,s.spotShadow.length=R,s.spotShadowMap.length=R,s.directionalShadowMatrix.length=P,s.pointShadowMatrix.length=U,s.spotLightMatrix.length=R+C-Y,s.spotLightMap.length=C,s.numSpotLightShadowsWithMaps=Y,s.numLightProbes=S,H.directionalLength=x,H.pointLength=p,H.spotLength=u,H.rectAreaLength=w,H.hemiLength=v,H.numDirectionalShadows=P,H.numPointShadows=U,H.numSpotShadows=R,H.numSpotMaps=C,H.numLightProbes=S,s.version=Kf++)}function c(h,d){let f=0,m=0,g=0,x=0,p=0,u=d.matrixWorldInverse;for(let w=0,v=h.length;w<v;w++){let P=h[w];if(P.isDirectionalLight){let U=s.directional[f];U.direction.setFromMatrixPosition(P.matrixWorld),r.setFromMatrixPosition(P.target.matrixWorld),U.direction.sub(r),U.direction.transformDirection(u),f++}else if(P.isSpotLight){let U=s.spot[g];U.position.setFromMatrixPosition(P.matrixWorld),U.position.applyMatrix4(u),U.direction.setFromMatrixPosition(P.matrixWorld),r.setFromMatrixPosition(P.target.matrixWorld),U.direction.sub(r),U.direction.transformDirection(u),g++}else if(P.isRectAreaLight){let U=s.rectArea[x];U.position.setFromMatrixPosition(P.matrixWorld),U.position.applyMatrix4(u),a.identity(),o.copy(P.matrixWorld),o.premultiply(u),a.extractRotation(o),U.halfWidth.set(P.width*.5,0,0),U.halfHeight.set(0,P.height*.5,0),U.halfWidth.applyMatrix4(a),U.halfHeight.applyMatrix4(a),x++}else if(P.isPointLight){let U=s.point[m];U.position.setFromMatrixPosition(P.matrixWorld),U.position.applyMatrix4(u),m++}else if(P.isHemisphereLight){let U=s.hemi[p];U.direction.setFromMatrixPosition(P.matrixWorld),U.direction.transformDirection(u),p++}}}return{setup:l,setupView:c,state:s}}function Bo(i,t){let e=new jf(i,t),n=[],s=[];function r(){n.length=0,s.length=0}function o(d){n.push(d)}function a(d){s.push(d)}function l(d){e.setup(n,d)}function c(d){e.setupView(n,d)}return{init:r,state:{lightsArray:n,shadowsArray:s,lights:e},setupLights:l,setupLightsView:c,pushLight:o,pushShadow:a}}function tp(i,t){let e=new WeakMap;function n(r,o=0){let a=e.get(r),l;return a===void 0?(l=new Bo(i,t),e.set(r,[l])):o>=a.length?(l=new Bo(i,t),a.push(l)):l=a[o],l}function s(){e=new WeakMap}return{get:n,dispose:s}}var Hr=class extends yn{constructor(t){super(),this.isMeshDepthMaterial=!0,this.type=\"MeshDepthMaterial\",this.depthPacking=ac,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.setValues(t)}copy(t){return super.copy(t),this.depthPacking=t.depthPacking,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this}},Gr=class extends yn{constructor(t){super(),this.isMeshDistanceMaterial=!0,this.type=\"MeshDistanceMaterial\",this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.setValues(t)}copy(t){return super.copy(t),this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this}},ep=`void main() {\n\tgl_Position = vec4( position, 1.0 );\n}`,np=`uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n#include <packing>\nvoid main() {\n\tconst float samples = float( VSM_SAMPLES );\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n\tfor ( float i = 0.0; i < samples; i ++ ) {\n\t\tfloat uvOffset = uvStart + i * uvStride;\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean / samples;\n\tsquared_mean = squared_mean / samples;\n\tfloat std_dev = sqrt( squared_mean - mean * mean );\n\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}`;function ip(i,t,e){let n=new ws,s=new Lt,r=new Lt,o=new he,a=new Hr({depthPacking:oc}),l=new Gr,c={},h=e.maxTextureSize,d={[gn]:we,[we]:gn,[nn]:nn},f=new ue({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new Lt},radius:{value:4}},vertexShader:ep,fragmentShader:np}),m=f.clone();m.defines.HORIZONTAL_PASS=1;let g=new Se;g.setAttribute(\"position\",new ye(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));let x=new Ne(g,f),p=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=Xo;let u=this.type;this.render=function(R,C,Y){if(p.enabled===!1||p.autoUpdate===!1&&p.needsUpdate===!1||R.length===0)return;let S=i.getRenderTarget(),b=i.getActiveCubeFace(),H=i.getActiveMipmapLevel(),K=i.state;K.setBlending(Ye),K.buffers.color.setClear(1,1,1,1),K.buffers.depth.setTest(!0),K.setScissorTest(!1);let T=u!==tn&&this.type===tn,E=u===tn&&this.type!==tn;for(let L=0,F=R.length;L<F;L++){let I=R[L],G=I.shadow;if(G===void 0){console.warn(\"THREE.WebGLShadowMap:\",I,\"has no shadow.\");continue}if(G.autoUpdate===!1&&G.needsUpdate===!1)continue;s.copy(G.mapSize);let X=G.getFrameExtents();if(s.multiply(X),r.copy(G.mapSize),(s.x>h||s.y>h)&&(s.x>h&&(r.x=Math.floor(h/X.x),s.x=r.x*X.x,G.mapSize.x=r.x),s.y>h&&(r.y=Math.floor(h/X.y),s.y=r.y*X.y,G.mapSize.y=r.y)),G.map===null||T===!0||E===!0){let $=this.type!==tn?{minFilter:xe,magFilter:xe}:{};G.map!==null&&G.map.dispose(),G.map=new Me(s.x,s.y,$),G.map.texture.name=I.name+\".shadowMap\",G.camera.updateProjectionMatrix()}i.setRenderTarget(G.map),i.clear();let Z=G.getViewportCount();for(let $=0;$<Z;$++){let et=G.getViewport($);o.set(r.x*et.x,r.y*et.y,r.x*et.z,r.y*et.w),K.viewport(o),G.updateMatrices(I,$),n=G.getFrustum(),P(C,Y,G.camera,I,this.type)}G.isPointLightShadow!==!0&&this.type===tn&&w(G,Y),G.needsUpdate=!1}u=this.type,p.needsUpdate=!1,i.setRenderTarget(S,b,H)};function w(R,C){let Y=t.update(x);f.defines.VSM_SAMPLES!==R.blurSamples&&(f.defines.VSM_SAMPLES=R.blurSamples,m.defines.VSM_SAMPLES=R.blurSamples,f.needsUpdate=!0,m.needsUpdate=!0),R.mapPass===null&&(R.mapPass=new Me(s.x,s.y)),f.uniforms.shadow_pass.value=R.map.texture,f.uniforms.resolution.value=R.mapSize,f.uniforms.radius.value=R.radius,i.setRenderTarget(R.mapPass),i.clear(),i.renderBufferDirect(C,null,Y,f,x,null),m.uniforms.shadow_pass.value=R.mapPass.texture,m.uniforms.resolution.value=R.mapSize,m.uniforms.radius.value=R.radius,i.setRenderTarget(R.map),i.clear(),i.renderBufferDirect(C,null,Y,m,x,null)}function v(R,C,Y,S){let b=null,H=Y.isPointLight===!0?R.customDistanceMaterial:R.customDepthMaterial;if(H!==void 0)b=H;else if(b=Y.isPointLight===!0?l:a,i.localClippingEnabled&&C.clipShadows===!0&&Array.isArray(C.clippingPlanes)&&C.clippingPlanes.length!==0||C.displacementMap&&C.displacementScale!==0||C.alphaMap&&C.alphaTest>0||C.map&&C.alphaTest>0){let K=b.uuid,T=C.uuid,E=c[K];E===void 0&&(E={},c[K]=E);let L=E[T];L===void 0&&(L=b.clone(),E[T]=L,C.addEventListener(\"dispose\",U)),b=L}if(b.visible=C.visible,b.wireframe=C.wireframe,S===tn?b.side=C.shadowSide!==null?C.shadowSide:C.side:b.side=C.shadowSide!==null?C.shadowSide:d[C.side],b.alphaMap=C.alphaMap,b.alphaTest=C.alphaTest,b.map=C.map,b.clipShadows=C.clipShadows,b.clippingPlanes=C.clippingPlanes,b.clipIntersection=C.clipIntersection,b.displacementMap=C.displacementMap,b.displacementScale=C.displacementScale,b.displacementBias=C.displacementBias,b.wireframeLinewidth=C.wireframeLinewidth,b.linewidth=C.linewidth,Y.isPointLight===!0&&b.isMeshDistanceMaterial===!0){let K=i.properties.get(b);K.light=Y}return b}function P(R,C,Y,S,b){if(R.visible===!1)return;if(R.layers.test(C.layers)&&(R.isMesh||R.isLine||R.isPoints)&&(R.castShadow||R.receiveShadow&&b===tn)&&(!R.frustumCulled||n.intersectsObject(R))){R.modelViewMatrix.multiplyMatrices(Y.matrixWorldInverse,R.matrixWorld);let T=t.update(R),E=R.material;if(Array.isArray(E)){let L=T.groups;for(let F=0,I=L.length;F<I;F++){let G=L[F],X=E[G.materialIndex];if(X&&X.visible){let Z=v(R,X,S,b);R.onBeforeShadow(i,R,C,Y,T,Z,G),i.renderBufferDirect(Y,null,T,Z,R,G),R.onAfterShadow(i,R,C,Y,T,Z,G)}}}else if(E.visible){let L=v(R,E,S,b);R.onBeforeShadow(i,R,C,Y,T,L,null),i.renderBufferDirect(Y,null,T,L,R,null),R.onAfterShadow(i,R,C,Y,T,L,null)}}let K=R.children;for(let T=0,E=K.length;T<E;T++)P(K[T],C,Y,S,b)}function U(R){R.target.removeEventListener(\"dispose\",U);for(let Y in c){let S=c[Y],b=R.target.uuid;b in S&&(S[b].dispose(),delete S[b])}}}function sp(i,t,e){let n=e.isWebGL2;function s(){let A=!1,at=new he,ot=null,wt=new he(0,0,0,0);return{setMask:function(Mt){ot!==Mt&&!A&&(i.colorMask(Mt,Mt,Mt,Mt),ot=Mt)},setLocked:function(Mt){A=Mt},setClear:function(Mt,qt,Yt,se,me){me===!0&&(Mt*=se,qt*=se,Yt*=se),at.set(Mt,qt,Yt,se),wt.equals(at)===!1&&(i.clearColor(Mt,qt,Yt,se),wt.copy(at))},reset:function(){A=!1,ot=null,wt.set(-1,0,0,0)}}}function r(){let A=!1,at=null,ot=null,wt=null;return{setTest:function(Mt){Mt?Et(i.DEPTH_TEST):vt(i.DEPTH_TEST)},setMask:function(Mt){at!==Mt&&!A&&(i.depthMask(Mt),at=Mt)},setFunc:function(Mt){if(ot!==Mt){switch(Mt){case Ol:i.depthFunc(i.NEVER);break;case Bl:i.depthFunc(i.ALWAYS);break;case zl:i.depthFunc(i.LESS);break;case ls:i.depthFunc(i.LEQUAL);break;case Vl:i.depthFunc(i.EQUAL);break;case kl:i.depthFunc(i.GEQUAL);break;case Hl:i.depthFunc(i.GREATER);break;case Gl:i.depthFunc(i.NOTEQUAL);break;default:i.depthFunc(i.LEQUAL)}ot=Mt}},setLocked:function(Mt){A=Mt},setClear:function(Mt){wt!==Mt&&(i.clearDepth(Mt),wt=Mt)},reset:function(){A=!1,at=null,ot=null,wt=null}}}function o(){let A=!1,at=null,ot=null,wt=null,Mt=null,qt=null,Yt=null,se=null,me=null;return{setTest:function(Zt){A||(Zt?Et(i.STENCIL_TEST):vt(i.STENCIL_TEST))},setMask:function(Zt){at!==Zt&&!A&&(i.stencilMask(Zt),at=Zt)},setFunc:function(Zt,ge,Xe){(ot!==Zt||wt!==ge||Mt!==Xe)&&(i.stencilFunc(Zt,ge,Xe),ot=Zt,wt=ge,Mt=Xe)},setOp:function(Zt,ge,Xe){(qt!==Zt||Yt!==ge||se!==Xe)&&(i.stencilOp(Zt,ge,Xe),qt=Zt,Yt=ge,se=Xe)},setLocked:function(Zt){A=Zt},setClear:function(Zt){me!==Zt&&(i.clearStencil(Zt),me=Zt)},reset:function(){A=!1,at=null,ot=null,wt=null,Mt=null,qt=null,Yt=null,se=null,me=null}}}let a=new s,l=new r,c=new o,h=new WeakMap,d=new WeakMap,f={},m={},g=new WeakMap,x=[],p=null,u=!1,w=null,v=null,P=null,U=null,R=null,C=null,Y=null,S=new Pt(0,0,0),b=0,H=!1,K=null,T=null,E=null,L=null,F=null,I=i.getParameter(i.MAX_COMBINED_TEXTURE_IMAGE_UNITS),G=!1,X=0,Z=i.getParameter(i.VERSION);Z.indexOf(\"WebGL\")!==-1?(X=parseFloat(/^WebGL (\\d)/.exec(Z)[1]),G=X>=1):Z.indexOf(\"OpenGL ES\")!==-1&&(X=parseFloat(/^OpenGL ES (\\d)/.exec(Z)[1]),G=X>=2);let $=null,et={},W=i.getParameter(i.SCISSOR_BOX),q=i.getParameter(i.VIEWPORT),st=new he().fromArray(W),pt=new he().fromArray(q);function dt(A,at,ot,wt){let Mt=new Uint8Array(4),qt=i.createTexture();i.bindTexture(A,qt),i.texParameteri(A,i.TEXTURE_MIN_FILTER,i.NEAREST),i.texParameteri(A,i.TEXTURE_MAG_FILTER,i.NEAREST);for(let Yt=0;Yt<ot;Yt++)n&&(A===i.TEXTURE_3D||A===i.TEXTURE_2D_ARRAY)?i.texImage3D(at,0,i.RGBA,1,1,wt,0,i.RGBA,i.UNSIGNED_BYTE,Mt):i.texImage2D(at+Yt,0,i.RGBA,1,1,0,i.RGBA,i.UNSIGNED_BYTE,Mt);return qt}let bt={};bt[i.TEXTURE_2D]=dt(i.TEXTURE_2D,i.TEXTURE_2D,1),bt[i.TEXTURE_CUBE_MAP]=dt(i.TEXTURE_CUBE_MAP,i.TEXTURE_CUBE_MAP_POSITIVE_X,6),n&&(bt[i.TEXTURE_2D_ARRAY]=dt(i.TEXTURE_2D_ARRAY,i.TEXTURE_2D_ARRAY,1,1),bt[i.TEXTURE_3D]=dt(i.TEXTURE_3D,i.TEXTURE_3D,1,1)),a.setClear(0,0,0,1),l.setClear(1),c.setClear(0),Et(i.DEPTH_TEST),l.setFunc(ls),gt(!1),M(_a),Et(i.CULL_FACE),ht(Ye);function Et(A){f[A]!==!0&&(i.enable(A),f[A]=!0)}function vt(A){f[A]!==!1&&(i.disable(A),f[A]=!1)}function kt(A,at){return m[A]!==at?(i.bindFramebuffer(A,at),m[A]=at,n&&(A===i.DRAW_FRAMEBUFFER&&(m[i.FRAMEBUFFER]=at),A===i.FRAMEBUFFER&&(m[i.DRAW_FRAMEBUFFER]=at)),!0):!1}function O(A,at){let ot=x,wt=!1;if(A)if(ot=g.get(at),ot===void 0&&(ot=[],g.set(at,ot)),A.isWebGLMultipleRenderTargets){let Mt=A.texture;if(ot.length!==Mt.length||ot[0]!==i.COLOR_ATTACHMENT0){for(let qt=0,Yt=Mt.length;qt<Yt;qt++)ot[qt]=i.COLOR_ATTACHMENT0+qt;ot.length=Mt.length,wt=!0}}else ot[0]!==i.COLOR_ATTACHMENT0&&(ot[0]=i.COLOR_ATTACHMENT0,wt=!0);else ot[0]!==i.BACK&&(ot[0]=i.BACK,wt=!0);wt&&(e.isWebGL2?i.drawBuffers(ot):t.get(\"WEBGL_draw_buffers\").drawBuffersWEBGL(ot))}function le(A){return p!==A?(i.useProgram(A),p=A,!0):!1}let _t={[Cn]:i.FUNC_ADD,[Sl]:i.FUNC_SUBTRACT,[bl]:i.FUNC_REVERSE_SUBTRACT};if(n)_t[ya]=i.MIN,_t[Ma]=i.MAX;else{let A=t.get(\"EXT_blend_minmax\");A!==null&&(_t[ya]=A.MIN_EXT,_t[Ma]=A.MAX_EXT)}let At={[El]:i.ZERO,[wl]:i.ONE,[Tl]:i.SRC_COLOR,[Sr]:i.SRC_ALPHA,[Il]:i.SRC_ALPHA_SATURATE,[Pl]:i.DST_COLOR,[Cl]:i.DST_ALPHA,[Al]:i.ONE_MINUS_SRC_COLOR,[br]:i.ONE_MINUS_SRC_ALPHA,[Ll]:i.ONE_MINUS_DST_COLOR,[Rl]:i.ONE_MINUS_DST_ALPHA,[Ul]:i.CONSTANT_COLOR,[Dl]:i.ONE_MINUS_CONSTANT_COLOR,[Nl]:i.CONSTANT_ALPHA,[Fl]:i.ONE_MINUS_CONSTANT_ALPHA};function ht(A,at,ot,wt,Mt,qt,Yt,se,me,Zt){if(A===Ye){u===!0&&(vt(i.BLEND),u=!1);return}if(u===!1&&(Et(i.BLEND),u=!0),A!==Ml){if(A!==w||Zt!==H){if((v!==Cn||R!==Cn)&&(i.blendEquation(i.FUNC_ADD),v=Cn,R=Cn),Zt)switch(A){case ni:i.blendFuncSeparate(i.ONE,i.ONE_MINUS_SRC_ALPHA,i.ONE,i.ONE_MINUS_SRC_ALPHA);break;case _n:i.blendFunc(i.ONE,i.ONE);break;case xa:i.blendFuncSeparate(i.ZERO,i.ONE_MINUS_SRC_COLOR,i.ZERO,i.ONE);break;case va:i.blendFuncSeparate(i.ZERO,i.SRC_COLOR,i.ZERO,i.SRC_ALPHA);break;default:console.error(\"THREE.WebGLState: Invalid blending: \",A);break}else switch(A){case ni:i.blendFuncSeparate(i.SRC_ALPHA,i.ONE_MINUS_SRC_ALPHA,i.ONE,i.ONE_MINUS_SRC_ALPHA);break;case _n:i.blendFunc(i.SRC_ALPHA,i.ONE);break;case xa:i.blendFuncSeparate(i.ZERO,i.ONE_MINUS_SRC_COLOR,i.ZERO,i.ONE);break;case va:i.blendFunc(i.ZERO,i.SRC_COLOR);break;default:console.error(\"THREE.WebGLState: Invalid blending: \",A);break}P=null,U=null,C=null,Y=null,S.set(0,0,0),b=0,w=A,H=Zt}return}Mt=Mt||at,qt=qt||ot,Yt=Yt||wt,(at!==v||Mt!==R)&&(i.blendEquationSeparate(_t[at],_t[Mt]),v=at,R=Mt),(ot!==P||wt!==U||qt!==C||Yt!==Y)&&(i.blendFuncSeparate(At[ot],At[wt],At[qt],At[Yt]),P=ot,U=wt,C=qt,Y=Yt),(se.equals(S)===!1||me!==b)&&(i.blendColor(se.r,se.g,se.b,me),S.copy(se),b=me),w=A,H=!1}function Xt(A,at){A.side===nn?vt(i.CULL_FACE):Et(i.CULL_FACE);let ot=A.side===we;at&&(ot=!ot),gt(ot),A.blending===ni&&A.transparent===!1?ht(Ye):ht(A.blending,A.blendEquation,A.blendSrc,A.blendDst,A.blendEquationAlpha,A.blendSrcAlpha,A.blendDstAlpha,A.blendColor,A.blendAlpha,A.premultipliedAlpha),l.setFunc(A.depthFunc),l.setTest(A.depthTest),l.setMask(A.depthWrite),a.setMask(A.colorWrite);let wt=A.stencilWrite;c.setTest(wt),wt&&(c.setMask(A.stencilWriteMask),c.setFunc(A.stencilFunc,A.stencilRef,A.stencilFuncMask),c.setOp(A.stencilFail,A.stencilZFail,A.stencilZPass)),B(A.polygonOffset,A.polygonOffsetFactor,A.polygonOffsetUnits),A.alphaToCoverage===!0?Et(i.SAMPLE_ALPHA_TO_COVERAGE):vt(i.SAMPLE_ALPHA_TO_COVERAGE)}function gt(A){K!==A&&(A?i.frontFace(i.CW):i.frontFace(i.CCW),K=A)}function M(A){A!==xl?(Et(i.CULL_FACE),A!==T&&(A===_a?i.cullFace(i.BACK):A===vl?i.cullFace(i.FRONT):i.cullFace(i.FRONT_AND_BACK))):vt(i.CULL_FACE),T=A}function _(A){A!==E&&(G&&i.lineWidth(A),E=A)}function B(A,at,ot){A?(Et(i.POLYGON_OFFSET_FILL),(L!==at||F!==ot)&&(i.polygonOffset(at,ot),L=at,F=ot)):vt(i.POLYGON_OFFSET_FILL)}function Q(A){A?Et(i.SCISSOR_TEST):vt(i.SCISSOR_TEST)}function J(A){A===void 0&&(A=i.TEXTURE0+I-1),$!==A&&(i.activeTexture(A),$=A)}function tt(A,at,ot){ot===void 0&&($===null?ot=i.TEXTURE0+I-1:ot=$);let wt=et[ot];wt===void 0&&(wt={type:void 0,texture:void 0},et[ot]=wt),(wt.type!==A||wt.texture!==at)&&($!==ot&&(i.activeTexture(ot),$=ot),i.bindTexture(A,at||bt[A]),wt.type=A,wt.texture=at)}function ft(){let A=et[$];A!==void 0&&A.type!==void 0&&(i.bindTexture(A.type,null),A.type=void 0,A.texture=void 0)}function rt(){try{i.compressedTexImage2D.apply(i,arguments)}catch(A){console.error(\"THREE.WebGLState:\",A)}}function ct(){try{i.compressedTexImage3D.apply(i,arguments)}catch(A){console.error(\"THREE.WebGLState:\",A)}}function yt(){try{i.texSubImage2D.apply(i,arguments)}catch(A){console.error(\"THREE.WebGLState:\",A)}}function Nt(){try{i.texSubImage3D.apply(i,arguments)}catch(A){console.error(\"THREE.WebGLState:\",A)}}function j(){try{i.compressedTexSubImage2D.apply(i,arguments)}catch(A){console.error(\"THREE.WebGLState:\",A)}}function Gt(){try{i.compressedTexSubImage3D.apply(i,arguments)}catch(A){console.error(\"THREE.WebGLState:\",A)}}function Vt(){try{i.texStorage2D.apply(i,arguments)}catch(A){console.error(\"THREE.WebGLState:\",A)}}function Ct(){try{i.texStorage3D.apply(i,arguments)}catch(A){console.error(\"THREE.WebGLState:\",A)}}function xt(){try{i.texImage2D.apply(i,arguments)}catch(A){console.error(\"THREE.WebGLState:\",A)}}function ut(){try{i.texImage3D.apply(i,arguments)}catch(A){console.error(\"THREE.WebGLState:\",A)}}function Ut(A){st.equals(A)===!1&&(i.scissor(A.x,A.y,A.z,A.w),st.copy(A))}function Ht(A){pt.equals(A)===!1&&(i.viewport(A.x,A.y,A.z,A.w),pt.copy(A))}function Qt(A,at){let ot=d.get(at);ot===void 0&&(ot=new WeakMap,d.set(at,ot));let wt=ot.get(A);wt===void 0&&(wt=i.getUniformBlockIndex(at,A.name),ot.set(A,wt))}function Ot(A,at){let wt=d.get(at).get(A);h.get(at)!==wt&&(i.uniformBlockBinding(at,wt,A.__bindingPointIndex),h.set(at,wt))}function nt(){i.disable(i.BLEND),i.disable(i.CULL_FACE),i.disable(i.DEPTH_TEST),i.disable(i.POLYGON_OFFSET_FILL),i.disable(i.SCISSOR_TEST),i.disable(i.STENCIL_TEST),i.disable(i.SAMPLE_ALPHA_TO_COVERAGE),i.blendEquation(i.FUNC_ADD),i.blendFunc(i.ONE,i.ZERO),i.blendFuncSeparate(i.ONE,i.ZERO,i.ONE,i.ZERO),i.blendColor(0,0,0,0),i.colorMask(!0,!0,!0,!0),i.clearColor(0,0,0,0),i.depthMask(!0),i.depthFunc(i.LESS),i.clearDepth(1),i.stencilMask(4294967295),i.stencilFunc(i.ALWAYS,0,4294967295),i.stencilOp(i.KEEP,i.KEEP,i.KEEP),i.clearStencil(0),i.cullFace(i.BACK),i.frontFace(i.CCW),i.polygonOffset(0,0),i.activeTexture(i.TEXTURE0),i.bindFramebuffer(i.FRAMEBUFFER,null),n===!0&&(i.bindFramebuffer(i.DRAW_FRAMEBUFFER,null),i.bindFramebuffer(i.READ_FRAMEBUFFER,null)),i.useProgram(null),i.lineWidth(1),i.scissor(0,0,i.canvas.width,i.canvas.height),i.viewport(0,0,i.canvas.width,i.canvas.height),f={},$=null,et={},m={},g=new WeakMap,x=[],p=null,u=!1,w=null,v=null,P=null,U=null,R=null,C=null,Y=null,S=new Pt(0,0,0),b=0,H=!1,K=null,T=null,E=null,L=null,F=null,st.set(0,0,i.canvas.width,i.canvas.height),pt.set(0,0,i.canvas.width,i.canvas.height),a.reset(),l.reset(),c.reset()}return{buffers:{color:a,depth:l,stencil:c},enable:Et,disable:vt,bindFramebuffer:kt,drawBuffers:O,useProgram:le,setBlending:ht,setMaterial:Xt,setFlipSided:gt,setCullFace:M,setLineWidth:_,setPolygonOffset:B,setScissorTest:Q,activeTexture:J,bindTexture:tt,unbindTexture:ft,compressedTexImage2D:rt,compressedTexImage3D:ct,texImage2D:xt,texImage3D:ut,updateUBOMapping:Qt,uniformBlockBinding:Ot,texStorage2D:Vt,texStorage3D:Ct,texSubImage2D:yt,texSubImage3D:Nt,compressedTexSubImage2D:j,compressedTexSubImage3D:Gt,scissor:Ut,viewport:Ht,reset:nt}}function rp(i,t,e,n,s,r,o){let a=s.isWebGL2,l=t.has(\"WEBGL_multisampled_render_to_texture\")?t.get(\"WEBGL_multisampled_render_to_texture\"):null,c=typeof navigator>\"u\"?!1:/OculusBrowser/g.test(navigator.userAgent),h=new WeakMap,d,f=new WeakMap,m=!1;try{m=typeof OffscreenCanvas<\"u\"&&new OffscreenCanvas(1,1).getContext(\"2d\")!==null}catch{}function g(M,_){return m?new OffscreenCanvas(M,_):ms(\"canvas\")}function x(M,_,B,Q){let J=1;if((M.width>Q||M.height>Q)&&(J=Q/Math.max(M.width,M.height)),J<1||_===!0)if(typeof HTMLImageElement<\"u\"&&M instanceof HTMLImageElement||typeof HTMLCanvasElement<\"u\"&&M instanceof HTMLCanvasElement||typeof ImageBitmap<\"u\"&&M instanceof ImageBitmap){let tt=_?Pr:Math.floor,ft=tt(J*M.width),rt=tt(J*M.height);d===void 0&&(d=g(ft,rt));let ct=B?g(ft,rt):d;return ct.width=ft,ct.height=rt,ct.getContext(\"2d\").drawImage(M,0,0,ft,rt),console.warn(\"THREE.WebGLRenderer: Texture has been resized from (\"+M.width+\"x\"+M.height+\") to (\"+ft+\"x\"+rt+\").\"),ct}else return\"data\"in M&&console.warn(\"THREE.WebGLRenderer: Image in DataTexture is too big (\"+M.width+\"x\"+M.height+\").\"),M;return M}function p(M){return to(M.width)&&to(M.height)}function u(M){return a?!1:M.wrapS!==ze||M.wrapT!==ze||M.minFilter!==xe&&M.minFilter!==Ue}function w(M,_){return M.generateMipmaps&&_&&M.minFilter!==xe&&M.minFilter!==Ue}function v(M){i.generateMipmap(M)}function P(M,_,B,Q,J=!1){if(a===!1)return _;if(M!==null){if(i[M]!==void 0)return i[M];console.warn(\"THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '\"+M+\"'\")}let tt=_;if(_===i.RED&&(B===i.FLOAT&&(tt=i.R32F),B===i.HALF_FLOAT&&(tt=i.R16F),B===i.UNSIGNED_BYTE&&(tt=i.R8)),_===i.RED_INTEGER&&(B===i.UNSIGNED_BYTE&&(tt=i.R8UI),B===i.UNSIGNED_SHORT&&(tt=i.R16UI),B===i.UNSIGNED_INT&&(tt=i.R32UI),B===i.BYTE&&(tt=i.R8I),B===i.SHORT&&(tt=i.R16I),B===i.INT&&(tt=i.R32I)),_===i.RG&&(B===i.FLOAT&&(tt=i.RG32F),B===i.HALF_FLOAT&&(tt=i.RG16F),B===i.UNSIGNED_BYTE&&(tt=i.RG8)),_===i.RGBA){let ft=J?us:Wt.getTransfer(Q);B===i.FLOAT&&(tt=i.RGBA32F),B===i.HALF_FLOAT&&(tt=i.RGBA16F),B===i.UNSIGNED_BYTE&&(tt=ft===Jt?i.SRGB8_ALPHA8:i.RGBA8),B===i.UNSIGNED_SHORT_4_4_4_4&&(tt=i.RGBA4),B===i.UNSIGNED_SHORT_5_5_5_1&&(tt=i.RGB5_A1)}return(tt===i.R16F||tt===i.R32F||tt===i.RG16F||tt===i.RG32F||tt===i.RGBA16F||tt===i.RGBA32F)&&t.get(\"EXT_color_buffer_float\"),tt}function U(M,_,B){return w(M,B)===!0||M.isFramebufferTexture&&M.minFilter!==xe&&M.minFilter!==Ue?Math.log2(Math.max(_.width,_.height))+1:M.mipmaps!==void 0&&M.mipmaps.length>0?M.mipmaps.length:M.isCompressedTexture&&Array.isArray(M.image)?_.mipmaps.length:1}function R(M){return M===xe||M===Sa||M===Ws?i.NEAREST:i.LINEAR}function C(M){let _=M.target;_.removeEventListener(\"dispose\",C),S(_),_.isVideoTexture&&h.delete(_)}function Y(M){let _=M.target;_.removeEventListener(\"dispose\",Y),H(_)}function S(M){let _=n.get(M);if(_.__webglInit===void 0)return;let B=M.source,Q=f.get(B);if(Q){let J=Q[_.__cacheKey];J.usedTimes--,J.usedTimes===0&&b(M),Object.keys(Q).length===0&&f.delete(B)}n.remove(M)}function b(M){let _=n.get(M);i.deleteTexture(_.__webglTexture);let B=M.source,Q=f.get(B);delete Q[_.__cacheKey],o.memory.textures--}function H(M){let _=M.texture,B=n.get(M),Q=n.get(_);if(Q.__webglTexture!==void 0&&(i.deleteTexture(Q.__webglTexture),o.memory.textures--),M.depthTexture&&M.depthTexture.dispose(),M.isWebGLCubeRenderTarget)for(let J=0;J<6;J++){if(Array.isArray(B.__webglFramebuffer[J]))for(let tt=0;tt<B.__webglFramebuffer[J].length;tt++)i.deleteFramebuffer(B.__webglFramebuffer[J][tt]);else i.deleteFramebuffer(B.__webglFramebuffer[J]);B.__webglDepthbuffer&&i.deleteRenderbuffer(B.__webglDepthbuffer[J])}else{if(Array.isArray(B.__webglFramebuffer))for(let J=0;J<B.__webglFramebuffer.length;J++)i.deleteFramebuffer(B.__webglFramebuffer[J]);else i.deleteFramebuffer(B.__webglFramebuffer);if(B.__webglDepthbuffer&&i.deleteRenderbuffer(B.__webglDepthbuffer),B.__webglMultisampledFramebuffer&&i.deleteFramebuffer(B.__webglMultisampledFramebuffer),B.__webglColorRenderbuffer)for(let J=0;J<B.__webglColorRenderbuffer.length;J++)B.__webglColorRenderbuffer[J]&&i.deleteRenderbuffer(B.__webglColorRenderbuffer[J]);B.__webglDepthRenderbuffer&&i.deleteRenderbuffer(B.__webglDepthRenderbuffer)}if(M.isWebGLMultipleRenderTargets)for(let J=0,tt=_.length;J<tt;J++){let ft=n.get(_[J]);ft.__webglTexture&&(i.deleteTexture(ft.__webglTexture),o.memory.textures--),n.remove(_[J])}n.remove(_),n.remove(M)}let K=0;function T(){K=0}function E(){let M=K;return M>=s.maxTextures&&console.warn(\"THREE.WebGLTextures: Trying to use \"+M+\" texture units while this GPU supports only \"+s.maxTextures),K+=1,M}function L(M){let _=[];return _.push(M.wrapS),_.push(M.wrapT),_.push(M.wrapR||0),_.push(M.magFilter),_.push(M.minFilter),_.push(M.anisotropy),_.push(M.internalFormat),_.push(M.format),_.push(M.type),_.push(M.generateMipmaps),_.push(M.premultiplyAlpha),_.push(M.flipY),_.push(M.unpackAlignment),_.push(M.colorSpace),_.join()}function F(M,_){let B=n.get(M);if(M.isVideoTexture&&Xt(M),M.isRenderTargetTexture===!1&&M.version>0&&B.__version!==M.version){let Q=M.image;if(Q===null)console.warn(\"THREE.WebGLRenderer: Texture marked for update but no image data found.\");else if(Q.complete===!1)console.warn(\"THREE.WebGLRenderer: Texture marked for update but image is incomplete\");else{st(B,M,_);return}}e.bindTexture(i.TEXTURE_2D,B.__webglTexture,i.TEXTURE0+_)}function I(M,_){let B=n.get(M);if(M.version>0&&B.__version!==M.version){st(B,M,_);return}e.bindTexture(i.TEXTURE_2D_ARRAY,B.__webglTexture,i.TEXTURE0+_)}function G(M,_){let B=n.get(M);if(M.version>0&&B.__version!==M.version){st(B,M,_);return}e.bindTexture(i.TEXTURE_3D,B.__webglTexture,i.TEXTURE0+_)}function X(M,_){let B=n.get(M);if(M.version>0&&B.__version!==M.version){pt(B,M,_);return}e.bindTexture(i.TEXTURE_CUBE_MAP,B.__webglTexture,i.TEXTURE0+_)}let Z={[Tr]:i.REPEAT,[ze]:i.CLAMP_TO_EDGE,[Ar]:i.MIRRORED_REPEAT},$={[xe]:i.NEAREST,[Sa]:i.NEAREST_MIPMAP_NEAREST,[Ws]:i.NEAREST_MIPMAP_LINEAR,[Ue]:i.LINEAR,[Kl]:i.LINEAR_MIPMAP_NEAREST,[Ei]:i.LINEAR_MIPMAP_LINEAR},et={[hc]:i.NEVER,[gc]:i.ALWAYS,[uc]:i.LESS,[nl]:i.LEQUAL,[dc]:i.EQUAL,[mc]:i.GEQUAL,[fc]:i.GREATER,[pc]:i.NOTEQUAL};function W(M,_,B){if(B?(i.texParameteri(M,i.TEXTURE_WRAP_S,Z[_.wrapS]),i.texParameteri(M,i.TEXTURE_WRAP_T,Z[_.wrapT]),(M===i.TEXTURE_3D||M===i.TEXTURE_2D_ARRAY)&&i.texParameteri(M,i.TEXTURE_WRAP_R,Z[_.wrapR]),i.texParameteri(M,i.TEXTURE_MAG_FILTER,$[_.magFilter]),i.texParameteri(M,i.TEXTURE_MIN_FILTER,$[_.minFilter])):(i.texParameteri(M,i.TEXTURE_WRAP_S,i.CLAMP_TO_EDGE),i.texParameteri(M,i.TEXTURE_WRAP_T,i.CLAMP_TO_EDGE),(M===i.TEXTURE_3D||M===i.TEXTURE_2D_ARRAY)&&i.texParameteri(M,i.TEXTURE_WRAP_R,i.CLAMP_TO_EDGE),(_.wrapS!==ze||_.wrapT!==ze)&&console.warn(\"THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.\"),i.texParameteri(M,i.TEXTURE_MAG_FILTER,R(_.magFilter)),i.texParameteri(M,i.TEXTURE_MIN_FILTER,R(_.minFilter)),_.minFilter!==xe&&_.minFilter!==Ue&&console.warn(\"THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.\")),_.compareFunction&&(i.texParameteri(M,i.TEXTURE_COMPARE_MODE,i.COMPARE_REF_TO_TEXTURE),i.texParameteri(M,i.TEXTURE_COMPARE_FUNC,et[_.compareFunction])),t.has(\"EXT_texture_filter_anisotropic\")===!0){let Q=t.get(\"EXT_texture_filter_anisotropic\");if(_.magFilter===xe||_.minFilter!==Ws&&_.minFilter!==Ei||_.type===dn&&t.has(\"OES_texture_float_linear\")===!1||a===!1&&_.type===ke&&t.has(\"OES_texture_half_float_linear\")===!1)return;(_.anisotropy>1||n.get(_).__currentAnisotropy)&&(i.texParameterf(M,Q.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(_.anisotropy,s.getMaxAnisotropy())),n.get(_).__currentAnisotropy=_.anisotropy)}}function q(M,_){let B=!1;M.__webglInit===void 0&&(M.__webglInit=!0,_.addEventListener(\"dispose\",C));let Q=_.source,J=f.get(Q);J===void 0&&(J={},f.set(Q,J));let tt=L(_);if(tt!==M.__cacheKey){J[tt]===void 0&&(J[tt]={texture:i.createTexture(),usedTimes:0},o.memory.textures++,B=!0),J[tt].usedTimes++;let ft=J[M.__cacheKey];ft!==void 0&&(J[M.__cacheKey].usedTimes--,ft.usedTimes===0&&b(_)),M.__cacheKey=tt,M.__webglTexture=J[tt].texture}return B}function st(M,_,B){let Q=i.TEXTURE_2D;(_.isDataArrayTexture||_.isCompressedArrayTexture)&&(Q=i.TEXTURE_2D_ARRAY),_.isData3DTexture&&(Q=i.TEXTURE_3D);let J=q(M,_),tt=_.source;e.bindTexture(Q,M.__webglTexture,i.TEXTURE0+B);let ft=n.get(tt);if(tt.version!==ft.__version||J===!0){e.activeTexture(i.TEXTURE0+B);let rt=Wt.getPrimaries(Wt.workingColorSpace),ct=_.colorSpace===De?null:Wt.getPrimaries(_.colorSpace),yt=_.colorSpace===De||rt===ct?i.NONE:i.BROWSER_DEFAULT_WEBGL;i.pixelStorei(i.UNPACK_FLIP_Y_WEBGL,_.flipY),i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL,_.premultiplyAlpha),i.pixelStorei(i.UNPACK_ALIGNMENT,_.unpackAlignment),i.pixelStorei(i.UNPACK_COLORSPACE_CONVERSION_WEBGL,yt);let Nt=u(_)&&p(_.image)===!1,j=x(_.image,Nt,!1,s.maxTextureSize);j=gt(_,j);let Gt=p(j)||a,Vt=r.convert(_.format,_.colorSpace),Ct=r.convert(_.type),xt=P(_.internalFormat,Vt,Ct,_.colorSpace,_.isVideoTexture);W(Q,_,Gt);let ut,Ut=_.mipmaps,Ht=a&&_.isVideoTexture!==!0&&xt!==tl,Qt=ft.__version===void 0||J===!0,Ot=U(_,j,Gt);if(_.isDepthTexture)xt=i.DEPTH_COMPONENT,a?_.type===dn?xt=i.DEPTH_COMPONENT32F:_.type===un?xt=i.DEPTH_COMPONENT24:_.type===Pn?xt=i.DEPTH24_STENCIL8:xt=i.DEPTH_COMPONENT16:_.type===dn&&console.error(\"WebGLRenderer: Floating point depth texture requires WebGL2.\"),_.format===Ln&&xt===i.DEPTH_COMPONENT&&_.type!==ra&&_.type!==un&&(console.warn(\"THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.\"),_.type=un,Ct=r.convert(_.type)),_.format===oi&&xt===i.DEPTH_COMPONENT&&(xt=i.DEPTH_STENCIL,_.type!==Pn&&(console.warn(\"THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.\"),_.type=Pn,Ct=r.convert(_.type))),Qt&&(Ht?e.texStorage2D(i.TEXTURE_2D,1,xt,j.width,j.height):e.texImage2D(i.TEXTURE_2D,0,xt,j.width,j.height,0,Vt,Ct,null));else if(_.isDataTexture)if(Ut.length>0&&Gt){Ht&&Qt&&e.texStorage2D(i.TEXTURE_2D,Ot,xt,Ut[0].width,Ut[0].height);for(let nt=0,A=Ut.length;nt<A;nt++)ut=Ut[nt],Ht?e.texSubImage2D(i.TEXTURE_2D,nt,0,0,ut.width,ut.height,Vt,Ct,ut.data):e.texImage2D(i.TEXTURE_2D,nt,xt,ut.width,ut.height,0,Vt,Ct,ut.data);_.generateMipmaps=!1}else Ht?(Qt&&e.texStorage2D(i.TEXTURE_2D,Ot,xt,j.width,j.height),e.texSubImage2D(i.TEXTURE_2D,0,0,0,j.width,j.height,Vt,Ct,j.data)):e.texImage2D(i.TEXTURE_2D,0,xt,j.width,j.height,0,Vt,Ct,j.data);else if(_.isCompressedTexture)if(_.isCompressedArrayTexture){Ht&&Qt&&e.texStorage3D(i.TEXTURE_2D_ARRAY,Ot,xt,Ut[0].width,Ut[0].height,j.depth);for(let nt=0,A=Ut.length;nt<A;nt++)ut=Ut[nt],_.format!==Ve?Vt!==null?Ht?e.compressedTexSubImage3D(i.TEXTURE_2D_ARRAY,nt,0,0,0,ut.width,ut.height,j.depth,Vt,ut.data,0,0):e.compressedTexImage3D(i.TEXTURE_2D_ARRAY,nt,xt,ut.width,ut.height,j.depth,0,ut.data,0,0):console.warn(\"THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()\"):Ht?e.texSubImage3D(i.TEXTURE_2D_ARRAY,nt,0,0,0,ut.width,ut.height,j.depth,Vt,Ct,ut.data):e.texImage3D(i.TEXTURE_2D_ARRAY,nt,xt,ut.width,ut.height,j.depth,0,Vt,Ct,ut.data)}else{Ht&&Qt&&e.texStorage2D(i.TEXTURE_2D,Ot,xt,Ut[0].width,Ut[0].height);for(let nt=0,A=Ut.length;nt<A;nt++)ut=Ut[nt],_.format!==Ve?Vt!==null?Ht?e.compressedTexSubImage2D(i.TEXTURE_2D,nt,0,0,ut.width,ut.height,Vt,ut.data):e.compressedTexImage2D(i.TEXTURE_2D,nt,xt,ut.width,ut.height,0,ut.data):console.warn(\"THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()\"):Ht?e.texSubImage2D(i.TEXTURE_2D,nt,0,0,ut.width,ut.height,Vt,Ct,ut.data):e.texImage2D(i.TEXTURE_2D,nt,xt,ut.width,ut.height,0,Vt,Ct,ut.data)}else if(_.isDataArrayTexture)Ht?(Qt&&e.texStorage3D(i.TEXTURE_2D_ARRAY,Ot,xt,j.width,j.height,j.depth),e.texSubImage3D(i.TEXTURE_2D_ARRAY,0,0,0,0,j.width,j.height,j.depth,Vt,Ct,j.data)):e.texImage3D(i.TEXTURE_2D_ARRAY,0,xt,j.width,j.height,j.depth,0,Vt,Ct,j.data);else if(_.isData3DTexture)Ht?(Qt&&e.texStorage3D(i.TEXTURE_3D,Ot,xt,j.width,j.height,j.depth),e.texSubImage3D(i.TEXTURE_3D,0,0,0,0,j.width,j.height,j.depth,Vt,Ct,j.data)):e.texImage3D(i.TEXTURE_3D,0,xt,j.width,j.height,j.depth,0,Vt,Ct,j.data);else if(_.isFramebufferTexture){if(Qt)if(Ht)e.texStorage2D(i.TEXTURE_2D,Ot,xt,j.width,j.height);else{let nt=j.width,A=j.height;for(let at=0;at<Ot;at++)e.texImage2D(i.TEXTURE_2D,at,xt,nt,A,0,Vt,Ct,null),nt>>=1,A>>=1}}else if(Ut.length>0&&Gt){Ht&&Qt&&e.texStorage2D(i.TEXTURE_2D,Ot,xt,Ut[0].width,Ut[0].height);for(let nt=0,A=Ut.length;nt<A;nt++)ut=Ut[nt],Ht?e.texSubImage2D(i.TEXTURE_2D,nt,0,0,Vt,Ct,ut):e.texImage2D(i.TEXTURE_2D,nt,xt,Vt,Ct,ut);_.generateMipmaps=!1}else Ht?(Qt&&e.texStorage2D(i.TEXTURE_2D,Ot,xt,j.width,j.height),e.texSubImage2D(i.TEXTURE_2D,0,0,0,Vt,Ct,j)):e.texImage2D(i.TEXTURE_2D,0,xt,Vt,Ct,j);w(_,Gt)&&v(Q),ft.__version=tt.version,_.onUpdate&&_.onUpdate(_)}M.__version=_.version}function pt(M,_,B){if(_.image.length!==6)return;let Q=q(M,_),J=_.source;e.bindTexture(i.TEXTURE_CUBE_MAP,M.__webglTexture,i.TEXTURE0+B);let tt=n.get(J);if(J.version!==tt.__version||Q===!0){e.activeTexture(i.TEXTURE0+B);let ft=Wt.getPrimaries(Wt.workingColorSpace),rt=_.colorSpace===De?null:Wt.getPrimaries(_.colorSpace),ct=_.colorSpace===De||ft===rt?i.NONE:i.BROWSER_DEFAULT_WEBGL;i.pixelStorei(i.UNPACK_FLIP_Y_WEBGL,_.flipY),i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL,_.premultiplyAlpha),i.pixelStorei(i.UNPACK_ALIGNMENT,_.unpackAlignment),i.pixelStorei(i.UNPACK_COLORSPACE_CONVERSION_WEBGL,ct);let yt=_.isCompressedTexture||_.image[0].isCompressedTexture,Nt=_.image[0]&&_.image[0].isDataTexture,j=[];for(let nt=0;nt<6;nt++)!yt&&!Nt?j[nt]=x(_.image[nt],!1,!0,s.maxCubemapSize):j[nt]=Nt?_.image[nt].image:_.image[nt],j[nt]=gt(_,j[nt]);let Gt=j[0],Vt=p(Gt)||a,Ct=r.convert(_.format,_.colorSpace),xt=r.convert(_.type),ut=P(_.internalFormat,Ct,xt,_.colorSpace),Ut=a&&_.isVideoTexture!==!0,Ht=tt.__version===void 0||Q===!0,Qt=U(_,Gt,Vt);W(i.TEXTURE_CUBE_MAP,_,Vt);let Ot;if(yt){Ut&&Ht&&e.texStorage2D(i.TEXTURE_CUBE_MAP,Qt,ut,Gt.width,Gt.height);for(let nt=0;nt<6;nt++){Ot=j[nt].mipmaps;for(let A=0;A<Ot.length;A++){let at=Ot[A];_.format!==Ve?Ct!==null?Ut?e.compressedTexSubImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+nt,A,0,0,at.width,at.height,Ct,at.data):e.compressedTexImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+nt,A,ut,at.width,at.height,0,at.data):console.warn(\"THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()\"):Ut?e.texSubImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+nt,A,0,0,at.width,at.height,Ct,xt,at.data):e.texImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+nt,A,ut,at.width,at.height,0,Ct,xt,at.data)}}}else{Ot=_.mipmaps,Ut&&Ht&&(Ot.length>0&&Qt++,e.texStorage2D(i.TEXTURE_CUBE_MAP,Qt,ut,j[0].width,j[0].height));for(let nt=0;nt<6;nt++)if(Nt){Ut?e.texSubImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+nt,0,0,0,j[nt].width,j[nt].height,Ct,xt,j[nt].data):e.texImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+nt,0,ut,j[nt].width,j[nt].height,0,Ct,xt,j[nt].data);for(let A=0;A<Ot.length;A++){let ot=Ot[A].image[nt].image;Ut?e.texSubImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+nt,A+1,0,0,ot.width,ot.height,Ct,xt,ot.data):e.texImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+nt,A+1,ut,ot.width,ot.height,0,Ct,xt,ot.data)}}else{Ut?e.texSubImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+nt,0,0,0,Ct,xt,j[nt]):e.texImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+nt,0,ut,Ct,xt,j[nt]);for(let A=0;A<Ot.length;A++){let at=Ot[A];Ut?e.texSubImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+nt,A+1,0,0,Ct,xt,at.image[nt]):e.texImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+nt,A+1,ut,Ct,xt,at.image[nt])}}}w(_,Vt)&&v(i.TEXTURE_CUBE_MAP),tt.__version=J.version,_.onUpdate&&_.onUpdate(_)}M.__version=_.version}function dt(M,_,B,Q,J,tt){let ft=r.convert(B.format,B.colorSpace),rt=r.convert(B.type),ct=P(B.internalFormat,ft,rt,B.colorSpace);if(!n.get(_).__hasExternalTextures){let Nt=Math.max(1,_.width>>tt),j=Math.max(1,_.height>>tt);J===i.TEXTURE_3D||J===i.TEXTURE_2D_ARRAY?e.texImage3D(J,tt,ct,Nt,j,_.depth,0,ft,rt,null):e.texImage2D(J,tt,ct,Nt,j,0,ft,rt,null)}e.bindFramebuffer(i.FRAMEBUFFER,M),ht(_)?l.framebufferTexture2DMultisampleEXT(i.FRAMEBUFFER,Q,J,n.get(B).__webglTexture,0,At(_)):(J===i.TEXTURE_2D||J>=i.TEXTURE_CUBE_MAP_POSITIVE_X&&J<=i.TEXTURE_CUBE_MAP_NEGATIVE_Z)&&i.framebufferTexture2D(i.FRAMEBUFFER,Q,J,n.get(B).__webglTexture,tt),e.bindFramebuffer(i.FRAMEBUFFER,null)}function bt(M,_,B){if(i.bindRenderbuffer(i.RENDERBUFFER,M),_.depthBuffer&&!_.stencilBuffer){let Q=a===!0?i.DEPTH_COMPONENT24:i.DEPTH_COMPONENT16;if(B||ht(_)){let J=_.depthTexture;J&&J.isDepthTexture&&(J.type===dn?Q=i.DEPTH_COMPONENT32F:J.type===un&&(Q=i.DEPTH_COMPONENT24));let tt=At(_);ht(_)?l.renderbufferStorageMultisampleEXT(i.RENDERBUFFER,tt,Q,_.width,_.height):i.renderbufferStorageMultisample(i.RENDERBUFFER,tt,Q,_.width,_.height)}else i.renderbufferStorage(i.RENDERBUFFER,Q,_.width,_.height);i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_ATTACHMENT,i.RENDERBUFFER,M)}else if(_.depthBuffer&&_.stencilBuffer){let Q=At(_);B&&ht(_)===!1?i.renderbufferStorageMultisample(i.RENDERBUFFER,Q,i.DEPTH24_STENCIL8,_.width,_.height):ht(_)?l.renderbufferStorageMultisampleEXT(i.RENDERBUFFER,Q,i.DEPTH24_STENCIL8,_.width,_.height):i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,_.width,_.height),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,M)}else{let Q=_.isWebGLMultipleRenderTargets===!0?_.texture:[_.texture];for(let J=0;J<Q.length;J++){let tt=Q[J],ft=r.convert(tt.format,tt.colorSpace),rt=r.convert(tt.type),ct=P(tt.internalFormat,ft,rt,tt.colorSpace),yt=At(_);B&&ht(_)===!1?i.renderbufferStorageMultisample(i.RENDERBUFFER,yt,ct,_.width,_.height):ht(_)?l.renderbufferStorageMultisampleEXT(i.RENDERBUFFER,yt,ct,_.width,_.height):i.renderbufferStorage(i.RENDERBUFFER,ct,_.width,_.height)}}i.bindRenderbuffer(i.RENDERBUFFER,null)}function Et(M,_){if(_&&_.isWebGLCubeRenderTarget)throw new Error(\"Depth Texture with cube render targets is not supported\");if(e.bindFramebuffer(i.FRAMEBUFFER,M),!(_.depthTexture&&_.depthTexture.isDepthTexture))throw new Error(\"renderTarget.depthTexture must be an instance of THREE.DepthTexture\");(!n.get(_.depthTexture).__webglTexture||_.depthTexture.image.width!==_.width||_.depthTexture.image.height!==_.height)&&(_.depthTexture.image.width=_.width,_.depthTexture.image.height=_.height,_.depthTexture.needsUpdate=!0),F(_.depthTexture,0);let Q=n.get(_.depthTexture).__webglTexture,J=At(_);if(_.depthTexture.format===Ln)ht(_)?l.framebufferTexture2DMultisampleEXT(i.FRAMEBUFFER,i.DEPTH_ATTACHMENT,i.TEXTURE_2D,Q,0,J):i.framebufferTexture2D(i.FRAMEBUFFER,i.DEPTH_ATTACHMENT,i.TEXTURE_2D,Q,0);else if(_.depthTexture.format===oi)ht(_)?l.framebufferTexture2DMultisampleEXT(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.TEXTURE_2D,Q,0,J):i.framebufferTexture2D(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.TEXTURE_2D,Q,0);else throw new Error(\"Unknown depthTexture format\")}function vt(M){let _=n.get(M),B=M.isWebGLCubeRenderTarget===!0;if(M.depthTexture&&!_.__autoAllocateDepthBuffer){if(B)throw new Error(\"target.depthTexture not supported in Cube render targets\");Et(_.__webglFramebuffer,M)}else if(B){_.__webglDepthbuffer=[];for(let Q=0;Q<6;Q++)e.bindFramebuffer(i.FRAMEBUFFER,_.__webglFramebuffer[Q]),_.__webglDepthbuffer[Q]=i.createRenderbuffer(),bt(_.__webglDepthbuffer[Q],M,!1)}else e.bindFramebuffer(i.FRAMEBUFFER,_.__webglFramebuffer),_.__webglDepthbuffer=i.createRenderbuffer(),bt(_.__webglDepthbuffer,M,!1);e.bindFramebuffer(i.FRAMEBUFFER,null)}function kt(M,_,B){let Q=n.get(M);_!==void 0&&dt(Q.__webglFramebuffer,M,M.texture,i.COLOR_ATTACHMENT0,i.TEXTURE_2D,0),B!==void 0&&vt(M)}function O(M){let _=M.texture,B=n.get(M),Q=n.get(_);M.addEventListener(\"dispose\",Y),M.isWebGLMultipleRenderTargets!==!0&&(Q.__webglTexture===void 0&&(Q.__webglTexture=i.createTexture()),Q.__version=_.version,o.memory.textures++);let J=M.isWebGLCubeRenderTarget===!0,tt=M.isWebGLMultipleRenderTargets===!0,ft=p(M)||a;if(J){B.__webglFramebuffer=[];for(let rt=0;rt<6;rt++)if(a&&_.mipmaps&&_.mipmaps.length>0){B.__webglFramebuffer[rt]=[];for(let ct=0;ct<_.mipmaps.length;ct++)B.__webglFramebuffer[rt][ct]=i.createFramebuffer()}else B.__webglFramebuffer[rt]=i.createFramebuffer()}else{if(a&&_.mipmaps&&_.mipmaps.length>0){B.__webglFramebuffer=[];for(let rt=0;rt<_.mipmaps.length;rt++)B.__webglFramebuffer[rt]=i.createFramebuffer()}else B.__webglFramebuffer=i.createFramebuffer();if(tt)if(s.drawBuffers){let rt=M.texture;for(let ct=0,yt=rt.length;ct<yt;ct++){let Nt=n.get(rt[ct]);Nt.__webglTexture===void 0&&(Nt.__webglTexture=i.createTexture(),o.memory.textures++)}}else console.warn(\"THREE.WebGLRenderer: WebGLMultipleRenderTargets can only be used with WebGL2 or WEBGL_draw_buffers extension.\");if(a&&M.samples>0&&ht(M)===!1){let rt=tt?_:[_];B.__webglMultisampledFramebuffer=i.createFramebuffer(),B.__webglColorRenderbuffer=[],e.bindFramebuffer(i.FRAMEBUFFER,B.__webglMultisampledFramebuffer);for(let ct=0;ct<rt.length;ct++){let yt=rt[ct];B.__webglColorRenderbuffer[ct]=i.createRenderbuffer(),i.bindRenderbuffer(i.RENDERBUFFER,B.__webglColorRenderbuffer[ct]);let Nt=r.convert(yt.format,yt.colorSpace),j=r.convert(yt.type),Gt=P(yt.internalFormat,Nt,j,yt.colorSpace,M.isXRRenderTarget===!0),Vt=At(M);i.renderbufferStorageMultisample(i.RENDERBUFFER,Vt,Gt,M.width,M.height),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0+ct,i.RENDERBUFFER,B.__webglColorRenderbuffer[ct])}i.bindRenderbuffer(i.RENDERBUFFER,null),M.depthBuffer&&(B.__webglDepthRenderbuffer=i.createRenderbuffer(),bt(B.__webglDepthRenderbuffer,M,!0)),e.bindFramebuffer(i.FRAMEBUFFER,null)}}if(J){e.bindTexture(i.TEXTURE_CUBE_MAP,Q.__webglTexture),W(i.TEXTURE_CUBE_MAP,_,ft);for(let rt=0;rt<6;rt++)if(a&&_.mipmaps&&_.mipmaps.length>0)for(let ct=0;ct<_.mipmaps.length;ct++)dt(B.__webglFramebuffer[rt][ct],M,_,i.COLOR_ATTACHMENT0,i.TEXTURE_CUBE_MAP_POSITIVE_X+rt,ct);else dt(B.__webglFramebuffer[rt],M,_,i.COLOR_ATTACHMENT0,i.TEXTURE_CUBE_MAP_POSITIVE_X+rt,0);w(_,ft)&&v(i.TEXTURE_CUBE_MAP),e.unbindTexture()}else if(tt){let rt=M.texture;for(let ct=0,yt=rt.length;ct<yt;ct++){let Nt=rt[ct],j=n.get(Nt);e.bindTexture(i.TEXTURE_2D,j.__webglTexture),W(i.TEXTURE_2D,Nt,ft),dt(B.__webglFramebuffer,M,Nt,i.COLOR_ATTACHMENT0+ct,i.TEXTURE_2D,0),w(Nt,ft)&&v(i.TEXTURE_2D)}e.unbindTexture()}else{let rt=i.TEXTURE_2D;if((M.isWebGL3DRenderTarget||M.isWebGLArrayRenderTarget)&&(a?rt=M.isWebGL3DRenderTarget?i.TEXTURE_3D:i.TEXTURE_2D_ARRAY:console.error(\"THREE.WebGLTextures: THREE.Data3DTexture and THREE.DataArrayTexture only supported with WebGL2.\")),e.bindTexture(rt,Q.__webglTexture),W(rt,_,ft),a&&_.mipmaps&&_.mipmaps.length>0)for(let ct=0;ct<_.mipmaps.length;ct++)dt(B.__webglFramebuffer[ct],M,_,i.COLOR_ATTACHMENT0,rt,ct);else dt(B.__webglFramebuffer,M,_,i.COLOR_ATTACHMENT0,rt,0);w(_,ft)&&v(rt),e.unbindTexture()}M.depthBuffer&&vt(M)}function le(M){let _=p(M)||a,B=M.isWebGLMultipleRenderTargets===!0?M.texture:[M.texture];for(let Q=0,J=B.length;Q<J;Q++){let tt=B[Q];if(w(tt,_)){let ft=M.isWebGLCubeRenderTarget?i.TEXTURE_CUBE_MAP:i.TEXTURE_2D,rt=n.get(tt).__webglTexture;e.bindTexture(ft,rt),v(ft),e.unbindTexture()}}}function _t(M){if(a&&M.samples>0&&ht(M)===!1){let _=M.isWebGLMultipleRenderTargets?M.texture:[M.texture],B=M.width,Q=M.height,J=i.COLOR_BUFFER_BIT,tt=[],ft=M.stencilBuffer?i.DEPTH_STENCIL_ATTACHMENT:i.DEPTH_ATTACHMENT,rt=n.get(M),ct=M.isWebGLMultipleRenderTargets===!0;if(ct)for(let yt=0;yt<_.length;yt++)e.bindFramebuffer(i.FRAMEBUFFER,rt.__webglMultisampledFramebuffer),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0+yt,i.RENDERBUFFER,null),e.bindFramebuffer(i.FRAMEBUFFER,rt.__webglFramebuffer),i.framebufferTexture2D(i.DRAW_FRAMEBUFFER,i.COLOR_ATTACHMENT0+yt,i.TEXTURE_2D,null,0);e.bindFramebuffer(i.READ_FRAMEBUFFER,rt.__webglMultisampledFramebuffer),e.bindFramebuffer(i.DRAW_FRAMEBUFFER,rt.__webglFramebuffer);for(let yt=0;yt<_.length;yt++){tt.push(i.COLOR_ATTACHMENT0+yt),M.depthBuffer&&tt.push(ft);let Nt=rt.__ignoreDepthValues!==void 0?rt.__ignoreDepthValues:!1;if(Nt===!1&&(M.depthBuffer&&(J|=i.DEPTH_BUFFER_BIT),M.stencilBuffer&&(J|=i.STENCIL_BUFFER_BIT)),ct&&i.framebufferRenderbuffer(i.READ_FRAMEBUFFER,i.COLOR_ATTACHMENT0,i.RENDERBUFFER,rt.__webglColorRenderbuffer[yt]),Nt===!0&&(i.invalidateFramebuffer(i.READ_FRAMEBUFFER,[ft]),i.invalidateFramebuffer(i.DRAW_FRAMEBUFFER,[ft])),ct){let j=n.get(_[yt]).__webglTexture;i.framebufferTexture2D(i.DRAW_FRAMEBUFFER,i.COLOR_ATTACHMENT0,i.TEXTURE_2D,j,0)}i.blitFramebuffer(0,0,B,Q,0,0,B,Q,J,i.NEAREST),c&&i.invalidateFramebuffer(i.READ_FRAMEBUFFER,tt)}if(e.bindFramebuffer(i.READ_FRAMEBUFFER,null),e.bindFramebuffer(i.DRAW_FRAMEBUFFER,null),ct)for(let yt=0;yt<_.length;yt++){e.bindFramebuffer(i.FRAMEBUFFER,rt.__webglMultisampledFramebuffer),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0+yt,i.RENDERBUFFER,rt.__webglColorRenderbuffer[yt]);let Nt=n.get(_[yt]).__webglTexture;e.bindFramebuffer(i.FRAMEBUFFER,rt.__webglFramebuffer),i.framebufferTexture2D(i.DRAW_FRAMEBUFFER,i.COLOR_ATTACHMENT0+yt,i.TEXTURE_2D,Nt,0)}e.bindFramebuffer(i.DRAW_FRAMEBUFFER,rt.__webglMultisampledFramebuffer)}}function At(M){return Math.min(s.maxSamples,M.samples)}function ht(M){let _=n.get(M);return a&&M.samples>0&&t.has(\"WEBGL_multisampled_render_to_texture\")===!0&&_.__useRenderToTexture!==!1}function Xt(M){let _=o.render.frame;h.get(M)!==_&&(h.set(M,_),M.update())}function gt(M,_){let B=M.colorSpace,Q=M.format,J=M.type;return M.isCompressedTexture===!0||M.isVideoTexture===!0||M.format===Cr||B!==rn&&B!==De&&(Wt.getTransfer(B)===Jt?a===!1?t.has(\"EXT_sRGB\")===!0&&Q===Ve?(M.format=Cr,M.minFilter=Ue,M.generateMipmaps=!1):_=gs.sRGBToLinear(_):(Q!==Ve||J!==mn)&&console.warn(\"THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType.\"):console.error(\"THREE.WebGLTextures: Unsupported texture color space:\",B)),_}this.allocateTextureUnit=E,this.resetTextureUnits=T,this.setTexture2D=F,this.setTexture2DArray=I,this.setTexture3D=G,this.setTextureCube=X,this.rebindTextures=kt,this.setupRenderTarget=O,this.updateRenderTargetMipmap=le,this.updateMultisampleRenderTarget=_t,this.setupDepthRenderbuffer=vt,this.setupFrameBufferTexture=dt,this.useMultisampledRTT=ht}function ap(i,t,e){let n=e.isWebGL2;function s(r,o=De){let a,l=Wt.getTransfer(o);if(r===mn)return i.UNSIGNED_BYTE;if(r===Jo)return i.UNSIGNED_SHORT_4_4_4_4;if(r===$o)return i.UNSIGNED_SHORT_5_5_5_1;if(r===Ql)return i.BYTE;if(r===jl)return i.SHORT;if(r===ra)return i.UNSIGNED_SHORT;if(r===Zo)return i.INT;if(r===un)return i.UNSIGNED_INT;if(r===dn)return i.FLOAT;if(r===ke)return n?i.HALF_FLOAT:(a=t.get(\"OES_texture_half_float\"),a!==null?a.HALF_FLOAT_OES:null);if(r===tc)return i.ALPHA;if(r===Ve)return i.RGBA;if(r===ec)return i.LUMINANCE;if(r===nc)return i.LUMINANCE_ALPHA;if(r===Ln)return i.DEPTH_COMPONENT;if(r===oi)return i.DEPTH_STENCIL;if(r===Cr)return a=t.get(\"EXT_sRGB\"),a!==null?a.SRGB_ALPHA_EXT:null;if(r===ic)return i.RED;if(r===Ko)return i.RED_INTEGER;if(r===sc)return i.RG;if(r===Qo)return i.RG_INTEGER;if(r===jo)return i.RGBA_INTEGER;if(r===Xs||r===qs||r===Ys||r===Zs)if(l===Jt)if(a=t.get(\"WEBGL_compressed_texture_s3tc_srgb\"),a!==null){if(r===Xs)return a.COMPRESSED_SRGB_S3TC_DXT1_EXT;if(r===qs)return a.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;if(r===Ys)return a.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;if(r===Zs)return a.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT}else return null;else if(a=t.get(\"WEBGL_compressed_texture_s3tc\"),a!==null){if(r===Xs)return a.COMPRESSED_RGB_S3TC_DXT1_EXT;if(r===qs)return a.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(r===Ys)return a.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(r===Zs)return a.COMPRESSED_RGBA_S3TC_DXT5_EXT}else return null;if(r===ba||r===Ea||r===wa||r===Ta)if(a=t.get(\"WEBGL_compressed_texture_pvrtc\"),a!==null){if(r===ba)return a.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(r===Ea)return a.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(r===wa)return a.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(r===Ta)return a.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}else return null;if(r===tl)return a=t.get(\"WEBGL_compressed_texture_etc1\"),a!==null?a.COMPRESSED_RGB_ETC1_WEBGL:null;if(r===Aa||r===Ca)if(a=t.get(\"WEBGL_compressed_texture_etc\"),a!==null){if(r===Aa)return l===Jt?a.COMPRESSED_SRGB8_ETC2:a.COMPRESSED_RGB8_ETC2;if(r===Ca)return l===Jt?a.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:a.COMPRESSED_RGBA8_ETC2_EAC}else return null;if(r===Ra||r===Pa||r===La||r===Ia||r===Ua||r===Da||r===Na||r===Fa||r===Oa||r===Ba||r===za||r===Va||r===ka||r===Ha)if(a=t.get(\"WEBGL_compressed_texture_astc\"),a!==null){if(r===Ra)return l===Jt?a.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:a.COMPRESSED_RGBA_ASTC_4x4_KHR;if(r===Pa)return l===Jt?a.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:a.COMPRESSED_RGBA_ASTC_5x4_KHR;if(r===La)return l===Jt?a.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:a.COMPRESSED_RGBA_ASTC_5x5_KHR;if(r===Ia)return l===Jt?a.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:a.COMPRESSED_RGBA_ASTC_6x5_KHR;if(r===Ua)return l===Jt?a.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:a.COMPRESSED_RGBA_ASTC_6x6_KHR;if(r===Da)return l===Jt?a.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:a.COMPRESSED_RGBA_ASTC_8x5_KHR;if(r===Na)return l===Jt?a.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:a.COMPRESSED_RGBA_ASTC_8x6_KHR;if(r===Fa)return l===Jt?a.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:a.COMPRESSED_RGBA_ASTC_8x8_KHR;if(r===Oa)return l===Jt?a.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:a.COMPRESSED_RGBA_ASTC_10x5_KHR;if(r===Ba)return l===Jt?a.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:a.COMPRESSED_RGBA_ASTC_10x6_KHR;if(r===za)return l===Jt?a.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:a.COMPRESSED_RGBA_ASTC_10x8_KHR;if(r===Va)return l===Jt?a.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:a.COMPRESSED_RGBA_ASTC_10x10_KHR;if(r===ka)return l===Jt?a.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:a.COMPRESSED_RGBA_ASTC_12x10_KHR;if(r===Ha)return l===Jt?a.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:a.COMPRESSED_RGBA_ASTC_12x12_KHR}else return null;if(r===Js||r===Ga||r===Wa)if(a=t.get(\"EXT_texture_compression_bptc\"),a!==null){if(r===Js)return l===Jt?a.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT:a.COMPRESSED_RGBA_BPTC_UNORM_EXT;if(r===Ga)return a.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;if(r===Wa)return a.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT}else return null;if(r===rc||r===Xa||r===qa||r===Ya)if(a=t.get(\"EXT_texture_compression_rgtc\"),a!==null){if(r===Js)return a.COMPRESSED_RED_RGTC1_EXT;if(r===Xa)return a.COMPRESSED_SIGNED_RED_RGTC1_EXT;if(r===qa)return a.COMPRESSED_RED_GREEN_RGTC2_EXT;if(r===Ya)return a.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT}else return null;return r===Pn?n?i.UNSIGNED_INT_24_8:(a=t.get(\"WEBGL_depth_texture\"),a!==null?a.UNSIGNED_INT_24_8_WEBGL:null):i[r]!==void 0?i[r]:null}return{convert:s}}var Wr=class extends ve{constructor(t=[]){super(),this.isArrayCamera=!0,this.cameras=t}},fn=class extends Pe{constructor(){super(),this.isGroup=!0,this.type=\"Group\"}},op={type:\"move\"},bi=class{constructor(){this._targetRay=null,this._grip=null,this._hand=null}getHandSpace(){return this._hand===null&&(this._hand=new fn,this._hand.matrixAutoUpdate=!1,this._hand.visible=!1,this._hand.joints={},this._hand.inputState={pinching:!1}),this._hand}getTargetRaySpace(){return this._targetRay===null&&(this._targetRay=new fn,this._targetRay.matrixAutoUpdate=!1,this._targetRay.visible=!1,this._targetRay.hasLinearVelocity=!1,this._targetRay.linearVelocity=new N,this._targetRay.hasAngularVelocity=!1,this._targetRay.angularVelocity=new N),this._targetRay}getGripSpace(){return this._grip===null&&(this._grip=new fn,this._grip.matrixAutoUpdate=!1,this._grip.visible=!1,this._grip.hasLinearVelocity=!1,this._grip.linearVelocity=new N,this._grip.hasAngularVelocity=!1,this._grip.angularVelocity=new N),this._grip}dispatchEvent(t){return this._targetRay!==null&&this._targetRay.dispatchEvent(t),this._grip!==null&&this._grip.dispatchEvent(t),this._hand!==null&&this._hand.dispatchEvent(t),this}connect(t){if(t&&t.hand){let e=this._hand;if(e)for(let n of t.hand.values())this._getHandJoint(e,n)}return this.dispatchEvent({type:\"connected\",data:t}),this}disconnect(t){return this.dispatchEvent({type:\"disconnected\",data:t}),this._targetRay!==null&&(this._targetRay.visible=!1),this._grip!==null&&(this._grip.visible=!1),this._hand!==null&&(this._hand.visible=!1),this}update(t,e,n){let s=null,r=null,o=null,a=this._targetRay,l=this._grip,c=this._hand;if(t&&e.session.visibilityState!==\"visible-blurred\"){if(c&&t.hand){o=!0;for(let x of t.hand.values()){let p=e.getJointPose(x,n),u=this._getHandJoint(c,x);p!==null&&(u.matrix.fromArray(p.transform.matrix),u.matrix.decompose(u.position,u.rotation,u.scale),u.matrixWorldNeedsUpdate=!0,u.jointRadius=p.radius),u.visible=p!==null}let h=c.joints[\"index-finger-tip\"],d=c.joints[\"thumb-tip\"],f=h.position.distanceTo(d.position),m=.02,g=.005;c.inputState.pinching&&f>m+g?(c.inputState.pinching=!1,this.dispatchEvent({type:\"pinchend\",handedness:t.handedness,target:this})):!c.inputState.pinching&&f<=m-g&&(c.inputState.pinching=!0,this.dispatchEvent({type:\"pinchstart\",handedness:t.handedness,target:this}))}else l!==null&&t.gripSpace&&(r=e.getPose(t.gripSpace,n),r!==null&&(l.matrix.fromArray(r.transform.matrix),l.matrix.decompose(l.position,l.rotation,l.scale),l.matrixWorldNeedsUpdate=!0,r.linearVelocity?(l.hasLinearVelocity=!0,l.linearVelocity.copy(r.linearVelocity)):l.hasLinearVelocity=!1,r.angularVelocity?(l.hasAngularVelocity=!0,l.angularVelocity.copy(r.angularVelocity)):l.hasAngularVelocity=!1));a!==null&&(s=e.getPose(t.targetRaySpace,n),s===null&&r!==null&&(s=r),s!==null&&(a.matrix.fromArray(s.transform.matrix),a.matrix.decompose(a.position,a.rotation,a.scale),a.matrixWorldNeedsUpdate=!0,s.linearVelocity?(a.hasLinearVelocity=!0,a.linearVelocity.copy(s.linearVelocity)):a.hasLinearVelocity=!1,s.angularVelocity?(a.hasAngularVelocity=!0,a.angularVelocity.copy(s.angularVelocity)):a.hasAngularVelocity=!1,this.dispatchEvent(op)))}return a!==null&&(a.visible=s!==null),l!==null&&(l.visible=r!==null),c!==null&&(c.visible=o!==null),this}_getHandJoint(t,e){if(t.joints[e.jointName]===void 0){let n=new fn;n.matrixAutoUpdate=!1,n.visible=!1,t.joints[e.jointName]=n,t.add(n)}return t.joints[e.jointName]}},Xr=class extends xn{constructor(t,e){super();let n=this,s=null,r=1,o=null,a=\"local-floor\",l=1,c=null,h=null,d=null,f=null,m=null,g=null,x=e.getContextAttributes(),p=null,u=null,w=[],v=[],P=new Lt,U=null,R=new ve;R.layers.enable(1),R.viewport=new he;let C=new ve;C.layers.enable(2),C.viewport=new he;let Y=[R,C],S=new Wr;S.layers.enable(1),S.layers.enable(2);let b=null,H=null;this.cameraAutoUpdate=!0,this.enabled=!1,this.isPresenting=!1,this.getController=function(W){let q=w[W];return q===void 0&&(q=new bi,w[W]=q),q.getTargetRaySpace()},this.getControllerGrip=function(W){let q=w[W];return q===void 0&&(q=new bi,w[W]=q),q.getGripSpace()},this.getHand=function(W){let q=w[W];return q===void 0&&(q=new bi,w[W]=q),q.getHandSpace()};function K(W){let q=v.indexOf(W.inputSource);if(q===-1)return;let st=w[q];st!==void 0&&(st.update(W.inputSource,W.frame,c||o),st.dispatchEvent({type:W.type,data:W.inputSource}))}function T(){s.removeEventListener(\"select\",K),s.removeEventListener(\"selectstart\",K),s.removeEventListener(\"selectend\",K),s.removeEventListener(\"squeeze\",K),s.removeEventListener(\"squeezestart\",K),s.removeEventListener(\"squeezeend\",K),s.removeEventListener(\"end\",T),s.removeEventListener(\"inputsourceschange\",E);for(let W=0;W<w.length;W++){let q=v[W];q!==null&&(v[W]=null,w[W].disconnect(q))}b=null,H=null,t.setRenderTarget(p),m=null,f=null,d=null,s=null,u=null,et.stop(),n.isPresenting=!1,t.setPixelRatio(U),t.setSize(P.width,P.height,!1),n.dispatchEvent({type:\"sessionend\"})}this.setFramebufferScaleFactor=function(W){r=W,n.isPresenting===!0&&console.warn(\"THREE.WebXRManager: Cannot change framebuffer scale while presenting.\")},this.setReferenceSpaceType=function(W){a=W,n.isPresenting===!0&&console.warn(\"THREE.WebXRManager: Cannot change reference space type while presenting.\")},this.getReferenceSpace=function(){return c||o},this.setReferenceSpace=function(W){c=W},this.getBaseLayer=function(){return f!==null?f:m},this.getBinding=function(){return d},this.getFrame=function(){return g},this.getSession=function(){return s},this.setSession=async function(W){if(s=W,s!==null){if(p=t.getRenderTarget(),s.addEventListener(\"select\",K),s.addEventListener(\"selectstart\",K),s.addEventListener(\"selectend\",K),s.addEventListener(\"squeeze\",K),s.addEventListener(\"squeezestart\",K),s.addEventListener(\"squeezeend\",K),s.addEventListener(\"end\",T),s.addEventListener(\"inputsourceschange\",E),x.xrCompatible!==!0&&await e.makeXRCompatible(),U=t.getPixelRatio(),t.getSize(P),s.renderState.layers===void 0||t.capabilities.isWebGL2===!1){let q={antialias:s.renderState.layers===void 0?x.antialias:!0,alpha:!0,depth:x.depth,stencil:x.stencil,framebufferScaleFactor:r};m=new XRWebGLLayer(s,e,q),s.updateRenderState({baseLayer:m}),t.setPixelRatio(1),t.setSize(m.framebufferWidth,m.framebufferHeight,!1),u=new Me(m.framebufferWidth,m.framebufferHeight,{format:Ve,type:mn,colorSpace:t.outputColorSpace,stencilBuffer:x.stencil})}else{let q=null,st=null,pt=null;x.depth&&(pt=x.stencil?e.DEPTH24_STENCIL8:e.DEPTH_COMPONENT24,q=x.stencil?oi:Ln,st=x.stencil?Pn:un);let dt={colorFormat:e.RGBA8,depthFormat:pt,scaleFactor:r};d=new XRWebGLBinding(s,e),f=d.createProjectionLayer(dt),s.updateRenderState({layers:[f]}),t.setPixelRatio(1),t.setSize(f.textureWidth,f.textureHeight,!1),u=new Me(f.textureWidth,f.textureHeight,{format:Ve,type:mn,depthTexture:new As(f.textureWidth,f.textureHeight,st,void 0,void 0,void 0,void 0,void 0,void 0,q),stencilBuffer:x.stencil,colorSpace:t.outputColorSpace,samples:x.antialias?4:0});let bt=t.properties.get(u);bt.__ignoreDepthValues=f.ignoreDepthValues}u.isXRRenderTarget=!0,this.setFoveation(l),c=null,o=await s.requestReferenceSpace(a),et.setContext(s),et.start(),n.isPresenting=!0,n.dispatchEvent({type:\"sessionstart\"})}},this.getEnvironmentBlendMode=function(){if(s!==null)return s.environmentBlendMode};function E(W){for(let q=0;q<W.removed.length;q++){let st=W.removed[q],pt=v.indexOf(st);pt>=0&&(v[pt]=null,w[pt].disconnect(st))}for(let q=0;q<W.added.length;q++){let st=W.added[q],pt=v.indexOf(st);if(pt===-1){for(let bt=0;bt<w.length;bt++)if(bt>=v.length){v.push(st),pt=bt;break}else if(v[bt]===null){v[bt]=st,pt=bt;break}if(pt===-1)break}let dt=w[pt];dt&&dt.connect(st)}}let L=new N,F=new N;function I(W,q,st){L.setFromMatrixPosition(q.matrixWorld),F.setFromMatrixPosition(st.matrixWorld);let pt=L.distanceTo(F),dt=q.projectionMatrix.elements,bt=st.projectionMatrix.elements,Et=dt[14]/(dt[10]-1),vt=dt[14]/(dt[10]+1),kt=(dt[9]+1)/dt[5],O=(dt[9]-1)/dt[5],le=(dt[8]-1)/dt[0],_t=(bt[8]+1)/bt[0],At=Et*le,ht=Et*_t,Xt=pt/(-le+_t),gt=Xt*-le;q.matrixWorld.decompose(W.position,W.quaternion,W.scale),W.translateX(gt),W.translateZ(Xt),W.matrixWorld.compose(W.position,W.quaternion,W.scale),W.matrixWorldInverse.copy(W.matrixWorld).invert();let M=Et+Xt,_=vt+Xt,B=At-gt,Q=ht+(pt-gt),J=kt*vt/_*M,tt=O*vt/_*M;W.projectionMatrix.makePerspective(B,Q,J,tt,M,_),W.projectionMatrixInverse.copy(W.projectionMatrix).invert()}function G(W,q){q===null?W.matrixWorld.copy(W.matrix):W.matrixWorld.multiplyMatrices(q.matrixWorld,W.matrix),W.matrixWorldInverse.copy(W.matrixWorld).invert()}this.updateCamera=function(W){if(s===null)return;S.near=C.near=R.near=W.near,S.far=C.far=R.far=W.far,(b!==S.near||H!==S.far)&&(s.updateRenderState({depthNear:S.near,depthFar:S.far}),b=S.near,H=S.far);let q=W.parent,st=S.cameras;G(S,q);for(let pt=0;pt<st.length;pt++)G(st[pt],q);st.length===2?I(S,R,C):S.projectionMatrix.copy(R.projectionMatrix),X(W,S,q)};function X(W,q,st){st===null?W.matrix.copy(q.matrixWorld):(W.matrix.copy(st.matrixWorld),W.matrix.invert(),W.matrix.multiply(q.matrixWorld)),W.matrix.decompose(W.position,W.quaternion,W.scale),W.updateMatrixWorld(!0),W.projectionMatrix.copy(q.projectionMatrix),W.projectionMatrixInverse.copy(q.projectionMatrixInverse),W.isPerspectiveCamera&&(W.fov=Rr*2*Math.atan(1/W.projectionMatrix.elements[5]),W.zoom=1)}this.getCamera=function(){return S},this.getFoveation=function(){if(!(f===null&&m===null))return l},this.setFoveation=function(W){l=W,f!==null&&(f.fixedFoveation=W),m!==null&&m.fixedFoveation!==void 0&&(m.fixedFoveation=W)};let Z=null;function $(W,q){if(h=q.getViewerPose(c||o),g=q,h!==null){let st=h.views;m!==null&&(t.setRenderTargetFramebuffer(u,m.framebuffer),t.setRenderTarget(u));let pt=!1;st.length!==S.cameras.length&&(S.cameras.length=0,pt=!0);for(let dt=0;dt<st.length;dt++){let bt=st[dt],Et=null;if(m!==null)Et=m.getViewport(bt);else{let kt=d.getViewSubImage(f,bt);Et=kt.viewport,dt===0&&(t.setRenderTargetTextures(u,kt.colorTexture,f.ignoreDepthValues?void 0:kt.depthStencilTexture),t.setRenderTarget(u))}let vt=Y[dt];vt===void 0&&(vt=new ve,vt.layers.enable(dt),vt.viewport=new he,Y[dt]=vt),vt.matrix.fromArray(bt.transform.matrix),vt.matrix.decompose(vt.position,vt.quaternion,vt.scale),vt.projectionMatrix.fromArray(bt.projectionMatrix),vt.projectionMatrixInverse.copy(vt.projectionMatrix).invert(),vt.viewport.set(Et.x,Et.y,Et.width,Et.height),dt===0&&(S.matrix.copy(vt.matrix),S.matrix.decompose(S.position,S.quaternion,S.scale)),pt===!0&&S.cameras.push(vt)}}for(let st=0;st<w.length;st++){let pt=v[st],dt=w[st];pt!==null&&dt!==void 0&&dt.update(pt,q,c||o)}Z&&Z(W,q),q.detectedPlanes&&n.dispatchEvent({type:\"planesdetected\",data:q}),g=null}let et=new al;et.setAnimationLoop($),this.setAnimationLoop=function(W){Z=W},this.dispose=function(){}}};function lp(i,t){function e(p,u){p.matrixAutoUpdate===!0&&p.updateMatrix(),u.value.copy(p.matrix)}function n(p,u){u.color.getRGB(p.fogColor.value,rl(i)),u.isFog?(p.fogNear.value=u.near,p.fogFar.value=u.far):u.isFogExp2&&(p.fogDensity.value=u.density)}function s(p,u,w,v,P){u.isMeshBasicMaterial||u.isMeshLambertMaterial?r(p,u):u.isMeshToonMaterial?(r(p,u),d(p,u)):u.isMeshPhongMaterial?(r(p,u),h(p,u)):u.isMeshStandardMaterial?(r(p,u),f(p,u),u.isMeshPhysicalMaterial&&m(p,u,P)):u.isMeshMatcapMaterial?(r(p,u),g(p,u)):u.isMeshDepthMaterial?r(p,u):u.isMeshDistanceMaterial?(r(p,u),x(p,u)):u.isMeshNormalMaterial?r(p,u):u.isLineBasicMaterial?(o(p,u),u.isLineDashedMaterial&&a(p,u)):u.isPointsMaterial?l(p,u,w,v):u.isSpriteMaterial?c(p,u):u.isShadowMaterial?(p.color.value.copy(u.color),p.opacity.value=u.opacity):u.isShaderMaterial&&(u.uniformsNeedUpdate=!1)}function r(p,u){p.opacity.value=u.opacity,u.color&&p.diffuse.value.copy(u.color),u.emissive&&p.emissive.value.copy(u.emissive).multiplyScalar(u.emissiveIntensity),u.map&&(p.map.value=u.map,e(u.map,p.mapTransform)),u.alphaMap&&(p.alphaMap.value=u.alphaMap,e(u.alphaMap,p.alphaMapTransform)),u.bumpMap&&(p.bumpMap.value=u.bumpMap,e(u.bumpMap,p.bumpMapTransform),p.bumpScale.value=u.bumpScale,u.side===we&&(p.bumpScale.value*=-1)),u.normalMap&&(p.normalMap.value=u.normalMap,e(u.normalMap,p.normalMapTransform),p.normalScale.value.copy(u.normalScale),u.side===we&&p.normalScale.value.negate()),u.displacementMap&&(p.displacementMap.value=u.displacementMap,e(u.displacementMap,p.displacementMapTransform),p.displacementScale.value=u.displacementScale,p.displacementBias.value=u.displacementBias),u.emissiveMap&&(p.emissiveMap.value=u.emissiveMap,e(u.emissiveMap,p.emissiveMapTransform)),u.specularMap&&(p.specularMap.value=u.specularMap,e(u.specularMap,p.specularMapTransform)),u.alphaTest>0&&(p.alphaTest.value=u.alphaTest);let w=t.get(u).envMap;if(w&&(p.envMap.value=w,p.flipEnvMap.value=w.isCubeTexture&&w.isRenderTargetTexture===!1?-1:1,p.reflectivity.value=u.reflectivity,p.ior.value=u.ior,p.refractionRatio.value=u.refractionRatio),u.lightMap){p.lightMap.value=u.lightMap;let v=i._useLegacyLights===!0?Math.PI:1;p.lightMapIntensity.value=u.lightMapIntensity*v,e(u.lightMap,p.lightMapTransform)}u.aoMap&&(p.aoMap.value=u.aoMap,p.aoMapIntensity.value=u.aoMapIntensity,e(u.aoMap,p.aoMapTransform))}function o(p,u){p.diffuse.value.copy(u.color),p.opacity.value=u.opacity,u.map&&(p.map.value=u.map,e(u.map,p.mapTransform))}function a(p,u){p.dashSize.value=u.dashSize,p.totalSize.value=u.dashSize+u.gapSize,p.scale.value=u.scale}function l(p,u,w,v){p.diffuse.value.copy(u.color),p.opacity.value=u.opacity,p.size.value=u.size*w,p.scale.value=v*.5,u.map&&(p.map.value=u.map,e(u.map,p.uvTransform)),u.alphaMap&&(p.alphaMap.value=u.alphaMap,e(u.alphaMap,p.alphaMapTransform)),u.alphaTest>0&&(p.alphaTest.value=u.alphaTest)}function c(p,u){p.diffuse.value.copy(u.color),p.opacity.value=u.opacity,p.rotation.value=u.rotation,u.map&&(p.map.value=u.map,e(u.map,p.mapTransform)),u.alphaMap&&(p.alphaMap.value=u.alphaMap,e(u.alphaMap,p.alphaMapTransform)),u.alphaTest>0&&(p.alphaTest.value=u.alphaTest)}function h(p,u){p.specular.value.copy(u.specular),p.shininess.value=Math.max(u.shininess,1e-4)}function d(p,u){u.gradientMap&&(p.gradientMap.value=u.gradientMap)}function f(p,u){p.metalness.value=u.metalness,u.metalnessMap&&(p.metalnessMap.value=u.metalnessMap,e(u.metalnessMap,p.metalnessMapTransform)),p.roughness.value=u.roughness,u.roughnessMap&&(p.roughnessMap.value=u.roughnessMap,e(u.roughnessMap,p.roughnessMapTransform)),t.get(u).envMap&&(p.envMapIntensity.value=u.envMapIntensity)}function m(p,u,w){p.ior.value=u.ior,u.sheen>0&&(p.sheenColor.value.copy(u.sheenColor).multiplyScalar(u.sheen),p.sheenRoughness.value=u.sheenRoughness,u.sheenColorMap&&(p.sheenColorMap.value=u.sheenColorMap,e(u.sheenColorMap,p.sheenColorMapTransform)),u.sheenRoughnessMap&&(p.sheenRoughnessMap.value=u.sheenRoughnessMap,e(u.sheenRoughnessMap,p.sheenRoughnessMapTransform))),u.clearcoat>0&&(p.clearcoat.value=u.clearcoat,p.clearcoatRoughness.value=u.clearcoatRoughness,u.clearcoatMap&&(p.clearcoatMap.value=u.clearcoatMap,e(u.clearcoatMap,p.clearcoatMapTransform)),u.clearcoatRoughnessMap&&(p.clearcoatRoughnessMap.value=u.clearcoatRoughnessMap,e(u.clearcoatRoughnessMap,p.clearcoatRoughnessMapTransform)),u.clearcoatNormalMap&&(p.clearcoatNormalMap.value=u.clearcoatNormalMap,e(u.clearcoatNormalMap,p.clearcoatNormalMapTransform),p.clearcoatNormalScale.value.copy(u.clearcoatNormalScale),u.side===we&&p.clearcoatNormalScale.value.negate())),u.iridescence>0&&(p.iridescence.value=u.iridescence,p.iridescenceIOR.value=u.iridescenceIOR,p.iridescenceThicknessMinimum.value=u.iridescenceThicknessRange[0],p.iridescenceThicknessMaximum.value=u.iridescenceThicknessRange[1],u.iridescenceMap&&(p.iridescenceMap.value=u.iridescenceMap,e(u.iridescenceMap,p.iridescenceMapTransform)),u.iridescenceThicknessMap&&(p.iridescenceThicknessMap.value=u.iridescenceThicknessMap,e(u.iridescenceThicknessMap,p.iridescenceThicknessMapTransform))),u.transmission>0&&(p.transmission.value=u.transmission,p.transmissionSamplerMap.value=w.texture,p.transmissionSamplerSize.value.set(w.width,w.height),u.transmissionMap&&(p.transmissionMap.value=u.transmissionMap,e(u.transmissionMap,p.transmissionMapTransform)),p.thickness.value=u.thickness,u.thicknessMap&&(p.thicknessMap.value=u.thicknessMap,e(u.thicknessMap,p.thicknessMapTransform)),p.attenuationDistance.value=u.attenuationDistance,p.attenuationColor.value.copy(u.attenuationColor)),u.anisotropy>0&&(p.anisotropyVector.value.set(u.anisotropy*Math.cos(u.anisotropyRotation),u.anisotropy*Math.sin(u.anisotropyRotation)),u.anisotropyMap&&(p.anisotropyMap.value=u.anisotropyMap,e(u.anisotropyMap,p.anisotropyMapTransform))),p.specularIntensity.value=u.specularIntensity,p.specularColor.value.copy(u.specularColor),u.specularColorMap&&(p.specularColorMap.value=u.specularColorMap,e(u.specularColorMap,p.specularColorMapTransform)),u.specularIntensityMap&&(p.specularIntensityMap.value=u.specularIntensityMap,e(u.specularIntensityMap,p.specularIntensityMapTransform))}function g(p,u){u.matcap&&(p.matcap.value=u.matcap)}function x(p,u){let w=t.get(u).light;p.referencePosition.value.setFromMatrixPosition(w.matrixWorld),p.nearDistance.value=w.shadow.camera.near,p.farDistance.value=w.shadow.camera.far}return{refreshFogUniforms:n,refreshMaterialUniforms:s}}function cp(i,t,e,n){let s={},r={},o=[],a=e.isWebGL2?i.getParameter(i.MAX_UNIFORM_BUFFER_BINDINGS):0;function l(w,v){let P=v.program;n.uniformBlockBinding(w,P)}function c(w,v){let P=s[w.id];P===void 0&&(g(w),P=h(w),s[w.id]=P,w.addEventListener(\"dispose\",p));let U=v.program;n.updateUBOMapping(w,U);let R=t.render.frame;r[w.id]!==R&&(f(w),r[w.id]=R)}function h(w){let v=d();w.__bindingPointIndex=v;let P=i.createBuffer(),U=w.__size,R=w.usage;return i.bindBuffer(i.UNIFORM_BUFFER,P),i.bufferData(i.UNIFORM_BUFFER,U,R),i.bindBuffer(i.UNIFORM_BUFFER,null),i.bindBufferBase(i.UNIFORM_BUFFER,v,P),P}function d(){for(let w=0;w<a;w++)if(o.indexOf(w)===-1)return o.push(w),w;return console.error(\"THREE.WebGLRenderer: Maximum number of simultaneously usable uniforms groups reached.\"),0}function f(w){let v=s[w.id],P=w.uniforms,U=w.__cache;i.bindBuffer(i.UNIFORM_BUFFER,v);for(let R=0,C=P.length;R<C;R++){let Y=Array.isArray(P[R])?P[R]:[P[R]];for(let S=0,b=Y.length;S<b;S++){let H=Y[S];if(m(H,R,S,U)===!0){let K=H.__offset,T=Array.isArray(H.value)?H.value:[H.value],E=0;for(let L=0;L<T.length;L++){let F=T[L],I=x(F);typeof F==\"number\"||typeof F==\"boolean\"?(H.__data[0]=F,i.bufferSubData(i.UNIFORM_BUFFER,K+E,H.__data)):F.isMatrix3?(H.__data[0]=F.elements[0],H.__data[1]=F.elements[1],H.__data[2]=F.elements[2],H.__data[3]=0,H.__data[4]=F.elements[3],H.__data[5]=F.elements[4],H.__data[6]=F.elements[5],H.__data[7]=0,H.__data[8]=F.elements[6],H.__data[9]=F.elements[7],H.__data[10]=F.elements[8],H.__data[11]=0):(F.toArray(H.__data,E),E+=I.storage/Float32Array.BYTES_PER_ELEMENT)}i.bufferSubData(i.UNIFORM_BUFFER,K,H.__data)}}}i.bindBuffer(i.UNIFORM_BUFFER,null)}function m(w,v,P,U){let R=w.value,C=v+\"_\"+P;if(U[C]===void 0)return typeof R==\"number\"||typeof R==\"boolean\"?U[C]=R:U[C]=R.clone(),!0;{let Y=U[C];if(typeof R==\"number\"||typeof R==\"boolean\"){if(Y!==R)return U[C]=R,!0}else if(Y.equals(R)===!1)return Y.copy(R),!0}return!1}function g(w){let v=w.uniforms,P=0,U=16;for(let C=0,Y=v.length;C<Y;C++){let S=Array.isArray(v[C])?v[C]:[v[C]];for(let b=0,H=S.length;b<H;b++){let K=S[b],T=Array.isArray(K.value)?K.value:[K.value];for(let E=0,L=T.length;E<L;E++){let F=T[E],I=x(F),G=P%U;G!==0&&U-G<I.boundary&&(P+=U-G),K.__data=new Float32Array(I.storage/Float32Array.BYTES_PER_ELEMENT),K.__offset=P,P+=I.storage}}}let R=P%U;return R>0&&(P+=U-R),w.__size=P,w.__cache={},this}function x(w){let v={boundary:0,storage:0};return typeof w==\"number\"||typeof w==\"boolean\"?(v.boundary=4,v.storage=4):w.isVector2?(v.boundary=8,v.storage=8):w.isVector3||w.isColor?(v.boundary=16,v.storage=12):w.isVector4?(v.boundary=16,v.storage=16):w.isMatrix3?(v.boundary=48,v.storage=48):w.isMatrix4?(v.boundary=64,v.storage=64):w.isTexture?console.warn(\"THREE.WebGLRenderer: Texture samplers can not be part of an uniforms group.\"):console.warn(\"THREE.WebGLRenderer: Unsupported uniform value type.\",w),v}function p(w){let v=w.target;v.removeEventListener(\"dispose\",p);let P=o.indexOf(v.__bindingPointIndex);o.splice(P,1),i.deleteBuffer(s[v.id]),delete s[v.id],delete r[v.id]}function u(){for(let w in s)i.deleteBuffer(s[w]);o=[],s={},r={}}return{bind:l,update:c,dispose:u}}var Ci=class{constructor(t={}){let{canvas:e=xc(),context:n=null,depth:s=!0,stencil:r=!0,alpha:o=!1,antialias:a=!1,premultipliedAlpha:l=!0,preserveDrawingBuffer:c=!1,powerPreference:h=\"default\",failIfMajorPerformanceCaveat:d=!1}=t;this.isWebGLRenderer=!0;let f;n!==null?f=n.getContextAttributes().alpha:f=o;let m=new Uint32Array(4),g=new Int32Array(4),x=null,p=null,u=[],w=[];this.domElement=e,this.debug={checkShaderErrors:!0,onShaderError:null},this.autoClear=!0,this.autoClearColor=!0,this.autoClearDepth=!0,this.autoClearStencil=!0,this.sortObjects=!0,this.clippingPlanes=[],this.localClippingEnabled=!1,this._outputColorSpace=ce,this._useLegacyLights=!1,this.toneMapping=pn,this.toneMappingExposure=1;let v=this,P=!1,U=0,R=0,C=null,Y=-1,S=null,b=new he,H=new he,K=null,T=new Pt(0),E=0,L=e.width,F=e.height,I=1,G=null,X=null,Z=new he(0,0,L,F),$=new he(0,0,L,F),et=!1,W=new ws,q=!1,st=!1,pt=null,dt=new oe,bt=new Lt,Et=new N,vt={background:null,fog:null,environment:null,overrideMaterial:null,isScene:!0};function kt(){return C===null?I:1}let O=n;function le(y,D){for(let V=0;V<y.length;V++){let k=y[V],z=e.getContext(k,D);if(z!==null)return z}return null}try{let y={alpha:!0,depth:s,stencil:r,antialias:a,premultipliedAlpha:l,preserveDrawingBuffer:c,powerPreference:h,failIfMajorPerformanceCaveat:d};if(\"setAttribute\"in e&&e.setAttribute(\"data-engine\",\"three.js r160\"),e.addEventListener(\"webglcontextlost\",nt,!1),e.addEventListener(\"webglcontextrestored\",A,!1),e.addEventListener(\"webglcontextcreationerror\",at,!1),O===null){let D=[\"webgl2\",\"webgl\",\"experimental-webgl\"];if(v.isWebGL1Renderer===!0&&D.shift(),O=le(D,y),O===null)throw le(D)?new Error(\"Error creating WebGL context with your selected attributes.\"):new Error(\"Error creating WebGL context.\")}typeof WebGLRenderingContext<\"u\"&&O instanceof WebGLRenderingContext&&console.warn(\"THREE.WebGLRenderer: WebGL 1 support was deprecated in r153 and will be removed in r163.\"),O.getShaderPrecisionFormat===void 0&&(O.getShaderPrecisionFormat=function(){return{rangeMin:1,rangeMax:1,precision:1}})}catch(y){throw console.error(\"THREE.WebGLRenderer: \"+y.message),y}let _t,At,ht,Xt,gt,M,_,B,Q,J,tt,ft,rt,ct,yt,Nt,j,Gt,Vt,Ct,xt,ut,Ut,Ht;function Qt(){_t=new Ad(O),At=new Md(O,_t,t),_t.init(At),ut=new ap(O,_t,At),ht=new sp(O,_t,At),Xt=new Pd(O),gt=new qf,M=new rp(O,_t,ht,gt,At,ut,Xt),_=new bd(v),B=new Td(v),Q=new Bc(O,At),Ut=new vd(O,_t,Q,At),J=new Cd(O,Q,Xt,Ut),tt=new Dd(O,J,Q,Xt),Vt=new Ud(O,At,M),Nt=new Sd(gt),ft=new Xf(v,_,B,_t,At,Ut,Nt),rt=new lp(v,gt),ct=new Zf,yt=new tp(_t,At),Gt=new xd(v,_,B,ht,tt,f,l),j=new ip(v,tt,At),Ht=new cp(O,Xt,At,ht),Ct=new yd(O,_t,Xt,At),xt=new Rd(O,_t,Xt,At),Xt.programs=ft.programs,v.capabilities=At,v.extensions=_t,v.properties=gt,v.renderLists=ct,v.shadowMap=j,v.state=ht,v.info=Xt}Qt();let Ot=new Xr(v,O);this.xr=Ot,this.getContext=function(){return O},this.getContextAttributes=function(){return O.getContextAttributes()},this.forceContextLoss=function(){let y=_t.get(\"WEBGL_lose_context\");y&&y.loseContext()},this.forceContextRestore=function(){let y=_t.get(\"WEBGL_lose_context\");y&&y.restoreContext()},this.getPixelRatio=function(){return I},this.setPixelRatio=function(y){y!==void 0&&(I=y,this.setSize(L,F,!1))},this.getSize=function(y){return y.set(L,F)},this.setSize=function(y,D,V=!0){if(Ot.isPresenting){console.warn(\"THREE.WebGLRenderer: Can't change size while VR device is presenting.\");return}L=y,F=D,e.width=Math.floor(y*I),e.height=Math.floor(D*I),V===!0&&(e.style.width=y+\"px\",e.style.height=D+\"px\"),this.setViewport(0,0,y,D)},this.getDrawingBufferSize=function(y){return y.set(L*I,F*I).floor()},this.setDrawingBufferSize=function(y,D,V){L=y,F=D,I=V,e.width=Math.floor(y*V),e.height=Math.floor(D*V),this.setViewport(0,0,y,D)},this.getCurrentViewport=function(y){return y.copy(b)},this.getViewport=function(y){return y.copy(Z)},this.setViewport=function(y,D,V,k){y.isVector4?Z.set(y.x,y.y,y.z,y.w):Z.set(y,D,V,k),ht.viewport(b.copy(Z).multiplyScalar(I).floor())},this.getScissor=function(y){return y.copy($)},this.setScissor=function(y,D,V,k){y.isVector4?$.set(y.x,y.y,y.z,y.w):$.set(y,D,V,k),ht.scissor(H.copy($).multiplyScalar(I).floor())},this.getScissorTest=function(){return et},this.setScissorTest=function(y){ht.setScissorTest(et=y)},this.setOpaqueSort=function(y){G=y},this.setTransparentSort=function(y){X=y},this.getClearColor=function(y){return y.copy(Gt.getClearColor())},this.setClearColor=function(){Gt.setClearColor.apply(Gt,arguments)},this.getClearAlpha=function(){return Gt.getClearAlpha()},this.setClearAlpha=function(){Gt.setClearAlpha.apply(Gt,arguments)},this.clear=function(y=!0,D=!0,V=!0){let k=0;if(y){let z=!1;if(C!==null){let lt=C.texture.format;z=lt===jo||lt===Qo||lt===Ko}if(z){let lt=C.texture.type,mt=lt===mn||lt===un||lt===ra||lt===Pn||lt===Jo||lt===$o,St=Gt.getClearColor(),Tt=Gt.getClearAlpha(),Ft=St.r,Rt=St.g,It=St.b;mt?(m[0]=Ft,m[1]=Rt,m[2]=It,m[3]=Tt,O.clearBufferuiv(O.COLOR,0,m)):(g[0]=Ft,g[1]=Rt,g[2]=It,g[3]=Tt,O.clearBufferiv(O.COLOR,0,g))}else k|=O.COLOR_BUFFER_BIT}D&&(k|=O.DEPTH_BUFFER_BIT),V&&(k|=O.STENCIL_BUFFER_BIT,this.state.buffers.stencil.setMask(4294967295)),O.clear(k)},this.clearColor=function(){this.clear(!0,!1,!1)},this.clearDepth=function(){this.clear(!1,!0,!1)},this.clearStencil=function(){this.clear(!1,!1,!0)},this.dispose=function(){e.removeEventListener(\"webglcontextlost\",nt,!1),e.removeEventListener(\"webglcontextrestored\",A,!1),e.removeEventListener(\"webglcontextcreationerror\",at,!1),ct.dispose(),yt.dispose(),gt.dispose(),_.dispose(),B.dispose(),tt.dispose(),Ut.dispose(),Ht.dispose(),ft.dispose(),Ot.dispose(),Ot.removeEventListener(\"sessionstart\",me),Ot.removeEventListener(\"sessionend\",Zt),pt&&(pt.dispose(),pt=null),ge.stop()};function nt(y){y.preventDefault(),console.log(\"THREE.WebGLRenderer: Context Lost.\"),P=!0}function A(){console.log(\"THREE.WebGLRenderer: Context Restored.\"),P=!1;let y=Xt.autoReset,D=j.enabled,V=j.autoUpdate,k=j.needsUpdate,z=j.type;Qt(),Xt.autoReset=y,j.enabled=D,j.autoUpdate=V,j.needsUpdate=k,j.type=z}function at(y){console.error(\"THREE.WebGLRenderer: A WebGL context could not be created. Reason: \",y.statusMessage)}function ot(y){let D=y.target;D.removeEventListener(\"dispose\",ot),wt(D)}function wt(y){Mt(y),gt.remove(y)}function Mt(y){let D=gt.get(y).programs;D!==void 0&&(D.forEach(function(V){ft.releaseProgram(V)}),y.isShaderMaterial&&ft.releaseShaderCache(y))}this.renderBufferDirect=function(y,D,V,k,z,lt){D===null&&(D=vt);let mt=z.isMesh&&z.matrixWorld.determinant()<0,St=pl(y,D,V,k,z);ht.setMaterial(k,mt);let Tt=V.index,Ft=1;if(k.wireframe===!0){if(Tt=J.getWireframeAttribute(V),Tt===void 0)return;Ft=2}let Rt=V.drawRange,It=V.attributes.position,te=Rt.start*Ft,Te=(Rt.start+Rt.count)*Ft;lt!==null&&(te=Math.max(te,lt.start*Ft),Te=Math.min(Te,(lt.start+lt.count)*Ft)),Tt!==null?(te=Math.max(te,0),Te=Math.min(Te,Tt.count)):It!=null&&(te=Math.max(te,0),Te=Math.min(Te,It.count));let re=Te-te;if(re<0||re===1/0)return;Ut.setup(z,k,St,V,Tt);let Ze,Kt=Ct;if(Tt!==null&&(Ze=Q.get(Tt),Kt=xt,Kt.setIndex(Ze)),z.isMesh)k.wireframe===!0?(ht.setLineWidth(k.wireframeLinewidth*kt()),Kt.setMode(O.LINES)):Kt.setMode(O.TRIANGLES);else if(z.isLine){let Bt=k.linewidth;Bt===void 0&&(Bt=1),ht.setLineWidth(Bt*kt()),z.isLineSegments?Kt.setMode(O.LINES):z.isLineLoop?Kt.setMode(O.LINE_LOOP):Kt.setMode(O.LINE_STRIP)}else z.isPoints?Kt.setMode(O.POINTS):z.isSprite&&Kt.setMode(O.TRIANGLES);if(z.isBatchedMesh)Kt.renderMultiDraw(z._multiDrawStarts,z._multiDrawCounts,z._multiDrawCount);else if(z.isInstancedMesh)Kt.renderInstances(te,re,z.count);else if(V.isInstancedBufferGeometry){let Bt=V._maxInstanceCount!==void 0?V._maxInstanceCount:1/0,Vs=Math.min(V.instanceCount,Bt);Kt.renderInstances(te,re,Vs)}else Kt.render(te,re)};function qt(y,D,V){y.transparent===!0&&y.side===nn&&y.forceSinglePass===!1?(y.side=we,y.needsUpdate=!0,Ni(y,D,V),y.side=gn,y.needsUpdate=!0,Ni(y,D,V),y.side=nn):Ni(y,D,V)}this.compile=function(y,D,V=null){V===null&&(V=y),p=yt.get(V),p.init(),w.push(p),V.traverseVisible(function(z){z.isLight&&z.layers.test(D.layers)&&(p.pushLight(z),z.castShadow&&p.pushShadow(z))}),y!==V&&y.traverseVisible(function(z){z.isLight&&z.layers.test(D.layers)&&(p.pushLight(z),z.castShadow&&p.pushShadow(z))}),p.setupLights(v._useLegacyLights);let k=new Set;return y.traverse(function(z){let lt=z.material;if(lt)if(Array.isArray(lt))for(let mt=0;mt<lt.length;mt++){let St=lt[mt];qt(St,V,z),k.add(St)}else qt(lt,V,z),k.add(lt)}),w.pop(),p=null,k},this.compileAsync=function(y,D,V=null){let k=this.compile(y,D,V);return new Promise(z=>{function lt(){if(k.forEach(function(mt){gt.get(mt).currentProgram.isReady()&&k.delete(mt)}),k.size===0){z(y);return}setTimeout(lt,10)}_t.get(\"KHR_parallel_shader_compile\")!==null?lt():setTimeout(lt,10)})};let Yt=null;function se(y){Yt&&Yt(y)}function me(){ge.stop()}function Zt(){ge.start()}let ge=new al;ge.setAnimationLoop(se),typeof self<\"u\"&&ge.setContext(self),this.setAnimationLoop=function(y){Yt=y,Ot.setAnimationLoop(y),y===null?ge.stop():ge.start()},Ot.addEventListener(\"sessionstart\",me),Ot.addEventListener(\"sessionend\",Zt),this.render=function(y,D){if(D!==void 0&&D.isCamera!==!0){console.error(\"THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.\");return}if(P===!0)return;y.matrixWorldAutoUpdate===!0&&y.updateMatrixWorld(),D.parent===null&&D.matrixWorldAutoUpdate===!0&&D.updateMatrixWorld(),Ot.enabled===!0&&Ot.isPresenting===!0&&(Ot.cameraAutoUpdate===!0&&Ot.updateCamera(D),D=Ot.getCamera()),y.isScene===!0&&y.onBeforeRender(v,y,D,C),p=yt.get(y,w.length),p.init(),w.push(p),dt.multiplyMatrices(D.projectionMatrix,D.matrixWorldInverse),W.setFromProjectionMatrix(dt),st=this.localClippingEnabled,q=Nt.init(this.clippingPlanes,st),x=ct.get(y,u.length),x.init(),u.push(x),Xe(y,D,0,v.sortObjects),x.finish(),v.sortObjects===!0&&x.sort(G,X),this.info.render.frame++,q===!0&&Nt.beginShadows();let V=p.state.shadowsArray;if(j.render(V,y,D),q===!0&&Nt.endShadows(),this.info.autoReset===!0&&this.info.reset(),Gt.render(x,y),p.setupLights(v._useLegacyLights),D.isArrayCamera){let k=D.cameras;for(let z=0,lt=k.length;z<lt;z++){let mt=k[z];ua(x,y,mt,mt.viewport)}}else ua(x,y,D);C!==null&&(M.updateMultisampleRenderTarget(C),M.updateRenderTargetMipmap(C)),y.isScene===!0&&y.onAfterRender(v,y,D),Ut.resetDefaultState(),Y=-1,S=null,w.pop(),w.length>0?p=w[w.length-1]:p=null,u.pop(),u.length>0?x=u[u.length-1]:x=null};function Xe(y,D,V,k){if(y.visible===!1)return;if(y.layers.test(D.layers)){if(y.isGroup)V=y.renderOrder;else if(y.isLOD)y.autoUpdate===!0&&y.update(D);else if(y.isLight)p.pushLight(y),y.castShadow&&p.pushShadow(y);else if(y.isSprite){if(!y.frustumCulled||W.intersectsSprite(y)){k&&Et.setFromMatrixPosition(y.matrixWorld).applyMatrix4(dt);let mt=tt.update(y),St=y.material;St.visible&&x.push(y,mt,St,V,Et.z,null)}}else if((y.isMesh||y.isLine||y.isPoints)&&(!y.frustumCulled||W.intersectsObject(y))){let mt=tt.update(y),St=y.material;if(k&&(y.boundingSphere!==void 0?(y.boundingSphere===null&&y.computeBoundingSphere(),Et.copy(y.boundingSphere.center)):(mt.boundingSphere===null&&mt.computeBoundingSphere(),Et.copy(mt.boundingSphere.center)),Et.applyMatrix4(y.matrixWorld).applyMatrix4(dt)),Array.isArray(St)){let Tt=mt.groups;for(let Ft=0,Rt=Tt.length;Ft<Rt;Ft++){let It=Tt[Ft],te=St[It.materialIndex];te&&te.visible&&x.push(y,mt,te,V,Et.z,It)}}else St.visible&&x.push(y,mt,St,V,Et.z,null)}}let lt=y.children;for(let mt=0,St=lt.length;mt<St;mt++)Xe(lt[mt],D,V,k)}function ua(y,D,V,k){let z=y.opaque,lt=y.transmissive,mt=y.transparent;p.setupLightsView(V),q===!0&&Nt.setGlobalState(v.clippingPlanes,V),lt.length>0&&fl(z,lt,D,V),k&&ht.viewport(b.copy(k)),z.length>0&&Di(z,D,V),lt.length>0&&Di(lt,D,V),mt.length>0&&Di(mt,D,V),ht.buffers.depth.setTest(!0),ht.buffers.depth.setMask(!0),ht.buffers.color.setMask(!0),ht.setPolygonOffset(!1)}function fl(y,D,V,k){if((V.isScene===!0?V.overrideMaterial:null)!==null)return;let lt=At.isWebGL2;pt===null&&(pt=new Me(1,1,{generateMipmaps:!0,type:_t.has(\"EXT_color_buffer_half_float\")?ke:mn,minFilter:Ei,samples:lt?4:0})),v.getDrawingBufferSize(bt),lt?pt.setSize(bt.x,bt.y):pt.setSize(Pr(bt.x),Pr(bt.y));let mt=v.getRenderTarget();v.setRenderTarget(pt),v.getClearColor(T),E=v.getClearAlpha(),E<1&&v.setClearColor(16777215,.5),v.clear();let St=v.toneMapping;v.toneMapping=pn,Di(y,V,k),M.updateMultisampleRenderTarget(pt),M.updateRenderTargetMipmap(pt);let Tt=!1;for(let Ft=0,Rt=D.length;Ft<Rt;Ft++){let It=D[Ft],te=It.object,Te=It.geometry,re=It.material,Ze=It.group;if(re.side===nn&&te.layers.test(k.layers)){let Kt=re.side;re.side=we,re.needsUpdate=!0,da(te,V,k,Te,re,Ze),re.side=Kt,re.needsUpdate=!0,Tt=!0}}Tt===!0&&(M.updateMultisampleRenderTarget(pt),M.updateRenderTargetMipmap(pt)),v.setRenderTarget(mt),v.setClearColor(T,E),v.toneMapping=St}function Di(y,D,V){let k=D.isScene===!0?D.overrideMaterial:null;for(let z=0,lt=y.length;z<lt;z++){let mt=y[z],St=mt.object,Tt=mt.geometry,Ft=k===null?mt.material:k,Rt=mt.group;St.layers.test(V.layers)&&da(St,D,V,Tt,Ft,Rt)}}function da(y,D,V,k,z,lt){y.onBeforeRender(v,D,V,k,z,lt),y.modelViewMatrix.multiplyMatrices(V.matrixWorldInverse,y.matrixWorld),y.normalMatrix.getNormalMatrix(y.modelViewMatrix),z.onBeforeRender(v,D,V,k,y,lt),z.transparent===!0&&z.side===nn&&z.forceSinglePass===!1?(z.side=we,z.needsUpdate=!0,v.renderBufferDirect(V,D,k,z,y,lt),z.side=gn,z.needsUpdate=!0,v.renderBufferDirect(V,D,k,z,y,lt),z.side=nn):v.renderBufferDirect(V,D,k,z,y,lt),y.onAfterRender(v,D,V,k,z,lt)}function Ni(y,D,V){D.isScene!==!0&&(D=vt);let k=gt.get(y),z=p.state.lights,lt=p.state.shadowsArray,mt=z.state.version,St=ft.getParameters(y,z.state,lt,D,V),Tt=ft.getProgramCacheKey(St),Ft=k.programs;k.environment=y.isMeshStandardMaterial?D.environment:null,k.fog=D.fog,k.envMap=(y.isMeshStandardMaterial?B:_).get(y.envMap||k.environment),Ft===void 0&&(y.addEventListener(\"dispose\",ot),Ft=new Map,k.programs=Ft);let Rt=Ft.get(Tt);if(Rt!==void 0){if(k.currentProgram===Rt&&k.lightsStateVersion===mt)return pa(y,St),Rt}else St.uniforms=ft.getUniforms(y),y.onBuild(V,St,v),y.onBeforeCompile(St,v),Rt=ft.acquireProgram(St,Tt),Ft.set(Tt,Rt),k.uniforms=St.uniforms;let It=k.uniforms;return(!y.isShaderMaterial&&!y.isRawShaderMaterial||y.clipping===!0)&&(It.clippingPlanes=Nt.uniform),pa(y,St),k.needsLights=gl(y),k.lightsStateVersion=mt,k.needsLights&&(It.ambientLightColor.value=z.state.ambient,It.lightProbe.value=z.state.probe,It.directionalLights.value=z.state.directional,It.directionalLightShadows.value=z.state.directionalShadow,It.spotLights.value=z.state.spot,It.spotLightShadows.value=z.state.spotShadow,It.rectAreaLights.value=z.state.rectArea,It.ltc_1.value=z.state.rectAreaLTC1,It.ltc_2.value=z.state.rectAreaLTC2,It.pointLights.value=z.state.point,It.pointLightShadows.value=z.state.pointShadow,It.hemisphereLights.value=z.state.hemi,It.directionalShadowMap.value=z.state.directionalShadowMap,It.directionalShadowMatrix.value=z.state.directionalShadowMatrix,It.spotShadowMap.value=z.state.spotShadowMap,It.spotLightMatrix.value=z.state.spotLightMatrix,It.spotLightMap.value=z.state.spotLightMap,It.pointShadowMap.value=z.state.pointShadowMap,It.pointShadowMatrix.value=z.state.pointShadowMatrix),k.currentProgram=Rt,k.uniformsList=null,Rt}function fa(y){if(y.uniformsList===null){let D=y.currentProgram.getUniforms();y.uniformsList=si.seqWithValue(D.seq,y.uniforms)}return y.uniformsList}function pa(y,D){let V=gt.get(y);V.outputColorSpace=D.outputColorSpace,V.batching=D.batching,V.instancing=D.instancing,V.instancingColor=D.instancingColor,V.skinning=D.skinning,V.morphTargets=D.morphTargets,V.morphNormals=D.morphNormals,V.morphColors=D.morphColors,V.morphTargetsCount=D.morphTargetsCount,V.numClippingPlanes=D.numClippingPlanes,V.numIntersection=D.numClipIntersection,V.vertexAlphas=D.vertexAlphas,V.vertexTangents=D.vertexTangents,V.toneMapping=D.toneMapping}function pl(y,D,V,k,z){D.isScene!==!0&&(D=vt),M.resetTextureUnits();let lt=D.fog,mt=k.isMeshStandardMaterial?D.environment:null,St=C===null?v.outputColorSpace:C.isXRRenderTarget===!0?C.texture.colorSpace:rn,Tt=(k.isMeshStandardMaterial?B:_).get(k.envMap||mt),Ft=k.vertexColors===!0&&!!V.attributes.color&&V.attributes.color.itemSize===4,Rt=!!V.attributes.tangent&&(!!k.normalMap||k.anisotropy>0),It=!!V.morphAttributes.position,te=!!V.morphAttributes.normal,Te=!!V.morphAttributes.color,re=pn;k.toneMapped&&(C===null||C.isXRRenderTarget===!0)&&(re=v.toneMapping);let Ze=V.morphAttributes.position||V.morphAttributes.normal||V.morphAttributes.color,Kt=Ze!==void 0?Ze.length:0,Bt=gt.get(k),Vs=p.state.lights;if(q===!0&&(st===!0||y!==S)){let Le=y===S&&k.id===Y;Nt.setState(k,y,Le)}let jt=!1;k.version===Bt.__version?(Bt.needsLights&&Bt.lightsStateVersion!==Vs.state.version||Bt.outputColorSpace!==St||z.isBatchedMesh&&Bt.batching===!1||!z.isBatchedMesh&&Bt.batching===!0||z.isInstancedMesh&&Bt.instancing===!1||!z.isInstancedMesh&&Bt.instancing===!0||z.isSkinnedMesh&&Bt.skinning===!1||!z.isSkinnedMesh&&Bt.skinning===!0||z.isInstancedMesh&&Bt.instancingColor===!0&&z.instanceColor===null||z.isInstancedMesh&&Bt.instancingColor===!1&&z.instanceColor!==null||Bt.envMap!==Tt||k.fog===!0&&Bt.fog!==lt||Bt.numClippingPlanes!==void 0&&(Bt.numClippingPlanes!==Nt.numPlanes||Bt.numIntersection!==Nt.numIntersection)||Bt.vertexAlphas!==Ft||Bt.vertexTangents!==Rt||Bt.morphTargets!==It||Bt.morphNormals!==te||Bt.morphColors!==Te||Bt.toneMapping!==re||At.isWebGL2===!0&&Bt.morphTargetsCount!==Kt)&&(jt=!0):(jt=!0,Bt.__version=k.version);let Mn=Bt.currentProgram;jt===!0&&(Mn=Ni(k,D,z));let ma=!1,gi=!1,ks=!1,de=Mn.getUniforms(),Sn=Bt.uniforms;if(ht.useProgram(Mn.program)&&(ma=!0,gi=!0,ks=!0),k.id!==Y&&(Y=k.id,gi=!0),ma||S!==y){de.setValue(O,\"projectionMatrix\",y.projectionMatrix),de.setValue(O,\"viewMatrix\",y.matrixWorldInverse);let Le=de.map.cameraPosition;Le!==void 0&&Le.setValue(O,Et.setFromMatrixPosition(y.matrixWorld)),At.logarithmicDepthBuffer&&de.setValue(O,\"logDepthBufFC\",2/(Math.log(y.far+1)/Math.LN2)),(k.isMeshPhongMaterial||k.isMeshToonMaterial||k.isMeshLambertMaterial||k.isMeshBasicMaterial||k.isMeshStandardMaterial||k.isShaderMaterial)&&de.setValue(O,\"isOrthographic\",y.isOrthographicCamera===!0),S!==y&&(S=y,gi=!0,ks=!0)}if(z.isSkinnedMesh){de.setOptional(O,z,\"bindMatrix\"),de.setOptional(O,z,\"bindMatrixInverse\");let Le=z.skeleton;Le&&(At.floatVertexTextures?(Le.boneTexture===null&&Le.computeBoneTexture(),de.setValue(O,\"boneTexture\",Le.boneTexture,M)):console.warn(\"THREE.WebGLRenderer: SkinnedMesh can only be used with WebGL 2. With WebGL 1 OES_texture_float and vertex textures support is required.\"))}z.isBatchedMesh&&(de.setOptional(O,z,\"batchingTexture\"),de.setValue(O,\"batchingTexture\",z._matricesTexture,M));let Hs=V.morphAttributes;if((Hs.position!==void 0||Hs.normal!==void 0||Hs.color!==void 0&&At.isWebGL2===!0)&&Vt.update(z,V,Mn),(gi||Bt.receiveShadow!==z.receiveShadow)&&(Bt.receiveShadow=z.receiveShadow,de.setValue(O,\"receiveShadow\",z.receiveShadow)),k.isMeshGouraudMaterial&&k.envMap!==null&&(Sn.envMap.value=Tt,Sn.flipEnvMap.value=Tt.isCubeTexture&&Tt.isRenderTargetTexture===!1?-1:1),gi&&(de.setValue(O,\"toneMappingExposure\",v.toneMappingExposure),Bt.needsLights&&ml(Sn,ks),lt&&k.fog===!0&&rt.refreshFogUniforms(Sn,lt),rt.refreshMaterialUniforms(Sn,k,I,F,pt),si.upload(O,fa(Bt),Sn,M)),k.isShaderMaterial&&k.uniformsNeedUpdate===!0&&(si.upload(O,fa(Bt),Sn,M),k.uniformsNeedUpdate=!1),k.isSpriteMaterial&&de.setValue(O,\"center\",z.center),de.setValue(O,\"modelViewMatrix\",z.modelViewMatrix),de.setValue(O,\"normalMatrix\",z.normalMatrix),de.setValue(O,\"modelMatrix\",z.matrixWorld),k.isShaderMaterial||k.isRawShaderMaterial){let Le=k.uniformsGroups;for(let Gs=0,_l=Le.length;Gs<_l;Gs++)if(At.isWebGL2){let ga=Le[Gs];Ht.update(ga,Mn),Ht.bind(ga,Mn)}else console.warn(\"THREE.WebGLRenderer: Uniform Buffer Objects can only be used with WebGL 2.\")}return Mn}function ml(y,D){y.ambientLightColor.needsUpdate=D,y.lightProbe.needsUpdate=D,y.directionalLights.needsUpdate=D,y.directionalLightShadows.needsUpdate=D,y.pointLights.needsUpdate=D,y.pointLightShadows.needsUpdate=D,y.spotLights.needsUpdate=D,y.spotLightShadows.needsUpdate=D,y.rectAreaLights.needsUpdate=D,y.hemisphereLights.needsUpdate=D}function gl(y){return y.isMeshLambertMaterial||y.isMeshToonMaterial||y.isMeshPhongMaterial||y.isMeshStandardMaterial||y.isShadowMaterial||y.isShaderMaterial&&y.lights===!0}this.getActiveCubeFace=function(){return U},this.getActiveMipmapLevel=function(){return R},this.getRenderTarget=function(){return C},this.setRenderTargetTextures=function(y,D,V){gt.get(y.texture).__webglTexture=D,gt.get(y.depthTexture).__webglTexture=V;let k=gt.get(y);k.__hasExternalTextures=!0,k.__hasExternalTextures&&(k.__autoAllocateDepthBuffer=V===void 0,k.__autoAllocateDepthBuffer||_t.has(\"WEBGL_multisampled_render_to_texture\")===!0&&(console.warn(\"THREE.WebGLRenderer: Render-to-texture extension was disabled because an external texture was provided\"),k.__useRenderToTexture=!1))},this.setRenderTargetFramebuffer=function(y,D){let V=gt.get(y);V.__webglFramebuffer=D,V.__useDefaultFramebuffer=D===void 0},this.setRenderTarget=function(y,D=0,V=0){C=y,U=D,R=V;let k=!0,z=null,lt=!1,mt=!1;if(y){let Tt=gt.get(y);Tt.__useDefaultFramebuffer!==void 0?(ht.bindFramebuffer(O.FRAMEBUFFER,null),k=!1):Tt.__webglFramebuffer===void 0?M.setupRenderTarget(y):Tt.__hasExternalTextures&&M.rebindTextures(y,gt.get(y.texture).__webglTexture,gt.get(y.depthTexture).__webglTexture);let Ft=y.texture;(Ft.isData3DTexture||Ft.isDataArrayTexture||Ft.isCompressedArrayTexture)&&(mt=!0);let Rt=gt.get(y).__webglFramebuffer;y.isWebGLCubeRenderTarget?(Array.isArray(Rt[D])?z=Rt[D][V]:z=Rt[D],lt=!0):At.isWebGL2&&y.samples>0&&M.useMultisampledRTT(y)===!1?z=gt.get(y).__webglMultisampledFramebuffer:Array.isArray(Rt)?z=Rt[V]:z=Rt,b.copy(y.viewport),H.copy(y.scissor),K=y.scissorTest}else b.copy(Z).multiplyScalar(I).floor(),H.copy($).multiplyScalar(I).floor(),K=et;if(ht.bindFramebuffer(O.FRAMEBUFFER,z)&&At.drawBuffers&&k&&ht.drawBuffers(y,z),ht.viewport(b),ht.scissor(H),ht.setScissorTest(K),lt){let Tt=gt.get(y.texture);O.framebufferTexture2D(O.FRAMEBUFFER,O.COLOR_ATTACHMENT0,O.TEXTURE_CUBE_MAP_POSITIVE_X+D,Tt.__webglTexture,V)}else if(mt){let Tt=gt.get(y.texture),Ft=D||0;O.framebufferTextureLayer(O.FRAMEBUFFER,O.COLOR_ATTACHMENT0,Tt.__webglTexture,V||0,Ft)}Y=-1},this.readRenderTargetPixels=function(y,D,V,k,z,lt,mt){if(!(y&&y.isWebGLRenderTarget)){console.error(\"THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.\");return}let St=gt.get(y).__webglFramebuffer;if(y.isWebGLCubeRenderTarget&&mt!==void 0&&(St=St[mt]),St){ht.bindFramebuffer(O.FRAMEBUFFER,St);try{let Tt=y.texture,Ft=Tt.format,Rt=Tt.type;if(Ft!==Ve&&ut.convert(Ft)!==O.getParameter(O.IMPLEMENTATION_COLOR_READ_FORMAT)){console.error(\"THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.\");return}let It=Rt===ke&&(_t.has(\"EXT_color_buffer_half_float\")||At.isWebGL2&&_t.has(\"EXT_color_buffer_float\"));if(Rt!==mn&&ut.convert(Rt)!==O.getParameter(O.IMPLEMENTATION_COLOR_READ_TYPE)&&!(Rt===dn&&(At.isWebGL2||_t.has(\"OES_texture_float\")||_t.has(\"WEBGL_color_buffer_float\")))&&!It){console.error(\"THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.\");return}D>=0&&D<=y.width-k&&V>=0&&V<=y.height-z&&O.readPixels(D,V,k,z,ut.convert(Ft),ut.convert(Rt),lt)}finally{let Tt=C!==null?gt.get(C).__webglFramebuffer:null;ht.bindFramebuffer(O.FRAMEBUFFER,Tt)}}},this.copyFramebufferToTexture=function(y,D,V=0){let k=Math.pow(2,-V),z=Math.floor(D.image.width*k),lt=Math.floor(D.image.height*k);M.setTexture2D(D,0),O.copyTexSubImage2D(O.TEXTURE_2D,V,0,0,y.x,y.y,z,lt),ht.unbindTexture()},this.copyTextureToTexture=function(y,D,V,k=0){let z=D.image.width,lt=D.image.height,mt=ut.convert(V.format),St=ut.convert(V.type);M.setTexture2D(V,0),O.pixelStorei(O.UNPACK_FLIP_Y_WEBGL,V.flipY),O.pixelStorei(O.UNPACK_PREMULTIPLY_ALPHA_WEBGL,V.premultiplyAlpha),O.pixelStorei(O.UNPACK_ALIGNMENT,V.unpackAlignment),D.isDataTexture?O.texSubImage2D(O.TEXTURE_2D,k,y.x,y.y,z,lt,mt,St,D.image.data):D.isCompressedTexture?O.compressedTexSubImage2D(O.TEXTURE_2D,k,y.x,y.y,D.mipmaps[0].width,D.mipmaps[0].height,mt,D.mipmaps[0].data):O.texSubImage2D(O.TEXTURE_2D,k,y.x,y.y,mt,St,D.image),k===0&&V.generateMipmaps&&O.generateMipmap(O.TEXTURE_2D),ht.unbindTexture()},this.copyTextureToTexture3D=function(y,D,V,k,z=0){if(v.isWebGL1Renderer){console.warn(\"THREE.WebGLRenderer.copyTextureToTexture3D: can only be used with WebGL2.\");return}let lt=y.max.x-y.min.x+1,mt=y.max.y-y.min.y+1,St=y.max.z-y.min.z+1,Tt=ut.convert(k.format),Ft=ut.convert(k.type),Rt;if(k.isData3DTexture)M.setTexture3D(k,0),Rt=O.TEXTURE_3D;else if(k.isDataArrayTexture||k.isCompressedArrayTexture)M.setTexture2DArray(k,0),Rt=O.TEXTURE_2D_ARRAY;else{console.warn(\"THREE.WebGLRenderer.copyTextureToTexture3D: only supports THREE.DataTexture3D and THREE.DataTexture2DArray.\");return}O.pixelStorei(O.UNPACK_FLIP_Y_WEBGL,k.flipY),O.pixelStorei(O.UNPACK_PREMULTIPLY_ALPHA_WEBGL,k.premultiplyAlpha),O.pixelStorei(O.UNPACK_ALIGNMENT,k.unpackAlignment);let It=O.getParameter(O.UNPACK_ROW_LENGTH),te=O.getParameter(O.UNPACK_IMAGE_HEIGHT),Te=O.getParameter(O.UNPACK_SKIP_PIXELS),re=O.getParameter(O.UNPACK_SKIP_ROWS),Ze=O.getParameter(O.UNPACK_SKIP_IMAGES),Kt=V.isCompressedTexture?V.mipmaps[z]:V.image;O.pixelStorei(O.UNPACK_ROW_LENGTH,Kt.width),O.pixelStorei(O.UNPACK_IMAGE_HEIGHT,Kt.height),O.pixelStorei(O.UNPACK_SKIP_PIXELS,y.min.x),O.pixelStorei(O.UNPACK_SKIP_ROWS,y.min.y),O.pixelStorei(O.UNPACK_SKIP_IMAGES,y.min.z),V.isDataTexture||V.isData3DTexture?O.texSubImage3D(Rt,z,D.x,D.y,D.z,lt,mt,St,Tt,Ft,Kt.data):V.isCompressedArrayTexture?(console.warn(\"THREE.WebGLRenderer.copyTextureToTexture3D: untested support for compressed srcTexture.\"),O.compressedTexSubImage3D(Rt,z,D.x,D.y,D.z,lt,mt,St,Tt,Kt.data)):O.texSubImage3D(Rt,z,D.x,D.y,D.z,lt,mt,St,Tt,Ft,Kt),O.pixelStorei(O.UNPACK_ROW_LENGTH,It),O.pixelStorei(O.UNPACK_IMAGE_HEIGHT,te),O.pixelStorei(O.UNPACK_SKIP_PIXELS,Te),O.pixelStorei(O.UNPACK_SKIP_ROWS,re),O.pixelStorei(O.UNPACK_SKIP_IMAGES,Ze),z===0&&k.generateMipmaps&&O.generateMipmap(Rt),ht.unbindTexture()},this.initTexture=function(y){y.isCubeTexture?M.setTextureCube(y,0):y.isData3DTexture?M.setTexture3D(y,0):y.isDataArrayTexture||y.isCompressedArrayTexture?M.setTexture2DArray(y,0):M.setTexture2D(y,0),ht.unbindTexture()},this.resetState=function(){U=0,R=0,C=null,ht.reset(),Ut.reset()},typeof __THREE_DEVTOOLS__<\"u\"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent(\"observe\",{detail:this}))}get coordinateSystem(){return sn}get outputColorSpace(){return this._outputColorSpace}set outputColorSpace(t){this._outputColorSpace=t;let e=this.getContext();e.drawingBufferColorSpace=t===aa?\"display-p3\":\"srgb\",e.unpackColorSpace=Wt.workingColorSpace===Us?\"display-p3\":\"srgb\"}get outputEncoding(){return console.warn(\"THREE.WebGLRenderer: Property .outputEncoding has been removed. Use .outputColorSpace instead.\"),this.outputColorSpace===ce?In:el}set outputEncoding(t){console.warn(\"THREE.WebGLRenderer: Property .outputEncoding has been removed. Use .outputColorSpace instead.\"),this.outputColorSpace=t===In?ce:rn}get useLegacyLights(){return console.warn(\"THREE.WebGLRenderer: The property .useLegacyLights has been deprecated. Migrate your lighting according to the following guide: https://discourse.threejs.org/t/updates-to-lighting-in-three-js-r155/53733.\"),this._useLegacyLights}set useLegacyLights(t){console.warn(\"THREE.WebGLRenderer: The property .useLegacyLights has been deprecated. Migrate your lighting according to the following guide: https://discourse.threejs.org/t/updates-to-lighting-in-three-js-r155/53733.\"),this._useLegacyLights=t}},qr=class extends Ci{};qr.prototype.isWebGL1Renderer=!0;var Cs=class i{constructor(t,e=25e-5){this.isFogExp2=!0,this.name=\"\",this.color=new Pt(t),this.density=e}clone(){return new i(this.color,this.density)}toJSON(){return{type:\"FogExp2\",name:this.name,color:this.color.getHex(),density:this.density}}};var Rs=class extends Pe{constructor(){super(),this.isScene=!0,this.type=\"Scene\",this.background=null,this.environment=null,this.fog=null,this.backgroundBlurriness=0,this.backgroundIntensity=1,this.overrideMaterial=null,typeof __THREE_DEVTOOLS__<\"u\"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent(\"observe\",{detail:this}))}copy(t,e){return super.copy(t,e),t.background!==null&&(this.background=t.background.clone()),t.environment!==null&&(this.environment=t.environment.clone()),t.fog!==null&&(this.fog=t.fog.clone()),this.backgroundBlurriness=t.backgroundBlurriness,this.backgroundIntensity=t.backgroundIntensity,t.overrideMaterial!==null&&(this.overrideMaterial=t.overrideMaterial.clone()),this.matrixAutoUpdate=t.matrixAutoUpdate,this}toJSON(t){let e=super.toJSON(t);return this.fog!==null&&(e.object.fog=this.fog.toJSON()),this.backgroundBlurriness>0&&(e.object.backgroundBlurriness=this.backgroundBlurriness),this.backgroundIntensity!==1&&(e.object.backgroundIntensity=this.backgroundIntensity),e}};var Ri=class extends yn{constructor(t){super(),this.isLineBasicMaterial=!0,this.type=\"LineBasicMaterial\",this.color=new Pt(16777215),this.map=null,this.linewidth=1,this.linecap=\"round\",this.linejoin=\"round\",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.linewidth=t.linewidth,this.linecap=t.linecap,this.linejoin=t.linejoin,this.fog=t.fog,this}},zo=new N,Vo=new N,ko=new oe,Mr=new wi,ss=new Dn,Ps=class extends Pe{constructor(t=new Se,e=new Ri){super(),this.isLine=!0,this.type=\"Line\",this.geometry=t,this.material=e,this.updateMorphTargets()}copy(t,e){return super.copy(t,e),this.material=Array.isArray(t.material)?t.material.slice():t.material,this.geometry=t.geometry,this}computeLineDistances(){let t=this.geometry;if(t.index===null){let e=t.attributes.position,n=[0];for(let s=1,r=e.count;s<r;s++)zo.fromBufferAttribute(e,s-1),Vo.fromBufferAttribute(e,s),n[s]=n[s-1],n[s]+=zo.distanceTo(Vo);t.setAttribute(\"lineDistance\",new Re(n,1))}else console.warn(\"THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.\");return this}raycast(t,e){let n=this.geometry,s=this.matrixWorld,r=t.params.Line.threshold,o=n.drawRange;if(n.boundingSphere===null&&n.computeBoundingSphere(),ss.copy(n.boundingSphere),ss.applyMatrix4(s),ss.radius+=r,t.ray.intersectsSphere(ss)===!1)return;ko.copy(s).invert(),Mr.copy(t.ray).applyMatrix4(ko);let a=r/((this.scale.x+this.scale.y+this.scale.z)/3),l=a*a,c=new N,h=new N,d=new N,f=new N,m=this.isLineSegments?2:1,g=n.index,p=n.attributes.position;if(g!==null){let u=Math.max(0,o.start),w=Math.min(g.count,o.start+o.count);for(let v=u,P=w-1;v<P;v+=m){let U=g.getX(v),R=g.getX(v+1);if(c.fromBufferAttribute(p,U),h.fromBufferAttribute(p,R),Mr.distanceSqToSegment(c,h,f,d)>l)continue;f.applyMatrix4(this.matrixWorld);let Y=t.ray.origin.distanceTo(f);Y<t.near||Y>t.far||e.push({distance:Y,point:d.clone().applyMatrix4(this.matrixWorld),index:v,face:null,faceIndex:null,object:this})}}else{let u=Math.max(0,o.start),w=Math.min(p.count,o.start+o.count);for(let v=u,P=w-1;v<P;v+=m){if(c.fromBufferAttribute(p,v),h.fromBufferAttribute(p,v+1),Mr.distanceSqToSegment(c,h,f,d)>l)continue;f.applyMatrix4(this.matrixWorld);let R=t.ray.origin.distanceTo(f);R<t.near||R>t.far||e.push({distance:R,point:d.clone().applyMatrix4(this.matrixWorld),index:v,face:null,faceIndex:null,object:this})}}}updateMorphTargets(){let e=this.geometry.morphAttributes,n=Object.keys(e);if(n.length>0){let s=e[n[0]];if(s!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,o=s.length;r<o;r++){let a=s[r].name||String(r);this.morphTargetInfluences.push(0),this.morphTargetDictionary[a]=r}}}}};var hi=class extends yn{constructor(t){super(),this.isPointsMaterial=!0,this.type=\"PointsMaterial\",this.color=new Pt(16777215),this.map=null,this.alphaMap=null,this.size=1,this.sizeAttenuation=!0,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.alphaMap=t.alphaMap,this.size=t.size,this.sizeAttenuation=t.sizeAttenuation,this.fog=t.fog,this}},Ho=new oe,Yr=new wi,rs=new Dn,as=new N,Pi=class extends Pe{constructor(t=new Se,e=new hi){super(),this.isPoints=!0,this.type=\"Points\",this.geometry=t,this.material=e,this.updateMorphTargets()}copy(t,e){return super.copy(t,e),this.material=Array.isArray(t.material)?t.material.slice():t.material,this.geometry=t.geometry,this}raycast(t,e){let n=this.geometry,s=this.matrixWorld,r=t.params.Points.threshold,o=n.drawRange;if(n.boundingSphere===null&&n.computeBoundingSphere(),rs.copy(n.boundingSphere),rs.applyMatrix4(s),rs.radius+=r,t.ray.intersectsSphere(rs)===!1)return;Ho.copy(s).invert(),Yr.copy(t.ray).applyMatrix4(Ho);let a=r/((this.scale.x+this.scale.y+this.scale.z)/3),l=a*a,c=n.index,d=n.attributes.position;if(c!==null){let f=Math.max(0,o.start),m=Math.min(c.count,o.start+o.count);for(let g=f,x=m;g<x;g++){let p=c.getX(g);as.fromBufferAttribute(d,p),Go(as,p,l,s,t,e,this)}}else{let f=Math.max(0,o.start),m=Math.min(d.count,o.start+o.count);for(let g=f,x=m;g<x;g++)as.fromBufferAttribute(d,g),Go(as,g,l,s,t,e,this)}}updateMorphTargets(){let e=this.geometry.morphAttributes,n=Object.keys(e);if(n.length>0){let s=e[n[0]];if(s!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,o=s.length;r<o;r++){let a=s[r].name||String(r);this.morphTargetInfluences.push(0),this.morphTargetDictionary[a]=r}}}}};function Go(i,t,e,n,s,r,o){let a=Yr.distanceSqToPoint(i);if(a<e){let l=new N;Yr.closestPointToPoint(i,l),l.applyMatrix4(n);let c=s.ray.origin.distanceTo(l);if(c<s.near||c>s.far)return;r.push({distance:c,distanceToRay:Math.sqrt(a),point:l,index:t,face:null,object:o})}}function os(i,t,e){return!i||!e&&i.constructor===t?i:typeof t.BYTES_PER_ELEMENT==\"number\"?new t(i):Array.prototype.slice.call(i)}function hp(i){return ArrayBuffer.isView(i)&&!(i instanceof DataView)}var ui=class{constructor(t,e,n,s){this.parameterPositions=t,this._cachedIndex=0,this.resultBuffer=s!==void 0?s:new e.constructor(n),this.sampleValues=e,this.valueSize=n,this.settings=null,this.DefaultSettings_={}}evaluate(t){let e=this.parameterPositions,n=this._cachedIndex,s=e[n],r=e[n-1];n:{t:{let o;e:{i:if(!(t<s)){for(let a=n+2;;){if(s===void 0){if(t<r)break i;return n=e.length,this._cachedIndex=n,this.copySampleValue_(n-1)}if(n===a)break;if(r=s,s=e[++n],t<s)break t}o=e.length;break e}if(!(t>=r)){let a=e[1];t<a&&(n=2,r=a);for(let l=n-2;;){if(r===void 0)return this._cachedIndex=0,this.copySampleValue_(0);if(n===l)break;if(s=r,r=e[--n-1],t>=r)break t}o=n,n=0;break e}break n}for(;n<o;){let a=n+o>>>1;t<e[a]?o=a:n=a+1}if(s=e[n],r=e[n-1],r===void 0)return this._cachedIndex=0,this.copySampleValue_(0);if(s===void 0)return n=e.length,this._cachedIndex=n,this.copySampleValue_(n-1)}this._cachedIndex=n,this.intervalChanged_(n,r,s)}return this.interpolate_(n,r,t,s)}getSettings_(){return this.settings||this.DefaultSettings_}copySampleValue_(t){let e=this.resultBuffer,n=this.sampleValues,s=this.valueSize,r=t*s;for(let o=0;o!==s;++o)e[o]=n[r+o];return e}interpolate_(){throw new Error(\"call to abstract method\")}intervalChanged_(){}},Zr=class extends ui{constructor(t,e,n,s){super(t,e,n,s),this._weightPrev=-0,this._offsetPrev=-0,this._weightNext=-0,this._offsetNext=-0,this.DefaultSettings_={endingStart:Za,endingEnd:Za}}intervalChanged_(t,e,n){let s=this.parameterPositions,r=t-2,o=t+1,a=s[r],l=s[o];if(a===void 0)switch(this.getSettings_().endingStart){case Ja:r=t,a=2*e-n;break;case $a:r=s.length-2,a=e+s[r]-s[r+1];break;default:r=t,a=n}if(l===void 0)switch(this.getSettings_().endingEnd){case Ja:o=t,l=2*n-e;break;case $a:o=1,l=n+s[1]-s[0];break;default:o=t-1,l=e}let c=(n-e)*.5,h=this.valueSize;this._weightPrev=c/(e-a),this._weightNext=c/(l-n),this._offsetPrev=r*h,this._offsetNext=o*h}interpolate_(t,e,n,s){let r=this.resultBuffer,o=this.sampleValues,a=this.valueSize,l=t*a,c=l-a,h=this._offsetPrev,d=this._offsetNext,f=this._weightPrev,m=this._weightNext,g=(n-e)/(s-e),x=g*g,p=x*g,u=-f*p+2*f*x-f*g,w=(1+f)*p+(-1.5-2*f)*x+(-.5+f)*g+1,v=(-1-m)*p+(1.5+m)*x+.5*g,P=m*p-m*x;for(let U=0;U!==a;++U)r[U]=u*o[h+U]+w*o[c+U]+v*o[l+U]+P*o[d+U];return r}},Jr=class extends ui{constructor(t,e,n,s){super(t,e,n,s)}interpolate_(t,e,n,s){let r=this.resultBuffer,o=this.sampleValues,a=this.valueSize,l=t*a,c=l-a,h=(n-e)/(s-e),d=1-h;for(let f=0;f!==a;++f)r[f]=o[c+f]*d+o[l+f]*h;return r}},$r=class extends ui{constructor(t,e,n,s){super(t,e,n,s)}interpolate_(t){return this.copySampleValue_(t-1)}},Ge=class{constructor(t,e,n,s){if(t===void 0)throw new Error(\"THREE.KeyframeTrack: track name is undefined\");if(e===void 0||e.length===0)throw new Error(\"THREE.KeyframeTrack: no keyframes in track named \"+t);this.name=t,this.times=os(e,this.TimeBufferType),this.values=os(n,this.ValueBufferType),this.setInterpolation(s||this.DefaultInterpolation)}static toJSON(t){let e=t.constructor,n;if(e.toJSON!==this.toJSON)n=e.toJSON(t);else{n={name:t.name,times:os(t.times,Array),values:os(t.values,Array)};let s=t.getInterpolation();s!==t.DefaultInterpolation&&(n.interpolation=s)}return n.type=t.ValueTypeName,n}InterpolantFactoryMethodDiscrete(t){return new $r(this.times,this.values,this.getValueSize(),t)}InterpolantFactoryMethodLinear(t){return new Jr(this.times,this.values,this.getValueSize(),t)}InterpolantFactoryMethodSmooth(t){return new Zr(this.times,this.values,this.getValueSize(),t)}setInterpolation(t){let e;switch(t){case cs:e=this.InterpolantFactoryMethodDiscrete;break;case hs:e=this.InterpolantFactoryMethodLinear;break;case $s:e=this.InterpolantFactoryMethodSmooth;break}if(e===void 0){let n=\"unsupported interpolation for \"+this.ValueTypeName+\" keyframe track named \"+this.name;if(this.createInterpolant===void 0)if(t!==this.DefaultInterpolation)this.setInterpolation(this.DefaultInterpolation);else throw new Error(n);return console.warn(\"THREE.KeyframeTrack:\",n),this}return this.createInterpolant=e,this}getInterpolation(){switch(this.createInterpolant){case this.InterpolantFactoryMethodDiscrete:return cs;case this.InterpolantFactoryMethodLinear:return hs;case this.InterpolantFactoryMethodSmooth:return $s}}getValueSize(){return this.values.length/this.times.length}shift(t){if(t!==0){let e=this.times;for(let n=0,s=e.length;n!==s;++n)e[n]+=t}return this}scale(t){if(t!==1){let e=this.times;for(let n=0,s=e.length;n!==s;++n)e[n]*=t}return this}trim(t,e){let n=this.times,s=n.length,r=0,o=s-1;for(;r!==s&&n[r]<t;)++r;for(;o!==-1&&n[o]>e;)--o;if(++o,r!==0||o!==s){r>=o&&(o=Math.max(o,1),r=o-1);let a=this.getValueSize();this.times=n.slice(r,o),this.values=this.values.slice(r*a,o*a)}return this}validate(){let t=!0,e=this.getValueSize();e-Math.floor(e)!==0&&(console.error(\"THREE.KeyframeTrack: Invalid value size in track.\",this),t=!1);let n=this.times,s=this.values,r=n.length;r===0&&(console.error(\"THREE.KeyframeTrack: Track is empty.\",this),t=!1);let o=null;for(let a=0;a!==r;a++){let l=n[a];if(typeof l==\"number\"&&isNaN(l)){console.error(\"THREE.KeyframeTrack: Time is not a valid number.\",this,a,l),t=!1;break}if(o!==null&&o>l){console.error(\"THREE.KeyframeTrack: Out of order keys.\",this,a,l,o),t=!1;break}o=l}if(s!==void 0&&hp(s))for(let a=0,l=s.length;a!==l;++a){let c=s[a];if(isNaN(c)){console.error(\"THREE.KeyframeTrack: Value is not a valid number.\",this,a,c),t=!1;break}}return t}optimize(){let t=this.times.slice(),e=this.values.slice(),n=this.getValueSize(),s=this.getInterpolation()===$s,r=t.length-1,o=1;for(let a=1;a<r;++a){let l=!1,c=t[a],h=t[a+1];if(c!==h&&(a!==1||c!==t[0]))if(s)l=!0;else{let d=a*n,f=d-n,m=d+n;for(let g=0;g!==n;++g){let x=e[d+g];if(x!==e[f+g]||x!==e[m+g]){l=!0;break}}}if(l){if(a!==o){t[o]=t[a];let d=a*n,f=o*n;for(let m=0;m!==n;++m)e[f+m]=e[d+m]}++o}}if(r>0){t[o]=t[r];for(let a=r*n,l=o*n,c=0;c!==n;++c)e[l+c]=e[a+c];++o}return o!==t.length?(this.times=t.slice(0,o),this.values=e.slice(0,o*n)):(this.times=t,this.values=e),this}clone(){let t=this.times.slice(),e=this.values.slice(),n=this.constructor,s=new n(this.name,t,e);return s.createInterpolant=this.createInterpolant,s}};Ge.prototype.TimeBufferType=Float32Array;Ge.prototype.ValueBufferType=Float32Array;Ge.prototype.DefaultInterpolation=hs;var Nn=class extends Ge{};Nn.prototype.ValueTypeName=\"bool\";Nn.prototype.ValueBufferType=Array;Nn.prototype.DefaultInterpolation=cs;Nn.prototype.InterpolantFactoryMethodLinear=void 0;Nn.prototype.InterpolantFactoryMethodSmooth=void 0;var Kr=class extends Ge{};Kr.prototype.ValueTypeName=\"color\";var Qr=class extends Ge{};Qr.prototype.ValueTypeName=\"number\";var jr=class extends ui{constructor(t,e,n,s){super(t,e,n,s)}interpolate_(t,e,n,s){let r=this.resultBuffer,o=this.sampleValues,a=this.valueSize,l=(n-e)/(s-e),c=t*a;for(let h=c+a;c!==h;c+=4)vn.slerpFlat(r,0,o,c-a,o,c,l);return r}},Li=class extends Ge{InterpolantFactoryMethodLinear(t){return new jr(this.times,this.values,this.getValueSize(),t)}};Li.prototype.ValueTypeName=\"quaternion\";Li.prototype.DefaultInterpolation=hs;Li.prototype.InterpolantFactoryMethodSmooth=void 0;var Fn=class extends Ge{};Fn.prototype.ValueTypeName=\"string\";Fn.prototype.ValueBufferType=Array;Fn.prototype.DefaultInterpolation=cs;Fn.prototype.InterpolantFactoryMethodLinear=void 0;Fn.prototype.InterpolantFactoryMethodSmooth=void 0;var ta=class extends Ge{};ta.prototype.ValueTypeName=\"vector\";var ea=class{constructor(t,e,n){let s=this,r=!1,o=0,a=0,l,c=[];this.onStart=void 0,this.onLoad=t,this.onProgress=e,this.onError=n,this.itemStart=function(h){a++,r===!1&&s.onStart!==void 0&&s.onStart(h,o,a),r=!0},this.itemEnd=function(h){o++,s.onProgress!==void 0&&s.onProgress(h,o,a),o===a&&(r=!1,s.onLoad!==void 0&&s.onLoad())},this.itemError=function(h){s.onError!==void 0&&s.onError(h)},this.resolveURL=function(h){return l?l(h):h},this.setURLModifier=function(h){return l=h,this},this.addHandler=function(h,d){return c.push(h,d),this},this.removeHandler=function(h){let d=c.indexOf(h);return d!==-1&&c.splice(d,2),this},this.getHandler=function(h){for(let d=0,f=c.length;d<f;d+=2){let m=c[d],g=c[d+1];if(m.global&&(m.lastIndex=0),m.test(h))return g}return null}}},up=new ea,na=class{constructor(t){this.manager=t!==void 0?t:up,this.crossOrigin=\"anonymous\",this.withCredentials=!1,this.path=\"\",this.resourcePath=\"\",this.requestHeader={}}load(){}loadAsync(t,e){let n=this;return new Promise(function(s,r){n.load(t,s,e,r)})}parse(){}setCrossOrigin(t){return this.crossOrigin=t,this}setWithCredentials(t){return this.withCredentials=t,this}setPath(t){return this.path=t,this}setResourcePath(t){return this.resourcePath=t,this}setRequestHeader(t){return this.requestHeader=t,this}};na.DEFAULT_MATERIAL_NAME=\"__DEFAULT\";var Ls=class{constructor(t=!0){this.autoStart=t,this.startTime=0,this.oldTime=0,this.elapsedTime=0,this.running=!1}start(){this.startTime=Wo(),this.oldTime=this.startTime,this.elapsedTime=0,this.running=!0}stop(){this.getElapsedTime(),this.running=!1,this.autoStart=!1}getElapsedTime(){return this.getDelta(),this.elapsedTime}getDelta(){let t=0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){let e=Wo();t=(e-this.oldTime)/1e3,this.oldTime=e,this.elapsedTime+=t}return t}};function Wo(){return(typeof performance>\"u\"?Date:performance).now()}var la=\"\\\\[\\\\]\\\\.:\\\\/\",dp=new RegExp(\"[\"+la+\"]\",\"g\"),ca=\"[^\"+la+\"]\",fp=\"[^\"+la.replace(\"\\\\.\",\"\")+\"]\",pp=/((?:WC+[\\/:])*)/.source.replace(\"WC\",ca),mp=/(WCOD+)?/.source.replace(\"WCOD\",fp),gp=/(?:\\.(WC+)(?:\\[(.+)\\])?)?/.source.replace(\"WC\",ca),_p=/\\.(WC+)(?:\\[(.+)\\])?/.source.replace(\"WC\",ca),xp=new RegExp(\"^\"+pp+mp+gp+_p+\"$\"),vp=[\"material\",\"materials\",\"bones\",\"map\"],ia=class{constructor(t,e,n){let s=n||$t.parseTrackName(e);this._targetGroup=t,this._bindings=t.subscribe_(e,s)}getValue(t,e){this.bind();let n=this._targetGroup.nCachedObjects_,s=this._bindings[n];s!==void 0&&s.getValue(t,e)}setValue(t,e){let n=this._bindings;for(let s=this._targetGroup.nCachedObjects_,r=n.length;s!==r;++s)n[s].setValue(t,e)}bind(){let t=this._bindings;for(let e=this._targetGroup.nCachedObjects_,n=t.length;e!==n;++e)t[e].bind()}unbind(){let t=this._bindings;for(let e=this._targetGroup.nCachedObjects_,n=t.length;e!==n;++e)t[e].unbind()}},$t=class i{constructor(t,e,n){this.path=e,this.parsedPath=n||i.parseTrackName(e),this.node=i.findNode(t,this.parsedPath.nodeName),this.rootNode=t,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}static create(t,e,n){return t&&t.isAnimationObjectGroup?new i.Composite(t,e,n):new i(t,e,n)}static sanitizeNodeName(t){return t.replace(/\\s/g,\"_\").replace(dp,\"\")}static parseTrackName(t){let e=xp.exec(t);if(e===null)throw new Error(\"PropertyBinding: Cannot parse trackName: \"+t);let n={nodeName:e[2],objectName:e[3],objectIndex:e[4],propertyName:e[5],propertyIndex:e[6]},s=n.nodeName&&n.nodeName.lastIndexOf(\".\");if(s!==void 0&&s!==-1){let r=n.nodeName.substring(s+1);vp.indexOf(r)!==-1&&(n.nodeName=n.nodeName.substring(0,s),n.objectName=r)}if(n.propertyName===null||n.propertyName.length===0)throw new Error(\"PropertyBinding: can not parse propertyName from trackName: \"+t);return n}static findNode(t,e){if(e===void 0||e===\"\"||e===\".\"||e===-1||e===t.name||e===t.uuid)return t;if(t.skeleton){let n=t.skeleton.getBoneByName(e);if(n!==void 0)return n}if(t.children){let n=function(r){for(let o=0;o<r.length;o++){let a=r[o];if(a.name===e||a.uuid===e)return a;let l=n(a.children);if(l)return l}return null},s=n(t.children);if(s)return s}return null}_getValue_unavailable(){}_setValue_unavailable(){}_getValue_direct(t,e){t[e]=this.targetObject[this.propertyName]}_getValue_array(t,e){let n=this.resolvedProperty;for(let s=0,r=n.length;s!==r;++s)t[e++]=n[s]}_getValue_arrayElement(t,e){t[e]=this.resolvedProperty[this.propertyIndex]}_getValue_toArray(t,e){this.resolvedProperty.toArray(t,e)}_setValue_direct(t,e){this.targetObject[this.propertyName]=t[e]}_setValue_direct_setNeedsUpdate(t,e){this.targetObject[this.propertyName]=t[e],this.targetObject.needsUpdate=!0}_setValue_direct_setMatrixWorldNeedsUpdate(t,e){this.targetObject[this.propertyName]=t[e],this.targetObject.matrixWorldNeedsUpdate=!0}_setValue_array(t,e){let n=this.resolvedProperty;for(let s=0,r=n.length;s!==r;++s)n[s]=t[e++]}_setValue_array_setNeedsUpdate(t,e){let n=this.resolvedProperty;for(let s=0,r=n.length;s!==r;++s)n[s]=t[e++];this.targetObject.needsUpdate=!0}_setValue_array_setMatrixWorldNeedsUpdate(t,e){let n=this.resolvedProperty;for(let s=0,r=n.length;s!==r;++s)n[s]=t[e++];this.targetObject.matrixWorldNeedsUpdate=!0}_setValue_arrayElement(t,e){this.resolvedProperty[this.propertyIndex]=t[e]}_setValue_arrayElement_setNeedsUpdate(t,e){this.resolvedProperty[this.propertyIndex]=t[e],this.targetObject.needsUpdate=!0}_setValue_arrayElement_setMatrixWorldNeedsUpdate(t,e){this.resolvedProperty[this.propertyIndex]=t[e],this.targetObject.matrixWorldNeedsUpdate=!0}_setValue_fromArray(t,e){this.resolvedProperty.fromArray(t,e)}_setValue_fromArray_setNeedsUpdate(t,e){this.resolvedProperty.fromArray(t,e),this.targetObject.needsUpdate=!0}_setValue_fromArray_setMatrixWorldNeedsUpdate(t,e){this.resolvedProperty.fromArray(t,e),this.targetObject.matrixWorldNeedsUpdate=!0}_getValue_unbound(t,e){this.bind(),this.getValue(t,e)}_setValue_unbound(t,e){this.bind(),this.setValue(t,e)}bind(){let t=this.node,e=this.parsedPath,n=e.objectName,s=e.propertyName,r=e.propertyIndex;if(t||(t=i.findNode(this.rootNode,e.nodeName),this.node=t),this.getValue=this._getValue_unavailable,this.setValue=this._setValue_unavailable,!t){console.warn(\"THREE.PropertyBinding: No target node found for track: \"+this.path+\".\");return}if(n){let c=e.objectIndex;switch(n){case\"materials\":if(!t.material){console.error(\"THREE.PropertyBinding: Can not bind to material as node does not have a material.\",this);return}if(!t.material.materials){console.error(\"THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.\",this);return}t=t.material.materials;break;case\"bones\":if(!t.skeleton){console.error(\"THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.\",this);return}t=t.skeleton.bones;for(let h=0;h<t.length;h++)if(t[h].name===c){c=h;break}break;case\"map\":if(\"map\"in t){t=t.map;break}if(!t.material){console.error(\"THREE.PropertyBinding: Can not bind to material as node does not have a material.\",this);return}if(!t.material.map){console.error(\"THREE.PropertyBinding: Can not bind to material.map as node.material does not have a map.\",this);return}t=t.material.map;break;default:if(t[n]===void 0){console.error(\"THREE.PropertyBinding: Can not bind to objectName of node undefined.\",this);return}t=t[n]}if(c!==void 0){if(t[c]===void 0){console.error(\"THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.\",this,t);return}t=t[c]}}let o=t[s];if(o===void 0){let c=e.nodeName;console.error(\"THREE.PropertyBinding: Trying to update property for track: \"+c+\".\"+s+\" but it wasn't found.\",t);return}let a=this.Versioning.None;this.targetObject=t,t.needsUpdate!==void 0?a=this.Versioning.NeedsUpdate:t.matrixWorldNeedsUpdate!==void 0&&(a=this.Versioning.MatrixWorldNeedsUpdate);let l=this.BindingType.Direct;if(r!==void 0){if(s===\"morphTargetInfluences\"){if(!t.geometry){console.error(\"THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.\",this);return}if(!t.geometry.morphAttributes){console.error(\"THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.\",this);return}t.morphTargetDictionary[r]!==void 0&&(r=t.morphTargetDictionary[r])}l=this.BindingType.ArrayElement,this.resolvedProperty=o,this.propertyIndex=r}else o.fromArray!==void 0&&o.toArray!==void 0?(l=this.BindingType.HasFromToArray,this.resolvedProperty=o):Array.isArray(o)?(l=this.BindingType.EntireArray,this.resolvedProperty=o):this.propertyName=s;this.getValue=this.GetterByBindingType[l],this.setValue=this.SetterByBindingTypeAndVersioning[l][a]}unbind(){this.node=null,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}};$t.Composite=ia;$t.prototype.BindingType={Direct:0,EntireArray:1,ArrayElement:2,HasFromToArray:3};$t.prototype.Versioning={None:0,NeedsUpdate:1,MatrixWorldNeedsUpdate:2};$t.prototype.GetterByBindingType=[$t.prototype._getValue_direct,$t.prototype._getValue_array,$t.prototype._getValue_arrayElement,$t.prototype._getValue_toArray];$t.prototype.SetterByBindingTypeAndVersioning=[[$t.prototype._setValue_direct,$t.prototype._setValue_direct_setNeedsUpdate,$t.prototype._setValue_direct_setMatrixWorldNeedsUpdate],[$t.prototype._setValue_array,$t.prototype._setValue_array_setNeedsUpdate,$t.prototype._setValue_array_setMatrixWorldNeedsUpdate],[$t.prototype._setValue_arrayElement,$t.prototype._setValue_arrayElement_setNeedsUpdate,$t.prototype._setValue_arrayElement_setMatrixWorldNeedsUpdate],[$t.prototype._setValue_fromArray,$t.prototype._setValue_fromArray_setNeedsUpdate,$t.prototype._setValue_fromArray_setMatrixWorldNeedsUpdate]];var Sp=new Float32Array(1);typeof __THREE_DEVTOOLS__<\"u\"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent(\"register\",{detail:{revision:\"160\"}}));typeof window<\"u\"&&(window.__THREE__?console.warn(\"WARNING: Multiple instances of Three.js being imported.\"):window.__THREE__=\"160\");var Ns={name:\"CopyShader\",uniforms:{tDiffuse:{value:null},opacity:{value:1}},vertexShader:`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,fragmentShader:`\n\n\t\tuniform float opacity;\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 texel = texture2D( tDiffuse, vUv );\n\t\t\tgl_FragColor = opacity * texel;\n\n\n\t\t}`};var We=class{constructor(){this.isPass=!0,this.enabled=!0,this.needsSwap=!0,this.clear=!1,this.renderToScreen=!1}setSize(){}render(){console.error(\"THREE.Pass: .render() must be implemented in derived pass.\")}dispose(){}},yp=new Ai(-1,1,1,-1,0,1),ha=class extends Se{constructor(){super(),this.setAttribute(\"position\",new Re([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute(\"uv\",new Re([0,2,0,0,2,0],2))}},Mp=new ha,pi=class{constructor(t){this._mesh=new Ne(Mp,t)}dispose(){this._mesh.geometry.dispose()}render(t){t.render(this._mesh,yp)}get material(){return this._mesh.material}set material(t){this._mesh.material=t}};var Fs=class extends We{constructor(t,e){super(),this.textureID=e!==void 0?e:\"tDiffuse\",t instanceof ue?(this.uniforms=t.uniforms,this.material=t):t&&(this.uniforms=di.clone(t.uniforms),this.material=new ue({name:t.name!==void 0?t.name:\"unspecified\",defines:Object.assign({},t.defines),uniforms:this.uniforms,vertexShader:t.vertexShader,fragmentShader:t.fragmentShader})),this.fsQuad=new pi(this.material)}render(t,e,n){this.uniforms[this.textureID]&&(this.uniforms[this.textureID].value=n.texture),this.fsQuad.material=this.material,this.renderToScreen?(t.setRenderTarget(null),this.fsQuad.render(t)):(t.setRenderTarget(e),this.clear&&t.clear(t.autoClearColor,t.autoClearDepth,t.autoClearStencil),this.fsQuad.render(t))}dispose(){this.material.dispose(),this.fsQuad.dispose()}};var Ui=class extends We{constructor(t,e){super(),this.scene=t,this.camera=e,this.clear=!0,this.needsSwap=!1,this.inverse=!1}render(t,e,n){let s=t.getContext(),r=t.state;r.buffers.color.setMask(!1),r.buffers.depth.setMask(!1),r.buffers.color.setLocked(!0),r.buffers.depth.setLocked(!0);let o,a;this.inverse?(o=0,a=1):(o=1,a=0),r.buffers.stencil.setTest(!0),r.buffers.stencil.setOp(s.REPLACE,s.REPLACE,s.REPLACE),r.buffers.stencil.setFunc(s.ALWAYS,o,4294967295),r.buffers.stencil.setClear(a),r.buffers.stencil.setLocked(!0),t.setRenderTarget(n),this.clear&&t.clear(),t.render(this.scene,this.camera),t.setRenderTarget(e),this.clear&&t.clear(),t.render(this.scene,this.camera),r.buffers.color.setLocked(!1),r.buffers.depth.setLocked(!1),r.buffers.color.setMask(!0),r.buffers.depth.setMask(!0),r.buffers.stencil.setLocked(!1),r.buffers.stencil.setFunc(s.EQUAL,1,4294967295),r.buffers.stencil.setOp(s.KEEP,s.KEEP,s.KEEP),r.buffers.stencil.setLocked(!0)}},Os=class extends We{constructor(){super(),this.needsSwap=!1}render(t){t.state.buffers.stencil.setLocked(!1),t.state.buffers.stencil.setTest(!1)}};var Bs=class{constructor(t,e){if(this.renderer=t,this._pixelRatio=t.getPixelRatio(),e===void 0){let n=t.getSize(new Lt);this._width=n.width,this._height=n.height,e=new Me(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:ke}),e.texture.name=\"EffectComposer.rt1\"}else this._width=e.width,this._height=e.height;this.renderTarget1=e,this.renderTarget2=e.clone(),this.renderTarget2.texture.name=\"EffectComposer.rt2\",this.writeBuffer=this.renderTarget1,this.readBuffer=this.renderTarget2,this.renderToScreen=!0,this.passes=[],this.copyPass=new Fs(Ns),this.copyPass.material.blending=Ye,this.clock=new Ls}swapBuffers(){let t=this.readBuffer;this.readBuffer=this.writeBuffer,this.writeBuffer=t}addPass(t){this.passes.push(t),t.setSize(this._width*this._pixelRatio,this._height*this._pixelRatio)}insertPass(t,e){this.passes.splice(e,0,t),t.setSize(this._width*this._pixelRatio,this._height*this._pixelRatio)}removePass(t){let e=this.passes.indexOf(t);e!==-1&&this.passes.splice(e,1)}isLastEnabledPass(t){for(let e=t+1;e<this.passes.length;e++)if(this.passes[e].enabled)return!1;return!0}render(t){t===void 0&&(t=this.clock.getDelta());let e=this.renderer.getRenderTarget(),n=!1;for(let s=0,r=this.passes.length;s<r;s++){let o=this.passes[s];if(o.enabled!==!1){if(o.renderToScreen=this.renderToScreen&&this.isLastEnabledPass(s),o.render(this.renderer,this.writeBuffer,this.readBuffer,t,n),o.needsSwap){if(n){let a=this.renderer.getContext(),l=this.renderer.state.buffers.stencil;l.setFunc(a.NOTEQUAL,1,4294967295),this.copyPass.render(this.renderer,this.writeBuffer,this.readBuffer,t),l.setFunc(a.EQUAL,1,4294967295)}this.swapBuffers()}Ui!==void 0&&(o instanceof Ui?n=!0:o instanceof Os&&(n=!1))}}this.renderer.setRenderTarget(e)}reset(t){if(t===void 0){let e=this.renderer.getSize(new Lt);this._pixelRatio=this.renderer.getPixelRatio(),this._width=e.width,this._height=e.height,t=this.renderTarget1.clone(),t.setSize(this._width*this._pixelRatio,this._height*this._pixelRatio)}this.renderTarget1.dispose(),this.renderTarget2.dispose(),this.renderTarget1=t,this.renderTarget2=t.clone(),this.writeBuffer=this.renderTarget1,this.readBuffer=this.renderTarget2}setSize(t,e){this._width=t,this._height=e;let n=this._width*this._pixelRatio,s=this._height*this._pixelRatio;this.renderTarget1.setSize(n,s),this.renderTarget2.setSize(n,s);for(let r=0;r<this.passes.length;r++)this.passes[r].setSize(n,s)}setPixelRatio(t){this._pixelRatio=t,this.setSize(this._width,this._height)}dispose(){this.renderTarget1.dispose(),this.renderTarget2.dispose(),this.copyPass.dispose()}};var zs=class extends We{constructor(t,e,n=null,s=null,r=null){super(),this.scene=t,this.camera=e,this.overrideMaterial=n,this.clearColor=s,this.clearAlpha=r,this.clear=!0,this.clearDepth=!1,this.needsSwap=!1,this._oldClearColor=new Pt}render(t,e,n){let s=t.autoClear;t.autoClear=!1;let r,o;this.overrideMaterial!==null&&(o=this.scene.overrideMaterial,this.scene.overrideMaterial=this.overrideMaterial),this.clearColor!==null&&(t.getClearColor(this._oldClearColor),t.setClearColor(this.clearColor)),this.clearAlpha!==null&&(r=t.getClearAlpha(),t.setClearAlpha(this.clearAlpha)),this.clearDepth==!0&&t.clearDepth(),t.setRenderTarget(this.renderToScreen?null:n),this.clear===!0&&t.clear(t.autoClearColor,t.autoClearDepth,t.autoClearStencil),t.render(this.scene,this.camera),this.clearColor!==null&&t.setClearColor(this._oldClearColor),this.clearAlpha!==null&&t.setClearAlpha(r),this.overrideMaterial!==null&&(this.scene.overrideMaterial=o),t.autoClear=s}};var dl={name:\"LuminosityHighPassShader\",shaderID:\"luminosityHighPass\",uniforms:{tDiffuse:{value:null},luminosityThreshold:{value:1},smoothWidth:{value:1},defaultColor:{value:new Pt(0)},defaultOpacity:{value:0}},vertexShader:`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,fragmentShader:`\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform vec3 defaultColor;\n\t\tuniform float defaultOpacity;\n\t\tuniform float luminosityThreshold;\n\t\tuniform float smoothWidth;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 texel = texture2D( tDiffuse, vUv );\n\n\t\t\tvec3 luma = vec3( 0.299, 0.587, 0.114 );\n\n\t\t\tfloat v = dot( texel.xyz, luma );\n\n\t\t\tvec4 outputColor = vec4( defaultColor.rgb, defaultOpacity );\n\n\t\t\tfloat alpha = smoothstep( luminosityThreshold, luminosityThreshold + smoothWidth, v );\n\n\t\t\tgl_FragColor = mix( outputColor, texel, alpha );\n\n\t\t}`};var mi=class i extends We{constructor(t,e,n,s){super(),this.strength=e!==void 0?e:1,this.radius=n,this.threshold=s,this.resolution=t!==void 0?new Lt(t.x,t.y):new Lt(256,256),this.clearColor=new Pt(0,0,0),this.renderTargetsHorizontal=[],this.renderTargetsVertical=[],this.nMips=5;let r=Math.round(this.resolution.x/2),o=Math.round(this.resolution.y/2);this.renderTargetBright=new Me(r,o,{type:ke}),this.renderTargetBright.texture.name=\"UnrealBloomPass.bright\",this.renderTargetBright.texture.generateMipmaps=!1;for(let d=0;d<this.nMips;d++){let f=new Me(r,o,{type:ke});f.texture.name=\"UnrealBloomPass.h\"+d,f.texture.generateMipmaps=!1,this.renderTargetsHorizontal.push(f);let m=new Me(r,o,{type:ke});m.texture.name=\"UnrealBloomPass.v\"+d,m.texture.generateMipmaps=!1,this.renderTargetsVertical.push(m),r=Math.round(r/2),o=Math.round(o/2)}let a=dl;this.highPassUniforms=di.clone(a.uniforms),this.highPassUniforms.luminosityThreshold.value=s,this.highPassUniforms.smoothWidth.value=.01,this.materialHighPassFilter=new ue({uniforms:this.highPassUniforms,vertexShader:a.vertexShader,fragmentShader:a.fragmentShader}),this.separableBlurMaterials=[];let l=[3,5,7,9,11];r=Math.round(this.resolution.x/2),o=Math.round(this.resolution.y/2);for(let d=0;d<this.nMips;d++)this.separableBlurMaterials.push(this.getSeperableBlurMaterial(l[d])),this.separableBlurMaterials[d].uniforms.invSize.value=new Lt(1/r,1/o),r=Math.round(r/2),o=Math.round(o/2);this.compositeMaterial=this.getCompositeMaterial(this.nMips),this.compositeMaterial.uniforms.blurTexture1.value=this.renderTargetsVertical[0].texture,this.compositeMaterial.uniforms.blurTexture2.value=this.renderTargetsVertical[1].texture,this.compositeMaterial.uniforms.blurTexture3.value=this.renderTargetsVertical[2].texture,this.compositeMaterial.uniforms.blurTexture4.value=this.renderTargetsVertical[3].texture,this.compositeMaterial.uniforms.blurTexture5.value=this.renderTargetsVertical[4].texture,this.compositeMaterial.uniforms.bloomStrength.value=e,this.compositeMaterial.uniforms.bloomRadius.value=.1;let c=[1,.8,.6,.4,.2];this.compositeMaterial.uniforms.bloomFactors.value=c,this.bloomTintColors=[new N(1,1,1),new N(1,1,1),new N(1,1,1),new N(1,1,1),new N(1,1,1)],this.compositeMaterial.uniforms.bloomTintColors.value=this.bloomTintColors;let h=Ns;this.copyUniforms=di.clone(h.uniforms),this.blendMaterial=new ue({uniforms:this.copyUniforms,vertexShader:h.vertexShader,fragmentShader:h.fragmentShader,blending:_n,depthTest:!1,depthWrite:!1,transparent:!0}),this.enabled=!0,this.needsSwap=!1,this._oldClearColor=new Pt,this.oldClearAlpha=1,this.basic=new li,this.fsQuad=new pi(null)}dispose(){for(let t=0;t<this.renderTargetsHorizontal.length;t++)this.renderTargetsHorizontal[t].dispose();for(let t=0;t<this.renderTargetsVertical.length;t++)this.renderTargetsVertical[t].dispose();this.renderTargetBright.dispose();for(let t=0;t<this.separableBlurMaterials.length;t++)this.separableBlurMaterials[t].dispose();this.compositeMaterial.dispose(),this.blendMaterial.dispose(),this.basic.dispose(),this.fsQuad.dispose()}setSize(t,e){let n=Math.round(t/2),s=Math.round(e/2);this.renderTargetBright.setSize(n,s);for(let r=0;r<this.nMips;r++)this.renderTargetsHorizontal[r].setSize(n,s),this.renderTargetsVertical[r].setSize(n,s),this.separableBlurMaterials[r].uniforms.invSize.value=new Lt(1/n,1/s),n=Math.round(n/2),s=Math.round(s/2)}render(t,e,n,s,r){t.getClearColor(this._oldClearColor),this.oldClearAlpha=t.getClearAlpha();let o=t.autoClear;t.autoClear=!1,t.setClearColor(this.clearColor,0),r&&t.state.buffers.stencil.setTest(!1),this.renderToScreen&&(this.fsQuad.material=this.basic,this.basic.map=n.texture,t.setRenderTarget(null),t.clear(),this.fsQuad.render(t)),this.highPassUniforms.tDiffuse.value=n.texture,this.highPassUniforms.luminosityThreshold.value=this.threshold,this.fsQuad.material=this.materialHighPassFilter,t.setRenderTarget(this.renderTargetBright),t.clear(),this.fsQuad.render(t);let a=this.renderTargetBright;for(let l=0;l<this.nMips;l++)this.fsQuad.material=this.separableBlurMaterials[l],this.separableBlurMaterials[l].uniforms.colorTexture.value=a.texture,this.separableBlurMaterials[l].uniforms.direction.value=i.BlurDirectionX,t.setRenderTarget(this.renderTargetsHorizontal[l]),t.clear(),this.fsQuad.render(t),this.separableBlurMaterials[l].uniforms.colorTexture.value=this.renderTargetsHorizontal[l].texture,this.separableBlurMaterials[l].uniforms.direction.value=i.BlurDirectionY,t.setRenderTarget(this.renderTargetsVertical[l]),t.clear(),this.fsQuad.render(t),a=this.renderTargetsVertical[l];this.fsQuad.material=this.compositeMaterial,this.compositeMaterial.uniforms.bloomStrength.value=this.strength,this.compositeMaterial.uniforms.bloomRadius.value=this.radius,this.compositeMaterial.uniforms.bloomTintColors.value=this.bloomTintColors,t.setRenderTarget(this.renderTargetsHorizontal[0]),t.clear(),this.fsQuad.render(t),this.fsQuad.material=this.blendMaterial,this.copyUniforms.tDiffuse.value=this.renderTargetsHorizontal[0].texture,r&&t.state.buffers.stencil.setTest(!0),this.renderToScreen?(t.setRenderTarget(null),this.fsQuad.render(t)):(t.setRenderTarget(n),this.fsQuad.render(t)),t.setClearColor(this._oldClearColor,this.oldClearAlpha),t.autoClear=o}getSeperableBlurMaterial(t){let e=[];for(let n=0;n<t;n++)e.push(.39894*Math.exp(-.5*n*n/(t*t))/t);return new ue({defines:{KERNEL_RADIUS:t},uniforms:{colorTexture:{value:null},invSize:{value:new Lt(.5,.5)},direction:{value:new Lt(.5,.5)},gaussianCoefficients:{value:e}},vertexShader:`varying vec2 vUv;\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}`,fragmentShader:`#include <common>\n\t\t\t\tvarying vec2 vUv;\n\t\t\t\tuniform sampler2D colorTexture;\n\t\t\t\tuniform vec2 invSize;\n\t\t\t\tuniform vec2 direction;\n\t\t\t\tuniform float gaussianCoefficients[KERNEL_RADIUS];\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tfloat weightSum = gaussianCoefficients[0];\n\t\t\t\t\tvec3 diffuseSum = texture2D( colorTexture, vUv ).rgb * weightSum;\n\t\t\t\t\tfor( int i = 1; i < KERNEL_RADIUS; i ++ ) {\n\t\t\t\t\t\tfloat x = float(i);\n\t\t\t\t\t\tfloat w = gaussianCoefficients[i];\n\t\t\t\t\t\tvec2 uvOffset = direction * invSize * x;\n\t\t\t\t\t\tvec3 sample1 = texture2D( colorTexture, vUv + uvOffset ).rgb;\n\t\t\t\t\t\tvec3 sample2 = texture2D( colorTexture, vUv - uvOffset ).rgb;\n\t\t\t\t\t\tdiffuseSum += (sample1 + sample2) * w;\n\t\t\t\t\t\tweightSum += 2.0 * w;\n\t\t\t\t\t}\n\t\t\t\t\tgl_FragColor = vec4(diffuseSum/weightSum, 1.0);\n\t\t\t\t}`})}getCompositeMaterial(t){return new ue({defines:{NUM_MIPS:t},uniforms:{blurTexture1:{value:null},blurTexture2:{value:null},blurTexture3:{value:null},blurTexture4:{value:null},blurTexture5:{value:null},bloomStrength:{value:1},bloomFactors:{value:null},bloomTintColors:{value:null},bloomRadius:{value:0}},vertexShader:`varying vec2 vUv;\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}`,fragmentShader:`varying vec2 vUv;\n\t\t\t\tuniform sampler2D blurTexture1;\n\t\t\t\tuniform sampler2D blurTexture2;\n\t\t\t\tuniform sampler2D blurTexture3;\n\t\t\t\tuniform sampler2D blurTexture4;\n\t\t\t\tuniform sampler2D blurTexture5;\n\t\t\t\tuniform float bloomStrength;\n\t\t\t\tuniform float bloomRadius;\n\t\t\t\tuniform float bloomFactors[NUM_MIPS];\n\t\t\t\tuniform vec3 bloomTintColors[NUM_MIPS];\n\n\t\t\t\tfloat lerpBloomFactor(const in float factor) {\n\t\t\t\t\tfloat mirrorFactor = 1.2 - factor;\n\t\t\t\t\treturn mix(factor, mirrorFactor, bloomRadius);\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tgl_FragColor = bloomStrength * ( lerpBloomFactor(bloomFactors[0]) * vec4(bloomTintColors[0], 1.0) * texture2D(blurTexture1, vUv) +\n\t\t\t\t\t\tlerpBloomFactor(bloomFactors[1]) * vec4(bloomTintColors[1], 1.0) * texture2D(blurTexture2, vUv) +\n\t\t\t\t\t\tlerpBloomFactor(bloomFactors[2]) * vec4(bloomTintColors[2], 1.0) * texture2D(blurTexture3, vUv) +\n\t\t\t\t\t\tlerpBloomFactor(bloomFactors[3]) * vec4(bloomTintColors[3], 1.0) * texture2D(blurTexture4, vUv) +\n\t\t\t\t\t\tlerpBloomFactor(bloomFactors[4]) * vec4(bloomTintColors[4], 1.0) * texture2D(blurTexture5, vUv) );\n\t\t\t\t}`})}};mi.BlurDirectionX=new Lt(1,0);mi.BlurDirectionY=new Lt(0,1);(function(){\"use strict\";let t=\"__brainableInnovationFlux\";if(window[t])return;let e=[\"INNOVATION SYSTEM OF BRAINABLE\",\"INNOVATIVE SYSTEMS OF BRAINABLE\"],n=\"\\uBE0C\\uB808\\uC778\\uC5D0\\uC774\\uBE14\\uB9CC\\uC758 \\uD601\\uC2E0 \\uC2DC\\uC2A4\\uD15C\",s=[\"\\uB3C5\\uC790\\uC801\\uC778 \\uC5F0\\uAD6C\\uAC1C\\uBC1C\",\"\\uC804\\uBB38\\uC801\\uC778 \\uC758\\uB8CC \\uC5F0\\uACC4 \\uC2DC\\uC2A4\\uD15C\",\"\\uC9C0\\uC18D\\uC801\\uC778 \\uD655\\uC7A5\"],r=\"#050505\",o=30,a=1.5,l=T=>String(T||\"\").replace(/\\s+/g,\"\"),c=matchMedia(\"(prefers-reduced-motion: reduce)\"),h=null,d=!1,f=0,m=document.createElement(\"style\");m.id=\"brainable-innovation-flux-style\",m.textContent=`\n    [data-bif=\"section\"]{position:relative!important;isolation:isolate;background:${r}!important;}\n    [data-bif=\"old-background\"]{display:none!important;}\n    [data-bif=\"content\"],[data-bif=\"mobile-content\"]{position:relative!important;z-index:1!important;}\n    [data-bif=\"section\"] h2,[data-bif=\"section\"] p,[data-bif=\"section\"] span{font-family:'Noto Sans KR',sans-serif!important;}\n    [data-bif=\"background\"]{position:absolute!important;inset:0!important;width:100%!important;height:100%!important;\n      margin:0!important;padding:0!important;z-index:0!important;pointer-events:none!important;overflow:hidden!important;\n      background:${r}!important;}\n    [data-bif=\"background\"] canvas{display:block!important;width:100%!important;height:100%!important;\n      margin:0!important;padding:0!important;border:0!important;outline:0!important;pointer-events:none!important;}\n    @media(max-width:379px){\n      [data-bif=\"section\"]:has([data-bif=\"mobile-copy\"]){height:auto!important;min-height:1262px!important;}\n      [data-bif=\"mobile-content\"]{width:100%!important;height:auto!important;min-width:0!important;display:block!important;}\n      [data-bif=\"mobile-frame\"]{position:relative!important;inset:auto!important;transform:none!important;\n        box-sizing:border-box!important;width:100%!important;height:auto!important;min-height:1262px!important;\n        padding:145px 24px 100px!important;display:block!important;}\n      [data-bif=\"mobile-copy\"]{width:min(323px,100%)!important;max-width:100%!important;min-width:0!important;height:auto!important;margin:0 auto!important;}\n      [data-bif=\"mobile-copy\"] div,[data-bif=\"mobile-copy\"] section{max-width:100%!important;min-width:0!important;}\n      [data-bif=\"mobile-copy\"]>div:last-child{width:100%!important;height:auto!important;gap:48px!important;}\n      [data-bif=\"mobile-copy\"] section{width:100%!important;height:auto!important;margin-bottom:0!important;justify-content:flex-start!important;}\n      [data-bif=\"mobile-copy\"] .textContents{width:100%!important;max-width:100%!important;min-width:0!important;height:auto!important;}\n      [data-bif=\"mobile-copy\"] p,[data-bif=\"mobile-copy\"] h2{max-width:100%!important;min-width:0!important;height:auto!important;\n        white-space:normal!important;word-break:keep-all!important;overflow-wrap:break-word!important;}\n    }\n  `,document.head.appendChild(m);function g(T,E,L){L.push([T,T.getAttribute(\"data-bif\")]),T.setAttribute(\"data-bif\",E)}function x(){let T=Array.from(document.querySelectorAll(\"main h2\")).filter(L=>e.some(F=>l(L.textContent)===l(F))),E=[];for(let L of T){let F=null;for(let I=L.parentElement;I&&I.tagName!==\"MAIN\";I=I.parentElement){let G=Array.from(I.querySelectorAll(\"h2,p\")).map(et=>l(et.textContent));if(!G.includes(l(n))||!s.every(et=>G.includes(l(et))))continue;!F&&l(L.textContent)===l(e[1])&&(F=I);let X=Array.from(I.children).find(et=>et.getAttribute(\"aria-hidden\")===\"true\"&&et.querySelector('img[alt=\"\"]')),Z=Array.from(I.children).find(et=>et.contains(L)),$=l(L.textContent)===l(e[1])&&I.parentElement?.tagName===\"MAIN\";if(Z&&Z!==X&&(X||$)){E.push({section:I,background:X||null,content:Z,mobileCopy:$?F:null,mobileFrame:$?F?.parentElement:null});break}}}return E.length===1?E[0]:null}function p(T){if(!T.gpu)return;let E=T.gpu;T.gpu=null,E.scene.traverse(L=>{L.geometry&&L.geometry.dispose(),L.material&&(Array.isArray(L.material)?L.material:[L.material]).forEach(I=>I.dispose())}),E.bloomPass.dispose(),E.composer.dispose(),E.renderer.dispose(),E.renderer.forceContextLoss()}function u(T){let E=new Rs;E.background=new Pt(328965),E.fog=new Cs(328965,.04);let L=new ve(75,T.width/Math.max(1,T.height),.1,100);L.position.z=7;let F;try{let dt=function(gt,M){let _=[];for(let tt=0;tt<400;tt++){let ft=tt/399,rt=ft*Math.PI*14+gt,ct=.2+ft*2.8,yt=(.5-ft)*6;_.push(new N(Math.cos(rt)*ct,yt,Math.sin(rt)*ct))}let Q=new Se().setFromPoints(_),J=new Ri({color:M,transparent:!0,opacity:.15,blending:_n});return new Ps(Q,J)};F=new Ci({canvas:T.canvas,antialias:!1,powerPreference:\"high-performance\",alpha:!1}),F.setPixelRatio(T.dpr),F.setSize(T.width,T.height,!1),F.toneMapping=sa,F.toneMappingExposure=1;let I=new fn;E.add(I);let G=9500,X=new Float32Array(G*3),Z=new Float32Array(G),$=new Float32Array(G),et=new Float32Array(G),W=new Float32Array(G);for(let gt=0;gt<G;gt++){let M=gt*3,_=(Math.random()-.5)*7.5,B=.4+Math.abs(_)*.2,Q=(.1+Math.pow(Math.random(),1.5)*2.5)*B,J=Math.random()*Math.PI*2;et[gt]=_,Z[gt]=Q,$[gt]=J,W[gt]=.5+Math.random()*.8,X[M]=Math.cos(J)*Q,X[M+1]=_,X[M+2]=Math.sin(J)*Q}let q=new Se;q.setAttribute(\"position\",new ye(X,3));let st=new hi({size:.006,color:14540253,transparent:!0,opacity:.6,blending:_n,depthWrite:!1}),pt=new Pi(q,st);I.add(pt);let bt=dt(0,5592405),Et=dt(Math.PI,14540253);I.add(bt),I.add(Et);let vt=new Se,kt=300,O=new Float32Array(kt*3);for(let gt=0;gt<kt*3;gt++)O[gt]=(Math.random()-.5)*12;vt.setAttribute(\"position\",new ye(O,3));let le=new hi({size:.008,color:5592405,transparent:!0,opacity:.4,blending:_n}),_t=new Pi(vt,le);E.add(_t);let At=new zs(E,L),ht=new mi(new Lt(T.width,T.height),1,.4,.85);ht.strength=.6,ht.radius=.3,ht.threshold=.2;let Xt=new Bs(F);return Xt.addPass(At),Xt.addPass(ht),T.gpu={scene:E,camera:L,renderer:F,mainGroup:I,vortexGeometry:q,vortexCount:G,vortexRadius:Z,vortexAngle:$,vortexHeight:et,vortexSpeed:W,spiralLineA:bt,spiralLineB:Et,particlesMesh:_t,composer:Xt,bloomPass:ht},T.error=null,!0}catch(I){return E.traverse(G=>{G.geometry?.dispose(),G.material?.dispose()}),F&&F.dispose(),T.error=String(I?.message||I),T.state=\"webgl-unavailable\",!1}}function w(T,E,L=1/60){if(!T.gpu)return;let F=performance.now(),I=T.gpu,G=T.mouseX*.001,X=T.mouseY*8e-4,Z=L*60,$=1-Math.pow(1-.03,Z),et=.002*(1-.03)/.03;I.mainGroup.rotation.y+=$*(G+et-I.mainGroup.rotation.y),I.mainGroup.rotation.x+=$*(X-I.mainGroup.rotation.x);let W=I.vortexGeometry.attributes.position.array;for(let q=0;q<I.vortexCount;q++){let st=q*3,pt=E*I.vortexSpeed[q]*.5+I.vortexHeight[q]*.5,dt=I.vortexAngle[q]+pt,bt=Math.sin(E*1.2+q*.01)*.05,Et=I.vortexRadius[q]+bt;W[st]=Math.cos(dt)*Et,W[st+1]=I.vortexHeight[q]+Math.sin(E+q*.02)*.03,W[st+2]=Math.sin(dt)*Et}I.vortexGeometry.attributes.position.needsUpdate=!0,I.spiralLineA.rotation.y=E*.15,I.spiralLineB.rotation.y=-E*.12,I.particlesMesh.rotation.y=E*.03,I.particlesMesh.rotation.x=-T.mouseY*1e-4;try{I.composer.render(),T.frames+=1,T.renderCost=performance.now()-F,T.renderMax=Math.max(T.renderMax,T.renderCost)}catch(q){T.error=String(q?.message||q),T.state=\"render-unavailable\",v(T)}}function v(T){T.raf&&cancelAnimationFrame(T.raf),T.raf=0,T.last=0}function P(T){let E=h;if(!E||!E.raf)return;if(!E.visible||document.hidden||c.matches||E.error){v(E),U();return}E.last===0&&(E.last=T);let L=T-E.last;if(L>=1e3/o-.5){let F=Math.min(L/1e3,.1);E.elapsed+=F,E.last=T,w(E,E.elapsed,F)}E.error||(E.raf=requestAnimationFrame(P))}function U(){let T=h;if(T){if(T.error){v(T);return}if(!T.visible||document.hidden){v(T),T.state=document.hidden?\"document-hidden\":\"offscreen\";return}if(!(!T.gpu&&!u(T))){if(c.matches){v(T),T.state=\"reduced-motion\",w(T,T.elapsed||.76);return}T.state=\"running\",T.raf||(w(T,T.elapsed),T.error||(T.raf=requestAnimationFrame(P)))}}}function R(T){let E=T.section.getBoundingClientRect(),L=Math.max(1,Math.round(E.width)),F=Math.max(1,Math.round(E.height)),I=Math.min(devicePixelRatio||1,a);T.width===L&&T.height===F&&T.dpr===I||(T.width=L,T.height=F,T.dpr=I,T.gpu&&(T.gpu.camera.aspect=L/F,T.gpu.camera.updateProjectionMatrix(),T.gpu.renderer.setPixelRatio(I),T.gpu.renderer.setSize(L,F,!1),T.gpu.composer.setPixelRatio(I),T.gpu.composer.setSize(L,F),T.visible&&!document.hidden&&w(T,T.elapsed||.76)))}function C(){let T=h;T&&(h=null,v(T),Y.unobserve(T.section),T.resize.disconnect(),T.section.removeEventListener(\"pointermove\",T.pointer),T.section.removeEventListener(\"pointerleave\",T.leave),T.canvas.removeEventListener(\"webglcontextlost\",T.contextLost),T.canvas.removeEventListener(\"webglcontextrestored\",T.contextRestored),p(T),T.background.remove(),T.records.forEach(([E,L])=>L===null?E.removeAttribute(\"data-bif\"):E.setAttribute(\"data-bif\",L)))}let Y=new IntersectionObserver(T=>{let E=T.find(L=>L.target===h?.section);E&&h&&(h.visible=E.isIntersecting&&E.intersectionRatio>.01,U())},{threshold:[0,.01]});function S(T){let E=[];g(T.section,\"section\",E),T.background&&g(T.background,\"old-background\",E),g(T.content,T.mobileCopy?\"mobile-content\":\"content\",E),T.mobileFrame&&T.mobileFrame!==T.content&&g(T.mobileFrame,\"mobile-frame\",E),T.mobileCopy&&g(T.mobileCopy,\"mobile-copy\",E);let L=document.createElement(\"div\");L.setAttribute(\"data-bif\",\"background\"),L.setAttribute(\"aria-hidden\",\"true\");let F=document.createElement(\"canvas\");F.setAttribute(\"aria-hidden\",\"true\"),L.appendChild(F),T.section.prepend(L);let I={section:T.section,background:L,canvas:F,records:E,width:0,height:0,dpr:0,copy:Array.from(T.section.querySelectorAll(\"h2,p\")).map(G=>[G,G.textContent]),gpu:null,raf:0,last:0,elapsed:0,visible:!1,mouseX:0,mouseY:0,frames:0,state:\"waiting-visibility\",error:null,renderCost:0,renderMax:0};I.pointer=G=>{if(G.pointerType===\"touch\")return;let X=I.section.getBoundingClientRect();I.mouseX=G.clientX-X.left-X.width/2,I.mouseY=G.clientY-X.top-X.height/2},I.leave=()=>{I.mouseX=0,I.mouseY=0},I.contextLost=G=>{G.preventDefault(),I.error=\"WebGL context lost\",I.state=\"webgl-context-lost\",v(I)},I.contextRestored=()=>{I.error=null,I.state=\"restoring\",requestAnimationFrame(()=>{h!==I||d||(R(I),U())})},I.resize=new ResizeObserver(()=>R(I)),h=I,R(I),I.resize.observe(I.section),I.section.addEventListener(\"pointermove\",I.pointer,{passive:!0}),I.section.addEventListener(\"pointerleave\",I.leave,{passive:!0}),F.addEventListener(\"webglcontextlost\",I.contextLost),F.addEventListener(\"webglcontextrestored\",I.contextRestored),Y.observe(I.section)}function b(){if(f=0,d)return;if(!/^\\/about_us\\/?$/.test(location.pathname)){C();return}let T=x();if(h?.section===T?.section){h&&R(h);return}C(),T&&S(T)}function H(){!d&&!f&&(f=requestAnimationFrame(b))}let K=new MutationObserver(T=>{T.some(E=>!E.target.closest?.('[data-bif=\"background\"]'))&&H()});K.observe(document.body,{childList:!0,subtree:!0}),window.addEventListener(\"popstate\",H),window.addEventListener(\"pageshow\",H),window.addEventListener(\"resize\",H,{passive:!0}),document.addEventListener(\"visibilitychange\",U),c.addEventListener(\"change\",U),window[t]={version:\"innovation-flux-1\",inspect(){let T=h;return{matched:!!T,active:!!T?.gpu,state:T?.state||\"unmatched\",running:!!T?.raf,inViewport:T?.visible||!1,reducedMotion:c.matches,documentHidden:document.hidden,originalTextRetained:T?T.copy.every(([E,L])=>E.isConnected&&E.textContent===L):null,width:T?.width||0,height:T?.height||0,dpr:T?.dpr||0,frames:T?.frames||0,elapsed:T?.elapsed||0,renderCost:T?.renderCost||0,renderMax:T?.renderMax||0,error:T?.error||null,background:r,colors:[\"#dddddd\",\"#555555\"],vortexParticles:9500,ambientParticles:300,maxFPS:o,maxDPR:a,threeVersion:\"0.160.0\",source:\"MengTo/threeui@68802d5428071ada5c20db8094b1649e6bb770ed\"}},destroy(){d=!0,K.disconnect(),Y.disconnect(),f&&cancelAnimationFrame(f),window.removeEventListener(\"popstate\",H),window.removeEventListener(\"pageshow\",H),window.removeEventListener(\"resize\",H),document.removeEventListener(\"visibilitychange\",U),c.removeEventListener(\"change\",U),C(),m.remove(),delete window[t]}},b()})();})();\n\n\n/* BRAINABLE production global: home-liquid */\n/*\nBRAINABLE HOME Liquid Metal adaptation, 2026-09-30.\nCult/ui source adapted to native product copy and route-scoped DOM lifecycle.\nPaper Shaders 0.0.71 rendering code unmodified; image/parameters from upstream.\n\nMIT License\n\nCopyright (c) 2023 Jordan-Gilliam\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\nMIT License\n\nCopyright (c) 2024 Lost Coast Labs, Inc. (Paper Design)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n*/\n(()=>{var ft=Object.defineProperty;var gt=(o,e,i)=>e in o?ft(o,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):o[e]=i;var m=(o,e,i)=>gt(o,typeof e!=\"symbol\"?e+\"\":e,i);var it=`#version 300 es\nprecision mediump float;\n\nlayout(location = 0) in vec4 a_position;\n\nuniform vec2 u_resolution;\nuniform float u_pixelRatio;\nuniform float u_imageAspectRatio;\nuniform float u_originX;\nuniform float u_originY;\nuniform float u_worldWidth;\nuniform float u_worldHeight;\nuniform float u_fit;\nuniform float u_scale;\nuniform float u_rotation;\nuniform float u_offsetX;\nuniform float u_offsetY;\n\nout vec2 v_objectUV;\nout vec2 v_objectBoxSize;\nout vec2 v_responsiveUV;\nout vec2 v_responsiveBoxGivenSize;\nout vec2 v_patternUV;\nout vec2 v_patternBoxSize;\nout vec2 v_imageUV;\n\nvec3 getBoxSize(float boxRatio, vec2 givenBoxSize) {\n  vec2 box = vec2(0.);\n  // fit = none\n  box.x = boxRatio * min(givenBoxSize.x / boxRatio, givenBoxSize.y);\n  float noFitBoxWidth = box.x;\n  if (u_fit == 1.) { // fit = contain\n    box.x = boxRatio * min(u_resolution.x / boxRatio, u_resolution.y);\n  } else if (u_fit == 2.) { // fit = cover\n    box.x = boxRatio * max(u_resolution.x / boxRatio, u_resolution.y);\n  }\n  box.y = box.x / boxRatio;\n  return vec3(box, noFitBoxWidth);\n}\n\nvoid main() {\n  gl_Position = a_position;\n\n  vec2 uv = gl_Position.xy * .5;\n  vec2 boxOrigin = vec2(.5 - u_originX, u_originY - .5);\n  vec2 givenBoxSize = vec2(u_worldWidth, u_worldHeight);\n  givenBoxSize = max(givenBoxSize, vec2(1.)) * u_pixelRatio;\n  float r = u_rotation * 3.14159265358979323846 / 180.;\n  mat2 graphicRotation = mat2(cos(r), sin(r), -sin(r), cos(r));\n  vec2 graphicOffset = vec2(-u_offsetX, u_offsetY);\n\n\n  // ===================================================\n\n  float fixedRatio = 1.;\n  vec2 fixedRatioBoxGivenSize = vec2(\n  (u_worldWidth == 0.) ? u_resolution.x : givenBoxSize.x,\n  (u_worldHeight == 0.) ? u_resolution.y : givenBoxSize.y\n  );\n\n  v_objectBoxSize = getBoxSize(fixedRatio, fixedRatioBoxGivenSize).xy;\n  vec2 objectWorldScale = u_resolution.xy / v_objectBoxSize;\n\n  v_objectUV = uv;\n  v_objectUV *= objectWorldScale;\n  v_objectUV += boxOrigin * (objectWorldScale - 1.);\n  v_objectUV += graphicOffset;\n  v_objectUV /= u_scale;\n  v_objectUV = graphicRotation * v_objectUV;\n\n  // ===================================================\n\n  v_responsiveBoxGivenSize = vec2(\n  (u_worldWidth == 0.) ? u_resolution.x : givenBoxSize.x,\n  (u_worldHeight == 0.) ? u_resolution.y : givenBoxSize.y\n  );\n  float responsiveRatio = v_responsiveBoxGivenSize.x / v_responsiveBoxGivenSize.y;\n  vec2 responsiveBoxSize = getBoxSize(responsiveRatio, v_responsiveBoxGivenSize).xy;\n  vec2 responsiveBoxScale = u_resolution.xy / responsiveBoxSize;\n\n  #ifdef ADD_HELPERS\n  v_responsiveHelperBox = uv;\n  v_responsiveHelperBox *= responsiveBoxScale;\n  v_responsiveHelperBox += boxOrigin * (responsiveBoxScale - 1.);\n  #endif\n\n  v_responsiveUV = uv;\n  v_responsiveUV *= responsiveBoxScale;\n  v_responsiveUV += boxOrigin * (responsiveBoxScale - 1.);\n  v_responsiveUV += graphicOffset;\n  v_responsiveUV /= u_scale;\n  v_responsiveUV.x *= responsiveRatio;\n  v_responsiveUV = graphicRotation * v_responsiveUV;\n  v_responsiveUV.x /= responsiveRatio;\n\n  // ===================================================\n\n  float patternBoxRatio = givenBoxSize.x / givenBoxSize.y;\n  vec2 patternBoxGivenSize = vec2(\n  (u_worldWidth == 0.) ? u_resolution.x : givenBoxSize.x,\n  (u_worldHeight == 0.) ? u_resolution.y : givenBoxSize.y\n  );\n  patternBoxRatio = patternBoxGivenSize.x / patternBoxGivenSize.y;\n\n  vec3 boxSizeData = getBoxSize(patternBoxRatio, patternBoxGivenSize);\n  v_patternBoxSize = boxSizeData.xy;\n  float patternBoxNoFitBoxWidth = boxSizeData.z;\n  vec2 patternBoxScale = u_resolution.xy / v_patternBoxSize;\n\n  v_patternUV = uv;\n  v_patternUV += graphicOffset / patternBoxScale;\n  v_patternUV += boxOrigin;\n  v_patternUV -= boxOrigin / patternBoxScale;\n  v_patternUV *= u_resolution.xy;\n  v_patternUV /= u_pixelRatio;\n  if (u_fit > 0.) {\n    v_patternUV *= (patternBoxNoFitBoxWidth / v_patternBoxSize.x);\n  }\n  v_patternUV /= u_scale;\n  v_patternUV = graphicRotation * v_patternUV;\n  v_patternUV += boxOrigin / patternBoxScale;\n  v_patternUV -= boxOrigin;\n  // x100 is a default multiplier between vertex and fragmant shaders\n  // we use it to avoid UV presision issues\n  v_patternUV *= .01;\n\n  // ===================================================\n\n  vec2 imageBoxSize;\n  if (u_fit == 1.) { // contain\n    imageBoxSize.x = min(u_resolution.x / u_imageAspectRatio, u_resolution.y) * u_imageAspectRatio;\n  } else if (u_fit == 2.) { // cover\n    imageBoxSize.x = max(u_resolution.x / u_imageAspectRatio, u_resolution.y) * u_imageAspectRatio;\n  } else {\n    imageBoxSize.x = min(10.0, 10.0 / u_imageAspectRatio * u_imageAspectRatio);\n  }\n  imageBoxSize.y = imageBoxSize.x / u_imageAspectRatio;\n  vec2 imageBoxScale = u_resolution.xy / imageBoxSize;\n\n  v_imageUV = uv;\n  v_imageUV *= imageBoxScale;\n  v_imageUV += boxOrigin * (imageBoxScale - 1.);\n  v_imageUV += graphicOffset;\n  v_imageUV /= u_scale;\n  v_imageUV.x *= u_imageAspectRatio;\n  v_imageUV = graphicRotation * v_imageUV;\n  v_imageUV.x /= u_imageAspectRatio;\n\n  v_imageUV += .5;\n  v_imageUV.y = 1. - v_imageUV.y;\n}`;var at=1920*1080*4,Z=class{constructor(e,i,r,s,l=0,h=0,a=2,y=at,c=[]){m(this,\"parentElement\");m(this,\"canvasElement\");m(this,\"gl\");m(this,\"program\",null);m(this,\"uniformLocations\",{});m(this,\"fragmentShader\");m(this,\"rafId\",null);m(this,\"lastRenderTime\",0);m(this,\"currentFrame\",0);m(this,\"speed\",0);m(this,\"currentSpeed\",0);m(this,\"providedUniforms\");m(this,\"mipmaps\",[]);m(this,\"hasBeenDisposed\",!1);m(this,\"resolutionChanged\",!0);m(this,\"textures\",new Map);m(this,\"minPixelRatio\");m(this,\"maxPixelCount\");m(this,\"isSafari\",bt());m(this,\"uniformCache\",{});m(this,\"textureUnitMap\",new Map);m(this,\"initProgram\",()=>{let e=xt(this.gl,it,this.fragmentShader);e&&(this.program=e)});m(this,\"setupPositionAttribute\",()=>{let e=this.gl.getAttribLocation(this.program,\"a_position\"),i=this.gl.createBuffer();this.gl.bindBuffer(this.gl.ARRAY_BUFFER,i);let r=[-1,-1,1,-1,-1,1,-1,1,1,-1,1,1];this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array(r),this.gl.STATIC_DRAW),this.gl.enableVertexAttribArray(e),this.gl.vertexAttribPointer(e,2,this.gl.FLOAT,!1,0,0)});m(this,\"setupUniforms\",()=>{let e={u_time:this.gl.getUniformLocation(this.program,\"u_time\"),u_pixelRatio:this.gl.getUniformLocation(this.program,\"u_pixelRatio\"),u_resolution:this.gl.getUniformLocation(this.program,\"u_resolution\")};Object.entries(this.providedUniforms).forEach(([i,r])=>{if(e[i]=this.gl.getUniformLocation(this.program,i),r instanceof HTMLImageElement){let s=`${i}AspectRatio`;e[s]=this.gl.getUniformLocation(this.program,s)}}),this.uniformLocations=e});m(this,\"renderScale\",1);m(this,\"parentWidth\",0);m(this,\"parentHeight\",0);m(this,\"parentDevicePixelWidth\",0);m(this,\"parentDevicePixelHeight\",0);m(this,\"devicePixelsSupported\",!1);m(this,\"resizeObserver\",null);m(this,\"setupResizeObserver\",()=>{this.resizeObserver=new ResizeObserver(([e])=>{if(e?.borderBoxSize[0]){let i=e.devicePixelContentBoxSize?.[0];i!==void 0&&(this.devicePixelsSupported=!0,this.parentDevicePixelWidth=i.inlineSize,this.parentDevicePixelHeight=i.blockSize),this.parentWidth=e.borderBoxSize[0].inlineSize,this.parentHeight=e.borderBoxSize[0].blockSize}this.handleResize()}),this.resizeObserver.observe(this.parentElement)});m(this,\"handleVisualViewportChange\",()=>{this.resizeObserver?.disconnect(),this.setupResizeObserver()});m(this,\"handleResize\",()=>{let e=0,i=0,r=Math.max(1,window.devicePixelRatio),s=visualViewport?.scale??1;if(this.devicePixelsSupported){let R=Math.max(1,this.minPixelRatio/r);e=this.parentDevicePixelWidth*R*s,i=this.parentDevicePixelHeight*R*s}else{let R=Math.max(r,this.minPixelRatio)*s;if(this.isSafari){let u=_t();R*=Math.max(1,u)}e=Math.round(this.parentWidth)*R,i=Math.round(this.parentHeight)*R}let l=Math.sqrt(this.maxPixelCount)/Math.sqrt(e*i),h=Math.min(1,l),a=Math.round(e*h),y=Math.round(i*h),c=a/Math.round(this.parentWidth);(this.canvasElement.width!==a||this.canvasElement.height!==y||this.renderScale!==c)&&(this.renderScale=c,this.canvasElement.width=a,this.canvasElement.height=y,this.resolutionChanged=!0,this.gl.viewport(0,0,this.gl.canvas.width,this.gl.canvas.height),this.render(performance.now()))});m(this,\"render\",e=>{if(this.hasBeenDisposed)return;if(this.program===null){console.warn(\"Tried to render before program or gl was initialized\");return}let i=e-this.lastRenderTime;this.lastRenderTime=e,this.currentSpeed!==0&&(this.currentFrame+=i*this.currentSpeed),this.gl.clear(this.gl.COLOR_BUFFER_BIT),this.gl.useProgram(this.program),this.gl.uniform1f(this.uniformLocations.u_time,this.currentFrame*.001),this.resolutionChanged&&(this.gl.uniform2f(this.uniformLocations.u_resolution,this.gl.canvas.width,this.gl.canvas.height),this.gl.uniform1f(this.uniformLocations.u_pixelRatio,this.renderScale),this.resolutionChanged=!1),this.gl.drawArrays(this.gl.TRIANGLES,0,6),this.currentSpeed!==0?this.requestRender():this.rafId=null});m(this,\"requestRender\",()=>{this.rafId!==null&&cancelAnimationFrame(this.rafId),this.rafId=requestAnimationFrame(this.render)});m(this,\"setTextureUniform\",(e,i)=>{if(!i.complete||i.naturalWidth===0)throw new Error(`Paper Shaders: image for uniform ${e} must be fully loaded`);let r=this.textures.get(e);r&&this.gl.deleteTexture(r),this.textureUnitMap.has(e)||this.textureUnitMap.set(e,this.textureUnitMap.size);let s=this.textureUnitMap.get(e);this.gl.activeTexture(this.gl.TEXTURE0+s);let l=this.gl.createTexture();this.gl.bindTexture(this.gl.TEXTURE_2D,l),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_S,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_T,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MIN_FILTER,this.gl.LINEAR),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MAG_FILTER,this.gl.LINEAR),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,this.gl.RGBA,this.gl.UNSIGNED_BYTE,i),this.mipmaps.includes(e)&&(this.gl.generateMipmap(this.gl.TEXTURE_2D),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MIN_FILTER,this.gl.LINEAR_MIPMAP_LINEAR));let h=this.gl.getError();if(h!==this.gl.NO_ERROR||l===null){console.error(\"Paper Shaders: WebGL error when uploading texture:\",h);return}this.textures.set(e,l);let a=this.uniformLocations[e];if(a){this.gl.uniform1i(a,s);let y=`${e}AspectRatio`,c=this.uniformLocations[y];if(c){let R=i.naturalWidth/i.naturalHeight;this.gl.uniform1f(c,R)}}});m(this,\"areUniformValuesEqual\",(e,i)=>e===i?!0:Array.isArray(e)&&Array.isArray(i)&&e.length===i.length?e.every((r,s)=>this.areUniformValuesEqual(r,i[s])):!1);m(this,\"setUniformValues\",e=>{this.gl.useProgram(this.program),Object.entries(e).forEach(([i,r])=>{let s=r;if(r instanceof HTMLImageElement&&(s=`${r.src.slice(0,200)}|${r.naturalWidth}x${r.naturalHeight}`),this.areUniformValuesEqual(this.uniformCache[i],s))return;this.uniformCache[i]=s;let l=this.uniformLocations[i];if(!l){console.warn(`Uniform location for ${i} not found`);return}if(r instanceof HTMLImageElement)this.setTextureUniform(i,r);else if(Array.isArray(r)){let h=null,a=null;if(r[0]!==void 0&&Array.isArray(r[0])){let y=r[0].length;if(r.every(c=>c.length===y))h=r.flat(),a=y;else{console.warn(`All child arrays must be the same length for ${i}`);return}}else h=r,a=h.length;switch(a){case 2:this.gl.uniform2fv(l,h);break;case 3:this.gl.uniform3fv(l,h);break;case 4:this.gl.uniform4fv(l,h);break;case 9:this.gl.uniformMatrix3fv(l,!1,h);break;case 16:this.gl.uniformMatrix4fv(l,!1,h);break;default:console.warn(`Unsupported uniform array length: ${a}`)}}else typeof r==\"number\"?this.gl.uniform1f(l,r):typeof r==\"boolean\"?this.gl.uniform1i(l,r?1:0):console.warn(`Unsupported uniform type for ${i}: ${typeof r}`)})});m(this,\"getCurrentFrame\",()=>this.currentFrame);m(this,\"setFrame\",e=>{this.currentFrame=e,this.lastRenderTime=performance.now(),this.render(performance.now())});m(this,\"setSpeed\",(e=1)=>{this.speed=e,this.setCurrentSpeed(document.hidden?0:e)});m(this,\"setCurrentSpeed\",e=>{this.currentSpeed=e,this.rafId===null&&e!==0&&(this.lastRenderTime=performance.now(),this.rafId=requestAnimationFrame(this.render)),this.rafId!==null&&e===0&&(cancelAnimationFrame(this.rafId),this.rafId=null)});m(this,\"setMaxPixelCount\",(e=at)=>{this.maxPixelCount=e,this.handleResize()});m(this,\"setMinPixelRatio\",(e=2)=>{this.minPixelRatio=e,this.handleResize()});m(this,\"setUniforms\",e=>{this.setUniformValues(e),this.providedUniforms={...this.providedUniforms,...e},this.render(performance.now())});m(this,\"handleDocumentVisibilityChange\",()=>{this.setCurrentSpeed(document.hidden?0:this.speed)});m(this,\"dispose\",()=>{this.hasBeenDisposed=!0,this.rafId!==null&&(cancelAnimationFrame(this.rafId),this.rafId=null),this.gl&&this.program&&(this.textures.forEach(e=>{this.gl.deleteTexture(e)}),this.textures.clear(),this.gl.deleteProgram(this.program),this.program=null,this.gl.bindBuffer(this.gl.ARRAY_BUFFER,null),this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER,null),this.gl.bindRenderbuffer(this.gl.RENDERBUFFER,null),this.gl.bindFramebuffer(this.gl.FRAMEBUFFER,null),this.gl.getError()),this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null),visualViewport?.removeEventListener(\"resize\",this.handleVisualViewportChange),document.removeEventListener(\"visibilitychange\",this.handleDocumentVisibilityChange),this.uniformLocations={},this.canvasElement.remove(),delete this.parentElement.paperShaderMount});if(e instanceof HTMLElement)this.parentElement=e;else throw new Error(\"Paper Shaders: parent element must be an HTMLElement\");if(!document.querySelector(\"style[data-paper-shader]\")){let v=document.createElement(\"style\");v.innerHTML=vt,v.setAttribute(\"data-paper-shader\",\"\"),document.head.prepend(v)}let R=document.createElement(\"canvas\");this.canvasElement=R,this.parentElement.prepend(R),this.fragmentShader=i,this.providedUniforms=r,this.mipmaps=c,this.currentFrame=h,this.minPixelRatio=a,this.maxPixelCount=y;let u=R.getContext(\"webgl2\",s);if(!u)throw new Error(\"Paper Shaders: WebGL is not supported in this browser\");this.gl=u,this.initProgram(),this.setupPositionAttribute(),this.setupUniforms(),this.setUniformValues(this.providedUniforms),this.setupResizeObserver(),visualViewport?.addEventListener(\"resize\",this.handleVisualViewportChange),this.setSpeed(l),this.parentElement.setAttribute(\"data-paper-shader\",\"\"),this.parentElement.paperShaderMount=this,document.addEventListener(\"visibilitychange\",this.handleDocumentVisibilityChange)}};function rt(o,e,i){let r=o.createShader(e);return r?(o.shaderSource(r,i),o.compileShader(r),o.getShaderParameter(r,o.COMPILE_STATUS)?r:(console.error(\"An error occurred compiling the shaders: \"+o.getShaderInfoLog(r)),o.deleteShader(r),null)):null}function xt(o,e,i){let r=o.getShaderPrecisionFormat(o.FRAGMENT_SHADER,o.MEDIUM_FLOAT),s=r?r.precision:null;s&&s<23&&(e=e.replace(/precision\\s+(lowp|mediump)\\s+float;/g,\"precision highp float;\"),i=i.replace(/precision\\s+(lowp|mediump)\\s+float/g,\"precision highp float\").replace(/\\b(uniform|varying|attribute)\\s+(lowp|mediump)\\s+(\\w+)/g,\"$1 highp $3\"));let l=rt(o,o.VERTEX_SHADER,e),h=rt(o,o.FRAGMENT_SHADER,i);if(!l||!h)return null;let a=o.createProgram();return a?(o.attachShader(a,l),o.attachShader(a,h),o.linkProgram(a),o.getProgramParameter(a,o.LINK_STATUS)?(o.detachShader(a,l),o.detachShader(a,h),o.deleteShader(l),o.deleteShader(h),a):(console.error(\"Unable to initialize the shader program: \"+o.getProgramInfoLog(a)),o.deleteProgram(a),o.deleteShader(l),o.deleteShader(h),null)):null}var vt=`@layer paper-shaders {\n  :where([data-paper-shader]) {\n    isolation: isolate;\n    position: relative;\n\n    & canvas {\n      contain: strict;\n      display: block;\n      position: absolute;\n      inset: 0;\n      z-index: -1;\n      width: 100%;\n      height: 100%;\n      border-radius: inherit;\n      corner-shape: inherit;\n    }\n  }\n}`;function bt(){let o=navigator.userAgent.toLowerCase();return o.includes(\"safari\")&&!o.includes(\"chrome\")&&!o.includes(\"android\")}function _t(){let o=visualViewport?.scale??1,e=visualViewport?.width??window.innerWidth,i=window.innerWidth-document.documentElement.clientWidth,r=o*e+i,s=outerWidth/r,l=Math.round(100*s);return l%5===0?l/100:l===33?1/3:l===67?2/3:l===133?4/3:s}var nt=`\n#define TWO_PI 6.28318530718\n#define PI 3.14159265358979323846\n`,st=`\nvec2 rotate(vec2 uv, float th) {\n  return mat2(cos(th), sin(th), -sin(th), cos(th)) * uv;\n}\n`;var mt=`\n  color += 1. / 256. * (fract(sin(dot(.014 * gl_FragCoord.xy, vec2(12.9898, 78.233))) * 43758.5453123) - .5);\n`,lt=`\nvec3 permute(vec3 x) { return mod(((x * 34.0) + 1.0) * x, 289.0); }\nfloat snoise(vec2 v) {\n  const vec4 C = vec4(0.211324865405187, 0.366025403784439,\n    -0.577350269189626, 0.024390243902439);\n  vec2 i = floor(v + dot(v, C.yy));\n  vec2 x0 = v - i + dot(i, C.xx);\n  vec2 i1;\n  i1 = (x0.x > x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0);\n  vec4 x12 = x0.xyxy + C.xxzz;\n  x12.xy -= i1;\n  i = mod(i, 289.0);\n  vec3 p = permute(permute(i.y + vec3(0.0, i1.y, 1.0))\n    + i.x + vec3(0.0, i1.x, 1.0));\n  vec3 m = max(0.5 - vec3(dot(x0, x0), dot(x12.xy, x12.xy),\n      dot(x12.zw, x12.zw)), 0.0);\n  m = m * m;\n  m = m * m;\n  vec3 x = 2.0 * fract(p * C.www) - 1.0;\n  vec3 h = abs(x) - 0.5;\n  vec3 ox = floor(x + 0.5);\n  vec3 a0 = x - ox;\n  m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h);\n  vec3 g;\n  g.x = a0.x * x0.x + h.x * x0.y;\n  g.yz = a0.yz * x12.xz + h.yz * x12.yw;\n  return 130.0 * dot(m, g);\n}\n`;var pt=`#version 300 es\nprecision mediump float;\n\nuniform sampler2D u_image;\nuniform float u_imageAspectRatio;\n\nuniform vec2 u_resolution;\nuniform float u_time;\n\nuniform vec4 u_colorBack;\nuniform vec4 u_colorTint;\n\nuniform float u_softness;\nuniform float u_repetition;\nuniform float u_shiftRed;\nuniform float u_shiftBlue;\nuniform float u_distortion;\nuniform float u_contour;\nuniform float u_angle;\n\nuniform float u_shape;\nuniform bool u_isImage;\n\nin vec2 v_objectUV;\nin vec2 v_responsiveUV;\nin vec2 v_responsiveBoxGivenSize;\nin vec2 v_imageUV;\n\nout vec4 fragColor;\n\n${nt}\n${st}\n${lt}\n\nfloat getColorChanges(float c1, float c2, float stripe_p, vec3 w, float blur, float bump, float tint) {\n\n  float ch = mix(c2, c1, smoothstep(.0, 2. * blur, stripe_p));\n\n  float border = w[0];\n  ch = mix(ch, c2, smoothstep(border, border + 2. * blur, stripe_p));\n\n  if (u_isImage == true) {\n    bump = smoothstep(.2, .8, bump);\n  }\n  border = w[0] + .4 * (1. - bump) * w[1];\n  ch = mix(ch, c1, smoothstep(border, border + 2. * blur, stripe_p));\n\n  border = w[0] + .5 * (1. - bump) * w[1];\n  ch = mix(ch, c2, smoothstep(border, border + 2. * blur, stripe_p));\n\n  border = w[0] + w[1];\n  ch = mix(ch, c1, smoothstep(border, border + 2. * blur, stripe_p));\n\n  float gradient_t = (stripe_p - w[0] - w[1]) / w[2];\n  float gradient = mix(c1, c2, smoothstep(0., 1., gradient_t));\n  ch = mix(ch, gradient, smoothstep(border, border + .5 * blur, stripe_p));\n\n  // Tint color is applied with color burn blending\n  ch = mix(ch, 1. - min(1., (1. - ch) / max(tint, 0.0001)), u_colorTint.a);\n  return ch;\n}\n\nfloat getImgFrame(vec2 uv, float th) {\n  float frame = 1.;\n  frame *= smoothstep(0., th, uv.y);\n  frame *= 1.0 - smoothstep(1. - th, 1., uv.y);\n  frame *= smoothstep(0., th, uv.x);\n  frame *= 1.0 - smoothstep(1. - th, 1., uv.x);\n  return frame;\n}\n\nfloat blurEdge3x3(sampler2D tex, vec2 uv, vec2 dudx, vec2 dudy, float radius, float centerSample) {\n  vec2 texel = 1.0 / vec2(textureSize(tex, 0));\n  vec2 r = radius * texel;\n\n  float w1 = 1.0, w2 = 2.0, w4 = 4.0;\n  float norm = 16.0;\n  float sum = w4 * centerSample;\n\n  sum += w2 * textureGrad(tex, uv + vec2(0.0, -r.y), dudx, dudy).r;\n  sum += w2 * textureGrad(tex, uv + vec2(0.0, r.y), dudx, dudy).r;\n  sum += w2 * textureGrad(tex, uv + vec2(-r.x, 0.0), dudx, dudy).r;\n  sum += w2 * textureGrad(tex, uv + vec2(r.x, 0.0), dudx, dudy).r;\n\n  sum += w1 * textureGrad(tex, uv + vec2(-r.x, -r.y), dudx, dudy).r;\n  sum += w1 * textureGrad(tex, uv + vec2(r.x, -r.y), dudx, dudy).r;\n  sum += w1 * textureGrad(tex, uv + vec2(-r.x, r.y), dudx, dudy).r;\n  sum += w1 * textureGrad(tex, uv + vec2(r.x, r.y), dudx, dudy).r;\n\n  return sum / norm;\n}\n\nfloat lst(float edge0, float edge1, float x) {\n  return clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n}\n\nvoid main() {\n\n  const float firstFrameOffset = 2.8;\n  float t = .3 * (u_time + firstFrameOffset);\n\n  vec2 uv = v_imageUV;\n  vec2 dudx = dFdx(v_imageUV);\n  vec2 dudy = dFdy(v_imageUV);\n  vec4 img = textureGrad(u_image, uv, dudx, dudy);\n\n  if (u_isImage == false) {\n    uv = v_objectUV + .5;\n    uv.y = 1. - uv.y;\n  }\n\n  float cycleWidth = u_repetition;\n  float edge = 0.;\n  float contOffset = 1.;\n\n  vec2 rotatedUV = uv - vec2(.5);\n  float angle = (-u_angle + 70.) * PI / 180.;\n  float cosA = cos(angle);\n  float sinA = sin(angle);\n  rotatedUV = vec2(\n  rotatedUV.x * cosA - rotatedUV.y * sinA,\n  rotatedUV.x * sinA + rotatedUV.y * cosA\n  ) + vec2(.5);\n\n  if (u_isImage == true) {\n    float edgeRaw = img.r;\n    edge = blurEdge3x3(u_image, uv, dudx, dudy, 6., edgeRaw);\n    edge = pow(edge, 1.6);\n    edge *= mix(0.0, 1.0, smoothstep(0.0, 0.4, u_contour));\n  } else {\n    if (u_shape < 1.) {\n      // full-fill on canvas\n      vec2 borderUV = v_responsiveUV + .5;\n      float ratio = v_responsiveBoxGivenSize.x / v_responsiveBoxGivenSize.y;\n      vec2 mask = min(borderUV, 1. - borderUV);\n      vec2 pixel_thickness = 250. / v_responsiveBoxGivenSize;\n      float maskX = smoothstep(0.0, pixel_thickness.x, mask.x);\n      float maskY = smoothstep(0.0, pixel_thickness.y, mask.y);\n      maskX = pow(maskX, .25);\n      maskY = pow(maskY, .25);\n      edge = clamp(1. - maskX * maskY, 0., 1.);\n\n      uv = v_responsiveUV;\n      if (ratio > 1.) {\n        uv.y /= ratio;\n      } else {\n        uv.x *= ratio;\n      }\n      uv += .5;\n      uv.y = 1. - uv.y;\n\n      cycleWidth *= 2.;\n      contOffset = 1.5;\n\n    } else if (u_shape < 2.) {\n      // circle\n      vec2 shapeUV = uv - .5;\n      shapeUV *= .67;\n      edge = pow(clamp(3. * length(shapeUV), 0., 1.), 18.);\n    } else if (u_shape < 3.) {\n      // daisy\n      vec2 shapeUV = uv - .5;\n      shapeUV *= 1.68;\n\n      float r = length(shapeUV) * 2.;\n      float a = atan(shapeUV.y, shapeUV.x) + .2;\n      r *= (1. + .05 * sin(3. * a + 2. * t));\n      float f = abs(cos(a * 3.));\n      edge = smoothstep(f, f + .7, r);\n      edge *= edge;\n\n      uv *= .8;\n      cycleWidth *= 1.6;\n\n    } else if (u_shape < 4.) {\n      // diamond\n      vec2 shapeUV = uv - .5;\n      shapeUV = rotate(shapeUV, .25 * PI);\n      shapeUV *= 1.42;\n      shapeUV += .5;\n      vec2 mask = min(shapeUV, 1. - shapeUV);\n      vec2 pixel_thickness = vec2(.15);\n      float maskX = smoothstep(0.0, pixel_thickness.x, mask.x);\n      float maskY = smoothstep(0.0, pixel_thickness.y, mask.y);\n      maskX = pow(maskX, .25);\n      maskY = pow(maskY, .25);\n      edge = clamp(1. - maskX * maskY, 0., 1.);\n    } else if (u_shape < 5.) {\n      // metaballs\n      vec2 shapeUV = uv - .5;\n      shapeUV *= 1.3;\n      edge = 0.;\n      for (int i = 0; i < 5; i++) {\n        float fi = float(i);\n        float speed = 1.5 + 2./3. * sin(fi * 12.345);\n        float angle = -fi * 1.5;\n        vec2 dir1 = vec2(cos(angle), sin(angle));\n        vec2 dir2 = vec2(cos(angle + 1.57), sin(angle + 1.));\n        vec2 traj = .4 * (dir1 * sin(t * speed + fi * 1.23) + dir2 * cos(t * (speed * 0.7) + fi * 2.17));\n        float d = length(shapeUV + traj);\n        edge += pow(1.0 - clamp(d, 0.0, 1.0), 4.0);\n      }\n      edge = 1. - smoothstep(.65, .9, edge);\n      edge = pow(edge, 4.);\n    }\n\n    edge = mix(smoothstep(.9 - 2. * fwidth(edge), .9, edge), edge, smoothstep(0.0, 0.4, u_contour));\n\n  }\n\n  float opacity = 0.;\n  if (u_isImage == true) {\n    opacity = img.g;\n    float frame = getImgFrame(v_imageUV, 0.);\n    opacity *= frame;\n  } else {\n    opacity = 1. - smoothstep(.9 - 2. * fwidth(edge), .9, edge);\n    if (u_shape < 2.) {\n      edge = 1.2 * edge;\n    } else if (u_shape < 5.) {\n      edge = 1.8 * pow(edge, 1.5);\n    }\n  }\n\n  float diagBLtoTR = rotatedUV.x - rotatedUV.y;\n  float diagTLtoBR = rotatedUV.x + rotatedUV.y;\n\n  vec3 color = vec3(0.);\n  vec3 color1 = vec3(.98, 0.98, 1.);\n  vec3 color2 = vec3(.1, .1, .1 + .1 * smoothstep(.7, 1.3, diagTLtoBR));\n\n  vec2 grad_uv = uv - .5;\n\n  float dist = length(grad_uv + vec2(0., .2 * diagBLtoTR));\n  grad_uv = rotate(grad_uv, (.25 - .2 * diagBLtoTR) * PI);\n  float direction = grad_uv.x;\n\n  float bump = pow(1.8 * dist, 1.2);\n  bump = 1. - bump;\n  bump *= pow(uv.y, .3);\n\n\n  float thin_strip_1_ratio = .12 / cycleWidth * (1. - .4 * bump);\n  float thin_strip_2_ratio = .07 / cycleWidth * (1. + .4 * bump);\n  float wide_strip_ratio = (1. - thin_strip_1_ratio - thin_strip_2_ratio);\n\n  float thin_strip_1_width = cycleWidth * thin_strip_1_ratio;\n  float thin_strip_2_width = cycleWidth * thin_strip_2_ratio;\n\n  float noise = snoise(uv - t);\n\n  edge += (1. - edge) * u_distortion * noise;\n\n  direction += diagBLtoTR;\n  float contour = 0.;\n  direction -= 2. * noise * diagBLtoTR * (smoothstep(0., 1., edge) * (1.0 - smoothstep(0., 1., edge)));\n  direction *= mix(1., 1. - edge, smoothstep(.5, 1., u_contour));\n  direction -= 1.7 * edge * smoothstep(.5, 1., u_contour);\n  direction += .2 * pow(u_contour, 4.) * (1.0 - smoothstep(0., 1., edge));\n\n  bump *= clamp(pow(uv.y, .1), .3, 1.);\n  direction *= (.1 + (1.1 - edge) * bump);\n\n  direction *= (.4 + .6 * (1.0 - smoothstep(.5, 1., edge)));\n  direction += .18 * (smoothstep(.1, .2, uv.y) * (1.0 - smoothstep(.2, .4, uv.y)));\n  direction += .03 * (smoothstep(.1, .2, 1. - uv.y) * (1.0 - smoothstep(.2, .4, 1. - uv.y)));\n\n  direction *= (.5 + .5 * pow(uv.y, 2.));\n  direction *= cycleWidth;\n  direction -= t;\n\n\n  float colorDispersion = (1. - bump);\n  colorDispersion = clamp(colorDispersion, 0., 1.);\n  float dispersionRed = colorDispersion;\n  dispersionRed += .03 * bump * noise;\n  dispersionRed += 5. * (smoothstep(-.1, .2, uv.y) * (1.0 - smoothstep(.1, .5, uv.y))) * (smoothstep(.4, .6, bump) * (1.0 - smoothstep(.4, 1., bump)));\n  dispersionRed -= diagBLtoTR;\n\n  float dispersionBlue = colorDispersion;\n  dispersionBlue *= 1.3;\n  dispersionBlue += (smoothstep(0., .4, uv.y) * (1.0 - smoothstep(.1, .8, uv.y))) * (smoothstep(.4, .6, bump) * (1.0 - smoothstep(.4, .8, bump)));\n  dispersionBlue -= .2 * edge;\n\n  dispersionRed *= (u_shiftRed / 20.);\n  dispersionBlue *= (u_shiftBlue / 20.);\n\n  float blur = 0.;\n  float rExtraBlur = 0.;\n  float gExtraBlur = 0.;\n  if (u_isImage == true) {\n    float softness = 0.05 * u_softness;\n    blur = softness + .5 * smoothstep(1., 10., u_repetition) * smoothstep(.0, 1., edge);\n    float smallCanvasT = 1.0 - smoothstep(100., 500., min(u_resolution.x, u_resolution.y));\n    blur += smallCanvasT * smoothstep(.0, 1., edge);\n    rExtraBlur = softness * (0.05 + .1 * (u_shiftRed / 20.) * bump);\n    gExtraBlur = softness * 0.05 / max(0.001, abs(1. - diagBLtoTR));\n  } else {\n    blur = u_softness / 15. + .3 * contour;\n  }\n\n  vec3 w = vec3(thin_strip_1_width, thin_strip_2_width, wide_strip_ratio);\n  w[1] -= .02 * smoothstep(.0, 1., edge + bump);\n  float stripe_r = fract(direction + dispersionRed);\n  float r = getColorChanges(color1.r, color2.r, stripe_r, w, blur + fwidth(stripe_r) + rExtraBlur, bump, u_colorTint.r);\n  float stripe_g = fract(direction);\n  float g = getColorChanges(color1.g, color2.g, stripe_g, w, blur + fwidth(stripe_g) + gExtraBlur, bump, u_colorTint.g);\n  float stripe_b = fract(direction - dispersionBlue);\n  float b = getColorChanges(color1.b, color2.b, stripe_b, w, blur + fwidth(stripe_b), bump, u_colorTint.b);\n\n  color = vec3(r, g, b);\n  color *= opacity;\n\n  vec3 bgColor = u_colorBack.rgb * u_colorBack.a;\n  color = color + bgColor * (1. - opacity);\n  opacity = opacity + u_colorBack.a * (1. - opacity);\n\n  ${mt}\n\n  fragColor = vec4(color, opacity);\n}\n`,O={measurePerformance:!1,workingSize:512,iterations:40};function dt(o){let e=document.createElement(\"canvas\"),i=e.getContext(\"2d\"),r=typeof o==\"string\"&&o.startsWith(\"blob:\");return new Promise((s,l)=>{if(!o||!i){l(new Error(\"Invalid file or canvas context\"));return}let h=r&&fetch(o).then(c=>c.headers.get(\"Content-Type\")),a=new Image;a.crossOrigin=\"anonymous\";let y=performance.now();a.onload=async()=>{let c,R=await h;R?c=R===\"image/svg+xml\":typeof o==\"string\"?c=o.endsWith(\".svg\")||o.startsWith(\"data:image/svg+xml\"):c=o.type===\"image/svg+xml\";let u=a.width||a.naturalWidth,v=a.height||a.naturalHeight;if(c){let x=u/v;u>v?(u=4096,v=4096/x):(v=4096,u=4096*x),a.width=u,a.height=v}let C=Math.min(u,v),b=O.workingSize/C,p=Math.round(u*b),_=Math.round(v*b);O.measurePerformance&&(console.log(\"[Processing Mode]\"),console.log(`  Original: ${u}\\xD7${v}`),console.log(`  Working: ${p}\\xD7${_} (${(b*100).toFixed(1)}% scale)`),b<1&&console.log(`  Speedup: ~${Math.round(1/(b*b))}\\xD7`)),e.width=u,e.height=v;let T=document.createElement(\"canvas\");T.width=p,T.height=_;let I=T.getContext(\"2d\");I.drawImage(a,0,0,p,_);let P=performance.now(),V=I.getImageData(0,0,p,_).data,U=new Uint8Array(p*_),X=new Uint8Array(p*_),W=0;for(let d=0,x=0;d<V.length;d+=4,x++){let z=V[d+3]===0?0:1;U[x]=z,W+=z}let j=[],k=[];for(let d=0;d<_;d++)for(let x=0;x<p;x++){let S=d*p+x;if(!U[S])continue;let z=!1;x===0||x===p-1||d===0||d===_-1?z=!0:z=!U[S-1]||!U[S+1]||!U[S-p]||!U[S+p]||!U[S-p-1]||!U[S-p+1]||!U[S+p-1]||!U[S+p+1],z?(X[S]=1,j.push(S)):k.push(S)}O.measurePerformance&&(console.log(`[Mask Building] Time: ${(performance.now()-P).toFixed(2)}ms`),console.log(`  Shape pixels: ${W} / ${p*_} (${(W/(p*_)*100).toFixed(1)}%)`),console.log(`  Interior pixels: ${k.length}`),console.log(`  Boundary pixels: ${j.length}`));let N=wt(U,X,new Uint32Array(k),new Uint32Array(j),p,_),Y=performance.now(),L=yt(N,U,X,p,_);O.measurePerformance&&console.log(`[Poisson Solve] Time: ${(performance.now()-Y).toFixed(2)}ms`);let t=0,n;for(let d=0;d<k.length;d++){let x=k[d];L[x]>t&&(t=L[x])}let f=document.createElement(\"canvas\");f.width=p,f.height=_;let E=f.getContext(\"2d\"),B=E.createImageData(p,_);for(let d=0;d<_;d++)for(let x=0;x<p;x++){let S=d*p+x,z=S*4;if(!U[S])B.data[z]=255,B.data[z+1]=255,B.data[z+2]=255,B.data[z+3]=0;else{let F=255*(1-L[S]/t);B.data[z]=F,B.data[z+1]=F,B.data[z+2]=F,B.data[z+3]=255}}E.putImageData(B,0,0),i.imageSmoothingEnabled=!0,i.imageSmoothingQuality=\"high\",i.drawImage(f,0,0,p,_,0,0,u,v);let g=i.getImageData(0,0,u,v),G=document.createElement(\"canvas\");G.width=u,G.height=v;let w=G.getContext(\"2d\");w.drawImage(a,0,0,u,v);let A=w.getImageData(0,0,u,v);for(let d=0;d<g.data.length;d+=4){let x=A.data[d+3],S=g.data[d+3];x===0?(g.data[d]=255,g.data[d+1]=0):(g.data[d]=S===0?0:g.data[d],g.data[d+1]=x),g.data[d+2]=255,g.data[d+3]=255}i.putImageData(g,0,0),n=g,e.toBlob(d=>{if(!d){l(new Error(\"Failed to create PNG blob\"));return}if(O.measurePerformance){let x=performance.now()-y;if(console.log(`[Total Processing Time] ${x.toFixed(2)}ms`),b<1){let S=x*Math.pow(u*v/(p*_),1.5);console.log(`[Estimated time at full resolution] ~${S.toFixed(0)}ms`),console.log(`[Time saved] ~${(S-x).toFixed(0)}ms (${Math.round(S/x)}\\xD7 faster)`)}}s({imageData:n,pngBlob:d})},\"image/png\")},a.onerror=()=>l(new Error(\"Failed to load image\")),a.src=typeof o==\"string\"?o:URL.createObjectURL(o)})}function wt(o,e,i,r,s,l){let h=i.length,a=new Int32Array(h*4);for(let y=0;y<h;y++){let c=i[y],R=c%s,u=Math.floor(c/s);a[y*4+0]=R<s-1&&o[c+1]?c+1:-1,a[y*4+1]=R>0&&o[c-1]?c-1:-1,a[y*4+2]=u>0&&o[c-s]?c-s:-1,a[y*4+3]=u<l-1&&o[c+s]?c+s:-1}return{interiorPixels:i,boundaryPixels:r,pixelCount:h,neighborIndices:a}}function yt(o,e,i,r,s){let l=O.iterations,h=.01,a=new Float32Array(r*s),{interiorPixels:y,neighborIndices:c,pixelCount:R}=o,u=performance.now(),v=1.9,C=[],q=[];for(let b=0;b<R;b++){let p=y[b],_=p%r,T=Math.floor(p/r);(_+T)%2===0?C.push(b):q.push(b)}for(let b=0;b<l;b++){for(let p of C){let _=y[p],T=c[p*4+0],I=c[p*4+1],P=c[p*4+2],M=c[p*4+3],V=0;T>=0&&(V+=a[T]),I>=0&&(V+=a[I]),P>=0&&(V+=a[P]),M>=0&&(V+=a[M]);let U=(h+V)/4;a[_]=v*U+(1-v)*a[_]}for(let p of q){let _=y[p],T=c[p*4+0],I=c[p*4+1],P=c[p*4+2],M=c[p*4+3],V=0;T>=0&&(V+=a[T]),I>=0&&(V+=a[I]),P>=0&&(V+=a[P]),M>=0&&(V+=a[M]);let U=(h+V)/4;a[_]=v*U+(1-v)*a[_]}}if(O.measurePerformance){let b=performance.now()-u;console.log(`[Optimized Poisson Solver (SOR \\u03C9=${v})]`),console.log(`  Working size: ${r}\\xD7${s}`),console.log(`  Iterations: ${l}`),console.log(`  Time: ${b.toFixed(2)}ms`),console.log(`  Interior pixels processed: ${R}`),console.log(`  Speed: ${(l*R/(b*1e3)).toFixed(2)} Mpixels/sec`)}return a}var ct=`<svg width=\"260\" height=\"478\" viewBox=\"0 0 260 478\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M130 216.896C106.106 216.896 86.6667 197.457 86.6667 173.563C86.6667 149.669 106.106 130.23 130 130.23C153.894 130.23 173.333 149.669 173.333 173.563C173.333 197.457 153.894 216.896 130 216.896ZM130 390.69C153.894 390.69 173.333 410.129 173.333 434.023C173.333 457.917 153.894 477.356 130 477.356C106.106 477.356 86.6667 457.917 86.6667 434.023C86.6667 410.129 106.106 390.69 130 390.69ZM216.667 86.6667C192.772 86.6667 173.333 67.2277 173.333 43.3333C173.333 19.439 192.772 0 216.667 0C240.561 0 260 19.439 260 43.3333C260 67.2277 240.561 86.6667 216.667 86.6667ZM216.667 260.459C240.561 260.459 260 279.898 260 303.793C260 327.687 240.561 347.126 216.667 347.126C192.772 347.126 173.333 327.687 173.333 303.793C173.333 279.898 192.772 260.459 216.667 260.459ZM43.3333 86.6667C19.439 86.6667 0 67.2277 0 43.3333C0 19.439 19.439 0 43.3333 0C67.2277 0 86.6667 19.439 86.6667 43.3333C86.6667 67.2277 67.2277 86.6667 43.3333 86.6667ZM43.3333 260.459C67.2277 260.459 86.6667 279.898 86.6667 303.793C86.6667 327.687 67.2277 347.126 43.3333 347.126C19.439 347.126 0 327.687 0 303.793C0 279.898 19.439 260.459 43.3333 260.459Z\" fill=\"black\"/>\n</svg>\n`;var ht=`<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1000 1000\" width=\"1000\" height=\"1000\">\n    <polygon points=\"500,126 874,500 500,874 126,500\" fill=\"#000\"/>\n</svg>\n`;(()=>{let o=\"__brainableHomeLiquid\";window[o]?.destroy?.();let e=t=>String(t||\"\").replace(/[\\s\\u200b-\\u200d]/g,\"\"),i=[\"LASERABLE\",\"READINGABLE\",\"LISTENINGABLE\"],r=new Map,s=null,l=!1,h=0,a=0,y=new Map,c=new Map,R=new Map,u=matchMedia(\"(prefers-reduced-motion: reduce)\"),v=document.createElement(\"style\");v.dataset.brainableHomeLiquidStyle=\"\",v.textContent=`\n[data-hf30-products][data-hlm-root]{box-sizing:border-box!important;position:relative!important;inset:auto!important;transform:none!important;opacity:1!important;display:block!important;width:100%!important;max-width:100%!important;min-width:0!important;height:auto!important;min-height:0!important;max-height:none!important;flex-shrink:0!important;background:#000!important;color:#fafafa!important;isolation:isolate!important;overflow:hidden!important;padding:clamp(48px,6vw,96px) clamp(20px,4vw,64px) 0!important;margin:0!important}\n[data-hlm-root] [data-hlm-old]{display:none!important}\n[data-hlm-root] [data-hlm-inner]{box-sizing:border-box!important;position:relative!important;inset:auto!important;transform:none!important;opacity:1!important;display:block!important;width:100%!important;max-width:1536px!important;min-width:0!important;height:auto!important;min-height:0!important;max-height:none!important;padding:0!important;margin:0 auto!important;overflow:visible!important;gap:0!important}\n[data-hlm-root] [data-hlm-intro]{box-sizing:border-box!important;position:relative!important;inset:auto!important;transform:none!important;opacity:1!important;display:block!important;width:100%!important;max-width:1120px!important;min-width:0!important;height:auto!important;min-height:0!important;padding:0!important;margin:0 auto clamp(48px,6vw,88px)!important;grid-area:auto!important;text-align:center!important}\n[data-hlm-root] [data-hlm-intro] p,[data-hlm-root] [data-hlm-intro] span{font-family:'Noto Sans KR',sans-serif!important;font-size:clamp(16px,1.6vw,22px)!important;line-height:1.7!important;letter-spacing:0!important;color:#fafafa!important;width:auto!important;max-width:100%!important;height:auto!important;min-height:0!important;margin:0!important;white-space:normal!important;word-break:keep-all!important;overflow-wrap:anywhere!important}\n[data-hlm-root] [data-hlm-grid]{box-sizing:border-box!important;display:block!important;position:relative!important;inset:auto!important;transform:none!important;opacity:1!important;width:100%!important;max-width:100%!important;min-width:0!important;height:auto!important;min-height:0!important;max-height:none!important;padding:0!important;margin:0!important;gap:0!important;grid-template-columns:none!important;grid-template-rows:none!important;overflow:visible!important}\n[data-hlm-root] [data-hf30-card][data-hlm-card]{box-sizing:border-box!important;display:grid!important;grid-template-columns:minmax(0,1fr)!important;align-items:center!important;gap:24px!important;position:relative!important;inset:auto!important;transform:none!important;opacity:1!important;grid-area:auto!important;width:100%!important;max-width:100%!important;min-width:0!important;height:auto!important;min-height:0!important;max-height:none!important;overflow:visible!important;margin:0!important;padding:0 0 64px!important;background:transparent!important;border:0!important;box-shadow:none!important}\n[data-hlm-root] [data-hlm-card]+[data-hlm-card]{padding-top:64px!important}\n[data-hlm-root] [data-hlm-content]{box-sizing:border-box!important;position:relative!important;inset:auto!important;transform:none!important;opacity:1!important;display:flex!important;flex-direction:column!important;justify-content:center!important;align-items:stretch!important;gap:16px!important;grid-area:auto!important;width:100%!important;min-width:0!important;max-width:100%!important;height:auto!important;min-height:0!important;margin:0!important;padding:0!important;text-wrap:balance!important}\n[data-hlm-root] [data-hlm-heading]{box-sizing:border-box!important;position:relative!important;inset:auto!important;transform:none!important;opacity:1!important;display:flex!important;flex-direction:column!important;gap:0!important;align-items:stretch!important;width:100%!important;max-width:100%!important;min-width:0!important;height:auto!important;min-height:0!important;grid-area:auto!important;margin:0!important;padding:16px 0 0!important;text-align:center!important}\n[data-hlm-root] [data-hlm-card] [data-hf30-name],[data-hlm-root] [data-hlm-card] [data-hf30-category]{box-sizing:border-box!important;position:relative!important;inset:auto!important;transform:none!important;opacity:1!important;display:block!important;width:100%!important;min-width:0!important;max-width:100%!important;height:auto!important;min-height:0!important;max-height:none!important;grid-area:auto!important;order:0!important;gap:0!important;padding:0!important;margin:0!important;font-family:'Noto Sans KR',sans-serif!important;font-weight:500!important;font-size:30px!important;line-height:1.22!important;letter-spacing:-.04em!important;color:#fafafa!important;text-wrap:balance!important;white-space:normal!important;word-break:keep-all!important;overflow-wrap:anywhere!important}\n[data-hlm-root] [data-hlm-card] [data-hf30-name] p,[data-hlm-root] [data-hlm-card] [data-hf30-name] span{font:inherit!important;letter-spacing:inherit!important;color:inherit!important;line-height:inherit!important;white-space:normal!important;word-break:keep-all!important;overflow-wrap:anywhere!important;width:auto!important;max-width:100%!important;min-width:0!important;height:auto!important;min-height:0!important;margin:0!important;padding:0!important}\n[data-hlm-root] [data-hlm-card] [data-hf30-description]{box-sizing:border-box!important;position:relative!important;inset:auto!important;transform:none!important;opacity:1!important;display:block!important;width:100%!important;min-width:0!important;max-width:576px!important;height:auto!important;min-height:0!important;max-height:none!important;grid-area:auto!important;order:0!important;padding:0 0 8px!important;margin:0 auto!important;text-align:center!important;gap:0!important}\n[data-hlm-root] [data-hlm-card] [data-hf30-description] p{font-family:'Noto Sans KR',sans-serif!important;box-sizing:border-box!important;display:inline!important;font-size:14px!important;line-height:1.65!important;letter-spacing:0!important;color:rgba(250,250,250,.7)!important;position:relative!important;inset:auto!important;transform:none!important;width:auto!important;max-width:100%!important;min-width:0!important;height:auto!important;min-height:0!important;margin:0!important;padding:0!important;text-wrap:pretty!important;white-space:normal!important;word-break:keep-all!important;overflow-wrap:anywhere!important}\n[data-hlm-root] [data-hlm-card] [data-hf30-description] span{font-family:'Noto Sans KR',sans-serif!important;font-size:inherit!important;line-height:inherit!important;letter-spacing:inherit!important;color:inherit!important}\n[data-hlm-root] [data-hlm-card] [data-hf30-blank],[data-hlm-root] [data-hlm-card] [data-hf30-description] [data-hf30-blank]{display:none!important}\n[data-hlm-root] [data-hlm-actions]{box-sizing:border-box!important;position:relative!important;inset:auto!important;transform:none!important;opacity:1!important;display:flex!important;justify-content:center!important;align-items:center!important;gap:16px!important;width:100%!important;min-width:0!important;height:auto!important;min-height:0!important;padding:0 0 16px!important;margin:0!important;grid-area:auto!important}\n[data-hlm-root] [data-hlm-actions] a{box-sizing:border-box!important;position:relative!important;inset:auto!important;transform:none!important;display:inline-flex!important;align-items:center!important;justify-content:center!important;gap:8px!important;width:auto!important;min-width:0!important;max-width:100%!important;height:44px!important;min-height:44px!important;padding:0 32px!important;border:0!important;border-radius:6px!important;background:#fafafa!important;color:#18181b!important;font-family:'Noto Sans KR',sans-serif!important;font-size:14px!important;font-weight:500!important;line-height:1!important;letter-spacing:0!important;text-decoration:none!important;white-space:nowrap!important;box-shadow:0 1px 2px rgba(0,0,0,.05)!important;transition:background-color .15s,transform .15s!important;cursor:pointer!important}\n[data-hlm-root] [data-hlm-actions] a:hover{background:rgba(250,250,250,.9)!important}\n[data-hlm-root] [data-hlm-actions] a:focus-visible{outline:2px solid #8ac0ff!important;outline-offset:4px!important}\n[data-hlm-root] [data-hlm-visual]{box-sizing:border-box!important;display:block!important;position:relative!important;inset:auto!important;transform:none!important;opacity:1!important;grid-area:auto!important;width:100%!important;min-width:0!important;max-width:100%!important;height:360px!important;min-height:0!important;overflow:hidden!important;margin:-24px 0 -48px!important;padding:0!important;pointer-events:none!important;order:0!important}\n[data-hlm-root] [data-hlm-clip]{position:absolute!important;inset:0!important;transform:none!important;display:flex!important;align-items:center!important;justify-content:center!important;overflow:hidden!important;border-radius:0!important;width:100%!important;height:100%!important;min-height:0!important;gap:0!important;padding:0!important;margin:0!important}\n[data-hlm-root] [data-hlm-shader]{box-sizing:border-box!important;position:relative!important;inset:auto!important;transform:none!important;flex-shrink:0!important;display:block!important;width:100%!important;height:100%!important;min-height:0!important;max-width:none!important;max-height:none!important;padding:0!important;margin:0!important;overflow:hidden!important}\n[data-hlm-root] [data-hlm-shader] canvas{box-sizing:border-box!important;display:block!important;position:absolute!important;inset:0!important;width:100%!important;height:100%!important;padding:0!important;margin:0!important}\n[data-hlm-root] [data-hlm-fallback]{position:absolute!important;left:50%!important;top:50%!important;transform:translate(-50%,-50%)!important;width:auto!important;height:var(--hlm-fallback-scale,68%)!important;max-width:var(--hlm-fallback-scale,68%)!important;object-fit:contain!important;opacity:.75!important;filter:invert(1)!important;pointer-events:none!important}\n[data-hlm-root] [data-hlm-visual][data-hlm-ready] [data-hlm-fallback]{display:none!important}\n[data-hlm-root] [data-hlm-fade]{display:block!important;position:absolute!important;inset:0 0 auto!important;width:100%!important;height:224px!important;background:linear-gradient(to bottom,#000,rgba(0,0,0,.95),transparent)!important;z-index:2!important;pointer-events:none!important;margin:0!important;padding:0!important}\n@media(min-width:640px){[data-hlm-root] [data-hlm-content]{gap:20px!important;padding:0 16px!important}[data-hlm-root] [data-hlm-heading]{padding-top:24px!important}[data-hlm-root] [data-hlm-card] [data-hf30-name],[data-hlm-root] [data-hlm-card] [data-hf30-category]{font-size:36px!important}[data-hlm-root] [data-hlm-card] [data-hf30-description] p{font-size:16px!important}[data-hlm-root] [data-hlm-card] [data-hf30-description]{padding-bottom:16px!important}[data-hlm-root] [data-hf30-card][data-hlm-card]{gap:32px!important;padding-bottom:80px!important}}\n@media(min-width:768px){[data-hlm-root] [data-hlm-content]{padding:0 32px!important}[data-hlm-root] [data-hlm-card] [data-hf30-name],[data-hlm-root] [data-hlm-card] [data-hf30-category]{font-size:48px!important}}\n@media(min-width:1024px){[data-hlm-root] [data-hf30-card][data-hlm-card]{grid-template-columns:minmax(0,1fr) minmax(300px,500px)!important;gap:48px!important;padding-bottom:96px!important}[data-hlm-root] [data-hlm-content]{gap:24px!important;padding:0 0 0 16px!important}[data-hlm-root] [data-hlm-heading]{padding-top:0!important;text-align:left!important}[data-hlm-root] [data-hlm-card] [data-hf30-name],[data-hlm-root] [data-hlm-card] [data-hf30-category]{letter-spacing:-.06em!important}[data-hlm-root] [data-hlm-card] [data-hf30-description]{max-width:none!important;margin:0!important;padding:0!important;text-align:left!important}[data-hlm-root] [data-hlm-card] [data-hf30-description] p{font-size:18px!important;color:rgba(250,250,250,.8)!important}[data-hlm-root] [data-hlm-actions]{justify-content:flex-start!important;padding-bottom:0!important}[data-hlm-root] [data-hlm-visual]{height:400px!important;margin:0!important}[data-hlm-root] [data-hlm-clip]{border-radius:9999px!important}[data-hlm-root] [data-hlm-shader]{width:1280px!important;height:720px!important}[data-hlm-root] [data-hlm-fallback]{height:var(--hlm-fallback-scale,60%)!important;max-width:var(--hlm-fallback-scale,60%)!important}[data-hlm-root] [data-hlm-fade]{display:none!important}}\n@media(min-width:1280px){[data-hlm-root] [data-hf30-card][data-hlm-card]{grid-template-columns:minmax(0,1fr) minmax(0,1fr)!important}[data-hlm-root] [data-hlm-content]{padding-left:32px!important}[data-hlm-root] [data-hlm-card] [data-hf30-name],[data-hlm-root] [data-hlm-card] [data-hf30-category]{font-size:60px!important}[data-hlm-root] [data-hlm-card] [data-hf30-description] p{font-size:20px!important}[data-hlm-root] [data-hlm-visual]{height:500px!important}}\n@media(min-width:1536px){[data-hlm-root] [data-hlm-content]{padding-left:0!important}[data-hlm-root] [data-hlm-card] [data-hf30-name],[data-hlm-root] [data-hlm-card] [data-hf30-category]{font-size:72px!important}}\n@media(prefers-reduced-motion:reduce){[data-hlm-root] [data-hlm-actions] a{transition:none!important}}\n`,document.head.append(v);function C(t,n,f=\"\"){if(!t)return;let E=r.get(t);E||r.set(t,E=new Map),E.has(n)||E.set(n,t.getAttribute(n)),t.setAttribute(n,f)}function q(){for(let[t,n]of r)for(let[f,E]of n)E===null?t.removeAttribute(f):t.setAttribute(f,E);r.clear()}function b(t,n){let f=document.createElement(t);return f.setAttribute(\"data-hlm-\"+n,\"\"),f}let p={\"cult-icon.svg\":\"data:image/svg+xml;charset=utf-8,\"+encodeURIComponent(ct),\"diamond.svg\":\"data:image/svg+xml;charset=utf-8,\"+encodeURIComponent(ht)},_=[\"Default\",\"Root-level shader props\",\"Configured via props\"];function T(t){let n=innerWidth<1024,f={colorBack:\"#ffffff00\",colorTint:\"#2c5d72\",repetition:6,softness:.8,shiftRed:1,shiftBlue:-1,distortion:.4,contour:.4,angle:0,speed:1,scale:n?.68:.6,fit:\"contain\",image:t.asset};return t.variantIndex===1&&(f.scale=.6),t.variantIndex===2&&Object.assign(f,n?{speed:.65,scale:.78,colorTint:\"#0ea5e9\"}:{scale:.8,speed:.7,repetition:7,softness:.9,distortion:.3,colorTint:\"#4f46e5\"}),f}function I(t){return[parseInt(t.slice(1,3),16)/255,parseInt(t.slice(3,5),16)/255,parseInt(t.slice(5,7),16)/255,t.length===9?parseInt(t.slice(7,9),16)/255:1]}async function P(t){return y.has(t)||y.set(t,dt(p[t]).then(({pngBlob:n})=>new Promise((f,E)=>{if(l){E(new Error(\"Liquid metal module disposed\"));return}let B=URL.createObjectURL(n);c.set(t,B);let g=new Image;g.onload=()=>{l?(URL.revokeObjectURL(B),c.delete(t),E(new Error(\"Liquid metal module disposed\"))):f(g)},g.onerror=()=>E(new Error(\"Liquid metal processed image could not load\")),g.src=B})).catch(n=>{throw R.set(t,String(n?.message||n)),n})),y.get(t)}function M(t){let n=T(t);return{u_colorBack:I(n.colorBack),u_colorTint:I(n.colorTint),u_image:t.image,u_contour:n.contour,u_distortion:n.distortion,u_softness:n.softness,u_repetition:n.repetition,u_shiftRed:n.shiftRed,u_shiftBlue:n.shiftBlue,u_angle:n.angle,u_isImage:!0,u_shape:0,u_fit:1,u_scale:n.scale,u_rotation:0,u_offsetX:0,u_offsetY:0,u_originX:.5,u_originY:.5,u_worldWidth:0,u_worldHeight:0}}function V(t){return t.error?\"fallback\":t.loading?\"loading\":t.mount?document.hidden?\"hidden\":u.matches?\"reduced-motion\":t.visible?\"running\":\"offscreen\":\"idle\"}function U(t){if(t.error){t.mount&&t.mount.setSpeed(0);return}let n=T(t);t.visual.style.setProperty(\"--hlm-fallback-scale\",`${n.scale*100}%`),t.mount&&(t.mount.setUniforms(M(t)),t.mount.setSpeed(t.visible&&!document.hidden&&!u.matches?n.speed:0),u.matches&&t.mount.getCurrentFrame()===0&&t.mount.setFrame(1200))}async function X(t,n){if(t.mount||t.loading||t.error||l)return;t.loading=!0;let f=a;try{let E=await P(t.asset);if(l||s!==n||f!==a||!t.visual.isConnected)return;if(t.image=E,t.mount=new Z(t.shader,pt,M(t),{alpha:!0,premultipliedAlpha:!0,antialias:!0},0,u.matches?1200:0,1,1280*720*2,[\"u_image\"]),!t.mount.program||!t.mount.gl||t.mount.gl.isContextLost())throw new Error(\"Liquid metal WebGL program did not initialize\");t.visual.setAttribute(\"data-hlm-ready\",\"\"),t.contextLost=B=>{B.preventDefault(),t.error=\"WebGL context lost\",t.visual.removeAttribute(\"data-hlm-ready\");let g=t.mount;t.mount=null;try{g?.dispose()}catch{}},t.mount.canvasElement.addEventListener(\"webglcontextlost\",t.contextLost),U(t)}catch(E){if(s===n){t.error=String(E?.message||E);let B=t.mount;t.mount=null;try{B?.dispose()}catch{}t.visual.removeAttribute(\"data-hlm-ready\"),t.shader.querySelectorAll(\"canvas\").forEach(g=>g.remove())}}finally{t.loading=!1}}function W(){if(!s)return;a++;let t=s;s=null,t.io.disconnect();for(let n of t.cards){if(n.mount){n.mount.canvasElement.removeEventListener(\"webglcontextlost\",n.contextLost);try{n.mount.dispose()}catch{}}for(let f of n.moves.slice().reverse())f.next?.parentNode===f.parent?f.parent.insertBefore(f.node,f.next):f.parent.append(f.node);n.content.remove(),n.visual.remove()}q();for(let n of t.videos)!n.paused&&n.node.isConnected&&n.node.play().catch(()=>{})}function j(t){let n=[...t.querySelectorAll(\"[data-hf30-card]\")].filter(w=>i.includes(e(w.querySelector(\"[data-hf30-name]\")?.textContent)));if(n.length!==3)return;let f=n[0].parentElement,E=f.parentElement,B=[...E.children].find(w=>w!==f&&e(w.textContent).startsWith(\"\\uBE0C\\uB808\\uC778\\uC5D0\\uC774\\uBE14\\uC740\\uBAA8\\uB4E0\\uC774\\uC758\\uC7A0\\uC7AC\\uB825\\uC744\\uAE68\\uC6B0\\uAE30\\uC704\\uD574\"));if(!B)return;let g={root:t,cards:[],videos:[],copyNodes:[],copyText:[],io:null};s=g,a++,C(t,\"data-hlm-root\"),C(E,\"data-hlm-inner\"),C(f,\"data-hlm-grid\"),C(B,\"data-hlm-intro\");for(let w of t.children)w!==E&&(w.tagName===\"VIDEO\"||!e(w.textContent))&&C(w,\"data-hlm-old\");for(let w of t.querySelectorAll(\"video\"))g.videos.push({node:w,paused:w.paused}),w.pause();let G=document.createTreeWalker(t,NodeFilter.SHOW_TEXT);for(let w=G.nextNode();w;w=G.nextNode())g.copyNodes.push(w),g.copyText.push(w.nodeValue);for(let[w,A]of n.entries()){let d=A.querySelector(\"[data-hf30-name]\"),x=A.querySelector(\"[data-hf30-category]\"),S=A.querySelector(\"[data-hf30-description]\"),z=b(\"div\",\"content\"),Q=b(\"div\",\"heading\"),F=b(\"div\",\"visual\"),et=b(\"div\",\"clip\"),J=b(\"div\",\"shader\"),K=b(\"img\",\"fallback\"),ut=b(\"div\",\"fade\"),ot=w===0?\"cult-icon.svg\":\"diamond.svg\";K.src=p[ot],K.alt=\"\",K.setAttribute(\"aria-hidden\",\"true\"),F.setAttribute(\"aria-hidden\",\"true\");let tt={node:A,name:e(d.textContent),variantIndex:w,asset:ot,image:null,content:z,visual:F,shader:J,mount:null,loading:!1,visible:!1,error:null,moves:[d,x,S].map($=>({node:$,parent:$.parentNode,next:$.nextSibling}))};if(C(A,\"data-hlm-card\"),Q.append(d,x),z.append(Q,S),tt.name===\"LASERABLE\"){let $=b(\"div\",\"actions\"),H=document.createElement(\"a\");H.textContent=\"\\uC81C\\uD488\\uC18C\\uAC1C\",H.href=\"/laserable\",H.setAttribute(\"data-hlm-cta\",\"\"),H.addEventListener(\"click\",D=>{D.stopPropagation(),!(D.button!==0||D.metaKey||D.ctrlKey||D.shiftKey||D.altKey)&&(D.preventDefault(),location.assign(H.href))}),$.append(H),z.append($)}J.append(K),et.append(J),F.append(et,ut),A.append(z,F),g.cards.push(tt),U(tt)}g.io=new IntersectionObserver(w=>{if(!(s!==g||l))for(let A of w){let d=g.cards.find(x=>x.node===A.target);d&&(d.visible=A.isIntersecting&&A.intersectionRatio>.01,d.visible&&X(d,g),U(d))}},{threshold:[0,.01]}),g.cards.forEach(w=>g.io.observe(w.node))}function k(){if(h=0,l)return;let n=(location.pathname.replace(/\\/+$/,\"\")||\"/\")===\"/\"?document.querySelector(\"[data-hf30-products]\"):null;s&&(s.root!==n||!s.root.isConnected)&&W(),n&&!s&&j(n)}let N=()=>{!l&&!h&&(h=requestAnimationFrame(k))},Y=new MutationObserver(N);Y.observe(document.body,{childList:!0,subtree:!0});let L=()=>{s?.cards.forEach(U),N()};document.addEventListener(\"visibilitychange\",L),window.addEventListener(\"resize\",L,{passive:!0}),window.addEventListener(\"popstate\",N),u.addEventListener(\"change\",L),k(),window[o]={inspect(){return{matched:!!s,route:location.pathname,reducedMotion:u.matches,hidden:document.hidden,source:\"cult/ui Hero Liquid Metal + Paper Shaders 0.0.71\",variants:s?.cards.map(t=>({name:t.name,variant:_[t.variantIndex],shaderConfig:T(t)}))??[],nativeTextRetained:s?s.copyNodes.every((t,n)=>t.nodeValue===s.copyText[n]&&s.root.contains(t)):null,processingErrors:Object.fromEntries(R),ctas:s?[...s.root.querySelectorAll(\"[data-hlm-cta]\")].map(t=>({text:t.textContent,href:t.getAttribute(\"href\"),card:e(t.closest(\"[data-hlm-card]\")?.querySelector(\"[data-hf30-name]\")?.textContent)})):[],cards:s?.cards.map(t=>({name:t.name,variant:_[t.variantIndex],shaderConfig:T(t),state:V(t),visible:t.visible,initialized:!!t.mount,error:t.error,frame:t.mount?.getCurrentFrame()??null,canvas:t.mount?{width:t.mount.canvasElement.width,height:t.mount.canvasElement.height}:null}))??[]}},destroy(){if(!l){l=!0,Y.disconnect(),cancelAnimationFrame(h),document.removeEventListener(\"visibilitychange\",L),window.removeEventListener(\"resize\",L),window.removeEventListener(\"popstate\",N),u.removeEventListener(\"change\",L),W(),v.remove();for(let t of c.values())URL.revokeObjectURL(t);c.clear(),delete window[o]}}}})();})();\n\n\n/* BRAINABLE production global: home-spotlight */\n/* UICapsule Gradient Orb shader, Copyright (c) 2023 Kaiyu Hsu.\n * Exact public shader port; scoped BRAINABLE banner adapter.\n * Primary-source proof: ./reference/NOTES.md\n * MIT License\n * \n * Copyright (c) 2023 Kaiyu Hsu\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n(function brainableHomeGradientOrb() {\n  'use strict';\n  const KEY = '__brainableHomeGradientOrb';\n  if (window[KEY]) return;\n  const COPY = '놀라운 기술력을 바탕으로, 세상에 없던제품을 만듭니다.';\n  const compact = value => String(value || '').replace(/\\s+/g, '');\n  const vertexSource = \"\\n  varying vec2 vUv;\\n\\n  void main() {\\n    vUv = uv;\\n    gl_Position = vec4(position.xy, 0.0, 1.0);\\n  }\\n\";\n  const fragmentSource = \"\\n  precision highp float;\\n\\n  uniform float iTime;\\n  uniform vec3 iResolution;\\n  uniform float hue;\\n  uniform float rot;\\n  uniform float noiseScale;\\n  uniform float innerRadius;\\n\\n  varying vec2 vUv;\\n\\n  // --- YIQ color space hue rotation ---\\n\\n  vec3 rgb2yiq(vec3 c) {\\n    return vec3(\\n      dot(c, vec3(0.299, 0.587, 0.114)),\\n      dot(c, vec3(0.596, -0.274, -0.322)),\\n      dot(c, vec3(0.211, -0.523, 0.312))\\n    );\\n  }\\n\\n  vec3 yiq2rgb(vec3 c) {\\n    return vec3(\\n      c.x + 0.956 * c.y + 0.621 * c.z,\\n      c.x - 0.272 * c.y - 0.647 * c.z,\\n      c.x - 1.106 * c.y + 1.703 * c.z\\n    );\\n  }\\n\\n  vec3 adjustHue(vec3 color, float hueDeg) {\\n    float hueRad = radians(hueDeg);\\n    vec3 yiq = rgb2yiq(color);\\n    float cosA = cos(hueRad);\\n    float sinA = sin(hueRad);\\n    yiq.yz = vec2(yiq.y * cosA - yiq.z * sinA, yiq.y * sinA + yiq.z * cosA);\\n    return yiq2rgb(yiq);\\n  }\\n\\n  // --- 3D simplex noise (hash-based) ---\\n\\n  vec3 hash33(vec3 p3) {\\n    p3 = fract(p3 * vec3(0.1031, 0.11369, 0.13787));\\n    p3 += dot(p3, p3.yxz + 19.19);\\n    return -1.0 + 2.0 * fract(vec3(p3.x + p3.y, p3.x + p3.z, p3.y + p3.z) * p3.zyx);\\n  }\\n\\n  float snoise3(vec3 p) {\\n    const float K1 = 0.333333333;\\n    const float K2 = 0.166666667;\\n    vec3 i = floor(p + (p.x + p.y + p.z) * K1);\\n    vec3 d0 = p - (i - (i.x + i.y + i.z) * K2);\\n    vec3 e = step(vec3(0.0), d0 - d0.yzx);\\n    vec3 i1 = e * (1.0 - e.zxy);\\n    vec3 i2 = 1.0 - e.zxy * (1.0 - e);\\n    vec3 d1 = d0 - (i1 - K2);\\n    vec3 d2 = d0 - (i2 - K1);\\n    vec3 d3 = d0 - 0.5;\\n    vec4 h = max(0.6 - vec4(dot(d0, d0), dot(d1, d1), dot(d2, d2), dot(d3, d3)), 0.0);\\n    vec4 n = h * h * h * h * vec4(\\n      dot(d0, hash33(i)),\\n      dot(d1, hash33(i + i1)),\\n      dot(d2, hash33(i + i2)),\\n      dot(d3, hash33(i + 1.0))\\n    );\\n    return dot(vec4(31.316), n);\\n  }\\n\\n  // --- Orb rendering ---\\n\\n  vec4 extractAlpha(vec3 colorIn) {\\n    float a = max(max(colorIn.r, colorIn.g), colorIn.b);\\n    return vec4(colorIn.rgb / (a + 1e-5), a);\\n  }\\n\\n  const vec3 baseColor0 = vec3(0.239, 0.353, 1.0);   // blue\\n  const vec3 baseColor1 = vec3(0.616, 0.0, 1.0);     // purple\\n  const vec3 baseColor2 = vec3(1.0, 0.373, 0.122);   // orange\\n  const vec3 baseColor3 = vec3(0.0, 0.0, 0.0);       // black\\n\\n  float light1(float intensity, float attenuation, float dist) {\\n    return intensity / (1.0 + dist * attenuation);\\n  }\\n\\n  float light2(float intensity, float attenuation, float dist) {\\n    return intensity / (1.0 + dist * dist * attenuation);\\n  }\\n\\n  vec4 draw(vec2 uv) {\\n    vec3 color0 = adjustHue(baseColor0, hue);\\n    vec3 color1 = adjustHue(baseColor1, hue);\\n    vec3 color2 = adjustHue(baseColor2, hue);\\n    vec3 color3 = adjustHue(baseColor3, hue);\\n\\n    float len = length(uv);\\n    float invLen = len > 0.0 ? 1.0 / len : 0.0;\\n\\n    float pulse = sin(iTime * 1.5) * 0.02;\\n\\n    float n0 = snoise3(vec3(uv * noiseScale, iTime * 0.5)) * 0.5 + 0.5;\\n\\n    float r0 = mix(mix(innerRadius + pulse, 1.0, 0.4), mix(innerRadius + pulse, 1.0, 0.6), n0);\\n\\n    float d0 = distance(uv, (r0 * invLen) * uv);\\n    float v0 = light1(1.0, 10.0, d0);\\n    v0 *= smoothstep(r0 * 1.05, r0, len);\\n    float cl = cos(atan(uv.y, uv.x) + iTime * 2.0) * 0.5 + 0.5;\\n\\n    float a = iTime * -1.0;\\n    vec2 pos = vec2(cos(a), sin(a)) * r0;\\n    float d = distance(uv, pos);\\n    float v1 = light2(1.5, 5.0, d);\\n    v1 *= light1(1.0, 50.0, d0);\\n\\n    float v2 = smoothstep(1.0, mix(innerRadius, 1.0, n0 * 0.5), len);\\n    float v3 = smoothstep(innerRadius, mix(innerRadius, 1.0, 0.5), len);\\n\\n    vec3 col = mix(color1, color2, cl);\\n    col = mix(col, color0, n0);\\n    col = mix(color3, col, v0);\\n    col = (col + v1) * v2 * v3;\\n    col = clamp(col, 0.0, 1.0);\\n\\n    return extractAlpha(col);\\n  }\\n\\n  void main() {\\n    vec2 center = iResolution.xy * 0.5;\\n    float size = min(iResolution.x, iResolution.y);\\n    vec2 uv = (vUv * iResolution.xy - center) / size * 2.0;\\n\\n    float s = sin(rot);\\n    float c = cos(rot);\\n    uv = vec2(c * uv.x - s * uv.y, s * uv.x + c * uv.y);\\n\\n    vec4 col = draw(uv);\\n    gl_FragColor = vec4(col.rgb * col.a, col.a);\\n  }\\n\";\n  const originalBlackHole = window.__brainableBlackHole30;\n  const reduced = matchMedia('(prefers-reduced-motion: reduce)');\n  let binding = null, scanFrame = 0, dead = false;\n  const style = document.createElement('style');\n  style.id = 'brainable-home-gradient-orb-style';\n  style.textContent = `\n[data-hf30-banner][data-bgo-host]{box-sizing:border-box!important;position:relative!important;isolation:isolate!important;\n  overflow:hidden!important;height:900px!important;min-height:900px!important;max-height:none!important;\n  flex-shrink:0!important;background:#0a0a0a!important;background-image:none!important;opacity:1!important;\n  filter:none!important;backdrop-filter:none!important;}\n[data-hf30-banner][data-bgo-host] [data-bgo-native-background]{display:none!important;}\n[data-hf30-banner][data-bgo-host] [data-bgo-content]{z-index:1!important;filter:none!important;backdrop-filter:none!important;}\n[data-hf30-banner][data-bgo-host] .textContents,\n[data-hf30-banner][data-bgo-host] .textContents p,\n[data-hf30-banner][data-bgo-host] .textContents span{font-family:'Noto Sans KR',sans-serif!important;letter-spacing:.08em!important;}\n[data-hf30-banner][data-bgo-host] [data-hf30-flow]{box-sizing:border-box!important;min-width:0!important;max-width:100%!important;}\n[data-bgo-background]{box-sizing:border-box!important;position:absolute!important;inset:0!important;width:100%!important;height:100%!important;\n  z-index:0!important;pointer-events:none!important;overflow:hidden!important;opacity:1!important;filter:none!important;\n  backdrop-filter:none!important;background:#0a0a0a!important;}\n[data-bgo-background] canvas{display:block!important;position:absolute!important;inset:0!important;width:100%!important;height:100%!important;}\n[data-bgo-fallback]{display:none;position:absolute;top:50%;left:50%;width:58%;max-width:520px;aspect-ratio:1;transform:translate(-50%,-50%);\n  border-radius:50%;background:radial-gradient(circle at 50% 50%,#0a0a0a 0 53%,#0e0b1b 60%,#2b1750 66%,#7247bf 68%,#e5cbff 69%,#4d39a6 70%,#0a0a0a 73%);\n  box-shadow:0 0 18px 1px rgba(126,79,232,.14);}\n[data-bgo-background][data-bgo-fallback-active] canvas{display:none!important;}\n[data-bgo-background][data-bgo-fallback-active] [data-bgo-fallback]{display:block;}\n@media(max-width:1279px){\n [data-hf30-main]>[data-hf30-banner][data-bgo-host]{height:525px!important;min-height:525px!important;}\n [data-hf30-banner][data-bgo-host] .textContents,[data-hf30-banner][data-bgo-host] .textContents p,\n [data-hf30-banner][data-bgo-host] .textContents span{letter-spacing:.03em!important;}\n [data-bgo-fallback]{max-width:300px;}\n}\n@media(max-width:767px){\n [data-hf30-main]>[data-hf30-banner][data-bgo-host]{height:350px!important;min-height:350px!important;}\n}\n`;\n  document.head.append(style);\n  const recordAttr = (node, key, value, records) => {\n    records.push([node, key, node.getAttribute(key)]);\n    node.setAttribute(key, value);\n  };\n\n  function makeRenderer(canvas, background) {\n    let gl = null, program = null, buffer = null, shaders = [], uniforms = {};\n    let frame = 0, lastStamp = null, lastDraw = 0, elapsed = 0, running = false, lost = false, disposed = false;\n    let frameCount = 0, fault = null, dimensions = [0, 0];\n    const fallback = () => background.setAttribute('data-bgo-fallback-active', '');\n    const cancel = () => { if (frame) cancelAnimationFrame(frame); frame = 0; lastStamp = null; };\n    function releaseResources() {\n      if (gl && !lost) {\n        if (buffer) gl.deleteBuffer(buffer);\n        if (program) gl.deleteProgram(program);\n        shaders.forEach(shader => gl.deleteShader(shader));\n      }\n      buffer = null; program = null; shaders = []; uniforms = {};\n    }\n    function initialize() {\n      if (disposed) return;\n      try {\n        gl = gl || canvas.getContext('webgl', { alpha:false, antialias:true, premultipliedAlpha:true, powerPreference:'low-power' });\n        if (!gl) throw new Error('WebGL unavailable');\n        const compile = (type, source) => {\n          const shader = gl.createShader(type);\n          gl.shaderSource(shader, source); gl.compileShader(shader); shaders.push(shader);\n          if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) throw new Error(gl.getShaderInfoLog(shader) || 'Shader compile failed');\n          return shader;\n        };\n        const vertex = compile(gl.VERTEX_SHADER, 'attribute vec3 position;\\nattribute vec2 uv;\\n' + vertexSource);\n        const fragment = compile(gl.FRAGMENT_SHADER, fragmentSource);\n        program = gl.createProgram(); gl.attachShader(program, vertex); gl.attachShader(program, fragment); gl.linkProgram(program);\n        if (!gl.getProgramParameter(program, gl.LINK_STATUS)) throw new Error(gl.getProgramInfoLog(program) || 'Shader link failed');\n        buffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n        gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1,-1,0,0,0, 3,-1,0,2,0, -1,3,0,0,2]), gl.STATIC_DRAW);\n        gl.useProgram(program);\n        for (const [name, size, offset] of [['position',3,0],['uv',2,12]]) {\n          const location = gl.getAttribLocation(program,name);\n          gl.enableVertexAttribArray(location); gl.vertexAttribPointer(location,size,gl.FLOAT,false,20,offset);\n        }\n        for (const name of ['iTime','iResolution','hue','rot','noiseScale','innerRadius']) uniforms[name] = gl.getUniformLocation(program,name);\n        gl.disable(gl.DEPTH_TEST); gl.disable(gl.CULL_FACE);\n        gl.enable(gl.BLEND); gl.blendFuncSeparate(gl.SRC_ALPHA,gl.ONE_MINUS_SRC_ALPHA,gl.ONE,gl.ONE_MINUS_SRC_ALPHA);\n        gl.clearColor(10/255,10/255,10/255,1);\n        gl.uniform1f(uniforms.hue,0); gl.uniform1f(uniforms.noiseScale,.65); gl.uniform1f(uniforms.innerRadius,.1);\n        fault = null; background.removeAttribute('data-bgo-fallback-active'); resize();\n      } catch (error) { fault = String(error?.message || error); releaseResources(); fallback(); }\n    }\n    function draw() {\n      if (disposed || lost || !program || !dimensions[0] || !dimensions[1]) return;\n      gl.useProgram(program); gl.clear(gl.COLOR_BUFFER_BIT);\n      gl.uniform3f(uniforms.iResolution,dimensions[0],dimensions[1],dimensions[0]/dimensions[1]);\n      gl.uniform1f(uniforms.iTime,elapsed); gl.uniform1f(uniforms.rot,elapsed*.3);\n      gl.drawArrays(gl.TRIANGLES,0,3); frameCount++;\n    }\n    function resize() {\n      if (disposed || lost || !program) return;\n      const rect = canvas.getBoundingClientRect(), dpr = Math.min(devicePixelRatio || 1, 1.5);\n      const width = Math.max(1,Math.round(rect.width*dpr)), height = Math.max(1,Math.round(rect.height*dpr));\n      if (canvas.width !== width || canvas.height !== height) { canvas.width=width; canvas.height=height; }\n      dimensions=[width,height]; gl.viewport(0,0,width,height); draw();\n    }\n    function tick(stamp) {\n      frame=0;\n      if (!running || disposed || lost || !program) return;\n      if (lastStamp !== null) elapsed += Math.min((stamp-lastStamp)/1000,.1);\n      lastStamp=stamp;\n      if (stamp-lastDraw >= 1000/30) { draw(); lastDraw=stamp; }\n      frame=requestAnimationFrame(tick);\n    }\n    function setRunning(value) {\n      running=!!value && !disposed && !lost && !!program;\n      if (!running) cancel(); else if (!frame) frame=requestAnimationFrame(tick);\n    }\n    const onLost = event => { event.preventDefault(); lost=true; cancel(); running=false; releaseResources(); fallback(); };\n    const onRestored = () => { lost=false; releaseResources(); initialize(); sync(); };\n    canvas.addEventListener('webglcontextlost',onLost,false); canvas.addEventListener('webglcontextrestored',onRestored,false);\n    initialize();\n    return {\n      resize, setRunning,\n      inspect: () => ({mode:program&&!lost?'webgl':'static-fallback',running,contextLost:lost,frames:frameCount,elapsed,dimensions,fault}),\n      dispose() { disposed=true; running=false; cancel(); canvas.removeEventListener('webglcontextlost',onLost); canvas.removeEventListener('webglcontextrestored',onRestored); releaseResources(); }\n    };\n  }\n  function sync() {\n    if (!binding) return;\n    binding.renderer.setRunning(!reduced.matches && !document.hidden && binding.visible);\n  }\n  const intersection = new IntersectionObserver(entries => {\n    const entry = entries.find(e => e.target === binding?.host);\n    if (!entry) return;\n    binding.visible=entry.isIntersecting && entry.intersectionRatio>.01;\n    sync();\n  }, {threshold:[0,.01]});\n  const resize = new ResizeObserver(() => binding?.renderer.resize());\n  function clear() {\n    if (!binding) return;\n    intersection.unobserve(binding.host); resize.unobserve(binding.host); binding.renderer.dispose(); binding.background.remove();\n    binding.records.reverse().forEach(([node,key,old]) => old===null?node.removeAttribute(key):node.setAttribute(key,old));\n    binding=null;\n  }\n  function scan() {\n    scanFrame=0;\n    if (dead) return;\n    if (location.pathname!=='/') { clear(); return; }\n    const hosts=Array.from(document.querySelectorAll('[data-hf30-banner]')).filter(host =>\n      compact(host.textContent)===compact(COPY) && host.getClientRects().length && host.getBoundingClientRect().width>0);\n    if (hosts.length!==1) { if(binding&&!hosts.includes(binding.host)) clear(); return; }\n    const host=hosts[0];\n    if(binding?.host===host) { binding.renderer.resize(); return; }\n    clear();\n    const records=[], originalCopy=host.textContent;\n    recordAttr(host,'data-bgo-host','',records);\n    for(const node of Array.from(host.children)) {\n      if(node.getAttribute('aria-hidden')==='true') recordAttr(node,'data-bgo-native-background','',records);\n      else recordAttr(node,'data-bgo-content','',records);\n    }\n    const background=document.createElement('div'); background.setAttribute('data-bgo-background',''); background.setAttribute('aria-hidden','true');\n    const canvas=document.createElement('canvas'); canvas.setAttribute('aria-hidden','true');\n    const fallback=document.createElement('div'); fallback.setAttribute('data-bgo-fallback','');\n    background.append(canvas,fallback); host.prepend(background);\n    const rect=host.getBoundingClientRect();\n    binding={host,background,records,originalCopy,visible:rect.bottom>0&&rect.top<innerHeight,renderer:makeRenderer(canvas,background)};\n    intersection.observe(host); resize.observe(host); sync();\n  }\n  function schedule() {if(!dead&&!scanFrame)scanFrame=requestAnimationFrame(scan);}\n  const mutation=new MutationObserver(records=>{if(records.some(record=>!record.target.closest?.('[data-bgo-background]')))schedule();});\n  mutation.observe(document.body,{childList:true,subtree:true});\n  window.addEventListener('resize',schedule,{passive:true}); window.addEventListener('pageshow',schedule); window.addEventListener('popstate',schedule);\n  document.addEventListener('visibilitychange',sync); reduced.addEventListener('change',sync);\n  const api={\n    version:'home-gradient-orb-1', provenance:'exact-uicapsule-public-shader-port',\n    inspect:()=>({matched:!!binding,reducedMotion:reduced.matches,background:'#0a0a0a',defaults:{hue:0,rotationSpeed:.3,noiseScale:.65,innerRadius:.1},\n      nativeCopyRetained:binding?binding.host.textContent===binding.originalCopy:null,blackHoleRuntimeRetained:window.__brainableBlackHole30===originalBlackHole,\n      extraDimOverlay:false,extraFilter:false,bounds:binding?binding.host.getBoundingClientRect().toJSON():null,\n      canvasBounds:binding?binding.background.querySelector('canvas').getBoundingClientRect().toJSON():null,\n      renderer:binding?.renderer.inspect() || null}),\n    destroy(){\n      dead=true; mutation.disconnect(); intersection.disconnect(); resize.disconnect(); if(scanFrame)cancelAnimationFrame(scanFrame);\n      window.removeEventListener('resize',schedule); window.removeEventListener('pageshow',schedule); window.removeEventListener('popstate',schedule);\n      document.removeEventListener('visibilitychange',sync); reduced.removeEventListener('change',sync); clear(); style.remove();\n      if(window[KEY]===api)delete window[KEY];\n      if(window.__brainableHomeSpotlight===api)delete window.__brainableHomeSpotlight;\n    }\n  };\n  window[KEY]=api;\n  window.__brainableHomeSpotlight=api;\n  scan();\n})();\n\n\n;/* Full-height HOME opening scene. Preserve all native copy, wordmark and graphics. */\n(() => {\n  'use strict';\n  const KEY = '__brainableHomeHeroRestored';\n  window[KEY]?.destroy?.();\n  window.__brainableHomeAnimatedText?.destroy?.();\n  const style = document.createElement('style');\n  style.setAttribute('data-hhr30-style', '');\n  style.textContent = `\n/* Native entrance positions the English description above its clipping wrapper. */\n[data-hf30-hero] [data-hf30-hero-wrap]{overflow:visible!important}\n/* The native MAIN centers children in a fixed-height box. Enlarged approved\n   sections can protrude above MAIN and cover the first scene; use normal flow. */\ndiv:has(>[data-hf30-hero]){height:auto!important;min-height:100svh!important}\n/* Native footer flex-basis:0 collapses under the naturally sized HOME root. */\ndiv:has(>[data-hf30-hero])>footer,[data-hmf30-footer]{flex:0 0 auto!important;height:auto!important;min-height:0!important}\n[data-hf30-page]{height:auto!important;min-height:0!important;flex-shrink:0!important}\n[data-hf30-main]{height:auto!important;min-height:0!important;justify-content:flex-start!important;flex-shrink:0!important}\n/* Prevent the native fixed-height flex page from shrinking the first scene. */\n[data-hf30-hero]{height:calc(100svh - 64px)!important;min-height:0!important;max-height:none!important;flex-shrink:0!important;position:relative!important;top:auto!important}\n@media(min-width:1024px){[data-hf30-hero]{height:calc(100svh - 80px)!important}}\n/* Reflow native layers inside the scene, including tall desktop windows. */\n@media(min-width:1280px){\n[data-hf30-hero]{box-sizing:border-box!important;width:100%!important;min-width:0!important;max-width:100%!important;height:calc(100svh - 80px)!important;min-height:0!important;position:relative!important;overflow:hidden!important;--hhr30-pad:clamp(32px,4vw,64px);--hhr30-type:clamp(28px,5.5svh,45px);--hhr30-logo:clamp(170px,33svh,268px);--hhr30-bottom:56px;--hhr30-tag-gap:32px;--hhr30-meta-bottom:20px}\n[data-hf30-hero] [data-hf30-hero-wrap]{display:contents!important;transform:none!important;opacity:1!important}\n[data-hf30-hero] [data-hf30-headline]{box-sizing:border-box!important;position:absolute!important;left:var(--hhr30-pad)!important;right:var(--hhr30-pad)!important;top:auto!important;bottom:var(--hhr30-bottom)!important;width:auto!important;height:auto!important;min-width:0!important;min-height:0!important;transform:none!important;opacity:1!important;display:flex!important;flex-direction:column!important;align-items:stretch!important;gap:6px!important}\n[data-hf30-hero] [data-hf30-headline] h1,[data-hf30-hero] [data-hf30-headline] span{font-size:var(--hhr30-type)!important;line-height:1.4!important;letter-spacing:0!important}\n[data-hf30-hero] [data-hf30-headline] h1{width:100%!important;height:auto!important;min-height:0!important;margin:0!important;white-space:normal!important}\n[data-hf30-hero] [data-hf30-spacer]{display:inline-block!important;width:calc(var(--hhr30-logo) + 8px)!important;font-size:0!important}\n[data-hf30-hero] [data-hf30-wordmark]{position:absolute!important;left:var(--hhr30-pad)!important;right:auto!important;top:auto!important;bottom:calc(var(--hhr30-bottom) + var(--hhr30-type)*.15)!important;width:var(--hhr30-logo)!important;height:calc(var(--hhr30-logo)*.14552)!important;transform:none!important;opacity:1!important}\n[data-hf30-hero] [data-hf30-wordmark] img{width:100%!important;height:100%!important;object-fit:contain!important}\n[data-hf30-hero] [data-hf30-tagline]{position:absolute!important;left:var(--hhr30-pad)!important;right:var(--hhr30-pad)!important;top:auto!important;bottom:calc(var(--hhr30-bottom) + var(--hhr30-tag-gap) + var(--hhr30-type)*2.8)!important;width:auto!important;height:auto!important;min-height:0!important;transform:none!important;opacity:1!important;display:block!important}\n[data-hf30-hero] [data-hf30-tagline] p{font-size:16px!important;line-height:1.5!important;letter-spacing:.04em!important;width:auto!important;height:auto!important;margin:0!important}\n[data-hf30-hero] [data-hf30-meta]{position:absolute!important;left:var(--hhr30-pad)!important;right:var(--hhr30-pad)!important;top:auto!important;bottom:var(--hhr30-meta-bottom)!important;width:auto!important;height:auto!important;transform:none!important;opacity:1!important;display:block!important}\n[data-hf30-hero] [data-hf30-meta] h3{width:auto!important;height:auto!important;margin:0!important;font-size:12px!important;line-height:1.4!important}\n}\n@media(min-width:1280px) and (min-height:851px){\n[data-hf30-hero]{--hhr30-bottom:clamp(56px,calc(56px + (100svh - 850px)*1.5),32svh);--hhr30-tag-gap:clamp(32px,calc(32px + (100svh - 850px)*.44),112px);--hhr30-meta-bottom:clamp(20px,calc(20px + (100svh - 850px)*.57),12svh)}\n}\n@media(min-width:1280px) and (max-height:420px){\n[data-hf30-hero]{--hhr30-type:clamp(17px,5svh,21px);--hhr30-logo:clamp(100px,30svh,126px);--hhr30-bottom:40px;--hhr30-tag-gap:18px;--hhr30-meta-bottom:12px}\n[data-hf30-hero] [data-hf30-tagline] p{font-size:12px!important}\n[data-hf30-hero] [data-hf30-meta] h3{font-size:10px!important}\n}\n/* Short landscape keeps the complete original scene within the available height. */\n@media(max-width:1279px) and (max-height:420px){\n[data-hf30-hero]{--hf30-type:clamp(17px,5svh,21px);--hf30-logo:clamp(100px,30svh,126px)}\n[data-hf30-hero] [data-hf30-headline]{bottom:40px!important;gap:4px!important}\n[data-hf30-hero] [data-hf30-wordmark]{bottom:calc(40px + var(--hf30-type)*.15)!important}\n[data-hf30-hero] [data-hf30-tagline]{bottom:calc(58px + var(--hf30-type)*2.8)!important}\n[data-hf30-hero] [data-hf30-meta]{bottom:12px!important}\n}\n`;\n  document.head.append(style);\n  window[KEY] = { destroy() { style.remove(); delete window[KEY]; } };\n})();\n\n;/* Tag the HOME footer at its actual sibling location for the existing mobile reflow. */\n(()=>{\n 'use strict';\n const KEY='__brainableHomeFooterRestored';window[KEY]?.destroy?.();\n const marked=new Map();let raf=0,disposed=false;\n const mark=(el,key)=>{if(!el)return;const attr='data-'+key;let attrs=marked.get(el);if(!attrs){attrs=new Map();marked.set(el,attrs)}if(!attrs.has(attr))attrs.set(attr,el.getAttribute(attr));el.setAttribute(attr,'')};\n function restore(el,attrs){for(const[attr,value]of attrs)value===null?el.removeAttribute(attr):el.setAttribute(attr,value);marked.delete(el)}\n function refresh(){raf=0;if(disposed)return;for(const[el,attrs]of marked)if(!el.isConnected)restore(el,attrs);\n  const hero=document.querySelector('[data-hf30-hero]');\n  const footer=hero?.parentElement?.querySelector(':scope>footer');\n  if(!footer){for(const[el,attrs]of marked)restore(el,attrs);return}\n  mark(footer,'hmf30-footer');mark(footer,'hf30-footer');\n  for(const el of footer.querySelectorAll('div'))if(el.textContent.replace(/[\\s\\u200b-\\u200d]/g,''))mark(el,'hf30-flow');\n }\n const schedule=()=>{if(!disposed&&!raf)raf=requestAnimationFrame(refresh)};\n const observer=new MutationObserver(schedule);observer.observe(document.body,{childList:true,subtree:true});\n window.addEventListener('resize',schedule,{passive:true});refresh();\n window[KEY]={destroy(){disposed=true;observer.disconnect();cancelAnimationFrame(raf);window.removeEventListener('resize',schedule);for(const[el,attrs]of marked)restore(el,attrs);delete window[KEY]}};\n})();\n\n;/*! Animated Text motion adapted from Bundui, Copyright (c) 2024 Bundui.\n * MIT License\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n * Source: bundui/components@c07468613dfe7db776f1749a0921a1e5e7bd33d5\n * Exact entrance: letters, 80ms stagger, 600ms, y10 -> 0, opacity0 -> 1, easeOut.\n */\n(() => {\n  'use strict';\n  const KEY = '__brainableHomeNativeAnimatedText';\n  window[KEY]?.destroy?.();\n  const FIRST = '잠재력을 깨우는 기술,';\n  const SECOND = '이 함께합니다.';\n  const WORDMARK_SOURCE = 'fde0244a54e45655f579546c98baaa88b4e2d8c7';\n  const WORDMARK_SLOTS = Array.from('브레인에이블').length;\n  const DURATION = 600;\n  const STAGGER = 80;\n  const EASING = 'cubic-bezier(0, 0, 0.58, 1)';\n  const LETTER_ATTR = 'data-hnmat30-letter';\n  const reduced = window.matchMedia('(prefers-reduced-motion: reduce)');\n  const bindings = new Map();\n  const normalize = text => String(text || '').replace(/[\\s\\u200b-\\u200d]+/g, ' ').trim();\n  const atHome = () => (location.pathname.replace(/\\/+$/, '') || '/') === '/';\n  const segmenter = typeof Intl.Segmenter === 'function'\n    ? new Intl.Segmenter('ko', { granularity: 'grapheme' }) : null;\n  const graphemes = text => segmenter\n    ? Array.from(segmenter.segment(text), part => part.segment) : Array.from(text);\n  const isSpace = text => /^[\\s\\u200b-\\u200d\\ufeff]+$/u.test(text);\n  let destroyed = false;\n  let frame = 0;\n\n  function matchingHeroes() {\n    const found = new Map();\n    if (!atHome()) return found;\n    for (const first of document.querySelectorAll('h1')) {\n      if (normalize(first.textContent) !== FIRST) continue;\n      let host = first.closest('[data-hf30-hero]');\n      if (!host) {\n        host = first.parentElement;\n        while (host && !Array.from(host.children).some(child => child.tagName === 'VIDEO')) host = host.parentElement;\n      }\n      if (!host || !host.getClientRects().length || host.getBoundingClientRect().width <= 0) continue;\n      const headline = first.closest('[data-hf30-headline]') || first.parentElement;\n      const second = Array.from(headline.querySelectorAll('h1')).find(node => node !== first && normalize(node.textContent) === SECOND);\n      if (!second) continue;\n      const image = host.querySelector(`[data-hf30-wordmark] img[src*=\"${WORDMARK_SOURCE}\"]`)\n        || host.querySelector(`img[src*=\"${WORDMARK_SOURCE}\"]`)\n        || host.querySelector('[data-hf30-wordmark] img');\n      found.set(host, { first, second, image });\n    }\n    return found;\n  }\n\n  function bind(host, native) {\n    const originalCopy = [native.first.textContent, native.second.textContent];\n    const originals = [];\n    const units = [];\n    const animations = new Set();\n    let cursor = 0;\n    let state = 'waiting';\n    let started = false;\n    let released = false;\n    let intersection = null;\n    let startedAt = null;\n    let completedAt = null;\n    let completedUnits = 0;\n    const baselineBounds = {\n      hero: host.getBoundingClientRect().toJSON(),\n      first: native.first.getBoundingClientRect().toJSON(),\n      second: native.second.getBoundingClientRect().toJSON(),\n      wordmark: native.image?.getBoundingClientRect().toJSON() || null,\n    };\n\n    function wrapHeading(heading) {\n      const walker = document.createTreeWalker(heading, NodeFilter.SHOW_TEXT);\n      const nodes = [];\n      for (let node = walker.nextNode(); node; node = walker.nextNode()) {\n        if (!node.nodeValue || isSpace(node.nodeValue) || node.parentElement?.closest('[data-hf30-spacer]')) continue;\n        nodes.push(node);\n      }\n      for (const original of nodes) {\n        if (!original.parentNode) continue;\n        const parent = original.parentNode;\n        const start = document.createComment('brainable-native-motion:start');\n        const end = document.createComment('brainable-native-motion:end');\n        const fragment = document.createDocumentFragment();\n        const replacement = [];\n        fragment.append(start);\n        let pendingSpace = '';\n        const flushSpace = () => {\n          if (!pendingSpace) return;\n          const node = document.createTextNode(pendingSpace);\n          replacement.push(node); fragment.append(node); pendingSpace = '';\n        };\n        for (const part of graphemes(original.nodeValue)) {\n          if (isSpace(part)) { pendingSpace += part; cursor++; continue; }\n          flushSpace();\n          const letter = document.createElement('span');\n          letter.setAttribute(LETTER_ATTR, String(cursor++));\n          letter.style.display = 'inline-block';\n          letter.textContent = part;\n          replacement.push(letter); fragment.append(letter);\n          units.push({ node: letter, index: cursor - 1, kind: 'letter', copy: part });\n        }\n        flushSpace(); fragment.append(end);\n        parent.replaceChild(fragment, original);\n        originals.push({ parent, original, start, end, replacement, copy: original.nodeValue });\n      }\n    }\n\n    wrapHeading(native.first);\n    if (native.image) units.push({ node: native.image, index: cursor, kind: 'wordmark', copy: null });\n    // The existing PNG is one visual unit; its timing occupies the six original\n    // brand letters so the following suffix retains the approved stagger timing.\n    cursor += WORDMARK_SLOTS;\n    wrapHeading(native.second);\n\n    const finish = () => {\n      for (const animation of animations) {\n        animation.onfinish = null;\n        try { animation.cancel(); } catch (_) { /* Native base style is final. */ }\n      }\n      animations.clear(); state = 'complete';\n      completedUnits = units.length; completedAt = performance.now();\n    };\n    const start = () => {\n      if (started || released) return;\n      started = true;\n      if (reduced.matches || document.hidden || units.some(unit => typeof unit.node.animate !== 'function')) { finish(); return; }\n      state = 'running'; startedAt = performance.now();\n      try {\n        for (const unit of units) {\n          const animation = unit.node.animate([\n            { opacity: 0, transform: 'translateY(10px)' },\n            { opacity: 1, transform: 'translateY(0px)' },\n          ], { duration: DURATION, delay: unit.index * STAGGER, easing: EASING, fill: 'backwards' });\n          animations.add(animation);\n          animation.onfinish = () => {\n            animation.onfinish = null; animations.delete(animation); completedUnits++;\n            try { animation.cancel(); } catch (_) { /* Native base style is final. */ }\n            if (!animations.size) { state = 'complete'; completedAt = performance.now(); }\n          };\n        }\n      } catch (_) { finish(); }\n    };\n    const visibleBounds = host.getBoundingClientRect();\n    if (reduced.matches || (visibleBounds.bottom > 0 && visibleBounds.top < window.innerHeight)) start();\n    else if (typeof IntersectionObserver === 'function') {\n      intersection = new IntersectionObserver(entries => {\n        if (!released && entries.some(entry => entry.isIntersecting)) { start(); intersection.disconnect(); }\n      }, { threshold: 0.01 });\n      intersection.observe(host);\n    } else start();\n\n    function currentRegion(record) {\n      if (record.start.parentNode !== record.parent || record.end.parentNode !== record.parent) return null;\n      const nodes = [];\n      for (let node = record.start.nextSibling; node && node !== record.end; node = node.nextSibling) nodes.push(node);\n      if (record.start.nextSibling === null || (nodes.length && nodes[nodes.length - 1].nextSibling !== record.end)) return null;\n      return nodes;\n    }\n    const intact = () => originalCopy[0] === native.first.textContent && originalCopy[1] === native.second.textContent\n      && units.every(unit => unit.node.isConnected && (unit.kind !== 'letter' || unit.node.textContent === unit.copy))\n      && originals.every(record => {\n        const nodes = currentRegion(record);\n        return nodes && nodes.length === record.replacement.length && nodes.every((node, index) => node === record.replacement[index]);\n      });\n    const motion = () => {\n      if (reduced.matches) { started = true; finish(); return; }\n      for (const animation of animations) {\n        try { document.hidden ? animation.pause() : animation.play(); } catch (_) { finish(); break; }\n      }\n    };\n    return {\n      host, native, intact, motion,\n      inspect() {\n        return {\n          copy: [native.first.textContent, native.second.textContent],\n          targetText: { first: FIRST, second: SECOND },\n          nativeCopyRetained: originalCopy[0] === native.first.textContent && originalCopy[1] === native.second.textContent,\n          originalWordmarkPresent: !!native.image?.isConnected,\n          originalCopy: originalCopy.slice(),\n          unitCount: units.length,\n          motion: { state, started, completed: state === 'complete', completedUnits, activeAnimations: animations.size,\n            units: units.length, timelineSlots: cursor,\n            duration: DURATION, stagger: STAGGER, initialY: 10, easing: EASING, reducedMotion: reduced.matches,\n            elapsedMs: startedAt === null ? 0 : Math.max(0, (completedAt ?? performance.now()) - startedAt),\n            totalDurationMs: units.length ? units[units.length - 1].index * STAGGER + DURATION : 0 },\n          units: units.map(unit => ({ kind: unit.kind, text: unit.copy, delay: unit.index * STAGGER })),\n          baselineBounds,\n          bounds: { hero: host.getBoundingClientRect().toJSON(), first: native.first.getBoundingClientRect().toJSON(),\n            second: native.second.getBoundingClientRect().toJSON(), wordmark: native.image?.getBoundingClientRect().toJSON() || null },\n        };\n      },\n      release() {\n        if (released) return;\n        released = true; intersection?.disconnect(); finish();\n        for (const record of originals.slice().reverse()) {\n          const nodes = currentRegion(record);\n          const unchanged = nodes && nodes.length === record.replacement.length\n            && nodes.every((node, index) => node === record.replacement[index])\n            && nodes.map(node => node.textContent).join('') === record.copy;\n          if (unchanged) {\n            record.parent.insertBefore(record.original, record.start);\n            for (const node of nodes) node.remove();\n          } else {\n            // React may have replaced/edited this region. Preserve its latest\n            // content and only unwrap connected elements owned by this addon.\n            for (const node of record.replacement) {\n              if (node.nodeType === Node.ELEMENT_NODE && node.hasAttribute(LETTER_ATTR) && node.parentNode) node.replaceWith(...node.childNodes);\n            }\n          }\n          record.start.remove(); record.end.remove();\n        }\n      },\n    };\n  }\n\n  function reconcile() {\n    frame = 0;\n    if (destroyed) return;\n    const wanted = matchingHeroes();\n    for (const [host, binding] of bindings) {\n      const native = wanted.get(host);\n      if (!native || native.first !== binding.native.first || native.second !== binding.native.second\n          || native.image !== binding.native.image || !binding.intact()) {\n        binding.release(); bindings.delete(host);\n      }\n    }\n    for (const [host, native] of wanted) if (!bindings.has(host)) bindings.set(host, bind(host, native));\n  }\n  function schedule() { if (!destroyed && !frame) frame = requestAnimationFrame(reconcile); }\n  const observer = new MutationObserver(schedule);\n  observer.observe(document.body, { childList: true, characterData: true, subtree: true });\n  const updateMotion = () => { for (const binding of bindings.values()) binding.motion(); };\n  window.addEventListener('resize', schedule, { passive: true });\n  window.addEventListener('popstate', schedule);\n  document.addEventListener('visibilitychange', updateMotion);\n  if (reduced.addEventListener) reduced.addEventListener('change', updateMotion); else reduced.addListener(updateMotion);\n  reconcile();\n  const api = {\n    inspect() { return { route: location.pathname, activeHeroes: bindings.size, source: 'Bundui Animated Text, native nodes only',\n      heroes: Array.from(bindings.values(), binding => binding.inspect()) }; },\n    destroy() {\n      if (destroyed) return;\n      destroyed = true; observer.disconnect(); cancelAnimationFrame(frame);\n      window.removeEventListener('resize', schedule); window.removeEventListener('popstate', schedule);\n      document.removeEventListener('visibilitychange', updateMotion);\n      if (reduced.removeEventListener) reduced.removeEventListener('change', updateMotion); else reduced.removeListener(updateMotion);\n      for (const binding of bindings.values()) binding.release();\n      bindings.clear();\n      if (window[KEY] === api) delete window[KEY];\n    },\n  };\n  window[KEY] = api;\n})();\n\n\n;/* Approved tPBM film, limited to the existing native mechanism image frame. */\n(() => {\n  'use strict';\n  const KEY='__brainableTPBMMotion31';\n  window[KEY]?.dispose();\n  const VIDEO=\"https://d2ol7oe51mr4n9.cloudfront.net/user_3BNVGSW82f0j62u9r7tl0n0tA52/6116d975-2f8e-41ec-889d-d379cab336c0.mp4\";\n  const POSTER=\"https://d2ol7oe51mr4n9.cloudfront.net/user_3BNVGSW82f0j62u9r7tl0n0tA52/411feb5b-255b-47b2-af2d-dba75d5e914d.png\";\n  const mediaQuery=matchMedia('(prefers-reduced-motion: reduce)');\n  const bindings=new Map();\n  let stopped=false, raf=0, route=location.pathname;\n  const style=document.createElement('style');\n  style.id='brainable-tpbm-motion-final31';\n  style.textContent=`\n    [data-tp20-image-frame][data-tp31-motion]{background:#000!important;isolation:isolate!important;overflow:hidden!important;}\n    [data-tp31-layer]{position:absolute!important;inset:0!important;z-index:1!important;background:#000!important;opacity:0;pointer-events:none!important;}\n    [data-tp31-ready] [data-tp31-layer]{opacity:1!important;}\n    [data-tp31-ready] img[data-tp20-image]{opacity:0!important;}\n    [data-tp31-layer] > img,[data-tp31-layer] > video{position:absolute!important;inset:0!important;width:100%!important;height:100%!important;max-width:none!important;max-height:none!important;object-fit:contain!important;display:block!important;margin:0!important;padding:0!important;border:0!important;background:#000!important;}\n    [data-tp31-layer] > video{opacity:0;}\n    [data-tp31-video-ready] [data-tp31-layer] > video{opacity:1!important;}\n    [data-tp31-toggle]{position:absolute!important;right:10px!important;bottom:10px!important;z-index:2!important;width:36px!important;height:36px!important;min-width:36px!important;min-height:36px!important;display:grid!important;place-items:center!important;border:1px solid #677b9c!important;border-radius:50%!important;background:rgba(8,16,32,.82)!important;color:#fff!important;cursor:pointer!important;opacity:0;visibility:hidden;}\n    [data-tp31-ready] [data-tp31-toggle]{opacity:1!important;visibility:visible!important;}\n    [data-tp31-toggle]:focus-visible{outline:2px solid #8bb9ff!important;outline-offset:3px!important;}\n    [data-tp31-toggle] svg{width:16px!important;height:16px!important;display:block!important;}\n  `;\n  document.head.appendChild(style);\n  const onRoute=()=>location.pathname.replace(/\\/+$/,'')==='/laserable';\n  const icon=paused=>paused?'<svg viewBox=\"0 0 16 16\" aria-hidden=\"true\"><path d=\"M4 2L13 8L4 14Z\" fill=\"currentColor\"/></svg>':'<svg viewBox=\"0 0 16 16\" aria-hidden=\"true\"><path d=\"M4 2V14M12 2V14\" stroke=\"currentColor\" stroke-width=\"3\"/></svg>';\n  function bind(frame) {\n    const original=frame.querySelector('img[data-tp20-image]');\n    if(!original) return;\n    const layer=document.createElement('div');layer.setAttribute('data-tp31-layer','');\n    const poster=document.createElement('img');poster.alt='';poster.src=POSTER;poster.decoding='async';\n    const video=document.createElement('video');\n    video.muted=true;video.defaultMuted=true;video.loop=true;video.playsInline=true;\n    video.setAttribute('muted','');video.setAttribute('playsinline','');video.setAttribute('loop','');\n    video.setAttribute('aria-label','빛의 진입과 신경세포·미토콘드리아의 반응 및 신호 전달을 보여주는 메카니즘 애니메이션');\n    video.preload=mediaQuery.matches?'none':'metadata';video.poster=POSTER;video.src=VIDEO;\n    const button=document.createElement('button');button.type='button';button.setAttribute('data-tp31-toggle','');\n    const record={frame,layer,poster,video,button,visible:false,userPaused:false,userStarted:false,failed:false};\n    const label=()=>{const paused=video.paused;button.setAttribute('aria-label',paused?'애니메이션 재생':'애니메이션 일시정지');button.title=paused?'애니메이션 재생':'애니메이션 일시정지';button.innerHTML=icon(paused);};\n    const start=()=>{\n      if(record.failed||record.userPaused||(!record.userStarted&&mediaQuery.matches)||!record.visible||document.hidden) {video.pause();return;}\n      video.play().catch(()=>{label();});\n    };\n    const showPoster=()=>{if(poster.naturalWidth) frame.setAttribute('data-tp31-ready','');};\n    const loaded=()=>{frame.setAttribute('data-tp31-ready','');frame.setAttribute('data-tp31-video-ready','');label();};\n    const error=()=>{record.failed=true;frame.removeAttribute('data-tp31-video-ready');if(!poster.naturalWidth)frame.removeAttribute('data-tp31-ready');label();};\n    const toggle=event=>{event.preventDefault();event.stopPropagation();if(video.paused){record.userPaused=false;record.userStarted=true;record.failed=false;record.visible=true;video.play().catch(label);}else{record.userPaused=true;video.pause();}label();};\n    const visibility=()=>start();\n    const preference=()=>{record.userStarted=false;start();};\n    poster.addEventListener('load',showPoster);video.addEventListener('loadeddata',loaded);video.addEventListener('error',error);\n    video.addEventListener('play',label);video.addEventListener('pause',label);button.addEventListener('click',toggle);\n    document.addEventListener('visibilitychange',visibility);mediaQuery.addEventListener('change',preference);\n    layer.append(poster,video);frame.append(layer,button);frame.setAttribute('data-tp31-motion','');\n    const observer=new IntersectionObserver(entries=>{record.visible=entries[0].isIntersecting;start();},{threshold:0.02});observer.observe(frame);\n    record.dispose=()=>{observer.disconnect();video.pause();video.removeAttribute('src');video.load();poster.removeEventListener('load',showPoster);video.removeEventListener('loadeddata',loaded);video.removeEventListener('error',error);video.removeEventListener('play',label);video.removeEventListener('pause',label);button.removeEventListener('click',toggle);document.removeEventListener('visibilitychange',visibility);mediaQuery.removeEventListener('change',preference);layer.remove();button.remove();for(const attr of ['data-tp31-motion','data-tp31-ready','data-tp31-video-ready'])frame.removeAttribute(attr);};\n    bindings.set(frame,record);showPoster();label();\n  }\n  function scan(){raf=0;if(stopped)return;for(const [frame,record] of bindings)if(!onRoute()||!frame.isConnected){record.dispose();bindings.delete(frame);}if(onRoute())for(const frame of document.querySelectorAll('[data-tp20-diagram] [data-tp20-image-frame]'))if(!bindings.has(frame))bind(frame);}\n  function schedule(){if(!stopped&&!raf)raf=requestAnimationFrame(scan);}\n  const observer=new MutationObserver(schedule);observer.observe(document.documentElement,{childList:true,subtree:true,attributes:true,attributeFilter:['data-tp20-diagram','data-tp20-image-frame','data-tp20-image']});\n  const timer=setInterval(()=>{if(route!==location.pathname){route=location.pathname;schedule();}},300);\n  window.addEventListener('popstate',schedule);window.addEventListener('pageshow',schedule);\n  window[KEY]={scan,inspect(){return{route:location.pathname,reducedMotion:mediaQuery.matches,bindings:[...bindings.values()].map(r=>({connected:r.frame.isConnected,visible:r.visible,ready:r.video.readyState,width:r.video.videoWidth,height:r.video.videoHeight,currentTime:r.video.currentTime,paused:r.video.paused,loop:r.video.loop,muted:r.video.muted,playsInline:r.video.playsInline,posterLoaded:r.poster.naturalWidth>0,error:r.video.error?.code||null,frame:r.frame.getBoundingClientRect().toJSON()}))};},dispose(){stopped=true;observer.disconnect();clearInterval(timer);if(raf)cancelAnimationFrame(raf);window.removeEventListener('popstate',schedule);window.removeEventListener('pageshow',schedule);for(const record of bindings.values())record.dispose();bindings.clear();style.remove();delete window[KEY];}};\n  schedule();\n})();\n\n\n;/* HOME only: disable the accidental /about_us anchor around the complete native\n * MAIN. Preserve the mobile company card, all descendants, native event handlers,\n * classes, layout, copy and every real navigation/CTA link.\n * Observed source: backup/home-before.html, desktop breakpoint node-0_4.\n * This module must run with the existing confirmed-hydration gate. It removes\n * only the wrapper's href. A capture guard on that exact wrapper blocks bare\n * background/text clicks while passing every descendant action through.\n */\n(function brainableHomeUnintendedLinkFix() {\n  'use strict';\n  const KEY = '__brainableHomeUnintendedLinkFix31';\n  const MARK = 'data-hul31-body-link';\n  const ACTION = 'a[href],button,[role=\"link\"],[role=\"button\"],input,select,textarea,option,label,summary,form,[contenteditable]:not([contenteditable=\"false\"])';\n  if (window[KEY]) return;\n  const records = new Map();\n  let stopped = false, frame = 0, timer = 0, lastRoute = location.pathname;\n  const normalize = value => (value || '').replace(/\\s+/g, ' ').trim();\n\n  function ready() {\n    const phase = window.__brainableHydrationGate31?.inspect?.().phase;\n    return phase === 'active' || phase === 'starting';\n  }\n  function onHome() { return location.pathname.replace(/\\/+$/, '') === ''; }\n  function isAboutHref(value) {\n    if (!value) return false;\n    try {\n      const url = new URL(value, location.href);\n      return url.origin === location.origin && url.pathname.replace(/\\/+$/, '') === '/about_us' && !url.search && !url.hash;\n    } catch (_) { return false; }\n  }\n  function exactBodyWrapper(anchor) {\n    if (!anchor.isConnected || anchor.tagName !== 'A' || anchor.closest('header,nav,footer')) return false;\n    // A direct native MAIN is the defining defect. The mobile card is a DIV\n    // inside MAIN and intentionally remains a normal company-information link.\n    const main = [...anchor.children].find(node => node.tagName === 'MAIN');\n    if (!main || anchor.children.length !== 1 || main.querySelector('header,nav,footer')) return false;\n    const text = normalize(main.textContent);\n    const intro = [...main.querySelectorAll('h1,h2,h3')].some(node => normalize(node.textContent).startsWith('BrainAble, 두뇌의 가능성을 깨우다'));\n    return intro && text.includes('LASERABLE') && text.includes('READINGABLE') && text.includes('Hear From Our Clients');\n  }\n  function isDescendantAction(event, anchor) {\n    const path = typeof event.composedPath === 'function' ? event.composedPath() : [];\n    if (path.length) {\n      for (const node of path) {\n        if (node === anchor) break;\n        if (node?.nodeType === 1 && node.matches(ACTION)) return true;\n      }\n      return false;\n    }\n    for (let node = event.target?.nodeType === 1 ? event.target : event.target?.parentElement;\n         node && node !== anchor; node = node.parentElement) {\n      if (node.matches(ACTION)) return true;\n    }\n    return false;\n  }\n  function guardFor(anchor) {\n    return event => {\n      if (!onHome() || !records.has(anchor) || !exactBodyWrapper(anchor) || isDescendantAction(event, anchor)) return;\n      // This one malformed native anchor may retain a React router callback\n      // closing over its old href. Block only its background/text activation.\n      event.preventDefault();\n      event.stopPropagation();\n    };\n  }\n  function restore(anchor, record) {\n    anchor.removeEventListener('click', record.guard, true);\n    // Preserve a newer value if React or another explicit edit changed the link.\n    if (!anchor.hasAttribute('href')) anchor.setAttribute('href', record.href);\n    if (anchor.getAttribute(MARK) === '') {\n      if (record.marker === null) anchor.removeAttribute(MARK);\n      else anchor.setAttribute(MARK, record.marker);\n    }\n    records.delete(anchor);\n  }\n  function reconcile() {\n    frame = 0;\n    if (stopped) return;\n    if (!ready()) return;\n    const wanted = new Set();\n    if (onHome()) {\n      for (const anchor of document.querySelectorAll('a[href],a[' + MARK + ']')) {\n        const current = anchor.getAttribute('href');\n        const saved = records.get(anchor);\n        if (!isAboutHref(current === null ? saved?.href : current) || !exactBodyWrapper(anchor)) continue;\n        wanted.add(anchor);\n        if (!saved) {\n          const record = {href:current, target:anchor.getAttribute('target'), tabindex:anchor.getAttribute('tabindex'), marker:anchor.getAttribute(MARK), guard:guardFor(anchor)};\n          records.set(anchor, record);\n          anchor.addEventListener('click', record.guard, true);\n        }\n        if (anchor.hasAttribute('href')) anchor.removeAttribute('href');\n        if (anchor.getAttribute(MARK) !== '') anchor.setAttribute(MARK, '');\n      }\n    }\n    for (const [anchor, record] of [...records]) if (!wanted.has(anchor)) restore(anchor, record);\n  }\n  function schedule() {\n    if (!stopped && !frame) frame = requestAnimationFrame(reconcile);\n  }\n  const observer = new MutationObserver(schedule);\n  observer.observe(document.documentElement, {\n    childList:true, characterData:true, subtree:true, attributes:true, attributeFilter:['href']\n  });\n  // Read-only route polling also catches pushState/replaceState with no DOM\n  // mutation; the browser's history methods and all click handlers stay intact.\n  timer = window.setInterval(() => {\n    if (stopped) return;\n    if (!ready()) { schedule(); return; }\n    if (location.pathname !== lastRoute) { lastRoute = location.pathname; schedule(); }\n  }, 250);\n  window.addEventListener('popstate', schedule);\n  window.addEventListener('pageshow', schedule);\n  window.navigation?.addEventListener('navigatesuccess', schedule);\n  document.addEventListener('DOMContentLoaded', schedule);\n  window[KEY] = {\n    scan:reconcile,\n    inspect() {\n      return {route:location.pathname, hydrationReady:ready(), wrappers:[...records].map(([anchor, record]) => ({\n        breakpoint:anchor.closest('[data-breakpoint-id]')?.getAttribute('data-breakpoint-id') || null,\n        connected:anchor.isConnected, originalHref:record.href, currentHref:anchor.getAttribute('href'),\n        originalTarget:record.target, currentTarget:anchor.getAttribute('target'), originalTabindex:record.tabindex, currentTabindex:anchor.getAttribute('tabindex'),\n        descendantActions:anchor.querySelectorAll('a[href],button,[role=\"link\"],[role=\"button\"]').length\n      }))};\n    },\n    destroy() {\n      if (stopped) return;\n      stopped = true;\n      observer.disconnect();\n      if (frame) cancelAnimationFrame(frame);\n      window.clearInterval(timer);\n      window.removeEventListener('popstate', schedule);\n      window.removeEventListener('pageshow', schedule);\n      window.navigation?.removeEventListener('navigatesuccess', schedule);\n      document.removeEventListener('DOMContentLoaded', schedule);\n      for (const [anchor, record] of [...records]) restore(anchor, record);\n      if (window[KEY] === this) delete window[KEY];\n    }\n  };\n  schedule();\n})();\n\n\n;/* Approved HOME fallback and mobile copy protection. Native content is retained. */\n(function brainableMobileHomeReliability32() {\n  'use strict';\n  const KEY = '__brainableMobileHomeReliability32';\n  window[KEY]?.dispose();\n  const bindings = new Map(), cards = new Map();\n  let frame = 0, stopped = false;\n  const home = () => location.pathname.replace(/\\/+$/, '') === '';\n  function bind(hero) {\n    const videos = Array.from(hero.children).filter(e => e.tagName === 'VIDEO');\n    const pause = event => { const v = event?.currentTarget; if (v) v.pause(); };\n    for (const video of videos) {\n      video.pause();\n      video.addEventListener('play', pause);\n    }\n    hero.setAttribute('data-hm32-poster', '');\n    return {videos,dispose() { videos.forEach(v => v.removeEventListener('play',pause)); hero.removeAttribute('data-hm32-poster'); }};\n  }\n  function sync() {\n    frame = 0;\n    if (stopped) return;\n    const heroes = home() ? new Set(Array.from(document.querySelectorAll('[data-bh30-native-hero],[data-hf30-hero]'))) : new Set();\n    for (const [hero,entry] of bindings) {\n      const next=Array.from(hero.children).filter(e=>e.tagName==='VIDEO');\n      if (!heroes.has(hero) || !hero.isConnected || next.length!==entry.videos.length || next.some((v,i)=>v!==entry.videos[i])) { entry.dispose();bindings.delete(hero); }\n    }\n    for (const hero of heroes) if (!bindings.has(hero)) bindings.set(hero,bind(hero));\n    const desired=new Set();\n    if (home()) for (const card of document.querySelectorAll('[data-hlm-card]')) {\n      const name = card.querySelector('[data-hf30-name]')?.textContent.replace(/[\\s\\u200b]/g,'');\n      if (name === 'LASERABLE') desired.add(card);\n    }\n    for (const [card,old] of cards) if (!desired.has(card)) { old===null?card.removeAttribute('data-hm32-laserable'):card.setAttribute('data-hm32-laserable',old);cards.delete(card); }\n    for (const card of desired) if (!cards.has(card)) { cards.set(card,card.getAttribute('data-hm32-laserable'));card.setAttribute('data-hm32-laserable',''); }\n  }\n  function schedule() { if (!stopped && !frame) frame=requestAnimationFrame(sync); }\n  const observer = new MutationObserver(schedule);\n  observer.observe(document.body,{childList:true,subtree:true,attributes:true,attributeFilter:['data-bh30-native-hero','data-hf30-hero','data-hlm-card','data-hf30-name']});\n  window.addEventListener('popstate',schedule);\n  sync();\n  window[KEY] = {\n    inspect() { return {route:location.pathname,heroes:Array.from(bindings.keys()).map(hero=>({\n      rect:hero.getBoundingClientRect().toJSON(),poster:getComputedStyle(hero).backgroundImage.startsWith('url('),\n      renderer:hero.querySelector('.bh30-background')?.getAttribute('data-state'),\n      videos:Array.from(hero.querySelectorAll(':scope > video')).map(v=>({paused:v.paused,visibility:getComputedStyle(v).visibility,display:getComputedStyle(v).display}))\n    })),products:Array.from(document.querySelectorAll('[data-hlm-card] [data-hf30-name]')).map(e=>({name:e.textContent,whiteSpace:getComputedStyle(e).whiteSpace,overflowWrap:getComputedStyle(e).overflowWrap,width:e.getBoundingClientRect().width}))}; },\n    dispose() { stopped=true; observer.disconnect();cancelAnimationFrame(frame); window.removeEventListener('popstate',schedule);for (const entry of bindings.values()) entry.dispose();bindings.clear();for (const [card,old] of cards) old===null?card.removeAttribute('data-hm32-laserable'):card.setAttribute('data-hm32-laserable',old);cards.clear(); }\n  };\n})();\n\n\n});\n\n</script>","addBypassLinks":true,"socialImageFilename":"44da5c3edea87192afa55819594c43cdfdac890b.png","labs":{"E5FBBA911B2B7A09E649D4BE6CDF8591EAEFC881":false},"description":"브레인에이블은 두뇌 기능 평가와 인지·학습 지원을 위한 전문 솔루션을 개발·공급합니다. 레이저에이블, 리딩에이블, 리스닝에이블의 제품 정보와 도입 상담을 확인하세요.\nBrainable develops and provides professional solutions for brain function assessment and cognitive and learning support. Explore product information and consultation options for LaserAble, ReadingAble, and ListeningAble."},"sourceCodeHash":"a197a94d2ab0f7d96916c9a86227b13daf07febf"}