{"version":3,"sources":["jsdelivr-header.js","/npm/spaces-ws@2.10.6/main.cjs.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,ACNA,IAAI,MAAQ,QAAQ,SAGpB,OAAO,eAAe,QAAS,aAAc,CAAE,OAAO,IAEtD,IAAI,SAAW,QAAQ,kCACnB,8BAAgC,QAAQ,uDACxC,MAAQ,QAAQ,SAChB,MAAQ,QAAQ,sBAChB,MAAQ,QAAQ,SAChB,QAAU,QAAQ,uBAClB,OAAS,QAAQ,UACjB,KAAO,QAAQ,qBACf,OAAS,QAAQ,uBACjB,gBAAkB,QAAQ,6CAC1B,WAAa,QAAQ,yCACrB,aAAe,QAAQ,iBACvB,oBAAsB,QAAQ,gDAC9B,aAAe,QAAQ,kBACvB,4BAA8B,QAAQ,qDACtC,QAAU,QAAQ,kBAClB,SAAW,QAAQ,YACnB,OAAS,QAAQ,mBACjB,kBAAoB,QAAQ,uBAC5B,kBAAoB,QAAQ,2CAC5B,GAAK,QAAQ,mBACb,YAAc,QAAQ,gBACtB,mBAAqB,QAAQ,wBAC7B,mBAAqB,QAAQ,oDAC7B,gBAAkB,QAAQ,qBAC1B,sBAAwB,QAAQ,qCAChC,OAAS,QAAQ,UACjB,UAAY,QAAQ,cACpB,KAAO,QAAQ,sBACf,SAAW,QAAQ,aAEvB,SAAS,sBAAuB,GAAK,OAAO,GAAkB,iBAAN,GAAkB,YAAa,EAAI,EAAI,CAAE,QAAW,EAAK,CAEjH,SAAS,kBAAkB,GACvB,GAAI,GAAK,EAAE,WAAY,OAAO,EAC9B,IAAI,EAAI,OAAO,OAAO,MAatB,OAZI,GACA,OAAO,KAAK,GAAG,SAAQ,SAAU,GAC7B,GAAU,YAAN,EAAiB,CACjB,IAAI,EAAI,OAAO,yBAAyB,EAAG,GAC3C,OAAO,eAAe,EAAG,EAAG,EAAE,IAAM,EAAI,CACpC,YAAY,EACZ,IAAK,WAAc,OAAO,EAAE,EAAI,GAExC,CACJ,IAEJ,EAAW,QAAI,EACR,OAAO,OAAO,EACzB,CAEA,IAAI,kBAAiC,sBAAsB,UACvD,uCAAsD,sBAAsB,+BAC5E,kBAAiC,kBAAkB,QACnD,qCAAoD,sBAAsB,6BAC1E,kBAAiC,sBAAsB,UACvD,gBAA+B,sBAAsB,QACrD,2BAA0C,sBAAsB,mBAChE,mBAAkC,sBAAsB,WAExD,WAAa,y5IACb,OAAS,2TACT,OAAS,6QAQT,WAAa,SAAoB,GACnC,IAAI,EAAW,MAAM,OAAO,GAC5B,MAAO,CACL,QAAS,SAAiB,GACxB,IAAI,EAAO,EAAM,YACb,EAAQ,EAAO,EAAS,QAAU,EAAI,EAM1C,OAJI,IACF,EAAS,QAAU,GAGd,CACT,EAEJ,EAOI,gBAAkB,SAAyB,EAAW,EAAU,GAClE,IAAI,EAAU,WAAW,GACzB,MAAM,UAAS,SAAU,EAAO,GACzB,EAAQ,QAAQ,EAAM,QAC3B,EAAS,EAAO,EAClB,GAAG,EACL,EAEI,YAAc,CAAC,QACnB,SAAS,WAAW,GAClB,IAAI,EAAO,EAAM,KACb,EAAO,uCAAgD,QAAE,EAAO,aAEhE,EAAM,MAAM,SAAQ,WACtB,OAAgB,MAAR,OAAe,EAAS,EAAK,WAAa,SACpD,GAAG,CAAC,IACA,EAAO,MAAM,SAAQ,WACvB,OAAO,KAAK,QACd,GAAG,IACC,EAAQ,MAAM,SAAQ,WACxB,OAAO,IAAI,MAAM,MAAM,EACzB,GAAG,CAAC,IAQA,EAHa,QAAQ,UAAU,CACjC,IAAK,IAEc,IAEjB,EAAM,MAAM,SAAQ,WACtB,IAAI,EAAW,IAAI,MAAM,qBAAqB,CAC5C,UAAW,IACX,UAAW,IACX,gBAAiB,IACjB,KAAM,MAAM,aAed,OAZA,EAAS,gBAAkB,SAAU,GACnC,EAAO,SAAS,OAAS,IAAI,MAAM,QAlB1B,GAmBT,EAAO,SAAS,KAAO,IAAI,MAAM,QAAQ,GACzC,EAAO,SAAS,MAAQ,IAAI,MAAM,QAAQ,GAC1C,EAAO,SAAS,yBAA2B,IAAI,MAAM,QApBnC,KAqBlB,EAAO,SAAS,qBAAuB,IAAI,MAAM,QApBpC,MAqBb,IAAI,EAAW,kMACf,EAAO,aAAe,EAAW,WAAa,EAAO,aAAa,QAAQ,0BAA2B,QACrG,EAAO,eAAiB,EAAW,EAAO,eAAe,QAAQ,gCAAiC,QAClG,EAAS,SAAS,OAAS,CAC7B,EAEO,CACT,GAAG,CA9BU,EA8BD,EA7BU,IACL,KA4B+B,OAAQ,SACpD,EAAU,WAAW,IASzB,OARA,MAAM,UAAS,SAAU,GACvB,IAAI,EAEA,EAAQ,EAAK,MACJ,MAAP,GAAiD,OAAjC,EAAgB,EAAI,WAAqB,EAAc,QAAY,EAAQ,QAAQ,KACzG,EAAI,SAAS,OAAO,SAAS,KAAK,MAAQ,EAAM,YAAc,EAAW,IAAP,EAClE,EAAI,SAAS,OAAO,SAAS,MAAM,MAAM,IAAI,EAAI,OACnD,IACoB,MAAM,cAAc,QAAS,kBAA2B,QAAE,CAC5E,KAAM,uBACL,GAAoB,MAAM,cAAc,OAAQ,CACjD,SAAU,EACV,MAAO,IACO,MAAM,cAAc,uBAAwB,CAC1D,KAAM,CA9CK,EA8CI,GAAI,OAEvB,CAEA,IAAI,WAAa,6nBACb,QAAU,w8FACV,QAAU,4uCACV,WAAa,sOAAwO,QAAU,KAC/P,OAAS,yoBACT,WAAa,0QAA4Q,WAAa,SAAW,QAAU,KAC3T,OAAS,ybAOT,KAAoB,WAMtB,SAAS,EAAK,EAAG,EAAG,GAclB,YAbU,IAAN,IACF,EAAI,QAGI,IAAN,IACF,EAAI,QAGI,IAAN,IACF,EAAI,IAGN,KAAK,gBAAgB,EAAG,EAAG,GACpB,IACT,CAEA,IAAI,EAAS,EAAK,UAoElB,OAlEA,EAAO,gBAAkB,SAAyB,EAAG,EAAG,GAgBtD,YAfU,IAAN,IACF,EAAI,QAGI,IAAN,IACF,EAAI,QAGI,IAAN,IACF,EAAI,IAGN,KAAK,UAAY,EACjB,KAAK,YAAc,EACnB,KAAK,QAAU,EACR,IACT,EAEA,EAAO,WAAa,SAAoB,GACtC,IAAI,EAAQ,kBAAkB,MAAM,kBAAkB,IAAI,IAE1D,OAAK,GAKL,KAAK,UAAY,EAAM,EAAI,IAC3B,KAAK,YAAc,EAAM,EAAI,KAC7B,KAAK,QAAU,EAAM,EACd,OAPL,QAAQ,KAAK,0CACN,KAOX,EAEA,EAAO,eAAiB,SAAwB,GAC9C,IAAI,EAAM,EAAK,OAGf,OAFA,KAAK,UAAY,oBAAoB,GACrC,KAAK,YAA+C,IAAhC,GAAY,GAAP,EAAW,EAAI,EAAI,IACrC,IACT,EAEA,EAAO,WAAa,SAAoB,GAEtC,OADA,KAAK,QAAU,EACR,IACT,EAEA,EAAO,OAAS,WACd,IAAI,EAAa,kBAAkB,IAAI,CACrC,KAAM,QACN,EAAG,KAAK,QACR,EAAsB,KAAnB,KAAK,YACR,EAAoB,IAAjB,KAAK,YAEV,OAAO,kBAAkB,UAAU,EACrC,EAEA,EAAO,YAAc,WACnB,IAAI,EAAO,KAAK,UAAY,GAAM,EAAI,KAAK,UAAY,GAAM,KAAK,UAAY,GAC1E,EAAO,KAAK,YACZ,EAAO,IAAO,KAAK,QAAU,IACjC,OAAO,IAAI,GAAO,gBAAgB,EAAM,EAAM,EAChD,EAEA,EAAO,MAAQ,WACb,OAAO,IAAI,EAAK,KAAK,UAAW,KAAK,YAAa,KAAK,QACzD,EAEO,CACT,CA5FwB,GA6FpB,eAAiB,IAEjB,oBAAsB,SAA2B,EAAK,QAC3C,IAAT,IACF,EAAO,IAKT,IAFA,IAAI,EAAQ,EAEH,EAAI,EAAG,EAAI,EAAI,OAAQ,IAC9B,GAAS,EAAI,OAAO,EAAG,GAAG,WAAW,GAGvC,IAAI,EAAa,EAAO,eACxB,OAAO,EAAQ,EAAa,CAC9B,EAEI,YAAc,CAAC,SACnB,SAAS,YAAY,GACnB,IAAI,EAAQ,EAAM,MACd,EAAO,uCAAgD,QAAE,EAAO,aAGhE,EAAO,MAAM,SAAQ,WACvB,OAAO,KAAK,QACd,GAAG,IACC,EAAM,MAAM,SAAQ,WACtB,IAAI,EAAW,IAAI,MAAM,qBAAqB,CAC5C,UAAW,IACX,UAAW,IACX,KAAM,MAAM,aAiBd,OAdA,EAAS,gBAAkB,SAAU,GACnC,IAAI,EAAW,CACb,KAAM,IAAI,MAAM,QAAQ,GACxB,MAAO,IAAI,MAAM,QAAQ,IAAI,MAAM,MAAM,YACzC,QAAS,IAAI,MAAM,QAAQ,IAAI,MAAM,QAAQ,EAAG,EAAG,IACnD,MAAO,IAAI,MAAM,QAAQ,IAE3B,EAAO,SAAW,kBAA2B,QAAE,CAAC,EAAG,EAAO,SAAU,GACpE,EAAO,aAAe,WAAa,EAAO,aAAa,QAAQ,6BAA8B,+BAAiC,QAC9H,EAAO,eAAiB,WAAa,EAAO,eAAe,QAAQ,gCAAiC,kCAAoC,QACxI,EAAS,SAAS,OAAS,CAC7B,EAEA,EAAS,aAAc,EAChB,CACT,GAAG,IAcH,OAbA,MAAM,WAAU,WACd,GAAK,GAAQ,EAAI,SAAS,QAAW,EAArC,CACA,IAAI,EAAQ,EAAI,SAAS,OAAO,SAC5B,EAAQ,EAAQ,EAAM,WAAa,IAAI,KAC3C,EAAM,MAAM,MAAM,IAAI,IAAI,MAAM,MAAM,EAAM,WAC5C,EAAM,QAAQ,MAAiB,MAAT,OAAgB,EAAS,EAAM,YACrD,EAAM,MAAM,MAAiB,MAAT,OAAgB,EAAS,EAAM,UALD,CAMpD,GAAG,CAAC,EAAO,IACX,gBAAgB,IAAI,SAAU,GAC5B,IAAI,EAAQ,EAAK,MACZ,GAAQ,EAAI,SAAS,SAC1B,EAAI,SAAS,OAAO,SAAS,KAAK,MAAQ,EAAM,YAAqB,IAAP,EAChE,IACoB,MAAM,cAAc,QAAS,kBAA2B,QAAE,CAC5E,KAAM,wBACL,GAAoB,MAAM,cAAc,OAAQ,CACjD,SAAU,EACV,MAAO,IACO,MAAM,cAAc,uBAAwB,CAC1D,KAAM,CA9CK,EA8CI,GAAI,OAEvB,CAEA,IAAI,UAAY,IAAI,MAAM,QAAQ,GAAI,EAAG,GAKzC,SAAS,aAAa,GACpB,IAAI,EAAiB,EAAM,QACvB,OAA6B,IAAnB,GAAmC,EAC7C,EAAW,EAAM,SACjB,EAAQ,MAAM,OAAO,MACrB,EAAY,MAAM,SAAQ,WAC5B,OAAO,IAAI,MAAM,OACnB,GAAG,IACC,EAAW,MAAM,SAAQ,WAC3B,OAAO,IAAI,MAAM,OACnB,GAAG,IACC,EAAY,MAAM,SAAQ,WAC5B,OAAO,IAAI,MAAM,UACnB,GAAG,IACC,EAAa,MAAM,SAAQ,WAC7B,OAAO,IAAI,MAAM,UACnB,GAAG,IACC,EAAa,MAAM,SAAQ,WAC7B,OAAO,IAAI,MAAM,UACnB,GAAG,IACC,EAAY,MAAM,SAAQ,WAC5B,OAAO,IAAI,MAAM,KACnB,GAAG,IAqBH,OApBA,gBAAgB,IAAI,SAAU,EAAM,GAClC,IAAI,EAEA,EAAS,EAAK,OAClB,GAAK,EAAM,QAAX,CAKA,GAJkD,OAAjD,EAAwB,EAAM,QAAQ,SAA2B,EAAsB,mBAAmB,GAC3G,EAAU,kBAAkB,EAAY,OACxC,EAAW,IAAI,EAAG,EAAG,EAAG,GAEpB,EAAS,CACX,EAAM,QAAQ,iBAAiB,GAC/B,EAAM,QAAQ,mBAAmB,GACjC,EAAU,EAAI,EAAO,SAAS,EAAI,EAAS,EAC3C,EAAU,EAAI,EAAO,SAAS,EAAI,EAAS,EAC3C,IAAI,EAAQ,EAAU,QAAU,KAAK,GAAK,EAAI,EAAU,EACxD,EAAW,iBAAiB,UAAW,EACzC,CAEA,EAAM,QAAQ,WAAW,MAAM,EAAY,IAdjB,CAe5B,IACoB,MAAM,cAAc,QAAS,CAC/C,KAAM,iBACN,IAAK,GACJ,EACL,CAEA,SAAS,aAAa,GACpB,IAAI,EAAQ,EAAM,MACd,EAAQ,MAAM,UAAS,SAAU,GACnC,OAAO,EAAM,KACf,IASA,OARA,MAAM,iBAAgB,WACpB,IAAI,EAAgB,EAAM,WACtB,EAAM,aAAiB,MAAM,MAAQ,EAAQ,IAAI,MAAM,MAAM,GAEjE,OADA,EAAM,WAAa,EACZ,WACL,EAAM,WAAa,CACrB,CACF,GAAG,CAAC,IACG,IACT,CAEA,SAAS,IAAI,GACX,IAAI,EAAe,EAAM,MACrB,OAAyB,IAAjB,EAA0B,QAAU,EAC5C,EAAc,EAAM,KACpB,OAAuB,IAAhB,EAAyB,GAAK,EACrC,EAAa,EAAM,IACnB,OAAqB,IAAf,EAAwB,GAAK,EACnC,EAAQ,MAAM,UAAS,SAAU,GACnC,OAAO,EAAM,KACf,IAQA,OAPA,MAAM,WAAU,WACd,IAAI,EAAM,aAAiB,MAAM,MAAQ,EAAQ,IAAI,MAAM,MAAM,GAEjE,OADA,EAAM,IAAM,IAAI,MAAM,IAAI,EAAK,EAAM,GAC9B,WACL,EAAM,IAAM,IACd,CACF,GAAG,CAAC,EAAO,EAAO,EAAM,IACjB,IACT,CAEA,SAAS,cAAc,GACrB,IAAI,EAAgB,EAAM,OACtB,OAA2B,IAAlB,GAA4B,KAAS,EAC9C,EAAc,EAAM,KACpB,OAAuB,IAAhB,EAAyB,CAAC,IAAK,KAAO,EAC7C,EAAU,EAAM,QAUhB,EARY,OAAO,UAAS,WAC9B,MAAO,CACL,SAAU,EAAE,KAAK,GAAK,EAAG,EAAG,GAC5B,SAAU,CAAC,EAAG,EAAQ,GACtB,KAAM,EACN,KAAM,SAEV,IACoB,GAEpB,OAAK,EACe,MAAM,cAAc,OAAQ,CAC9C,KAAM,0BACN,IAAK,GACS,MAAM,cAAc,sBAAuB,CACzD,KAAM,IACS,MAAM,cAAc,oBAAqB,CACxD,MAAO,aAPY,IASvB,CAEA,IA4FI,gBA5FA,YAAc,CAAC,MAAO,QAAS,UAAW,SAAU,mBAAoB,WAC5E,SAAS,QAAQ,GACf,IAAI,EAAM,EAAM,IACZ,EAAe,EAAM,MACrB,OAAyB,IAAjB,EAA0B,IAAI,MAAM,QAAQ,IAAK,IAAK,IAAO,EACrE,EAAiB,EAAM,QACvB,OAA6B,IAAnB,EAA4B,EAAI,EAC1C,EAAgB,EAAM,OACtB,OAA2B,IAAlB,EAA2B,EAAI,EACxC,EAAmB,EAAM,iBACzB,EAAiB,EAAM,QACvB,OAA6B,IAAnB,EAA4B,IAAM,EAC5C,EAAO,uCAAgD,QAAE,EAAO,aAEhE,EAAY,MAAM,WAClB,EAAU,EAAU,GACpB,EAAa,EAAU,GAEvB,EAAS,MAAM,UAAS,SAAU,GACpC,OAAO,EAAM,MACf,IACI,EAAQ,MAAM,SAAQ,WACxB,IAAI,EAAI,SAAS,cAAc,SAM/B,OALA,EAAE,IAAM,EACR,EAAE,UAAW,EACb,EAAE,QAAU,OACZ,EAAE,YAAc,YAChB,EAAE,MAAO,EACF,CACT,GAAG,IA4CH,OA3CA,MAAM,WAAU,WACd,IAAI,EAAa,WACf,IAAK,EAAM,SAAW,EAAS,CAC7B,IAAI,EAAW,IAAI,MAAM,cACzB,EAAO,IAAI,GACX,IAAI,EAAQ,IAAI,MAAM,gBAAgB,GACtC,EAAM,sBAAsB,GAC5B,EAAM,eAAe,KACrB,EAAM,iBAAiB,GACvB,EAAM,UAAU,GAChB,EAAM,mBAAmB,EAAM,EAAG,EAAM,EAAG,EAAM,GAE7C,GACF,EAAiB,IAAI,MAAM,cAAc,EAAO,IAGlD,EAAW,EACb,CACF,EAEI,EAAY,WACd,OAAO,EAAM,OAAO,MAAK,WACvB,OAAO,GACT,GACF,EAEA,GAAI,EAMF,OALA,EAAM,aAAa,MAAO,GAC1B,EAAM,OAAO,MAAK,WAChB,OAAO,GACT,IACA,SAAS,iBAAiB,QAAS,GAC5B,WACL,SAAS,oBAAoB,QAAS,EACxC,CAEJ,GAAG,CAAC,EAAS,EAAO,IACpB,MAAM,WAAU,WACT,IACL,EAAQ,iBAAiB,GACzB,EAAQ,UAAU,GAClB,EAAQ,mBAAmB,EAAM,EAAG,EAAM,EAAG,EAAM,GACrD,GAAG,CAAC,EAAO,EAAS,IACA,MAAM,cAAc,QAAS,kBAA2B,QAAE,CAC5E,KAAM,kBACL,GAAO,GAAwB,MAAM,cAAc,YAAa,CACjE,OAAQ,IAEZ,CAEA,SAAS,KAAK,GACZ,IAAI,EAAM,EAAM,IACZ,EAAoB,EAAM,kBAC1B,EAAqB,EAAM,mBAC/B,OAAoB,MAAM,cAAc,MAAM,SAAU,CACtD,SAAU,MACI,MAAM,cAAc,KAAK,YAAa,CACpD,MAAO,EACP,YAAa,IAAsB,MAA4B,GAAuB,IAAoB,SAE9G,CAGA,IAAI,KAAO,IACP,OAAS,KAAO,EAChB,IAAM,GACN,OAAS,EAKb,SAAS,qBACP,GAAI,gBAAiB,OAAO,gBAC5B,IAAI,EAAS,SAAS,cAAc,UACpC,EAAO,OAAS,KAChB,EAAO,MAAQ,KACf,IAAI,EAAU,EAAO,WAAW,MAqBhC,OApBA,EAAQ,UAAY,UACpB,EAAQ,SAAS,EAAG,EAAG,KAAM,MAE7B,EAAQ,UAAY,UACpB,EAAQ,YACR,EAAQ,IAAI,OAAQ,OAAQ,IAAK,EAAG,EAAI,KAAK,IAC7C,EAAQ,OAER,EAAQ,YAAc,UACtB,EAAQ,UAAY,KAAK,KAAK,QAC9B,EAAQ,YACR,EAAQ,OAAO,OAAQ,OAAS,KAChC,EAAQ,OAAO,OAAQ,OAAS,KAChC,EAAQ,SAER,EAAQ,YACR,EAAQ,OAAO,OAAS,IAAK,QAC7B,EAAQ,OAAO,OAAS,IAAK,QAC7B,EAAQ,SACR,gBAAkB,IAAI,MAAM,cAAc,EAE5C,CAEA,IAEI,WAFA,QAAU,+DACV,cAAgB,IAAI,MAAM,cAK1B,UAAY,WACd,IAAI,WAAJ,CAGA,IAAI,GAFJ,WAAa,IAAI,WAAW,YACjB,kBAAkB,SAE7B,IAAI,EAAK,SAAS,cAAc,UAC5B,EAAK,EAAG,WAAW,UASvB,GAPI,EACF,GAAiB,GAEjB,EAAK,EAAG,WAAW,SACnB,GAAiB,IAGd,EACH,MAAM,IAAI,MAAM,oBAGlB,EAAG,SACH,IAAI,EAAY,CACd,WAAY,IAAI,gBAAgB,gBAAgB,GAChD,aAAc,CACZ,SAAU,IAId,WAAW,cAAc,EA1BH,CA2BxB,EAEA,SAAS,YACP,OAAO,SAAU,GACf,IAAI,EAAU,EAAI,cAAc,SAAS,QACzC,YACA,IAAI,EAAS,EAAU,WAAa,cACpC,OAAO,IAAI,SAAQ,SAAU,GAC3B,OAAO,EAAO,KAAK,EAAK,OAAK,GAAW,SAAU,GAChD,QAAQ,MAAM,GACd,EAAI,qBACN,GACF,GACF,CACF,CAUA,SAAS,SAAS,GAChB,OAAO,aAAa,QAAQ,YAAa,CAAC,GAC5C,CAiBA,SAAS,SAAS,GAChB,OAAO,KAAK,QAAQ,GAAK,GAAM,GAAM,SAAU,GAC7C,YACA,EAAO,cAAc,WACvB,GACF,CAwBA,SAAS,MAAM,GACb,IAAI,EAAQ,EAAM,MACd,EAAS,EAAM,OACf,EAAmB,EAAM,UACzB,OAAiC,IAArB,EAA8B,EAAI,EAC9C,EAAiB,EAAM,SACvB,EAAqB,EAAM,mBAC3B,EAAW,MAAM,SAAQ,WAC3B,OAAO,GAAkB,IAAI,MAAM,qBAAqB,CACtD,MAAO,QACP,UAAW,GACX,UAAW,KAEf,GAAG,CAAC,IACA,EAAa,KACb,EAAa,IACb,EAAc,IACd,EAAkB,IAAO,EAEzB,EAAW,MAAM,SAAQ,WAC3B,IAAI,EAAY,IAAI,MAAM,kBAAkB,EAAQ,EAAY,EAAS,EAAY,GACrF,EAAU,UAAU,EAAG,GAAG,OAC1B,IAAI,EAAW,IAAI,MAAM,kBAAkB,EAAQ,EAAY,EAAiB,GAChF,EAAS,UAAU,EAAG,EAAS,EAAI,IAAiB,EAAkB,EAAG,GACzE,IAAI,EAAc,IAAI,MAAM,kBAAkB,EAAQ,EAAY,EAAiB,GACnF,EAAY,UAAU,GAAI,EAAS,EAAI,IAAiB,EAAkB,EAAG,GAC7E,IAAI,EAAY,IAAI,MAAM,kBAAkB,EAAiB,EAAS,EAAY,GAClF,EAAU,WAAW,EAAQ,EAAI,IAAiB,EAAkB,EAAG,EAAG,GAC1E,IAAI,EAAa,IAAI,MAAM,kBAAkB,EAAiB,EAAS,EAAY,GACnF,EAAW,UAAU,EAAQ,EAAI,IAAiB,EAAkB,EAAG,EAAG,GAC1E,IAAI,EAAO,CAAC,EAAW,EAAU,EAAa,EAAW,GACrD,EAAM,oBAAoB,sBAAsB,GAMpD,OALA,EAAU,UACV,EAAS,UACT,EAAY,UACZ,EAAU,UACV,EAAW,UACJ,CACT,GAAG,CAAC,EAAoB,EAAiB,EAAO,IAC5C,EAAoB,MAAM,SAAQ,WACpC,GAAK,EAAL,CACA,IAAI,EAAY,IAAI,MAAM,kBAAkB,EAAQ,EAAY,EAAS,EAAY,GAErF,OADA,EAAU,UAAU,EAAG,GAAG,OACnB,CAHkC,CAI3C,GAAG,CAAC,EAAoB,EAAO,IAC/B,OAAoB,MAAM,cAAc,QAAS,CAC/C,KAAM,kBACQ,MAAM,cAAc,OAAQ,CAC1C,SAAU,EACV,SAAU,IACR,GAAqB,GAAmC,MAAM,cAAc,OAAQ,CACtF,SAAU,EACV,SAAU,IAEd,CAlGA,SAAS,QAAU,SAAU,GAC3B,OAAO,aAAa,QAAQ,YAAa,CAAC,GAC5C,EAEA,SAAS,MAAQ,SAAU,GACzB,OAAO,aAAa,MAAM,CAAC,GAC7B,EAgBA,SAAS,QAAU,SAAU,GAC3B,OAAO,KAAK,QAAQ,QAAQ,GAAK,GAAM,GAAM,SAAU,GACrD,YACA,EAAO,cAAc,WACvB,GACF,EAEA,SAAS,MAAQ,SAAU,GACzB,OAAO,KAAK,QAAQ,MAAM,CAAC,GAC7B,EAqEA,IAAI,YAAc,CAAC,MAAO,OAAQ,SAAU,gBAAiB,aAAc,sBAE3E,SAAS,iBAAiB,GACxB,IAAI,EAAM,EAAM,IACZ,EAAc,EAAM,KACpB,OAAuB,IAAhB,EAAyB,EAAI,EACpC,EAAS,EAAM,OACf,EAAgB,EAAM,cACtB,EAAoB,EAAM,WAC1B,OAAmC,IAAtB,EAA+B,EAAI,EAChD,EAAqB,EAAM,mBAC3B,EAAO,uCAAgD,QAAE,EAAO,aAEhE,EAAM,SAAS,GACf,EAAa,EAAI,MACjB,EAAQ,EAAW,MACnB,EAAS,EAAW,OACpB,EAAM,KAAK,IAAI,EAAO,GACtB,EAAQ,EAAQ,EAAM,EACtB,EAAS,EAAS,EAAM,EACxB,EAAgB,EAAI,oBACxB,OAAoB,MAAM,cAAc,QAAS,kBAA2B,QAAE,CAC5E,KAAM,kBACL,GAAoB,MAAM,cAAc,OAAQ,CACjD,SAAU,EAAgB,CAAC,EAAG,KAAK,GAAI,KAAK,IAAM,CAAC,EAAG,EAAG,IAC3C,MAAM,cAAc,sBAAuB,CACzD,KAAM,CAAC,EAAO,KACC,MAAM,cAAc,oBAAqB,CACxD,IAAK,EACL,KAAM,MAAM,WACZ,aAAa,KACV,GAAuB,MAAM,cAAc,MAAO,CACrD,MAAO,EACP,OAAQ,EACR,UAAW,EACX,SAAU,EACV,mBAAoB,IAExB,CAEA,SAAS,QAAQ,GACf,OAAoB,MAAM,cAAc,MAAM,SAAU,CACtD,SAAU,MACI,MAAM,cAAc,iBAAkB,GACxD,CAKA,IAAI,MAAqB,WACvB,SAAS,IACP,OAAO,IACT,CAEA,IAAI,EAAS,EAAM,UA+BnB,OA7BA,EAAO,QAAU,WACf,OAAO,IAAI,MAAO,gBAAgB,kBAAkB,KAAK,UAAU,KAAK,MAAQ,KAAK,IAAK,GAAI,GAAM,GAAM,kBAAkB,KAAK,IAAK,GACxI,EAEA,EAAO,SAAW,WAChB,IAAI,EAAM,KAAK,UAAU,KAAK,MAAQ,KAAK,IACvC,EAAU,IAAI,MAAM,IAAI,KAAK,GAAG,KAAI,WACtC,OAAO,CACT,IAAG,KAAK,IACR,OAAO,IAAI,MAAO,gBAAgB,kBAAkB,EAAS,IAAK,GAAM,GAAM,kBAAkB,EAAS,IAAK,GAChH,EAEA,EAAO,UAAY,WAEjB,IAAI,EAAI,SAAS,KAAK,GAAG,MAAM,KAAK,GAAI,IAAM,KAAK,IAAI,GAAI,GACvD,EAAI,SAAS,KAAK,GAAG,MAAM,KAAK,GAAI,IAAM,KAAK,IAAI,GAAI,GACvD,EAAI,SAAS,KAAK,GAAG,MAAM,KAAK,GAAI,IAAM,KAAK,IAAI,GAAI,GAC3D,OAAO,IAAI,MAAM,QAAQ,EAAG,EAAG,GAAG,WACpC,EAEA,EAAO,SAAW,WAEhB,MAAO,GAAM,IADL,SAAS,KAAK,GAAG,MAAM,KAAK,GAAI,IAAM,KAAK,IAAI,GAAI,GAE7D,EAEA,EAAO,OAAS,WACd,OAAO,KAAK,UAAU,QACxB,EAEO,CACT,CArCyB,GAsCrB,aAAe,IAEf,kBAAoB,SAA2B,EAAK,QACzC,IAAT,IACF,EAAO,GAKT,IAFA,IAAI,EAAQ,EAEH,EAAI,EAAG,EAAI,EAAI,OAAQ,IAC9B,GAAS,EAAI,OAAO,EAAG,GAAG,WAAW,GAGvC,IAAI,EAAa,EAAO,aACxB,OAAO,EAAQ,EAAa,CAC9B,EAKI,KAAO,WACT,OAAO,IACT,EAMI,sBAAwB,SAA6B,GACvD,OAAO,EAAS,MAAQ,EAAS,MAAM,MAAQ,EAAI,EAAS,WAAW,SAAS,MAAQ,CAC1F,EAUI,iBAAmB,SAA0B,EAAM,GAKrD,QAJkB,IAAd,IACF,EAAY,GAGT,EAAK,UAAa,EAAK,SAAS,iBAArC,CAIA,IAAI,EAAW,EAAK,SAChB,EAAW,sBAAsB,GACjC,EAAS,YAAc,EAAW,IACtC,EAAK,QAAU,aAAa,mBAC5B,EAAS,kBAAoB,aAAa,kBAC1C,EAAS,kBAAoB,aAAa,kBAC1C,EAAS,kBAAkB,CACzB,SAAS,IATX,CAWF,EAEI,eAAiB,IAAI,IAEzB,SAAS,YAAY,EAAK,EAAa,GACrC,IAAI,EAAW,eAAe,IAAI,GAUlC,OARK,EAKS,MAAR,GAAgB,EAAK,SAAS,QAAQ,IAAI,WAAa,EAAM,sBAJrD,MAAR,GAAgB,EAAK,SAAS,QAAQ,IAAI,WAAa,EAAM,4BACjE,EAAW,IACX,eAAe,IAAI,EAAK,IAKnB,CACT,CAEA,IAgRI,kBAGA,kBAnRA,MAAQ,CACV,YAAa,YACb,YAAa,SAAqB,EAAK,EAAa,GAClD,IAAI,EAAY,MAAM,SAAS,YAAY,EAAK,EAAa,IACzD,EAAW,EAAU,GACrB,EAAc,EAAU,GAK5B,OAHA,MAAM,WAAU,WACd,EAAY,YAAY,EAAK,EAAa,GAC5C,GAAG,CAAC,IACG,CACT,EAEA,sBAAI,GACF,OAAO,YAAY,sBAAsB,WACvC,OAAO,IAAI,MAAM,qBAAqB,CACpC,MAAO,SAEX,GACF,EAEA,6BAAI,GACF,OAAO,YAAY,6BAA6B,WAC9C,OAAO,IAAI,MAAM,qBAAqB,CACpC,MAAO,OACP,KAAM,MAAM,YAEhB,GACF,EAEA,sBAAI,GACF,OAAO,YAAY,sBAAsB,WACvC,OAAO,IAAI,MAAM,qBAAqB,CACpC,MAAO,SAEX,GACF,EAEA,qBAAI,GACF,OAAO,YAAY,qBAAqB,WACtC,OAAO,IAAI,MAAM,qBAAqB,CACpC,MAAO,WAEX,GACF,EAEA,oBAAI,GACF,OAAO,YAAY,oBAAoB,WACrC,OAAO,IAAI,MAAM,qBAAqB,CACpC,MAAO,WAEX,GACF,EAEA,mBAAI,GACF,OAAO,YAAY,mBAAmB,WACpC,OAAO,IAAI,MAAM,kBAAkB,CACjC,MAAO,SAEX,GACF,EAEA,mBAAI,GACF,OAAO,YAAY,mBAAmB,WACpC,OAAO,IAAI,MAAM,kBAAkB,CACjC,MAAO,SAEX,GACF,EAEA,kBAAI,GACF,OAAO,YAAY,kBAAkB,WACnC,OAAO,IAAI,MAAM,kBAAkB,CACjC,MAAO,WAEX,GACF,EAEA,iBAAI,GACF,OAAO,YAAY,iBAAiB,WAClC,OAAO,IAAI,MAAM,kBAAkB,CACjC,MAAO,OAEX,GACF,EAEA,6BAAI,GACF,OAAO,YAAY,6BAA6B,WAC9C,OAAO,IAAI,MAAM,kBAAkB,CACjC,MAAO,QACP,WAAW,GAEf,GACF,GAIE,sBAAwB,SAA6B,GACvD,IAAI,EAAU,EAAS,MAAM,MACzB,EACJ,EAAS,WAAW,SAAS,6BACzB,EAAW,GAEf,GAAI,EAIF,IAHA,IAAI,EAAO,EAAS,WAAW,SAC3B,EAAO,EAAK,KAEP,EAAI,EAAK,OAAQ,EAAI,EAAK,MAAM,OAAQ,GAAK,EAAK,OACzD,IAAK,IAAI,EAAI,EAAG,EAAI,EAAK,SAAU,IACjC,EAAS,KAAK,EAAK,MAAM,EAAI,SAIjC,EAAW,EAAS,WAAW,SAAS,MAW1C,OARkB,OAAO,YAAW,WAClC,MAAO,CACL,KAAM,SACN,KAAM,CAAC,EAAU,GAErB,IACyB,EAG3B,EAGI,SAAW,WACb,IAAI,EAAW,EAAuB,EAEtC,MAA0J,WAAxH,OAAzB,EAAY,WAAkF,OAApD,EAAwB,EAAU,oBAA5C,EAA8E,EAAsB,WAAoD,OAA1B,EAAa,eAAoB,EAAS,EAAW,WAC9N,EAEI,QAAU,SAAiB,EAAU,EAAS,QACnC,IAAT,IACF,EAAO,IAGT,IAAI,EAAY,MAAM,WAClB,EAAQ,EAAU,MAClB,EAAO,EAAU,KACjB,EAAW,EAAU,SAErB,EAAS,EAAK,MAAQ,EAAS,MAG/B,EADY,MAAM,SAAS,IAAI,MAAM,SACf,GAGtB,EADa,MAAM,SAAS,IAAI,MAAM,SACf,GAGvB,EADa,MAAM,SAAS,IAAI,MAAM,SAChB,GAGtB,EADa,MAAM,SAAS,IAAI,MAAM,SACnB,GAEnB,EAAgB,MAAM,OAAO,GAC7B,EAAU,MAAM,aAAY,SAAU,GACpC,EAAS,SAAS,EAAS,QAAQ,EACzC,GAAG,GAAG,OAAO,IACT,EAAS,MAAM,aAAY,SAAU,GACnC,EAAS,QAAQ,EAAS,OAAO,EACvC,GAAG,GAAG,OAAO,IACT,EAAQ,MAAM,aAAY,SAAU,GAClC,EAAS,OAAO,EAAS,MAAM,EACrC,GAAG,GAAG,OAAO,IACT,EAAY,MAAM,aAAY,SAAU,GAC1C,EAAE,iBACF,IAAI,EAAQ,EAAE,eAAe,GAC7B,EAAU,IAAI,EAAM,QAAS,EAAM,SACnC,EAAQ,CACN,EAAG,EACH,MAAO,EACP,UAAW,EACX,UAAW,EACX,SAAU,GAEd,GAAG,CAAC,EAAS,EAAW,IACpB,EAAW,MAAM,aAAY,SAAU,GACzC,IAAI,EAAQ,EAAE,QAAQ,GACtB,EAAU,IAAI,EAAM,QAAS,EAAM,SACnC,IAAI,EAAQ,EAAU,IAAI,GACtB,EAAO,EAAM,YACb,EAAU,EAAO,EAAc,QACnC,EAAS,IAAI,EAAM,EAAI,EAAU,EAAQ,EAAM,EAAI,EAAU,GAC7D,EAAc,QAAU,EACxB,EAAO,CACL,EAAG,EACH,MAAO,EACP,UAAW,EACX,UAAW,EACX,SAAU,EACV,MAAO,GAEX,GAAG,CAAC,EAAQ,EAAQ,EAAO,EAAW,EAAW,IAC7C,EAAU,MAAM,aAAY,SAAU,GACxC,IAAI,EAAQ,EAAE,eAAe,GAC7B,EAAU,IAAI,EAAM,QAAS,EAAM,SACnC,EAAM,KAAK,GAAW,IAAI,GAC1B,EAAM,CACJ,EAAG,EACH,MAAO,EACP,UAAW,EACX,UAAW,EACX,SAAU,EACV,MAAO,GAEX,GAAG,CAAC,EAAO,EAAO,EAAW,EAAW,IAYxC,OAXA,MAAM,WAAU,WACd,IAAI,EAAO,GAAW,SAItB,OAHA,EAAK,iBAAiB,aAAc,GACpC,EAAK,iBAAiB,YAAa,GACnC,EAAK,iBAAiB,WAAY,GAC3B,WACL,EAAK,oBAAoB,aAAc,GACvC,EAAK,oBAAoB,YAAa,GACtC,EAAK,oBAAoB,WAAY,EACvC,CACF,GAAG,CAAC,EAAS,EAAS,EAAU,IACzB,CACL,UAAW,EACX,SAAU,EACV,QAAS,EAEb,EAEI,UAAY,KACZ,YAA0B,EAAZ,UACd,UAAY,KACZ,YAA0B,EAAZ,UACd,cAAgB,KAAK,GAAK,IAAM,EAChC,UAAY,SAAmB,EAAK,EAAQ,EAAU,GACxD,IAAI,EAAO,EAAO,IAAM,cACpB,EAAS,EAAI,KAAK,IAAI,GAAQ,KAAK,IAAI,GACvC,EAAQ,EAAS,EAAO,OACxB,EAAK,EAAI,GAAK,EAAI,GAClB,EAAK,EAAI,GAAK,EAAI,GAClB,EAAI,GAAM,EAAQ,aAAe,GACjC,EAAI,GAAM,EAAS,aAAe,GAEtC,OAAI,GACF,EAAO,EAAI,EACX,EAAO,EAAI,EACJ,GAGF,IAAI,MAAM,QAAQ,EAAG,EAC9B,EACI,WAAa,SAAoB,EAAQ,GAC3C,IAAI,EAAO,EAAO,IAAM,cACpB,EAAS,EAAI,KAAK,IAAI,GAAQ,KAAK,IAAI,GAE3C,MAAO,CACL,MAFU,EAAS,EAAO,OAG1B,OAAQ,EAEZ,EACI,WAAa,SAAoB,QAClB,IAAb,IACF,EAAW,GAGb,IAAI,EAAS,MAAM,UAAS,SAAU,GACpC,OAAO,EAAM,MACf,IACA,OAAO,MAAM,SAAQ,WACnB,OAAO,WAAW,EAAQ,EAC5B,GAAG,CAAC,EAAQ,EAAU,EAAO,QAC/B,EAGI,YAAc,gBAAyB,QAAE,IAAI,oBAAsB,kBAAoB,qCAA8C,QAAE,CAAC,6MAGxI,aAAe,QAAQ,IAAI,oBAAsB,kBAAoB,qCAA8C,QAAE,CAAC,8nBAC1H,SAAS,eAUP,OATA,MAAM,WAAU,WACd,IAAI,EAAO,SAAS,cAAc,QAIlC,OAHA,EAAK,KAAO,WACZ,EAAK,QAAU,sCACf,SAAS,KAAK,OAAO,GACd,WACL,SAAS,KAAK,YAAY,EAC5B,CACF,GAAG,IACiB,MAAM,cAAc,MAAM,SAAU,KAAmB,MAAM,cAAc,QAAQ,OAAQ,CAC7G,OAAQ,eAEZ,CASA,IAkEI,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAmB/E,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,iBAAkB,iBAAkB,iBAAkB,iBArFzJ,sBAAwB,WAC1B,IAII,EAAe,KAAK,cACpB,EAAW,EAAa,SACxB,EAAQ,EAAa,MAErB,EAAY,MAAM,OAAO,IAAI,MAC7B,EAAqB,MAAM,OAAO,GAClC,EAAW,MAAM,QAAO,GAGxB,EADY,MAAM,SAAS,GACA,GAE/B,MAAM,WAAU,WACd,IACI,GADU,IAAI,MACQ,UAAY,EAAU,QAAQ,UAC7C,KAAK,IAAI,EAAW,EAAmB,QAAS,EAlB9C,IAkBuE,GAAK,KAE9E,IACQ,MAAb,GACF,EAAS,SAAU,EAGnB,YAAW,WACL,EAAS,UACX,EAAmB,QAAU,EAE7B,EAAe,KAAK,UAExB,GA7BW,OA+BX,EAAS,SAAU,EACnB,EAAmB,QAAU,IAIhB,MAAb,IACF,EAAS,SAAU,EAEvB,GAAG,CAAC,IAEJ,IAAI,EAAa,MAAM,SAAS,GAC5B,EAAU,EAAW,GACrB,EAAa,EAAW,GAExB,EAAa,MAAM,UAAS,GAC5B,EAAO,EAAW,GAClB,EAAU,EAAW,GAazB,OAXA,MAAM,WAAU,WACV,EAAQ,IAED,EAAU,EACnB,GAAQ,GAER,YAAW,WACT,OAAO,EAAW,EAAU,EAC9B,GA3DW,KA6Df,GAAG,CAAC,IACG,EAAO,IAAM,KAAK,MAAM,EAAmB,QACpD,EAII,OAAS,QAAQ,UAAU,oBAAsB,kBAAoB,qCAA8C,QAAE,CAAC,4JAEtH,KAAO,QAAQ,UAAU,qBAAuB,mBAAqB,qCAA8C,QAAE,CAAC,gHACtH,YAAc,gBAAyB,QAAE,IAAI,qBAAuB,mBAAqB,qCAA8C,QAAE,CAAC,uMAAwM,wBAAyB,2GAA2G,SAAU,GACle,OAAO,EAAM,SAAW,IAAM,GAChC,IAAG,SAAU,GACX,OAAO,EAAM,SAAW,OAAS,KACnC,IACI,OAAS,gBAAyB,QAAE,IAAI,qBAAuB,mBAAqB,qCAA8C,QAAE,CAAC,kBAAmB,iCAAkC,QAC1L,UAAY,gBAAyB,QAAE,IAAI,qBAAuB,mBAAqB,qCAA8C,QAAE,CAAC,inBAAonB,sCAAuC,MACvyB,SAAS,gBACP,IAAI,EAAW,wBACf,OAAoB,MAAM,cAAc,YAAa,CACnD,SAAuB,MAAb,GACI,MAAM,cAAc,UAAW,KAAmB,MAAM,cAAc,OAAQ,KAAM,KAAK,MAAM,GAAW,MAC5H,CAGA,IAAI,UAAY,gBAAyB,QAAE,IAAI,oBAAsB,kBAAoB,qCAA8C,QAAE,CAAC,oKAAqK,mHAAoH,wBAAyB,mDAAqD,SAAU,GACzf,OAAO,EAAM,IAAM,EAAI,GACzB,IAAG,SAAU,GACX,OAAO,EAAM,OAAS,EAAI,CAC5B,IAAG,SAAU,GACX,OAAO,EAAM,OAAS,MAAQ,MAChC,IACA,gBAAyB,QAAE,IAAI,qBAAuB,mBAAqB,qCAA8C,QAAE,CAAC,wGAC5H,IAAI,OAAS,gBAAyB,QAAE,IAAI,qBAAuB,mBAAqB,qCAA8C,QAAE,CAAC,ucACrI,SAAW,gBAAyB,QAAE,IAAI,qBAAuB,mBAAqB,qCAA8C,QAAE,CAAC,seACvI,aAAe,gBAAyB,QAAE,IAAI,qBAAuB,mBAAqB,qCAA8C,QAAE,CAAC,wOAC/I,gBAAyB,QAAE,IAAI,mBAAqB,iBAAmB,qCAA8C,QAAE,CAAC,yRACxH,gBAAyB,QAAE,EAAE,mBAAqB,iBAAmB,qCAA8C,QAAE,CAAC,+UACtH,IAAI,MAAQ,gBAAyB,QAAE,GAAG,mBAAqB,iBAAmB,qCAA8C,QAAE,CAAC,uBACnI,gBAAyB,QAAE,IAAI,mBAAqB,iBAAmB,qCAA8C,QAAE,CAAC,iGAOxH,IAwJI,kBAxJA,kBAAoB,WACtB,IAAI,EAAY,MAAM,SAAS,WAC3B,EAAS,EAAU,GACnB,EAAY,EAAU,GAW1B,OATA,MAAM,WAAU,WACd,IAAI,EAAe,OAAO,OAAS,OAAO,IACrC,UAAU,WAAY,GACZ,UAAU,SAChB,eAAe,MAAK,SAAU,GAEvB,MADF,EAAkB,IAAI,SACf,EAAU,UAC/B,GACF,GAAG,IACI,CACT,EAEI,UAAY,WACd,IAAI,EAAY,MAAM,SAAS,kBAAkB,SAAW,SAAW,WACnE,EAAS,EAAU,GAGvB,MAAO,CACL,OAAQ,CACN,OAAmB,WAAX,EACR,QAAoB,YAAX,EACT,GAAe,OAAX,GAEN,UARc,EAAU,GAU5B,EAEI,mBAAkC,MAAM,cAAc,CAAC,GACvD,eAAiB,WACnB,OAAO,MAAM,WAAW,mBAC1B,EACI,oBAAsB,SAA6B,GACrD,IAAI,EAAY,MAAM,SAAS,IAC3B,EAAY,EAAU,GACtB,EAAe,EAAU,GAEzB,EAAY,MAAM,OAAO,MAEzB,EAAa,MAAM,UAAS,GAC5B,EAAS,EAAW,GACpB,EAAiB,EAAW,GAE5B,EAAS,MAAM,SAAQ,WACzB,MAAO,EACT,GAAG,IAEC,EAAa,MAAM,UAAS,GAC5B,EAAS,EAAW,GACpB,EAAY,EAAW,GAEvB,EAAY,MAAM,aAAY,SAAU,GAK1C,GAJA,EAAe,IAIV,EAAQ,CACX,IAAI,EAAU,MAAM,aAAa,aACX,YAAlB,EAAQ,OAAqB,EAAQ,SACzC,GAAU,EACZ,CAGA,EAAO,KAAI,SAAU,GACnB,OAAO,EAAG,MAAM,KAAM,CAAC,GACzB,GACF,GAAG,CAAC,EAAQ,IACR,EAAS,YACb,OAAO,kBAA2B,QAAE,CAAC,EAAG,EAAQ,CAC9C,KAAM,EACN,OAAQ,EACR,UAAW,EACX,OAAQ,EACR,aAAc,EACd,UAAW,EACX,aAAc,GAElB,EAEA,SAAS,UAAU,GACjB,EAAM,MACF,EAAM,eACN,EAAM,IAEV,IAAI,EAAkB,iBAClB,EAAS,EAAgB,OACzB,EAAY,EAAgB,UAC5B,EAAY,EAAgB,UAC5B,EAAS,EAAgB,OAEzB,EAAS,oBACT,EAAe,MAAM,aAAY,WACnC,IAAI,EAAO,EAAU,MAAK,SAAU,GAClC,MAAqB,aAAd,EAAK,IACd,IACI,GAAQ,EAAK,OAAQ,EAAK,SAAc,GAAU,EACxD,GAAG,CAAC,EAAW,IAYf,OAXA,MAAM,SAAQ,WACZ,OAAO,IAAI,MAAO,gBAAgB,KAAK,SAAU,GAAK,KAAM,QAC9D,GAAG,IASiB,MAAM,cAAc,UAAW,CACjD,OAAQ,GACM,MAAM,cAAc,OAAQ,KAAmB,MAAM,cAAc,MAAO,MAAoB,MAAM,cAAc,aAAc,KAAmB,MAAM,cAAc,IAAK,KAAM,aAAmB,EAAO,OAAS,WAAa,GAAsB,MAAM,cAAc,IAAK,KAAM,aAAmB,EAAO,OAAS,OAAS,SAAuB,MAAM,cAAc,IAAK,KAAM,cAAoB,EAAO,OAAS,cAAgB,QAAsB,MAAM,cAAc,SAAU,CAC/e,QAAS,EACT,MAAO,SACN,UAiCL,CAGA,IAAI,QAAU,gBAAyB,QAAE,IAAI,oBAAsB,kBAAoB,qCAA8C,QAAE,CAAC,4jBAEpI,UAAY,WACd,OAAI,kBAAkB,SACb,KAGW,MAAM,cAAc,QAAS,KACnD,EAGA,SAAS,kBACP,MAAO,mBAAmB,KAAK,OAAO,UAAU,UAClD,CAEA,SAAS,mBACP,MAAO,eAAe,KAAK,OAAO,UAAU,UAC9C,CAEA,SAAS,iBACP,OAAO,mBAAqB,kBAC9B,CASA,SAAS,oBACP,IACI,EADkB,iBACa,aAE/B,EAAS,gBACT,EAAS,gBACT,EAAS,oBAQb,OAPA,MAAM,WAAU,WACd,IAAI,EAAM,GACN,GAAQ,EAAI,KAAK,GACjB,GAAQ,EAAI,KAAK,GACjB,GAAQ,EAAI,KAAK,GACrB,EAAa,EACf,GAAG,CAAW,MAAV,OAAiB,EAAS,EAAO,KAAgB,MAAV,OAAiB,EAAS,EAAO,KAAgB,MAAV,OAAiB,EAAS,EAAO,KAAM,IAClH,IACT,CACA,IAiMI,kBAjMA,cAAgB,WAClB,IAAI,EAAK,MAAM,UAAS,SAAU,GAChC,OAAO,EAAM,EACf,IAEI,EAAmB,iBACnB,EAAY,EAAiB,UAC7B,EAAY,EAAiB,UAE7B,EAAU,MAAM,SAEhB,EAAY,MAAM,SAAS,YAC3B,EAAO,EAAU,GACjB,EAAU,EAAU,GAEpB,EAAS,MAAM,aAAY,WAK7B,SAAS,IAuBP,OAtBA,EAAoB,2BAAoC,QAAgB,mBAAmB,MAAK,SAAS,EAAQ,GAC/G,OAAO,mBAAmB,MAAK,SAAkB,GAC/C,OACE,OAAQ,EAAS,KAAO,EAAS,MAC/B,KAAK,EAGH,OAFA,EAAK,iBAAiB,MAAO,GAC7B,EAAS,KAAO,EACT,EAAG,GAAG,WAAW,GAE1B,KAAK,EACH,EAAQ,WACR,EAAU,MACV,GAAU,GACV,EAAQ,QAAU,EAEpB,KAAK,EACL,IAAK,MACH,OAAO,EAAS,OAGxB,GAAG,EACL,MACyB,MAAM,KAAM,UACvC,CAEA,SAAS,IACP,IAAI,EAEoC,OAAvC,EAAmB,EAAQ,UAA4B,EAAiB,oBAAoB,MAAO,GACpG,EAAU,kBAAkB,SAAW,SAAW,WAClD,EAAQ,YACR,GAAU,GACV,EAAQ,aAAU,CACpB,CAEA,QAAwB,IAApB,EAAQ,QAAuB,CAKxB,UAAU,GAChB,eAAe,eALA,CAChB,iBAAkB,CAAC,cAAe,gBAAiB,gBAAiB,YAIvB,MA9CjD,SAA0B,GACxB,OAAO,EAAkB,MAAM,KAAM,UACvC,GA6CA,KAAO,CACL,IAAI,EAEqC,OAAxC,EAAoB,EAAQ,UAA4B,EAAkB,KAC7E,CACF,GAAG,CAAC,EAAG,GAAI,EAAW,IAEtB,GAAK,iBAIL,MAAO,CACL,KAAM,EACN,OAAQ,EAEZ,EACI,kBAAoB,WACtB,IAAI,iBACJ,MAAO,CACL,KAAM,qBACN,KAAM,wCAA0C,OAAO,SAAS,KAEpE,EACI,cAAgB,WAClB,IAAI,EAAa,SAAS,KACtB,EAAM,EAAW,mBACrB,EAAW,yBACX,EAAW,sBACX,EAAW,0BAAuB,EAE9B,EAAa,MAAM,UAAS,GAC5B,EAAe,EAAW,GAC1B,EAAkB,EAAW,GAG7B,EADa,MAAM,cAAiB,IAAR,GACK,GAErC,MAAM,WAAU,WACd,IAAI,EAAyB,WAC3B,OAAO,EAA+C,OAA/B,SAAS,kBAClC,EAGA,OADA,SAAS,iBAAiB,mBAAoB,GACvC,WACL,SAAS,oBAAoB,mBAAoB,EACnD,CACF,GAAG,IACH,IAAI,EAAS,MAAM,aAAY,WACxB,IAEA,SAAS,kBAKR,SAAS,gBACX,SAAS,iBALX,EAAI,MAAM,EAAY,CAAC,CACrB,aAAc,UAOpB,GAAG,CAAC,EAAY,IAEhB,GAAK,IAAuB,iBAI5B,MAAO,CACL,MAAO,EAAe,OAAS,SAAW,cAC1C,OAAQ,EAEZ,EAEI,mBAAqB,CACvB,GAAI,CACF,gBAAiB,mBACjB,WAAW,EACX,OAAO,EACP,OAAO,EACP,SAAS,EACT,yBAAyB,EACzB,YAAa,MAAM,eAErB,SAAS,EACT,OAAQ,CACN,SAAU,CAAC,EAAG,EAAG,GACjB,KAAM,IACN,IAAK,KAEP,IAAK,EACL,UAAW,CACT,IAAK,GAEP,YAAQ,GAGV,SAAS,aAYP,OAXA,MAAM,WAAU,WACd,SAAS,IACP,IAAI,EAAU,MAAM,aAAa,aAC7B,SAAS,OAAQ,EAAQ,UAAe,EAAQ,QACtD,CAGA,OADA,SAAS,iBAAiB,mBAAoB,GACvC,WACL,OAAO,SAAS,oBAAoB,mBAAoB,EAC1D,CACF,GAAG,IACI,IACT,CAEA,SAAS,YAAY,GACnB,IAAI,EAAgB,EAAM,cACtB,EAAY,EAAM,UAClB,EAAM,EAAM,IACZ,EAAc,EAAM,YACpB,EAAc,EAAM,KACpB,OAAuB,IAAhB,EAAyB,WAAa,EAC7C,EAAW,EAAM,SACjB,EAAQ,oBAAoB,GAChC,OAAoB,MAAM,cAAc,MAAM,SAAU,KAAmB,MAAM,cAAc,aAAc,MAAoB,MAAM,cAAc,WAAY,MAAoB,MAAM,cAAc,YAAa,CACpN,IAAK,EAAM,cACG,MAAM,cAAc,mBAAmB,SAAU,CAC/D,MAAO,GACN,GAA8B,MAAM,cAAc,cAAe,MAAO,GAA0B,MAAM,cAAc,UAAW,CAClI,IAAK,EACL,MAAO,IACQ,MAAM,cAAc,UAAW,OAAqB,MAAM,cAAc,GAAG,SAAU,kBAA2B,QAAE,CAAC,EAAG,mBAAoB,GAA2B,MAAM,cAAc,mBAAmB,SAAU,CACrO,MAAO,GACO,MAAM,cAAc,kBAAmB,MAAO,KAChE,CAgBA,IAAI,eAAiB,SAAwB,GAC3C,IAAI,EAAY,EAAM,UAClB,EAAS,MAAM,SACf,EAAkB,MAAM,SAGxB,EADkB,iBACa,aAEnC,MAAM,WAAU,WACd,GAAI,EAAa,QAoCf,OAnCA,EAAgB,QAAU,SAAS,cAAc,OACjD,EAAgB,QAAQ,MAAM,SAAW,QACzC,EAAgB,QAAQ,MAAM,KAAO,IACrC,EAAgB,QAAQ,MAAM,OAAS,IACvC,EAAgB,QAAQ,MAAM,MAAQ,MACtC,EAAgB,QAAQ,MAAM,SAAW,QACzC,EAAgB,QAAQ,MAAM,OAAS,MACvC,EAAgB,QAAQ,MAAM,OAAS,QACvC,EAAgB,QAAQ,MAAM,OAAS,IAEvC,EAAgB,QAAQ,UAAU,IAAI,oBACtC,EAAa,QAAQ,YAAY,EAAgB,SACjD,EAAO,QAAU,kBAA2B,QAAE,OAAO,CACnD,KAAM,EAAgB,QACtB,KAAM,SACN,SAAU,CACR,KAAM,MACN,IAAK,OAEP,MAAO,OACP,KAAM,IACN,YAAa,MAEf,EAAO,QAAQ,GAAG,QAAQ,SAAU,EAAK,GAEvC,IAAI,EAAI,EAAK,SAAW,GAAK,KAAK,IAAI,EAAK,MAAM,QAC7C,GAAK,EAAK,SAAW,GAAK,KAAK,IAAI,EAAK,MAAM,QAClD,EAAU,QAAQ,IAAI,EAAG,EAAG,EAC9B,IACA,EAAO,QAAQ,GAAG,OAAO,WACvB,EAAU,QAAQ,IAAI,EAAG,EAAG,EAC9B,IACA,EAAgB,QAAQ,iBAAiB,cAAc,SAAU,GAC/D,EAAG,gBACL,IACO,WACD,EAAO,SAAS,EAAO,QAAQ,SACrC,CAEJ,GAAG,IACH,IAAI,EAAe,QAAQ,IAAI,oBAAsB,kBAAoB,qCAA8C,QAAE,CAAC,wKAC1H,OAAoB,MAAM,cAAc,QAAQ,OAAQ,CACtD,OAAQ,GAEZ,EAeI,iBAAmB,SAA0B,GAC/C,IAAI,EAAY,EAAM,UAClB,EAAS,EAAM,OAGf,EADkB,iBACO,OAEzB,EAAc,MAAM,OAAO,EAAC,GAAO,GAAO,GAAO,GAAO,IAExD,EAAgB,MAAM,aAAY,WACpC,IAAI,EAAQ,EAAY,QAEpB,GAAS,EAAI,OAAO,EAAM,IAAM,OAAO,EAAM,IAEjD,MAAO,EADM,EAAI,OAAO,EAAM,IAAM,OAAO,EAAM,IAClC,GAAU,EAAM,GAAK,EAAI,EAAG,EAC7C,GAAG,CAAC,IACA,EAAoB,MAAM,aAAY,SAAU,EAAI,GAKtD,OAAQ,EAAG,MAAQ,EAAG,KAAO,EAAG,SAC9B,IAAK,OACL,IAAK,OACL,IAAK,UACL,IAAK,UACL,KAAK,GAEH,EAAY,QAAQ,GAAK,EACzB,MAEF,IAAK,OACL,IAAK,OACL,IAAK,YACL,IAAK,UACL,KAAK,GAEH,EAAY,QAAQ,GAAK,EACzB,MAEF,IAAK,OACL,IAAK,OACL,IAAK,YACL,IAAK,UACL,IAAK,UACL,KAAK,GAEH,EAAY,QAAQ,GAAK,EACzB,MAEF,IAAK,OACL,IAAK,OACL,IAAK,aACL,IAAK,UACL,KAAK,GAEH,EAAY,QAAQ,GAAK,EACzB,MAEF,IAAK,QACH,EAAY,QAAQ,GAAK,EACzB,MAEF,QACE,OAEN,GAAG,IACC,EAAY,MAAM,aAAY,SAAU,GAC1C,IAAI,EAAG,oBAKH,EAAG,SAAW,EAAG,QAAU,EAAG,SAAlC,CAIA,EAAkB,GAAI,GAEtB,IAAI,EAAiB,IACjB,EAAI,EAAe,GACnB,EAAI,EAAe,GACnB,EAAI,EAAe,GAEvB,EAAU,QAAQ,IAAI,EAAG,EAAG,EAT5B,CAUF,GAAG,CAAC,EAAe,EAAW,IAC1B,EAAU,MAAM,aAAY,SAAU,GACxC,EAAkB,GAAI,GAEtB,IAAI,EAAkB,IAClB,EAAI,EAAgB,GACpB,EAAI,EAAgB,GACpB,EAAI,EAAgB,GAExB,EAAU,QAAQ,IAAI,EAAG,EAAG,EAC9B,GAAG,CAAC,EAAe,EAAW,IAe9B,OAdA,MAAM,WAAU,WACd,OAAI,GACF,EAAU,QAAQ,IAAI,EAAG,EAAG,QAC5B,EAAY,QAAU,EAAC,GAAO,GAAO,GAAO,GAAO,MAIrD,SAAS,iBAAiB,UAAW,GACrC,SAAS,iBAAiB,QAAS,GAC5B,WACL,SAAS,oBAAoB,UAAW,GACxC,SAAS,oBAAoB,QAAS,EACxC,EACF,GAAG,CAAC,EAAQ,EAAW,EAAS,IACzB,IACT,EAEI,IAAM,KACN,gBAAkB,IAElB,gBAAkB,KAAK,GAAK,IAE5B,YAAc,GACd,KAAO,KAAK,GAAK,EAUrB,SAAS,oBACP,IAAI,EAAS,MAAM,UAAS,SAAU,GACpC,OAAO,EAAM,MACf,IAII,EAHK,MAAM,UAAS,SAAU,GAChC,OAAO,EAAM,EACf,IACoB,WAEhB,EAAkB,iBAClB,EAAS,EAAgB,OACzB,EAAY,EAAgB,UAC5B,EAAS,EAAgB,OAEzB,EAAW,MAAM,QAAO,GAGxB,EADY,MAAM,SAAS,IAAI,MAAM,MAAM,EAAG,EAAG,EAAG,QAClC,GAElB,EAAoB,MAAM,aAAY,WACxC,OAAO,EAAW,cAAc,qBAAuB,CACzD,GAAG,CAAC,IACA,EAAY,MAAM,OAAO,GA4E7B,OA3EA,MAAM,WAAU,WAEd,IAAI,EAAc,SAAqB,GACrC,GAAK,EAAS,QAAd,CAEA,IAAI,EAAK,EAAG,WAAa,EAAG,cAAgB,EAAG,iBAAmB,EAE9D,EAAK,EAAG,WAAa,EAAG,cAAgB,EAAG,iBAAmB,EAClE,EAAM,kBAAkB,EAAO,YAC/B,EAAM,GAAK,EAAK,YAAc,KAC9B,EAAM,GAAK,EAAK,YAAc,KAC9B,EAAM,EAAI,KAAK,IAAI,KAAO,gBAAiB,KAAK,IAAI,KAAO,gBAAiB,EAAM,IAClF,EAAO,WAAW,aAAa,EATF,CAU/B,EAGA,SAAS,IACP,EAAS,SAAU,EACnB,GAAU,EACZ,CAGA,SAAS,IACH,KACF,EAAS,SAAU,EAEf,GACF,GAAU,KAGZ,EAAU,QAAU,YAAY,MAChC,EAAS,SAAU,EAEd,GACH,GAAU,GAGhB,CAEA,IAAI,EAAgB,EAAW,cAI/B,OAHA,EAAc,iBAAiB,YAAa,GAC5C,EAAc,iBAAiB,oBAAqB,GACpD,EAAc,iBAAiB,mBAAoB,GAC5C,WACL,EAAc,oBAAoB,YAAa,GAC/C,EAAc,oBAAoB,oBAAqB,GACvD,EAAc,oBAAoB,mBAAoB,EACxD,CACF,GAAG,CAAC,EAAQ,EAAY,EAAW,EAAO,EAAO,WAAY,IAE7D,MAAM,WAAU,WACd,YAAW,WACJ,EAAS,SAAY,GACxB,GAAU,EAEd,GAAG,IACL,GAAG,CAAC,EAAQ,IACZ,MAAM,WAAU,WACd,IAAI,EAAK,SAAY,GACf,EACF,EAAW,cAAc,kBAGrB,YAAY,MAAQ,EAAU,QAAU,MAC1C,EAAW,oBAGjB,EAGA,OADA,EAAO,KAAK,GACL,WACL,IAAI,EAAM,EAAO,QAAQ,GACrB,GAAO,GAAG,EAAO,OAAO,EAAK,EACnC,CACF,GAAG,CAAC,EAAY,EAAQ,IACjB,IACT,CAEA,IAAI,aAAe,CACjB,IAAK,IAAI,MAAM,QAAQ,EAAG,GAC1B,IAAK,GAGH,gBAAkB,SAAyB,EAAY,GAGzD,IAFA,IAAI,EAAM,EAAQ,OAET,EAAI,EAAG,EAAI,EAAK,IACvB,GAAI,IAAe,EAAQ,GAAG,WAC5B,OAAO,EAAQ,EAKrB,EAEI,aAAe,SAAsB,GAEvC,IAAI,EAAM,EAAG,QAAQ,EAAG,QAAQ,OAAS,GAAG,OAC5C,OAAO,EAAI,UAAU,SAAS,qBAAuB,EAAI,UAAU,SAAS,UAAY,EAAI,UAAU,SAAS,OACjH,EAEI,iBAAmB,IAAI,MAAM,QAAQ,GAAK,IAU9C,SAAS,iBACP,IAAI,EAAgB,MAAM,OAAO,cAC7B,EAAc,MAAM,OAAO,IAAI,MAAM,MAAM,EAAG,EAAG,EAAG,QACpD,EAAS,MAAM,UAAS,SAAU,GACpC,OAAO,EAAM,MACf,IAEI,EAAc,SAAqB,EAAO,GAC5C,IAAI,EAAW,EAAY,QAAQ,QAC/B,EAAQ,EAAQ,EAAc,QAAQ,IAAI,EAC1C,EAAQ,EAAQ,EAAc,QAAQ,IAAI,EAK9C,OAJA,EAAS,kBAAkB,EAAO,YAClC,EAAS,EAAI,EAAY,QAAQ,EAAI,EAAQ,iBAAiB,EAAI,IAClE,EAAS,EAAI,EAAY,QAAQ,EAAI,EAAQ,iBAAiB,EAAI,IAClE,EAAS,EAAI,KAAK,KAAK,KAAK,GAAK,EAAG,KAAK,IAAI,KAAK,GAAK,EAAG,EAAS,IAC5D,CACT,EAGI,EAAe,SAAsB,GACvC,IAAkC,IAA9B,EAAc,QAAQ,GAI1B,GAAI,aAAa,GACf,EAAc,QAAU,iBAD1B,CAMA,IAAI,EAAa,EAAG,QAAQ,OAAS,EACjC,EAAwB,EAAG,QAAQ,GACnC,EAAU,EAAsB,QAChC,EAAU,EAAsB,QAChC,EAAK,EAAsB,WAC/B,EAAc,QAAU,CACtB,IAAK,IAAI,MAAM,QAAQ,EAAS,GAChC,GAAI,GAEN,EAAY,QAAQ,kBAAkB,EAAO,WAZ7C,CAaF,EAEI,EAAc,SAAqB,GACrC,IAAI,EAAQ,gBAAgB,EAAc,QAAQ,GAAI,EAAG,SACzD,GAAK,EAAL,CACA,IAAI,EAAU,EAAM,QAChB,EAAU,EAAM,QAChB,EAAW,EAAY,EAAS,GACpC,EAAO,WAAW,aAAa,EAJb,CAKpB,EAEI,EAAa,SAAoB,GACnC,IAAI,EAAQ,gBAAgB,EAAc,QAAQ,GAAI,EAAG,gBACzD,GAAK,EAAL,CACA,IAAI,EAAU,EAAM,QAChB,EAAU,EAAM,QACpB,EAAY,QAAU,EAAY,EAAS,GAC3C,EAAc,QAAQ,IAAM,CAJV,CAKpB,EAYA,OAVA,MAAM,WAAU,WAId,OAHA,SAAS,iBAAiB,aAAc,GACxC,SAAS,iBAAiB,YAAa,GACvC,SAAS,iBAAiB,WAAY,GAC/B,WACL,SAAS,oBAAoB,aAAc,GAC3C,SAAS,oBAAoB,YAAa,GAC1C,SAAS,oBAAoB,WAAY,EAC3C,CACF,GAAG,CAAC,EAAY,EAAa,IACtB,IACT,CAGA,IAAI,OAAS,GACT,OAAS,KACT,SAAW,EACX,aAAe,SACf,YAAc,CAChB,KAAM,aACN,KAAM,CAAC,OAAQ,SAAU,WAGvB,UAAY,kBAA2B,QAAE,CAAC,EAAG,YAAa,CAC5D,SAAU,CAAC,GAAI,OAAQ,KAGrB,aAAe,kBAA2B,QAAE,CAAC,EAAG,YAAa,CAC/D,SAAU,CAAC,GAAK,OAAS,EAAI,KAG3B,aAAe,kBAA2B,QAAE,CAAC,EAAG,YAAa,CAC/D,SAAU,CAAC,IAAK,OAAS,QAAS,KAGhC,mBAAqB,SAA4B,GACnD,IACI,EADkB,iBACO,OAEzB,EAAe,OAAO,iBAAgB,WACxC,MAAO,CACL,KAAM,EACN,SAAU,EAAQ,QAAQ,UAC1B,SAAU,SACV,eAAe,EACf,KAAM,UACN,OAAQ,CAAC,UAAW,aAAc,cAEtC,IAIA,OAHA,MAAM,WAAU,WACT,GAAQ,EAAa,GAAG,KAAK,IAAI,GACxC,GAAG,CAAC,EAAQ,IACL,CACT,EAEI,kBAAoB,KAapB,aAAe,SAAsB,GACvC,IAAI,EAAW,EAAM,SACjB,EAAS,MAAM,UAAS,SAAU,GACpC,OAAO,EAAM,MACf,IAEI,EAAY,MAAM,WAClB,EAAW,EAAU,GACrB,EAAc,EAAU,GAExB,EAAa,MAAM,UAAS,GAC5B,EAAa,EAAW,GACxB,EAAgB,EAAW,GAE3B,EAAa,MAAM,SAAS,GAC5B,EAAW,EAAW,GACtB,EAAc,EAAW,GAGzB,EAAgB,MAAM,OAAO,cAC7B,EAAgB,MAAM,OAAO,GAQ7B,EANa,QAAQ,UAAU,CACjC,MAAO,EACP,OAAQ,kBAA2B,QAAE,CAAC,EAAG,QAAQ,OAAgB,QAAG,CAClE,UAAW,SAGQ,MAGvB,MAAM,WAAU,WACd,IAAK,EAAU,CACb,IAAI,EAAO,WACT,IAAI,EAAO,IAAI,YAAY,0BAA0B,GACrD,EAAK,SAAU,EAEf,EAAY,EACd,EAGA,OADA,OAAO,iBAAiB,QAAS,GAC1B,WACL,OAAO,oBAAoB,QAAS,EACtC,CACF,CACF,GAAG,CAAC,IACJ,MAAM,UAAS,WACT,IAAa,GAEwC,IAAnD,OAAO,KAAK,EAAS,mBAAmB,SAC1C,GAAc,GACd,EAAS,SAAU,GAInB,IACF,EAAS,aAAe,EAAM,MAAQ,kBACtC,EAAS,SAEb,IAEA,IAAI,EAAe,SAAsB,GACvC,IAAkC,IAA9B,EAAc,QAAQ,GAI1B,GAAI,aAAa,GACf,EAAc,QAAU,iBAD1B,CAMA,IAAI,EAAa,EAAG,QAAQ,OAAS,EACjC,EAAwB,EAAG,QAAQ,GACnC,EAAU,EAAsB,QAChC,EAAU,EAAsB,QAChC,EAAK,EAAsB,WAC/B,EAAc,QAAU,CACtB,IAAK,IAAI,MAAM,QAAQ,EAAS,GAChC,GAAI,EAVN,CAYF,EAEI,EAAc,SAAqB,GACrC,IAAI,EAAQ,gBAAgB,EAAc,QAAQ,GAAI,EAAG,SAEzD,GAAK,EAAL,CAIA,IAAI,EAAc,EAAM,QAAU,EAAc,QAAQ,IAAI,EAC5D,EAAY,EAAc,QAAU,EAHpC,CAIF,EAEI,EAAa,SAAoB,GACnC,IAAI,EAAQ,gBAAgB,EAAc,QAAQ,GAAI,EAAG,gBAEzD,GAAK,EAAL,CAIA,IAAI,EAAc,EAAM,QAAU,EAAc,QAAQ,IAAI,EAC5D,EAAY,EAAc,QAAU,GACpC,EAAc,SAAW,EACzB,EAAc,QAAQ,IAAM,CAL5B,CAMF,EAcA,OAXA,MAAM,WAAU,WAId,OAHA,SAAS,iBAAiB,aAAc,GACxC,SAAS,iBAAiB,YAAa,GACvC,SAAS,iBAAiB,WAAY,GAC/B,WACL,SAAS,oBAAoB,aAAc,GAC3C,SAAS,oBAAoB,YAAa,GAC1C,SAAS,oBAAoB,WAAY,EAC3C,CACF,GAAG,IAEE,EAIE,KAHe,MAAM,cAAc,MAAM,SAAU,KAAM,EAIlE,EAEI,kBAAoB,SAA2B,EAAS,GAC1D,IAAI,EAAY,MAAM,OAAO,IAAI,MAAM,SAGnC,EADkB,iBACO,OAEzB,EAAQ,MAAM,SAAQ,WACxB,OAAO,IAAI,MAAM,OACnB,GAAG,IAGC,EADY,MAAM,SAAS,IAAI,MAAM,YACpB,GAEjB,EAAa,MAAM,OAAO,GAC1B,EAAQ,MAAM,UAAS,SAAU,GACnC,OAAO,EAAM,KACf,IACI,EAAe,MAAM,OAAO,IAAI,MAAM,SACtC,EAAW,MAAM,OAAO,GACxB,EAAU,MAAM,OAAO,GAGvB,EADa,MAAM,SAAS,IAAI,MAAM,SAClB,GAuCxB,MAAO,CACL,UAAW,EACX,eAvCmB,SAAwB,EAAK,GAChD,EAAO,EAAI,EAAS,GAAK,EACzB,EAAO,EAAI,EACX,EAAO,EAAI,EAAS,GAAK,EACzB,IAAI,EAAM,EAAO,SAAW,EACxB,GAAY,EAAS,GAAK,GAAK,EAAa,QAAQ,EACpD,EAAc,EAAM,iBACpB,EAAQ,KAAK,IAAI,EAAc,EAAS,SAiB5C,GAhBA,EAAQ,QAAU,MAAM,UAAU,KAAK,EAAQ,QAAS,EAAW,GAAS,EAC5E,IAEA,EAAM,EAAiC,KAA5B,EAAU,QAAQ,GAAK,GAClC,EAAM,EAAI,EAAU,QAAQ,GAAK,EAEjC,EAAM,EAAI,EACV,EAAM,eAAe,EAAoC,KAA5B,KAAK,IAAI,EAAQ,UAC9C,EAAK,KAAK,EAAI,YACd,EAAK,EAAI,EACT,EAAK,EAAI,EACT,EAAM,gBAAgB,GAEtB,EAAW,QAAU,MAAM,UAAU,KAAK,EAAW,QAAsC,IAA5B,EAAU,QAAQ,GAAK,GAAU,IAAa,KAAN,GACvG,EAAM,EAAI,KAAK,KAAK,EAAS,GAAK,GAAK,EAAW,QAAS,EAAI,GAE1D,EAAO,QAGL,CACL,IAAI,EAAO,MAAM,UAAU,KAAK,EAAS,GAAK,EAAG,EAAM,EAAG,KACtD,EAAO,MAAM,UAAU,KAAK,EAAS,GAAK,EAAG,EAAM,EAAG,KAC1D,EAAQ,SAAS,IAAI,EAAM,EAAM,EAAG,GACpC,EAAa,QAAQ,IAAI,EAAM,EAAM,EAAG,EAC1C,MAPE,EAAQ,SAAS,IAAI,EAAM,EAAG,EAAM,EAAG,EAAM,GAC7C,EAAa,QAAQ,IAAI,EAAM,EAAG,EAAM,EAAG,EAAM,GAQnD,EAAS,QAAU,CACrB,EAMF,EAUI,SAAW,SAAkB,GAC/B,IAAI,EAAc,EAAM,KACpB,OAAuB,IAAhB,EAAyB,QAAU,EAC1C,EAAmB,EAAM,UACzB,OAAiC,IAArB,EAA8B,KAAK,GAAK,EAAI,EACxD,EAAmB,EAAM,UACzB,OAAiC,IAArB,EAA8B,GAAM,EAChD,EAAa,GAAG,cAAc,GAG9B,EADS,GAAG,QACI,OAEhB,EAAa,MAAM,QAAO,GAiB9B,OAhBA,MAAM,UAAS,WACb,GAAI,GAAc,EAAW,YAAY,QAAS,CAChD,IACI,EADwB,EAAW,YAAY,QAAQ,KAC7B,GAE1B,KAAK,IAAI,GAAK,GACX,EAAW,SACd,EAAO,SAAS,EAAY,KAAK,KAAK,IAGxC,EAAW,SAAU,GAErB,EAAW,SAAU,CAEzB,CACF,IACO,IACT,EAEI,iBAAmB,SAA0B,GAC/C,IAAI,EAAe,EAAM,KACrB,OAAwB,IAAjB,EAA0B,OAAS,EAC1C,EAAY,EAAM,UAClB,EAAa,GAAG,cAAc,GAUlC,OATA,MAAM,UAAS,WACb,GAAI,GAAc,EAAW,YAAY,QAAS,CAChD,IAAI,EAAyB,EAAW,YAAY,QAAQ,KACxD,EAAI,EAAuB,GAC3B,EAAI,EAAuB,GAC/B,EAAU,QAAQ,EAAI,EACtB,EAAU,QAAQ,EAAI,CACxB,CACF,IACO,IACT,EAEI,IAAM,SAAa,GACrB,IAAI,EAAY,EAAM,UAClB,EAAa,GAAG,cAAc,QASlC,OARA,MAAM,UAAS,WACb,GAAI,GAAc,EAAW,YAAY,QAAS,CAChD,IACI,EADyB,EAAW,YAAY,QAAQ,QACvB,GACrC,IAAK,EAAS,OACd,EAAU,QAAQ,EAAI,EAAQ,QAAU,GAAM,CAChD,CACF,IACO,IACT,EAEA,SAAS,qBAAqB,GAC5B,IAAI,EAAW,EAAM,SACjB,EAAY,EAAM,UAClB,EAAW,EAAM,SACjB,EAAmB,EAAM,iBAGzB,EADU,GAAG,QACI,OAUrB,OARA,MAAM,UAAS,WACb,EAAO,SAAS,KAAK,EAAS,SAK9B,EAAO,SAAS,GAAK,GACvB,IACoB,MAAM,cAAc,MAAM,SAAU,KAAmB,MAAM,cAAc,IAAK,CAClG,UAAW,IACI,MAAM,cAAc,SAAU,GAAwB,MAAM,cAAc,iBAAkB,kBAA2B,QAAE,CAAC,EAAG,EAAkB,CAC9J,UAAW,KACK,MAAM,cAAc,GAAG,qBAAsB,MACjE,CAEA,IAAI,eAAiB,SAAwB,GAC3C,OAAO,MAAM,SAAQ,WACnB,MAAO,CACL,KAAM,WACJ,OAAO,EAAa,SAAU,CAChC,EACA,OAAQ,WACN,OAAO,EAAa,SAAU,CAChC,EACA,SAAU,WACR,OAAO,EAAa,OACtB,EAEJ,GAAG,CAAC,GACN,EAEI,OAAS,SAAgB,EAAU,GACrC,IAAI,EAAS,MAAM,UAAS,SAAU,GACpC,OAAO,EAAG,MACZ,IAMI,EAJa,QAAQ,UAAU,CACjC,IAAK,EACL,OAAQ,QAAQ,OAAgB,UAEb,IAGjB,EADY,MAAM,SAAS,IAAI,MAAM,SAClB,GAcvB,MAAO,CACL,OAbW,SAAgB,GAC3B,IAAI,EAAY,EAAU,QAAQ,SAAW,GACzC,EAAc,KAAK,IAAI,EAAS,QAAQ,GAAK,IACjD,EAAI,IAAI,GAAa,EAAc,EAAI,GACvC,IAAI,EAAM,EAAI,MACV,EAAuC,MAAnC,KAAK,IAAwB,GAApB,EAAM,aAA6B,EAChD,EAA6C,KAAzC,KAAK,IAAwB,GAApB,EAAM,YAAmB,IAAe,EACzD,EAAO,IAAI,EAAG,EAAG,GACjB,EAAO,gBAAgB,EAAO,YAC9B,EAAO,SAAS,IAAI,EACtB,EAKF,EAEI,cAA6B,MAAM,cAAc,CAAC,GAClD,UAAY,WACd,OAAO,MAAM,WAAW,cAC1B,EACI,MAAQ,IAER,oBAAqB,EASzB,SAAS,OAAO,GACd,IAAI,EAAW,EAAM,SACjB,EAAa,EAAM,IACnB,OAAqB,IAAf,EAAwB,CAAC,EAAG,EAAG,GAAK,EAC1C,EAAa,EAAM,IACnB,OAAqB,IAAf,EAAwB,EAAI,EAClC,EAAgB,EAAM,OACtB,OAA2B,IAAlB,GAAmC,EAC5C,EAAe,EAAM,MACrB,OAAyB,IAAjB,EAA0B,MAAQ,EAC1C,EAAkB,EAAM,SACxB,OAA+B,IAApB,EAA6B,CAC1C,aAAa,GACX,EACA,EAAS,MAAM,UAAS,SAAU,GACpC,OAAO,EAAM,MACf,IACI,EAAmB,MAAM,UAAS,SAAU,GAC9C,OAAO,EAAM,SACf,IAGI,EADkB,iBACO,OAGzB,EAAU,MAAM,QAAO,IAAI,MAAM,SAAU,UAAU,IACrD,EAAW,MAAM,OAAO,IAAI,MAAM,SAClC,EAAW,MAAM,OAAO,IAAI,MAAM,SAClC,EAAe,MAAM,QAAO,GAC5B,EAAY,MAAM,SAAQ,WAC5B,OAAO,IAAI,MAAM,UAAU,IAAI,MAAM,QAAW,IAAI,MAAM,QAAW,EAAG,EAC1E,GAAG,IAGC,EADsB,mBAAmB,GACX,GAE9B,EAAqB,kBAAkB,EAAS,GAChD,EAAY,EAAmB,UAC/B,EAAiB,EAAmB,eAEpC,EAAM,OAAO,EAAU,GAE3B,MAAM,WAAU,WAEd,EAAO,SAAS,mBAAkB,IAAI,MAAM,YAAa,iBAAiB,IAAI,MAAM,QAAQ,EAAG,EAAG,GAAI,GACxG,GAAG,IACH,MAAM,WAAU,WACd,IAAI,EAAW,EAAQ,SAAS,WAAU,SAAU,GAClD,OAAO,EAAS,QAAQ,UAAU,EACpC,IACI,EAAW,EAAQ,SAAS,WAAU,SAAU,GAClD,OAAO,EAAS,QAAQ,UAAU,EACpC,IACA,OAAO,WACL,IACA,GACF,CACF,GAAG,CAAC,EAAS,EAAQ,SAAU,EAAQ,WACvC,MAAM,UAAS,SAAU,GACvB,IAAI,EAAQ,EAAK,MAGb,EAAO,UACT,EAAU,IAAI,OAAO,KAAK,EAAS,SACnC,EAAU,IAAI,UAAU,IAAI,EAAG,GAAI,GACnC,EAAU,IAAI,UAAU,gBAAgB,EAAO,aAGjD,EAAO,SAAS,KAAK,EAAS,SAEzB,EAAa,UAChB,EAAe,EAAQ,EAAS,SAChC,EAAI,OAAO,GAEf,IACA,IAAI,EAAc,MAAM,aAAY,SAAU,GAE5C,EAAQ,QAAQ,KAAK,GACrB,EAAQ,SAAS,IAAI,EAAI,EAAG,EAAI,EAAG,EAAI,GACvC,EAAS,QAAQ,KAAK,EACxB,GAAG,CAAC,EAAQ,WAMR,EAAQ,CACV,SAAU,CACR,IAAK,WACH,OAAO,EAAS,QAAQ,OAC1B,EACA,IAAK,GAEP,SAAU,CACR,IAAK,WACH,OAAO,EAAS,QAAQ,OAC1B,EACA,IAhBc,MAAM,aAAY,SAAU,GAC5C,EAAQ,SAAS,IAAI,EAAI,EAAG,EAAI,EAAG,EAAI,GACvC,EAAS,QAAQ,KAAK,EACxB,GAAG,CAAC,EAAQ,YAeV,SAdgB,eAAe,GAe/B,UAAW,EAAO,OAAS,EAAmB,GAEhD,OAAoB,MAAM,cAAc,cAAc,SAAU,CAC9D,MAAO,GACN,EAAO,QAAuB,MAAM,cAAc,MAAM,SAAU,MAAmB,MAAZ,OAAmB,EAAS,EAAS,cAA6B,MAAM,cAAc,eAAgB,QAAqB,MAAZ,GAAoB,EAAS,cAA6B,MAAM,cAAc,aAAc,CACrR,SAAuB,MAAM,cAAc,eAAgB,QAC5C,MAAM,cAAc,eAAgB,CACnD,UAAW,KACR,EAAO,SAAwB,MAAM,cAAc,MAAM,SAAU,KAAmB,MAAM,cAAc,iBAAkB,CAC/H,UAAW,EACX,OAAQ,IACO,MAAM,cAAc,kBAAmB,OAAQ,EAAO,IAAmB,MAAM,cAAc,qBAAsB,CAClI,SAAU,EACV,UAAW,IACT,mBAAqB,EAC3B,CAQA,SAAS,cACP,IAAI,EAAY,MAAM,SAAS,GAC3B,EAAK,EAAU,GACf,EAAQ,EAAU,GAEtB,OAAO,MAAM,aAAY,WACvB,OAAO,EAAM,KAAK,SACpB,GAAG,CAAC,GACN,CAEA,IAAI,aAAe,SAAsB,GACvC,IAAI,EAAQ,MAAM,SAAQ,WACxB,IAAI,EAAM,SAAS,cAAc,SAEjC,OADA,SAAS,KAAK,YAAY,GACnB,CACT,GAAG,IAiBH,OAhBA,MAAM,WAAU,WACd,EAAM,aAAa,OAAQ,GAC3B,EAAM,MAAM,OAAS,MACrB,EAAM,MAAM,QAAU,IACtB,EAAM,MAAM,SAAW,OAEvB,EAAM,MAAM,SAAW,WACvB,EAAM,MAAM,KAAO,MACnB,EAAM,MAAM,IAAM,IAClB,EAAM,MAAM,UAAY,qBAC1B,GAAG,CAAC,EAAO,IACX,MAAM,WAAU,WACd,OAAO,WACL,SAAS,KAAK,YAAY,EAC5B,CACF,GAAG,CAAC,IACG,CACT,EACI,aAAe,SAAsB,EAAM,EAAO,GAEpD,IAAI,EAAQ,aAAsB,aAAT,EAAsB,WAAa,QAGxD,EADkB,iBACO,OAEzB,EAAa,YACb,EAAW,EAAW,SACtB,EAAW,EAAW,SAEtB,EAAW,cAEX,EAAY,MAAM,UAAS,GAC3B,EAAU,EAAU,GACpB,EAAa,EAAU,GAEvB,EAAe,MAAM,QAAO,GAGhC,MAAM,WAAU,WACd,EAAM,iBAAiB,SAAS,WAC9B,OAAO,GAAW,EACpB,IACA,EAAM,iBAAiB,QAAQ,WAC7B,OAAO,GAAW,EACpB,IACA,EAAM,aAAe,KACvB,GAAG,CAAC,IAEJ,MAAM,WAAU,WACV,GAAW,GAAQ,EAAM,MAC/B,GAAG,CAAC,EAAO,EAAS,IAEpB,MAAM,WAAU,WACV,GACF,EAAS,IAAI,IAAI,MAAM,SACvB,EAAS,QACC,aACV,EAAS,IAAI,IAAI,MAAM,SACvB,EAAS,SAEb,GAAG,CAAC,EAAS,EAAU,IAEvB,MAAM,WAAU,WACd,OAAO,WACA,YAAY,EAAS,QAC5B,CACF,GAAG,CAAC,IAEJ,MAAM,WAAU,WACd,IAOI,EAAa,WACf,IAAI,EAAU,IAAU,SAAS,eAC5B,EAAa,SAAW,EAAS,EAAM,OAAgB,EAAa,UAAY,GAAS,EAAM,QACpG,EAAa,SAAU,CACzB,EAEI,EAAU,WAbK,IAAsB,EAEnC,EAYA,IAAU,SAAS,gBACV,WAAT,IAAmB,EAAM,OAfU,EAeW,EAAM,OAbpD,EAAM,EAAE,MADH,wCAGL,EAAI,QAAU,EAAI,GAAW,EAAkB,EAAI,GADtC,KAajB,EAAS,EAAM,OACjB,EAEI,EAAoB,WAClB,IAAU,SAAS,eACvB,GACF,EAKA,OAHA,SAAS,iBAAiB,QAAS,GACnC,EAAM,iBAAiB,QAAS,GAChC,SAAS,iBAAiB,kBAAmB,GACtC,WACL,SAAS,oBAAoB,QAAS,GACtC,EAAM,oBAAoB,QAAS,GACnC,SAAS,oBAAoB,kBAAmB,EAClD,CACF,GAAG,CAAC,EAAO,EAAU,EAAU,EAAM,IAErC,MAAM,WAAU,WACV,EAAM,QAAU,IAClB,EAAM,MAAQ,EACd,IAEJ,GAAG,CAAC,EAAO,IAOX,MAAO,CACL,MAAO,EACP,QAAS,EACT,WARe,WACf,EAAa,SAAU,EACvB,EAAM,OACR,EAOF,EAQI,YAAc,WAChB,IAAI,EAAO,MAAM,QAAO,GACpB,EAAY,MAAM,SA0BtB,OAxBA,MAAM,WAAU,WACd,IAAI,EAAc,SAAqB,GACrC,IAAI,EAAU,EAAE,SAAW,EAAE,QAEzB,EAAK,UAAY,EACd,EAAU,UACb,EAAU,SAAU,IAAI,MAAO,UAC/B,YAAW,WACT,EAAK,SAAU,EACf,EAAU,aAAU,CACtB,GAXM,KAcR,EAAK,QAAU,CAEnB,EAIA,OAFA,SAAS,iBAAiB,UAAW,GACrC,SAAS,iBAAiB,QAAS,GAC5B,WACL,SAAS,oBAAoB,UAAW,GACxC,SAAS,oBAAoB,QAAS,EACxC,CACF,GAAG,CAxBW,KAyBP,CACT,EAKI,aAAe,WACjB,IAAI,EAAQ,MAAM,QAAO,GACrB,EAAY,MAAM,SA0BtB,OAxBA,MAAM,WAAU,WACd,IAAI,EAAc,SAAqB,GACrC,IAAI,EAAW,EAAE,SAEb,EAAM,UAAY,EACf,EAAU,UACb,EAAU,SAAU,IAAI,MAAO,UAC/B,YAAW,WACT,EAAM,SAAU,EAChB,EAAU,aAAU,CACtB,GAXM,KAcR,EAAM,QAAU,CAEpB,EAIA,OAFA,SAAS,iBAAiB,UAAW,GACrC,SAAS,iBAAiB,QAAS,GAC5B,WACL,SAAS,oBAAoB,UAAW,GACxC,SAAS,oBAAoB,QAAS,EACxC,CACF,GAAG,CAxBW,KAyBP,CACT,EAQI,YAAc,SAAqB,EAAM,EAAU,GACrD,MAAM,WAAU,WACd,IAAI,EAAU,MAAM,QAAQ,GAAQ,EAAO,CAAC,GAExC,EAAe,SAAsB,GACnC,EAAQ,SAAS,EAAE,MAAM,EAAS,EACxC,EAGA,OADA,SAAS,iBAAiB,WAAY,GAC/B,WACL,SAAS,oBAAoB,WAAY,EAC3C,CACF,GAAG,CAAC,EAAU,GAAM,OAAO,GAAQ,IACrC,EAQI,WAAa,SAAoB,GACnC,IAAI,EAAY,MAAM,UAAS,GAC3B,EAAU,EAAU,GACpB,EAAa,EAAU,GAM3B,OAJA,gBAAgB,GAAG,WACjB,IAAI,EAAI,EAAI,MACR,GAAiB,IAAN,EAAS,GAAW,IAAiB,GAAW,EAAI,GAAG,GAAW,EACnF,IACO,CACT,EAEI,YAAc,CAAC,MAAO,SAAU,aAChC,WAAa,CAAC,MAAO,SAAU,aAEnC,SAAS,iBAAiB,GACxB,IAAI,EAAM,EAAM,IACZ,EAAS,EAAM,OACf,EAAY,EAAM,UAClB,EAAO,uCAAgD,QAAE,EAAO,aAEhE,EAAO,SAAS,GAChB,EAAQ,MAAM,SAAQ,WACxB,OAAO,YAAY,cAAc,MAAM,EAAK,MAC9C,GAAG,CAAC,EAAK,QACL,EAAO,MAAM,SAAQ,WACvB,OAAO,IAAI,MAAM,MAAO,cAAc,EACxC,GAAG,CAAC,IACA,EAAY,MAAM,SAAQ,WAC5B,OAAO,EAAK,UAAU,IAAI,MAAM,SAAW,gBAAgB,EAC7D,GAAG,CAAC,IACA,EAAQ,EAAK,IAAI,EAAI,EAAK,IAAI,EAC9B,EAAQ,EAAK,IAAI,EAAI,EAAK,IAAI,EAC9B,EAAQ,EAAK,IAAI,EAAI,EAAK,IAAI,EAE9B,EAAa,EADH,KAAK,IAAI,EAAO,EAAO,GAErC,OAAoB,MAAM,cAAc,QAAS,kBAA2B,QAAE,CAC5E,KAAM,kBACL,GAAoB,MAAM,cAAc,QAAS,CAClD,MAAO,EAAY,EAAa,GAClB,MAAM,cAAc,YAAa,CAC/C,OAAQ,EACR,SAAU,EAAS,OAAY,KAEnC,CAEA,SAAS,cAAc,GACrB,EAAM,IACF,EAAM,OACN,EAAM,UACN,IAAI,EAAO,uCAAgD,QAAE,EAAO,YAExE,OAAoB,MAAM,cAAc,QAAS,kBAA2B,QAAE,CAC5E,KAAM,2BACL,GAAoB,MAAM,cAAc,OAAQ,CACjD,SAAU,MAAM,2BACF,MAAM,cAAc,oBAAqB,CACvD,KAAM,CAAC,EAAG,EAAG,MAEjB,CAEA,SAAS,MAAM,GACb,OAAoB,MAAM,cAAc,mBAAmB,cAAe,CACxE,eAAgB,WACd,OAAoB,MAAM,cAAc,cAAe,EACzD,EACA,QAAS,SAAiB,GACxB,OAAO,QAAQ,MAAM,EACvB,GACc,MAAM,cAAc,MAAM,SAAU,CAClD,SAAU,MACI,MAAM,cAAc,iBAAkB,IACxD,CAEA,IAAI,YAAc,CAAC,MAAO,OAAQ,SAAU,QAAS,SAAU,gBAAiB,cAChF,SAAS,MAAM,GACb,IAAI,EAAM,EAAM,IACZ,EAAc,EAAM,KACpB,OAAuB,IAAhB,EAAyB,EAAI,EACpC,EAAS,EAAM,OACf,EAAQ,EAAM,MACd,EAAgB,EAAM,OACtB,OAA2B,IAAlB,EAA2B,EAAI,EACxC,EAAgB,EAAM,cACtB,EAAoB,EAAM,WAC1B,OAAmC,IAAtB,EAA+B,EAAI,EAChD,EAAO,uCAAgD,QAAE,EAAO,aAEhE,EAAS,MAAM,UAAS,SAAU,GACpC,OAAO,EAAM,MACf,IACI,EAAW,MAAM,SAEjB,EAAY,MAAM,WAClB,EAAU,EAAU,GACpB,EAAa,EAAU,GAEvB,EAAa,MAAM,WACnB,EAAO,EAAW,GAClB,EAAU,EAAW,GAErB,EAAQ,MAAM,SAAQ,WACxB,IAAI,EAAI,SAAS,cAAc,SAQ/B,OANA,EAAE,aAAc,EAChB,EAAE,YAAc,YAChB,EAAE,MAAO,EACT,EAAE,IAAM,EACR,EAAE,UAAW,EACb,EAAE,MAAQ,IAAgB,EACnB,CACT,GAAG,IAwDH,GAvDA,MAAM,WAAU,WACd,IAAI,EAAa,WACf,IAAK,IAAU,EAAM,SAAW,EAAS,CACvC,IAAI,EAAY,IAAI,MAAM,cAE1B,EAAO,IAAI,GACX,IAAI,EAAQ,IAAI,MAAM,gBAAgB,GACtC,EAAM,sBAAsB,GAC5B,EAAM,eAAe,KACrB,EAAM,iBAAiB,GACvB,EAAM,UAAU,GAChB,EAAM,mBAAmB,IAAK,IAAK,IACnC,EAAW,EACb,CACF,EAEI,EAAY,WACd,EAAM,OAAO,MAAK,WAChB,OAAO,EAAQ,IAAI,MAAM,QAAQ,EAAM,WAAY,EAAM,aAC3D,IACA,GACF,EAEA,GAAI,EAMF,OALA,EAAM,OAAO,MAAK,WAChB,EAAQ,IAAI,MAAM,QAAQ,EAAM,WAAY,EAAM,cAClD,GACF,IACA,SAAS,iBAAiB,QAAS,GAC5B,WACL,SAAS,oBAAoB,QAAS,EACxC,CAEJ,GAAG,CAAC,EAAS,EAAO,IACpB,MAAM,WAAU,WACd,OAAO,WACD,EAAS,UACX,EAAO,OAAO,EAAS,SACvB,EAAS,QAAQ,QACjB,EAAS,aAAU,GAGjB,IACF,EAAQ,QACR,EAAQ,aACR,OAAW,IAGT,IACF,EAAM,QACN,EAAM,SAEV,CACF,GAAG,KAEE,IAAS,EACZ,OAAO,KAGT,IAAI,EAAM,KAAK,IAAI,EAAK,EAAG,EAAK,GAC5B,EAAQ,EAAK,EAAI,EAAM,EACvB,EAAS,EAAK,EAAI,EAAM,EAC5B,OAAoB,MAAM,cAAc,QAAS,kBAA2B,QAAE,CAC5E,KAAM,kBACL,GAAoB,MAAM,cAAc,OAAQ,KAAmB,MAAM,cAAc,sBAAuB,CAC/G,KAAM,CAAC,EAAO,KACC,MAAM,cAAc,oBAAqB,CACxD,KAAM,MAAM,YACE,MAAM,cAAc,eAAgB,CAClD,OAAQ,MACR,KAAM,CAAC,GACP,SAAU,MAAM,iBACZ,GAAwB,MAAM,cAAc,YAAa,CAC7D,OAAQ,IACN,GAAuB,MAAM,cAAc,MAAO,CACpD,MAAO,EACP,OAAQ,EACR,UAAW,EACX,SAAU,IAEd,CAEA,SAAS,YACP,IAAI,EAAM,MAAM,SAAQ,WACtB,IAAI,EAAI,IAAI,MAAM,oBAOlB,OALA,EAAE,gBAAkB,SAAU,GAC5B,EAAO,aAAe,WAAa,EAAO,aAAa,QAAQ,6BAA8B,+BAAiC,UAC9H,EAAO,eAAiB,SAAW,EAAO,eAAe,QAAQ,4BAA6B,gCAAkC,kBAClI,EAEO,CACT,GAAG,IACH,OAAoB,MAAM,cAAc,QAAS,CAC/C,KAAM,uBACQ,MAAM,cAAc,OAAQ,CAC1C,cAAe,KAAK,GAAK,EACzB,SAAU,GACI,MAAM,cAAc,sBAAuB,CACzD,KAAM,CAAC,IAAO,IAAO,EAAG,MAE5B,CACA,IAAI,MAAQ,6lGACR,MAAQ,4uCACR,WAAa,2BACb,SAAW,yBACX,SAAW,OAAS,MAAQ,OAAS,MAAQ,+BAC7C,kBAAoB,oHAExB,SAAS,kCAAkC,EAAG,GAAkB,IAAI,EAAuB,oBAAX,QAA0B,EAAE,OAAO,WAAa,EAAE,cAAe,GAAI,EAAI,OAAQ,EAAK,EAAG,KAAK,IAAI,KAAK,KAAK,GAAK,GAAI,MAAM,QAAQ,KAAO,EAAK,8BAA8B,KAAO,GAAkB,GAAyB,iBAAb,EAAE,OAAqB,CAAM,IAAI,EAAI,GAAI,IAAI,EAAI,EAAG,OAAO,WAAc,OAAI,GAAK,EAAE,OAAe,CAAE,MAAM,GAAe,CAAE,MAAM,EAAO,MAAO,EAAE,KAAQ,CAAG,CAAE,MAAM,IAAI,UAAU,wIAA0I,CAE/lB,SAAS,8BAA8B,EAAG,GAAU,GAAK,EAAL,CAAgB,GAAiB,iBAAN,EAAgB,OAAO,oBAAoB,EAAG,GAAS,IAAI,EAAI,OAAO,UAAU,SAAS,KAAK,GAAG,MAAM,GAAI,GAAiE,MAAnD,WAAN,GAAkB,EAAE,cAAa,EAAI,EAAE,YAAY,MAAgB,QAAN,GAAqB,QAAN,EAAoB,MAAM,KAAK,GAAc,cAAN,GAAqB,2CAA2C,KAAK,GAAW,oBAAoB,EAAG,QAA3G,CAA/O,CAAmW,CAEra,SAAS,oBAAoB,EAAK,IAAkB,MAAP,GAAe,EAAM,EAAI,UAAQ,EAAM,EAAI,QAAQ,IAAK,IAAI,EAAI,EAAG,EAAO,IAAI,MAAM,GAAM,EAAI,EAAK,IAAO,EAAK,GAAK,EAAI,GAAM,OAAO,CAAM,CAKxL,IAAI,SAAW,CAAC,WAAY,aACxB,mBAAqB,SAA4B,GACnD,IAAI,EAAS,GAab,GAZA,EAAI,UAAS,SAAU,GACrB,GAAI,EAAK,OACP,IAAK,IAA6D,EAAzD,EAAY,kCAAkC,YAAoB,EAAQ,KAAa,MAAO,CACrG,IAAI,EAAU,EAAM,MAEhB,EAAK,KAAK,cAAc,SAAS,IACnC,EAAO,KAAK,EAEhB,CAEJ,IAEI,EAAO,OAAS,EAClB,OAAO,CAIX,EAKI,oBAAsB,SAA6B,GACrD,OAAO,EAAS,MAAQ,EAAS,MAAM,MAAQ,EAAI,EAAS,WAAW,SAAS,MAAQ,CAC1F,EAKI,UAAY,SAAmB,GACjC,IAAI,EAAS,GAMb,OALA,EAAI,UAAS,SAAU,GACjB,EAAK,QACP,EAAO,KAAK,EAEhB,IACO,CACT,EAKI,sBAAwB,SAA+B,EAAM,GAC/D,IAAI,EAAM,EAAK,SAAS,QACxB,EAAK,mBAAkB,GAAM,GAC7B,IAAI,EAAM,IAAI,MAAM,QAChB,EAAO,IAAI,MAAM,WACjB,EAAQ,IAAI,MAAM,MAClB,EAAQ,IAAI,MAAM,QAClB,EAAM,EAEV,GACE,EAAI,OAAO,UAAU,EAAK,EAAM,GAChC,EAAM,kBAAkB,GACxB,EAAI,MAAM,EAAM,EAAG,EAAM,EAAG,EAAM,GAClC,EAAI,QAAQ,EAAM,GAClB,EAAI,QAAQ,EAAM,GAClB,EAAI,QAAQ,EAAM,GAClB,EAAI,UAAU,EAAI,EAAG,EAAI,EAAG,EAAI,GAChC,EAAM,EAAI,aACH,GAAO,IAAQ,GAExB,OAAO,CACT,EAKI,cAAgB,SAAuB,GACzC,IAAI,EAAQ,EAAO,KAAI,SAAU,GAC/B,OAAO,EAAK,IACd,IAEA,OADA,EAAM,OACC,EAAM,KAAK,IACpB,EAEI,oBAAsB,SAA6B,EAAU,GAC/D,IAAI,EAAU,EAAS,MAAM,MACzB,EACJ,EAAS,WAAW,SAAS,6BACzB,EAAW,GAEf,GAAI,EAIF,IAHA,IAAI,EAAO,EAAS,WAAW,SAC3B,EAAO,EAAK,KAEP,EAAI,EAAK,OAAQ,EAAI,EAAK,MAAM,OAAQ,GAAK,EAAK,OACzD,IAAK,IAAI,EAAI,EAAG,EAAI,EAAK,SAAU,IACjC,EAAS,KAAK,EAAK,MAAM,EAAI,SAIjC,EAAW,EAAS,WAAW,SAAS,MAG1C,OAAO,OAAO,YAAW,WACvB,MAAO,CACL,KAAM,SACN,KAAM,CAAC,EAAU,GACjB,SAAmB,MAAT,OAAgB,EAAS,EAAM,IACzC,SAAmB,MAAT,OAAgB,EAAS,EAAM,IAE7C,QAAG,EAAW,CAAC,EAAS,MAC1B,EAEA,SAAS,gBAAgB,GACvB,IAAI,EAAM,EAAM,IACZ,EAAQ,MAAM,OAAO,MAKrB,EAHY,MAAM,UAAS,WAC7B,OAAO,IAAI,MAAM,OACnB,IACoB,GAKhB,EAHa,MAAM,UAAS,WAC9B,OAAO,IAAI,MAAM,UACnB,IACsB,GAKlB,EAHa,MAAM,UAAS,WAC9B,OAAO,IAAI,MAAM,OACnB,IACuB,GAKnB,EAHa,MAAM,UAAS,WAC9B,OAAO,IAAI,MAAM,KACnB,IACuB,GAEnB,EAAa,MAAM,SAAS,IAAI,MAAM,QAAQ,EAAG,EAAG,IACpD,EAAW,EAAW,GACtB,EAAc,EAAW,GAEzB,EAAW,MAAM,SAAQ,WAC3B,IAAI,EAAI,EAAI,QAAQ,MAAM,EAAS,EAAG,EAAS,EAAG,EAAS,GAE3D,OADA,EAAE,uBACK,CACT,GAAG,CAAC,EAAK,IAML,EAJuB,oBAAoB,EAAU,CACvD,IAAK,EAAI,UACT,IAAK,CAAC,EAAM,EAAG,EAAM,EAAG,EAAM,KAED,GAE3B,EAAoB,MAAM,OAAO,IAAI,MAAM,SAkB/C,OAjBA,gBAAgB,GAAG,WACZ,EAAM,UAEX,EAAM,QAAQ,mBAAkB,GAAM,GACtC,EAAM,QAAQ,YAAY,UAAU,EAAK,EAAM,GAE3C,EAAkB,QAAQ,OAAO,EAAM,QAAQ,eAKnD,EAAkB,QAAQ,KAAK,EAAM,QAAQ,aAE7C,EAAI,SAAS,KAAK,GAClB,EAAI,SAAS,KAAK,EAAM,kBAAkB,IACrC,EAAM,OAAO,IAAW,EAAY,EAAM,UACjD,IACoB,MAAM,cAAc,QAAS,CAC/C,IAAK,GAET,CAGA,IAAI,GAAK,IAAI,MAAM,QACf,GAAK,IAAI,MAAM,QAEnB,SAAS,aAAa,EAAO,IACI,IAA3B,EAAM,QAAQ,IAAgB,EAAM,KAAK,EAC/C,CAEA,SAAS,gBAAgB,EAAO,GAC9B,IAAI,EAAI,EAAM,QAAQ,GAClB,GAAK,GAAG,EAAM,OAAO,EAAG,EAC9B,CAEA,IAAI,OAAsB,WACxB,SAAS,EAAO,EAAG,GACjB,KAAK,QAAU,EACf,KAAK,UAAY,EACjB,KAAK,UAAY,EACjB,KAAK,SAAW,EAChB,KAAK,GAAK,EAEV,KAAK,MAAQ,GAEb,KAAK,UAAY,GAGjB,KAAK,aAAe,EAEpB,KAAK,iBAAmB,IAC1B,CAEA,IAAI,EAAS,EAAO,UAmBpB,OAjBA,EAAO,kBAAoB,SAA2B,GACpD,aAAa,KAAK,UAAW,EAC/B,EAEA,EAAO,oBAAsB,SAA6B,GACxD,IAAI,EAAY,KAAK,UACjB,EAAQ,KAAK,MACb,EAAS,EAAU,QAAQ,GAC/B,IAAgB,IAAZ,EAAJ,CAEA,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,OAAQ,IAChC,GAAI,EAAM,GAAG,UAAU,GAAI,OAG7B,EAAU,OAAO,EAAQ,EANA,CAO3B,EAEO,CACT,CAtC0B,GAyCtB,SAAwB,WAC1B,SAAS,EAAS,EAAI,EAAI,EAAI,EAAG,EAAG,GAClC,KAAK,OAAS,IAAI,MAAM,QACxB,KAAK,EAAI,EACT,KAAK,EAAI,EACT,KAAK,EAAI,EACT,KAAK,GAAK,EACV,KAAK,GAAK,EACV,KAAK,GAAK,EACV,KAAK,gBACL,EAAG,MAAM,KAAK,MACd,EAAG,kBAAkB,GACrB,EAAG,kBAAkB,GACrB,EAAG,MAAM,KAAK,MACd,EAAG,kBAAkB,GACrB,EAAG,kBAAkB,GACrB,EAAG,MAAM,KAAK,MACd,EAAG,kBAAkB,GACrB,EAAG,kBAAkB,EACvB,CAEA,IAAI,EAAU,EAAS,UAmCvB,OAjCA,EAAQ,cAAgB,WACtB,IAAI,EAAK,KAAK,GAAG,SACb,EAAK,KAAK,GAAG,SACb,EAAK,KAAK,GAAG,SACjB,GAAG,WAAW,EAAI,GAClB,GAAG,WAAW,EAAI,GAClB,GAAG,MAAM,IAAI,YACb,KAAK,OAAO,KAAK,GACnB,EAEA,EAAQ,UAAY,SAAmB,GACrC,OAAO,IAAM,KAAK,IAAM,IAAM,KAAK,IAAM,IAAM,KAAK,EACtD,EAEA,EAAQ,cAAgB,SAAuB,EAAM,GAC/C,IAAS,KAAK,GAAI,KAAK,GAAK,EAAc,IAAS,KAAK,GAAI,KAAK,GAAK,EAAc,IAAS,KAAK,KAAI,KAAK,GAAK,GACpH,gBAAgB,EAAK,MAAO,MAC5B,EAAK,MAAM,KAAK,MAChB,EAAK,oBAAoB,KAAK,IAC9B,KAAK,GAAG,oBAAoB,GAC5B,EAAK,oBAAoB,KAAK,IAC9B,KAAK,GAAG,oBAAoB,GAC5B,EAAK,oBAAoB,KAAK,IAC9B,KAAK,GAAG,oBAAoB,GAC5B,KAAK,GAAG,kBAAkB,KAAK,IAC/B,KAAK,GAAG,kBAAkB,KAAK,IAC/B,KAAK,GAAG,kBAAkB,KAAK,IAC/B,KAAK,GAAG,kBAAkB,KAAK,IAC/B,KAAK,GAAG,kBAAkB,KAAK,IAC/B,KAAK,GAAG,kBAAkB,KAAK,IAC/B,KAAK,eACP,EAEO,CACT,CAzD4B,GAmExB,iBAAgC,WAElC,SAAS,IACP,IAAI,EAAQ,KAEZ,KAAK,wBAA0B,SAAU,EAAG,GAG1C,IAGI,EAGA,EACA,EAPA,EAAa,EAAE,SAAS,WAAW,EAAE,UACrC,EAAY,EACZ,EAAY,GAGhB,EAAK,EAAE,MAAM,OAIb,IAAK,EAAI,EAAG,EAAI,EAAI,KAClB,EAAO,EAAE,MAAM,IAEN,UAAU,IACjB,EAAU,KAAK,GAMnB,IAAK,EAAI,EAAG,EAAI,EAAI,IAAK,CACvB,IAAI,EAAe,EACnB,EAAO,EAAE,MAAM,GAEf,IAAK,IAAI,EAAI,EAAG,EAAI,EAAU,OAAQ,IAAK,CACzC,EAAW,EAAU,GAErB,IAAI,EAAU,EAAK,OAAO,IAAI,EAAS,QACvC,EAAe,KAAK,IAAI,GAAe,MAAQ,GAAW,EAC5D,CAEA,EAAY,KAAK,IAAI,EAAW,EAClC,CAaA,OAPI,EAAU,OAAS,IAGrB,EAAY,GAGJ,EAAa,EART,CAUhB,EAEA,KAAK,wBAA0B,SAAU,GAOvC,GAA2B,IAAvB,EAAE,UAAU,OAId,OAFA,EAAE,iBAAmB,UACrB,EAAE,cAAgB,KAIpB,EAAE,aAAe,IACjB,EAAE,iBAAmB,KAErB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAE,UAAU,OAAQ,IAAK,CAC3C,IAAI,EAAe,EAAM,wBAAwB,EAAG,EAAE,UAAU,IAE3D,EAAE,mBACL,EAAE,iBAAmB,EAAE,UAAU,GACjC,EAAE,aAAe,EACjB,EAAE,QAAU,EACZ,EAAE,UAAY,EACd,EAAE,UAAY,GAGhB,EAAE,YACF,EAAE,WAAa,EAEX,EAAe,EAAE,UACnB,EAAE,iBAAmB,EAAE,UAAU,GACjC,EAAE,QAAU,EAEhB,CAGA,EAAE,aAAe,EAAE,UAAY,EAAE,SACnC,EAEA,KAAK,WAAa,SAAU,EAAG,GAC7B,gBAAgB,EAAO,GACnB,EAAE,IAAI,gBAAgB,EAAE,GAAG,MAAO,GAClC,EAAE,IAAI,gBAAgB,EAAE,GAAG,MAAO,GAClC,EAAE,IAAI,gBAAgB,EAAE,GAAG,MAAO,GAKtC,IAHA,IACI,EAAI,EADJ,EAAK,CAAC,EAAE,GAAI,EAAE,GAAI,EAAE,IAGf,EAAI,EAAG,EAAI,EAAG,IAErB,EAAK,GAAI,EAAI,GAAK,IADlB,EAAK,EAAG,KAEI,IACZ,EAAG,oBAAoB,GACvB,EAAG,oBAAoB,GAE3B,EAEA,KAAK,SAAW,SAAU,EAAU,EAAO,EAAG,GAG5C,GAAK,EAAL,CAOA,IAAI,EACA,EAAc,GAElB,IAAK,EAAI,EAAG,EAAI,EAAE,UAAU,OAAQ,IAClC,EAAY,KAAK,EAAE,UAAU,IAI/B,IAAK,EAAI,EAAE,MAAM,OAAS,EAAG,GAAK,EAAG,IAC/B,EAAE,MAAM,IAAM,EAAE,MAAM,GAAG,UAAU,IACrC,EAAM,WAAW,EAAE,MAAM,GAAI,GAKjC,IAAK,EAAI,EAAE,MAAM,OAAS,EAAG,GAAK,EAAG,IACnC,EAAE,MAAM,GAAG,cAAc,EAAG,GAM9B,IAHA,EAAM,aAAa,EAAG,GAGjB,EAAI,EAAG,EAAI,EAAY,OAAQ,IAClC,EAAM,wBAAwB,EAAY,GAzB5C,MAHE,EAAM,aAAa,EAAG,EA8B1B,EAEA,KAAK,gBAAkB,SAAU,GAI/B,IAFA,IAAI,EAAQ,EAAS,GAEZ,EAAI,EAAG,EAAI,EAAS,OAAQ,IAC/B,EAAS,GAAG,aAAe,EAAM,eACnC,EAAQ,EAAS,IAIrB,OAAO,CACT,EAEA,KAAK,OAAS,SAAU,EAAU,GAEhC,IAAI,GADJ,EAAW,EAAS,SACM,WAE1B,IAAK,IAAI,KAAQ,EACF,aAAT,GAAqB,EAAS,gBAAgB,GAYpD,IALA,IAAI,EAAW,GACX,EAAQ,GAER,GAPJ,EAAW,YAAY,cAAc,IAOJ,aAAa,YAErC,EAAI,EAAG,EAAI,EAAkB,MAAO,IAAK,CAChD,IAAI,GAAI,IAAI,MAAM,SAAU,oBAAoB,EAAmB,GAC/D,EAAS,IAAI,OAAO,EAAG,GAC3B,EAAS,KAAK,EAChB,CAGA,IA6BI,EA7BA,EAAY,EAAS,WAEzB,GAAkB,OAAd,EACF,IAAK,IAAI,EAAK,EAAG,EAAK,EAAU,MAAO,GAAM,EAAG,CAC9C,IAAI,EAAI,EAAU,KAAK,GACnB,EAAI,EAAU,KAAK,EAAK,GACxB,EAAI,EAAU,KAAK,EAAK,GACxB,EAAW,IAAI,SAAS,EAAS,GAAI,EAAS,GAAI,EAAS,GAAI,EAAG,EAAG,GACzE,EAAM,KAAK,EACb,MAEA,IAAK,IAAI,EAAM,EAAG,EAAM,EAAkB,MAAO,GAAO,EAAG,CACzD,IAAI,EAAK,EAEL,EAAK,EAAM,EAEX,EAAK,EAAM,EAEX,EAAY,IAAI,SAAS,EAAS,GAAK,EAAS,GAAK,EAAS,GAAK,EAAI,EAAI,GAE/E,EAAM,KAAK,EACb,CAIF,IAAK,IAAI,EAAM,EAAG,EAAK,EAAS,OAAQ,EAAM,EAAI,IAChD,EAAM,wBAAwB,EAAS,IAMzC,IAFA,IAAI,EAAI,EAAM,OAAS,EAEhB,KAAK,CAGV,KAFA,EAAa,EAAM,gBAAgB,IAElB,CACf,QAAQ,IAAI,0CACZ,KACF,CAAO,GAAI,EAAM,QAAU,EACzB,MAEA,EAAM,SAAS,EAAU,EAAO,EAAY,EAAW,iBAE3D,CAOA,IAJA,IAAI,EAAqB,IAAI,MAAM,eAC/B,EAAW,GACX,EAAQ,GAEH,EAAM,EAAG,EAAM,EAAS,OAAQ,IAAO,CAC9C,IAAI,EAAU,EAAS,GAAK,SAC5B,EAAS,KAAK,EAAQ,EAAG,EAAQ,EAAG,EAAQ,EAC9C,CAGA,IAAK,IAAI,EAAM,EAAG,EAAM,EAAM,OAAQ,IAAO,CAC3C,IAAI,EAAO,EAAM,GAEb,EAAM,EAAS,QAAQ,EAAK,IAE5B,EAAM,EAAS,QAAQ,EAAK,IAE5B,EAAM,EAAS,QAAQ,EAAK,IAEhC,EAAM,KAAK,EAAK,EAAK,EACvB,CAKA,OAFA,EAAmB,aAAa,WAAY,IAAI,MAAM,uBAAuB,EAAU,IACvF,EAAmB,SAAS,GACrB,CACT,CACF,CAeA,OAbc,EAAiB,UAEvB,aAAe,SAAsB,EAAG,GAG9C,IAFA,QAAQ,OAA0B,IAAnB,EAAE,MAAM,QAEhB,EAAE,UAAU,QAAQ,CAEzB,gBADQ,EAAE,UAAU,MACF,UAAW,EAC/B,CAEA,gBAAgB,EAAU,EAC5B,EAEO,CACT,CArRoC,GAuRhC,sBAAwB,SAA+B,EAAK,GAE9D,OADe,IAAI,kBACH,OAAO,EAAK,KAAK,MAAM,GACzC,EAEA,SAAS,WAAW,GAClB,IAAI,EAAW,EAAM,SACjB,EAAkB,EAAM,SACxB,OAA+B,IAApB,EAA6B,IAAO,EAC/C,EAAiB,EAAM,QACvB,OAA6B,IAAnB,GAAmC,EAC7C,EAAwB,EAAM,oBAC9B,OAAgD,IAA1B,GAA2C,EACjE,EAAQ,MAAM,OAAO,MACrB,EAAU,MAAM,SAEhB,EAAY,MAAM,WAClB,EAAkB,EAAU,GAC5B,EAAqB,EAAU,GAE/B,EAAa,MAAM,WACnB,EAAgB,EAAW,GAC3B,EAAmB,EAAW,GAG9B,EAAa,SAAoB,GACnC,OAAO,EAAW,IAAM,cAAc,EACxC,EAiEA,OA9DA,MAAM,WAAU,WACd,IAAK,EAAM,UAAY,EAIrB,OAHA,OAAiB,GACjB,OAAmB,QACnB,EAAQ,aAAU,GAKpB,IAAI,EAAiB,mBAAmB,EAAM,SAE9C,GAAI,EAAgB,CAClB,GAAI,EAAW,KAAoB,EAAQ,QAAS,OACpD,EAAmB,GAEnB,IAAI,EAAQ,EAAe,KAAI,SAAU,GACvC,OAAO,sBAAsB,EAAG,EAAM,QACxC,IAIA,OAFA,EAAiB,QACjB,EAAQ,QAAU,EAAW,GAE/B,CAGA,IAAI,EAAS,UAAU,EAAM,SAC7B,GAAI,EAAW,KAAY,EAAQ,QAAnC,CACA,EAAmB,GACnB,EAAQ,QAAU,EAAW,GAE7B,IAAI,EAAO,EAAO,KAAI,SAAU,GAC9B,OAAO,sBAAsB,EAAG,EAAM,QACxC,IAEI,EAAW,EAAK,QAAO,SAAU,EAAG,GACtC,OAAO,EAAI,oBAAoB,EACjC,GAAG,GAEH,GAAI,EAAW,EACb,EAAiB,OACZ,CACL,IAAI,EAAO,EAAW,EAClB,EAAW,EAAK,KAAI,SAAU,GAChC,OAAO,sBAAsB,EAAG,oBAAoB,GAAK,EAC3D,IAAG,QAAO,SAAU,GAClB,OAAO,CACT,IACA,EAAiB,EACnB,CAtBkD,CAuBpD,GAAG,CAAC,EAAU,EAAU,IAExB,MAAM,WAAU,WACd,GAAK,EAIL,OAHA,EAAgB,KAAI,SAAU,GAC5B,OAAO,EAAS,SAAW,CAC7B,IACO,WACL,EAAgB,KAAI,SAAU,GAC5B,OAAO,EAAS,SAAU,CAC5B,GACF,CACF,GAAG,CAAC,EAAiB,IACD,MAAM,cAAc,QAAS,CAC/C,KAAM,sBACN,IAAK,GACJ,EAAU,GAAW,GAAiB,EAAc,KAAI,SAAU,EAAK,GACxE,OAAoB,MAAM,cAAc,gBAAiB,CACvD,IAAK,EAAI,KACT,IAAK,GAET,IACF,CAEA,SAAS,eAAe,GACtB,IAAI,EAAU,EAAM,QAChB,EAAU,EAAM,QAChB,EAAY,EAAM,UAClB,EAAW,EAAM,SACrB,OAAoB,MAAM,cAAc,QAAS,CAC/C,KAAM,yBACQ,MAAM,cAAc,GAAG,YAAa,CAClD,QAAS,EACT,OAAQ,EACR,SAAU,EAAU,SAAU,GAC5B,OAAO,EAAQ,EAAE,aACnB,OAAI,GACH,GACL,CAEA,IAAI,gBAAkB,GAElB,SAAW,GAEf,SAAS,0BAA0B,GACjC,IAAI,EAAU,EAAM,QAChB,EAAU,EAAM,QAChB,EAAY,EAAM,UAClB,EAAkB,EAAM,UACxB,EAAW,EAAM,SACjB,EAAK,MAAM,UAAS,SAAU,GAChC,OAAO,EAAM,EACf,IACI,EAAQ,MAAM,UAAS,SAAU,GACnC,OAAO,EAAM,KACf,IAGI,EADkB,iBACO,OAEzB,EAAS,YACT,EAAQ,MAAM,OAAO,MACrB,EAAO,MAAM,SAAQ,WACvB,MAAO,CACL,MAAO,IAAI,MAAM,QACjB,KAAM,EAEV,GAAG,IACC,EAAe,MAAM,SACrB,EAAY,GAAmB,EAAO,UACtC,IAAiB,KAAa,EAE9B,EAAkB,MAAM,aAAY,WACtC,GAAK,EAAM,QAAX,CACA,EAAU,cAAe,EACzB,IAAI,EAAa,EAAU,gBAAgB,EAAM,SAAS,GAE1D,OADA,EAAU,cAAe,EAClB,EAAW,OAAS,EAAI,EAAW,QAAK,CAJX,CAKtC,GAAG,CAAC,IAyDJ,OAvDA,gBAAgB,IAAI,WAClB,GAAK,EAAM,SAAY,EAAvB,CACA,IAAI,EAAQ,IAER,GACG,EAAa,SACZ,GAAS,IAGf,EAAa,QAAU,GAEnB,EAAa,UACf,EAAa,aAAU,EACnB,GAAW,IAZwB,CAe7C,IAEA,MAAM,WAAU,WACT,EAAM,SACX,EAAM,QAAQ,UAAS,SAAU,GAC/B,IAAI,EAAO,EACP,EAAK,QAAQ,iBAAiB,EAAM,GAC1C,GACF,GAAG,IACH,MAAM,WAAU,WACd,IAAI,EAAa,WACf,EAAU,IAAI,GAAG,EAAG,EAAK,OACzB,EAAK,KAAO,EAAM,WACpB,EAEI,EAAW,WACb,GAAK,GAAY,EAAM,QAAvB,CACA,IAAI,EAAS,EAAU,IAAI,GAAG,EAAG,IAAI,MAAM,SACvC,EAAO,EAAK,MAAM,WAAW,GAC7B,EAAW,EAAM,YAAc,EAAK,KACxC,KAAI,EAAO,UAAY,EAAW,iBAElC,GAAI,EACE,EAAa,SAAS,EAAQ,EAAa,aAC1C,CACL,IAAI,EAAQ,IACR,GAAO,EAAQ,EACrB,CAXsC,CAYxC,EAEI,EAAU,EAAO,OAAS,aAAe,YACzC,EAAQ,EAAO,OAAS,WAAa,UAGzC,OAFA,EAAG,WAAW,iBAAiB,EAAS,GACxC,EAAG,WAAW,iBAAiB,EAAO,GAC/B,WACL,EAAG,WAAW,oBAAoB,EAAS,GAC3C,EAAG,WAAW,oBAAoB,EAAO,EAC3C,CACF,GAAG,CAAC,EAAc,EAAW,EAAO,EAAO,OAAQ,EAAM,EAAiB,EAAG,WAAY,IACrE,MAAM,cAAc,QAAS,CAC/C,KAAM,wBACN,IAAK,GACJ,EACL,CAKA,SAAS,aAAa,GAIpB,OAHsB,iBACO,OAElB,GAAwB,MAAM,cAAc,eAAgB,GACnD,MAAM,cAAc,0BAA2B,EACrE,CAEA,IAAI,gBAA+B,MAAM,cAAc,CAAC,GACpD,YAAc,WAChB,OAAO,MAAM,WAAW,gBAC1B,EACI,iBAAmB,SAA0B,GAC/C,IAGI,EAHY,MAAM,UAAS,WAC7B,OAAO,IAAI,MAAM,KACnB,IACyB,GAErB,EAAW,cACX,EAAQ,MAAM,SAAQ,WACxB,MAAO,EACT,GAAG,IAEC,EAAa,MAAM,SAAS,EAAc,OAAI,GAC9C,EAAc,EAAW,GACzB,EAAiB,EAAW,GAE5B,EAAkB,MAAM,OAAO,GAE/B,EAAa,MAAM,SAAS,SAC5B,EAAY,EAAW,GACvB,EAAe,EAAW,GAE1B,EAAQ,MAAM,aAAY,SAAU,EAAM,GAE5C,GAAI,EAAM,MAAK,SAAU,GACvB,OAAO,EAAK,OAAS,CACvB,IACE,QAAQ,MAAM,iDAAmD,OAHnE,CAOqB,IAAjB,EAAM,QAAc,IACxB,IAAI,EAAO,CACT,KAAM,EACN,WAAY,GAAc,GAE5B,EAAM,KAAK,GAEX,EAAM,MAAK,SAAU,EAAG,GACtB,OAAO,EAAE,aAAe,EAAE,WAAa,EAAE,WAAa,EAAE,WAAa,EAAE,KAAK,cAAc,EAAE,KAC9F,GAXA,CAYF,GAAG,CAAC,IACA,EAAS,MAAM,aAAY,SAAU,GACvC,IAAI,EAAO,EAAM,MAAK,SAAU,GAC9B,OAAO,EAAK,OAAS,CACvB,IAEI,GACF,EAAM,OAAO,EAAM,QAAQ,GAAO,EAEtC,GAAG,CAAC,IACJ,MAAM,WAAU,WACd,IAAI,EAAiB,SAAwB,GACvC,YAAc,EAAE,SAAW,EAAE,SAEpB,OAAT,EAAE,MACA,EAAE,UACJ,EAAa,QACkB,OAAX,IAAhB,EAA0C,EAAM,OAAS,EAA4B,IAAhB,OAAkC,GAAgC,EAAc,EAAI,EAAM,QAAU,EAAM,UAEnL,EAAa,cACO,IAAhB,EAA2B,EAAe,GAAY,IAAgB,EAAM,OAAS,EAAG,OAAe,GAAgB,GAAgB,EAAc,GAAK,EAAM,SAGtK,EAAE,iBAEN,EAGA,OADA,SAAS,iBAAiB,UAAW,GAC9B,WACL,OAAO,SAAS,oBAAoB,UAAW,EACjD,CACF,GAAG,CAAC,EAAa,IACjB,MAAM,WAAU,gBACM,IAAhB,IAA2B,EAAgB,QAAU,EAC3D,GAAG,CAAC,IACJ,IAAI,EAAO,MAAM,aAAY,WAC3B,EAAa,SAEQ,IAAjB,EAAM,OACR,GAAe,SAAU,GACvB,YAAkB,IAAX,EAAuB,OAAI,CACpC,IAEA,GAAe,SAAU,GACvB,YAAkB,IAAX,GAAwB,EAAS,GAAK,EAAM,OAAS,CAC9D,GAEJ,GAAG,CAAC,IACA,EAAO,MAAM,aAAY,WAC3B,EAAa,QAEQ,IAAjB,EAAM,OACR,GAAe,SAAU,GACvB,YAAkB,IAAX,EAAuB,OAAI,CACpC,IAEA,GAAe,SAAU,GACvB,YAAkB,IAAX,GAAwB,EAAS,EAAI,EAAM,QAAU,EAAM,OAAS,CAC7E,GAEJ,GAAG,CAAC,IACA,EAAO,MAAM,aAAY,WAC3B,OAAe,EACjB,GAAG,IACC,EAAO,MAAM,aAAY,WAC3B,GAAe,SAAU,GACvB,YAAkB,IAAX,EAAuB,EAAgB,QAAU,CAC1D,GACF,GAAG,IACH,MAAO,CACL,MAAO,EACP,gBAA4B,IAAhB,EAA4B,EAAM,QAAe,EAC7D,MAAO,EACP,OAAQ,EACR,KAAM,EACN,KAAM,EACN,KAAM,EACN,KAAM,EACN,YAAa,EACb,eAAgB,EAChB,SAAU,EACV,UAAW,EAEf,EAEA,SAAS,eACP,IAAI,EAAW,cAEX,EAAY,MAAM,WAClB,EAAO,EAAU,KACjB,EAAK,EAAU,GAEf,EAAa,MAAM,QAAO,GAC1B,EAAgC,IAAf,OAAO,MACxB,EAA8B,IAAf,OAAO,MACtB,EAAiC,GAAhB,OAAO,OACxB,EAAQ,MAAM,QAAO,GA+BzB,OA9BA,QAAQ,CACN,QAAS,SAAiB,GACxB,IAAI,EAAI,EAAK,EACT,EAAQ,EAAK,MACjB,EAAM,SAAU,EAChB,IAAI,EAAa,KAAK,IAAI,EAAM,QAAS,EAAK,MAAQ,EAAM,SAAW,EACnE,EAAa,EAAM,QAAU,EAE5B,GAAe,IACpB,EAAM,SAAU,EAChB,EAAW,SAAU,EACrB,EAAE,iBACF,EAAE,kBACF,EAAE,2BACJ,EACA,OAAQ,SAAgB,GACtB,IAAI,EAAQ,EAAM,MACb,EAAM,UAAW,EAAW,SAE7B,KAAK,IAAI,EAAM,GAAK,IACtB,EAAW,SAAU,EAEjB,EAAM,EAAI,EACZ,EAAS,OAET,EAAS,OAGf,GACC,EAAG,WAAY,CAAC,OAAO,MAAO,OAAO,OAAQ,EAAS,KAAM,EAAS,OACjE,IACT,CAEA,SAAS,SACP,OAAoB,MAAM,cAAc,QAAS,CAC/C,KAAM,UACQ,MAAM,cAAc,eAAgB,CAClD,UAAqB,GAAV,KAAK,KACD,MAAM,cAAc,aAAc,CACjD,UAAqB,GAAV,KAAK,KAEpB,CAEA,SAAS,kCAAkC,EAAG,GAAkB,IAAI,EAAuB,oBAAX,QAA0B,EAAE,OAAO,WAAa,EAAE,cAAe,GAAI,EAAI,OAAQ,EAAK,EAAG,KAAK,IAAI,KAAK,KAAK,GAAK,GAAI,MAAM,QAAQ,KAAO,EAAK,8BAA8B,KAAO,GAAkB,GAAyB,iBAAb,EAAE,OAAqB,CAAM,IAAI,EAAI,GAAI,IAAI,EAAI,EAAG,OAAO,WAAc,OAAI,GAAK,EAAE,OAAe,CAAE,MAAM,GAAe,CAAE,MAAM,EAAO,MAAO,EAAE,KAAQ,CAAG,CAAE,MAAM,IAAI,UAAU,wIAA0I,CAE/lB,SAAS,8BAA8B,EAAG,GAAU,GAAK,EAAL,CAAgB,GAAiB,iBAAN,EAAgB,OAAO,oBAAoB,EAAG,GAAS,IAAI,EAAI,OAAO,UAAU,SAAS,KAAK,GAAG,MAAM,GAAI,GAAiE,MAAnD,WAAN,GAAkB,EAAE,cAAa,EAAI,EAAE,YAAY,MAAgB,QAAN,GAAqB,QAAN,EAAoB,MAAM,KAAK,GAAc,cAAN,GAAqB,2CAA2C,KAAK,GAAW,oBAAoB,EAAG,QAA3G,CAA/O,CAAmW,CAEra,SAAS,oBAAoB,EAAK,IAAkB,MAAP,GAAe,EAAM,EAAI,UAAQ,EAAM,EAAI,QAAQ,IAAK,IAAI,EAAI,EAAG,EAAO,IAAI,MAAM,GAAM,EAAI,EAAK,IAAO,EAAK,GAAK,EAAI,GAAM,OAAO,CAAM,CACxL,SAAS,YAAY,GACnB,IAAI,EAAiB,EAAM,QACvB,OAA6B,IAAnB,GAAmC,EAC7C,EAAc,EAAM,YAGpB,EADY,MAAM,WACA,MAElB,EAAQ,MAAM,OAAO,MACrB,EAAW,cACX,EAAW,cACX,EAAgB,MAAM,OAAO,IAC7B,EAAiB,MAAM,OAAO,IA8DlC,OA7DA,gBAAgB,IAAO,WACrB,IAAI,EAAc,GAClB,EAAM,UAAS,SAAU,GACnB,aAAe,MAAM,SAAW,GAAe,aAAe,MAAM,eACtE,EAAY,KAAK,EAErB,IAiBA,IAhBA,IAAI,GAAU,EAEV,EAAQ,WACV,IAAI,EAAQ,EAAa,GAGzB,IAAK,EAAe,QAAQ,MAAK,SAAU,GACzC,OAAO,EAAI,SAAS,OAAS,EAAM,IACrC,IAAI,CACF,IAAI,EAAW,EAAM,QACrB,EAAS,SAAS,KAAO,EAAM,KAC/B,EAAe,QAAQ,KAAK,GAC5B,GAAU,CACZ,CACF,EAES,EAAK,EAAG,EAAe,EAAa,EAAK,EAAa,OAAQ,IACrE,IAgBF,IAZA,IAYgF,EAZ5E,EAAS,WACX,IAAI,EAAQ,EAAM,MAEb,EAAY,MAAK,SAAU,GAC9B,OAAO,EAAI,OAAS,EAAM,SAAS,IACrC,MACE,EAAe,QAAQ,OAAO,EAAe,QAAQ,QAAQ,GAAQ,GACrE,EAAM,UACN,GAAU,EAEd,EAES,EAAY,kCAAkC,EAAe,WAAmB,EAAQ,KAAa,MAC5G,IAGE,IACF,IACA,EAAc,QAAU,EAE5B,IACA,gBAAgB,IAAI,SAAU,GAC5B,IAAI,EAAS,EAAK,OACb,GAAY,EAAM,UACvB,EAAM,QAAQ,SAAS,KAAK,EAAO,UACnC,EAAe,QAAQ,SAAQ,SAAU,GACvC,IAAI,EAAe,EAAc,QAAQ,MAAK,SAAU,GACtD,OAAO,EAAG,OAAS,EAAM,SAAS,IACpC,IACK,GACL,EAAM,YAAY,KAAK,EAAa,YACtC,IACF,IACoB,MAAM,cAAc,MAAM,SAAU,KAAM,MAAM,aAA2B,MAAM,cAAc,QAAS,CAC1H,KAAM,eACN,IAAK,GACJ,EAAe,QAAQ,KAAI,SAAU,GACtC,OAAoB,MAAM,cAAc,YAAa,CACnD,OAAQ,EACR,IAAK,EAAM,MAEf,KAAK,EAAS,UAChB,CAEA,SAAS,SAAS,GAChB,IAAI,EAAW,EAAM,SACjB,EAAqB,EAAM,YAC3B,OAAqC,IAAvB,GAAuC,EACrD,EAAqB,EAAM,YAC3B,OAAqC,IAAvB,GAAuC,EACrD,EAAqB,EAAM,YAC3B,OAAqC,IAAvB,GAAuC,EAGrD,EADY,MAAM,WACC,OAEnB,EAAQ,iBAAiB,GACzB,EAAW,EAAM,SAKjB,EAHY,MAAM,UAAS,WAC7B,OAAO,EAAO,OAChB,IACyB,GAqBzB,OAnBA,MAAM,UAAS,SAAU,GACvB,IAAI,EAAK,EAAK,GACV,EAAO,EACX,EAAS,SAAS,IAAI,EAAG,EAAG,GAC5B,EAAS,WAAW,KAAK,EAAK,YAC9B,EAAS,KAAO,EAAK,KACrB,EAAS,IAAM,EAAK,IACpB,EAAS,OAAS,EAAK,OACvB,EAAS,IAAM,EAAK,IACpB,EAAS,yBAGT,EAAS,SAAS,IAAI,EAAG,EAAG,GAC5B,EAAG,WAAY,EACf,EAAG,aACH,EAAG,OAAO,EAAU,GACpB,EAAS,SAAS,KAAK,EAAO,UAC9B,EAAS,mBAAkB,EAC7B,GAAG,KACiB,MAAM,cAAc,gBAAgB,SAAU,CAChE,MAAO,GACO,MAAM,cAAc,aAAc,MAAO,GAAe,MAAM,aAA2B,MAAM,cAAc,OAAQ,MAAO,GAAW,GAA4B,MAAM,cAAc,YAAa,MAAO,EAC7N,CAEA,IAAI,QAAU,IAAI,MAAM,WAEpB,gBAA+B,WACjC,SAAS,EAAgB,EAAS,QAChB,IAAZ,IACF,EAAU,QAGM,IAAd,IACF,EAAY,IAGd,KAAK,SAAW,IAAI,aAAa,GACjC,KAAK,UAAY,EACjB,KAAK,QAAU,CACjB,CAEA,IAAI,EAAS,EAAgB,UA6E7B,OA3EA,EAAO,WAAa,WAClB,OAAO,KAAK,IAAI,KAAK,SAAS,GAAI,GAAK,KAAK,IAAI,KAAK,SAAS,GAAI,GAAK,KAAK,IAAI,KAAK,SAAS,GAAI,GAAK,KAAK,IAAI,KAAK,SAAS,GAAI,EACpI,EAIA,EAAO,gBAAkB,SAAyB,EAAI,EAAQ,GAE5D,IAAI,EAAM,EAAG,IAAI,GAEjB,GAAI,GAAO,OAAU,KAAK,aAAe,KACvC,EAAG,KAAK,OADV,CAKA,IAAI,EAAK,QAEL,EAAM,GAER,EAAG,GAAK,EAAO,EACf,EAAG,GAAK,EAAO,EACf,EAAG,GAAK,EAAO,EACf,EAAG,GAAK,EAAO,GAEf,EAAG,KAAK,GAGV,KAAK,SAAS,MAAQ,KAAK,WAAa,EAAG,EAAI,EAAG,GAAK,KAAK,QAAU,KAAK,SAAS,IAAM,EAC1F,KAAK,SAAS,MAAQ,KAAK,WAAa,EAAG,EAAI,EAAG,GAAK,KAAK,QAAU,KAAK,SAAS,IAAM,EAC1F,KAAK,SAAS,MAAQ,KAAK,WAAa,EAAG,EAAI,EAAG,GAAK,KAAK,QAAU,KAAK,SAAS,IAAM,EAC1F,KAAK,SAAS,MAAQ,KAAK,WAAa,EAAG,EAAI,EAAG,GAAK,KAAK,QAAU,KAAK,SAAS,IAAM,EAC1F,EAAG,GAAK,KAAK,SAAS,GAAK,EAC3B,EAAG,GAAK,KAAK,SAAS,GAAK,EAC3B,EAAG,GAAK,KAAK,SAAS,GAAK,EAC3B,EAAG,GAAK,KAAK,SAAS,GAAK,EAC3B,EAAG,WAtBH,CAuBF,EAGA,EAAO,eAAiB,SAAwB,EAAI,EAAQ,GAE1D,IAAI,EAAM,EAAG,IAAI,GAEjB,KAAI,GAAO,OAAU,KAAK,aAAe,MAAzC,CAKA,IAAI,EAAK,QAEL,EAAM,GAER,EAAG,GAAK,EAAO,EACf,EAAG,GAAK,EAAO,EACf,EAAG,GAAK,EAAO,EACf,EAAG,GAAK,EAAO,GAEf,EAAG,KAAK,GAGV,IAAI,EAAS,KAAK,QAAU,KAAK,QAAU,EACvC,EAAK,EAAI,KAAK,QAAU,EACxB,EAAQ,EAAK,EAUjB,OATA,KAAK,SAAS,IAAM,KAAK,SAAS,IAAM,EAAG,EAAI,EAAG,GAAK,GAAU,EACjE,KAAK,SAAS,IAAM,KAAK,SAAS,IAAM,EAAG,EAAI,EAAG,GAAK,GAAU,EACjE,KAAK,SAAS,IAAM,KAAK,SAAS,IAAM,EAAG,EAAI,EAAG,GAAK,GAAU,EACjE,KAAK,SAAS,IAAM,KAAK,SAAS,IAAM,EAAG,EAAI,EAAG,GAAK,GAAU,EACjE,EAAG,GAAK,KAAK,SAAS,GAAK,EAC3B,EAAG,GAAK,KAAK,SAAS,GAAK,EAC3B,EAAG,GAAK,KAAK,SAAS,GAAK,EAC3B,EAAG,GAAK,KAAK,SAAS,GAAK,EAC3B,EAAG,YACI,CA1BP,CAFE,EAAG,KAAK,EA6BZ,EAEO,CACT,CA7FmC,GAyGnC,SAAS,IAAI,GACX,IAAI,EAAW,EAAM,SACjB,EAAM,EAAM,IACZ,EAAc,EAAM,KACpB,OAAuB,IAAhB,GAAiC,EACxC,EAAW,EAAM,SACjB,EAAe,EAAM,MACrB,OAAyB,IAAjB,EAA0B,EAAI,EACtC,EAAc,EAAM,YAGpB,EADa,YACS,SAGtB,EAAQ,MAAM,OAAO,MAGrB,EADY,MAAM,SAAS,IAAI,MAAM,SACf,GAGtB,EADa,MAAM,UAAS,IAAI,MAAM,SAAU,UAAU,IACnC,GAGvB,EADa,MAAM,SAAS,IAAI,MAAM,YACd,GAGxB,EADa,MAAM,SAAS,IAAI,MAAM,YACd,GAGxB,EADa,MAAM,SAAS,IAAI,MAAM,YAChB,GAGtB,EADa,MAAM,SAAS,IAAI,MAAM,MAAM,EAAG,EAAG,EAAG,QAC9B,GAGvB,EADa,MAAM,SAAS,IAAI,MAAM,MAAM,EAAG,EAAG,EAAG,QAC9B,GAGvB,EADa,MAAM,SAAS,IAAI,MAAM,YAClB,GAGpB,EADa,MAAM,SAAS,IAAI,MAAM,YAClB,GAGpB,EADc,MAAM,SAAS,IAAI,MAAM,SACrB,GAElB,EAAa,QAAQ,WAAU,WACjC,MAAO,CACL,OAAQ,CAAC,EAAG,GACZ,OAAQ,QAAQ,OAAO,MAE3B,IACI,EAAS,EAAW,GACpB,EAAM,EAAW,GAEjB,EAAK,MAAM,SAAQ,WACrB,OAAO,IAAI,gBAAgB,GAAI,IACjC,GAAG,IA+EH,OA9EA,MAAM,UAAS,SAAU,EAAM,GAC7B,IAAI,EAAS,EAAK,OACd,EAAQ,EAAK,MACjB,GAAK,EAAM,QAAX,CACA,IAAI,EAAQ,EAAI,KAAK,IAjDf,KAiDsB,GAExB,EAAM,EAAO,OAAO,MACxB,EAAU,UAAU,GACpB,EAAU,GAAK,EAAI,IAAM,EACzB,EAAU,GAAK,EAAI,IAAM,EACzB,EAAU,KAAK,EAAW,GAE1B,UAAU,EAAW,EAAQ,EAAU,GACvC,EAAM,QAAQ,SAAS,IAAI,EAAI,EAAG,EAAI,GAAI,GAE1C,EAAO,KAAK,GACZ,EAAO,KAAK,EAAO,YACnB,EAAU,kBAAkB,EAAO,YACnC,IAAI,EAAa,EAAO,SAAS,EAAO,UAAU,GAAK,GAAS,MAC5D,GAAc,EAAU,EAAI,EAAU,IAAM,GAAS,MAIzD,GAFgB,EAAQ,EAIjB,CAEL,EAAO,KAAK,GACZ,EAAO,EAAI,EACX,EAAO,EAAI,EACX,EAAO,YACP,EAAO,KAAK,EAAO,YACnB,EAAO,EAAI,EACX,EAAO,EAAI,EACX,EAAO,YACP,IAAI,EAAQ,EAAO,QAAQ,GAE3B,GAAI,EAAQ,EAAO,CACjB,IAAI,EAAO,EAAQ,EACnB,EAAW,KAAK,GAChB,EAAW,cAAc,EAAO,WAAY,GAEvC,IACH,EAAW,EAAI,EACf,EAAW,EAAI,EACf,EAAW,YAEf,MAEE,EAAa,EACb,EAAa,EAGf,EAAG,eAAe,EAAY,EAAY,EAC5C,MA9BE,EAAW,KAAK,EAAO,YAiCzB,IAAI,EAAU,EAAS,MAAM,SAAW,EAAI,EAAI,EAC5C,EAAW,GAAe,KAAK,IAAI,EAAU,SAAU,KAC3D,GAAc,KAAK,IAAwB,GAApB,EAAM,aAAoB,EAAU,GAAM,EACjE,GAAc,KAAK,IAAwB,GAApB,EAAM,YAAmB,IAAM,EAAU,GAAM,EAEtE,IACI,EAAU,GACV,EAAQ,MAAM,UAAU,MAFZ,IAEmB,GAAwB,GAAU,GACjE,EAAQ,MAAM,UAAU,MAHZ,IAGmB,GAAwB,GAAU,GACrE,EAAI,CACF,OAAQ,CAAC,EAAO,KAGlB,EAAM,QAAQ,SAAS,gBAAgB,GAGvC,EAAM,QAAQ,WAAW,KAAK,EAAO,YAErC,EAAS,KAAK,EAAO,YACrB,EAAU,kBAAkB,EAAO,WAzET,CA0E5B,IACoB,MAAM,cAAc,QAAS,CAC/C,KAAM,eACN,IAAK,GACJ,EACL,CAEA,SAAS,UAAU,GACjB,IAAI,EAAM,EAAM,IACZ,EAAW,EAAM,SACjB,EAAU,EAAM,QAChB,EAAW,EAAM,SACjB,EAAW,cAEX,EAAY,MAAM,WAClB,EAAO,EAAU,KACjB,EAAK,EAAU,GAGf,EADkB,iBACO,OAGzB,EADa,YACU,UAEvB,EAAQ,MAAM,OAAO,MACrB,EAAgC,IAAd,EAAK,OACvB,EAA+B,GAAb,EAAK,MACvB,EAAQ,MAAM,QAAO,GAwCzB,OAvCA,QAAQ,CACN,QAAS,SAAiB,GACxB,IAAI,EAAI,EAAK,GACb,EAAM,SAAU,EACX,EAAM,SAAY,EAAO,QAAW,KACrB,EAAU,gBAAgB,EAAM,SAAS,GAE3C,OAAS,IACzB,EAAM,SAAU,EAChB,EAAE,mBAEN,EACA,OAAQ,SAAgB,GACtB,IAAI,EAAQ,EAAM,MACb,EAAM,SACX,EAAI,CACF,IAAK,CAAW,KAAV,EAAM,EAAY,EAAW,GAAgB,MAAV,EAAM,EAAY,GAAY,EAAM,EAAI,EAAI,IAAO,IAAM,IAEtG,EACA,MAAO,SAAe,GACpB,IAAI,EAAQ,EAAM,MACb,EAAM,UAEP,EAAM,EAAI,EACZ,EAAS,OACA,KAAK,IAAI,EAAM,GAAK,IACzB,EAAM,EAAI,EACZ,EAAS,OAET,EAAS,QAIb,EAAI,CACF,IAAK,CAAC,EAAG,EAAG,KAEd,EAAM,SAAU,EAClB,GACC,EAAG,WAAY,CAAC,EAAO,OAAQ,EAAS,EAAS,KAAM,EAAS,KAAM,EAAS,OAC9D,MAAM,cAAc,QAAS,CAC/C,IAAK,GACJ,EACL,CAKA,SAAS,SAAS,GAChB,IAAI,EAAW,EAAM,SACjB,EAAO,EAAM,KACb,EAAM,EAAM,IACZ,EAAmB,EAAM,iBACzB,EAAW,EAAM,SACjB,EAAW,cACX,EAAS,MAAM,UAAS,SAAU,GACpC,OAAO,EAAM,MACf,IACI,EAAO,EAAS,MAAM,MAAK,SAAU,GACvC,OAAO,EAAE,MAAQ,CACnB,IACI,EAAa,EAAO,EAAS,MAAM,QAAQ,QAAQ,EACnD,EAAU,EAAS,cAAgB,EAEnC,EAAa,QAAQ,WAAU,WACjC,MAAO,CACL,IAAK,CAAC,EAAG,EAAG,GACZ,OAAQ,CACN,KAAM,EACN,SAAU,GACV,QAAS,KAGf,IACI,EAAS,EAAW,GACpB,EAAM,EAAW,GAGjB,EAAkB,MAAM,SAsD5B,OArDA,MAAM,WAAU,WACd,GAAI,EAAgB,UAAY,EAAS,cACzC,EAAgB,QAAU,EAAS,iBAChB,IAAf,GAAJ,CACA,IAAI,EAAO,EACP,EAAM,IAEV,GAAI,EAAS,CAEX,GAA2B,OAAvB,EAAS,UAAoB,CAE/B,IACI,EADa,UAAU,EAAC,IAAM,GAAI,EAAM,GACrB,EAGnB,EADc,UAAU,CAAC,EAAK,GAAI,EAAM,GACnB,EAGrB,EADc,UAAU,EAAK,EAAM,GACnB,EAEhB,EAAkC,SAAvB,EAAS,UAAuB,EAAS,EAAI,EAAQ,EACpE,EAAO,IAAI,OAAO,CAChB,WAAW,IAEb,EAAI,CACF,IAAK,CAAC,EAAU,EAAG,KAErB,EAAO,IAAI,SACX,EAAO,IAAI,OAAO,CAChB,WAAW,GAEf,CAEA,EAAI,CACF,IAAK,CAAC,EAAG,EAAG,IAEhB,KAAO,CAEL,IACI,EADc,UAAU,EAAC,IAAM,GAAI,EAAiB,EAAX,GACpB,EAGrB,EADc,UAAU,CAAC,EAAK,GAAI,EAAiB,EAAX,GAClB,EAGtB,EADc,UAAU,EAAK,EAAM,GAClB,EAEjB,GAAoC,SAAvB,EAAS,UAAuB,EAAS,GAAW,EACrE,EAAI,CACF,IAAK,CAAC,EAAW,EAAG,IAExB,CAhDoC,CAiDtC,GAAG,CAAC,EAAS,EAAY,EAAQ,EAAU,EAAK,EAAK,EAAO,IAAK,EAAS,YAAa,EAAS,WAAY,EAAS,YACjG,MAAM,cAAc,QAAQ,SAAS,MAAO,CAC9D,SAAU,EAAO,IACjB,KAAM,YACQ,MAAM,cAAc,UAAW,CAC7C,IAAK,EACL,SAAU,EACV,QAAS,IAAY,GACpB,GACL,CAEA,SAAS,WAAW,GAClB,IAAI,EAAW,EAAM,SACjB,EAAiB,EAAM,QACvB,OAA6B,IAAnB,GAAmC,EAC7C,EAAe,EAAM,MACrB,OAAyB,IAAjB,GAAkC,EAC1C,EAAe,EAAM,MACrB,OAAyB,IAAjB,GAAkC,EAC1C,EAAe,EAAM,MACrB,OAAyB,IAAjB,GAAkC,EAC1C,EAAQ,MAAM,OAAO,MAGrB,EADY,MAAM,SAAS,IAAI,MAAM,OACpB,GAgBrB,OAdA,gBAAgB,IAAI,SAAU,GAC5B,IAAI,EAAS,EAAK,OACb,EAAM,UAEN,GAGH,EAAK,KAAK,EAAM,QAAQ,UACxB,EAAM,QAAQ,OAAO,EAAO,UACxB,IAAO,EAAM,QAAQ,SAAS,EAAI,EAAK,GACvC,IAAO,EAAM,QAAQ,SAAS,EAAI,EAAK,GACvC,IAAO,EAAM,QAAQ,SAAS,EAAI,EAAK,IAN3C,EAAM,QAAQ,SAAS,IAAI,EAAG,EAAG,GAQrC,IACoB,MAAM,cAAc,QAAS,CAC/C,KAAM,sBACN,IAAK,GACJ,EACL,CAGA,SAAS,kBAAkB,GACzB,IAAI,EAAW,EAAM,SACjB,EAAa,EAAM,WAOvB,OANA,EAAS,SAAU,EACnB,MAAM,WAAU,WACd,OAAO,WACL,GAAW,EACb,CACF,GAAG,IACI,IACT,CAGA,SAAS,YAAY,GACnB,IAAI,EAAiB,EAAM,eACvB,EAAW,EAAM,SACjB,EAAK,MAAM,UAAS,SAAU,GAEhC,OADS,EAAK,EAEhB,IACI,EAAS,MAAM,UAAS,SAAU,GAEpC,OADa,EAAM,MAErB,IAGI,EADe,cACS,SAExB,EAAW,MAAM,QAAO,GAExB,EAAY,MAAM,UAAS,GAC3B,EAAc,EAAU,GACxB,EAAiB,EAAU,GAE3B,EAAa,MAAM,UAAS,GAC5B,EAAU,EAAW,GACrB,EAAa,EAAW,GAyB5B,OAtBA,MAAM,WAAU,WACV,EACF,GAAe,GAIZ,EAAS,SAEZ,GAAW,EAEf,GAAG,CAAC,IAEJ,MAAM,iBAAgB,WACpB,GAAK,EAAL,CAEA,EAAG,QAAQ,EAAU,GACrB,IAAI,EAAmB,IAAI,MAAM,sBAAsB,KACtC,IAAI,MAAM,WAAW,IAAM,IAAQ,GACzC,OAAO,EAAI,GACtB,EAAiB,UACjB,GAAe,EAPK,CAQtB,GAAG,CAAC,EAAQ,EAAI,EAAU,EAAS,IAC5B,MAAM,aAA2B,MAAM,cAAc,QAAS,CACnE,KAAM,gBACQ,MAAM,cAAc,MAAM,SAAU,CAClD,SAAuB,MAAM,cAAc,kBAAmB,CAC5D,SAAU,EACV,WAAY,KAEb,IAAY,EACjB,CAWA,SAAS,KAAK,GACZ,IAAI,EAEA,EAAW,EAAM,SACjB,EAAO,EAAM,KACb,EAAa,EAAM,IACnB,OAAqB,IAAf,EAAwB,CAAC,EAAG,GAAK,EACvC,EAAc,EAAM,KACpB,OAAuB,IAAhB,GAAgC,EACvC,EAAc,EAAM,KACpB,OAAuB,IAAhB,GAAiC,EACxC,EAAQ,EAAM,MACd,EAAc,EAAM,YACpB,EAAa,EAAM,WACnB,EAAwB,EAAM,iBAC9B,OAA6C,IAA1B,GAA2C,EAC9D,EAAW,EAAM,SACjB,EAAW,cACX,GAA2D,OAA/C,EAAuB,EAAS,iBAAsB,EAAS,EAAqB,QAAU,EAG1G,EAAY,MAAM,UAAS,GAC3B,EAAc,EAAU,GACxB,EAAiB,EAAU,GAU3B,EARa,QAAQ,UAAU,CACjC,KAAM,EAAU,EAAI,EACpB,OAAQ,CACN,KAAM,EACN,SAAU,GACV,QAAS,OAGS,KAElB,EAAU,WAAW,GAazB,OAZA,MAAM,WAAU,WAEd,OADA,EAAS,MAAM,EAAM,GACd,WACL,OAAO,EAAS,OAAO,EACzB,CACF,GAAG,CAAC,EAAM,EAAS,MAAO,EAAS,OAAQ,IAC3C,MAAM,WAAU,WACd,IAAI,EAEA,GAAU,GAA2D,OAAhD,EAAwB,EAAS,iBAAsB,EAAS,EAAsB,QAAU,EAC3H,GAAG,CAAC,EAAS,WAAY,EAAU,IAE9B,EAMA,EACe,MAAM,cAAc,MAAM,SAAU,KAAM,MAAM,aAA2B,MAAM,cAAc,QAAS,CAC1H,KAAM,QAAU,GACF,MAAM,cAAc,IAAK,CACvC,IAAK,EACL,KAAM,EACN,SAzCa,EA0Cb,MAAO,EACP,YAAa,GACC,MAAM,cAAc,SAAU,CAC5C,SA7Ca,EA8Cb,KAAM,EACN,IAAK,EACL,iBAAkB,GACJ,MAAM,cAAc,WAAY,CAC9C,QAAS,GACK,MAAM,cAAc,MAAM,SAAU,CAClD,SAAU,MACT,GAAW,OAAe,EAAS,WAlBjB,KALC,MAAM,cAAc,YAAa,CACnD,eAAgB,GACf,EAsBP,CAEA,IAAI,YAAc,CAAC,OAAQ,SAAU,YACrC,SAAS,OAAO,GACd,IAAI,EAAO,EAAM,KACb,EAAgB,EAAM,OACtB,OAA2B,IAAlB,EAA2B,QAAU,EAC9C,EAAW,EAAM,SACjB,EAAO,uCAAgD,QAAE,EAAO,aAEhE,EAAK,MAAM,UAAS,SAAU,GAChC,OAAO,EAAG,EACZ,IAYA,OAAoB,MAAM,cAAc,QAAS,kBAA2B,QAAE,CAC5E,KAAM,mBAAqB,GAC1B,GAAoB,MAAM,cAAc,aAAc,CACvD,QAbY,WAEV,IAAI,EADF,EAAG,GAAG,eAGoC,OAA3C,EAAoB,EAAG,GAAG,eAAiC,EAAkB,OAGhF,OAAO,KAAK,EAAM,EACpB,GAMG,GACL,CAEA,SAAS,SAAS,GAChB,IAAI,EAAW,EAAM,SACjB,EAAgB,EAAM,OACtB,OAA2B,IAAlB,EAA2B,GAAM,EAC1C,EAAe,EAAM,MACrB,OAAyB,IAAjB,EAA0B,EAAI,EACtC,EAAQ,MAAM,OAAO,MACrB,EAAO,MAAM,OAAO,KAAK,UAM7B,OALA,gBAAgB,IAAI,SAAU,GAC5B,IAAI,EAAQ,EAAK,MACZ,EAAM,UACX,EAAM,QAAQ,SAAS,EAAI,EAAS,KAAK,IAAI,EAAM,YAAc,EAAQ,GAAqB,IAAf,EAAK,SACtF,IACoB,MAAM,cAAc,QAAS,CAC/C,KAAM,oBACN,IAAK,GACJ,EACL,CAEA,SAAS,SAAS,GAChB,IAAI,EAAW,EAAM,SACjB,EAAgB,EAAM,OACtB,OAA2B,IAAlB,EAA2B,EAAI,EACxC,EAAgB,EAAM,OACtB,OAA2B,IAAlB,EAA2B,EAAI,EACxC,EAAgB,EAAM,OACtB,OAA2B,IAAlB,EAA2B,EAAI,EACxC,EAAQ,MAAM,OAAO,MAGrB,EADY,MAAM,SAAS,KAAK,UACf,GASrB,OAPA,gBAAgB,IAAI,SAAU,GAC5B,IAAI,EAAQ,EAAK,MACZ,EAAM,UACX,EAAM,QAAQ,SAAS,EAAI,EAAM,YAAc,EAAS,IAAO,EAAS,EAAO,IAC/E,EAAM,QAAQ,SAAS,EAAI,EAAM,YAAc,GAAU,IAAO,EAAO,IAAM,EAAS,EAAO,IAC7F,EAAM,QAAQ,SAAS,EAAI,EAAM,YAAc,EAAS,IAAO,EAAS,EAAO,GACjF,IACoB,MAAM,cAAc,QAAS,CAC/C,KAAM,oBACN,IAAK,GACJ,EACL,CAKA,SAAS,QAAQ,GACf,IAAI,EAAW,EAAM,SACrB,MAAM,SAAQ,WACZ,OAAO,MAAM,OAAO,CAClB,eAAgB,YAAY,eAC5B,WAAY,YAAY,WACxB,WAAY,YAAY,YAE5B,GAAG,IACH,IAAI,EAAW,MAAM,OAAO,MAExB,EAAY,MAAM,WAClB,EAAQ,EAAU,MAClB,EAAS,EAAU,OACnB,EAAK,EAAU,GACf,EAAO,EAAU,KACjB,EAAW,EAAU,SAcrB,EAZY,MAAM,UAAS,WAC7B,IAAI,EAAI,IAAI,MAAM,kBAAkB,EAAK,MAAO,EAAK,OAAQ,CAC3D,KAAM,MAAM,iBACZ,OAAQ,MAAM,WACd,SAAU,EAAG,eACb,aAAa,EACb,eAAe,EACf,WAAY,IAGd,OADA,EAAE,QAAU,EACL,CACT,IACuB,GAEvB,MAAM,WAAU,WACd,IAAI,EAAmB,EAEmB,OAAzC,EAAoB,EAAS,UAA4B,EAAkB,QAAQ,EAAK,MAAO,EAAK,QAC1D,OAA1C,EAAqB,EAAS,UAA4B,EAAmB,cAAc,EAAS,IACvG,GAAG,CAAC,EAAI,EAAM,EAAS,MACvB,MAAM,UAAS,WACb,IAAI,EAEC,EAAS,UAEd,EAAS,QAAQ,OAAS,EAAS,QAAQ,OAAO,QAAO,SAAU,GACjE,YAAgB,IAAT,CACT,IAC2C,OAA1C,EAAqB,EAAS,UAA4B,EAAmB,SAChF,GAAG,GAEH,IAAI,EAAS,GAYb,OAXA,EAAO,KAAmB,MAAM,cAAc,aAAc,CAC1D,IAAK,aACL,OAAQ,UAAY,EAAO,OAC3B,KAAM,CAAC,EAAO,MAEhB,MAAM,SAAS,QAAQ,GAAU,SAAU,GACzC,GAAM,EAAO,KAAmB,MAAM,aAAa,EAAI,CACrD,IAAK,EAAO,OACZ,OAAQ,UAAY,EAAO,SAE/B,IACoB,MAAM,cAAc,iBAAkB,CACxD,IAAK,EACL,KAAM,CAAC,EAAI,IACV,EACL,CAEA,IAAI,cAA6B,MAAM,cAAc,CAAC,GAClD,UAAY,WACd,OAAO,MAAM,WAAW,cAC1B,EACA,SAAS,OAAO,GACd,IAAI,EAAW,EAAM,SAEjB,EAAY,MAAM,WAClB,EAAQ,EAAU,MAClB,EAAS,EAAU,OACnB,EAAK,EAAU,GAGf,EADkB,iBACO,OAEzB,EAAc,MAAM,OAAO,IAC3B,EAAW,cACX,EAAe,MAAM,aAAY,SAAU,GAC7C,EAAY,QAAQ,KAAK,GACzB,EAAY,QAAQ,MAAK,SAAU,EAAG,GACpC,OAAO,EAAE,MAAQ,EAAE,KACrB,IACA,GACF,GAAG,IACC,EAAiB,MAAM,aAAY,SAAU,GAC/C,EAAY,QAAU,EAAY,QAAQ,QAAO,SAAU,GACzD,OAAO,EAAE,OAAS,CACpB,IACA,GACF,GAAG,IACC,EAAc,EAAY,QAAQ,OAAS,IAAM,EAAO,GAM5D,OALA,MAAM,UAAS,WACT,IACJ,EAAG,WAAY,EACf,EAAG,OAAO,EAAO,GACnB,GAAG,GACiB,MAAM,cAAc,cAAc,SAAU,CAC9D,MAAO,CACL,aAAc,EACd,eAAgB,IAEjB,GAA4B,MAAM,cAAc,QAAS,KAAM,EAAY,QAAQ,KAAI,SAAU,GAClG,OAAO,EAAE,IACX,KAAK,EACP,CAEA,SAAS,aAAa,GACpB,IAAI,EAAQ,EAAM,MACd,EAAW,EAAM,SAKjB,EAHY,MAAM,UAAS,WAC7B,OAAO,KAAK,SAAS,SAAS,IAAI,UAAU,EAC9C,IACqB,GAEjB,EAAa,YACb,EAAe,EAAW,aAC1B,EAAiB,EAAW,eAyBhC,OAvBA,MAAM,WAAU,WACd,GAAK,EAkBL,OAhBK,MAAM,QAAQ,GAOjB,EAAS,SAAQ,SAAU,EAAO,GAChC,EAAa,CACX,KAAM,EACN,KAAM,EACN,MAAO,GAEX,IAZA,EAAa,CACX,KAAM,EACN,KAAM,EACN,MAAO,IAYJ,WACL,OAAO,EAAe,EACxB,CACF,GAAG,CAAC,EAAU,EAAO,EAAc,EAAgB,IAC5C,IACT,CAEA,IAAI,YAAc,CAAC,OAAQ,UAAW,QAAS,UAAW,UAAW,YAAa,aAC9E,OAAsB,MAAM,YAAW,SAAU,EAAO,GAC1D,IAAI,EAAO,EAAM,KACb,EAAiB,EAAM,QACvB,OAA6B,IAAnB,GAAoC,EAC9C,EAAe,EAAM,MACrB,OAAyB,IAAjB,EAA0B,MAAQ,EAC1C,EAAU,EAAM,QAChB,EAAU,EAAM,QAChB,EAAY,EAAM,UAClB,EAAY,EAAM,UAClB,EAAO,uCAAgD,QAAE,EAAO,aAEpE,OAAoB,MAAM,cAAc,aAAc,CACpD,QAAS,EACT,QAAS,EACT,UAAW,EACX,UAAW,GACG,MAAM,cAAc,OAAQ,kBAA2B,QAAE,CACvE,QAAS,EACT,KAAM,kBACN,IAAK,GACJ,GAAoB,MAAM,cAAc,oBAAqB,CAC9D,KAAM,IACJ,GAAwB,MAAM,cAAc,oBAAqB,CACnE,MAAO,EACP,aAAa,EACb,QAAS,MAEb,IAEI,YAAc,CAAC,OAAQ,WAAY,YAEvC,SAAS,kCAAkC,EAAG,GAAkB,IAAI,EAAuB,oBAAX,QAA0B,EAAE,OAAO,WAAa,EAAE,cAAe,GAAI,EAAI,OAAQ,EAAK,EAAG,KAAK,IAAI,KAAK,KAAK,GAAK,GAAI,MAAM,QAAQ,KAAO,EAAK,8BAA8B,KAAO,GAAkB,GAAyB,iBAAb,EAAE,OAAqB,CAAM,IAAI,EAAI,GAAI,IAAI,EAAI,EAAG,OAAO,WAAc,OAAI,GAAK,EAAE,OAAe,CAAE,MAAM,GAAe,CAAE,MAAM,EAAO,MAAO,EAAE,KAAQ,CAAG,CAAE,MAAM,IAAI,UAAU,wIAA0I,CAE/lB,SAAS,8BAA8B,EAAG,GAAU,GAAK,EAAL,CAAgB,GAAiB,iBAAN,EAAgB,OAAO,oBAAoB,EAAG,GAAS,IAAI,EAAI,OAAO,UAAU,SAAS,KAAK,GAAG,MAAM,GAAI,GAAiE,MAAnD,WAAN,GAAkB,EAAE,cAAa,EAAI,EAAE,YAAY,MAAgB,QAAN,GAAqB,QAAN,EAAoB,MAAM,KAAK,GAAc,cAAN,GAAqB,2CAA2C,KAAK,GAAW,oBAAoB,EAAG,QAA3G,CAA/O,CAAmW,CAEra,SAAS,oBAAoB,EAAK,IAAkB,MAAP,GAAe,EAAM,EAAI,UAAQ,EAAM,EAAI,QAAQ,IAAK,IAAI,EAAI,EAAG,EAAO,IAAI,MAAM,GAAM,EAAI,EAAK,IAAO,EAAK,GAAK,EAAI,GAAM,OAAO,CAAM,CACxL,IAAI,YAAc,GAClB,SAAS,WAAW,GAClB,IAAI,EAAc,EAAM,KAGpB,GAFJ,OAA8B,IAAhB,EAAyB,GAAK,GAEb,GAC3B,OAAyB,IAAjB,EAA0B,EAAI,EACtC,EAAgB,EAAY,GAC5B,OAA2B,IAAlB,EAA2B,EAAI,EACxC,EAAgB,EAAY,GAC5B,OAA0B,IAAlB,EAA2B,IAAO,EAC1C,EAAW,EAAM,SACjB,EAAW,EAAM,SACjB,EAAO,uCAAgD,QAAE,EAAO,aAEhE,EAAY,MAAM,SAAS,IAAI,MAAM,QAAQ,EAAG,EAAG,IACnD,EAAW,EAAU,GACrB,EAAc,EAAU,GAExB,EAAM,MAAM,SAAQ,WAQtB,IAPA,IAAI,EAAiB,EAAa,EAAmB,EAAc,EAAoB,EAAc,EAAmB,EAOnD,EAHjE,OAAa,EACb,EAAgB,IAEX,EAAY,kCAAkC,eAAuB,EAAQ,KAAa,MAAO,CACxG,IAAI,EAAM,EAAM,MACZ,EAAQ,EAAI,MAAQ,EACpB,EAAa,KAAK,IAAI,EAAI,OAAS,EAAS,GAC5C,EAAY,KAAK,IAAI,EAAI,MAAQ,EAAQ,GAEzC,EAAa,EAAI,OAXP,KAW6B,EAAY,EAAI,MAX7C,KAWkE,EAAa,EAAY,IACvG,EAAa,EACb,EAAgB,EAAa,EAEjC,CAEA,IAAI,EAA2F,OAApF,EAAgD,OAA7B,EAAc,QAAsB,EAAS,EAAY,KAAe,EAAkB,mBAAqB,EAAQ,IAAM,EAAS,IAAM,EACtK,EAA+F,OAA1F,EAAmD,OAA9B,EAAe,QAAsB,EAAS,EAAa,OAAiB,EAAoB,EAC1H,EAAiG,OAA5F,EAAoD,OAA9B,EAAe,QAAsB,EAAS,EAAa,QAAkB,EAAqB,EAC7H,EAA+F,OAA1F,EAAmD,OAA9B,EAAe,QAAsB,EAAS,EAAa,OAAiB,EAAoB,EAC1H,EAAI,KAAK,IAAI,EAAG,EAAG,GAAK,EAgB5B,OAPK,GAAY,YAAY,KAAK,CAChC,IAAK,EACL,MAAO,EACP,OAAQ,EACR,MAAO,IAET,EAAY,IAAI,MAAM,QAAQ,EAAQ,EAAG,EAAS,EAAG,EAAQ,IAZpD,MAAM,YAAY,GAAK,WAC5B,OAAO,IAAI,mBAAmB,mBAAmB,EAAO,EAAQ,EAAO,EAAG,EAC5E,GAYJ,GAAG,CAAC,EAAO,EAAQ,IACnB,OAAoB,MAAM,cAAc,QAAS,kBAA2B,QAAE,CAC5E,KAAM,wBACL,GAAoB,MAAM,cAAc,OAAQ,CACjD,MAAO,EACP,SAAU,EACV,SAAU,GACT,GACL,CAEA,IAAI,gBAAkB,SAAyB,EAAM,GACnD,IAAI,EAAM,MAAM,SAAQ,WACtB,OAAgB,MAAR,OAAe,EAAS,EAAK,WAAa,SACpD,GAAG,CAAC,IACA,EAAO,MAAM,SAAQ,WACvB,OAAO,KAAK,QACd,GAAG,IACC,EAAQ,MAAM,SAAQ,WACxB,OAAO,IAAI,MAAM,MAAM,EACzB,GAAG,CAAC,IAKA,EAHa,QAAQ,UAAU,CACjC,IAAK,IAEc,IAEjB,EAA2B,IAAT,EAClB,EAAa,KAAQ,EACrB,EAAM,MAAM,SAAQ,WACtB,IAAI,EAAW,IAAI,MAAM,qBAAqB,CAC5C,UAAW,IACX,UAAW,IACX,gBAAiB,IACjB,KAAM,MAAM,aAed,OAZA,EAAS,gBAAkB,SAAU,GACnC,EAAO,SAAS,OAAS,IAAI,MAAM,QAAQ,GAC3C,EAAO,SAAS,KAAO,IAAI,MAAM,QAAQ,GACzC,EAAO,SAAS,MAAQ,IAAI,MAAM,QAAQ,GAC1C,EAAO,SAAS,yBAA2B,IAAI,MAAM,QAAQ,GAC7D,EAAO,SAAS,qBAAuB,IAAI,MAAM,QAAQ,GACzD,IAAI,EAAW,kMACf,EAAO,aAAe,EAAW,SAAW,EAAO,aAAa,QAAQ,0BAA2B,QACnG,EAAO,eAAiB,EAAW,EAAO,eAAe,QAAQ,gCAAiC,QAClG,EAAS,SAAS,OAAS,CAC7B,EAEO,CACT,GAAG,CAAC,EAAQ,EAAO,EAAiB,EAAY,OAAQ,SASxD,OARA,gBAAgB,IAAI,SAAU,GAC5B,IAAI,EAEA,EAAQ,EAAK,MACJ,MAAP,GAAiD,OAAjC,EAAgB,EAAI,WAAqB,EAAc,SAC7E,EAAI,SAAS,OAAO,SAAS,KAAK,MAAQ,EAAM,YAAc,EAAW,IAAP,EAClE,EAAI,SAAS,OAAO,SAAS,MAAM,MAAM,IAAI,EAAI,OACnD,IACO,CACT,EACI,SAAW,y5IACX,OAAS,2TACT,OAAS,6QAEb,SAAS,QAAQ,GACf,IAAI,EAAW,EAAM,SACjB,EAAU,EAAM,QAChB,EAAS,EAAM,OACf,EAAQ,MAAM,OAAO,MACrB,EAAO,MAAM,OAAO,MACpB,EAAQ,MAAM,UAAS,SAAU,GACnC,OAAO,EAAG,KACZ,IAGI,EADY,MAAM,SAAS,IAAI,MAAM,SACrB,GAGhB,EADa,MAAM,SAAS,IAAI,MAAM,UACrB,GAEjB,EAAY,MAAM,OAAO,GAC7B,MAAM,WAAU,WACd,EAAU,QAAU,EAAM,WAC5B,GAAG,CAAC,IACJ,gBAAgB,IAAI,SAAU,GAC5B,IAAI,EAAQ,EAAK,MACjB,GAAK,EAAK,SAAY,EAAM,QAA5B,CACA,EAAM,QAAQ,eACd,EAAM,QAAQ,OAAO,UAAU,EAAK,EAAI,WAAY,EAAI,OAExD,IAAK,IAAI,EAAI,EAAG,EAAI,EAAU,IAAK,CACjC,IAAI,EAAO,GAAK,EAAW,GAC3B,EAAI,SAAS,IAAI,EAAO,EAAI,EAAG,EAAO,EAAI,EAAG,EAAO,EAAI,GACxD,IAAI,EAAK,GAAa,EAAP,EAGX,EAAQ,EAAM,YAAc,EAAU,QACtC,EAAO,EAAU,EAAI,EAAW,EAAI,EACpC,EAAI,MAAM,UAAU,OAAO,EAJnB,IAI2B,GAH5B,GAGkD,EAAG,GAC5D,GAAO,KAAK,IAAI,KAAK,GAAK,GAAK,GAAK,EACpC,IAAS,EAAM,EAAI,GACvB,EAAI,MAAM,UAAe,GAAL,EAAW,GAC/B,EAAI,eACJ,EAAK,QAAQ,YAAY,EAAG,EAAI,OAClC,CAEA,EAAK,QAAQ,eAAe,aAAc,CApBC,CAqB7C,IACA,IAAI,EAAM,MAAM,SAAQ,WACtB,OAAO,IAAI,MAAM,qBAAqB,IAAM,GAAI,GAClD,GAAG,IACC,EAAM,qBAAgB,EAAW,KACrC,OAAoB,MAAM,cAAc,MAAM,SAAU,KAAmB,MAAM,cAAc,QAAS,CACtG,SAAU,EACV,IAAK,IACU,MAAM,cAAc,gBAAiB,CACpD,KAAM,CAAC,EAAK,EAAK,GACjB,IAAK,IAET,CASA,IAAI,aAAe,SAAsB,EAAM,EAAU,GACnD,EAAK,aACJ,EAAK,WAAU,EAAK,SAAW,CAAC,GAEjC,EAAK,SAAS,KAAc,IAC9B,EAAK,SAAS,GAAY,EAC1B,EAAK,YAAa,GAEtB,EAOI,kBAAoB,SAA2B,EAAO,GAGxD,GAFoB,EAAM,iBAAmB,EAAM,aAEnD,CAWA,IAAI,EAAyC,YAA7B,EAAM,mBAClB,EAAQ,EAAM,gBAAkB,EAChC,EAAM,EAAM,cAAgB,EAE5B,EACE,IAAU,EACZ,EAAM,kBAAkB,EAAO,EAAU,QAChC,EAAW,EACpB,EAAM,kBAAkB,EAAO,EAAU,WAEzC,EAAM,kBAAkB,EAAU,EAAO,YAGvC,IAAQ,EACV,EAAM,kBAAkB,EAAU,EAAK,QAC9B,EAAW,EACpB,EAAM,kBAAkB,EAAU,EAAK,YAEvC,EAAM,kBAAkB,EAAK,EAAU,UArB3C,MAPM,GAAY,EAAM,gBAAkB,GACtC,EAAM,kBAAkB,EAAU,EAAM,gBAAkB,EAAG,YAE7D,EAAM,kBAAkB,EAAM,gBAAkB,EAAG,EAAU,UA4BnE,EACI,MAAQ,IAAI,MAAM,QAOlB,gBAAkB,SAAyB,EAAM,GACnD,IAAI,EAAgB,EAAU,gBAAgB,GAAM,GACpD,GAA6B,IAAzB,EAAc,OAAc,OAAO,KACvC,IAAI,EAAQ,EAAc,GACtB,EAAU,EAAK,0BAA0B,EAAM,MAAO,OAC1D,OAAO,gBAAgB,gBAAgB,EAAK,eAAgB,EAAQ,EAAG,EAAQ,EACjF,EACI,cAAgB,GAShB,aAAe,SAAsB,EAAO,EAAe,GAC7D,IAAI,EAAO,EAAM,YACb,EAAY,EAAO,EAAc,QACjC,EAAkB,EAAO,EAAoB,QAEjD,OAAI,EAAY,cACV,EAAkC,EAAhB,eACpB,EAAoB,QAAU,EACvB,IAEP,EAAc,QAAU,EACxB,EAAoB,QAAU,EACvB,IAGT,EAAc,QAAU,EACjB,EAEX,EAOI,qBAAuB,SAA8B,EAAM,GAI7D,IAHA,IAAI,EAAO,EACP,EAAQ,EAEL,EAAO,GAAwB,MAAnB,EAAK,EAAO,IAC7B,IAGF,KAAO,EAAQ,EAAK,QAA0B,MAAhB,EAAK,IACjC,IAGF,MAAO,CAAC,EAAM,EAChB,EAEI,cAAgB,EAMhB,cAAgB,SAAuB,QAC5B,IAAT,IACF,EAAO,GAGT,IAAI,EAAW,MAAM,OAAO,MACxB,EAAQ,MAAM,UAAS,SAAU,GACnC,OAAO,EAAG,KACZ,IACI,EAAY,MAAM,OAAO,GAC7B,MAAM,UAAS,SAAU,GACvB,IAAI,EAAQ,EAAK,MACjB,GAAK,EAAS,QAAd,CACA,IAAI,EAAO,EAAM,YAAc,EAAU,QAGvC,EAAS,QAAQ,QADf,EAAO,eAIkB,QAAQ,KAAK,OAAgE,EAAxD,KAAK,IAAI,EAAO,KAAK,GAAK,GAAK,EAAO,iBAAuB,GAPlF,CAS/B,IAMA,MAAO,CACL,SAAU,EACV,MANU,WACV,EAAU,QAAU,EAAM,WAC5B,EAMF,EAEI,cAAgB,SAAuB,EAAO,EAAM,EAAW,GACjE,IAAI,EAAK,MAAM,UAAS,SAAU,GAChC,OAAO,EAAM,EACf,IACI,EAAQ,MAAM,UAAS,SAAU,GACnC,OAAO,EAAM,KACf,IACI,EAAS,MAAM,UAAS,SAAU,GACpC,OAAO,EAAM,MACf,IAGI,EADkB,iBACO,OAEzB,EAAW,MAAM,OAAO,GACxB,EAAW,MAAM,QAAO,GAC5B,MAAM,WAAU,WACd,IAAI,EAAQ,EAAK,QACjB,GAAK,GAAU,EAAM,eAArB,CAEA,IAAI,EAAa,WACf,IAAI,EAAM,gBAAgB,EAAO,GACjC,GAAW,MAAP,EAAJ,CAEA,IAAK,EAAS,QAAS,CAErB,GAAI,EAAI,YAAc,EAAS,QAAS,OACxC,EAAS,SAAU,EACnB,EAAM,kBAAkB,EAAS,QAAS,EAAS,QACrD,CAEA,kBAAkB,EAAO,EAAI,UATN,CAUzB,EAEI,EAAY,SAAmB,GAEjC,EAAM,EAAI,EAAE,QAAQ,GAAG,QAAU,EAAG,WAAW,YAAc,EAAI,EACjE,EAAM,GAAM,EAAE,QAAQ,GAAG,QAAU,EAAG,WAAW,aAAgB,EAAI,EACrE,EAAU,cAAc,EAAO,GAC/B,GACF,EAEI,EAAU,SAAS,IACjB,EAAO,QACT,EAAG,WAAW,oBAAoB,YAAa,GAC/C,EAAG,WAAW,oBAAoB,WAAY,KAE9C,EAAG,WAAW,oBAAoB,YAAa,GAC/C,EAAG,WAAW,oBAAoB,UAAW,GAEjD,EAEI,EAAY,SAAmB,GACjC,EAAS,SAAU,EACnB,IAAI,EAAM,gBAAgB,EAAO,GACrB,OAAR,IACJ,IACA,EAAE,kBAEF,EAAS,QAAU,EAAI,UAEnB,EAAO,QACT,EAAG,WAAW,iBAAiB,YAAa,GAC5C,EAAG,WAAW,iBAAiB,WAAY,KAE3C,EAAG,WAAW,iBAAiB,YAAa,GAC5C,EAAG,WAAW,iBAAiB,UAAW,IAE9C,EAEA,OAAI,EAAO,QACT,EAAG,WAAW,iBAAiB,aAAc,GACtC,WACL,OAAO,EAAG,WAAW,oBAAoB,aAAc,EACzD,IAEA,EAAG,WAAW,iBAAiB,YAAa,GACrC,WACL,OAAO,EAAG,WAAW,oBAAoB,YAAa,EACxD,EA7DyC,CA+D7C,GAAG,CAAC,EAAG,WAAY,EAAY,EAAO,EAAM,EAAO,OAAQ,EAAO,EAAQ,GAC5E,EAEI,YAAc,CAAC,QAAS,WAAY,WAAY,UAAW,SAAU,OAAQ,OAAQ,WAAY,QAAS,cAAe,aAC7H,SAAS,UAAU,GACjB,IAAI,EAAQ,EAAM,MACd,EAAW,EAAM,SACjB,EAAW,EAAM,SACjB,EAAU,EAAM,QAChB,EAAS,EAAM,OACf,EAAc,EAAM,KACpB,OAAuB,IAAhB,EAAyB,OAAS,EACzC,EAAc,EAAM,KACpB,OAAuB,IAAhB,EAAyB,iEAAmE,EACnG,EAAkB,EAAM,SACxB,OAA+B,IAApB,EAA6B,GAAM,EAC9C,EAAe,EAAM,MACrB,OAAyB,IAAjB,EAA0B,EAAI,EACtC,EAAc,EAAM,YACpB,EAAkB,EAAM,UACxB,EAAO,uCAAgD,QAAE,EAAO,aAEhE,EAAQ,MAAM,UAAS,SAAU,GACnC,OAAO,EAAG,KACZ,IACI,EAAS,MAAM,UAAS,SAAU,GACpC,OAAO,EAAG,MACZ,IACI,EAAS,YAGT,EADkB,iBACO,OAEzB,EAAY,GAAmB,EAAO,UACtC,EAAQ,MAAM,OAAO,MACrB,EAAU,MAAM,SAChB,EAAQ,MAAM,OAAO,MACrB,EAAY,MAAM,OAAO,MAEzB,EAAY,MAAM,SAAS,IAC3B,EAAa,EAAU,GACvB,EAAgB,EAAU,GAS1B,EAAgB,aAAa,EAPd,MAAT,EAAgB,EAAQ,GAErB,SAAgB,GACvB,GAAU,EAAS,GACvB,EAAc,EAChB,IAGI,EAAQ,EAAc,MACtB,EAAU,EAAc,QACxB,EAAa,EAAc,WAG/B,MAAM,WAAU,WACd,GAAK,EAEL,OADA,EAAM,iBAAiB,QAAS,GACzB,WACL,OAAO,EAAM,oBAAoB,QAAS,EAC5C,CACF,GAAG,CAAC,EAAO,IAEX,MAAM,WAAU,WACd,GAAK,EAEL,OADA,EAAM,iBAAiB,OAAQ,GACxB,WACL,OAAO,EAAM,oBAAoB,OAAQ,EAC3C,CACF,GAAG,CAAC,EAAO,IAEX,MAAM,WAAU,WACd,GAAK,EAAM,SAAY,GAAY,EAAO,OAA1C,CACA,IAAI,EAAW,EAAM,QAAQ,iBAAiB,IAAI,MAAM,SACxD,EAAO,OAAO,EAF0C,CAG1D,GAAG,CAAC,EAAS,EAAQ,IAErB,IAGI,EAHa,QAAQ,UAAU,CACjC,MAAO,EAAU,OAAS,YAEL,MAEnB,EAAe,MAAM,YAAY,gCAAgC,WACnE,OAAO,IAAI,MAAM,qBAAqB,CACpC,MAAO,OACP,aAAa,EACb,QAAS,GACT,YAAY,GAEhB,IACI,EAAoB,GAAX,EAET,EAAc,EAAoB,GADX,GAAX,GAEZ,EAA0B,KAAX,EACf,EAAc,EACd,EAAe,EAAe,EAC9B,EAAc,EAAiB,EAAT,EACtB,EAAmB,GAAX,EACR,EAAQ,eACR,EAAgB,MAAM,OAAO,GAC7B,EAAsB,MAAM,OAAO,GA6BvC,cAAc,EAAO,EAAS,EAAW,GACzC,YAAY,SAAS,WACd,GAAY,IACjB,EAAS,EAAM,OACf,EAAM,OACR,GAAG,CAAC,EAAO,EAAS,IACpB,IAAI,EAAa,MAAM,aAAY,SAAU,EAAY,GACvD,IAAI,EAAQ,EAAQ,QACf,IACA,EAAM,WAAU,EAAM,SAAW,CAAC,EAAG,EAAG,EAAG,IAChD,EAAM,SAAS,GAAK,EACpB,EAAM,SAAS,IAAM,IACrB,EAAM,SAAS,GAAK,EAAQ,EAC5B,EAAM,SAAS,GAAK,IACpB,EAAM,SAAW,EACjB,EAAM,SAAS,GAAK,EAAQ,EAAI,EAEhC,EAAM,OACR,GAAG,IACC,GAAoB,GAAW,IAAgB,EAAM,MACrD,EAAM,EAAmB,EAAuB,aAAT,EAAsB,EAAM,MAAM,QAAQ,KAAM,KAAO,EAAM,MACpG,EAAM,EAAmB,UAAY,OACrC,EAAa,MAAM,OAAO,GAC1B,EAAQ,cAAc,KAE1B,GAAI,EAAQ,SAAW,GAAS,EAAM,SAAW,EAAU,QAAS,CAClE,IAAI,EAAQ,EAAQ,QAChB,EAAS,EAAM,QACf,EAAa,EAAU,QAC3B,EAAM,KAAO,EACb,EAAM,MAAQ,EACd,aAAa,EAAO,UAAW,GAC/B,aAAa,EAAO,iBAAkB,EAAM,gBAC5C,aAAa,EAAO,eAAgB,EAAM,cAC1C,aAAa,EAAO,WAAY,GAChC,aAAa,EAAO,aAAc,EAAW,SAC7C,aAAa,EAAO,QAAS,GAE7B,EAAM,MAAK,WACT,EAAM,QACN,IAAI,EAAiB,EAAM,eAAe,eACtC,EAAgB,EAAM,iBAAmB,EAAM,cAAgB,EASnE,GARA,EAAO,SAAU,EACjB,EAAW,SAAU,EAEhB,GACH,EAAW,EAAG,GAIZ,EAAS,CACX,EAAO,SAAU,EACjB,IAAI,GAAa,GAA8C,YAA7B,EAAM,mBAAmC,EAAM,aAAe,EAAM,iBAAmB,EAEzH,EAAO,SAAS,GAAK,EAAc,EAAI,EAAW,QAElD,IAAI,EAAY,EAAe,OAAS,EACpC,EAAc,KAAK,IAAgB,EAAZ,EAAoC,EAArB,EAAM,MAAM,OAAa,GAC/D,EAAa,EAAe,GAC5B,EAA4B,GAAb,EAAiB,EAAI,EAAe,IAAgB,OAGlD,IAAjB,IACF,EAAO,SAAS,GAAK,GAInB,EAAO,SAAS,EAAI,EAAc,IAChC,IAAc,EAAM,MAAM,QAE5B,EAAW,SAAW,EAAO,SAAS,EAAI,EAAc,EACxD,EAAO,SAAS,EAAI,EAAc,IAGlC,EAAW,SAAW,EAAO,SAAS,EACtC,EAAO,SAAS,GAAK,EAAO,SAAS,IAKrC,EAAO,SAAS,GAAK,EAAc,IACrC,EAAW,SAAW,EAAO,SAAS,EACtC,EAAO,SAAS,EAAI,GAItB,IAAI,EAAiB,EAAc,EAAa,EAAW,QAEvD,EAAiB,GAAK,EAAW,QAAU,IAC7C,EAAO,SAAS,GAAK,EACrB,EAAW,SAAW,GAIpB,EAAW,QAAU,IACvB,EAAO,SAAS,GAAK,EAAW,QAChC,EAAW,QAAU,GAGvB,EAAW,EAAW,QAAS,EACjC,CAGA,GAAI,EAAe,CACjB,EAAW,SAAU,EACrB,EAAO,SAAU,EACjB,IAAI,EAAsC,EAArB,EAAM,MAAM,OAAa,EAE1C,EAAS,EADI,KAAK,IAAkC,GAA7B,EAAM,gBAAkB,GAAQ,IAGvD,EAAO,EADI,KAAK,IAAgC,GAA3B,EAAM,cAAgB,GAAQ,IAGvD,QAAe,IAAX,QAAiC,IAAT,EAAoB,CAC9C,IAAI,EAAY,EAAO,EACvB,EAAW,SAAS,GAAK,EAAc,EAAI,EAAS,EAAW,QAAU,EAAY,EACrF,EAAW,MAAM,EAAI,EACrB,IAAI,EAAW,EAAW,SAAS,EAAI,EAAW,MAAM,EAAI,EAE5D,GAAI,GAAY,EAAc,EAAG,CAC/B,IAAI,GAAQ,EAAc,EAAI,EAC9B,EAAW,SAAS,GAAK,EAAO,EAChC,EAAW,MAAM,GAAK,CACxB,CAEA,IAAI,EAAY,EAAW,SAAS,EAAI,EAAW,MAAM,EAAI,EAE7D,GAAI,EAAY,EAAc,EAAG,CAC/B,IAAI,EAAQ,EAAY,EAAc,EAEtC,EAAW,SAAS,GAAK,EAAQ,EACjC,EAAW,MAAM,GAAK,CACxB,CACF,CACF,CACF,GACF,CAGA,IAAI,GAAgB,EAChB,GAAwB,IAAX,EAgBjB,OAfA,gBAAgB,GAAG,WACjB,IAAI,EAAQ,EAAQ,QAChB,EAAS,EAAM,QACf,EAAgB,EAAM,iBAAmB,EAAM,cAAgB,EAC9D,GAAU,GAAW,IAEtB,EAAO,SAAS,EAAI,EAAc,EAAI,KACxC,EAAW,SAAW,IAIpB,EAAO,SAAS,GAAK,EAAc,EAAI,KACzC,EAAW,SAAW,IAE1B,IACoB,MAAM,cAAc,QAAS,kBAA2B,QAAE,CAC5E,KAAM,uBACL,EAAM,CACP,IAAK,IACU,MAAM,cAAc,QAAS,CAC5C,KAAM,UACN,aAAc,EAAQ,EAAI,MACZ,MAAM,cAAc,MAAM,SAAU,CAClD,SAAU,MACI,MAAM,cAAc,KAAK,KAAM,CAC7C,KAAM,OACN,IAAK,EACL,MAAO,EACP,QAAS,OACT,SAAU,EACV,KAAM,EACN,SAAU,EACV,cAAe,EAAc,EAE7B,WAAY,SACZ,YAAa,GACZ,IAAoB,MAAM,cAAc,QAAS,CAClD,KAAM,QACN,IAAK,EAAM,UACG,MAAM,cAAc,OAAQ,CAC1C,KAAM,QACN,IAAK,EACL,SAAS,EACT,SAAU,MAAM,iBACF,MAAM,cAAc,sBAAuB,CACzD,KAAM,CAAC,KAAQ,EAAU,OACR,MAAM,cAAc,OAAQ,CAC7C,KAAM,YACN,IAAK,EACL,SAAS,EACT,SAAU,GACI,MAAM,cAAc,oBAAqB,CACvD,KAAM,CAAC,EAAG,EAAkB,IAAR,OACH,MAAM,cAAc,OAAQ,CAC7C,KAAM,CAAC,EAAa,EAAc,GAClC,UAAW,EACX,QA/NkB,WAClB,IACA,IAAI,EAAQ,EAAQ,QACpB,GAAK,GAAU,EAAM,gBAAmB,GAAU,EAAlD,CACA,IAAI,EAAM,gBAAgB,EAAO,GAEjC,GAAY,OAAR,EAEF,EAAM,kBAAkB,EAAM,MAAM,OAAQ,EAAM,MAAM,aACnD,GAAK,EAAM,QAYhB,EAAc,QAAU,EACxB,EAAoB,QAAU,EAC9B,kBAAkB,EAAO,EAAI,eAdJ,CACzB,IAAI,EAAY,aAAa,EAAO,EAAe,GAEnD,GAAkB,IAAd,EACF,EAAM,kBAAkB,EAAI,UAAW,EAAI,gBACtC,GAAkB,IAAd,EAAiB,CAC1B,IAAI,EAAa,qBAAqB,EAAM,MAAO,EAAI,WACvD,EAAM,kBAAkB,EAAW,GAAI,EAAW,GACpD,MACE,EAAM,kBAAkB,EAAG,EAAM,MAAM,OAE3C,CAjBiE,CAsBnE,IAuMiB,MAAM,cAAc,WAAY,CAC/C,KAAM,CAAC,EAAa,EAAc,GAClC,SAAU,MAAM,qBACD,MAAM,cAAc,WAAY,CAC/C,KAAM,CAAC,EAAa,EAAc,GAClC,cAAe,MACD,MAAM,cAAc,QAAQ,SAAS,qBAAsB,CACzE,MAAO,KAEX,CAEA,IAAI,YAAc,CAAC,WAAY,UAAW,OAAQ,WAAY,QAAS,WAAY,YAAa,QAAS,UAAW,eAAgB,OAAQ,aAC5I,SAAS,SAAS,GAChB,IAAI,EAAW,EAAM,SACjB,EAAU,EAAM,QAChB,EAAc,EAAM,KACpB,OAAuB,IAAhB,EAAyB,iEAAmE,EACnG,EAAkB,EAAM,SACxB,OAA+B,IAApB,EAA6B,IAAO,EAC/C,EAAQ,EAAM,MACd,EAAW,EAAM,SACjB,EAAmB,EAAM,UACzB,OAAiC,IAArB,EAA8B,QAAU,EACpD,EAAe,EAAM,MACrB,OAAyB,IAAjB,EAA0B,OAAS,EAC3C,EAAiB,EAAM,QACvB,OAA6B,IAAnB,GAAmC,EAC7C,EAAsB,EAAM,aAC5B,OAAuC,IAAxB,EAAiC,QAAU,EAC1D,EAAO,EAAM,KACb,EAAY,EAAM,UAClB,EAAO,uCAAgD,QAAE,EAAO,aAEhE,EAAU,MAAM,SAEhB,EAAY,MAAM,SAAS,CAAC,EAAG,IAC/B,EAAO,EAAU,GACjB,EAAU,EAAU,GAEpB,EAAa,MAAM,UAAS,GAC5B,EAAU,EAAW,GACrB,EAAa,EAAW,GAExB,EAAa,MAAM,UAAS,GAC5B,EAAU,EAAW,GACrB,EAAa,EAAW,GAExB,EAAa,MAAM,SAAQ,WAC7B,OAAO,EAAO,EAAK,SAAW,CAChC,GAAG,CAAC,EAAO,IACP,EAAc,MAAM,SAAQ,WAC9B,IAAI,EAAY,EAAO,EAAK,SAAU,IAAI,MAAO,WAAW,IAAM,IAAI,MAAM,MAAM,GAAY,gBAC1F,EAAS,MAAS,EAAU,QAAU,IAAO,EAAI,GAErD,OADA,EAAU,WAAW,EAAU,QAAU,GAClC,EAAU,QACnB,GAAG,CAAC,EAAY,IAEZ,EAAa,QAAQ,UAAU,kBAA2B,QAAE,CAC9D,UAAW,EAAU,EAAc,EACnC,MAAO,EAAU,IAAO,GACvB,QAAQ,OAAO,QACd,EAAY,EAAW,UACvB,EAAQ,EAAW,MAGvB,MAAM,WAAU,WACV,GAAS,YAAW,WACtB,OAAO,GAAW,EACpB,GAAG,IACL,GAAG,CAAC,IAQJ,MAAM,iBAAgB,WACpB,EAAQ,QAAQ,iBAAiB,gBAAgB,WAC/C,IAAI,EAEA,EAA+C,OAAvC,EAAmB,EAAQ,cAAmB,EAAS,EAAiB,eACpF,GAAK,EAAL,CACA,IAAI,EAAI,EAAK,YAAY,GAAK,EAAK,YAAY,GAC3C,EAAI,EAAK,YAAY,GAAK,EAAK,YAAY,GAC/C,EAAQ,CAAC,EAAG,GAHK,CAInB,IACA,EAAQ,QAAQ,MAClB,GAAG,IACH,IAAI,EAAqB,GAAX,EACV,EAAa,EAAsB,EAAQ,KAAK,IAAI,EAAO,GAAY,EAA/C,IACxB,GAAS,GAAS,EAAK,IAAgB,EAAV,EAC7B,EAAS,EAAK,GAAK,EACnB,EAAmB,IAAX,EACR,EAAgB,EAAqB,KAAX,EAAmB,EACjD,OAAoB,MAAM,cAAc,QAAS,kBAA2B,QAAE,CAC5E,KAAM,mBAAqB,GAC1B,GAAoB,MAAM,cAAc,QAAQ,SAAS,MAAO,CACjE,MAAO,GACO,MAAM,cAAc,KAAK,KAAM,CAC7C,IAAK,EACL,MAAO,EACP,KAAM,EACN,SAAU,EACV,SAAU,EACV,aAAc,EACd,aAAc,EACd,QAAS,SACT,UAAW,SACX,aAAc,EAAQ,EAAI,KAC1B,YAAa,GACZ,GAAwB,MAAM,cAAc,OAAQ,CACrD,KAAM,CAAC,EAAO,EAAQ,GACtB,QA1CkB,WACd,GAAS,IACb,GAAW,EACb,EAwCE,QAAS,WACP,OAAO,GAAW,EACpB,EACA,UAAW,WACT,OAAO,GAAW,EACpB,EACA,UAAW,IACI,MAAM,cAAc,WAAY,CAC/C,KAAM,CAAC,EAAO,EAAQ,IACR,MAAM,cAAc,QAAQ,SAAS,qBAAsB,CACzE,MAAO,MAEX,CAEA,SAAS,kCAAkC,EAAG,GAAkB,IAAI,EAAuB,oBAAX,QAA0B,EAAE,OAAO,WAAa,EAAE,cAAe,GAAI,EAAI,OAAQ,EAAK,EAAG,KAAK,IAAI,KAAK,KAAK,GAAK,GAAI,MAAM,QAAQ,KAAO,EAAK,8BAA8B,KAAO,GAAkB,GAAyB,iBAAb,EAAE,OAAqB,CAAM,IAAI,EAAI,GAAI,IAAI,EAAI,EAAG,OAAO,WAAc,OAAI,GAAK,EAAE,OAAe,CAAE,MAAM,GAAe,CAAE,MAAM,EAAO,MAAO,EAAE,KAAQ,CAAG,CAAE,MAAM,IAAI,UAAU,wIAA0I,CAE/lB,SAAS,8BAA8B,EAAG,GAAU,GAAK,EAAL,CAAgB,GAAiB,iBAAN,EAAgB,OAAO,oBAAoB,EAAG,GAAS,IAAI,EAAI,OAAO,UAAU,SAAS,KAAK,GAAG,MAAM,GAAI,GAAiE,MAAnD,WAAN,GAAkB,EAAE,cAAa,EAAI,EAAE,YAAY,MAAgB,QAAN,GAAqB,QAAN,EAAoB,MAAM,KAAK,GAAc,cAAN,GAAqB,2CAA2C,KAAK,GAAW,oBAAoB,EAAG,QAA3G,CAA/O,CAAmW,CAEra,SAAS,oBAAoB,EAAK,IAAkB,MAAP,GAAe,EAAM,EAAI,UAAQ,EAAM,EAAI,QAAQ,IAAK,IAAI,EAAI,EAAG,EAAO,IAAI,MAAM,GAAM,EAAI,EAAK,IAAO,EAAK,GAAK,EAAI,GAAM,OAAO,CAAM,CACxL,SAAS,gBAAgB,GACvB,IAAI,EAAY,EAAM,UAClB,EAAY,EAAM,UAClB,EAAQ,EAAM,MACd,EAAY,iEACZ,EAAY,IACZ,EAA4B,GAAZ,EAGhB,EAAY,IAMZ,EAHY,MAAM,UAAS,WAC7B,OAAO,IAAI,GACb,IACuB,GAEnB,EAAa,MAAM,UAAS,GAC5B,EAAQ,EAAW,GACnB,EAAW,EAAW,GAI1B,MAAM,WAAU,WACd,IAAI,EAAU,OAAM,SAAU,GAC5B,OAAO,EAAO,IAAI,EAAE,KACtB,IAFA,CAGA,GAAS,GA0BT,IAxBA,IAwBmE,EAxB/D,EAAQ,WACV,IAAI,EAAW,EAAM,MACrB,GAAI,EAAO,IAAI,EAAS,MAAO,MAAO,WACtC,GAAS,GACT,IAAI,EAAI,IAAI,gBAAgB,KAC5B,EAAE,KAAO,EAAS,KAClB,EAAE,KAAO,EACT,EAAE,SAAW,EACb,EAAE,SAAW,EACb,EAAE,aAAe,EACjB,EAAE,MAAK,WACL,IAAI,EAAc,EAAE,eAAe,YAC/B,EAAI,EAAY,GAAK,EAAY,GACjC,EAAI,EAAY,GAAK,EAAY,GACrC,EAAO,IAAI,EAAS,KAAM,CACxB,EAAG,EACH,EAAG,IAED,EAAU,OAAM,SAAU,GAC5B,OAAO,EAAO,IAAI,EAAE,KACtB,KAAI,GAAS,EACf,GACF,EAES,EAAY,kCAAkC,KAAqB,EAAQ,KAAa,MACpF,GA5BH,CAgCZ,GAAG,CAAC,EAAW,EAAQ,EAAW,EAAW,EAAO,IACpD,IAAI,EAAY,MAAM,SAAQ,WAO5B,IANA,IAMoE,EANhE,EAAQ,GACR,EAAgB,EAChB,EAAgB,EAChB,GAAI,IACJ,EAAU,EAEL,EAAa,kCAAkC,KAAsB,EAAS,KAAc,MAAO,CAC1G,IAAI,EAAc,EAEd,EAAY,EAAO,MAEnB,IAAwD,OAA9C,EAAe,EAAO,IAAI,EAAU,YAAiB,EAAS,EAAa,IAAM,GAAK,IAAgB,EAEhH,GAAsD,OAA9C,EAAe,EAAO,IAAI,EAAU,YAAiB,EAAS,EAAa,IAAM,EAE7F,GAAI,EAAgB,GAAQ,EACrB,EAAM,IAAgB,EAAM,KAAK,CACpC,EAAG,EACH,UAAW,KAEb,EAAM,GAAe,UAAU,KAAK,GACpC,EAAU,EACV,GAAiB,MACZ,CACL,IAAI,EAGJ,IAEA,IAAI,GAAuD,OAA9C,EAAe,EAAO,IAAI,EAAU,YAAiB,EAAS,EAAa,IAAM,EAE9F,GAAK,EAAU,EAnFL,KADA,KAoFiC,EAAO,EAE9C,EAAO,qBAET,EAAM,KAAK,CACT,EAAG,EACH,UAAW,CAAC,KAEd,GAAK,EAAO,EA5FJ,KACA,KA4FR,IACA,EAAgB,EAChB,EAAU,IAGV,EAAM,KAAK,CACT,EAAG,EACH,UAAW,CAAC,KAEd,GAAiB,EACjB,EAAU,EAEd,CACF,CAKA,IAFA,IAAI,EAAS,GAEJ,EAAK,EAAG,EAAS,EAAO,EAAK,EAAO,OAAQ,IAAM,CAMzD,IALA,IAKyE,EALrE,EAAO,EAAO,GACd,EAAa,GAEb,EAAI,EAEC,EAAa,kCAAkC,EAAK,aAAsB,EAAS,KAAc,MAAO,CAC/G,IAAI,EAEA,EAAW,EAAO,MAClB,GAAoD,OAA5C,EAAc,EAAO,IAAI,EAAS,YAAiB,EAAS,EAAY,IAAM,EAC1F,GAAK,EAAM,EACX,EAAW,KAAK,CACd,SAAU,EACV,SAAU,CAAC,EAAG,EAAK,EAAG,KAExB,GAAK,EAAM,EAAI,IAAgB,CACjC,CAMA,IAHA,IACI,IADW,EAAI,IAAgB,GACb,EAEb,EAAM,EAAG,EAAc,EAAY,EAAM,EAAY,OAAQ,IAAO,CACjE,EAAY,GAClB,SAAS,IAAM,CACrB,CAEA,EAAO,KAAK,MAAM,EAAQ,EAC5B,CAEA,OAAO,CACT,GAAG,CAAC,EAAW,EAAQ,EAAO,IAG1B,EADa,MAAM,SAAS,KAAK,UACb,GAEpB,EAAU,MAAM,SAAQ,WAG1B,IAFA,IAEoE,EAFhE,EAAM,IAAI,IAEL,EAAa,kCAAkC,KAAsB,EAAS,KAAc,MAAO,CAC1G,IAAI,EAAW,EAAO,MAClB,GAAK,EAAS,EAAU,QAAQ,GAAY,EAAU,QAAU,EAEpE,EAAI,IAAI,EAAS,KAAM,IAAI,KAAK,EADxB,GAC8B,EAAS,SAAW,IAC5D,CAEA,OAAO,CACT,GAAG,CAAC,EAAW,IACf,OAAK,EACe,MAAM,cAAc,MAAM,SAAU,KAAM,EAAU,KAAI,SAAU,EAAM,GAC1F,IAAI,EAAW,EAAK,SAChB,EAAW,EAAK,SACpB,OAAoB,MAAM,cAAc,QAAS,CAC/C,IAAK,EAAS,KAAO,EAAI,EAAS,WAClC,SAAU,GACI,MAAM,cAAc,WAAY,KAAmB,MAAM,cAAc,SAAU,CAC/F,KAAM,EACN,SAAU,EACV,SAAU,EACV,KAAM,EAAQ,IAAI,EAAS,MAC3B,QAAS,WACH,EAAS,SAAS,EAAS,UAC3B,EAAS,SAAS,EAAU,EAAS,SAAW,GACtD,GACC,EAAS,OACd,KAjBmB,IAkBrB,CAEA,SAAS,kCAAkC,EAAG,GAAkB,IAAI,EAAuB,oBAAX,QAA0B,EAAE,OAAO,WAAa,EAAE,cAAe,GAAI,EAAI,OAAQ,EAAK,EAAG,KAAK,IAAI,KAAK,KAAK,GAAK,GAAI,MAAM,QAAQ,KAAO,EAAK,8BAA8B,KAAO,GAAkB,GAAyB,iBAAb,EAAE,OAAqB,CAAM,IAAI,EAAI,GAAI,IAAI,EAAI,EAAG,OAAO,WAAc,OAAI,GAAK,EAAE,OAAe,CAAE,MAAM,GAAe,CAAE,MAAM,EAAO,MAAO,EAAE,KAAQ,CAAG,CAAE,MAAM,IAAI,UAAU,wIAA0I,CAE/lB,SAAS,8BAA8B,EAAG,GAAU,GAAK,EAAL,CAAgB,GAAiB,iBAAN,EAAgB,OAAO,oBAAoB,EAAG,GAAS,IAAI,EAAI,OAAO,UAAU,SAAS,KAAK,GAAG,MAAM,GAAI,GAAiE,MAAnD,WAAN,GAAkB,EAAE,cAAa,EAAI,EAAE,YAAY,MAAgB,QAAN,GAAqB,QAAN,EAAoB,MAAM,KAAK,GAAc,cAAN,GAAqB,2CAA2C,KAAK,GAAW,oBAAoB,EAAG,QAA3G,CAA/O,CAAmW,CAEra,SAAS,oBAAoB,EAAK,IAAkB,MAAP,GAAe,EAAM,EAAI,UAAQ,EAAM,EAAI,QAAQ,IAAK,IAAI,EAAI,EAAG,EAAO,IAAI,MAAM,GAAM,EAAI,EAAK,IAAO,EAAK,GAAK,EAAI,GAAM,OAAO,CAAM,CACxL,IAAI,YAAc,iEAClB,SAAS,kBAAkB,GACzB,IAAI,EAAc,EAAM,YACpB,EAAU,EAAM,QAChB,EAAQ,EAAM,MACd,EAAS,EAAM,OACf,EAAY,EAAM,UAClB,EAAS,EAAY,OACrB,EAAO,EAAY,KACnB,EAAQ,EAAY,MACpB,EAAY,EAAY,UAExB,EAAY,MAAM,UAAS,GAC3B,EAAc,EAAU,GACxB,EAAiB,EAAU,GAE3B,EAAa,QAAQ,UAAU,CACjC,KAAM,EAAU,MAAS,KACzB,OAAQ,EAAU,EAAI,IAEpB,EAAO,EAAW,KAClB,EAAS,EAAW,OAEpB,EAAW,MAAM,SAAQ,WAC3B,IAAK,EAAW,OAAO,WAEvB,EAeA,IAbA,IAamE,EAb/D,EAAQ,WACV,IAAI,EAAW,EAAM,MAErB,GAAsB,WAAlB,EAAS,KACX,MAAO,CACL,EAAG,WACG,EAAS,SAAS,EAAS,UAC3B,EAAS,SAAS,EAAU,EAAS,SAAW,GACtD,EAGN,EAES,EAAY,kCAAkC,KAAqB,EAAQ,KAAa,MAAO,CACtG,IAAI,EAAO,IAEX,GAAoB,iBAAT,EAAmB,OAAO,EAAK,CAC5C,CACF,GAAG,CAAC,EAAW,IACf,MAAM,WAAU,WACV,IAAgB,IAClB,EAAe,GAEX,GAAW,GACb,IAAS,MAAK,SAAU,GAClB,GACF,EAAU,EAEd,IAGN,GAAG,CAAC,EAAQ,EAAW,EAAa,IACpC,IAAI,EAAa,CACf,KAAM,YACN,SAAU,GACV,UAAW,SACX,SAAU,IACV,aAAc,MACd,YAAa,IAEf,OAAK,EACe,MAAM,cAAc,QAAQ,SAAS,MAAO,CAC9D,KAAM,eAAiB,EACvB,aAAc,EACd,UAAW,GACG,MAAM,cAAc,KAAK,KAAM,kBAA2B,QAAE,CAAC,EAAG,EAAY,CAC1F,QAAS,EAAQ,SAAW,WAC1B,GAAO,IAAU,EAAM,SAAW,IAAyB,MAAM,cAAc,UAAW,CAC5F,MAAO,EAAM,MACb,SAAU,EAAM,SAChB,cAAe,KACf,SAAU,EACV,SAAU,IACV,MAAe,KAAR,EACP,KAAqB,UAAf,EAAM,KAAmB,OAAS,EAAM,OAC/B,MAAM,cAAc,QAAS,CAC5C,cAAe,EAAS,GACvB,GAA0B,MAAM,cAAc,gBAAiB,CAChE,UAAW,EACX,MAAO,EACP,UAAW,MApBQ,IAsBvB,CAEA,IAAI,YAAc,CAAC,WAAY,UAAW,OAAQ,SAAU,WAAY,QACxE,SAAS,SAAS,GAChB,IAAI,EAAkB,EAAM,SACxB,OAA+B,IAApB,EAA6B,EAAI,EAC5C,EAAiB,EAAM,QACvB,OAA6B,IAAnB,GAAmC,EAC7C,EAAc,EAAM,KACpB,OAAuB,IAAhB,EAAyB,OAAS,EACzC,EAAgB,EAAM,OACtB,OAA2B,IAAlB,EAA2B,CAAU,UAAT,EAAmB,IAAO,GAAK,EAAG,GAAK,EAC5E,EAAW,EAAM,SACjB,EAAc,EAAM,KACpB,OAAuB,IAAhB,GAAgC,EACvC,EAAO,uCAAgD,QAAE,EAAO,aAEhE,EAAY,MAAM,SAAS,QAC3B,EAAS,EAAU,GACnB,EAAY,EAAU,GAMtB,EAJa,QAAQ,UAAU,CACjC,MAAO,EAAU,EAAI,EACrB,MAAO,EAA2B,IAAhB,EAAW,GAAU,IAElB,MAEnB,EAAQ,MAAM,OAAO,MACzB,gBAAgB,IAAI,SAAU,GAC5B,IAAI,EAAS,EAAK,OACb,EAAM,UACX,EAAM,QAAQ,SAAS,GAAc,UAAT,EAAmB,GAAS,EACxD,EAAM,QAAQ,OAAO,EAAO,UAC5B,EAAM,QAAQ,SAAS,IAAI,EAAG,EAAG,GACnC,IACA,IAAI,EAAQ,EAGR,EAAiB,UAAT,EAAmB,EAAQ,GAAK,EAAQ,EACpD,OAAoB,MAAM,cAAc,QAAS,kBAA2B,QAAE,CAC5E,KAAM,YACL,GAAoB,MAAM,cAAc,WAAY,CACrD,QAAS,GACK,MAAM,cAAc,QAAS,CAC3C,SAAU,EACV,QAAS,EACT,OAAQ,IACO,MAAM,cAAc,QAAS,CAC5C,KAAM,gBACN,SAAU,GACI,MAAM,cAAc,QAAS,CAC3C,KAAM,UACN,IAAK,GACS,MAAM,cAAc,QAAQ,SAAS,MAAO,CAC1D,MAAO,EACP,aAAc,GACA,MAAM,cAAc,WAAY,CAC9C,KAAM,CAAC,EArBI,IACD,MAqBV,SAAU,MAAM,4BACD,MAAM,cAAc,QAAS,CAC5C,KAAM,eACN,aAAc,OACb,EAAS,KAAI,SAAU,GACxB,OAAoB,MAAM,cAAc,kBAAmB,CACzD,IAAK,EAAY,IACjB,YAAa,EACb,QAAS,EAAY,MAAQ,EAC7B,UAAW,EACX,MAAO,EACP,OAjCS,KAmCb,SACF,CAEA,IAAI,YAAc,CAAC,QACf,UAAY,8DACZ,eAAiB,8DACrB,SAAS,MAAM,GACb,IAAI,EAAO,EAAM,KACb,EAAO,uCAAgD,QAAE,EAAO,aAEhE,EAAU,SAAS,EAAO,eAAiB,WAC3C,EAAW,MAAM,YAAY,mBAAqB,EAAO,OAAS,UAAU,WAC9E,OAAO,IAAI,MAAM,qBAAqB,CACpC,IAAK,EACL,UAAW,GACX,aAAa,GAEjB,IACA,OAAoB,MAAM,cAAc,QAAS,kBAA2B,QAAE,CAC5E,KAAM,kBACL,GAAoB,MAAM,cAAc,OAAQ,CACjD,MAAO,KACP,SAAU,GACI,MAAM,cAAc,sBAAuB,CACzD,KAAM,CAAC,GAAI,OAEf,CAEA,IAAI,YAAc,CAAC,UAAW,WAAY,WAC1C,SAAS,IAAI,GACX,IAAI,EAAU,EAAM,QAChB,EAAkB,EAAM,SACxB,OAA+B,IAApB,EAA6B,CAAC,GAAW,EACpD,EAAU,EAAM,QAChB,EAAO,uCAAgD,QAAE,EAAO,aAEhE,EAAY,MAAM,UAAS,GAC3B,EAAU,EAAU,GACpB,EAAa,EAAU,GAEvB,EAAa,QAAQ,UAAU,kBAA2B,QAAE,CAC9D,MAAO,EAAU,OAAS,OAC1B,MAAO,EAAU,GAAM,GACtB,QAAQ,OAAO,QACd,EAAQ,EAAW,MACnB,EAAQ,EAAW,MAEnB,EAAQ,IA6BZ,OA5BA,MAAM,WAAU,WACd,IAAI,EAAU,SAAiB,GAC7B,OAAO,EAAS,KAAI,SAAU,GAC5B,OAAO,EAAE,aACX,IAAG,SAAS,EAAE,IAAI,cACpB,EAEI,EAAa,SAAoB,GAC/B,EAAE,KAAO,EAAQ,IAAI,GAAW,EACtC,EAEI,EAAgB,SAAuB,GACrC,EAAE,KAAO,EAAQ,IAAI,GAAW,EACtC,EAEI,EAAc,SAAqB,GACjC,EAAE,KAAO,EAAQ,KAAe,MAAX,GAA2B,EAAQ,GAC9D,EAKA,OAHA,SAAS,iBAAiB,UAAW,GACrC,SAAS,iBAAiB,QAAS,GACnC,SAAS,iBAAiB,WAAY,GAC/B,WACL,SAAS,oBAAoB,UAAW,GACxC,SAAS,oBAAoB,QAAS,GACtC,SAAS,oBAAoB,WAAY,EAC3C,CACF,GAAG,CAAC,EAAU,IACM,MAAM,cAAc,QAAS,kBAA2B,QAAE,CAC5E,KAAM,gBACL,GAAoB,MAAM,cAAc,QAAS,CAClD,cAAc,KACA,MAAM,cAAc,QAAQ,SAAS,MAAO,CAC1D,UAAW,GACG,MAAM,cAAc,QAAS,CAC3C,aAAc,MACA,MAAM,cAAc,WAAY,CAC9C,KAAM,CAAC,EAAG,EAAG,GACb,cAAc,MACA,MAAM,cAAc,QAAQ,SAAS,qBAAsB,CACzE,MAAO,KACS,MAAM,cAAc,KAAK,KAAM,CAC/C,MAAO,QACP,SAAU,GACV,YAAa,GACZ,MACL,CAEA,IAAI,YAAc,CAAC,QAAS,WAAY,aACxC,SAAS,OAAO,GACd,IAAI,EAAQ,EAAM,MACd,EAAW,EAAM,SACjB,EAAkB,EAAM,UACxB,EAAO,uCAAgD,QAAE,EAAO,aAEhE,EAAY,MAAM,UAAS,GAC3B,EAAa,EAAU,GACvB,EAAgB,EAAU,GAG1B,EAAe,MAAT,EAAgB,EAAQ,EAE9B,EAAS,SAAgB,GACvB,GAAU,EAAS,GACvB,EAAc,EAChB,EAEI,EAAO,KAEP,EAAQ,MACR,EAAgB,IAAP,EACT,EAAgB,GAAR,EAGR,EAAY,IAEZ,EAAa,QAAQ,UAAU,CACjC,KAAM,EAAM,QAAY,OACxB,UAAW,EAAM,UAAY,UAC7B,OAAQ,CACN,KAAM,MAGN,EAAO,EAAW,KAClB,EAAY,EAAW,UAGvB,EADa,MAAM,SAAS,IAAI,KAAK,EAAG,EAAG,IACvB,GAGpB,EADa,MAAM,SAAS,IAAI,KAAK,EAAG,EAAG,MACtB,GAEzB,OAAoB,MAAM,cAAc,QAAS,kBAA2B,QAAE,CAC5E,KAAM,yBACL,GAAoB,MAAM,cAAc,QAAQ,SAAS,MAAO,CACjE,aAAc,GACA,MAAM,cAAc,WAAY,CAC9C,MAAO,EACP,KAAM,EAAM,EAAS,KACL,MAAM,cAAc,OAAQ,CAC5C,KAAM,CAAC,EAAW,EAAW,GAC7B,QAAS,WACP,OAAO,GAAQ,EACjB,EACA,aAAc,EAAM,QAAY,OAChC,UAAW,IACI,MAAM,cAAc,OAAQ,CAC3C,KAAM,CAnCU,KACC,IAkCiB,GAClC,QAAS,WACP,OAAO,GAAQ,EACjB,EACA,UAAW,IACI,MAAM,cAAc,WAAY,CAC/C,KAAM,CAAC,EAAO,EAAQ,IACR,MAAM,cAAc,QAAQ,SAAS,kBAAmB,CACtE,MAAO,KACS,MAAM,cAAc,WAAY,CAChD,KAAM,CA7CU,KACC,IA4CiB,GAClC,SAAU,MAAM,eAChB,cAAe,OAEnB,CAEA,IAAI,eAA8B,MAAM,cAAc,CAAC,GACnD,WAAa,WACf,OAAO,MAAM,WAAW,eAC1B,EAEI,YAAc,WAChB,IAAI,EAAM,MAAM,UAAS,SAAU,GACjC,OAAO,EAAG,MACZ,IACA,OAAO,MAAM,SAAQ,WACnB,IAAI,EAAS,IAAI,MAAM,cAEvB,OADA,EAAI,IAAI,GACD,CACT,GAAG,CAAC,GACN,EACI,OAAS,WACX,OAAO,MAAM,SAAQ,WACnB,IAAI,EAAI,IAAI,MAAM,SAElB,OADA,EAAE,kBAAmB,EACd,CACT,GAAG,GACL,EAEI,YAAc,WAChB,IAAI,EAAc,aACd,EAAc,EAAY,YAC1B,EAAY,EAAY,UACxB,EAAmB,EAAY,iBAG/B,EADkB,iBACO,OAEzB,EAAW,cAEX,EAAY,MAAM,SAAS,GAC3B,EAAU,GACV,IAAI,EAAQ,EAAU,GAMtB,EAAa,MAAM,UAAS,GAC5B,EAAc,EAAW,GACzB,EAAiB,EAAW,GAEhC,MAAM,WAAU,WACd,OAAO,EAAe,GAAU,EAClC,GAAG,CAAC,EAAQ,IACZ,IAAI,EAAW,MAAM,SAAQ,WAC3B,MAAO,EACT,GAAG,IAEC,EAAa,SAAoB,GACnC,OAAO,EAAiB,IAAI,EAAE,MAAQ,EAAE,QAC1C,EA6EA,OA1EA,gBAAgB,GAAG,WACjB,GAAK,EAAL,CAEA,IAAI,GAAU,EAEd,EAAS,KAAI,SAAU,GAChB,EAAY,IAAI,EAAE,MACjB,EAAE,WACJ,EAAE,SAAS,SACX,EAAE,cAAW,GAGf,EAAS,OAAO,EAAS,QAAQ,GAAI,GACrC,GAAU,EAEd,IAgBA,IAdA,IAAI,EAAQ,WACV,IAAI,EAAK,EAAY,GAEhB,EAAS,MAAK,SAAU,GAC3B,OAAO,EAAE,KAAO,CAClB,MACE,EAAS,KAAK,CACZ,GAAI,EACJ,cAAU,IAEZ,GAAU,EAEd,EAES,EAAK,EAAG,EAAc,MAAM,KAAK,EAAY,QAAS,EAAK,EAAY,OAAQ,IACtF,IAIG,IAEH,EAAS,KAAI,SAAU,GAEnB,IAAI,EADD,EAAiB,IAAI,EAAE,MAGI,OAA7B,EAAc,EAAE,WAA6B,EAAY,SAC1D,EAAE,cAAW,EACb,GAAU,EAEd,IACA,EAAS,OAAO,GAAY,KAAI,SAAU,GAExC,IAAI,EAAY,EAAiB,IAAI,EAAE,IACvC,GAAK,GACA,EAAU,aAAf,CACA,QAAQ,IAAI,mBAAoB,EAAE,IAClC,IAAI,EAAY,SAAS,cAAc,SACvC,EAAU,UAAY,EAAU,aAEhC,EAAU,OAAQ,EAClB,EAAU,UAAW,EACrB,EAAU,MAAO,EAEjB,EAAU,aAAc,EACxB,IAAI,EAAW,IAAI,MAAM,gBAAgB,GACzC,EAAS,SAAS,OAAS,EAAE,GAC7B,EAAS,qBAAqB,EAAU,WACxC,EAAS,eAAe,GACxB,EAAS,mBAAmB,IAAK,IAAK,KAEtC,EAAE,SAAW,EACb,GAAU,CAjByB,CAkBrC,KAGE,GA3FG,EAAM,KAAK,SAoBI,CAwExB,IACO,CACT,EAEA,SAAS,kCAAkC,EAAG,GAAkB,IAAI,EAAuB,oBAAX,QAA0B,EAAE,OAAO,WAAa,EAAE,cAAe,GAAI,EAAI,OAAQ,EAAK,EAAG,KAAK,IAAI,KAAK,KAAK,GAAK,GAAI,MAAM,QAAQ,KAAO,EAAK,8BAA8B,KAAO,GAAkB,GAAyB,iBAAb,EAAE,OAAqB,CAAM,IAAI,EAAI,GAAI,IAAI,EAAI,EAAG,OAAO,WAAc,OAAI,GAAK,EAAE,OAAe,CAAE,MAAM,GAAe,CAAE,MAAM,EAAO,MAAO,EAAE,KAAQ,CAAG,CAAE,MAAM,IAAI,UAAU,wIAA0I,CAE/lB,SAAS,8BAA8B,EAAG,GAAU,GAAK,EAAL,CAAgB,GAAiB,iBAAN,EAAgB,OAAO,oBAAoB,EAAG,GAAS,IAAI,EAAI,OAAO,UAAU,SAAS,KAAK,GAAG,MAAM,GAAI,GAAiE,MAAnD,WAAN,GAAkB,EAAE,cAAa,EAAI,EAAE,YAAY,MAAgB,QAAN,GAAqB,QAAN,EAAoB,MAAM,KAAK,GAAc,cAAN,GAAqB,2CAA2C,KAAK,GAAW,oBAAoB,EAAG,QAA3G,CAA/O,CAAmW,CAEra,SAAS,oBAAoB,EAAK,IAAkB,MAAP,GAAe,EAAM,EAAI,UAAQ,EAAM,EAAI,QAAQ,IAAK,IAAI,EAAI,EAAG,EAAO,IAAI,MAAM,GAAM,EAAI,EAAK,IAAO,EAAK,GAAK,EAAI,GAAM,OAAO,CAAM,CACxL,SAAS,oBACP,IAAI,EAAc,aACd,EAAY,EAAY,UACxB,EAAa,EAAY,WAEzB,EAAO,MAAM,OAAO,MACpB,EAAM,MAAM,SAAQ,WACtB,OAAO,IAAI,MAAM,uBAAuB,GAAK,GAAK,EAAG,GACvD,GAAG,IACC,EAAM,MAAM,SAAQ,WACtB,OAAO,IAAI,MAAM,kBACnB,GAAG,IACC,EAAM,SACN,EAAW,cAGX,EAAK,MAAM,SAAQ,WACrB,OAAO,IAAI,sBAAsB,sBAFjB,GAGlB,GAAG,IACC,EAAgB,EAAW,SAAU,UAAU,SAAU,EAAG,GAC9D,GAAK,EAAE,KAAP,CACA,EAAE,EAAE,KAAK,MAAQ,EAAE,KACnB,IAAI,EAAQ,OAAO,KAAK,GAAG,KAAI,SAAU,GACvC,MAAO,CACL,GAAI,EACJ,EAAG,EAAE,GAAK,IAAI,GACd,EAAG,EAAE,GAAK,IAAI,GACd,EAAG,EAAE,GAAK,IAAI,GACd,EAAG,CACD,EAAG,EAAE,GAAK,IAAI,GACd,EAAG,EAAE,GAAK,IAAI,GACd,EAAG,EAAE,GAAK,IAAI,GACd,EAAG,EAAE,GAAK,IAAI,IAGpB,IACA,EAAG,MAAM,IAAI,CACX,GAAI,KAAK,SAAS,WAClB,MAAM,IAAI,MAAO,UACjB,MAAO,GAnBU,CAqBrB,IA+CA,OA7CA,gBA5BkB,IA4BW,SAAU,GACrC,IAAI,EAAS,EAAK,OACb,GACL,EAAc,KAAK,CACjB,IAAK,EAAO,SAAS,UACrB,IAAK,EAAO,WAAW,WAE3B,IAEA,gBAAgB,IAAI,WAClB,GAAK,EAAK,QAAV,CACA,IAAI,EAAW,EAAG,kBAAkB,iBACpC,GAAK,EAAL,CAGA,IAFA,IAEwE,EAFpE,EAAI,EAEC,EAAY,kCAAkC,EAAS,SAAiB,EAAQ,KAAa,MAAO,CAC3G,IAAI,EAEA,EAAc,EAAM,MACpB,EAAI,EAAY,EAChB,EAAI,EAAY,EAChB,EAAI,EAAY,EAChB,EAAI,EAAY,EACpB,EAAI,SAAS,IAAI,EAAG,EAAG,GACvB,EAAI,SAAS,GAAK,GAElB,IAAI,EAAO,EACX,EAAI,WAAW,IAAI,EAAK,EAAG,EAAK,EAAG,EAAK,EAAG,EAAK,GAChD,EAAI,eACJ,EAAK,QAAQ,YAAY,EAAG,EAAI,QAChC,IAAI,EAA0C,OAA9B,EAAc,EAAS,SAAc,EAAS,EAAY,SAEtE,IACF,EAAI,OAAO,UAAU,EAAS,SAAU,EAAS,WAAY,EAAS,OACtE,EAAS,SAAS,GAAK,KAAK,GAE5B,EAAS,gBAGX,GACF,CAEA,EAAK,QAAQ,eAAe,aAAc,CA9BrB,CAFI,CAiC3B,IAEK,EAIe,MAAM,cAAc,QAAS,CAC/C,KAAM,qBACL,EAAS,KAAI,SAAU,GACxB,OAAO,EAAO,UAAyB,MAAM,cAAc,YAAa,CACtE,IAAK,EAAO,SAAS,KACrB,OAAQ,EAAO,SACf,kBAAkB,GAEtB,IAAiB,MAAM,cAAc,gBAAiB,CACpD,IAAK,EACL,KAAM,CAAC,EAAK,EAAK,EAAS,QAC1B,kBAAkB,KAdX,IAgBX,CAEA,IAAI,eAAiB,SAAwB,GAK3C,YAJiB,IAAb,IACF,EAAW,OAAO,SAAS,UAGtB,CAAC,YAAa,YAAa,GAAI,OAAO,SAAS,IAAa,EAAS,WAAW,aAAe,EAAS,WAAW,UAAY,EAAS,SAAS,SAC1J,EAEI,WAAa,4BACb,YAAc,KACd,eAA8B,WAChC,SAAS,EAAe,GACtB,QAAQ,KAAK,yBACT,EAAK,KAAI,KAAK,OAAS,EAAK,GAClC,CAEA,IAAI,EAAS,EAAe,UAkK5B,OAhKA,EAAO,UAAY,WACjB,IAAI,EAAM,aAAa,QAAQ,YAC/B,IAAK,EAAK,MAAO,GAEjB,IACE,OAAO,KAAK,MAAM,EACpB,CAAE,MAAO,GACP,MAAO,EACT,CACF,EAEA,EAAO,WAAa,SAAoB,GACtC,aAAa,QAAQ,WAAY,KAAK,UAAU,GAClD,EAEA,EAAO,WAAa,WAClB,IAAI,EAAQ,KAAK,YACb,GAAO,IAAI,MAAO,UAClB,EAAW,EAAM,QAAO,SAAU,GACpC,IAAI,EAAO,EAAO,EAAK,WAA2B,GAAd,YAAmB,IAEvD,OADK,GAAM,QAAQ,KAAK,+BAAgC,EAAK,IACtD,CACT,IACA,KAAK,WAAW,EAClB,EAEA,EAAO,KAAoB,WACzB,IAAI,EAAQ,2BAAoC,QAAgB,mBAAmB,MAAK,SAAS,IAC/F,IAAI,EAAM,EACV,OAAO,mBAAmB,MAAK,SAAkB,GAC/C,OACE,OAAQ,EAAS,KAAO,EAAS,MAC/B,KAAK,EACH,GAAI,KAAK,OAAQ,CACf,EAAS,KAAO,EAChB,KACF,CAGA,OADA,QAAQ,MAAM,4CACP,EAAS,OAAO,UAEzB,KAAK,EAUH,OATA,KAAK,aACL,QAAQ,KAAK,wDACb,EAAO,CACL,GAAI,KAAK,OACT,WAAW,IAAI,MAAO,YAExB,EAAQ,KAAK,aACP,KAAK,GACX,KAAK,WAAW,GACT,EAAS,OAAO,SAAU,EAAM,KAAI,SAAU,GACnD,OAAO,EAAK,EACd,KAEF,KAAK,GACL,IAAK,MACH,OAAO,EAAS,OAGxB,GAAG,EAAS,KACd,KAMA,OAJA,WACE,OAAO,EAAM,MAAM,KAAM,UAC3B,CAGF,CA1C2B,GA4C3B,EAAO,MAAqB,WAC1B,IAAI,EAAS,2BAAoC,QAAgB,mBAAmB,MAAK,SAAS,IAChG,IAEI,EAAO,EAFP,EAAQ,KAGZ,OAAO,mBAAmB,MAAK,SAAmB,GAChD,OACE,OAAQ,EAAU,KAAO,EAAU,MACjC,KAAK,EACH,GAAI,KAAK,OAAQ,CACf,EAAU,KAAO,EACjB,KACF,CAGA,OADA,QAAQ,MAAM,4CACP,EAAU,OAAO,UAE1B,KAAK,EACH,QAAQ,KAAK,6CACb,EAAQ,KAAK,aACb,EAAQ,EAAM,WAAU,SAAU,GAChC,OAAO,EAAK,KAAO,EAAM,MAC3B,KAEY,EACV,QAAQ,MAAM,gDAEd,EAAM,OAAO,EAAO,GACpB,KAAK,WAAW,IAGpB,KAAK,EACL,IAAK,MACH,OAAO,EAAU,OAGzB,GAAG,EAAU,KACf,KAMA,OAJA,WACE,OAAO,EAAO,MAAM,KAAM,UAC5B,CAGF,CA5C4B,GA8C5B,EAAO,KAAoB,WACzB,IAAI,EAAQ,2BAAoC,QAAgB,mBAAmB,MAAK,SAAS,IAC/F,IAEI,EAAO,EAFP,EAAS,KAGb,OAAO,mBAAmB,MAAK,SAAmB,GAChD,OACE,OAAQ,EAAU,KAAO,EAAU,MACjC,KAAK,EACH,GAAI,KAAK,OAAQ,CACf,EAAU,KAAO,EACjB,KACF,CAGA,OADA,QAAQ,MAAM,wCACP,EAAU,OAAO,UAAU,GAEpC,KAAK,EAUH,OATA,EAAQ,KAAK,YACb,GAAkB,EAClB,EAAM,KAAI,SAAU,GACd,EAAK,KAAO,EAAO,SACrB,EAAK,WAAY,IAAI,MAAO,UAC5B,GAAkB,EAEtB,IACA,KAAK,WAAW,GACT,EAAU,OAAO,SAAU,GAEpC,KAAK,EACL,IAAK,MACH,OAAO,EAAU,OAGzB,GAAG,EAAU,KACf,KAMA,OAJA,WACE,OAAO,EAAM,MAAM,KAAM,UAC3B,CAGF,CA1C2B,GA4CpB,CACT,CAzKkC,GA2K9B,cAA6B,WAC/B,SAAS,EAAc,EAAM,QACZ,IAAX,IACF,EAAS,CAAC,GAGZ,QAAQ,KAAK,wBAET,EAAO,UAAW,KAAK,UAAY,EAAO,UAAmB,EAAO,UAAW,KAAK,UAAY,EAAO,UAAe,KAAK,UAAY,OAAO,SAAS,SAE3J,KAAK,KAAO,EAAO,MAAQ,gCACvB,EAAO,kBAAiB,KAAK,gBAAkB,EAAO,iBACtD,EAAK,KAAI,KAAK,OAAS,EAAK,GAClC,CAEA,IAAI,EAAS,EAAc,UA8M3B,OA5MA,EAAO,YAA2B,WAChC,IAAI,EAAe,2BAAoC,QAAgB,mBAAmB,MAAK,SAAS,EAAQ,EAAM,GACpH,OAAO,mBAAmB,MAAK,SAAkB,GAC/C,OACE,OAAQ,EAAS,KAAO,EAAS,MAC/B,KAAK,EAEH,OADA,EAAS,KAAO,EACT,mBAA4B,QAAE,KAAK,KAAO,aAAe,EAAM,CACpE,OAAQ,OACR,KAAM,KAAK,UAAU,GACrB,QAAS,CACP,eAAgB,sBAItB,KAAK,EACH,OAAO,EAAS,OAAO,SAAU,EAAS,MAE5C,KAAK,EACL,IAAK,MACH,OAAO,EAAS,OAGxB,GAAG,EAAS,KACd,KAMA,OAJA,SAAqB,EAAI,GACvB,OAAO,EAAa,MAAM,KAAM,UAClC,CAGF,CA/BkC,GAiClC,EAAO,KAAoB,WACzB,IAAI,EAAQ,2BAAoC,QAAgB,mBAAmB,MAAK,SAAS,IAC/F,IAAI,EAAM,EAAU,EACpB,OAAO,mBAAmB,MAAK,SAAmB,GAChD,OACE,OAAQ,EAAU,KAAO,EAAU,MACjC,KAAK,EACH,GAAI,KAAK,OAAQ,CACf,EAAU,KAAO,EACjB,KACF,CAGA,OADA,QAAQ,MAAM,4CACP,EAAU,OAAO,UAE1B,KAAK,EAOH,OANA,EAAO,CACL,QAAS,KAAK,QAEZ,KAAK,UAAW,EAAK,WAAa,KAAK,UAAe,EAAK,MAAQ,KAAK,UACxE,KAAK,kBAAiB,EAAK,SAAW,KAAK,iBAC/C,EAAU,KAAO,EACV,KAAK,YAAY,OAAQ,GAElC,KAAK,EAGH,OAFA,EAAW,EAAU,KACrB,EAAU,KAAO,GACV,EAAS,OAElB,KAAK,GAGH,GAFA,EAAO,EAAU,KAES,MAApB,EAAS,OAAiB,CAC9B,EAAU,KAAO,GACjB,KACF,CAIA,OADA,QAAQ,MAAM,qBAAsB,EAAK,SAClC,EAAU,OAAO,cAAU,GAEpC,KAAK,GAGH,OADA,KAAK,UAAY,EAAK,WACf,EAAU,OAAO,SAAU,EAAK,UAEzC,KAAK,GACL,IAAK,MACH,OAAO,EAAU,OAGzB,GAAG,EAAU,KACf,KAMA,OAJA,WACE,OAAO,EAAM,MAAM,KAAM,UAC3B,CAGF,CA3D2B,GA6D3B,EAAO,MAAqB,WAC1B,IAAI,EAAS,2BAAoC,QAAgB,mBAAmB,MAAK,SAAS,IAChG,IAAI,EAAM,EAAU,EACpB,OAAO,mBAAmB,MAAK,SAAmB,GAChD,OACE,OAAQ,EAAU,KAAO,EAAU,MACjC,KAAK,EACH,GAAO,KAAK,WAAc,KAAK,OAAS,CACtC,EAAU,KAAO,EACjB,KACF,CAGA,OADA,QAAQ,MAAM,wCACP,EAAU,OAAO,UAE1B,KAAK,EAMH,OALA,EAAO,CACL,QAAS,KAAK,OACd,WAAY,KAAK,WAEnB,EAAU,KAAO,EACV,KAAK,YAAY,QAAS,GAEnC,KAAK,EAGH,GAA0B,OAF1B,EAAW,EAAU,MAEN,OAAiB,CAC9B,EAAU,KAAO,GACjB,KACF,CAGA,OADA,EAAU,KAAO,GACV,EAAS,OAElB,KAAK,GACH,EAAO,EAAU,KACjB,QAAQ,MAAM,oBAAqB,EAAK,SAE1C,KAAK,GACL,IAAK,MACH,OAAO,EAAU,OAGzB,GAAG,EAAU,KACf,KAMA,OAJA,WACE,OAAO,EAAO,MAAM,KAAM,UAC5B,CAGF,CAnD4B,GAqD5B,EAAO,KAAoB,WACzB,IAAI,EAAQ,2BAAoC,QAAgB,mBAAmB,MAAK,SAAS,IAC/F,IAAI,EAAM,EAAU,EACpB,OAAO,mBAAmB,MAAK,SAAmB,GAChD,OACE,OAAQ,EAAU,KAAO,EAAU,MACjC,KAAK,EACH,GAAO,KAAK,WAAc,KAAK,OAAS,CACtC,EAAU,KAAO,EACjB,KACF,CAGA,OADA,QAAQ,MAAM,uCACP,EAAU,OAAO,UAAU,GAEpC,KAAK,EAMH,OALA,EAAO,CACL,QAAS,KAAK,OACd,WAAY,KAAK,WAEnB,EAAU,KAAO,EACV,KAAK,YAAY,OAAQ,GAElC,KAAK,EAGH,GAA0B,OAF1B,EAAW,EAAU,MAEN,OAAiB,CAC9B,EAAU,KAAO,GACjB,KACF,CAGA,OADA,EAAU,KAAO,GACV,EAAS,OAElB,KAAK,GAGH,OAFA,EAAO,EAAU,KACjB,QAAQ,MAAM,yBAA0B,EAAK,SACtC,EAAU,OAAO,UAAU,GAEpC,KAAK,GACH,OAAO,EAAU,OAAO,UAAU,GAEpC,KAAK,GACL,IAAK,MACH,OAAO,EAAU,OAGzB,GAAG,EAAU,KACf,KAMA,OAJA,WACE,OAAO,EAAM,MAAM,KAAM,UAC3B,CAGF,CAvD2B,GAyDpB,CACT,CA9NiC,GAgO7B,UAAY,EACZ,UAAY,SAAmB,EAAiB,EAAW,GAC7D,IAAI,EAAY,MAAM,OAAO,GACzB,EAAc,WAAW,GAAuB,GAAlB,IAC9B,EAAc,WAAW,IAC7B,MAAM,UAAS,SAAU,GACvB,IAAI,EAAQ,EAAK,OACZ,GAAa,EAAU,QAAU,YACrB,EAAU,QAAU,EAElB,EAAc,GAAa,QAAQ,IAItD,EAAU,OAAO,MAAK,SAAU,GACzB,EAGH,EAAU,QAAU,EAFpB,EAAU,SAAW,EAKnB,EAAU,QAAU,YACtB,QAAQ,MAAM,4CACd,IAEJ,GACF,GACF,EAEA,SAAS,kCAAkC,EAAG,GAAkB,IAAI,EAAuB,oBAAX,QAA0B,EAAE,OAAO,WAAa,EAAE,cAAe,GAAI,EAAI,OAAQ,EAAK,EAAG,KAAK,IAAI,KAAK,KAAK,GAAK,GAAI,MAAM,QAAQ,KAAO,EAAK,8BAA8B,KAAO,GAAkB,GAAyB,iBAAb,EAAE,OAAqB,CAAM,IAAI,EAAI,GAAI,IAAI,EAAI,EAAG,OAAO,WAAc,OAAI,GAAK,EAAE,OAAe,CAAE,MAAM,GAAe,CAAE,MAAM,EAAO,MAAO,EAAE,KAAQ,CAAG,CAAE,MAAM,IAAI,UAAU,wIAA0I,CAE/lB,SAAS,8BAA8B,EAAG,GAAU,GAAK,EAAL,CAAgB,GAAiB,iBAAN,EAAgB,OAAO,oBAAoB,EAAG,GAAS,IAAI,EAAI,OAAO,UAAU,SAAS,KAAK,GAAG,MAAM,GAAI,GAAiE,MAAnD,WAAN,GAAkB,EAAE,cAAa,EAAI,EAAE,YAAY,MAAgB,QAAN,GAAqB,QAAN,EAAoB,MAAM,KAAK,GAAc,cAAN,GAAqB,2CAA2C,KAAK,GAAW,oBAAoB,EAAG,QAA3G,CAA/O,CAAmW,CAEra,SAAS,oBAAoB,EAAK,IAAkB,MAAP,GAAe,EAAM,EAAI,UAAQ,EAAM,EAAI,QAAQ,IAAK,IAAI,EAAI,EAAG,EAAO,IAAI,MAAM,GAAM,EAAI,EAAK,IAAO,EAAK,GAAK,EAAI,GAAM,OAAO,CAAM,CAYxL,IAAI,cAA6B,WAC/B,SAAS,EAAc,EAAI,EAAS,GAClC,KAAK,GAAK,EACV,KAAK,QAAU,EACf,KAAK,YAAc,EACnB,KAAK,MAAQ,CAAC,CAChB,CAEA,IAAI,EAAS,EAAc,UAoB3B,OAlBA,EAAO,KAAO,SAAc,GAC1B,IAAK,IAA+E,EAA3E,EAAY,kCAAkC,KAAK,YAAY,aAAqB,EAAQ,KAAa,MAAO,CACvH,IACI,EADc,EAAM,MACD,GAEnB,EAAK,MACP,EAAK,KAAK,CACR,GAAI,KAAK,GACT,KAAM,GAGZ,CACF,EAEA,EAAO,QAAU,SAAiB,GAChC,KAAK,QAAQ,EAAS,KAAK,MAC7B,EAEO,CACT,CA7BiC,GA+BjC,SAAS,kCAAkC,EAAG,GAAkB,IAAI,EAAuB,oBAAX,QAA0B,EAAE,OAAO,WAAa,EAAE,cAAe,GAAI,EAAI,OAAQ,EAAK,EAAG,KAAK,IAAI,KAAK,KAAK,GAAK,GAAI,MAAM,QAAQ,KAAO,EAAK,8BAA8B,KAAO,GAAkB,GAAyB,iBAAb,EAAE,OAAqB,CAAM,IAAI,EAAI,GAAI,IAAI,EAAI,EAAG,OAAO,WAAc,OAAI,GAAK,EAAE,OAAe,CAAE,MAAM,GAAe,CAAE,MAAM,EAAO,MAAO,EAAE,KAAQ,CAAG,CAAE,MAAM,IAAI,UAAU,wIAA0I,CAE/lB,SAAS,8BAA8B,EAAG,GAAU,GAAK,EAAL,CAAgB,GAAiB,iBAAN,EAAgB,OAAO,oBAAoB,EAAG,GAAS,IAAI,EAAI,OAAO,UAAU,SAAS,KAAK,GAAG,MAAM,GAAI,GAAiE,MAAnD,WAAN,GAAkB,EAAE,cAAa,EAAI,EAAE,YAAY,MAAgB,QAAN,GAAqB,QAAN,EAAoB,MAAM,KAAK,GAAc,cAAN,GAAqB,2CAA2C,KAAK,GAAW,oBAAoB,EAAG,QAA3G,CAA/O,CAAmW,CAEra,SAAS,oBAAoB,EAAK,IAAkB,MAAP,GAAe,EAAM,EAAI,UAAQ,EAAM,EAAI,QAAQ,IAAK,IAAI,EAAI,EAAG,EAAO,IAAI,MAAM,GAAM,EAAI,EAAK,IAAO,EAAK,GAAK,EAAI,GAAM,OAAO,CAAM,CAUxL,IAAI,YAA2B,WAC7B,SAAS,EAAY,EAAI,EAAS,GAChC,KAAK,GAAK,EACV,KAAK,QAAU,EACf,KAAK,UAAW,IAAI,MAAO,UAC3B,KAAK,YAAc,EACnB,KAAK,MAAQ,CAAC,CAChB,CAEA,IAAI,EAAS,EAAY,UA2CzB,OAzCA,EAAO,KAAO,SAAc,GAC1B,IAAK,IAA+E,EAA3E,EAAY,kCAAkC,KAAK,YAAY,aAAqB,EAAQ,KAAa,MAAO,CACvH,IACI,EADc,EAAM,MACD,GAEnB,EAAK,MACP,EAAK,KAAK,CACR,GAAI,KAAK,GACT,KAAM,GAGZ,CAEA,KAAK,QAAQ,CACX,GAAI,KAAK,GACT,KAAM,GACL,KAAK,MACV,EAEA,EAAO,QAAU,SAAiB,GAC5B,EAAQ,MACN,EAAQ,MAAQ,EAAQ,OACtB,EAAQ,KAAO,KAAK,WACtB,KAAK,MAAQ,EAAQ,MACrB,KAAK,SAAW,EAAQ,KAAO,IAInC,KAAK,QAAQ,EAAS,KAAK,MAE/B,EAEA,EAAO,MAAQ,SAAe,GAC5B,EAAK,KAAK,CACR,GAAI,KAAK,GACT,KAAM,KAAK,SACX,MAAO,KAAK,MACZ,OAAO,GAEX,EAEO,CACT,CArD+B,GAuD/B,SAAS,kCAAkC,EAAG,GAAkB,IAAI,EAAuB,oBAAX,QAA0B,EAAE,OAAO,WAAa,EAAE,cAAe,GAAI,EAAI,OAAQ,EAAK,EAAG,KAAK,IAAI,KAAK,KAAK,GAAK,GAAI,MAAM,QAAQ,KAAO,EAAK,8BAA8B,KAAO,GAAkB,GAAyB,iBAAb,EAAE,OAAqB,CAAM,IAAI,EAAI,GAAI,IAAI,EAAI,EAAG,OAAO,WAAc,OAAI,GAAK,EAAE,OAAe,CAAE,MAAM,GAAe,CAAE,MAAM,EAAO,MAAO,EAAE,KAAQ,CAAG,CAAE,MAAM,IAAI,UAAU,wIAA0I,CAE/lB,SAAS,8BAA8B,EAAG,GAAU,GAAK,EAAL,CAAgB,GAAiB,iBAAN,EAAgB,OAAO,oBAAoB,EAAG,GAAS,IAAI,EAAI,OAAO,UAAU,SAAS,KAAK,GAAG,MAAM,GAAI,GAAiE,MAAnD,WAAN,GAAkB,EAAE,cAAa,EAAI,EAAE,YAAY,MAAgB,QAAN,GAAqB,QAAN,EAAoB,MAAM,KAAK,GAAc,cAAN,GAAqB,2CAA2C,KAAK,GAAW,oBAAoB,EAAG,QAA3G,CAA/O,CAAmW,CAEra,SAAS,oBAAoB,EAAK,IAAkB,MAAP,GAAe,EAAM,EAAI,UAAQ,EAAM,EAAI,QAAQ,IAAK,IAAI,EAAI,EAAG,EAAO,IAAI,MAAM,GAAM,EAAI,EAAK,IAAO,EAAK,GAAK,EAAI,GAAM,OAAO,CAAM,CACxL,IAAI,YAAc,SAAqB,GACrC,IAAI,EAAW,MAAM,SAAQ,WAC3B,OAAO,IAAI,GACb,GAAG,IAmDH,MAAO,CACL,QAlDY,SAAiB,GAC7B,IAAK,IAAuE,EAAnE,EAAY,kCAAkC,EAAS,aAAqB,EAAQ,KAAa,MAAO,CAC/G,IAAI,EAAc,EAAM,MACpB,EAAM,EAAY,GAClB,EAAU,EAAY,GAEtB,GAAO,EAAQ,IACjB,EAAQ,QAAQ,EAEpB,CACF,EAyCE,MAvCU,SAAe,GACzB,IAAK,IAAwE,EAApE,EAAa,kCAAkC,EAAS,aAAsB,EAAS,KAAc,MAAO,CACnH,IACI,EADe,EAAO,MACC,GAEvB,aAAmB,aACrB,EAAQ,MAAM,EAElB,CACF,EA+BE,WA7Be,SAAoB,EAAI,EAAM,GAC7C,IAAI,EAAU,MAAM,SAAQ,WAC1B,MAAa,WAAT,EAA0B,IAAI,cAAc,EAAI,EAAS,GAChD,SAAT,EAAwB,IAAI,YAAY,EAAI,EAAS,GAClD,IAAI,cAAc,EAAI,EAAS,EACxC,GAAG,CAAC,EAAI,IAkBR,OAhBA,MAAM,WAAU,WACd,EAAQ,QAAU,CACpB,GAAG,CAAC,EAAS,IAEb,MAAM,WAAU,WACd,GAAI,EAAS,IAAI,EAAQ,IACvB,MAAM,IAAI,MAAM,OAAS,EAAQ,GAAK,gDAKxC,OAHE,EAAS,IAAI,EAAQ,GAAI,GAGpB,WACA,EAAS,IAAI,EAAQ,KAC1B,EAAiB,OAAE,EAAQ,GAC7B,CACF,GAAG,CAAC,IACG,CACT,EAOF,EAOI,cAAgB,SAAuB,EAAS,QAClC,IAAZ,IACF,GAAU,GAGZ,IACI,EADkB,iBACO,OAEzB,EAAY,MAAM,UAAS,GAC3B,EAAc,EAAU,GACxB,EAAiB,EAAU,GAE/B,MAAM,WAAU,WACd,OAAO,EAAe,GAAU,EAClC,GAAG,CAAC,EAAQ,IAOZ,IAAI,EAAa,MAAM,WACnB,EAAc,EAAW,GACzB,EAAiB,EAAW,GAsBhC,OAnBA,MAAM,WAAU,WACd,IAAI,GAGC,IAbE,CAAC,iBAAkB,mBAAoB,iBAAkB,OAAQ,SAAU,QAAQ,SAAS,UAAU,WAC7G,UAAU,UAAU,SAAS,QAAU,eAAgB,WAY9B,GAC2B,OAAnD,EAAwB,UAAU,eAAiC,EAAsB,aAAa,CACrG,MAAO,kBAA2B,QAAE,CAClC,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,GAChB,EAAgB,CACjB,SAAU,GACR,CAAC,KACJ,MAAK,SAAU,GAChB,EAAe,EACjB,IAAU,OAAE,SAAU,GACpB,QAAQ,MAAM,EAChB,GACF,GAAG,CAAC,EAAS,EAAa,IACnB,CACT,EAEA,SAAS,gCAAgC,EAAG,GAAkB,IAAI,EAAuB,oBAAX,QAA0B,EAAE,OAAO,WAAa,EAAE,cAAe,GAAI,EAAI,OAAQ,EAAK,EAAG,KAAK,IAAI,KAAK,KAAK,GAAK,GAAI,MAAM,QAAQ,KAAO,EAAK,4BAA4B,KAAO,GAAkB,GAAyB,iBAAb,EAAE,OAAqB,CAAM,IAAI,EAAI,GAAI,IAAI,EAAI,EAAG,OAAO,WAAc,OAAI,GAAK,EAAE,OAAe,CAAE,MAAM,GAAe,CAAE,MAAM,EAAO,MAAO,EAAE,KAAQ,CAAG,CAAE,MAAM,IAAI,UAAU,wIAA0I,CAE3lB,SAAS,4BAA4B,EAAG,GAAU,GAAK,EAAL,CAAgB,GAAiB,iBAAN,EAAgB,OAAO,kBAAkB,EAAG,GAAS,IAAI,EAAI,OAAO,UAAU,SAAS,KAAK,GAAG,MAAM,GAAI,GAAiE,MAAnD,WAAN,GAAkB,EAAE,cAAa,EAAI,EAAE,YAAY,MAAgB,QAAN,GAAqB,QAAN,EAAoB,MAAM,KAAK,GAAc,cAAN,GAAqB,2CAA2C,KAAK,GAAW,kBAAkB,EAAG,QAAzG,CAA7O,CAA+V,CAE/Z,SAAS,kBAAkB,EAAK,IAAkB,MAAP,GAAe,EAAM,EAAI,UAAQ,EAAM,EAAI,QAAQ,IAAK,IAAI,EAAI,EAAG,EAAO,IAAI,MAAM,GAAM,EAAI,EAAK,IAAO,EAAK,GAAK,EAAI,GAAM,OAAO,CAAM,CAUtL,IAAI,oBAAsB,SAA6B,EAAS,EAAM,EAAa,GACjF,IAAI,EAAa,MAAM,SAAQ,WAC7B,OAAO,IAAI,GACb,GAAG,IACC,EAAc,cAAc,EAAS,GA4DzC,OA1DA,MAAM,WAAU,WACd,GAAK,GAAS,GAAgB,EAA9B,CAEA,IAAI,EAAkB,SAAyB,GAC7C,QAAQ,IAAI,oCAAqC,EAAU,MAC3D,EAAU,OAAO,GACjB,EAAW,IAAI,EAAU,KAAM,GAC/B,EAAU,GAAG,SAAS,WACpB,QAAQ,IAAI,iCAAkC,EAAU,MACxD,EAAmB,OAAE,EAAU,KACjC,IACA,EAAU,GAAG,SAAS,SAAU,GAC9B,QAAQ,MAAM,oCAAqC,EAAU,KAAM,GACnE,EAAmB,OAAE,EAAU,KACjC,GACF,EAEI,EAAO,SAAc,GACvB,QAAQ,IAAI,uBAAwB,EAAK,MACzC,EAAgB,EAAK,KAAK,EAAK,KAAM,IACrC,EAAK,GAAG,SAAS,WACf,QAAQ,IAAI,iCAAkC,EAAK,MACnD,EAAmB,OAAE,EAAK,KAC5B,GACF,EASA,EAAK,GAAG,OAAQ,GAChB,EAAK,GAAG,cARa,SAAwB,GAC3C,EAAK,GAAG,QAAQ,WACd,OAAO,EAAK,EACd,GACF,IAMA,IAAK,IAA8D,EAA1D,EAAY,gCAAgC,KAAuB,EAAQ,KAAa,MAAO,CACtG,IAAI,EAAc,EAAM,MACpB,EAAS,EAAY,GACrB,EAAO,EAAY,GACvB,GAAI,EAAW,IAAI,GAAS,OAC5B,EAAK,EACP,CAEA,OAAO,WACL,EAAK,eAAe,OAAQ,GAC5B,EAAK,eAAe,aAAc,EACpC,CA9C6C,CA+C/C,GAAG,CAAC,EAAa,EAAM,EAAa,EAAY,IAEhD,MAAM,WAAU,WACT,GACH,EAAW,SAAQ,SAAU,GAC3B,EAAK,QACL,EAAmB,OAAE,EAAK,KAC5B,GAEJ,GAAG,CAAC,EAAS,IACN,CACL,iBAAkB,EAClB,YAAa,EAEjB,EAEI,IAAM,uBAEN,YAAc,MAEd,qBAAuB,SAA8B,GACvD,IAAI,EAAQ,CACV,WAAY,EACZ,MAAM,IAAI,MAAO,WAEnB,aAAa,QAAQ,IAAK,KAAK,UAAU,GAC3C,EAEI,mBAAqB,WACvB,IAAI,EAAM,aAAa,QAAQ,KAC/B,GAAK,EAEL,IACE,IAAI,EAAM,KAAK,MAAM,GAErB,OAAI,IAAI,MAAO,UAAY,EAAI,KAAO,iBACpC,aAAa,WAAW,KAInB,EAAI,UACb,CAAE,MAAO,GACP,MACF,CACF,EAEI,kBAAiC,WACnC,IAAI,EAAO,2BAAoC,QAAgB,mBAAmB,MAAK,SAAS,EAAQ,GACtG,IAAI,EAAO,EAAK,EAAM,EACtB,OAAO,mBAAmB,MAAK,SAAkB,GAC/C,OACE,OAAQ,EAAS,KAAO,EAAS,MAC/B,KAAK,EAOH,QANa,IAAT,IACF,EAAO,mCAGT,EAAQ,sBAEI,CACV,EAAS,KAAO,EAChB,KACF,CAEA,OAAO,EAAS,OAAO,SAAU,GAEnC,KAAK,EAGH,OAFA,EAAS,KAAO,EAChB,EAAS,KAAO,EACT,MAAM,EAAO,qBAEtB,KAAK,EAGH,OAFA,EAAM,EAAS,KACf,EAAS,KAAO,GACT,EAAI,OAEb,KAAK,GAIH,OAHA,EAAO,EAAS,KAChB,EAAU,EAAK,WACf,qBAAqB,GACd,EAAS,OAAO,SAAU,GAEnC,KAAK,GAIH,OAHA,EAAS,KAAO,GAChB,EAAS,GAAK,EAAgB,MAAE,GAChC,QAAQ,MAAM,8BAA+B,EAAS,IAC/C,EAAS,OAAO,cAAU,GAEnC,KAAK,GACL,IAAK,MACH,OAAO,EAAS,OAGxB,GAAG,EAAS,KAAM,CAAC,CAAC,EAAG,KACzB,KAEA,OAAO,SAA2B,GAChC,OAAO,EAAK,MAAM,KAAM,UAC1B,CACF,CArDqC,GAuDjC,cAAgB,SAAuB,GACzC,IAAI,EAAY,MAAM,UAAS,GAC3B,EAAY,EAAU,GACtB,EAAe,EAAU,GAEzB,EAAa,MAAM,WACnB,EAAO,EAAW,GAClB,EAAU,EAAW,GAErB,EAAc,MAAM,SAAQ,WAC9B,OAAO,IAAI,GACb,GAAG,IAEC,EAAa,MAAM,WACnB,EAAY,EAAW,GACvB,EAAe,EAAW,GAE1B,EAAW,YAAY,GAEvB,EAAqB,SAA4B,GACnD,EAAK,GAAG,QAAQ,WACd,QAAQ,IAAI,8BAA+B,EAAK,MAChD,EAAK,GAAG,QAAQ,SAAU,GACxB,OAAO,EAAS,QAAQ,kBAA2B,QAAE,CACnD,KAAM,GACL,GACL,IACA,EAAK,GAAG,SAAS,WACf,QAAQ,IAAI,+BACZ,EAAoB,OAAE,EAAK,KAC7B,IACA,EAAK,GAAG,SAAS,WACf,QAAQ,IAAI,+BACZ,EAAoB,OAAE,EAAK,KAC7B,IACA,EAAS,MAAM,GACf,EAAY,IAAI,EAAK,KAAM,EAC7B,GACF,EAGI,EAAuB,WACzB,IAAI,EAAO,2BAAoC,QAAgB,mBAAmB,MAAK,SAAS,EAAS,GACvG,IAAI,EAAa,EAAS,EAAY,EACtC,OAAO,mBAAmB,MAAK,SAAmB,GAChD,OACE,OAAQ,EAAU,KAAO,EAAU,MACjC,KAAK,EAGH,GAFA,QAAQ,IAAI,0BAEP,EAAM,CACT,EAAU,KAAO,EACjB,KACF,CAGA,OADA,QAAQ,MAAM,kCACP,EAAU,OAAO,UAE1B,KAAK,EACH,IAAK,EAAW,CACd,EAAU,KAAO,EACjB,KACF,CAGA,OADA,QAAQ,MAAM,+BACP,EAAU,OAAO,UAE1B,KAAK,EAGH,IAFA,EAAc,kBAA2B,QAAE,CAAC,EAAG,EAAgB,IAE/C,WAAY,CAC1B,EAAU,KAAO,GACjB,KACF,CAGA,OADA,EAAU,KAAO,GACV,kBAAkB,EAAY,MAEvC,KAAK,IACH,EAAU,EAAU,QACP,EAAY,WAAa,GAExC,KAAK,GACH,EAAa,CAAC,EACV,EAAY,aAAY,EAAW,WAAa,EAAY,aAChE,EAAI,IAAI,OAAO,KAAK,CAClB,OAAQ,KAER,GAAG,aAAc,GAEnB,EAAE,GAAG,QAAS,GACd,EAAE,GAAG,SAAS,SAAU,GACtB,GAAI,EAAI,QAAQ,SAAS,6BAA8B,CACrD,IAAI,EAAe,EAAI,QAAQ,MAAM,KACjC,EAAS,EAAa,EAAa,OAAS,GAChD,QAAQ,MAAM,0CAA4C,EAC5D,MACE,QAAQ,MAAM,EAElB,IACA,EAAE,GAAG,OAAqB,2BAAoC,QAAgB,mBAAmB,MAAK,SAAS,IAC7G,IAAI,EAAG,EACP,OAAO,mBAAmB,MAAK,SAAkB,GAC/C,OACE,OAAQ,EAAS,KAAO,EAAS,MAC/B,KAAK,EAIH,OAHA,GAAa,GACb,EAAI,mBAAqB,EAAY,KAAO,IAAI,eAAe,GAAK,IAAI,cAAc,EAAG,GACzF,EAAS,KAAO,EACT,EAAE,OAEX,KAAK,EAIH,GAHA,EAAM,EAAS,KACf,QAAQ,IAAI,eAAgB,GAExB,EAAK,CACP,EAAS,KAAO,EAChB,KACF,CAEA,OAAO,EAAS,OAAO,UAEzB,KAAK,EACH,EAAI,KAAI,SAAU,GAChB,GAAI,IAAO,EAAE,GAAb,CACA,IAAI,EAAO,EAAE,QAAQ,GACrB,EAAmB,EAFI,CAGzB,IACA,EAAQ,GACR,EAAa,GAEf,KAAK,GACL,IAAK,MACH,OAAO,EAAS,OAGxB,GAAG,EACL,MAEF,KAAK,GACL,IAAK,MACH,OAAO,EAAU,OAGzB,GAAG,EACL,KAEA,OAAO,SAAiB,GACtB,OAAO,EAAK,MAAM,KAAM,UAC1B,CACF,CA7G2B,GAgHvB,EAAa,WACf,QAAQ,IAAI,8BAEP,EAKA,GAKA,EAAK,cAAc,EAAK,aACzB,GAAW,EAAU,QACzB,EAAY,SAAQ,SAAU,GAC5B,OAAO,EAAK,OACd,IACA,EAAK,UACL,GAAa,GACb,OAAQ,IAXN,QAAQ,MAAM,6CALd,QAAQ,MAAM,uCAiBlB,EAEA,UAAU,EAAG,EAAW,GAExB,IAAI,EAAa,MAAM,WAAW,EAAe,OAC7C,EAAQ,EAAW,GACnB,EAAW,EAAW,GAEtB,EAAa,MAAM,WACnB,EAAgB,EAAW,GAC3B,EAAiB,EAAW,GAEhC,MAAM,WAAU,WACd,OAAO,IAAW,EAAe,MACnC,GAAG,CAAC,EAAe,QAEnB,IAAI,EAAuB,oBAAoB,EAAO,EAAM,EAAa,GACrE,EAAmB,EAAqB,iBACxC,EAAc,EAAqB,YAEvC,MAAO,CACL,UAAW,EACX,QAAS,EACT,WAAY,EACZ,YAAa,EACb,WAAY,EAAS,WACrB,MAAO,EACP,SAAU,EACV,YAAa,EACb,iBAAkB,EAClB,eAAgB,EAEpB,EAEI,YAAc,CAAC,QACf,0BAA4B,SAAmC,EAAQ,EAAM,GAC/E,IAAI,EAAe,EAAO,KACtB,OAAwB,IAAjB,GAAiC,EACxC,EAAO,uCAAgD,QAAE,EAAQ,aAEjE,EAAM,MAAM,SAAQ,WACtB,IAAI,EAAW,IAAI,MAAM,qBAAqB,kBAA2B,QAAE,CACzE,KAAM,MAAM,YACX,IAiBH,OAfA,EAAS,gBAAkB,SAAU,GACnC,EAAO,SAAS,KAAO,IAAI,MAAM,QAAQ,GACzC,IAAI,EAAW,4HAEf,EAAO,aAAe,EAAW,EAAO,aAAa,QAAQ,6BAA8B,2HAC3F,EAAO,aAAe,EAAO,aAAa,QAAQ,0BAA2B,8CAE7E,EAAO,eAAiB,EAAW,EAAO,eAAe,QAAQ,kCAAmC,oCAAsC,GAC1I,EAAS,SAAS,OAAS,CAC7B,EAEA,EAAS,sBAAwB,WAC/B,OAAO,EAAO,EAAO,KAAK,UAAU,EACtC,EAEO,CACT,GAAG,CAAC,EAAM,EAAM,EAAM,IAQtB,OAPA,gBAAgB,IAAI,SAAU,GAC5B,IAAI,EAAsB,EAEtB,EAAQ,EAAK,MACZ,GAA0D,OAA/C,EAAuB,EAAI,SAAS,SAA8E,OAA1D,EAAwB,EAAqB,WAAqB,EAAsB,OAChK,EAAI,SAAS,OAAO,SAAS,KAAK,MAAQ,EAAM,YAClD,IACO,CACT,EAEI,KAAO,KACP,KAAO,YACP,KAAO,4BAA8B,KAAO,+6BAEhD,SAAS,YAAY,GACnB,IAAI,EAAQ,EAAM,MACd,EAAS,EAAM,OACf,EAAQ,EAAM,MACd,EAAM,0BAA0B,CAClC,MAAO,WACN,KAAM,MACL,EAAwB,IAAR,EAChB,EAA0B,IAAT,EACrB,OAAoB,MAAM,cAAc,QAAS,CAC/C,KAAM,SACQ,MAAM,cAAc,WAAY,CAC9C,KAAM,CAAC,EAAO,EAAQ,GACtB,SAAU,IACK,MAAM,cAAc,WAAY,CAC/C,KAAM,CAAC,EAAe,EAAgB,GACtC,SAAU,EACV,cAAe,EAAQ,EAAI,EAAgB,EAC3C,aAAc,EAAS,IAE3B,CAEA,IAAI,YAAc,CAAC,QAAS,SAAU,YACtC,SAAS,KAAK,GACZ,IAAI,EAAQ,EAAM,MACd,EAAS,EAAM,OACf,EAAW,EAAM,SACjB,EAAO,uCAAgD,QAAE,EAAO,aAGpE,OAAoB,MAAM,cAAc,QAAS,kBAA2B,QAAE,CAC5E,KAAM,QACL,GAAoB,MAAM,cAAc,OAAQ,CACjD,SAAU,MAAM,oBACF,MAAM,cAAc,sBAAuB,CACzD,KAAM,CAAC,EAAQ,KAAY,EAAS,SACpB,MAAM,cAAc,OAAQ,CAC5C,aAAc,MACA,MAAM,cAAc,sBAAuB,CACzD,KAAM,CAAC,EAAO,KACC,MAAM,cAAc,uBAAwB,CAC3D,MAAO,aACS,MAAM,cAAc,QAAS,CAC7C,KAAM,UACN,aAAc,MACb,GACL,CAEA,IAAI,YAAc,CAAC,UAAW,QAAS,WAAY,SACnD,SAAS,OAAO,GACd,IAAI,EAAU,EAAM,QAChB,EAAQ,EAAM,MACd,EAAW,EAAM,SACjB,EAAQ,EAAM,MACd,EAAO,uCAAgD,QAAE,EAAO,aAEhE,EAAY,MAAM,UAAS,GAC3B,EAAU,EAAU,GACpB,EAAa,EAAU,GAKvB,EAHa,QAAQ,UAAU,CACjC,MAAO,EAAU,UAAY,YAER,MAEnB,EAAY,KAEZ,EAAY,IACZ,EAAQ,IACR,EAAuB,IAAV,EAAc,EAAQ,IAAgB,EAAQ,IAC/D,OAAoB,MAAM,cAAc,QAAS,kBAA2B,QAAE,CAC5E,KAAM,UACL,GAAoB,MAAM,cAAc,WAAY,CACrD,KAAM,CAAC,EAAO,KAA2B,IAC3B,MAAM,cAAc,QAAQ,SAAS,qBAAsB,CACzE,MAAO,KACS,MAAM,cAAc,OAAQ,CAC5C,KAAM,CAAC,EAAO,KAA2B,GACzC,QAAS,EACT,QAAS,WACP,OAAO,GAAW,EACpB,EACA,UAAW,WACT,OAAO,GAAW,EACpB,IACe,MAAM,cAAc,QAAS,CAC5C,aAAc,MACA,MAAM,cAAc,KAAK,KAAM,CAC7C,SAAU,EACV,MAAO,QACP,QAAS,OACT,cAAe,EAAQ,EAAI,EAC3B,SAAU,EAEV,WAAY,SACZ,SAAU,CAAC,GAAI,IAAU,EAAY,MACpC,IACL,CAEA,IAAI,YAAc,CAAC,QAAS,QAAS,WAAY,SACjD,SAAS,SAAS,GAChB,IAAI,EAEA,EAAQ,EAAM,MACd,EAAQ,EAAM,MACd,EAAW,EAAM,SACjB,EAAe,EAAM,MACrB,OAAyB,IAAjB,EAA0B,EAAI,EACtC,EAAO,uCAAgD,QAAE,EAAO,aAEhE,EAAY,MAAM,UAAS,GAC3B,EAAQ,EAAU,GAClB,EAAW,EAAU,GAErB,EAAa,MAAM,UAAS,GAC5B,EAAO,EAAW,GAClB,EAAU,EAAW,GAErB,EAAa,MAAM,SAAS,GAC5B,EAAa,EAAW,GACxB,EAAgB,EAAW,GAE3B,EAEG,OAFI,EAAc,EAAM,MAAK,SAAU,GAC5C,OAAO,EAAG,OAAS,CACrB,KAAc,EAAc,EAAM,GAYlC,MAAM,WAAU,WACd,GAAK,EAAL,CACA,IAAI,EAAM,EAAM,WAAU,SAAU,GAClC,OAAO,EAAK,SAAkB,MAAP,OAAc,EAAS,EAAI,MACpD,KACa,IAAT,GAAc,IAAe,GACjC,EAAc,EALE,CAMlB,GAAG,CAAC,EAAO,EAAY,IACvB,IAAI,EAAM,EAAO,GAAG,OAAO,GAAO,MAAK,SAAU,EAAG,GAClD,OAAO,GAAK,GAAO,EAAI,GAAK,EAAM,EAAI,CACxC,IAAK,EAAM,CAAC,GAAO,GACf,EAAa,KAAK,cAAc,EAAK,CACvC,KAAM,SAAc,GAClB,OAAO,EAAK,KACd,EACA,MAAO,IAAM,EAAM,OACnB,KAAM,CACJ,MAAO,EACP,EAAG,GAEL,MAAO,SAAe,EAAG,GACvB,MAAO,CACL,MAAO,EACP,GAAI,IAAO,EAEf,EACA,OAAQ,SAAgB,EAAG,GACzB,MAAO,CACL,MAAO,EACP,GAAI,IAAO,EAEf,EACA,MAAO,CACL,MAAO,EACP,EAAG,GAEL,MAAO,EACP,OAAQ,WACN,OAAO,GAAS,EAClB,IAGE,EAAa,QAAQ,UAAU,CACjC,IAAK,EAAO,KAAK,GAAK,EACtB,KAAM,EAAO,KAAQ,IAEnB,EAAM,EAAW,IACjB,EAAO,EAAW,KAElB,EAAW,SAAiB,GAC1B,KA5DO,SAAgB,GAC3B,IAAI,EAAM,EAAM,WAAU,SAAU,GAClC,OAAO,EAAG,OAAS,CACrB,KACa,IAAT,IACA,GAAU,EAAS,EAAM,IAC7B,EAAc,GAChB,CAsDI,CAAO,GACP,GAAS,IAGX,GAAS,EACX,EAEA,OAAoB,MAAM,cAAc,QAAS,kBAA2B,QAAE,CAC5E,KAAM,qBACL,GAAoB,MAAM,cAAc,QAAQ,EAAE,MAAO,CAC1D,aAAc,GACb,GAAW,SAAU,EAAM,EAAI,EAAG,GACnC,IAAI,EAAQ,EAAK,MACb,EAAI,EAAK,EACb,OAAoB,MAAM,cAAc,QAAQ,EAAE,MAAO,CACvD,MAAO,EACP,aAAc,GACA,MAAM,cAAc,OAAQ,CAC1C,QAAS,WACP,OAAO,EAAS,EAAG,MACrB,EACA,MAAO,EACP,MAAO,GACN,EAAG,MACR,IAAI,EAAM,OAAS,GAAkB,MAAM,cAAc,QAAQ,EAAE,MAAO,CACxE,aAAc,EACd,aAAc,EAAQ,EAAI,KAAW,IACrC,aAAc,MACA,MAAM,cAAc,QAAS,CAC3C,IAAK,gEACL,MAAO,QAEX,CAEA,SAAS,YAAY,GACnB,IACI,EADc,aACY,YAE1B,EAAY,MAAM,WAClB,EAAW,EAAU,GACrB,EAAc,EAAU,GAGxB,EADa,MAAM,SAAS,SAAS,cAAc,WAC/B,GAGpB,EADa,MAAM,SAAS,IAAI,WAAW,MACpB,GAEvB,EAAgB,MAAM,OAAO,MA6CjC,OA5CA,MAAM,WAAU,WACd,GAAK,EAAL,CAEA,IAAI,EAAW,IAAK,OAAO,cAAgB,OAAO,oBAC9C,EAAW,EAAS,iBACxB,EAAS,QAAU,IACnB,IAAI,EAAe,EAAS,kBACxB,EAAY,IAAI,WAAW,GAC/B,EAAS,sBAAsB,GAC/B,EAAS,sBAAwB,GACpB,EAAS,wBAAwB,GACvC,QAAQ,GACf,EAAY,EAXY,CAY1B,GAAG,CAAC,IACJ,MAAM,UAAS,WACb,IAAI,EAAY,EAAO,WAAW,MAClC,GAAK,GAAa,GAAc,EAAc,QAA9C,CACA,EAAc,QAAQ,aAAc,EACpC,EAAS,qBAAqB,GAC9B,EAAS,sBAAwB,IACjC,EAAU,UAAU,EAAG,EAAG,EAAO,MAAO,EAAO,QAG/C,EAAU,UAAY,eAOtB,IANA,IAGI,EAAa,EAAO,MAHV,EACA,EAGV,EAAI,EAEC,EAAI,EAAG,EANF,EAMe,IAAK,CAKhC,IAJA,IACI,GAAS,EAAU,GAAK,IAAQ,GADpB,IACmD,EAAO,OACtE,EAAI,EAED,EAAI,GAAO,CAChB,IAAI,EAAQ,KAAK,IAAI,EAVZ,GAUwB,GACjC,EAAU,SAAS,EAAG,EAAO,OAAS,EAAG,EAXhC,IAYT,EAAI,EAbM,CAcZ,CAEA,GAAK,EAhBO,CAiBd,CA1B6D,CA2B/D,IACK,EACe,MAAM,cAAc,QAAS,kBAA2B,QAAE,CAC5E,KAAM,gBACL,GAAqB,MAAM,cAAc,OAAQ,KAAmB,MAAM,cAAc,sBAAuB,CAChH,KAAM,CAAC,KAAO,QACC,MAAM,cAAc,uBAAwB,CAC3D,aAAa,GACC,MAAM,cAAc,gBAAiB,CAEnD,IAAK,EACL,KAAM,CAAC,GACP,OAAQ,WAXe,IAa3B,CAEA,IAAI,YAAc,CAAC,SACnB,SAAS,QAAQ,GACf,IAAI,EAAQ,EAAM,MACd,EAAO,uCAAgD,QAAE,EAAO,aAEhE,EAAY,MAIZ,GADiB,UAAU,eAAiB,UAAU,aAAa,aACzC,0CAA4C,oDAC1E,OAAoB,MAAM,cAAc,QAAS,EAAmB,MAAM,cAAc,KAAK,KAAM,CACjG,SAAU,EACV,MAAO,QACP,aAAc,KACd,SAAU,EACV,UAAW,UACV,GAAuB,MAAM,cAAc,WAAY,CACxD,KAAM,CAAC,EAAO,KAXJ,KAYV,SAAU,MAAM,qBAEpB,CAEA,IAAI,YAAc,CAAC,SACnB,SAAS,UAAU,GACjB,IAAI,EAAQ,EAAM,MACd,EAAO,uCAAgD,QAAE,EAAO,aAEhE,EAAc,aACd,EAAc,EAAY,YAC1B,EAAiB,EAAY,eAE7B,EAAY,MAAM,SAAS,IAC3B,EAAe,EAAU,GACzB,EAAkB,EAAU,GAE5B,EAAa,MAAM,WACnB,EAAiB,EAAW,GAC5B,EAAoB,EAAW,GAE/B,EAAa,MAAM,UAAS,GAC5B,EAAU,EAAW,GACrB,EAAa,EAAW,GAExB,EAAa,MAAM,UAAS,GAC5B,EAAO,EAAW,GAClB,EAAU,EAAW,GAErB,IAAsB,EACtB,EAAiB,MAAM,aAAY,WACrC,IAAI,EAEgD,OAAnD,EAAwB,UAAU,eAAiC,EAAsB,mBAAmB,MAAK,SAAU,GAI1H,GAHA,EAAU,EAAQ,QAAO,SAAU,GACjC,MAAuB,eAAhB,EAAO,IAChB,KACkB,QAAO,SAAU,EAAQ,GACzC,OAAO,EAAQ,WAAU,SAAU,GACjC,OAAO,EAAE,UAAY,EAAO,OAC9B,MAAO,CACT,IACA,EAAgB,EAClB,GACF,GAAG,IAmBH,OAlBA,MAAM,WAAU,WACV,GAAa,GACnB,GAAG,CAAC,EAAa,IACjB,MAAM,WAAU,WACT,UAAU,eAEf,UAAU,aAAa,eAAiB,WACtC,OAAO,GACT,EACF,GAAG,CAAC,IACJ,MAAM,WAAU,WACd,IAAI,EAAoB,MAAf,OAAsB,EAAS,EAAY,YAAY,GAAG,cAAc,SACjF,IAAa,GAAkB,IAAmB,EACpD,GAAG,CAAC,EAAa,IACjB,MAAM,WAAU,WACT,IACL,EAAY,iBAAiB,GAAG,SAAW,EAC7C,GAAG,CAAC,EAAa,IACG,MAAM,cAAc,QAAS,kBAA2B,QAAE,CAC5E,KAAM,cACL,GAAoB,MAAM,cAAc,KAAM,CAC/C,MAAO,EACP,OAAQ,IACM,MAAM,cAAc,QAAS,CAC3C,IAAK,IAAS,EAAoB,kEAAoE,8DACtG,MAAO,KACP,cAAe,EAAQ,EAAI,MAAY,MACxB,MAAM,cAAc,QAAS,CAC5C,aAAc,EAAQ,EAAI,MAAY,KACrC,IAAY,GAAkC,MAAM,cAAc,SAAU,CAC7E,OAAQ,EACR,OAAQ,GACM,MAAM,cAAc,QAAS,CAC3C,IAAK,0DACL,MAAO,SACH,GAAwB,MAAM,cAAc,YAAa,CAC7D,cAAe,OACZ,GAAkC,MAAM,cAAc,QAAS,CAClE,cAAe,MACD,MAAM,cAAc,OAAQ,CAC1C,MAAO,EACP,SAAU,EACV,MAAO,GACP,aAAc,MACC,MAAM,cAAc,KAAK,KAAM,CAC9C,SAAU,KACV,QAAS,QACT,cAAe,IACf,MAAO,SACN,SAAU,GAAkC,MAAM,cAAc,SAAU,CAC3E,cAAe,IACf,MAAsB,MAAf,OAAsB,EAAS,EAAY,YAAY,GAAG,cAAc,SAC/E,MAAO,EAAa,KAAI,SAAU,EAAQ,GACxC,MAAO,CACL,KAAM,EAAO,OAAS,cAAgB,EACtC,MAAO,EAAO,SAElB,IACA,MAAO,EACP,aAAc,EACd,SAAU,SAAkB,GAC1B,EAAe,EAAK,OACpB,EAAkB,EAAK,MACzB,KACG,GAAkC,MAAM,cAAc,QAAS,CAClE,cAAe,KACf,aAAc,IACd,MAAO,KAEX,CAEA,IAAI,WAAa,iEACjB,SAAS,eACP,IACI,EAAW,cAGX,EADkB,iBACO,OAK7B,OAAoB,MAAM,cAAc,KAAM,CAC5C,KAVc,gBAWd,IAAK,CAAC,EAAG,GACT,MAAO,EAAO,OAAS,EAAI,GAC3B,MAAM,GACQ,MAAM,cAAc,QAAS,CAC3C,cAAe,IACf,MAAO,MACO,MAAM,cAAc,YAAa,CAC/C,MAZU,GAaV,OAZW,IAaX,MAZU,KAaK,MAAM,cAAc,QAAS,CAC5C,KAAM,UACN,aAAc,IAAU,MACV,MAAM,cAAc,UAAW,CAC7C,aAAc,IACd,MAAO,OACQ,MAAM,cAAc,KAAK,KAAM,CAC9C,SAAU,KACV,MAAO,QACP,KAAM,WACN,SAAU,IACV,QAAS,MACT,cAAe,IACf,UAAW,SACX,MAAO,KACN,uFAAqG,MAAM,cAAc,SAAU,CACpI,QAAS,WACP,OAAO,EAAS,MAClB,EACA,SAAU,IACV,cAAe,IACf,cAAe,GACf,MAAO,WACN,WACL,CAEA,IAAI,YAAc,CAAC,WAAY,kBAAmB,eAClD,SAAS,QAAQ,GACf,IAAI,EAAW,EAAM,SACjB,EAAkB,EAAM,gBACxB,EAAc,EAAM,YACpB,EAAmB,uCAAgD,QAAE,EAAO,aAE5E,EAAa,cAAc,GAC3B,EAAY,EAAW,UACvB,EAAU,EAAW,QACrB,EAAa,EAAW,WAE5B,MAAM,WAAU,WACV,GAAa,GACnB,GAAG,CAAC,IAEJ,IAAI,EAAU,MAAM,QAAO,GAc3B,OAbA,MAAM,WAAU,WACV,EAAQ,UAAY,IACtB,QAAQ,KAAK,YAAc,EAAY,YAAc,iBACrD,EAAQ,QAAU,EAEtB,GAAG,CAAC,IAEJ,MAAM,WAAU,WAEd,OADA,OAAO,iBAAiB,eAAgB,GACjC,WACL,OAAO,OAAO,oBAAoB,eAAgB,EACpD,CACF,GAAG,CAAC,IACgB,MAAM,cAAc,eAAe,SAAU,CAC/D,MAAO,IACL,GAAgC,MAAM,cAAc,kBAAmB,MAAO,EAAW,OAAsB,MAAM,cAAc,aAAc,MAAO,EAC9J,CAEA,IAAI,YAAc,CAAC,YACf,oBAAsB,CACxB,KAAM,GACN,YAAY,EACZ,QAAS,CAAC,GAAI,IAAK,GACnB,uBAAwB,CACtB,SAAU,IAGd,SAAS,QAAQ,GACf,IAAI,EAAW,EAAM,SACjB,EAAe,uCAAgD,QAAE,EAAO,aAE5E,OAAoB,MAAM,cAAc,OAAO,QAAS,kBAA2B,QAAE,CAAC,EAAG,oBAAqB,GAA4B,MAAM,cAAc,MAAM,SAAU,CAC5K,SAAU,MACT,GACL,CAEA,SAAS,gBAAgB,GACvB,IAAI,EAAW,EAAM,SACjB,EAAmB,EAAM,iBACzB,EAAe,EAAM,aACrB,EAAe,EAAM,aACrB,EAAc,EAAM,YACpB,EAAgB,EAAM,cACtB,EAAuB,EAAM,cAC7B,OAAyC,IAAzB,GAA0C,EAC9D,OAAoB,MAAM,cAAc,YAAa,EAA+B,MAAM,cAAc,QAAS,EAA2B,MAAM,cAAc,OAAQ,EAA0B,MAAM,cAAc,SAAU,EAA4B,MAAM,cAAc,QAAS,EAA2B,MAAM,cAAc,OAAQ,MAAO,GAA8B,MAAM,cAAc,cAAe,MAAO,OACja,CAEA,IAAI,eAAiB,SAAwB,GAC3C,IACI,EADkB,iBACO,OAGzB,EADY,MAAM,WACA,MAElB,EAAY,MAAM,WAClB,EAAO,EAAU,GACjB,EAAU,EAAU,GAEpB,EAAa,MAAM,SAAQ,WAC7B,OAAO,IAAI,MAAM,QAAQ,EAAG,GAAG,YAAY,eAAe,KAC5D,GAAG,IACC,EAAS,MAAM,SAAQ,WACzB,OAAO,EAAW,QAAQ,WAC5B,GAAG,CAAC,IACA,EAAS,MAAM,SAAQ,WACzB,OAAO,IAAI,MAAM,kBAAkB,EAAW,EAAG,EAAW,EAAG,CAC7D,eAAe,EAEf,UAAW,MAAM,cACjB,UAAW,MAAM,cACjB,OAAQ,MAAM,YAElB,GAAG,CAAC,IACA,EAAW,MAAM,SAAQ,WAC3B,IAAI,EAAI,IAAI,MAAM,cAAc,CAC9B,uBAAuB,EACvB,UAAW,QACX,WAAW,IAKb,OAHA,EAAE,yBAA0B,EAC5B,EAAE,YAAc,MAAM,cACtB,EAAE,eAAiB,MAAM,aAClB,CACT,GAAG,IACH,MAAM,WAAU,WACd,EAAS,QAAQ,EAAO,MAAO,EAAO,QACtC,EAAS,cAAc,EAAO,QAAU,EAAI,EAC9C,GAAG,CAAC,EAAO,QAAS,EAAO,MAAO,EAAO,OAAQ,IACjD,IAAI,EAAc,MAAM,aAAY,WAClC,GAAK,EAAI,QAAT,CACA,SAAS,KAAK,OAAO,EAAS,YAC9B,EAAI,QAAQ,OAAS,EAAO,EAAI,EAAO,EACvC,EAAS,OAAO,EAAO,EAAI,SAC3B,IAAI,EAAQ,IAAI,KACZ,EAAO,SAAS,MAAQ,oBAAsB,OAAO,SAAS,SAAW,MAAQ,EAAM,mBAAmB,SAAW,IAAM,EAAM,WAAa,IAAM,EAAM,aAE9J,GAAK,EAAO,OAOV,EAAQ,EAAS,WAAW,UAAU,mBAPpB,CAClB,IAAI,EAAO,SAAS,cAAc,KAClC,EAAK,SAAW,EAAO,OACvB,EAAK,KAAO,EAAS,WAAW,UAAU,cAC1C,EAAK,QACL,EAAK,QACP,CAIA,SAAS,KAAK,YAAY,EAAS,WAjBX,CAkB1B,GAAG,CAAC,EAAO,EAAG,EAAO,EAAG,EAAK,EAAO,OAAQ,EAAU,IACtD,MAAO,CACL,WAAY,EACZ,OAAQ,EACR,YAAa,EACb,OAAQ,EACR,SAAU,EACV,KAAM,CACJ,MAAO,EACP,IAAK,GAGX,EAEI,aAAe,SAAsB,EAAS,EAAK,EAAO,EAAM,GAClE,IACI,EADkB,iBACO,OAGzB,EADY,MAAM,WACA,MAElB,EAAQ,MAAM,SAAQ,WACxB,OAAO,IAAI,MAAM,OACnB,GAAG,IACC,EAAQ,MAAM,SAAQ,WACxB,OAAO,IAAI,MAAM,UACnB,GAAG,IAEC,EAAgB,MAAM,QAAO,GACjC,MAAM,WAAU,WACT,IAAQ,EAAc,SAAU,EACvC,GAAG,CAAC,IACJ,gBAAgB,EAAI,GAAG,SAAU,IAC3B,GAAY,EAAc,SAAY,EAAI,UAE9C,EAAM,GAAG,WAAY,EACrB,EAAM,GAAG,gBAAgB,EAAM,QAC/B,EAAM,GAAG,OAAO,EAAO,EAAI,SAC3B,EAAM,GAAG,gBAAgB,MACzB,EAAM,GAAG,WAAY,EACvB,IACA,gBAAgB,IAAI,SAAU,GACvB,EAAI,SAAY,EAAK,SAAY,EAAM,SAAY,IAExD,EAAK,QAAQ,iBAAiB,GAC9B,EAAK,QAAQ,mBAAmB,GAChC,EAAI,QAAQ,SAAS,IAAI,EAAG,EAAG,IAAK,gBAAgB,GAEpD,EAAI,QAAQ,SAAS,IAAI,GACzB,EAAI,QAAQ,SAAS,kBAAkB,GACvC,EAAI,QAAQ,OAAS,EAAM,OAAO,EAAI,EAAM,OAAO,EACnD,EAAI,QAAQ,yBAEZ,EAAM,GAAG,WAAY,EACrB,EAAM,GAAG,gBAAgB,EAAM,QAC/B,EAAM,GAAG,OAAO,EAAO,EAAI,SAC3B,EAAM,GAAG,gBAAgB,MACzB,EAAM,GAAG,WAAY,EACvB,GACF,EAEI,UAAY,iEAChB,SAAS,YAAY,GACnB,IAAI,EAAO,EAAM,KACb,EAAM,QAEV,IACI,EADkB,iBACO,OAEzB,GAAe,EAAO,OAAS,IAK/B,EAHa,QAAQ,UAAU,CACjC,MAAO,EAAO,EAAI,IAEG,MAEnB,EAAY,KACZ,EAAe,sBAAwB,EAAO,QAAU,QAE5D,OAAoB,MAAM,cAAc,QAAQ,EAAE,MAAO,CACvD,MAAO,EACP,aAAc,EAAO,QAAU,KAAQ,IACvC,aAAc,EAAO,QAAU,GAAM,GACrC,aAAc,IACd,aAAc,GACd,cAAe,IACD,MAAM,cAAc,SAAU,CAC5C,OAAoB,GAAZ,EACR,MAAO,EAAO,OAAS,EAAI,GACb,MAAM,cAAc,KAAK,KAAM,CAC7C,MAAO,QACP,SAAU,EACV,SAAU,IACV,UAAW,SACX,aAAc,QACd,aAA0B,GAAZ,EACd,KAAM,UACN,cAAe,KACd,EAAO,OApBQ,cAoBe,IAAgB,EAAO,SAAwB,MAAM,cAAc,SAAU,CAC5G,OAAoB,GAAZ,EACR,MAAO,GACO,MAAM,cAAc,IAAK,CACvC,QAAS,IACT,SAAU,CAAC,IAAK,KAChB,MAAO,GACP,cAAe,KACf,aAAc,GACd,cAAe,MAEnB,CAEA,IAAI,YAAc,CAAC,MAAO,OAAQ,OAC9B,WAAa,iEACjB,SAAS,gBAAgB,GACvB,IAAI,EAAM,EAAM,IACZ,EAAM,KACN,IAAI,EAAM,EAAM,IAChB,EAAO,uCAAgD,QAAE,EAAO,aAGhE,EAAiB,KAEjB,EAAkB,IAKlB,EAHa,QAAQ,UAAU,CACjC,MAAuB,IAAjB,EAAI,WAAgC,MAEtB,KAetB,OAbA,MAAM,WAAU,WAEd,IAAI,EAAW,SAAkB,GAC/B,GAAK,EAAI,QAAT,CACA,IAAI,EAAS,EAAI,QAAQ,IAAiB,IAAX,EAAE,OACjC,EAAI,IAAI,EAFgB,CAG1B,EAGA,OADA,OAAO,iBAAiB,QAAS,GAC1B,WACL,OAAO,OAAO,oBAAoB,QAAS,EAC7C,CACF,GAAG,CAAC,EAAK,IACW,MAAM,cAAc,QAAS,EAAmB,MAAM,cAAc,OAAQ,CAC9F,SAAU,MAAM,oBACF,MAAM,cAAc,sBAAuB,CACzD,KAAM,CAAC,EAAiB,MACR,MAAM,cAAc,QAAQ,SAAS,KAAM,CAC3D,SAAU,MAAM,iBAChB,aAAc,EACd,aAAc,MACA,MAAM,cAAc,sBAAuB,CACzD,KAAM,CAAC,EAhCS,QAiCA,MAAM,cAAc,KAAK,KAAM,CAC/C,KAAM,WACN,MAAO,QACP,SAAU,KACV,QAAS,MACT,QAAS,QACT,cAAe,IACf,aAAc,IACd,aAAc,IACd,WAAY,IACZ,YAAa,GACb,UAAW,SACX,SA3Ce,KA4Cd,iEAA+E,MAAM,cAAc,IAAK,CACzG,QAAS,IACT,MAAO,IACP,SAAU,CAAC,MAAQ,IAAM,OAE7B,CAEA,IAAI,YAAc,CAAC,OAAQ,UAAW,aAAc,WAChD,WAAa,iEACjB,SAAS,cAAc,GACrB,IAAI,EAAO,EAAM,KACb,EAAU,EAAM,QAChB,EAAa,EAAM,WACnB,EAAU,EAAM,QAChB,EAAO,uCAAgD,QAAE,EAAO,aAGhE,EADkB,iBACO,OAEzB,EAAY,MAAM,UAAS,GAC3B,EAAc,EAAU,GACxB,EAAiB,EAAU,GAE/B,MAAM,WAAU,WACV,IACF,YAAW,WACT,OAAO,GAAW,EACpB,GAAG,KACH,GAAe,GAEnB,GAAG,CAAC,EAAS,IAEb,IAII,EAJa,QAAQ,UAAU,CACjC,SAAW,EAAc,GAAJ,EACrB,OAAQ,QAAQ,OAAO,QAEC,SAE1B,OAAoB,MAAM,cAAc,QAAS,EAAmB,MAAM,cAAc,QAAQ,SAAS,MAAO,CAC9G,UAAW,GACG,MAAM,cAAc,WAAY,CAC9C,KAAM,CAAC,GAAK,IAAM,IAClB,SAAU,MAAM,oBACb,EAAO,QAAuB,MAAM,cAAc,OAAQ,CAC7D,KAAM,CAAC,GAAK,IAAM,IAClB,QAAS,EACT,MAAO,IACP,aAAc,IACb,UAAW,GAAe,GAAQ,EAAO,QAAuB,MAAM,cAAc,SAAU,CAC/F,OAAQ,KACR,MAAO,IACO,MAAM,cAAc,KAAK,KAAM,CAC7C,KAAM,WACN,SAAU,IACV,MAAO,QACP,aAAc,QACd,aAAc,KACd,QAAS,SACT,aAAc,MACb,kBAAgC,MAAM,cAAc,OAAQ,CAC7D,KAAM,aACN,aAAc,IACd,SAAU,MAAM,mBAChB,cAAe,KACD,MAAM,cAAc,oBAAqB,CACvD,KAAM,CAAC,GAAK,GAAK,OAErB,CAEA,IA8GI,gBAAiB,iBAAkB,iBAAkB,iBAAkB,iBA9GvE,QAAU,GACV,QAAU,GACV,OAAS,SAAgB,GAC3B,IAAI,EAAY,MAAM,SAAS,IAC3B,EAAM,EAAU,GAChB,EAAS,EAAU,GAEnB,EAAS,MAAM,aAAY,SAAU,GACvC,GAAK,EAAI,QAAT,CACA,IAAI,EAAM,MAAM,UAAU,MAAM,EAAQ,QAAS,SACjD,EAAI,QAAQ,IAAM,EAClB,EAAI,QAAQ,yBACZ,EAAO,EAJiB,CAK1B,GAAG,CAAC,IACJ,MAAO,CACL,IAAK,EACL,YAAa,EAAM,UAAY,QAAU,SACzC,IAAK,EACL,IAAK,QACL,IAAK,QAET,EAEI,UAAY,CAAC,MAAO,OAAQ,UAAW,OACvC,SAAW,iEACf,SAAS,eAAe,GACtB,IAAI,EAAM,EAAM,IACZ,EAAO,EAAM,KACb,EAAU,EAAM,QAChB,EAAM,EAAM,IACZ,EAAO,uCAAgD,QAAE,EAAO,WAGhE,EADY,MAAM,WACH,GAGf,EADa,YACU,UAEvB,EAAS,MAAM,OAAO,MACtB,EAAc,MAAM,QAAO,GAC3B,EAAW,MAAM,SAEjB,EAAiB,KACjB,EAAc,IAKd,EAHa,QAAQ,UAAU,CACjC,MAAuB,IAAjB,EAAI,WAA4B,KAAkB,IAEpC,KAyBtB,OAvBA,QAAQ,CACN,QAAS,SAAiB,GACxB,IAAI,EAAI,EAAK,EACR,EAAO,UAEiB,IADT,EAAU,gBAAgB,EAAO,SACnC,SAClB,EAAY,SAAU,EACtB,EAAE,4BACJ,EACA,OAAQ,SAAgB,GACtB,IAAI,EAEA,EAAQ,EAAM,MAClB,GAAK,EAAY,QAAjB,CACK,EAAS,UAAS,EAAS,SAA2C,OAA/B,EAAe,EAAI,cAAmB,EAAS,EAAa,MAAQ,GAChH,IAAI,EAAS,EAAS,QAAoB,GAAV,EAAM,EACtC,EAAI,IAAI,EAHwB,CAIlC,EACA,MAAO,WACL,EAAY,SAAU,EACtB,EAAS,aAAU,CACrB,GACC,EAAG,WAAY,CAAC,IACC,MAAM,cAAc,QAAS,EAAmB,MAAM,cAAc,QAAS,CAC/F,cAAe,KACD,MAAM,cAAc,OAAQ,CAC1C,IAAK,EACL,KAAM,CAAC,IAAM,IAAmB,OACjB,MAAM,cAAc,OAAQ,CAC3C,SAAU,MAAM,oBACF,MAAM,cAAc,sBAAuB,CACzD,KAAM,CAAC,KAAoB,MACX,MAAM,cAAc,QAAQ,SAAS,KAAM,CAC3D,SAAU,MAAM,iBAChB,aAAc,GACA,MAAM,cAAc,sBAAuB,CACzD,KAAM,CAAC,GAAiB,UACP,MAAM,cAAc,KAAK,KAAM,CAChD,KAAM,SACN,MAAO,QACP,SAAU,KACV,QAAS,MACT,QAAS,SACT,cAAe,IACf,aAAc,IACd,WAAY,IACZ,YAAa,GACb,UAAW,UACV,cAAe,GAAqB,MAAM,cAAc,SAAU,CACnE,aAAc,IACd,cAAe,EACf,MAAO,IACP,aAAc,GACd,MAAO,UACP,QAAS,WACP,OAAO,GAAQ,EACjB,GACC,SACL,CAGA,IAAI,QAAU,gBAAyB,QAAE,IAAI,kBAAoB,gBAAkB,qCAA8C,QAAE,CAAC,2PAChI,WAAa,gBAAyB,QAAE,IAAI,mBAAqB,iBAAmB,qCAA8C,QAAE,CAAC,+IACrI,MAAQ,gBAAyB,QAAE,IAAI,mBAAqB,iBAAmB,qCAA8C,QAAE,CAAC,kEAChI,KAAO,gBAAyB,QAAE,EAAE,mBAAqB,iBAAmB,qCAA8C,QAAE,CAAC,wEAC7H,OAAS,gBAAyB,QAAE,OAAO,mBAAqB,iBAAmB,qCAA8C,QAAE,CAAC,sMACxI,SAAS,aAAa,GACpB,IAAI,EAAQ,EAAM,MAEd,EAAkB,iBAClB,EAAe,EAAgB,aAC/B,EAAS,EAAgB,OAE7B,OAAK,EAAM,KAAK,OAAU,EAAa,SAAY,EAAO,OACtC,MAAM,cAAc,KAAK,KAAM,KAAmB,SAAS,aAA2B,MAAM,cAAc,MAAM,SAAU,KAAmB,MAAM,cAAc,QAAS,KAAmB,MAAM,cAAc,MAAO,CAC1O,IAAK,EAAM,KAAK,QACD,MAAM,cAAc,KAAM,KAAM,uCAAqD,MAAM,cAAc,OAAQ,CAChI,QAAS,WACP,OAAO,EAAM,KAAK,SAAI,EACxB,GACC,UAAwB,MAAM,cAAc,WAAY,OAAQ,EAAa,UAPP,IAQ3E,CAEA,IAAI,UAAY,uEACZ,iBAAmB,sHACnB,QAAU,EAEd,SAAS,OAAO,GACd,IAAI,EAEA,EAAY,EAAM,UAElB,EAAkB,iBAClB,EAAS,EAAgB,OACzB,EAAS,EAAgB,OAEzB,EAAY,MAAM,WAClB,EAAQ,EAAU,MAClB,EAAQ,EAAU,MAElB,EAAW,cACX,EAAM,MAAM,SACZ,EAAQ,MAAM,OAAO,MACrB,EAAO,MAAM,OAAO,MAEpB,EAAY,MAAM,UAAS,GAC3B,EAAO,EAAU,GACjB,EAAU,EAAU,GAEpB,EAAa,MAAM,UAAS,GAC5B,EAAiB,EAAW,GAC5B,EAAoB,EAAW,GAE/B,EAAM,OAAO,GACb,EAAe,MAAM,OAAO,GAC5B,EAA0G,YAA/C,OAA/C,EAAuB,EAAS,iBAAsB,EAAS,EAAqB,MAChG,EAAQ,eAAe,GACvB,EAAO,aACP,EAAQ,KAAK,IAAiB,IAAb,EAAK,MAAc,EAAO,OAAS,GAAM,MAE1D,EAAa,QAAQ,UAAU,CACjC,KAAM,EAAO,EAAI,GACjB,KAAM,EAAO,EAAI,EAAO,OAAS,KAAK,GAAK,IAAO,GAClD,MAAO,EAAO,EAAQ,EAAO,OAAS,GAAM,IAC5C,OAAQ,QAAQ,OAAO,QAErB,EAAO,EAAW,KAClB,EAAO,EAAW,KAClB,EAAQ,EAAW,MAEvB,aAAa,GAAW,EAAM,EAAK,EAAO,EAAM,GAChD,IAAI,EAAU,MAAM,aAAY,WAC1B,IACA,EAAa,QAAU,QAAU,EAAM,mBAC3C,EAAa,QAAU,EAAM,iBAC7B,GAAkB,GACN,IAAI,MAAM,WAChB,OACN,YAAW,WAET,EAAM,cACF,GAAW,GACjB,GAAG,MACL,GAAG,CAAC,EAAO,EAAW,EAAO,IAC7B,MAAM,WAAU,WACd,GAAK,IAAW,IAAU,EAAO,QAAW,EAE5C,OADA,SAAS,iBAAiB,QAAS,GAC5B,WACL,OAAO,SAAS,oBAAoB,QAAS,EAC/C,CACF,GAAG,CAAC,EAAS,EAAO,OAAQ,EAAS,EAAM,IAC3C,YAAY,KAAK,YACX,YAAe,GACnB,GAAS,EACX,GAAG,CAAC,EAAS,IACb,IAAI,EAAM,EAAO,CAAC,EAAG,GAAK,EAAO,OAAS,CAAC,GAAK,IAAO,CAAC,IAAM,IAC9D,OAAoB,MAAM,cAAc,QAAS,CAC/C,KAAM,wBACN,IAAK,GACS,MAAM,cAAc,KAAM,CACxC,KAAM,SACN,IAAK,EACL,MAAM,EACN,MAAM,EACN,iBAAkB,EAClB,SAAU,SAAkB,GAC1B,OAAQ,GAAK,GAAQ,EACvB,GACc,MAAM,cAAc,YAAa,CAC/C,KAAM,EACN,QAAS,IACM,MAAM,cAAc,QAAQ,SAAS,MAAO,CAC3D,MAAO,EACP,aAAc,EACd,aAAc,GACA,MAAM,cAAc,MAAO,CACzC,IAAK,iBACL,QAAQ,EACR,WAAW,EACX,aAAc,KAAK,GACnB,MAAO,IACL,EAAO,SAAW,GAAqB,MAAM,cAAc,OAAQ,CACrE,KAAM,CAAC,EAAG,IAAK,KACf,aAAc,GACd,QAAS,WACP,OAAO,GAAQ,EACjB,IACe,MAAM,cAAc,QAAS,CAC5C,KAAM,UACN,SAAU,CAAC,EAAG,GAAK,MACL,MAAM,cAAc,cAAe,CACjD,KAAM,EACN,QAAS,EACT,WAAY,EACZ,QAAS,KACO,MAAM,cAAc,QAAS,CAC7C,KAAM,UACN,SAAU,CAAC,GAAI,IAAM,OACrB,MAAO,GACO,MAAM,cAAc,OAAQ,CAC1C,IAAK,EACL,KAAM,aACN,SAAU,EAAE,IAAM,IAAM,GACxB,UAAW,IACX,UAAW,KACG,MAAM,cAAc,sBAAuB,CACzD,KAAM,CAAC,EAAM,OAAO,EAAG,EAAM,OAAO,KACrB,MAAM,cAAc,uBAAwB,CAC3D,IAAK,EAAM,OAAO,QAClB,UAAW,IACX,UAAW,MACR,EAAO,QAAuB,MAAM,cAAc,gBAAiB,CACtE,IAAK,EACL,KAAM,EACN,IAAK,EACL,SAAU,CAAC,KAAO,IAAM,QACR,MAAM,cAAc,eAAgB,CACpD,IAAK,EACL,KAAM,EACN,QAAS,EACT,IAAK,EACL,SAAU,CAAC,GAAK,IAAM,WACjB,MAAM,aAA2B,MAAM,cAAc,KAAK,kBAAmB,CAClF,IAAK,EACL,KAAM,IACN,IAAK,MACH,GAAqB,MAAM,cAAc,aAAc,CACzD,MAAO,IAEX,CAEA,SAAS,YACP,OAAoB,MAAM,cAAc,QAAS,CAC/C,KAAM,cACQ,MAAM,cAAc,IAAK,CACvC,MAAO,QACP,KAAM,GACN,IAAK,KACU,MAAM,cAAc,mBAAoB,CACvD,aAAc,EACd,UAAW,MACI,MAAM,cAAc,eAAgB,CACnD,UAAW,IACI,MAAM,cAAc,aAAc,CACjD,MAAO,UACQ,MAAM,cAAc,UAAW,MAClD,CAEA,QAAQ,OAAS,OACjB,QAAQ,MAAQ,MAChB,QAAQ,MAAQ,QAChB,QAAQ,WAAa,aACrB,QAAQ,OAAS,SACjB,QAAQ,OAAS,OACjB,QAAQ,WAAa,WACrB,QAAQ,SAAW,SACnB,QAAQ,YAAc,YACtB,QAAQ,mBAAqB,mBAC7B,QAAQ,WAAa,WACrB,QAAQ,SAAW,SACnB,QAAQ,IAAM,IACd,QAAQ,MAAQ,MAChB,QAAQ,KAAO,KACf,QAAQ,OAAS,OACjB,QAAQ,KAAO,KACf,QAAQ,MAAQ,QAChB,QAAQ,cAAgB,cACxB,QAAQ,aAAe,aACvB,QAAQ,IAAM,IACd,QAAQ,aAAe,aACvB,QAAQ,UAAY,UACpB,QAAQ,UAAY,UACpB,QAAQ,MAAQ,MAChB,QAAQ,QAAU,QAClB,QAAQ,eAAiB,eACzB,QAAQ,QAAU,QAClB,QAAQ,OAAS,OACjB,QAAQ,cAAgB,cACxB,QAAQ,WAAa,WACrB,QAAQ,KAAO,KACf,QAAQ,SAAW,SACnB,QAAQ,gBAAkB,gBAC1B,QAAQ,OAAS,OACjB,QAAQ,UAAY,UACpB,QAAQ,KAAO,KACf,QAAQ,SAAW,SACnB,QAAQ,gBAAkB,gBAC1B,QAAQ,MAAQ,MAChB,QAAQ,OAAS,OACjB,QAAQ,cAAgB,cACxB,QAAQ,aAAe,aACvB,QAAQ,WAAa,WACrB,QAAQ,YAAc,YACtB,QAAQ,aAAe,aACvB,QAAQ,MAAQ,MAChB,QAAQ,MAAQ,MAChB,QAAQ,iBAAmB,iBAC3B,QAAQ,WAAa,WACrB,QAAQ,UAAY,UACpB,QAAQ,SAAW,SACnB,QAAQ,QAAU,QAClB,QAAQ,eAAiB,eACzB,QAAQ,oBAAsB,oBAC9B,QAAQ,aAAe,aACvB,QAAQ,WAAa,WACrB,QAAQ,SAAW,SACnB,QAAQ,kBAAoB,kBAC5B,QAAQ,YAAc,YACtB,QAAQ,gBAAkB,gBAC1B,QAAQ,WAAa,WACrB,QAAQ,YAAc,YACtB,QAAQ,SAAW,SACnB,QAAQ,WAAa,WACrB,QAAQ,UAAY,UACpB,QAAQ,YAAc,YACtB,QAAQ,aAAe,aACvB,QAAQ,aAAe,aACvB,QAAQ,YAAc,YACtB,QAAQ,iBAAmB,iBAC3B,QAAQ,oBAAsB,sBAC9B,QAAQ,WAAa,WACrB,QAAQ,UAAY","file":"/npm/spaces-ws@2.10.6/main.cjs.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/spaces-ws@2.10.6/main.cjs.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","var React = require('react');\n'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nvar _extends = require('@babel/runtime/helpers/extends');\nvar _objectWithoutPropertiesLoose = require('@babel/runtime/helpers/objectWithoutPropertiesLoose');\nvar react = require('react');\nvar fiber = require('@react-three/fiber');\nvar three = require('three');\nvar three$1 = require('@react-spring/three');\nvar culori = require('culori');\nvar drei = require('@react-three/drei');\nvar cannon = require('@react-three/cannon');\nvar WebGLExtensions = require('three/src/renderers/webgl/WebGLExtensions');\nvar KTX2Loader = require('three/examples/jsm/loaders/KTX2Loader');\nvar suspendReact = require('suspend-react');\nvar BufferGeometryUtils = require('three/examples/jsm/utils/BufferGeometryUtils');\nvar threeMeshBvh = require('three-mesh-bvh');\nvar _taggedTemplateLiteralLoose = require('@babel/runtime/helpers/taggedTemplateLiteralLoose');\nvar react$1 = require('@emotion/react');\nvar nipplejs = require('nipplejs');\nvar styled = require('@emotion/styled');\nvar reactDeviceDetect = require('react-device-detect');\nvar _asyncToGenerator = require('@babel/runtime/helpers/asyncToGenerator');\nvar xr = require('@react-three/xr');\nvar threeStdlib = require('three-stdlib');\nvar reactErrorBoundary = require('react-error-boundary');\nvar RoundedBoxGeometry = require('three/examples/jsm/geometries/RoundedBoxGeometry');\nvar troikaThreeText = require('troika-three-text');\nvar snapshotInterpolation = require('@geckos.io/snapshot-interpolation');\nvar peerjs = require('peerjs');\nvar nodeFetch = require('node-fetch');\nvar core = require('@react-spring/core');\nvar reactDom = require('react-dom');\n\nfunction _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }\n\nfunction _interopNamespace(e) {\n    if (e && e.__esModule) return e;\n    var n = Object.create(null);\n    if (e) {\n        Object.keys(e).forEach(function (k) {\n            if (k !== 'default') {\n                var d = Object.getOwnPropertyDescriptor(e, k);\n                Object.defineProperty(n, k, d.get ? d : {\n                    enumerable: true,\n                    get: function () { return e[k]; }\n                });\n            }\n        });\n    }\n    n[\"default\"] = e;\n    return Object.freeze(n);\n}\n\nvar _extends__default = /*#__PURE__*/_interopDefaultLegacy(_extends);\nvar _objectWithoutPropertiesLoose__default = /*#__PURE__*/_interopDefaultLegacy(_objectWithoutPropertiesLoose);\nvar culori__namespace = /*#__PURE__*/_interopNamespace(culori);\nvar _taggedTemplateLiteralLoose__default = /*#__PURE__*/_interopDefaultLegacy(_taggedTemplateLiteralLoose);\nvar nipplejs__default = /*#__PURE__*/_interopDefaultLegacy(nipplejs);\nvar styled__default = /*#__PURE__*/_interopDefaultLegacy(styled);\nvar _asyncToGenerator__default = /*#__PURE__*/_interopDefaultLegacy(_asyncToGenerator);\nvar nodeFetch__default = /*#__PURE__*/_interopDefaultLegacy(nodeFetch);\n\nvar vertHead$3 = \"\\n    // Description : Array and textureless GLSL 2D/3D/4D simplex\\n    //               noise functions.\\n    //      Author : Ian McEwan, Ashima Arts.\\n    //  Maintainer : ijm\\n    //     Lastmod : 20110822 (ijm)\\n    //     License : Copyright (C) 2011 Ashima Arts. All rights reserved.\\n    //               Distributed under the MIT License. See LICENSE file.\\n    //               https://github.com/ashima/webgl-noise\\n    //\\n    \\n    vec3 mod289(vec3 x) {\\n      return x - floor(x * (1.0 / 289.0)) * 289.0;\\n    }\\n    \\n    vec4 mod289(vec4 x) {\\n      return x - floor(x * (1.0 / 289.0)) * 289.0;\\n    }\\n    \\n    vec4 permute(vec4 x) {\\n         return mod289(((x*34.0)+1.0)*x);\\n    }\\n    \\n    vec4 taylorInvSqrt(vec4 r)\\n    {\\n      return 1.79284291400159 - 0.85373472095314 * r;\\n    }\\n    \\n    float snoise(vec3 v)\\n      {\\n      const vec2  C = vec2(1.0/6.0, 1.0/3.0) ;\\n      const vec4  D = vec4(0.0, 0.5, 1.0, 2.0);\\n    \\n    // First corner\\n      vec3 i  = floor(v + dot(v, C.yyy) );\\n      vec3 x0 =   v - i + dot(i, C.xxx) ;\\n    \\n    // Other corners\\n      vec3 g = step(x0.yzx, x0.xyz);\\n      vec3 l = 1.0 - g;\\n      vec3 i1 = min( g.xyz, l.zxy );\\n      vec3 i2 = max( g.xyz, l.zxy );\\n    \\n      //   x0 = x0 - 0.0 + 0.0 * C.xxx;\\n      //   x1 = x0 - i1  + 1.0 * C.xxx;\\n      //   x2 = x0 - i2  + 2.0 * C.xxx;\\n      //   x3 = x0 - 1.0 + 3.0 * C.xxx;\\n      vec3 x1 = x0 - i1 + C.xxx;\\n      vec3 x2 = x0 - i2 + C.yyy; // 2.0*C.x = 1/3 = C.y\\n      vec3 x3 = x0 - D.yyy;      // -1.0+3.0*C.x = -0.5 = -D.y\\n    \\n    // Permutations\\n      i = mod289(i);\\n      vec4 p = permute( permute( permute(\\n                 i.z + vec4(0.0, i1.z, i2.z, 1.0 ))\\n               + i.y + vec4(0.0, i1.y, i2.y, 1.0 ))\\n               + i.x + vec4(0.0, i1.x, i2.x, 1.0 ));\\n    \\n    // Gradients: 7x7 points over a square, mapped onto an octahedron.\\n    // The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294)\\n      float n_ = 0.142857142857; // 1.0/7.0\\n      vec3  ns = n_ * D.wyz - D.xzx;\\n    \\n      vec4 j = p - 49.0 * floor(p * ns.z * ns.z);  //  mod(p,7*7)\\n    \\n      vec4 x_ = floor(j * ns.z);\\n      vec4 y_ = floor(j - 7.0 * x_ );    // mod(j,N)\\n    \\n      vec4 x = x_ *ns.x + ns.yyyy;\\n      vec4 y = y_ *ns.x + ns.yyyy;\\n      vec4 h = 1.0 - abs(x) - abs(y);\\n    \\n      vec4 b0 = vec4( x.xy, y.xy );\\n      vec4 b1 = vec4( x.zw, y.zw );\\n    \\n      //vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0;\\n      //vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0;\\n      vec4 s0 = floor(b0)*2.0 + 1.0;\\n      vec4 s1 = floor(b1)*2.0 + 1.0;\\n      vec4 sh = -step(h, vec4(0.0));\\n    \\n      vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ;\\n      vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ;\\n    \\n      vec3 p0 = vec3(a0.xy,h.x);\\n      vec3 p1 = vec3(a0.zw,h.y);\\n      vec3 p2 = vec3(a1.xy,h.z);\\n      vec3 p3 = vec3(a1.zw,h.w);\\n    \\n    //Normalise gradients\\n      vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));\\n      p0 *= norm.x;\\n      p1 *= norm.y;\\n      p2 *= norm.z;\\n      p3 *= norm.w;\\n    \\n    // Mix final noise value\\n      vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);\\n      m = m * m;\\n      return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1),\\n                                    dot(p2,x2), dot(p3,x3) ) );\\n      }\\n              \\n    \\n    float fsnoise(float val1, float val2, float val3){\\n      return snoise(vec3(val1,val2,val3));\\n    }\\n    \\n    vec3 distortFunct(vec3 transformed, float factor) {\\n      float radiusVariation = -fsnoise(\\n        transformed.x * radiusNoiseFrequency + time,\\n        transformed.y * radiusNoiseFrequency + time,\\n        transformed.z * radiusNoiseFrequency + time \\n      ) * radiusVariationAmplitude * factor;\\n      return normalize(transformed) * (radiusVariation + radius);\\n    }\\n    \\n    vec3 orthogonal(vec3 v) {\\n      return normalize(abs(v.x) > abs(v.z) ? vec3(-v.y, v.x, 0.0)\\n      : vec3(0.0, -v.z, v.y));\\n    }\\n    \\n    vec3 distortNormal(vec3 position, vec3 distortedPosition, vec3 normal){\\n      vec3 tangent1 = orthogonal(normal);\\n      vec3 tangent2 = normalize(cross(normal, tangent1));\\n      vec3 nearby1 = position + tangent1 * 0.1;\\n      vec3 nearby2 = position + tangent2 * 0.1;\\n      vec3 distorted1 = distortFunct(nearby1, 1.0);\\n      vec3 distorted2 = distortFunct(nearby2, 1.0);\\n      return normalize(cross(distorted1 - distortedPosition, distorted2 - distortedPosition));\\n    }\\n\";\nvar vert$3 = \"\\n    #include <begin_vertex>\\n    float updateTime = time / 10.0;\\n    transformed = distortFunct(transformed, 1.0);\\n    vec3 distortedNormal = distortNormal(position, transformed, normal);\\n    vNormal = normal + distortedNormal;\\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(transformed,1.);\\n\";\nvar frag$3 = \"\\n    #include <dithering_fragment>\\n    float angle = clamp(dot(normalize(vNormal), vec3(0., -1., 0.)), 0., 1.);\\n    gl_FragColor = vec4(gl_FragColor.rgb * color, gl_FragColor.a);  \\n    gl_FragColor.rgb = mix(gl_FragColor.rgb, mix(color, vec3(0.), 0.5), angle);\\n\";\n\n/**\n * Returns a function that, when used every frame, will mark itself\n * as ready maximum {frequency} times per second.\n *\n * @param frequency How many times per second to be marked as ready\n */\nvar useLimiter = function useLimiter(frequency) {\n  var lastCall = react.useRef(0);\n  return {\n    isReady: function isReady(clock) {\n      var time = clock.elapsedTime;\n      var ready = time - lastCall.current > 1 / frequency;\n\n      if (ready) {\n        lastCall.current = time;\n      }\n\n      return ready;\n    }\n  };\n};\n/**\n * A 1:1 copy of useFrame, but adds a limiter\n *\n * Callback will only run {frequency} times per second\n */\n\nvar useLimitedFrame = function useLimitedFrame(frequency, callback, renderPriority) {\n  var limiter = useLimiter(frequency);\n  fiber.useFrame(function (state, delta) {\n    if (!limiter.isReady(state.clock)) return;\n    callback(state, delta);\n  }, renderPriority);\n};\n\nvar _excluded$p = [\"idea\"];\nfunction VisualIdea(props) {\n  var idea = props.idea,\n      rest = _objectWithoutPropertiesLoose__default[\"default\"](props, _excluded$p);\n\n  var hex = react.useMemo(function () {\n    return (idea == null ? void 0 : idea.getHex()) || \"#808080\";\n  }, [idea]);\n  var seed = react.useMemo(function () {\n    return Math.random();\n  }, []);\n  var color = react.useMemo(function () {\n    return new three.Color(hex);\n  }, [hex]);\n  var RADIUS = 4;\n  var NOISE_AMPLITUDE = 0.82;\n  var NOISE_FREQ = 0.154;\n\n  var _useSpring = three$1.useSpring({\n    col: hex\n  }),\n      col = _useSpring.col;\n\n  var mat = react.useMemo(function () {\n    var material = new three.MeshStandardMaterial({\n      metalness: 0.18,\n      roughness: 0.49,\n      envMapIntensity: 0.66,\n      side: three.DoubleSide\n    });\n\n    material.onBeforeCompile = function (shader) {\n      shader.uniforms.radius = new three.Uniform(RADIUS);\n      shader.uniforms.time = new three.Uniform(0);\n      shader.uniforms.color = new three.Uniform(color);\n      shader.uniforms.radiusVariationAmplitude = new three.Uniform(NOISE_AMPLITUDE);\n      shader.uniforms.radiusNoiseFrequency = new three.Uniform(NOISE_FREQ);\n      var uniforms = \"\\n        uniform float radius;\\n        uniform float time;\\n        uniform vec3 color;\\n        uniform float radiusVariationAmplitude;\\n        uniform float radiusNoiseFrequency;\\n      \";\n      shader.vertexShader = uniforms + vertHead$3 + shader.vertexShader.replace(\"#include <begin_vertex>\", vert$3);\n      shader.fragmentShader = uniforms + shader.fragmentShader.replace(\"#include <dithering_fragment>\", frag$3);\n      material.userData.shader = shader;\n    };\n\n    return material;\n  }, [RADIUS, color, NOISE_AMPLITUDE, NOISE_FREQ, frag$3, vert$3]);\n  var limiter = useLimiter(50);\n  fiber.useFrame(function (_ref) {\n    var _mat$userData;\n\n    var clock = _ref.clock;\n    if (!(mat != null && (_mat$userData = mat.userData) != null && _mat$userData.shader) || !limiter.isReady(clock)) return;\n    mat.userData.shader.uniforms.time.value = clock.elapsedTime / 6 + seed * 1000;\n    mat.userData.shader.uniforms.color.value.set(col.get());\n  });\n  return /*#__PURE__*/React.createElement(\"group\", _extends__default[\"default\"]({\n    name: \"spacesvr-basis-idea\"\n  }, rest), /*#__PURE__*/React.createElement(\"mesh\", {\n    material: mat,\n    scale: 0.2\n  }, /*#__PURE__*/React.createElement(\"sphereBufferGeometry\", {\n    args: [RADIUS, 48, 32]\n  })));\n}\n\nvar rgb_helper = \"\\n    vec3 rgb2hsv(vec3 c)\\n    {\\n        vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\\n        vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\\n        vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\\n    \\n        float d = q.x - min(q.w, q.y);\\n        float e = 1.0e-10;\\n        return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\\n    }\\n    \\n    vec3 hsv2rgb(vec3 c)\\n    {\\n        vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\\n        vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\\n        return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\\n    }\\n\";\nvar noise4D = \"\\n    vec4 permute(vec4 x){return mod(((x*34.0)+1.0)*x, 289.0);}\\nfloat permute(float x){return floor(mod(((x*34.0)+1.0)*x, 289.0));}\\nvec4 taylorInvSqrt(vec4 r){return 1.79284291400159 - 0.85373472095314 * r;}\\nfloat taylorInvSqrt(float r){return 1.79284291400159 - 0.85373472095314 * r;}\\n\\nvec4 grad4(float j, vec4 ip){\\n  const vec4 ones = vec4(1.0, 1.0, 1.0, -1.0);\\n  vec4 p,s;\\n\\n  p.xyz = floor( fract (vec3(j) * ip.xyz) * 7.0) * ip.z - 1.0;\\n  p.w = 1.5 - dot(abs(p.xyz), ones.xyz);\\n  s = vec4(lessThan(p, vec4(0.0)));\\n  p.xyz = p.xyz + (s.xyz*2.0 - 1.0) * s.www; \\n\\n  return p;\\n}\\n\\nfloat snoise(vec4 v){\\n  const vec2  C = vec2( 0.138196601125010504,  // (5 - sqrt(5))/20  G4\\n                        0.309016994374947451); // (sqrt(5) - 1)/4   F4\\n// First corner\\n  vec4 i  = floor(v + dot(v, C.yyyy) );\\n  vec4 x0 = v -   i + dot(i, C.xxxx);\\n\\n// Other corners\\n\\n// Rank sorting originally contributed by Bill Licea-Kane, AMD (formerly ATI)\\n  vec4 i0;\\n\\n  vec3 isX = step( x0.yzw, x0.xxx );\\n  vec3 isYZ = step( x0.zww, x0.yyz );\\n//  i0.x = dot( isX, vec3( 1.0 ) );\\n  i0.x = isX.x + isX.y + isX.z;\\n  i0.yzw = 1.0 - isX;\\n\\n//  i0.y += dot( isYZ.xy, vec2( 1.0 ) );\\n  i0.y += isYZ.x + isYZ.y;\\n  i0.zw += 1.0 - isYZ.xy;\\n\\n  i0.z += isYZ.z;\\n  i0.w += 1.0 - isYZ.z;\\n\\n  // i0 now contains the unique values 0,1,2,3 in each channel\\n  vec4 i3 = clamp( i0, 0.0, 1.0 );\\n  vec4 i2 = clamp( i0-1.0, 0.0, 1.0 );\\n  vec4 i1 = clamp( i0-2.0, 0.0, 1.0 );\\n\\n  //  x0 = x0 - 0.0 + 0.0 * C \\n  vec4 x1 = x0 - i1 + 1.0 * C.xxxx;\\n  vec4 x2 = x0 - i2 + 2.0 * C.xxxx;\\n  vec4 x3 = x0 - i3 + 3.0 * C.xxxx;\\n  vec4 x4 = x0 - 1.0 + 4.0 * C.xxxx;\\n\\n// Permutations\\n  i = mod(i, 289.0); \\n  float j0 = permute( permute( permute( permute(i.w) + i.z) + i.y) + i.x);\\n  vec4 j1 = permute( permute( permute( permute (\\n             i.w + vec4(i1.w, i2.w, i3.w, 1.0 ))\\n           + i.z + vec4(i1.z, i2.z, i3.z, 1.0 ))\\n           + i.y + vec4(i1.y, i2.y, i3.y, 1.0 ))\\n           + i.x + vec4(i1.x, i2.x, i3.x, 1.0 ));\\n// Gradients\\n// ( 7*7*6 points uniformly over a cube, mapped onto a 4-octahedron.)\\n// 7*7*6 = 294, which is close to the ring size 17*17 = 289.\\n\\n  vec4 ip = vec4(1.0/294.0, 1.0/49.0, 1.0/7.0, 0.0) ;\\n\\n  vec4 p0 = grad4(j0,   ip);\\n  vec4 p1 = grad4(j1.x, ip);\\n  vec4 p2 = grad4(j1.y, ip);\\n  vec4 p3 = grad4(j1.z, ip);\\n  vec4 p4 = grad4(j1.w, ip);\\n\\n// Normalise gradients\\n  vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));\\n  p0 *= norm.x;\\n  p1 *= norm.y;\\n  p2 *= norm.z;\\n  p3 *= norm.w;\\n  p4 *= taylorInvSqrt(dot(p4,p4));\\n\\n// Mix contributions from the five corners\\n  vec3 m0 = max(0.6 - vec3(dot(x0,x0), dot(x1,x1), dot(x2,x2)), 0.0);\\n  vec2 m1 = max(0.6 - vec2(dot(x3,x3), dot(x4,x4)            ), 0.0);\\n  m0 = m0 * m0;\\n  m1 = m1 * m1;\\n  float final = 49.0 * ( dot(m0*m0, vec3( dot( p0, x0 ), dot( p1, x1 ), dot( p2, x2 )))\\n               + dot(m1*m1, vec2( dot( p3, x3 ), dot( p4, x4 ) ) ) ) ;\\n    return (final + 1.) / 2.;\\n}\\n\";\nvar oklab$1 = \"\\nfloat fixedpow(float a, float x)\\n{\\n    return pow(abs(a), x) * sign(a);\\n}\\n\\nfloat cbrt(float a)\\n{\\n    return fixedpow(a, 0.3333333333);\\n}\\n\\nvec3 lsrgb2oklab(vec3 c)\\n{\\n    float l = 0.4122214708 * c.r + 0.5363325363 * c.g + 0.0514459929 * c.b;\\n    float m = 0.2119034982 * c.r + 0.6806995451 * c.g + 0.1073969566 * c.b;\\n    float s = 0.0883024619 * c.r + 0.2817188376 * c.g + 0.6299787005 * c.b;\\n\\n    float l_ = cbrt(l);\\n    float m_ = cbrt(m);\\n    float s_ = cbrt(s);\\n\\n    return vec3(\\n        0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_,\\n        1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_,\\n        0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_\\n    );\\n}\\n\\nvec3 oklab2lsrgb(vec3 c)\\n{\\n    float l_ = c.r + 0.3963377774 * c.g + 0.2158037573 * c.b;\\n    float m_ = c.r - 0.1055613458 * c.g - 0.0638541728 * c.b;\\n    float s_ = c.r - 0.0894841775 * c.g - 1.2914855480 * c.b;\\n\\n    float l = l_ * l_ * l_;\\n    float m = m_ * m_ * m_;\\n    float s = s_ * s_ * s_;\\n\\n    return vec3(\\n        4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,\\n        -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,\\n        -0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s\\n    );\\n}\\n\";\nvar vertHead$2 = \"\\n    precision highp float;\\n    varying vec2 vUv;\\n    varying float terrain;\\n    varying float terrain_perc;\\n    varying vec3 vfNormal;\\n\\n    uniform float radius;\\n    uniform float time;\\n    uniform vec3 color;\\n\\n    \" + noise4D + \"\\n\";\nvar vert$2 = \"\\n    vec3 pos = position;\\n    \\n    terrain = 0.;\\n    float u_time = time * 0.25;\\n    \\n    terrain += 1. * pow(snoise(vec4(pos.xyz * 0.15, u_time + 100.)), 1.);\\n    terrain += 0.8 * pow(snoise(vec4(pos.xyz * 0.2, u_time + 200.)), 1.5);\\n    terrain += 0.4 * pow(snoise(vec4(pos.xyz * 0.8, u_time + 300.)), 2.);\\n    terrain += 0.2 * pow(snoise(vec4(pos.xyz * 1.6, u_time + 400.)), 8.);\\n    terrain_perc = terrain / (1. + 0.8 + 0.4 + 0.2);\\n    terrain_perc = terrain_perc;\\n    \\n    pos = pos + normal * 2. * 2. * (terrain_perc - 0.5);\\n    vfNormal = normal;\\n    \\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(pos, 1.);\\n\";\nvar fragHead$1 = \"\\n    precision highp float;\\n    varying vec2 vUv;\\n    varying vec3 vfNormal;\\n    varying float terrain;\\n    varying float terrain_perc;\\n\\n    uniform float time;\\n    uniform vec3 axiom;\\n    uniform float range;\\n    uniform vec3 up_norm;\\n    \\n    \\n    \" + rgb_helper + \"\\n    \" + oklab$1 + \"\\n\";\nvar frag$2 = \"\\n    vec3 hsv_col = rgb2hsv(gl_FragColor.rgb);\\n    \\n    // todo: offset vfNormal by up_norm\\n    vec3 oklab_axiom = lsrgb2oklab(axiom);\\n    vec3 oklab_range_idea = lsrgb2oklab(axiom + 0.35 * range * vfNormal);\\n    vec3 col = oklab2lsrgb(mix(oklab_axiom, oklab_range_idea, 1. - terrain_perc));\\n    \\n    gl_FragColor.rgb = col * pow(hsv_col.z, 1.3);\\n    \\n    \\n    gl_FragColor.rgb *= 0.15 + 1.85 * pow((1. - terrain_perc), 1.5);\\n\";\n\n// @ts-ignore\n/**\n * an idea is the fundamental substrate of reality.\n */\n\nvar Idea = /*#__PURE__*/function () {\n  // identifiers\n  // mediation\n  // [0, 1)\n  // [0, 1]\n  // [0, 1]\n  function Idea(m, s, u) {\n    if (m === void 0) {\n      m = 0;\n    }\n\n    if (s === void 0) {\n      s = 0;\n    }\n\n    if (u === void 0) {\n      u = 0.5;\n    }\n\n    this.setFromCreation(m, s, u);\n    return this;\n  }\n\n  var _proto = Idea.prototype;\n\n  _proto.setFromCreation = function setFromCreation(m, s, u) {\n    if (m === void 0) {\n      m = 0;\n    }\n\n    if (s === void 0) {\n      s = 0;\n    }\n\n    if (u === void 0) {\n      u = 0.5;\n    }\n\n    this.mediation = m;\n    this.specificity = s;\n    this.utility = u;\n    return this;\n  };\n\n  _proto.setFromHex = function setFromHex(hex) {\n    var color = culori__namespace.oklch(culori__namespace.rgb(hex));\n\n    if (!color) {\n      console.warn(\"idea :: setFromHex - invalid hex color\");\n      return this;\n    }\n\n    this.mediation = color.h / 360;\n    this.specificity = color.c / 0.322;\n    this.utility = color.l;\n    return this;\n  };\n\n  _proto.updateFromText = function updateFromText(text) {\n    var len = text.length;\n    this.mediation = hashStringToRange$1(text);\n    this.specificity = (1 - (len == 0 ? 1 : 1 / len)) * 0.5;\n    return this;\n  };\n\n  _proto.setUtility = function setUtility(utility) {\n    this.utility = utility;\n    return this;\n  };\n\n  _proto.getHex = function getHex() {\n    var fixedColor = culori__namespace.rgb({\n      mode: \"oklch\",\n      l: this.utility,\n      c: this.specificity * 0.322,\n      h: this.mediation * 360\n    });\n    return culori__namespace.formatHex(fixedColor);\n  };\n\n  _proto.getOpposite = function getOpposite() {\n    var newM = this.mediation + 0.5 > 1 ? this.mediation - 0.5 : this.mediation + 0.5;\n    var newS = this.specificity;\n    var newU = 0.5 - (this.utility - 0.5);\n    return new Idea().setFromCreation(newM, newS, newU);\n  };\n\n  _proto.clone = function clone() {\n    return new Idea(this.mediation, this.specificity, this.utility);\n  };\n\n  return Idea;\n}();\nvar AVG_CHAR_VAL$1 = 100; // each char is roughly 100, so loop every ~50 chars\n\nvar hashStringToRange$1 = function hashStringToRange(str, loop) {\n  if (loop === void 0) {\n    loop = 20;\n  }\n\n  var count = 0;\n\n  for (var i = 0; i < str.length; i++) {\n    count += str.substr(i, 1).charCodeAt(0);\n  }\n\n  var scaledLoop = loop * AVG_CHAR_VAL$1;\n  return count % scaledLoop / scaledLoop;\n};\n\nvar _excluded$o = [\"world\"];\nfunction VisualWorld(props) {\n  var world = props.world,\n      rest = _objectWithoutPropertiesLoose__default[\"default\"](props, _excluded$o);\n\n  var RADIUS = 4;\n  var SEED = react.useMemo(function () {\n    return Math.random();\n  }, []);\n  var mat = react.useMemo(function () {\n    var material = new three.MeshStandardMaterial({\n      metalness: 0.18,\n      roughness: 0.49,\n      side: three.DoubleSide\n    });\n\n    material.onBeforeCompile = function (shader) {\n      var uniforms = {\n        time: new three.Uniform(0),\n        axiom: new three.Uniform(new three.Color(\"#888888\")),\n        up_norm: new three.Uniform(new three.Vector3(0, 1, 0)),\n        range: new three.Uniform(0)\n      };\n      shader.uniforms = _extends__default[\"default\"]({}, shader.uniforms, uniforms);\n      shader.vertexShader = vertHead$2 + shader.vertexShader.replace(\"#include <worldpos_vertex>\", \"#include <worldpos_vertex>\\n\" + vert$2);\n      shader.fragmentShader = fragHead$1 + shader.fragmentShader.replace(\"#include <dithering_fragment>\", \"#include <dithering_fragment>\\n\" + frag$2);\n      material.userData.shader = shader;\n    };\n\n    material.needsUpdate = true;\n    return material;\n  }, []);\n  react.useEffect(function () {\n    if (!mat || !mat.userData.shader || !world) return;\n    var unifs = mat.userData.shader.uniforms;\n    var axiom = world ? world.getAxiom() : new Idea();\n    unifs.axiom.value.set(new three.Color(axiom.getHex()));\n    unifs.up_norm.value = world == null ? void 0 : world.getUpNorm();\n    unifs.range.value = world == null ? void 0 : world.getRange();\n  }, [world, mat]);\n  useLimitedFrame(50, function (_ref) {\n    var clock = _ref.clock;\n    if (!mat || !mat.userData.shader) return;\n    mat.userData.shader.uniforms.time.value = clock.elapsedTime + SEED * 500;\n  });\n  return /*#__PURE__*/React.createElement(\"group\", _extends__default[\"default\"]({\n    name: \"spacesvr-basis-world\"\n  }, rest), /*#__PURE__*/React.createElement(\"mesh\", {\n    material: mat,\n    scale: 0.2\n  }, /*#__PURE__*/React.createElement(\"sphereBufferGeometry\", {\n    args: [RADIUS, 48, 32]\n  })));\n}\n\nvar DOWN_AXIS = new three.Vector3(0, -1, 0);\n/**\n * Will smoothly rotate its children to face the camera along the Y axis, regardless of the parent's rotation.\n */\n\nfunction LookAtPlayer(props) {\n  var _props$enabled = props.enabled,\n      enabled = _props$enabled === void 0 ? true : _props$enabled,\n      children = props.children;\n  var group = react.useRef(null);\n  var flatDelta = react.useMemo(function () {\n    return new three.Vector2();\n  }, []);\n  var worldPos = react.useMemo(function () {\n    return new three.Vector3();\n  }, []);\n  var worldQuat = react.useMemo(function () {\n    return new three.Quaternion();\n  }, []);\n  var targetQuat = react.useMemo(function () {\n    return new three.Quaternion();\n  }, []);\n  var parentQuat = react.useMemo(function () {\n    return new three.Quaternion();\n  }, []);\n  var offsetRot = react.useMemo(function () {\n    return new three.Euler();\n  }, []);\n  useLimitedFrame(50, function (_ref, delta) {\n    var _group$current$parent;\n\n    var camera = _ref.camera;\n    if (!group.current) return;\n    (_group$current$parent = group.current.parent) == null ? void 0 : _group$current$parent.getWorldQuaternion(parentQuat);\n    offsetRot.setFromQuaternion(parentQuat, \"YXZ\");\n    targetQuat.set(0, 0, 0, 1);\n\n    if (enabled) {\n      group.current.getWorldPosition(worldPos);\n      group.current.getWorldQuaternion(worldQuat);\n      flatDelta.x = camera.position.x - worldPos.x;\n      flatDelta.y = camera.position.z - worldPos.z;\n      var angle = flatDelta.angle() - Math.PI / 2 + offsetRot.y;\n      targetQuat.setFromAxisAngle(DOWN_AXIS, angle);\n    }\n\n    group.current.quaternion.slerp(targetQuat, 0.11);\n  });\n  return /*#__PURE__*/React.createElement(\"group\", {\n    name: \"look-at-player\",\n    ref: group\n  }, children);\n}\n\nfunction Background$1(props) {\n  var color = props.color;\n  var scene = fiber.useThree(function (state) {\n    return state.scene;\n  });\n  react.useLayoutEffect(function () {\n    var oldBackground = scene.background;\n    var col = color instanceof three.Color ? color : new three.Color(color);\n    scene.background = col;\n    return function () {\n      scene.background = oldBackground;\n    };\n  }, [color]);\n  return null;\n}\n\nfunction Fog(props) {\n  var _props$color = props.color,\n      color = _props$color === void 0 ? \"white\" : _props$color,\n      _props$near = props.near,\n      near = _props$near === void 0 ? 10 : _props$near,\n      _props$far = props.far,\n      far = _props$far === void 0 ? 80 : _props$far;\n  var scene = fiber.useThree(function (state) {\n    return state.scene;\n  });\n  react.useEffect(function () {\n    var col = color instanceof three.Color ? color : new three.Color(color);\n    scene.fog = new three.Fog(col, near, far);\n    return function () {\n      scene.fog = null;\n    };\n  }, [scene, color, near, far]);\n  return null;\n}\n\nfunction InfinitePlane(props) {\n  var _props$height = props.height,\n      height = _props$height === void 0 ? -0.0001 : _props$height,\n      _props$size = props.size,\n      size = _props$size === void 0 ? [100, 100] : _props$size,\n      visible = props.visible;\n\n  var _usePlane = cannon.usePlane(function () {\n    return {\n      rotation: [-Math.PI / 2, 0, 0],\n      position: [0, height, 0],\n      args: size,\n      type: \"Static\"\n    };\n  }),\n      ref = _usePlane[0];\n\n  if (!visible) return null;\n  return /*#__PURE__*/React.createElement(\"mesh\", {\n    name: \"spacesvr-infinite-plane\",\n    ref: ref\n  }, /*#__PURE__*/React.createElement(\"planeBufferGeometry\", {\n    args: size\n  }), /*#__PURE__*/React.createElement(\"meshPhongMaterial\", {\n    color: \"#660000\"\n  }));\n}\n\nvar _excluded$n = [\"url\", \"dCone\", \"rollOff\", \"volume\", \"setAudioAnalyser\", \"fftSize\"];\nfunction Audio$1(props) {\n  var url = props.url,\n      _props$dCone = props.dCone,\n      dCone = _props$dCone === void 0 ? new three.Vector3(180, 230, 0.1) : _props$dCone,\n      _props$rollOff = props.rollOff,\n      rollOff = _props$rollOff === void 0 ? 1 : _props$rollOff,\n      _props$volume = props.volume,\n      volume = _props$volume === void 0 ? 1 : _props$volume,\n      setAudioAnalyser = props.setAudioAnalyser,\n      _props$fftSize = props.fftSize,\n      fftSize = _props$fftSize === void 0 ? 128 : _props$fftSize,\n      rest = _objectWithoutPropertiesLoose__default[\"default\"](props, _excluded$n);\n\n  var _useState = react.useState(),\n      speaker = _useState[0],\n      setSpeaker = _useState[1];\n\n  var camera = fiber.useThree(function (state) {\n    return state.camera;\n  });\n  var audio = react.useMemo(function () {\n    var a = document.createElement(\"audio\");\n    a.src = url;\n    a.autoplay = false;\n    a.preload = \"auto\";\n    a.crossOrigin = \"Anonymous\";\n    a.loop = true;\n    return a;\n  }, []);\n  react.useEffect(function () {\n    var setupAudio = function setupAudio() {\n      if (!audio.paused && !speaker) {\n        var listener = new three.AudioListener();\n        camera.add(listener);\n        var speak = new three.PositionalAudio(listener);\n        speak.setMediaElementSource(audio);\n        speak.setRefDistance(0.75);\n        speak.setRolloffFactor(rollOff);\n        speak.setVolume(volume);\n        speak.setDirectionalCone(dCone.x, dCone.y, dCone.z);\n\n        if (setAudioAnalyser) {\n          setAudioAnalyser(new three.AudioAnalyser(speak, fftSize));\n        }\n\n        setSpeaker(speak);\n      }\n    };\n\n    var playAudio = function playAudio() {\n      return audio.play().then(function () {\n        return setupAudio();\n      });\n    };\n\n    if (audio) {\n      audio.setAttribute(\"src\", url);\n      audio.play().then(function () {\n        return setupAudio();\n      });\n      document.addEventListener(\"click\", playAudio);\n      return function () {\n        document.removeEventListener(\"click\", playAudio);\n      };\n    }\n  }, [speaker, audio, url]);\n  react.useEffect(function () {\n    if (!speaker) return;\n    speaker.setRolloffFactor(rollOff);\n    speaker.setVolume(volume);\n    speaker.setDirectionalCone(dCone.x, dCone.y, dCone.z);\n  }, [dCone, rollOff, volume]);\n  return /*#__PURE__*/React.createElement(\"group\", _extends__default[\"default\"]({\n    name: \"spacesvr-audio\"\n  }, rest), speaker && /*#__PURE__*/React.createElement(\"primitive\", {\n    object: speaker\n  }));\n}\n\nfunction HDRI(props) {\n  var src = props.src,\n      disableBackground = props.disableBackground,\n      disableEnvironment = props.disableEnvironment;\n  return /*#__PURE__*/React.createElement(react.Suspense, {\n    fallback: null\n  }, /*#__PURE__*/React.createElement(drei.Environment, {\n    files: src,\n    background: !disableBackground && !disableEnvironment ? true : disableEnvironment && !disableBackground ? \"only\" : false\n  }));\n}\n\nvar fallbackTexture;\nvar SIZE = 128;\nvar SIZE_2 = SIZE / 2;\nvar RAD = 12;\nvar LINE_W = 1;\n/**\n * Provides a default texture that is created locally\n */\n\nfunction getFallbackTexture() {\n  if (fallbackTexture) return fallbackTexture;\n  var canvas = document.createElement(\"canvas\");\n  canvas.height = SIZE;\n  canvas.width = SIZE;\n  var context = canvas.getContext(\"2d\");\n  context.fillStyle = \"#FFFFFF\";\n  context.fillRect(0, 0, SIZE, SIZE); // main circle\n\n  context.fillStyle = \"#000000\";\n  context.beginPath();\n  context.arc(SIZE_2, SIZE_2, RAD, 0, 2 * Math.PI);\n  context.fill(); // draw a white line down the middle of the circle\n\n  context.strokeStyle = \"#FFFFFF\";\n  context.lineWidth = Math.ceil(LINE_W);\n  context.beginPath();\n  context.moveTo(SIZE_2, SIZE_2 - RAD);\n  context.lineTo(SIZE_2, SIZE_2 + RAD);\n  context.stroke(); // draw a horizontal line across the middle of the circle\n\n  context.beginPath();\n  context.moveTo(SIZE_2 - RAD, SIZE_2);\n  context.lineTo(SIZE_2 + RAD, SIZE_2);\n  context.stroke();\n  fallbackTexture = new three.CanvasTexture(canvas);\n  return fallbackTexture;\n}\n\nvar KTX_CDN = \"https://cdn.jsdelivr.net/gh/pmndrs/drei-assets@master/basis/\";\nvar textureLoader = new three.TextureLoader();\nvar ktx2loader; // it's inconvenient to have to produce a gl object to check for ktx2 support, especially when it comes to the cache keys\n// solution is to create a skeleton object that provides the minimum requirements to check for ktx support, defined below\n// https://github.com/mrdoob/three.js/blob/master/examples/jsm/loaders/KTX2Loader.js#L113-L135\n\nvar setupKtx2 = function setupKtx2() {\n  if (ktx2loader) return;\n  ktx2loader = new KTX2Loader.KTX2Loader();\n  ktx2loader.setTranscoderPath(KTX_CDN);\n  var supportsWebgl2;\n  var el = document.createElement(\"canvas\");\n  var gl = el.getContext(\"webgl2\");\n\n  if (gl) {\n    supportsWebgl2 = true;\n  } else {\n    gl = el.getContext(\"webgl\");\n    supportsWebgl2 = false;\n  }\n\n  if (!gl) {\n    throw new Error(\"No WebGL support\");\n  }\n\n  el.remove();\n  var minimumGL = {\n    extensions: new WebGLExtensions.WebGLExtensions(gl),\n    capabilities: {\n      isWebGL2: supportsWebgl2\n    }\n  }; // @ts-ignore\n\n  ktx2loader.detectSupport(minimumGL);\n};\n\nfunction loadimage() {\n  return function (url) {\n    var IS_KTX2 = url.toLowerCase().endsWith(\"ktx2\");\n    setupKtx2();\n    var loader = IS_KTX2 ? ktx2loader : textureLoader;\n    return new Promise(function (res) {\n      return loader.load(url, res, undefined, function (error) {\n        console.error(error);\n        res(getFallbackTexture());\n      });\n    });\n  };\n}\n/**\n * A single hook akin to useTexture but with ktx support\n *\n * KTX_CDN is from drei so that we don't download two separate transcoders when using the useKtx2 hook elsewhere\n * https://github.com/pmndrs/drei/blob/a2daf02853f624ef6062c70ba0b218bc03e5b626/src/core/useKTX2.tsx#L7\n * @param url\n */\n\n\nfunction useImage(url) {\n  return suspendReact.suspend(loadimage(), [url]);\n}\n\nuseImage.preload = function (url) {\n  return suspendReact.preload(loadimage(), [url]);\n};\n\nuseImage.clear = function (url) {\n  return suspendReact.clear([url]);\n};\n/**\n * A hook to load gltf models with draco, meshopt, and ktx2 support out of the box\n *\n * For all cases, functionality is to only download decoder files if needed by the file\n * @param url\n */\n\n\nfunction useModel(url) {\n  return drei.useGLTF(url, true, true, function (loader) {\n    setupKtx2();\n    loader.setKTX2Loader(ktx2loader);\n  });\n}\n\nuseModel.preload = function (url) {\n  return drei.useGLTF.preload(url, true, true, function (loader) {\n    setupKtx2();\n    loader.setKTX2Loader(ktx2loader);\n  });\n};\n\nuseModel.clear = function (url) {\n  return drei.useGLTF.clear([url]);\n};\n\n/**\n *\n * Builds a frame for a mesh with a texture (image, video, etc.)\n *\n * In the code, the frame is the back panel and the border is the\n * four meshes that make up the top, left, right, and bottom sides\n * of the border.\n *\n * @param props\n * @constructor\n */\nfunction Frame(props) {\n  var width = props.width,\n      height = props.height,\n      _props$thickness = props.thickness,\n      thickness = _props$thickness === void 0 ? 1 : _props$thickness,\n      passedMaterial = props.material,\n      innerFrameMaterial = props.innerFrameMaterial;\n  var material = react.useMemo(function () {\n    return passedMaterial || new three.MeshStandardMaterial({\n      color: 0x333333,\n      roughness: 0.8,\n      metalness: 0.05\n    });\n  }, [passedMaterial]);\n  var frameDepth = 0.075;\n  var frameWidth = 0.06;\n  var borderDepth = 0.08;\n  var borderThickness = 0.05 * thickness;\n  var meshOffset = 0.0005;\n  var geometry = react.useMemo(function () {\n    var backPanel = new three.BoxBufferGeometry(width + frameWidth, height + frameWidth, frameDepth);\n    backPanel.translate(0, 0, -frameDepth - meshOffset);\n    var topFrame = new three.BoxBufferGeometry(width + frameWidth, borderThickness, borderDepth);\n    topFrame.translate(0, height / 2 + frameWidth / 2 - borderThickness / 2, 0);\n    var bottomFrame = new three.BoxBufferGeometry(width + frameWidth, borderThickness, borderDepth);\n    bottomFrame.translate(0, -height / 2 - frameWidth / 2 + borderThickness / 2, 0);\n    var leftFrame = new three.BoxBufferGeometry(borderThickness, height + frameWidth, borderDepth);\n    leftFrame.translate(-width / 2 - frameWidth / 2 + borderThickness / 2, 0, 0);\n    var rightFrame = new three.BoxBufferGeometry(borderThickness, height + frameWidth, borderDepth);\n    rightFrame.translate(width / 2 + frameWidth / 2 - borderThickness / 2, 0, 0);\n    var geos = [backPanel, topFrame, bottomFrame, leftFrame, rightFrame];\n    var geo = BufferGeometryUtils.mergeBufferGeometries(geos);\n    backPanel.dispose();\n    topFrame.dispose();\n    bottomFrame.dispose();\n    leftFrame.dispose();\n    rightFrame.dispose();\n    return geo;\n  }, [innerFrameMaterial, borderThickness, width, height]);\n  var backFrameGeometry = react.useMemo(function () {\n    if (!innerFrameMaterial) return undefined;\n    var backPanel = new three.BoxBufferGeometry(width + frameWidth, height + frameWidth, frameDepth);\n    backPanel.translate(0, 0, -frameDepth - meshOffset);\n    return backPanel;\n  }, [innerFrameMaterial, width, height]);\n  return /*#__PURE__*/React.createElement(\"group\", {\n    name: \"spacesvr-frame\"\n  }, /*#__PURE__*/React.createElement(\"mesh\", {\n    geometry: geometry,\n    material: material\n  }), backFrameGeometry && innerFrameMaterial && /*#__PURE__*/React.createElement(\"mesh\", {\n    geometry: backFrameGeometry,\n    material: innerFrameMaterial\n  }));\n}\n\nvar _excluded$m = [\"src\", \"size\", \"framed\", \"frameMaterial\", \"frameWidth\", \"innerFrameMaterial\"];\n\nfunction UnsuspensedImage(props) {\n  var src = props.src,\n      _props$size = props.size,\n      size = _props$size === void 0 ? 1 : _props$size,\n      framed = props.framed,\n      frameMaterial = props.frameMaterial,\n      _props$frameWidth = props.frameWidth,\n      frameWidth = _props$frameWidth === void 0 ? 1 : _props$frameWidth,\n      innerFrameMaterial = props.innerFrameMaterial,\n      rest = _objectWithoutPropertiesLoose__default[\"default\"](props, _excluded$m);\n\n  var tex = useImage(src);\n  var _tex$image = tex.image,\n      width = _tex$image.width,\n      height = _tex$image.height;\n  var max = Math.max(width, height);\n  var WIDTH = width / max * size;\n  var HEIGHT = height / max * size;\n  var IS_COMPRESSED = tex.isCompressedTexture;\n  return /*#__PURE__*/React.createElement(\"group\", _extends__default[\"default\"]({\n    name: \"spacesvr-image\"\n  }, rest), /*#__PURE__*/React.createElement(\"mesh\", {\n    rotation: IS_COMPRESSED ? [0, Math.PI, Math.PI] : [0, 0, 0]\n  }, /*#__PURE__*/React.createElement(\"planeBufferGeometry\", {\n    args: [WIDTH, HEIGHT]\n  }), /*#__PURE__*/React.createElement(\"meshBasicMaterial\", {\n    map: tex,\n    side: three.DoubleSide,\n    transparent: true\n  })), framed && /*#__PURE__*/React.createElement(Frame, {\n    width: WIDTH,\n    height: HEIGHT,\n    thickness: frameWidth,\n    material: frameMaterial,\n    innerFrameMaterial: innerFrameMaterial\n  }));\n}\n\nfunction Image$1(props) {\n  return /*#__PURE__*/React.createElement(react.Suspense, {\n    fallback: null\n  }, /*#__PURE__*/React.createElement(UnsuspensedImage, props));\n}\n\n/**\n * a world is a set of ideas\n */\nvar World = /*#__PURE__*/function () {\n  function World() {\n    return this;\n  }\n\n  var _proto = World.prototype;\n\n  _proto.getIdea = function getIdea() {\n    return new Idea().setFromCreation(hashStringToRange(JSON.stringify(this.tree || this.id), 3), 0.3 + 0.7 * hashStringToRange(this.id), 0.8);\n  };\n\n  _proto.getAxiom = function getAxiom() {\n    var str = JSON.stringify(this.tree || this.id);\n    var strHash = new Array(10).fill(1).map(function () {\n      return str;\n    }).join(\"\");\n    return new Idea().setFromCreation(hashStringToRange(strHash, 15), 0.3 + 0.7 * hashStringToRange(strHash, 10), 0.8);\n  };\n\n  _proto.getUpNorm = function getUpNorm() {\n    // 4 digit long hex values\n    var x = parseInt(this.id.split(\"-\")[1], 16) / Math.pow(16, 4);\n    var y = parseInt(this.id.split(\"-\")[2], 16) / Math.pow(16, 4);\n    var z = parseInt(this.id.split(\"-\")[3], 16) / Math.pow(16, 4);\n    return new three.Vector3(x, y, z).normalize();\n  };\n\n  _proto.getRange = function getRange() {\n    var r = parseInt(this.id.split(\"-\")[0], 16) / Math.pow(16, 8);\n    return 0.3 + 0.7 * r;\n  };\n\n  _proto.getHex = function getHex() {\n    return this.getIdea().getHex();\n  };\n\n  return World;\n}();\nvar AVG_CHAR_VAL = 100; // each char is roughly 100, so loop every ~50 chars\n\nvar hashStringToRange = function hashStringToRange(str, loop) {\n  if (loop === void 0) {\n    loop = 8;\n  }\n\n  var count = 0;\n\n  for (var i = 0; i < str.length; i++) {\n    count += str.substr(i, 1).charCodeAt(0);\n  }\n\n  var scaledLoop = loop * AVG_CHAR_VAL;\n  return count % scaledLoop / scaledLoop;\n};\n\n/**\n * A site is a delivery method of a world.\n */\nvar Site = function Site() {\n  return this;\n};\n\n/**\n * Gets the number of triangles in a geometry\n */\n\nvar getGeometryTriCount$1 = function getGeometryTriCount(geometry) {\n  return geometry.index ? geometry.index.count / 3 : geometry.attributes.position.count / 3;\n};\n/**\n * For a given mesh, set up bvh raycasting for it if it meets the threshold for\n * amount of triangles to use\n *\n * @param mesh\n * @param threshold\n */\n\n\nvar enableBVHRaycast = function enableBVHRaycast(mesh, threshold) {\n  if (threshold === void 0) {\n    threshold = 0;\n  }\n\n  if (!mesh.geometry || !mesh.geometry.isBufferGeometry) {\n    return;\n  }\n\n  var geometry = mesh.geometry;\n  var triCount = getGeometryTriCount$1(geometry);\n  if (geometry.boundsTree || triCount < threshold) return;\n  mesh.raycast = threeMeshBvh.acceleratedRaycast;\n  geometry.computeBoundsTree = threeMeshBvh.computeBoundsTree;\n  geometry.disposeBoundsTree = threeMeshBvh.disposeBoundsTree;\n  geometry.computeBoundsTree({\n    verbose: true\n  });\n};\n\nvar universe_cache = new Map();\n\nfunction getResource(key, constructor, opts) {\n  var resource = universe_cache.get(key);\n\n  if (!resource) {\n    if (opts != null && opts.verbose) console.log(\"[CACHE] \" + key + \" not found, creating new\");\n    resource = constructor();\n    universe_cache.set(key, resource);\n  } else {\n    if (opts != null && opts.verbose) console.log(\"[CACHE] \" + key + \" found, returning\");\n  }\n\n  return resource;\n}\n\nvar cache = {\n  getResource: getResource,\n  useResource: function useResource(key, constructor, opts) {\n    var _useState = react.useState(getResource(key, constructor, opts)),\n        resource = _useState[0],\n        setResource = _useState[1];\n\n    react.useEffect(function () {\n      setResource(getResource(key, constructor, opts));\n    }, [key]);\n    return resource;\n  },\n\n  get mat_standard_white() {\n    return getResource(\"mat_standard_white\", function () {\n      return new three.MeshStandardMaterial({\n        color: \"white\"\n      });\n    });\n  },\n\n  get mat_standard_cream_double() {\n    return getResource(\"mat_standard_cream_double\", function () {\n      return new three.MeshStandardMaterial({\n        color: \"#aaa\",\n        side: three.DoubleSide\n      });\n    });\n  },\n\n  get mat_standard_black() {\n    return getResource(\"mat_standard_black\", function () {\n      return new three.MeshStandardMaterial({\n        color: \"black\"\n      });\n    });\n  },\n\n  get mat_standard_rose() {\n    return getResource(\"mat_standard_rose\", function () {\n      return new three.MeshStandardMaterial({\n        color: \"#ff007f\"\n      });\n    });\n  },\n\n  get mat_standard_red() {\n    return getResource(\"mat_standard_red\", function () {\n      return new three.MeshStandardMaterial({\n        color: \"#ff0000\"\n      });\n    });\n  },\n\n  get mat_basic_white() {\n    return getResource(\"mat_basic_white\", function () {\n      return new three.MeshBasicMaterial({\n        color: \"white\"\n      });\n    });\n  },\n\n  get mat_basic_black() {\n    return getResource(\"mat_basic_black\", function () {\n      return new three.MeshBasicMaterial({\n        color: \"black\"\n      });\n    });\n  },\n\n  get mat_basic_gray() {\n    return getResource(\"mat_basic_gray\", function () {\n      return new three.MeshBasicMaterial({\n        color: \"#828282\"\n      });\n    });\n  },\n\n  get mat_basic_red() {\n    return getResource(\"mat_basic_red\", function () {\n      return new three.MeshBasicMaterial({\n        color: \"red\"\n      });\n    });\n  },\n\n  get mat_basic_black_wireframe() {\n    return getResource(\"mat_basic_black_wireframe\", function () {\n      return new three.MeshBasicMaterial({\n        color: \"black\",\n        wireframe: true\n      });\n    });\n  }\n\n};\n\nvar useTrimeshCollision$1 = function useTrimeshCollision(geometry) {\n  var indices = geometry.index.array;\n  var isInterleaved = // @ts-ignore\n  geometry.attributes.position.isInterleavedBufferAttribute;\n  var vertices = [];\n\n  if (isInterleaved) {\n    var attr = geometry.attributes.position;\n    var data = attr.data;\n\n    for (var i = attr.offset; i < data.array.length; i += data.stride) {\n      for (var x = 0; x < attr.itemSize; x++) {\n        vertices.push(data.array[i + x]);\n      }\n    }\n  } else {\n    vertices = geometry.attributes.position.array;\n  }\n\n  var _useTrimesh = cannon.useTrimesh(function () {\n    return {\n      type: \"Static\",\n      args: [vertices, indices]\n    };\n  }),\n      hitbox = _useTrimesh[0];\n\n  return hitbox;\n};\n\n// check whether the user is currently typing\nvar isTyping = function isTyping() {\n  var _document, _document$activeEleme, _document2;\n\n  return ((_document = document) == null ? void 0 : (_document$activeEleme = _document.activeElement) == null ? void 0 : _document$activeEleme.tagName) === \"INPUT\" && ((_document2 = document) == null ? void 0 : _document2.hasFocus());\n};\n\nvar useDrag = function useDrag(callback, domElem, deps) {\n  if (deps === void 0) {\n    deps = [];\n  }\n\n  var _useThree = fiber.useThree(),\n      clock = _useThree.clock,\n      size = _useThree.size,\n      viewport = _useThree.viewport;\n\n  var aspect = size.width / viewport.width;\n\n  var _useState = react.useState(new three.Vector2()),\n      downPoint = _useState[0];\n\n  var _useState2 = react.useState(new three.Vector2()),\n      dragPoint = _useState2[0];\n\n  var _useState3 = react.useState(new three.Vector2()),\n      velocity = _useState3[0];\n\n  var _useState4 = react.useState(new three.Vector2()),\n      delta = _useState4[0];\n\n  var lastTouchRead = react.useRef(0);\n  var onStart = react.useCallback(function (p) {\n    if (callback.onStart) callback.onStart(p);\n  }, [].concat(deps));\n  var onMove = react.useCallback(function (p) {\n    if (callback.onMove) callback.onMove(p);\n  }, [].concat(deps));\n  var onEnd = react.useCallback(function (p) {\n    if (callback.onEnd) callback.onEnd(p);\n  }, [].concat(deps));\n  var startDrag = react.useCallback(function (e) {\n    e.preventDefault();\n    var touch = e.changedTouches[0];\n    downPoint.set(touch.clientX, touch.clientY);\n    onStart({\n      e: e,\n      touch: touch,\n      downPoint: downPoint,\n      dragPoint: downPoint,\n      velocity: velocity\n    });\n  }, [onStart, downPoint, velocity]);\n  var moveDrag = react.useCallback(function (e) {\n    var touch = e.touches[0];\n    dragPoint.set(touch.clientX, touch.clientY);\n    var delta = dragPoint.sub(downPoint);\n    var time = clock.elapsedTime;\n    var elapsed = time - lastTouchRead.current;\n    velocity.set(delta.x / elapsed / aspect, delta.y / elapsed / aspect);\n    lastTouchRead.current = time;\n    onMove({\n      e: e,\n      touch: touch,\n      downPoint: downPoint,\n      dragPoint: dragPoint,\n      velocity: velocity,\n      delta: delta\n    });\n  }, [aspect, onMove, clock, downPoint, dragPoint, velocity]);\n  var endDrag = react.useCallback(function (e) {\n    var touch = e.changedTouches[0];\n    dragPoint.set(touch.clientX, touch.clientY);\n    delta.copy(dragPoint).sub(downPoint);\n    onEnd({\n      e: e,\n      touch: touch,\n      downPoint: downPoint,\n      dragPoint: dragPoint,\n      velocity: velocity,\n      delta: delta\n    });\n  }, [onEnd, delta, downPoint, dragPoint, velocity]);\n  react.useEffect(function () {\n    var elem = domElem || document;\n    elem.addEventListener(\"touchstart\", startDrag);\n    elem.addEventListener(\"touchmove\", moveDrag);\n    elem.addEventListener(\"touchend\", endDrag);\n    return function () {\n      elem.removeEventListener(\"touchstart\", startDrag);\n      elem.removeEventListener(\"touchmove\", moveDrag);\n      elem.removeEventListener(\"touchend\", endDrag);\n    };\n  }, [domElem, endDrag, moveDrag, startDrag]);\n  return {\n    startDrag: startDrag,\n    moveDrag: moveDrag,\n    endDrag: endDrag\n  };\n};\n\nvar PADDING_X = 0.125;\nvar PADDING_X_2 = PADDING_X * 2;\nvar PADDING_Y = 0.125;\nvar PADDING_Y_2 = PADDING_Y * 2;\nvar RAD_PER_DEG_2 = Math.PI / 180 / 2;\nvar getHudPos = function getHudPos(pos, camera, distance, target) {\n  var vFOV = camera.fov * RAD_PER_DEG_2;\n  var height = 2 * Math.tan(vFOV) * Math.abs(distance);\n  var width = height * camera.aspect;\n  var px = pos.x || pos[0];\n  var py = pos.y || pos[1];\n  var x = px * (width - PADDING_X_2) * 0.5;\n  var y = py * (height - PADDING_Y_2) * 0.5;\n\n  if (target) {\n    target.x = x;\n    target.y = y;\n    return target;\n  }\n\n  return new three.Vector2(x, y);\n};\nvar getHudDims = function getHudDims(camera, distance) {\n  var vFOV = camera.fov * RAD_PER_DEG_2;\n  var height = 2 * Math.tan(vFOV) * Math.abs(distance);\n  var width = height * camera.aspect;\n  return {\n    width: width,\n    height: height\n  };\n};\nvar useHudDims = function useHudDims(distance) {\n  if (distance === void 0) {\n    distance = 1;\n  }\n\n  var camera = fiber.useThree(function (state) {\n    return state.camera;\n  });\n  return react.useMemo(function () {\n    return getHudDims(camera, distance); // make sure aspect is there\n  }, [camera, distance, camera.aspect]);\n};\n\nvar _templateObject$6;\nvar Container$2 = styled__default[\"default\"].div(_templateObject$6 || (_templateObject$6 = _taggedTemplateLiteralLoose__default[\"default\"]([\"\\n  position: absolute;\\n  width: 100%;\\n  height: 100%;\\n  overflow: hidden;\\n\\n  canvas {\\n    position: absolute;\\n    top: 0;\\n    right: 0;\\n    bottom: 0;\\n    left: 0;\\n    outline: 0;\\n  }\\n\"])));\n\nvar _templateObject$5;\nvar globalStyles = react$1.css(_templateObject$5 || (_templateObject$5 = _taggedTemplateLiteralLoose__default[\"default\"]([\"\\n  @font-face {\\n    font-family: \\\"Quicksand\\\";\\n    /* src: url(\\\"https://d27rt3a60hh1lx.cloudfront.net/fonts/Quicksand_Bold.otf\\\"); */\\n    src: url(\\\"https://cdn.websessions.co/select/fonts/FTBasicSpace-Regular.woff2\\\");\\n  }\\n\\n  html {\\n    position: fixed;\\n    height: 100%;\\n    overflow: hidden;\\n  }\\n\\n  body {\\n    margin: 0;\\n    width: 100vw;\\n    height: 100vh;\\n    user-select: none;\\n    overflow: hidden;\\n    touch-action: none;\\n    -webkit-overflow-scrolling: touch;\\n    font-family: \\\"Quicksand\\\", sans-serif;\\n    font-size: 27px;\\n    @media screen and (max-width: 500px) {\\n      font-size: 24px;\\n    }\\n  }\\n\"])));\nfunction GlobalStyles() {\n  react.useEffect(function () {\n    var view = document.createElement(\"meta\");\n    view.name = \"viewport\";\n    view.content = \"initial-scale=1, viewport-fit=cover\";\n    document.head.append(view);\n    return function () {\n      document.head.removeChild(view);\n    };\n  }, []);\n  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(react$1.Global, {\n    styles: globalStyles\n  }));\n}\n\n/**\n * A modified version of the controlled progress hooks that adds\n * - a minimum wait time, in case it takes a second to register an asset\n * - a delay after it reaches 100 in case it goes back down\n * - a timeout when it reaches > 50%, marked as stuck\n */\n\nvar useControlledProgress = function useControlledProgress() {\n  var MIN_TIME = 2000; // minimum time to wait before moving to 100\n\n  var AFTER_TIME = 300; // extra time to prevent bouncing at reaching 100\n\n  var _useProgress = drei.useProgress(),\n      progress = _useProgress.progress,\n      total = _useProgress.total;\n\n  var startTime = react.useRef(new Date());\n  var controlledProgress = react.useRef(0);\n  var finished = react.useRef(false);\n\n  var _useState = react.useState(0),\n      setForceRender = _useState[1];\n\n  react.useEffect(function () {\n    var newTime = new Date();\n    var timeElapsed = newTime.getTime() - startTime.current.getTime();\n    var diff = Math.min(progress - controlledProgress.current, timeElapsed < MIN_TIME ? 99 : 100);\n\n    if (diff > 0) {\n      if (progress === 100) {\n        finished.current = true; // if progress 100, check in AFTER_TIME ms to make sure it hasn't\n        // bounced back down\n\n        setTimeout(function () {\n          if (finished.current) {\n            controlledProgress.current = progress; // set state to force re render\n\n            setForceRender(Math.random());\n          }\n        }, AFTER_TIME);\n      } else {\n        finished.current = false;\n        controlledProgress.current = progress;\n      }\n    }\n\n    if (progress !== 100) {\n      finished.current = false;\n    }\n  }, [progress]); // wait TIMEOUT (ms) to check if any objects are waiting to be loaded\n\n  var _useState2 = react.useState(0),\n      counter = _useState2[0],\n      setCounter = _useState2[1];\n\n  var _useState3 = react.useState(false),\n      skip = _useState3[0],\n      setSkip = _useState3[1];\n\n  react.useEffect(function () {\n    if (total > 0) {\n      return;\n    } else if (counter > 0) {\n      setSkip(true);\n    } else {\n      setTimeout(function () {\n        return setCounter(counter + 1);\n      }, MIN_TIME);\n    }\n  }, [counter]);\n  return skip ? 100 : Math.floor(controlledProgress.current);\n};\n\nvar _templateObject$4, _templateObject2$2, _templateObject3$2, _templateObject4$2, _templateObject5$2;\n\nvar _float = react$1.keyframes(_templateObject$4 || (_templateObject$4 = _taggedTemplateLiteralLoose__default[\"default\"]([\"\\n  0% {\\n    transform: translatey(0px);\\n  }\\n\\n  50% {\\n    transform: translatey(-15px);\\n  }\\n\\n  100% {\\n    transform: translatey(0px);\\n  }\\n\"])));\n\nvar grow = react$1.keyframes(_templateObject2$2 || (_templateObject2$2 = _taggedTemplateLiteralLoose__default[\"default\"]([\"\\n  0% {\\n    opacity: 0.8;\\n  }\\n\\n  50% {\\n    opacity: 0.2;\\n  }\\n\\n  100% {\\n    opacity: 0.8;\\n  }\\n\"])));\nvar Container$1 = styled__default[\"default\"].div(_templateObject3$2 || (_templateObject3$2 = _taggedTemplateLiteralLoose__default[\"default\"]([\"\\n  width: 100%;\\n  height: 100%;\\n  position: absolute;\\n  top: 0;\\n  left: 0;\\n  z-index: 200;\\n  background: white;\\n  transition: opacity 0.75s ease-in;\\n  transition-delay: 0.5s;\\n  opacity: \", \";\\n  pointer-events: \", \";\\n  display: flex;\\n  justify-content: center;\\n  align-items: center;\\n  flex-direction: column;\\n\"])), function (props) {\n  return props.finished ? \"0\" : \"1\";\n}, function (props) {\n  return props.finished ? \"none\" : \"all\";\n});\nvar Text$1 = styled__default[\"default\"].div(_templateObject4$2 || (_templateObject4$2 = _taggedTemplateLiteralLoose__default[\"default\"]([\"\\n  animation: \", \" 7s ease-in-out infinite;\\n\"])), _float);\nvar Wrapper$1 = styled__default[\"default\"].div(_templateObject5$2 || (_templateObject5$2 = _taggedTemplateLiteralLoose__default[\"default\"]([\"\\n  position: relative;\\n\\n  &:before {\\n    pointer-events: none;\\n    position: absolute;\\n    content: \\\"\\\";\\n    top: 100%;\\n    left: 5%;\\n    height: 10px;\\n    width: 90%;\\n    background: -webkit-radial-gradient(\\n      center,\\n      ellipse,\\n      rgba(0, 0, 0, 0.35) 0%,\\n      transparent 80%\\n    );\\n    background: radial-gradient(\\n      ellipse at center,\\n      rgba(0, 0, 0, 0.35) 0%,\\n      transparent 80%\\n    );\\n    -webkit-transition-duration: 0.3s;\\n    transition-duration: 0.3s;\\n    -webkit-transition-property: transform, opacity;\\n    transition-property: transform, opacity;\\n    animation: \", \" 7s ease-in-out infinite;\\n  }\\n\"])), grow);\nfunction LoadingScreen() {\n  var progress = useControlledProgress();\n  return /*#__PURE__*/React.createElement(Container$1, {\n    finished: progress === 100\n  }, /*#__PURE__*/React.createElement(Wrapper$1, null, /*#__PURE__*/React.createElement(Text$1, null, Math.round(progress), \"%\")));\n}\n\nvar _templateObject$3, _templateObject2$1, _templateObject3$1, _templateObject4$1, _templateObject5$1, _templateObject6, _templateObject7, _templateObject8, _templateObject9;\nvar Container = styled__default[\"default\"].div(_templateObject$3 || (_templateObject$3 = _taggedTemplateLiteralLoose__default[\"default\"]([\"\\n  width: 100%;\\n  height: 100%;\\n  position: absolute;\\n  top: 0;\\n  left: 0;\\n  z-index: 100;\\n  transition: opacity 0.25s ease;\\n  background: rgba(0, 0, 0, \", \");\\n  display: flex;\\n  justify-content: center;\\n  flex-direction: column;\\n  align-items: center;\\n  opacity: \", \";\\n  pointer-events: \", \";\\n  font-family: \\\"Quicksand\\\", sans-serif;\\n\"])), function (props) {\n  return props.dev ? 0 : 0.25;\n}, function (props) {\n  return props.paused ? 1 : 0;\n}, function (props) {\n  return props.paused ? \"all\" : \"none\";\n});\nstyled__default[\"default\"].div(_templateObject2$1 || (_templateObject2$1 = _taggedTemplateLiteralLoose__default[\"default\"]([\"\\n  width: 100%;\\n  height: 100%;\\n  position: absolute;\\n  top: 0;\\n  left: 0;\\n  z-index: -1;\\n\"])));\nvar Window = styled__default[\"default\"].div(_templateObject3$1 || (_templateObject3$1 = _taggedTemplateLiteralLoose__default[\"default\"]([\"\\n  width: 100%;\\n  height: 100%;\\n  padding: 20px 20px;\\n  color: black;\\n  display: flex;\\n  flex-direction: column;\\n  align-items: center;\\n  justify-content: space-between;\\n  position: relative;\\n  /* background-color: #00000011;\\n  backdrop-filter: blur(2px); */\\n  background: rgb(255 255 255 / 20%);\\n  backdrop-filter: blur(7px);\\n  /* box-shadow: 12px 12px 16px 0 rgba(0, 0, 0, 0.25),\\n    -8px -8px 12px 0 rgba(255, 255, 255, 0.3); */\\n\"])));\nvar Continue = styled__default[\"default\"].div(_templateObject4$1 || (_templateObject4$1 = _taggedTemplateLiteralLoose__default[\"default\"]([\"\\n  border-radius: 5px;\\n  padding: 10px 20px;\\n  background: linear-gradient(\\n    281.48deg,\\n    rgba(255, 255, 255, 0.4) 0%,\\n    rgba(255, 255, 255, 0) 96.42%\\n  );\\n  border: 0.5px solid #ffffff;\\n  filter: drop-shadow(0px 4px 24px rgba(255, 255, 255, 0.4));\\n  /* backdrop-filter: blur(16px); */\\n  margin: 0 auto;\\n  z-index: 10000;\\n  color: white;\\n  cursor: pointer;\\n  font-size: 13px;\\n\\n  &:hover {\\n    transition: fill 0.4s ease-in-out;\\n    fill: #78e41f;\\n  }\\n\"])));\nvar Instructions = styled__default[\"default\"].div(_templateObject5$1 || (_templateObject5$1 = _taggedTemplateLiteralLoose__default[\"default\"]([\"\\n  width: 100%;\\n  height: auto;\\n  margin: 30px 0;\\n  font-size: 18px;\\n  text-align: center;\\n  display: flex;\\n  flex-direction: column;\\n  justify-content: center;\\n  color: white;\\n\\n  & > p {\\n    margin: 1em 0;\\n  }\\n\"])));\nstyled__default[\"default\"].div(_templateObject6 || (_templateObject6 = _taggedTemplateLiteralLoose__default[\"default\"]([\"\\n  border: 1px solid black;\\n  border-radius: 10px;\\n  background: rgba(255, 255, 255, 0);\\n  padding: 5px 10px;\\n  margin: 8px 4px;\\n  transition: background 0.15s linear;\\n  font-size: 0.5em;\\n  cursor: pointer;\\n\\n  &:hover {\\n    background: rgba(0, 0, 0, 0.15);\\n  }\\n\"])));\nstyled__default[\"default\"].a(_templateObject7 || (_templateObject7 = _taggedTemplateLiteralLoose__default[\"default\"]([\"\\n  border: 1px solid black;\\n  border-radius: 10px;\\n  background: rgba(255, 255, 255, 0);\\n  padding: 5px 10px;\\n  margin: 8px 4px;\\n  transition: background 0.15s linear;\\n  font-size: 0.5em;\\n  cursor: pointer;\\n  text-decoration: none;\\n  color: black !important;\\n\\n  &:hover {\\n    background: rgba(0, 0, 0, 0.15);\\n  }\\n\"])));\nvar Title = styled__default[\"default\"].h1(_templateObject8 || (_templateObject8 = _taggedTemplateLiteralLoose__default[\"default\"]([\"\\n  margin: 0;\\n\"])));\nstyled__default[\"default\"].div(_templateObject9 || (_templateObject9 = _taggedTemplateLiteralLoose__default[\"default\"]([\"\\n  width: 100%;\\n  display: flex;\\n  justify-content: space-evenly;\\n  flex-wrap: wrap;\\n\"])));\n\n/**\n * Check validity of browser to run 3d experiences,\n * Automatically blacklists Facebook & Instagram in-app\n * browsers\n */\nvar useKeyboardLayout = function useKeyboardLayout() {\n  var _useState = react.useState(\"W/A/S/D\"),\n      layout = _useState[0],\n      setLayout = _useState[1];\n\n  react.useEffect(function () {\n    var IS_IN_IFRAME = window.self !== window.top;\n    if (!navigator.keyboard || IS_IN_IFRAME) return;\n    var keyboard = navigator.keyboard;\n    keyboard.getLayoutMap().then(function (keyboardLayoutMap) {\n      var upKey = keyboardLayoutMap.get(\"KeyW\");\n      if (upKey === \"z\") setLayout(\"Z/Q/S/D\");\n    });\n  }, []);\n  return layout;\n};\n\nvar useDevice = function useDevice() {\n  var _useState = react.useState(reactDeviceDetect.isMobile ? \"mobile\" : \"desktop\"),\n      device = _useState[0],\n      setDevice = _useState[1];\n\n  return {\n    device: {\n      mobile: device === \"mobile\",\n      desktop: device === \"desktop\",\n      xr: device === \"xr\"\n    },\n    setDevice: setDevice\n  };\n};\n\nvar EnvironmentContext = /*#__PURE__*/react.createContext({});\nvar useEnvironment = function useEnvironment() {\n  return react.useContext(EnvironmentContext);\n};\nvar useEnvironmentState = function useEnvironmentState(name) {\n  var _useState = react.useState([]),\n      menuItems = _useState[0],\n      setMenuItems = _useState[1];\n\n  var container = react.useRef(null);\n\n  var _useState2 = react.useState(true),\n      paused = _useState2[0],\n      setPausedValue = _useState2[1];\n\n  var events = react.useMemo(function () {\n    return [];\n  }, []);\n\n  var _useState3 = react.useState(false),\n      played = _useState3[0],\n      setPlayed = _useState3[1];\n\n  var setPaused = react.useCallback(function (p) {\n    setPausedValue(p); // hook into paused click event to make sure global context is running.\n    // https://github.com/mrdoob/three.js/blob/342946c8392639028da439b6dc0597e58209c696/src/audio/AudioContext.js#L9\n    // local state to only do once so we don't interfere with MuteOnHide\n\n    if (!played) {\n      var context = three.AudioContext.getContext();\n      if (context.state !== \"running\") context.resume();\n      setPlayed(true);\n    } // call all pause events\n\n\n    events.map(function (ev) {\n      return ev.apply(null, [p]);\n    });\n  }, [events, played]);\n  var device = useDevice();\n  return _extends__default[\"default\"]({}, device, {\n    name: name,\n    paused: paused,\n    setPaused: setPaused,\n    events: events,\n    containerRef: container,\n    menuItems: menuItems,\n    setMenuItems: setMenuItems\n  });\n};\n\nfunction PauseMenu(props) {\n  props.title;\n      props.pauseMenuItems;\n      props.dev;\n\n  var _useEnvironment = useEnvironment(),\n      paused = _useEnvironment.paused,\n      setPaused = _useEnvironment.setPaused,\n      menuItems = _useEnvironment.menuItems,\n      device = _useEnvironment.device;\n\n  var layout = useKeyboardLayout();\n  var closeOverlay = react.useCallback(function () {\n    var item = menuItems.find(function (item) {\n      return item.text === \"Enter VR\";\n    });\n    if (item && item.action) item.action();else setPaused(false);\n  }, [menuItems, setPaused]);\n  react.useMemo(function () {\n    return new Idea().setFromCreation(Math.random(), 0.8, 0.95).getHex();\n  }, []); // const PAUSE_ITEMS: MenuItem[] = [\n  //   ...pauseMenuItems,\n  //   {\n  //     text: \"v2.10.6\",\n  //     link: \"https://www.npmjs.com/package/spacesvr\",\n  //   },\n  //   ...menuItems,\n  // ];\n\n  return /*#__PURE__*/React.createElement(Container, {\n    paused: paused\n  }, /*#__PURE__*/React.createElement(Window, null, /*#__PURE__*/React.createElement(Title, null), /*#__PURE__*/React.createElement(Instructions, null, /*#__PURE__*/React.createElement(\"p\", null, \"Move ---\\u2013 \", device.mobile ? \"Joystick\" : layout), /*#__PURE__*/React.createElement(\"p\", null, \"Look ---\\u2013 \", device.mobile ? \"Drag\" : \"Mouse\"), /*#__PURE__*/React.createElement(\"p\", null, \"Pause ---\\u2013 \", device.mobile ? \"Menu Button\" : \"Esc\")), /*#__PURE__*/React.createElement(Continue, {\n    onClick: closeOverlay,\n    color: \"black\"\n  }, \"ENTER\"))) // <Container paused={paused} dev={dev}>\n  //   <ClickContainer onClick={closeOverlay} />\n  //   {!dev && (\n  //     <>\n  //       <Window>\n  //         <Title>{title}</Title>\n  //         <Instructions>\n  //           <p>Move – {device.mobile ? \"Joystick\" : layout}</p>\n  //           <p>Look – {device.mobile ? \"Drag\" : \"Mouse\"}</p>\n  //           <p>Pause – {device.mobile ? \"Menu Button\" : \"Esc\"}</p>\n  //           <p>Cycle Tool – {device.mobile ? \"Edge Swipe\" : \"Tab\"}</p>\n  //         </Instructions>\n  //         <Actions>\n  //           {PAUSE_ITEMS.map((item) =>\n  //             item.link ? (\n  //               <MenuLink key={item.text} href={item.link} target=\"_blank\">\n  //                 {item.text}\n  //               </MenuLink>\n  //             ) : (\n  //               <MenuButton key={item.text} onClick={item.action}>\n  //                 {item.text}\n  //               </MenuButton>\n  //             )\n  //           )}\n  //         </Actions>\n  //       </Window>\n  //       <Continue onClick={closeOverlay} color={hex}>\n  //         continue\n  //       </Continue>\n  //     </>\n  //   )}\n  // </Container>\n  ;\n}\n\nvar _templateObject$2;\nvar Element = styled__default[\"default\"].div(_templateObject$2 || (_templateObject$2 = _taggedTemplateLiteralLoose__default[\"default\"]([\"\\n  position: fixed;\\n  top: 50%;\\n  left: 50%;\\n  z-index: 1;\\n  mix-blend-mode: difference;\\n  width: 5px;\\n  height: 5px;\\n  border-radius: 100%;\\n  background: #ffffff;\\n\\n  /* &::before {\\n    content: \\\"\\\";\\n    position: absolute;\\n    height: 16px;\\n    width: 1.5px;\\n    transform: translate(-50%, -50%);\\n    border-radius: 6px;\\n    background: #ffffff;\\n  }\\n\\n  &::after {\\n    content: \\\"\\\";\\n    position: absolute;\\n    width: 16px;\\n    height: 1.5px;\\n    transform: translate(-50%, -50%);\\n    border-radius: 6px;\\n    background: #ffffff;\\n  } */\\n\"])));\n\nvar Crosshair = function Crosshair() {\n  if (reactDeviceDetect.isMobile) {\n    return null;\n  }\n\n  return /*#__PURE__*/React.createElement(Element, null);\n};\n\n// thank you a-frame https://github.com/aframevr/aframe/blob/042a3d6b7087a632c5165227b14bc37573375cde/src/utils/device.js\nfunction isOculusBrowser() {\n  return /(OculusBrowser)/i.test(window.navigator.userAgent);\n}\n\nfunction isFirefoxReality() {\n  return /(Mobile VR)/i.test(window.navigator.userAgent);\n}\n\nfunction isStandaloneVR() {\n  return isOculusBrowser() || isFirefoxReality();\n}\n\n/**\n * Component to register menu items to the environment.\n * Needs to be a component because it needs access to the three context to run\n * but ideas outside of the three context need to access it, so it uses\n * the environment as a mediator\n */\n\nfunction RegisterMenuItems() {\n  var _useEnvironment = useEnvironment(),\n      setMenuItems = _useEnvironment.setMenuItems;\n\n  var vrMenu = useVRMenuItem();\n  var fsMenu = useFsMenuItem();\n  var oqMenu = useOculusMenuItem();\n  react.useEffect(function () {\n    var arr = [];\n    if (vrMenu) arr.push(vrMenu);\n    if (fsMenu) arr.push(fsMenu);\n    if (oqMenu) arr.push(oqMenu);\n    setMenuItems(arr);\n  }, [vrMenu == null ? void 0 : vrMenu.text, fsMenu == null ? void 0 : fsMenu.text, oqMenu == null ? void 0 : oqMenu.text, setMenuItems]);\n  return null;\n}\nvar useVRMenuItem = function useVRMenuItem() {\n  var gl = fiber.useThree(function (state) {\n    return state.gl;\n  });\n\n  var _useEnvironment2 = useEnvironment(),\n      setDevice = _useEnvironment2.setDevice,\n      setPaused = _useEnvironment2.setPaused;\n\n  var session = react.useRef();\n\n  var _useState = react.useState(\"Enter VR\"),\n      text = _useState[0],\n      setText = _useState[1];\n\n  var action = react.useCallback(function () {\n    function onSessionStarted(_x) {\n      return _onSessionStarted.apply(this, arguments);\n    }\n\n    function _onSessionStarted() {\n      _onSessionStarted = _asyncToGenerator__default[\"default\"]( /*#__PURE__*/regeneratorRuntime.mark(function _callee(sesh) {\n        return regeneratorRuntime.wrap(function _callee$(_context) {\n          while (1) {\n            switch (_context.prev = _context.next) {\n              case 0:\n                sesh.addEventListener(\"end\", onSessionEnded);\n                _context.next = 3;\n                return gl.xr.setSession(sesh);\n\n              case 3:\n                setText(\"Exit VR\");\n                setDevice(\"xr\");\n                setPaused(false);\n                session.current = sesh;\n\n              case 7:\n              case \"end\":\n                return _context.stop();\n            }\n          }\n        }, _callee);\n      }));\n      return _onSessionStarted.apply(this, arguments);\n    }\n\n    function onSessionEnded() {\n      var _session$current;\n\n      (_session$current = session.current) == null ? void 0 : _session$current.removeEventListener(\"end\", onSessionEnded);\n      setDevice(reactDeviceDetect.isMobile ? \"mobile\" : \"desktop\");\n      setText(\"Enter VR\");\n      setPaused(true);\n      session.current = undefined;\n    }\n\n    if (session.current === undefined) {\n      var sessionInit = {\n        optionalFeatures: [\"local-floor\", \"bounded-floor\", \"hand-tracking\", \"layers\"]\n      }; // @ts-ignore\n\n      var xr = navigator.xr;\n      xr.requestSession(\"immersive-vr\", sessionInit).then(onSessionStarted);\n    } else {\n      var _session$current2;\n\n      (_session$current2 = session.current) == null ? void 0 : _session$current2.end();\n    }\n  }, [gl.xr, setDevice, setPaused]);\n\n  if (!isStandaloneVR()) {\n    return undefined;\n  }\n\n  return {\n    text: text,\n    action: action\n  };\n};\nvar useOculusMenuItem = function useOculusMenuItem() {\n  if (isStandaloneVR()) return;\n  return {\n    text: \"Open in Meta Quest\",\n    link: \"https://www.oculus.com/open_url/?url=\" + window.location.href\n  };\n};\nvar useFsMenuItem = function useFsMenuItem() {\n  var domElement = document.body;\n  var rfs = domElement.requestFullscreen || // @ts-ignore\n  domElement.webkitRequestFullScreen || // @ts-ignore\n  domElement.mozRequestFullScreen || // @ts-ignore\n  domElement.msRequestFullscreen || undefined;\n\n  var _useState2 = react.useState(false),\n      isFullscreen = _useState2[0],\n      setIsFullscreen = _useState2[1];\n\n  var _useState3 = react.useState(rfs !== undefined),\n      fullscreenAvailable = _useState3[0];\n\n  react.useEffect(function () {\n    var handleFullscreenChange = function handleFullscreenChange() {\n      return setIsFullscreen(document.fullscreenElement !== null);\n    };\n\n    document.addEventListener(\"fullscreenchange\", handleFullscreenChange);\n    return function () {\n      document.removeEventListener(\"fullscreenchange\", handleFullscreenChange);\n    };\n  }, []);\n  var action = react.useCallback(function () {\n    if (!rfs) return;\n\n    if (!document.fullscreenElement) {\n      rfs.apply(domElement, [{\n        navigationUI: \"hide\"\n      }]);\n    } else {\n      if (document.exitFullscreen) {\n        document.exitFullscreen();\n      }\n    }\n  }, [domElement, rfs]);\n\n  if (!fullscreenAvailable || isStandaloneVR()) {\n    return undefined;\n  }\n\n  return {\n    text: (isFullscreen ? \"Exit\" : \"Enter\") + \" Fullscreen\",\n    action: action\n  };\n};\n\nvar defaultCanvasProps = {\n  gl: {\n    powerPreference: \"high-performance\",\n    antialias: true,\n    depth: true,\n    alpha: false,\n    stencil: false,\n    physicallyCorrectLights: true,\n    toneMapping: three.NoToneMapping\n  },\n  shadows: false,\n  camera: {\n    position: [0, 2, 0],\n    near: 0.01,\n    far: 300\n  },\n  dpr: 1,\n  raycaster: {\n    far: 3\n  },\n  events: undefined\n};\n\nfunction MuteOnHide() {\n  react.useEffect(function () {\n    function handleChange() {\n      var context = three.AudioContext.getContext();\n      if (document.hidden) context.suspend();else context.resume();\n    }\n\n    document.addEventListener(\"visibilitychange\", handleChange);\n    return function () {\n      return document.removeEventListener(\"visibilitychange\", handleChange);\n    };\n  }, []);\n  return null;\n}\n\nfunction Environment(props) {\n  var loadingScreen = props.loadingScreen,\n      pauseMenu = props.pauseMenu,\n      dev = props.dev,\n      canvasProps = props.canvasProps,\n      _props$name = props.name,\n      name = _props$name === void 0 ? \"spacesvr\" : _props$name,\n      children = props.children;\n  var state = useEnvironmentState(name);\n  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(GlobalStyles, null), /*#__PURE__*/React.createElement(MuteOnHide, null), /*#__PURE__*/React.createElement(Container$2, {\n    ref: state.containerRef\n  }, /*#__PURE__*/React.createElement(EnvironmentContext.Provider, {\n    value: state\n  }, loadingScreen || /*#__PURE__*/React.createElement(LoadingScreen, null), pauseMenu || /*#__PURE__*/React.createElement(PauseMenu, {\n    dev: dev,\n    title: name\n  }), /*#__PURE__*/React.createElement(Crosshair, null)), /*#__PURE__*/React.createElement(xr.XRCanvas, _extends__default[\"default\"]({}, defaultCanvasProps, canvasProps), /*#__PURE__*/React.createElement(EnvironmentContext.Provider, {\n    value: state\n  }, /*#__PURE__*/React.createElement(RegisterMenuItems, null), children))));\n}\n\nvar _templateObject$1;\n\n/**\n * NippleMovement gives the player a direction to move by taking\n * input from a nipple (joystick).\n *\n * Direction is stored as a Vector3 with the following format\n *    x: left/right movement, + for right\n *    y: forward/back movement, + for forwards\n *    z: up/down movement, + for up\n *\n * @param props\n * @constructor\n */\nvar NippleMovement = function NippleMovement(props) {\n  var direction = props.direction;\n  var nipple = react.useRef();\n  var nippleContainer = react.useRef();\n\n  var _useEnvironment = useEnvironment(),\n      containerRef = _useEnvironment.containerRef;\n\n  react.useEffect(function () {\n    if (containerRef.current) {\n      nippleContainer.current = document.createElement(\"div\");\n      nippleContainer.current.style.position = \"fixed\";\n      nippleContainer.current.style.left = \"0\";\n      nippleContainer.current.style.bottom = \"0\";\n      nippleContainer.current.style.width = \"40%\";\n      nippleContainer.current.style.maxWidth = \"160px\";\n      nippleContainer.current.style.height = \"25%\";\n      nippleContainer.current.style.height = \"160px\";\n      nippleContainer.current.style.zIndex = \"5\"; // add class identifier to nippleContainer to identify touchEvents\n\n      nippleContainer.current.classList.add(\"nipple-container\");\n      containerRef.current.appendChild(nippleContainer.current);\n      nipple.current = nipplejs__default[\"default\"].create({\n        zone: nippleContainer.current,\n        mode: \"static\",\n        position: {\n          left: \"50%\",\n          top: \"50%\"\n        },\n        color: \"#fff\",\n        size: 120,\n        restOpacity: 0.75\n      });\n      nipple.current.on(\"move\", function (evt, data) {\n        // i kinda pulled 60 out of my ass tbh\n        var x = data.distance / 60 * Math.cos(data.angle.radian);\n        var z = -data.distance / 60 * Math.sin(data.angle.radian);\n        direction.current.set(x, 0, z);\n      });\n      nipple.current.on(\"end\", function () {\n        direction.current.set(0, 0, 0);\n      });\n      nippleContainer.current.addEventListener(\"touchstart\", function (ev) {\n        ev.preventDefault();\n      });\n      return function () {\n        if (nipple.current) nipple.current.destroy();\n      };\n    }\n  }, []);\n  var nippleStyles = react$1.css(_templateObject$1 || (_templateObject$1 = _taggedTemplateLiteralLoose__default[\"default\"]([\"\\n    .nipple-container > * > .front,\\n    .nipple-container > * > .back {\\n      background: radial-gradient(white, white 64%, black 86%) !important;\\n    }\\n  \"])));\n  return /*#__PURE__*/React.createElement(react$1.Global, {\n    styles: nippleStyles\n  });\n};\n\n/**\n * KeyboardMovement gives the player a direction to move by taking\n * input from any source (currently keyboard) and calculating\n * relative direction.\n *\n * Direction is stored as a Vector3 with the following format\n *    x: left/right movement, + for right\n *    y: forward/back movement, + for forwards\n *    z: up/down movement, + for up\n *\n * @param props\n * @constructor\n */\nvar KeyboardMovement = function KeyboardMovement(props) {\n  var direction = props.direction,\n      flying = props.flying;\n\n  var _useEnvironment = useEnvironment(),\n      paused = _useEnvironment.paused;\n\n  var pressedKeys = react.useRef([false, false, false, false, false]); // key events\n\n  var calcDirection = react.useCallback(function () {\n    var press = pressedKeys.current; // [w, a, s, d]\n\n    var yAxis = -1 * Number(press[0]) + Number(press[2]);\n    var xAxis = -1 * Number(press[1]) + Number(press[3]);\n    return [xAxis, flying && press[4] ? 1 : 0, yAxis];\n  }, [flying]);\n  var updatePressedKeys = react.useCallback(function (ev, pressedState) {\n    // We try to use `code` first because that's the layout-independent property.\n    // Then we use `key` because some browsers, notably Internet Explorer and\n    // Edge, support it but not `code`. Then we use `keyCode` to support older\n    // browsers like Safari, older Internet Explorer and older Chrome.\n    switch (ev.code || ev.key || ev.keyCode) {\n      case \"KeyW\":\n      case \"KeyI\":\n      case \"ArrowUp\":\n      case \"Numpad8\":\n      case 38:\n        // keyCode for arrow up\n        pressedKeys.current[0] = pressedState;\n        break;\n\n      case \"KeyA\":\n      case \"KeyJ\":\n      case \"ArrowLeft\":\n      case \"Numpad4\":\n      case 37:\n        // keyCode for arrow left\n        pressedKeys.current[1] = pressedState;\n        break;\n\n      case \"KeyS\":\n      case \"KeyK\":\n      case \"ArrowDown\":\n      case \"Numpad5\":\n      case \"Numpad2\":\n      case 40:\n        // keyCode for arrow down\n        pressedKeys.current[2] = pressedState;\n        break;\n\n      case \"KeyD\":\n      case \"KeyL\":\n      case \"ArrowRight\":\n      case \"Numpad6\":\n      case 39:\n        // keyCode for arrow right\n        pressedKeys.current[3] = pressedState;\n        break;\n\n      case \"Space\":\n        pressedKeys.current[4] = pressedState;\n        break;\n\n      default:\n        return;\n    }\n  }, []);\n  var onKeyDown = react.useCallback(function (ev) {\n    if (ev.defaultPrevented) {\n      return;\n    } // We don't want to mess with the browser's shortcuts\n\n\n    if (ev.ctrlKey || ev.altKey || ev.metaKey) {\n      return;\n    }\n\n    updatePressedKeys(ev, true);\n\n    var _calcDirection = calcDirection(),\n        x = _calcDirection[0],\n        y = _calcDirection[1],\n        z = _calcDirection[2];\n\n    direction.current.set(x, y, z);\n  }, [calcDirection, direction, updatePressedKeys]);\n  var onKeyUp = react.useCallback(function (ev) {\n    updatePressedKeys(ev, false);\n\n    var _calcDirection2 = calcDirection(),\n        x = _calcDirection2[0],\n        y = _calcDirection2[1],\n        z = _calcDirection2[2];\n\n    direction.current.set(x, y, z);\n  }, [calcDirection, direction, updatePressedKeys]);\n  react.useEffect(function () {\n    if (paused) {\n      direction.current.set(0, 0, 0);\n      pressedKeys.current = [false, false, false, false, false];\n      return;\n    }\n\n    document.addEventListener(\"keydown\", onKeyDown);\n    document.addEventListener(\"keyup\", onKeyUp);\n    return function () {\n      document.removeEventListener(\"keydown\", onKeyDown);\n      document.removeEventListener(\"keyup\", onKeyUp);\n    };\n  }, [paused, onKeyDown, onKeyUp, direction]);\n  return null;\n};\n\nvar EPS = 0.0001;\nvar MIN_POLAR_ANGLE = EPS; // radians\n\nvar MAX_POLAR_ANGLE = Math.PI - EPS; // radians\n\nvar SENSITIVITY = 0.8;\nvar PI_2 = Math.PI / 2;\n/**\n * PointerLockCamera is a react port of PointerLockControls.js from THREE,\n * with some changes. Some parameters are listed above\n *\n * https://github.com/mrdoob/three.js/blob/master/examples/jsm/controls/PointerLockControls.js\n *\n * @constructor\n */\n\nfunction PointerLockCamera() {\n  var camera = fiber.useThree(function (state) {\n    return state.camera;\n  });\n  var gl = fiber.useThree(function (state) {\n    return state.gl;\n  });\n  var domElement = gl.domElement;\n\n  var _useEnvironment = useEnvironment(),\n      paused = _useEnvironment.paused,\n      setPaused = _useEnvironment.setPaused,\n      events = _useEnvironment.events;\n\n  var isLocked = react.useRef(false);\n\n  var _useState = react.useState(new three.Euler(0, 0, 0, \"YXZ\")),\n      euler = _useState[0];\n\n  var isCurrentlyLocked = react.useCallback(function () {\n    return domElement.ownerDocument.pointerLockElement === domElement;\n  }, [domElement]);\n  var leaveTime = react.useRef(0);\n  react.useEffect(function () {\n    // update camera while controls are locked\n    var onMouseMove = function onMouseMove(ev) {\n      if (!isLocked.current) return; // @ts-ignore\n\n      var dx = ev.movementX || ev.mozMovementX || ev.webkitMovementX || 0; // @ts-ignore\n\n      var dy = ev.movementY || ev.mozMovementY || ev.webkitMovementY || 0;\n      euler.setFromQuaternion(camera.quaternion);\n      euler.y -= dx * SENSITIVITY * 0.002;\n      euler.x -= dy * SENSITIVITY * 0.002;\n      euler.x = Math.max(PI_2 - MAX_POLAR_ANGLE, Math.min(PI_2 - MIN_POLAR_ANGLE, euler.x));\n      camera.quaternion.setFromEuler(euler);\n    }; // automatically unlock on pointer lock error\n\n\n    function onError() {\n      isLocked.current = false;\n      setPaused(true);\n    } // handle pointer lock change\n\n\n    function onChange() {\n      if (isCurrentlyLocked()) {\n        isLocked.current = true;\n\n        if (paused) {\n          setPaused(false);\n        }\n      } else {\n        leaveTime.current = performance.now();\n        isLocked.current = false;\n\n        if (!paused) {\n          setPaused(true);\n        }\n      }\n    }\n\n    var ownerDocument = domElement.ownerDocument;\n    ownerDocument.addEventListener(\"mousemove\", onMouseMove);\n    ownerDocument.addEventListener(\"pointerlockchange\", onChange);\n    ownerDocument.addEventListener(\"pointerlockerror\", onError);\n    return function () {\n      ownerDocument.removeEventListener(\"mousemove\", onMouseMove);\n      ownerDocument.removeEventListener(\"pointerlockchange\", onChange);\n      ownerDocument.removeEventListener(\"pointerlockerror\", onError);\n    };\n  }, [paused, domElement, setPaused, euler, camera.quaternion, isCurrentlyLocked]); // detect failed, uncaught pointer lock errors\n\n  react.useEffect(function () {\n    setTimeout(function () {\n      if (!isLocked.current && !paused) {\n        setPaused(true);\n      }\n    }, 250);\n  }, [paused, setPaused]);\n  react.useEffect(function () {\n    var ev = function ev(paused) {\n      if (paused) {\n        domElement.ownerDocument.exitPointerLock();\n      } else {\n        // leaving pointer lock makes you wait for 1.25s to relock, trying will throw error\n        if (performance.now() - leaveTime.current > 1250) {\n          domElement.requestPointerLock();\n        }\n      }\n    };\n\n    events.push(ev);\n    return function () {\n      var ind = events.indexOf(ev);\n      if (ind >= 0) events.splice(ind, 1);\n    };\n  }, [domElement, events, isCurrentlyLocked]);\n  return null;\n}\n\nvar DefaultTouch = {\n  pos: new three.Vector2(0, 0),\n  id: -1\n}; // get the current touch from touch array\n\nvar getCurrentTouch = function getCurrentTouch(curTouchId, touches) {\n  var len = touches.length;\n\n  for (var i = 0; i < len; i++) {\n    if (curTouchId === touches[i].identifier) {\n      return touches[i];\n    }\n  }\n\n  return undefined;\n}; // check whether given touch tapped nipple\n\nvar tappedNipple = function tappedNipple(ev) {\n  // get the relevant touched element (casted as an Element)\n  var ele = ev.touches[ev.touches.length - 1].target;\n  return ele.classList.contains(\"nipple-container\") || ele.classList.contains(\"front\") || ele.classList.contains(\"back\");\n};\n\nvar DRAG_SENSITIVITY = new three.Vector2(0.7, 0.7);\n/**\n * TouchFPSCamera controls the camera rotation by detecting\n * touch drag on the screen. Unlike MouseFPSCamera, this component\n * does not have a way to pause, that must be done externally.\n *\n * @param props\n * @constructor\n */\n\nfunction TouchFPSCamera() {\n  var touchStartPos = react.useRef(DefaultTouch);\n  var originEuler = react.useRef(new three.Euler(0, 0, 0, \"YXZ\"));\n  var camera = fiber.useThree(function (state) {\n    return state.camera;\n  });\n\n  var getNewEuler = function getNewEuler(dragX, dragY) {\n    var newEuler = originEuler.current.clone();\n    var moveX = dragX - touchStartPos.current.pos.x;\n    var moveY = dragY - touchStartPos.current.pos.y;\n    newEuler.setFromQuaternion(camera.quaternion);\n    newEuler.y = originEuler.current.y - moveX * DRAG_SENSITIVITY.x / 100;\n    newEuler.x = originEuler.current.x - moveY * DRAG_SENSITIVITY.y / 100;\n    newEuler.x = Math.max(-Math.PI / 2, Math.min(Math.PI / 2, newEuler.x));\n    return newEuler;\n  }; // touch move scripts\n\n\n  var onTouchStart = function onTouchStart(ev) {\n    if (touchStartPos.current.id !== -1) {\n      return;\n    }\n\n    if (tappedNipple(ev)) {\n      touchStartPos.current = DefaultTouch;\n      return;\n    } // get last in list (most recent touch) to not confuse with movement\n\n\n    var touchIndex = ev.touches.length - 1;\n    var _ev$touches$touchInde = ev.touches[touchIndex],\n        clientX = _ev$touches$touchInde.clientX,\n        clientY = _ev$touches$touchInde.clientY,\n        id = _ev$touches$touchInde.identifier;\n    touchStartPos.current = {\n      pos: new three.Vector2(clientX, clientY),\n      id: id\n    };\n    originEuler.current.setFromQuaternion(camera.quaternion);\n  };\n\n  var onTouchMove = function onTouchMove(ev) {\n    var touch = getCurrentTouch(touchStartPos.current.id, ev.touches);\n    if (!touch) return;\n    var clientX = touch.clientX,\n        clientY = touch.clientY;\n    var newEuler = getNewEuler(clientX, clientY);\n    camera.quaternion.setFromEuler(newEuler);\n  };\n\n  var onTouchEnd = function onTouchEnd(ev) {\n    var touch = getCurrentTouch(touchStartPos.current.id, ev.changedTouches);\n    if (!touch) return;\n    var clientX = touch.clientX,\n        clientY = touch.clientY;\n    originEuler.current = getNewEuler(clientX, clientY);\n    touchStartPos.current.id = -1;\n  };\n\n  react.useEffect(function () {\n    document.addEventListener(\"touchstart\", onTouchStart);\n    document.addEventListener(\"touchmove\", onTouchMove);\n    document.addEventListener(\"touchend\", onTouchEnd);\n    return function () {\n      document.removeEventListener(\"touchstart\", onTouchStart);\n      document.removeEventListener(\"touchmove\", onTouchMove);\n      document.removeEventListener(\"touchend\", onTouchEnd);\n    };\n  }, [onTouchEnd, onTouchMove, onTouchStart]);\n  return null;\n}\n\n// height of 0.9 (eye level) for a perceived height of 1\nvar HEIGHT = 0.9;\nvar RADIUS = 0.225;\nvar SEGMENTS = 8;\nvar SPHERE_SHAPE = \"Sphere\";\nvar sphereProps = {\n  type: SPHERE_SHAPE,\n  args: [RADIUS, SEGMENTS, SEGMENTS]\n};\n\nvar topSphere = _extends__default[\"default\"]({}, sphereProps, {\n  position: [0, -RADIUS, 0]\n});\n\nvar middleSphere = _extends__default[\"default\"]({}, sphereProps, {\n  position: [0, -(HEIGHT / 2), 0]\n});\n\nvar bottomSphere = _extends__default[\"default\"]({}, sphereProps, {\n  position: [0, -(HEIGHT - RADIUS), 0]\n});\n\nvar useCapsuleCollider = function useCapsuleCollider(initPos) {\n  var _useEnvironment = useEnvironment(),\n      paused = _useEnvironment.paused;\n\n  var compoundBody = cannon.useCompoundBody(function () {\n    return {\n      mass: 0,\n      position: initPos.current.toArray(),\n      segments: SEGMENTS,\n      fixedRotation: true,\n      type: \"Dynamic\",\n      shapes: [topSphere, middleSphere, bottomSphere]\n    };\n  });\n  react.useEffect(function () {\n    if (!paused) compoundBody[1].mass.set(62);\n  }, [paused, compoundBody]);\n  return compoundBody;\n};\n\nvar ALPHA_SENSITIVITY = 0.008;\n\n/**\n *\n * Gyro controls uses device orientation controls from three js, if applicable.\n * A required fallback component will be used in the place of the gyroscope\n * controls until they are accepted and in use.\n *\n * Some code sampled from TouchFPSCamera.ts\n *\n * @param props\n * @constructor\n */\nvar GyroControls = function GyroControls(props) {\n  var fallback = props.fallback;\n  var camera = fiber.useThree(function (state) {\n    return state.camera;\n  });\n\n  var _useState = react.useState(),\n      controls = _useState[0],\n      setControls = _useState[1];\n\n  var _useState2 = react.useState(false),\n      enableGyro = _useState2[0],\n      setEnableGyro = _useState2[1];\n\n  var _useState3 = react.useState(0),\n      alphaVal = _useState3[0],\n      setAlphaVal = _useState3[1]; // dragging for y axis offset\n\n\n  var touchStartPos = react.useRef(DefaultTouch);\n  var currentOffset = react.useRef(0);\n\n  var _useSpring = three$1.useSpring({\n    alpha: alphaVal,\n    config: _extends__default[\"default\"]({}, three$1.config[\"default\"], {\n      precision: 0.001\n    })\n  }),\n      alpha = _useSpring.alpha; // try to prompt user for device controls\n\n\n  react.useEffect(function () {\n    if (!controls) {\n      var func = function func() {\n        var cont = new threeStdlib.DeviceOrientationControls(camera);\n        cont.enabled = false; // set to disabled in case they're not working yet\n\n        setControls(cont);\n      };\n\n      window.addEventListener(\"click\", func);\n      return function () {\n        window.removeEventListener(\"click\", func);\n      };\n    }\n  }, [controls]);\n  fiber.useFrame(function () {\n    if (controls && !enableGyro) {\n      // check if an event has been received yet\n      if (Object.keys(controls.deviceOrientation).length !== 0) {\n        setEnableGyro(true);\n        controls.enabled = true;\n      }\n    }\n\n    if (controls) {\n      controls.alphaOffset = -alpha.get() * ALPHA_SENSITIVITY;\n      controls.update();\n    }\n  }); // touch move scripts\n\n  var onTouchStart = function onTouchStart(ev) {\n    if (touchStartPos.current.id !== -1) {\n      return;\n    }\n\n    if (tappedNipple(ev)) {\n      touchStartPos.current = DefaultTouch;\n      return;\n    } // get last in list (most recent touch) to not confuse with movement\n\n\n    var touchIndex = ev.touches.length - 1;\n    var _ev$touches$touchInde = ev.touches[touchIndex],\n        clientX = _ev$touches$touchInde.clientX,\n        clientY = _ev$touches$touchInde.clientY,\n        id = _ev$touches$touchInde.identifier;\n    touchStartPos.current = {\n      pos: new three.Vector2(clientX, clientY),\n      id: id\n    };\n  };\n\n  var onTouchMove = function onTouchMove(ev) {\n    var touch = getCurrentTouch(touchStartPos.current.id, ev.touches);\n\n    if (!touch) {\n      return;\n    }\n\n    var extraOffset = touch.clientX - touchStartPos.current.pos.x;\n    setAlphaVal(currentOffset.current + extraOffset);\n  };\n\n  var onTouchEnd = function onTouchEnd(ev) {\n    var touch = getCurrentTouch(touchStartPos.current.id, ev.changedTouches);\n\n    if (!touch) {\n      return;\n    }\n\n    var finalOffset = touch.clientX - touchStartPos.current.pos.x;\n    setAlphaVal(currentOffset.current + finalOffset);\n    currentOffset.current += finalOffset;\n    touchStartPos.current.id = -1;\n  }; // register touch events\n\n\n  react.useEffect(function () {\n    document.addEventListener(\"touchstart\", onTouchStart);\n    document.addEventListener(\"touchmove\", onTouchMove);\n    document.addEventListener(\"touchend\", onTouchEnd);\n    return function () {\n      document.removeEventListener(\"touchstart\", onTouchStart);\n      document.removeEventListener(\"touchmove\", onTouchMove);\n      document.removeEventListener(\"touchend\", onTouchEnd);\n    };\n  }, []);\n\n  if (!enableGyro) {\n    return /*#__PURE__*/React.createElement(React.Fragment, null, fallback);\n  }\n\n  return null;\n};\n\nvar useSpringVelocity = function useSpringVelocity(bodyApi, speed) {\n  var direction = react.useRef(new three.Vector3());\n\n  var _useEnvironment = useEnvironment(),\n      device = _useEnvironment.device;\n\n  var dummy = react.useMemo(function () {\n    return new three.Vector3();\n  }, []);\n\n  var _useState = react.useState(new three.Quaternion()),\n      quat = _useState[0];\n\n  var targetYVel = react.useRef(0);\n  var clock = fiber.useThree(function (state) {\n    return state.clock;\n  });\n  var lastvelocity = react.useRef(new three.Vector3());\n  var lastTime = react.useRef(0);\n  var y_accel = react.useRef(0);\n\n  var _useState2 = react.useState(new three.Vector3()),\n      dumdum = _useState2[0];\n\n  var updateVelocity = function updateVelocity(cam, velocity) {\n    dumdum.x = velocity.x || 0;\n    dumdum.y = 0;\n    dumdum.z = velocity.z || 0;\n    var vel = dumdum.length() / speed;\n    var y_change = (velocity.y || 0) - lastvelocity.current.y;\n    var elapsedTime = clock.getElapsedTime();\n    var delta = Math.abs(elapsedTime - lastTime.current);\n    y_accel.current = three.MathUtils.lerp(y_accel.current, y_change / delta || 0, // i think this is the bad one!!! (for all the || 0's)\n    0.1); // get forward/back movement and left/right movement velocities\n\n    dummy.x = (direction.current.x || 0) * 0.75;\n    dummy.z = direction.current.z || 0; // forward/back\n\n    dummy.y = 0;\n    dummy.multiplyScalar(speed + Math.abs(y_accel.current) * 0.085);\n    quat.copy(cam.quaternion);\n    quat.x = 0;\n    quat.z = 0;\n    dummy.applyQuaternion(quat); // calc y velocity\n\n    targetYVel.current = three.MathUtils.lerp(targetYVel.current, (direction.current.y || 0) * 0.6, 0.05 + vel * 0.075);\n    dummy.y = Math.min((velocity.y || 0) + targetYVel.current, 4 + vel); // keep y velocity intact and update velocity\n\n    if (!device.desktop) {\n      bodyApi.velocity.set(dummy.x, dummy.y, dummy.z);\n      lastvelocity.current.set(dummy.x, dummy.y, dummy.z);\n    } else {\n      var newX = three.MathUtils.lerp(velocity.x || 0, dummy.x, 0.25);\n      var newZ = three.MathUtils.lerp(velocity.z || 0, dummy.z, 0.25);\n      bodyApi.velocity.set(newX, dummy.y, newZ);\n      lastvelocity.current.set(newX, dummy.y, newZ);\n    }\n\n    lastTime.current = elapsedTime;\n  };\n\n  return {\n    direction: direction,\n    updateVelocity: updateVelocity\n  };\n};\n\n/**\n * VRControllerMovement gives the player a direction to move by taking\n * input from the Oculus Quest Gamepad.\n *\n *\n * @param props\n * @constructor\n */\nvar SnapTurn = function SnapTurn(props) {\n  var _props$hand = props.hand,\n      hand = _props$hand === void 0 ? \"right\" : _props$hand,\n      _props$increment = props.increment,\n      increment = _props$increment === void 0 ? Math.PI / 6 : _props$increment,\n      _props$threshold = props.threshold,\n      threshold = _props$threshold === void 0 ? 0.8 : _props$threshold;\n  var controller = xr.useController(hand);\n\n  var _useXR = xr.useXR(),\n      player = _useXR.player;\n\n  var isSnapping = react.useRef(false);\n  fiber.useFrame(function () {\n    if (controller && controller.inputSource.gamepad) {\n      var _controller$inputSour = controller.inputSource.gamepad.axes,\n          x = _controller$inputSour[2];\n\n      if (Math.abs(x) > threshold) {\n        if (!isSnapping.current) {\n          player.rotateY(-increment * Math.sign(x));\n        }\n\n        isSnapping.current = true;\n      } else {\n        isSnapping.current = false;\n      }\n    }\n  });\n  return null;\n};\n\nvar SmoothLocomotion = function SmoothLocomotion(props) {\n  var _props$hand2 = props.hand,\n      hand = _props$hand2 === void 0 ? \"left\" : _props$hand2,\n      direction = props.direction;\n  var controller = xr.useController(hand);\n  fiber.useFrame(function () {\n    if (controller && controller.inputSource.gamepad) {\n      var _controller$inputSour2 = controller.inputSource.gamepad.axes,\n          x = _controller$inputSour2[2],\n          z = _controller$inputSour2[3];\n      direction.current.x = x;\n      direction.current.z = z;\n    }\n  });\n  return null;\n};\n\nvar Fly = function Fly(props) {\n  var direction = props.direction;\n  var controller = xr.useController(\"left\");\n  fiber.useFrame(function () {\n    if (controller && controller.inputSource.gamepad) {\n      var _controller$inputSour3 = controller.inputSource.gamepad.buttons,\n          aButton = _controller$inputSour3[0];\n      if (!aButton) return;\n      direction.current.y = aButton.pressed ? 0.5 : 0;\n    }\n  });\n  return null;\n};\n\nfunction VRControllerMovement(props) {\n  var position = props.position,\n      direction = props.direction,\n      snapTurn = props.snapTurn,\n      smoothLocomotion = props.smoothLocomotion;\n\n  var _useXR2 = xr.useXR(),\n      player = _useXR2.player;\n\n  fiber.useFrame(function () {\n    player.position.copy(position.current); // average human height is ~1.7, player height is 1.\n    // somehow subtracting 1 is more correct idk\n    // update: now 1.4 seems right? who fukn knows\n    // update: definitely a difference between sitting + standing\n\n    player.position.y -= 1.4;\n  });\n  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Fly, {\n    direction: direction\n  }), /*#__PURE__*/React.createElement(SnapTurn, snapTurn), /*#__PURE__*/React.createElement(SmoothLocomotion, _extends__default[\"default\"]({}, smoothLocomotion, {\n    direction: direction\n  })), /*#__PURE__*/React.createElement(xr.DefaultXRControllers, null));\n}\n\nvar useControlLock = function useControlLock(lockControls) {\n  return react.useMemo(function () {\n    return {\n      lock: function lock() {\n        return lockControls.current = true;\n      },\n      unlock: function unlock() {\n        return lockControls.current = false;\n      },\n      isLocked: function isLocked() {\n        return lockControls.current;\n      }\n    };\n  }, [lockControls]);\n};\n\nvar useBob = function useBob(velocity, direction) {\n  var camera = fiber.useThree(function (st) {\n    return st.camera;\n  });\n\n  var _useSpring = three$1.useSpring({\n    bob: 0,\n    config: three$1.config[\"default\"]\n  }),\n      bob = _useSpring.bob;\n\n  var _useState = react.useState(new three.Vector3()),\n      offset = _useState[0];\n\n  var update = function update(clock) {\n    var IS_MOVING = direction.current.length() > 0.1;\n    var IS_GROUNDED = Math.abs(velocity.current.y) < 0.01;\n    bob.set(IS_MOVING && IS_GROUNDED ? 1 : 0);\n    var amt = bob.get();\n    var y = Math.sin(clock.elapsedTime * 20) * 0.0055 * amt;\n    var x = Math.cos(clock.elapsedTime * 15 + 0.3) * 0.002 * amt;\n    offset.set(x, y, 0);\n    offset.applyQuaternion(camera.quaternion);\n    camera.position.add(offset);\n  };\n\n  return {\n    update: update\n  };\n};\n\nvar PlayerContext = /*#__PURE__*/react.createContext({});\nvar usePlayer = function usePlayer() {\n  return react.useContext(PlayerContext);\n};\nvar SPEED = 3.6; // (m/s) 1.4 walking, 2.6 jogging, 4.1 running\n\nvar SHOW_PLAYER_HITBOX = false;\n\n/**\n * Player represents a user controlled entity, complete with a\n * control scheme and a physical representation that interacts with other physics-\n * enabled objects.\n *\n * @constructor\n */\nfunction Player(props) {\n  var children = props.children,\n      _props$pos = props.pos,\n      pos = _props$pos === void 0 ? [0, 1, 0] : _props$pos,\n      _props$rot = props.rot,\n      rot = _props$rot === void 0 ? 0 : _props$rot,\n      _props$flying = props.flying,\n      flying = _props$flying === void 0 ? false : _props$flying,\n      _props$speed = props.speed,\n      speed = _props$speed === void 0 ? SPEED : _props$speed,\n      _props$controls = props.controls,\n      controls = _props$controls === void 0 ? {\n    disableGyro: true\n  } : _props$controls;\n  var camera = fiber.useThree(function (state) {\n    return state.camera;\n  });\n  var defaultRaycaster = fiber.useThree(function (state) {\n    return state.raycaster;\n  });\n\n  var _useEnvironment = useEnvironment(),\n      device = _useEnvironment.device; // local state\n\n\n  var initPos = react.useRef(new three.Vector3().fromArray(pos));\n  var position = react.useRef(new three.Vector3());\n  var velocity = react.useRef(new three.Vector3());\n  var lockControls = react.useRef(false);\n  var raycaster = react.useMemo(function () {\n    return new three.Raycaster(new three.Vector3(), new three.Vector3(), 0, 5);\n  }, []); // physical body\n\n  var _useCapsuleCollider = useCapsuleCollider(initPos),\n      bodyApi = _useCapsuleCollider[1];\n\n  var _useSpringVelocity = useSpringVelocity(bodyApi, speed),\n      direction = _useSpringVelocity.direction,\n      updateVelocity = _useSpringVelocity.updateVelocity;\n\n  var bob = useBob(velocity, direction); // initial rotation\n\n  react.useEffect(function () {\n    // rotation happens before position move\n    camera.rotation.setFromQuaternion(new three.Quaternion().setFromAxisAngle(new three.Vector3(0, 1, 0), rot));\n  }, []);\n  react.useEffect(function () {\n    var unsubPos = bodyApi.position.subscribe(function (p) {\n      return position.current.fromArray(p);\n    });\n    var unsubVel = bodyApi.velocity.subscribe(function (v) {\n      return velocity.current.fromArray(v);\n    });\n    return function () {\n      unsubPos();\n      unsubVel();\n    };\n  }, [bodyApi, bodyApi.position, bodyApi.velocity]);\n  fiber.useFrame(function (_ref) {\n    var clock = _ref.clock;\n\n    // update raycaster on desktop (mobile uses default)\n    if (device.desktop) {\n      raycaster.ray.origin.copy(position.current);\n      raycaster.ray.direction.set(0, 0, -1);\n      raycaster.ray.direction.applyQuaternion(camera.quaternion);\n    }\n\n    camera.position.copy(position.current);\n\n    if (!lockControls.current) {\n      updateVelocity(camera, velocity.current);\n      bob.update(clock);\n    }\n  });\n  var setPosition = react.useCallback(function (pos) {\n    // in case it gets called before bodyapi is initialized\n    initPos.current.copy(pos);\n    bodyApi.position.set(pos.x, pos.y, pos.z);\n    position.current.copy(pos);\n  }, [bodyApi.position]);\n  var setVelocity = react.useCallback(function (vel) {\n    bodyApi.velocity.set(vel.x, vel.y, vel.z);\n    velocity.current.copy(vel);\n  }, [bodyApi.velocity]);\n  var controlLock = useControlLock(lockControls);\n  var value = {\n    position: {\n      get: function get() {\n        return position.current.clone();\n      },\n      set: setPosition\n    },\n    velocity: {\n      get: function get() {\n        return velocity.current.clone();\n      },\n      set: setVelocity\n    },\n    controls: controlLock,\n    raycaster: device.mobile ? defaultRaycaster : raycaster\n  };\n  return /*#__PURE__*/React.createElement(PlayerContext.Provider, {\n    value: value\n  }, device.mobile && /*#__PURE__*/React.createElement(React.Fragment, null, (controls == null ? void 0 : controls.disableGyro) && /*#__PURE__*/React.createElement(TouchFPSCamera, null), !(controls != null && controls.disableGyro) && /*#__PURE__*/React.createElement(GyroControls, {\n    fallback: /*#__PURE__*/React.createElement(TouchFPSCamera, null)\n  }), /*#__PURE__*/React.createElement(NippleMovement, {\n    direction: direction\n  })), device.desktop && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(KeyboardMovement, {\n    direction: direction,\n    flying: flying\n  }), /*#__PURE__*/React.createElement(PointerLockCamera, null)), device.xr && /*#__PURE__*/React.createElement(VRControllerMovement, {\n    position: position,\n    direction: direction\n  }), SHOW_PLAYER_HITBOX , children);\n}\n\n/**\n * A hook that provides a function to re-render the component.\n *\n * You can use the function itself as a dependency.\n */\n\nfunction useRerender() {\n  var _useState = react.useState(0),\n      ct = _useState[0],\n      setCt = _useState[1];\n\n  return react.useCallback(function () {\n    return setCt(Math.random());\n  }, [ct]);\n}\n\nvar useHTMLInput = function useHTMLInput(type) {\n  var input = react.useMemo(function () {\n    var inp = document.createElement(\"input\");\n    document.body.appendChild(inp);\n    return inp;\n  }, []);\n  react.useEffect(function () {\n    input.setAttribute(\"type\", type);\n    input.style.zIndex = \"-99\";\n    input.style.opacity = \"0\";\n    input.style.fontSize = \"16px\"; // this disables zoom on mobile\n\n    input.style.position = \"absolute\";\n    input.style.left = \"50%\";\n    input.style.top = \"0\";\n    input.style.transform = \"translate(-50%, 0%)\";\n  }, [input, type]);\n  react.useEffect(function () {\n    return function () {\n      document.body.removeChild(input);\n    };\n  }, [input]);\n  return input;\n};\nvar useTextInput = function useTextInput(type, value, onChange) {\n  // number isn't selectable, so we use text\n  var input = useHTMLInput(type === \"password\" ? \"password\" : \"text\");\n\n  var _useEnvironment = useEnvironment(),\n      paused = _useEnvironment.paused;\n\n  var _usePlayer = usePlayer(),\n      controls = _usePlayer.controls,\n      velocity = _usePlayer.velocity;\n\n  var rerender = useRerender();\n\n  var _useState = react.useState(false),\n      focused = _useState[0],\n      setFocused = _useState[1];\n\n  var protectClick = react.useRef(false); // used to click off of the input to blur\n  // input setup\n\n  react.useEffect(function () {\n    input.addEventListener(\"focus\", function () {\n      return setFocused(true);\n    });\n    input.addEventListener(\"blur\", function () {\n      return setFocused(false);\n    });\n    input.autocomplete = \"off\";\n  }, [input]); // blur on pause\n\n  react.useEffect(function () {\n    if (focused && paused) input.blur();\n  }, [input, focused, paused]); // stop player from moving while they type (free up wasd)\n\n  react.useEffect(function () {\n    if (focused) {\n      velocity.set(new three.Vector3());\n      controls.lock();\n    } else if (!isTyping()) {\n      velocity.set(new three.Vector3());\n      controls.unlock();\n    }\n  }, [focused, velocity, controls]); // free up wasd on unmount\n\n  react.useEffect(function () {\n    return function () {\n      if (!isTyping()) controls.unlock();\n    };\n  }, [controls]); // set up event listeners\n\n  react.useEffect(function () {\n    var formatNumber = function formatNumber(s) {\n      var re = /[+-]?([0-9]+([.][0-9]*)?|[.][0-9]+)/;\n      var res = s.match(re);\n      if (!res) return \"\";\n      if (res.input !== res[0]) return value;else return res[0];\n    };\n\n    var onDocClick = function onDocClick() {\n      var focused = input === document.activeElement;\n      if (!protectClick.current && focused) input.blur();else if (protectClick.current && !focused) input.focus();\n      protectClick.current = false;\n    };\n\n    var onInput = function onInput() {\n      if (input !== document.activeElement) return;\n      if (type === \"number\") input.value = formatNumber(input.value);\n      onChange(input.value);\n    };\n\n    var onSelectionChange = function onSelectionChange() {\n      if (input !== document.activeElement) return;\n      rerender();\n    };\n\n    document.addEventListener(\"click\", onDocClick);\n    input.addEventListener(\"input\", onInput);\n    document.addEventListener(\"selectionchange\", onSelectionChange);\n    return function () {\n      document.removeEventListener(\"click\", onDocClick);\n      input.removeEventListener(\"input\", onInput);\n      document.removeEventListener(\"selectionchange\", onSelectionChange);\n    };\n  }, [input, onChange, rerender, type, value]); // keep the input's value in sync with the passed state value\n\n  react.useEffect(function () {\n    if (input.value !== value) {\n      input.value = value;\n      rerender();\n    }\n  }, [input, value]); // call to focus input and protect the click from blurring the input\n\n  var focusInput = function focusInput() {\n    protectClick.current = true;\n    input.focus();\n  };\n\n  return {\n    input: input,\n    focused: focused,\n    focusInput: focusInput\n  };\n};\n\n/*\n  hook to detect when the meta key (cmd on mac, ctrl on windows) is pressed\n  includes a timeout since moving your finger to hold it down can jitter a bit\n  returns ref containing the state of the press\n */\n\nvar useMetaHold = function useMetaHold() {\n  var meta = react.useRef(false);\n  var timestamp = react.useRef();\n  var TIMEOUT = 75;\n  react.useEffect(function () {\n    var onKeyChange = function onKeyChange(e) {\n      var newMeta = e.ctrlKey || e.metaKey;\n\n      if (meta.current && !newMeta) {\n        if (!timestamp.current) {\n          timestamp.current = new Date().getTime();\n          setTimeout(function () {\n            meta.current = false;\n            timestamp.current = undefined;\n          }, TIMEOUT);\n        }\n      } else {\n        meta.current = newMeta;\n      }\n    };\n\n    document.addEventListener(\"keydown\", onKeyChange);\n    document.addEventListener(\"keyup\", onKeyChange);\n    return function () {\n      document.removeEventListener(\"keydown\", onKeyChange);\n      document.removeEventListener(\"keyup\", onKeyChange);\n    };\n  }, [TIMEOUT]);\n  return meta;\n};\n/**\n * Same as useMetaHold but for shift\n */\n\nvar useShiftHold = function useShiftHold() {\n  var shift = react.useRef(false);\n  var timestamp = react.useRef();\n  var TIMEOUT = 75;\n  react.useEffect(function () {\n    var onKeyChange = function onKeyChange(e) {\n      var newShift = e.shiftKey;\n\n      if (shift.current && !newShift) {\n        if (!timestamp.current) {\n          timestamp.current = new Date().getTime();\n          setTimeout(function () {\n            shift.current = false;\n            timestamp.current = undefined;\n          }, TIMEOUT);\n        }\n      } else {\n        shift.current = newShift;\n      }\n    };\n\n    document.addEventListener(\"keydown\", onKeyChange);\n    document.addEventListener(\"keyup\", onKeyChange);\n    return function () {\n      document.removeEventListener(\"keydown\", onKeyChange);\n      document.removeEventListener(\"keyup\", onKeyChange);\n    };\n  }, [TIMEOUT]);\n  return shift;\n};\n/**\n * hook to run a callback when a given key is pressed\n * @param keys key or keys to listen for, by .key property\n * @param callback callback to run when key is pressed\n * @param deps any additional dependencies to watch for changes\n */\n\nvar useKeypress = function useKeypress(keys, callback, deps) {\n  react.useEffect(function () {\n    var locKeys = Array.isArray(keys) ? keys : [keys];\n\n    var thisCallback = function thisCallback(e) {\n      if (locKeys.includes(e.key)) callback(e);\n    };\n\n    document.addEventListener(\"keypress\", thisCallback);\n    return function () {\n      document.removeEventListener(\"keypress\", thisCallback);\n    };\n  }, [callback, keys].concat(deps || []));\n};\n\n/**\n * Given a spring animated value, return a visible value when the springed value reaches 0.\n * Used for setting the visible prop to false when a component is scaled to 0\n * @param val\n */\n\nvar useVisible = function useVisible(val) {\n  var _useState = react.useState(false),\n      visible = _useState[0],\n      setVisible = _useState[1];\n\n  useLimitedFrame(5, function () {\n    var v = val.get();\n    if (visible && v === 0) setVisible(false);else if (!visible && v > 0) setVisible(true);\n  });\n  return visible;\n};\n\nvar _excluded$l = [\"src\", \"center\", \"normalize\"],\n    _excluded2 = [\"src\", \"center\", \"normalize\"];\n\nfunction UnsuspensedModel(props) {\n  var src = props.src,\n      center = props.center,\n      normalize = props.normalize,\n      rest = _objectWithoutPropertiesLoose__default[\"default\"](props, _excluded$l);\n\n  var gltf = useModel(src);\n  var model = react.useMemo(function () {\n    return threeStdlib.SkeletonUtils.clone(gltf.scene);\n  }, [gltf.scene]);\n  var bbox = react.useMemo(function () {\n    return new three.Box3().setFromObject(model);\n  }, [model]);\n  var centerVec = react.useMemo(function () {\n    return bbox.getCenter(new three.Vector3()).multiplyScalar(-1);\n  }, [bbox]);\n  var sizeX = bbox.max.x - bbox.min.x;\n  var sizeY = bbox.max.y - bbox.min.y;\n  var sizeZ = bbox.max.z - bbox.min.z;\n  var maxSide = Math.max(sizeX, sizeY, sizeZ);\n  var NORM_SCALE = 1 / maxSide;\n  return /*#__PURE__*/React.createElement(\"group\", _extends__default[\"default\"]({\n    name: \"spacesvr-model\"\n  }, rest), /*#__PURE__*/React.createElement(\"group\", {\n    scale: normalize ? NORM_SCALE : 1\n  }, /*#__PURE__*/React.createElement(\"primitive\", {\n    object: model,\n    position: center ? centerVec : undefined\n  })));\n}\n\nfunction FallbackModel(props) {\n  props.src;\n      props.center;\n      props.normalize;\n      var rest = _objectWithoutPropertiesLoose__default[\"default\"](props, _excluded2);\n\n  return /*#__PURE__*/React.createElement(\"group\", _extends__default[\"default\"]({\n    name: \"spacesvr-fallback-model\"\n  }, rest), /*#__PURE__*/React.createElement(\"mesh\", {\n    material: cache.mat_basic_black_wireframe\n  }, /*#__PURE__*/React.createElement(\"boxBufferGeometry\", {\n    args: [1, 1, 1]\n  })));\n}\n\nfunction Model(props) {\n  return /*#__PURE__*/React.createElement(reactErrorBoundary.ErrorBoundary, {\n    fallbackRender: function fallbackRender() {\n      return /*#__PURE__*/React.createElement(FallbackModel, props);\n    },\n    onError: function onError(err) {\n      return console.error(err);\n    }\n  }, /*#__PURE__*/React.createElement(react.Suspense, {\n    fallback: null\n  }, /*#__PURE__*/React.createElement(UnsuspensedModel, props)));\n}\n\nvar _excluded$k = [\"src\", \"size\", \"framed\", \"muted\", \"volume\", \"frameMaterial\", \"frameWidth\"];\nfunction Video(props) {\n  var src = props.src,\n      _props$size = props.size,\n      size = _props$size === void 0 ? 1 : _props$size,\n      framed = props.framed,\n      muted = props.muted,\n      _props$volume = props.volume,\n      volume = _props$volume === void 0 ? 1 : _props$volume,\n      frameMaterial = props.frameMaterial,\n      _props$frameWidth = props.frameWidth,\n      frameWidth = _props$frameWidth === void 0 ? 1 : _props$frameWidth,\n      rest = _objectWithoutPropertiesLoose__default[\"default\"](props, _excluded$k);\n\n  var camera = fiber.useThree(function (state) {\n    return state.camera;\n  });\n  var listener = react.useRef();\n\n  var _useState = react.useState(),\n      speaker = _useState[0],\n      setSpeaker = _useState[1];\n\n  var _useState2 = react.useState(),\n      dims = _useState2[0],\n      setDims = _useState2[1];\n\n  var video = react.useMemo(function () {\n    var v = document.createElement(\"video\"); // @ts-ignore\n\n    v.playsInline = true;\n    v.crossOrigin = \"Anonymous\";\n    v.loop = true;\n    v.src = src;\n    v.autoplay = false;\n    v.muted = muted ? muted : false;\n    return v;\n  }, []);\n  react.useEffect(function () {\n    var setupAudio = function setupAudio() {\n      if (!muted && !video.paused && !speaker) {\n        var _listener = new three.AudioListener();\n\n        camera.add(_listener);\n        var speak = new three.PositionalAudio(_listener);\n        speak.setMediaElementSource(video);\n        speak.setRefDistance(0.75);\n        speak.setRolloffFactor(1);\n        speak.setVolume(volume);\n        speak.setDirectionalCone(180, 230, 0.1);\n        setSpeaker(speak);\n      }\n    };\n\n    var playVideo = function playVideo() {\n      video.play().then(function () {\n        return setDims(new three.Vector2(video.videoWidth, video.videoHeight));\n      });\n      setupAudio();\n    };\n\n    if (video) {\n      video.play().then(function () {\n        setDims(new three.Vector2(video.videoWidth, video.videoHeight));\n        setupAudio();\n      });\n      document.addEventListener(\"click\", playVideo);\n      return function () {\n        document.removeEventListener(\"click\", playVideo);\n      };\n    }\n  }, [speaker, video, muted]);\n  react.useEffect(function () {\n    return function () {\n      if (listener.current) {\n        camera.remove(listener.current);\n        listener.current.clear();\n        listener.current = undefined;\n      }\n\n      if (speaker) {\n        speaker.clear();\n        speaker.disconnect();\n        setSpeaker(undefined);\n      }\n\n      if (video) {\n        video.pause();\n        video.remove();\n      }\n    };\n  }, []);\n\n  if (!dims || !video) {\n    return null;\n  }\n\n  var max = Math.max(dims.x, dims.y);\n  var width = dims.x / max * size;\n  var height = dims.y / max * size;\n  return /*#__PURE__*/React.createElement(\"group\", _extends__default[\"default\"]({\n    name: \"spacesvr-video\"\n  }, rest), /*#__PURE__*/React.createElement(\"mesh\", null, /*#__PURE__*/React.createElement(\"planeBufferGeometry\", {\n    args: [width, height]\n  }), /*#__PURE__*/React.createElement(\"meshBasicMaterial\", {\n    side: three.DoubleSide\n  }, /*#__PURE__*/React.createElement(\"videoTexture\", {\n    attach: \"map\",\n    args: [video],\n    encoding: three.sRGBEncoding\n  }))), speaker && /*#__PURE__*/React.createElement(\"primitive\", {\n    object: speaker\n  }), framed && /*#__PURE__*/React.createElement(Frame, {\n    width: width,\n    height: height,\n    thickness: frameWidth,\n    material: frameMaterial\n  }));\n}\n\nfunction LostFloor() {\n  var mat = react.useMemo(function () {\n    var m = new three.MeshLambertMaterial();\n\n    m.onBeforeCompile = function (shader) {\n      shader.vertexShader = vertHead$1 + shader.vertexShader.replace(\"#include <worldpos_vertex>\", \"#include <worldpos_vertex>\\n\" + vertBody);\n      shader.fragmentShader = fragHead + shader.fragmentShader.replace(\"#include <color_fragment>\", \"#include <color_fragment>\\n  \" + fragColorFragment);\n    };\n\n    return m;\n  }, []);\n  return /*#__PURE__*/React.createElement(\"group\", {\n    name: \"spacesvr-lost-floor\"\n  }, /*#__PURE__*/React.createElement(\"mesh\", {\n    \"rotation-x\": -Math.PI / 2,\n    material: mat\n  }, /*#__PURE__*/React.createElement(\"planeBufferGeometry\", {\n    args: [10000, 10000, 1, 1]\n  })));\n}\nvar noise = \"\\n   //\\n  // Description : Array and textureless GLSL 2D/3D/4D simplex\\n  //               noise functions.\\n  //      Author : Ian McEwan, Ashima Arts.\\n  //  Maintainer : ijm\\n  //     Lastmod : 20110822 (ijm)\\n  //     License : Copyright (C) 2011 Ashima Arts. All rights reserved.\\n  //               Distributed under the MIT License. See LICENSE file.\\n  //               https://github.com/ashima/webgl-noise\\n  //\\n  \\n  vec3 mod289(vec3 x) {\\n    return x - floor(x * (1.0 / 289.0)) * 289.0;\\n  }\\n  \\n  vec4 mod289(vec4 x) {\\n    return x - floor(x * (1.0 / 289.0)) * 289.0;\\n  }\\n  \\n  vec4 permute(vec4 x) {\\n       return mod289(((x*34.0)+1.0)*x);\\n  }\\n  \\n  vec4 taylorInvSqrt(vec4 r)\\n  {\\n    return 1.79284291400159 - 0.85373472095314 * r;\\n  }\\n  \\n  float snoise(vec3 v)\\n    {\\n    const vec2  C = vec2(1.0/6.0, 1.0/3.0) ;\\n    const vec4  D = vec4(0.0, 0.5, 1.0, 2.0);\\n  \\n  // First corner\\n    vec3 i  = floor(v + dot(v, C.yyy) );\\n    vec3 x0 =   v - i + dot(i, C.xxx) ;\\n  \\n  // Other corners\\n    vec3 g = step(x0.yzx, x0.xyz);\\n    vec3 l = 1.0 - g;\\n    vec3 i1 = min( g.xyz, l.zxy );\\n    vec3 i2 = max( g.xyz, l.zxy );\\n  \\n    //   x0 = x0 - 0.0 + 0.0 * C.xxx;\\n    //   x1 = x0 - i1  + 1.0 * C.xxx;\\n    //   x2 = x0 - i2  + 2.0 * C.xxx;\\n    //   x3 = x0 - 1.0 + 3.0 * C.xxx;\\n    vec3 x1 = x0 - i1 + C.xxx;\\n    vec3 x2 = x0 - i2 + C.yyy; // 2.0*C.x = 1/3 = C.y\\n    vec3 x3 = x0 - D.yyy;      // -1.0+3.0*C.x = -0.5 = -D.y\\n  \\n  // Permutations\\n    i = mod289(i);\\n    vec4 p = permute( permute( permute(\\n               i.z + vec4(0.0, i1.z, i2.z, 1.0 ))\\n             + i.y + vec4(0.0, i1.y, i2.y, 1.0 ))\\n             + i.x + vec4(0.0, i1.x, i2.x, 1.0 ));\\n  \\n  // Gradients: 7x7 points over a square, mapped onto an octahedron.\\n  // The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294)\\n    float n_ = 0.142857142857; // 1.0/7.0\\n    vec3  ns = n_ * D.wyz - D.xzx;\\n  \\n    vec4 j = p - 49.0 * floor(p * ns.z * ns.z);  //  mod(p,7*7)\\n  \\n    vec4 x_ = floor(j * ns.z);\\n    vec4 y_ = floor(j - 7.0 * x_ );    // mod(j,N)\\n  \\n    vec4 x = x_ *ns.x + ns.yyyy;\\n    vec4 y = y_ *ns.x + ns.yyyy;\\n    vec4 h = 1.0 - abs(x) - abs(y);\\n  \\n    vec4 b0 = vec4( x.xy, y.xy );\\n    vec4 b1 = vec4( x.zw, y.zw );\\n  \\n    //vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0;\\n    //vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0;\\n    vec4 s0 = floor(b0)*2.0 + 1.0;\\n    vec4 s1 = floor(b1)*2.0 + 1.0;\\n    vec4 sh = -step(h, vec4(0.0));\\n  \\n    vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ;\\n    vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ;\\n  \\n    vec3 p0 = vec3(a0.xy,h.x);\\n    vec3 p1 = vec3(a0.zw,h.y);\\n    vec3 p2 = vec3(a1.xy,h.z);\\n    vec3 p3 = vec3(a1.zw,h.w);\\n  \\n  //Normalise gradients\\n    vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));\\n    p0 *= norm.x;\\n    p1 *= norm.y;\\n    p2 *= norm.z;\\n    p3 *= norm.w;\\n  \\n  // Mix final noise value\\n    vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);\\n    m = m * m;\\n    return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1),\\n                                  dot(p2,x2), dot(p3,x3) ) );\\n    } \\n  \\n\";\nvar oklab = \"\\nfloat fixedpow(float a, float x)\\n{\\n    return pow(abs(a), x) * sign(a);\\n}\\n\\nfloat cbrt(float a)\\n{\\n    return fixedpow(a, 0.3333333333);\\n}\\n\\nvec3 lsrgb2oklab(vec3 c)\\n{\\n    float l = 0.4122214708 * c.r + 0.5363325363 * c.g + 0.0514459929 * c.b;\\n    float m = 0.2119034982 * c.r + 0.6806995451 * c.g + 0.1073969566 * c.b;\\n    float s = 0.0883024619 * c.r + 0.2817188376 * c.g + 0.6299787005 * c.b;\\n\\n    float l_ = cbrt(l);\\n    float m_ = cbrt(m);\\n    float s_ = cbrt(s);\\n\\n    return vec3(\\n        0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_,\\n        1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_,\\n        0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_\\n    );\\n}\\n\\nvec3 oklab2lsrgb(vec3 c)\\n{\\n    float l_ = c.r + 0.3963377774 * c.g + 0.2158037573 * c.b;\\n    float m_ = c.r - 0.1055613458 * c.g - 0.0638541728 * c.b;\\n    float s_ = c.r - 0.0894841775 * c.g - 1.2914855480 * c.b;\\n\\n    float l = l_ * l_ * l_;\\n    float m = m_ * m_ * m_;\\n    float s = s_ * s_ * s_;\\n\\n    return vec3(\\n        4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,\\n        -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,\\n        -0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s\\n    );\\n}\\n\";\nvar vertHead$1 = \"\\n  varying vec3 vPos;\\n\";\nvar vertBody = \"\\n  vPos = position;\\n\";\nvar fragHead = \"\\n  \" + noise + \"\\n  \" + oklab + \"\\n  \\n  varying vec3 vPos;\\n\";\nvar fragColorFragment = \"\\n  diffuseColor.rgb -= 0.2 * (snoise(vPos) + 1.) / 2.;\\n  diffuseColor.r -= 0.025 * (snoise(-vPos) + 1.) / 2.;\\n\";\n\nfunction _createForOfIteratorHelperLoose$9(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray$9(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray$9(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray$9(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$9(o, minLen); }\n\nfunction _arrayLikeToArray$9(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n/**\n * Traverses an object 3d to find any meshes marked collidable by their name\n */\n\nvar KEYWORDS = [\"collider\", \"collision\"];\nvar findColliderMeshes = function findColliderMeshes(obj) {\n  var result = [];\n  obj.traverse(function (node) {\n    if (node.isMesh) {\n      for (var _iterator = _createForOfIteratorHelperLoose$9(KEYWORDS), _step; !(_step = _iterator()).done;) {\n        var keyword = _step.value;\n\n        if (node.name.toLowerCase().includes(keyword)) {\n          result.push(node);\n        }\n      }\n    }\n  });\n\n  if (result.length > 0) {\n    return result;\n  }\n\n  return undefined;\n};\n/**\n * Gets the number of triangles in a geometry\n */\n\nvar getGeometryTriCount = function getGeometryTriCount(geometry) {\n  return geometry.index ? geometry.index.count / 3 : geometry.attributes.position.count / 3;\n};\n/**\n * Traverses an object 3d to find and return all meshes\n */\n\nvar getMeshes = function getMeshes(obj) {\n  var result = [];\n  obj.traverse(function (node) {\n    if (node.isMesh) {\n      result.push(node);\n    }\n  });\n  return result;\n};\n/**\n * Given a mesh, clone the geo and apply the transformations. pass a parent to cap off transforms\n */\n\nvar getTransformedMeshGeo = function getTransformedMeshGeo(mesh, parent) {\n  var geo = mesh.geometry.clone();\n  mesh.updateWorldMatrix(true, false);\n  var pos = new three.Vector3();\n  var quat = new three.Quaternion();\n  var euler = new three.Euler();\n  var scale = new three.Vector3();\n  var obj = mesh;\n\n  do {\n    obj.matrix.decompose(pos, quat, scale);\n    euler.setFromQuaternion(quat);\n    geo.scale(scale.x, scale.y, scale.z);\n    geo.rotateX(euler.x);\n    geo.rotateY(euler.y);\n    geo.rotateZ(euler.z);\n    geo.translate(pos.x, pos.y, pos.z);\n    obj = obj.parent;\n  } while (obj && obj !== parent);\n\n  return geo;\n};\n/**\n * Gets a uuid for an arr of meshes\n */\n\nvar getMeshesUUID = function getMeshesUUID(meshes) {\n  var uuids = meshes.map(function (mesh) {\n    return mesh.uuid;\n  });\n  uuids.sort();\n  return uuids.join(\"-\");\n};\n\nvar useTrimeshCollision = function useTrimeshCollision(geometry, trans) {\n  var indices = geometry.index.array;\n  var isInterleaved = // @ts-ignore\n  geometry.attributes.position.isInterleavedBufferAttribute;\n  var vertices = [];\n\n  if (isInterleaved) {\n    var attr = geometry.attributes.position;\n    var data = attr.data;\n\n    for (var i = attr.offset; i < data.array.length; i += data.stride) {\n      for (var x = 0; x < attr.itemSize; x++) {\n        vertices.push(data.array[i + x]);\n      }\n    }\n  } else {\n    vertices = geometry.attributes.position.array;\n  }\n\n  return cannon.useTrimesh(function () {\n    return {\n      type: \"Static\",\n      args: [vertices, indices],\n      position: trans == null ? void 0 : trans.pos,\n      rotation: trans == null ? void 0 : trans.rot\n    };\n  }, undefined, [geometry.uuid]);\n};\n\nfunction TrimeshCollider(props) {\n  var geo = props.geo;\n  var group = react.useRef(null);\n\n  var _useState = react.useState(function () {\n    return new three.Vector3();\n  }),\n      pos = _useState[0];\n\n  var _useState2 = react.useState(function () {\n    return new three.Quaternion();\n  }),\n      quat = _useState2[0];\n\n  var _useState3 = react.useState(function () {\n    return new three.Vector3();\n  }),\n      scale = _useState3[0];\n\n  var _useState4 = react.useState(function () {\n    return new three.Euler();\n  }),\n      euler = _useState4[0];\n\n  var _useState5 = react.useState(new three.Vector3(1, 1, 1)),\n      curScale = _useState5[0],\n      setCurScale = _useState5[1];\n\n  var geometry = react.useMemo(function () {\n    var g = geo.clone().scale(curScale.x, curScale.y, curScale.z);\n    g.computeVertexNormals();\n    return g;\n  }, [geo, curScale]);\n\n  var _useTrimeshCollision = useTrimeshCollision(geometry, {\n    pos: pos.toArray(),\n    rot: [euler.x, euler.y, euler.z]\n  }),\n      api = _useTrimeshCollision[1];\n\n  var lastUpdatedMatrix = react.useRef(new three.Matrix4());\n  useLimitedFrame(8, function () {\n    if (!group.current) return; // get global position, rotation, scale\n\n    group.current.updateWorldMatrix(true, false);\n    group.current.matrixWorld.decompose(pos, quat, scale); // no need to update if nothing changed\n\n    if (lastUpdatedMatrix.current.equals(group.current.matrixWorld)) {\n      return;\n    } // update last values\n\n\n    lastUpdatedMatrix.current.copy(group.current.matrixWorld); // if a change was found, update collider\n\n    api.position.copy(pos);\n    api.rotation.copy(euler.setFromQuaternion(quat));\n    if (!scale.equals(curScale)) setCurScale(scale.clone());\n  });\n  return /*#__PURE__*/React.createElement(\"group\", {\n    ref: group\n  });\n}\n\n// manually copied and modified from three-stdlib to fix bug here: https://github.com/mrdoob/three.js/pull/24169\nvar cb = new three.Vector3(),\n    ab = new three.Vector3();\n\nfunction pushIfUnique(array, object) {\n  if (array.indexOf(object) === -1) array.push(object);\n}\n\nfunction removeFromArray(array, object) {\n  var k = array.indexOf(object);\n  if (k > -1) array.splice(k, 1);\n}\n\nvar Vertex = /*#__PURE__*/function () {\n  function Vertex(v, id) {\n    this.minCost = 0;\n    this.totalCost = 0;\n    this.costCount = 0;\n    this.position = v;\n    this.id = id; // old index id\n\n    this.faces = []; // faces vertex is connected\n\n    this.neighbors = []; // neighbouring vertices aka \"adjacentVertices\"\n    // these will be computed in computeEdgeCostAtVertex()\n\n    this.collapseCost = 0; // cost of collapsing this vertex, the less the better. aka objdist\n\n    this.collapseNeighbor = null; // best candinate for collapsing\n  }\n\n  var _proto = Vertex.prototype;\n\n  _proto.addUniqueNeighbor = function addUniqueNeighbor(vertex) {\n    pushIfUnique(this.neighbors, vertex);\n  };\n\n  _proto.removeIfNonNeighbor = function removeIfNonNeighbor(n) {\n    var neighbors = this.neighbors;\n    var faces = this.faces;\n    var offset = neighbors.indexOf(n);\n    if (offset === -1) return;\n\n    for (var i = 0; i < faces.length; i++) {\n      if (faces[i].hasVertex(n)) return;\n    }\n\n    neighbors.splice(offset, 1);\n  };\n\n  return Vertex;\n}(); // we use a triangle class to represent structure of face slightly differently\n\n\nvar Triangle = /*#__PURE__*/function () {\n  function Triangle(v1, v2, v3, a, b, c) {\n    this.normal = new three.Vector3();\n    this.a = a;\n    this.b = b;\n    this.c = c;\n    this.v1 = v1;\n    this.v2 = v2;\n    this.v3 = v3;\n    this.computeNormal();\n    v1.faces.push(this);\n    v1.addUniqueNeighbor(v2);\n    v1.addUniqueNeighbor(v3);\n    v2.faces.push(this);\n    v2.addUniqueNeighbor(v1);\n    v2.addUniqueNeighbor(v3);\n    v3.faces.push(this);\n    v3.addUniqueNeighbor(v1);\n    v3.addUniqueNeighbor(v2);\n  }\n\n  var _proto2 = Triangle.prototype;\n\n  _proto2.computeNormal = function computeNormal() {\n    var vA = this.v1.position;\n    var vB = this.v2.position;\n    var vC = this.v3.position;\n    cb.subVectors(vC, vB);\n    ab.subVectors(vA, vB);\n    cb.cross(ab).normalize();\n    this.normal.copy(cb);\n  };\n\n  _proto2.hasVertex = function hasVertex(v) {\n    return v === this.v1 || v === this.v2 || v === this.v3;\n  };\n\n  _proto2.replaceVertex = function replaceVertex(oldv, newv) {\n    if (oldv === this.v1) this.v1 = newv;else if (oldv === this.v2) this.v2 = newv;else if (oldv === this.v3) this.v3 = newv;\n    removeFromArray(oldv.faces, this);\n    newv.faces.push(this);\n    oldv.removeIfNonNeighbor(this.v1);\n    this.v1.removeIfNonNeighbor(oldv);\n    oldv.removeIfNonNeighbor(this.v2);\n    this.v2.removeIfNonNeighbor(oldv);\n    oldv.removeIfNonNeighbor(this.v3);\n    this.v3.removeIfNonNeighbor(oldv);\n    this.v1.addUniqueNeighbor(this.v2);\n    this.v1.addUniqueNeighbor(this.v3);\n    this.v2.addUniqueNeighbor(this.v1);\n    this.v2.addUniqueNeighbor(this.v3);\n    this.v3.addUniqueNeighbor(this.v1);\n    this.v3.addUniqueNeighbor(this.v2);\n    this.computeNormal();\n  };\n\n  return Triangle;\n}();\n/**\n *\tSimplification Geometry Modifier\n *    - based on code and technique\n *\t  - by Stan Melax in 1998\n *\t  - Progressive Mesh type Polygon Reduction Algorithm\n *    - http://www.melax.com/polychop/\n */\n\n\nvar SimplifyModifier = /*#__PURE__*/function () {\n  // eslint-disable-next-line @typescript-eslint/no-empty-function\n  function SimplifyModifier() {\n    var _this = this;\n\n    this.computeEdgeCollapseCost = function (u, v) {\n      // if we collapse edge uv by moving u to v then how\n      // much different will the model change, i.e. the \"error\".\n      var edgelength = v.position.distanceTo(u.position);\n      var curvature = 0;\n      var sideFaces = [];\n      var i,\n          // eslint-disable-next-line prefer-const\n      il = u.faces.length,\n          face,\n          sideFace; // find the \"sides\" triangles that are on the edge uv\n\n      for (i = 0; i < il; i++) {\n        face = u.faces[i];\n\n        if (face.hasVertex(v)) {\n          sideFaces.push(face);\n        }\n      } // use the triangle facing most away from the sides\n      // to determine our curvature term\n\n\n      for (i = 0; i < il; i++) {\n        var minCurvature = 1;\n        face = u.faces[i];\n\n        for (var j = 0; j < sideFaces.length; j++) {\n          sideFace = sideFaces[j]; // use dot product of face normals.\n\n          var dotProd = face.normal.dot(sideFace.normal);\n          minCurvature = Math.min(minCurvature, (1.001 - dotProd) / 2);\n        }\n\n        curvature = Math.max(curvature, minCurvature);\n      } // crude approach in attempt to preserve borders\n      // though it seems not to be totally correct\n\n\n      var borders = 0;\n\n      if (sideFaces.length < 2) {\n        // we add some arbitrary cost for borders,\n        // borders += 10;\n        curvature = 1;\n      }\n\n      var amt = edgelength * curvature + borders;\n      return amt;\n    };\n\n    this.computeEdgeCostAtVertex = function (v) {\n      // compute the edge collapse cost for all edges that start\n      // from vertex v.  Since we are only interested in reducing\n      // the object by selecting the min cost edge at each step, we\n      // only cache the cost of the least cost edge at this vertex\n      // (in member variable collapse) as well as the value of the\n      // cost (in member variable collapseCost).\n      if (v.neighbors.length === 0) {\n        // collapse if no neighbors.\n        v.collapseNeighbor = null;\n        v.collapseCost = -0.01;\n        return;\n      }\n\n      v.collapseCost = 100000;\n      v.collapseNeighbor = null; // search all neighboring edges for \"least cost\" edge\n\n      for (var i = 0; i < v.neighbors.length; i++) {\n        var collapseCost = _this.computeEdgeCollapseCost(v, v.neighbors[i]);\n\n        if (!v.collapseNeighbor) {\n          v.collapseNeighbor = v.neighbors[i];\n          v.collapseCost = collapseCost;\n          v.minCost = collapseCost;\n          v.totalCost = 0;\n          v.costCount = 0;\n        }\n\n        v.costCount++;\n        v.totalCost += collapseCost;\n\n        if (collapseCost < v.minCost) {\n          v.collapseNeighbor = v.neighbors[i];\n          v.minCost = collapseCost;\n        }\n      } // we average the cost of collapsing at this vertex\n\n\n      v.collapseCost = v.totalCost / v.costCount; // v.collapseCost = v.minCost;\n    };\n\n    this.removeFace = function (f, faces) {\n      removeFromArray(faces, f);\n      if (f.v1) removeFromArray(f.v1.faces, f);\n      if (f.v2) removeFromArray(f.v2.faces, f);\n      if (f.v3) removeFromArray(f.v3.faces, f); // TODO optimize this!\n\n      var vs = [f.v1, f.v2, f.v3];\n      var v1, v2;\n\n      for (var i = 0; i < 3; i++) {\n        v1 = vs[i];\n        v2 = vs[(i + 1) % 3];\n        if (!v1 || !v2) continue;\n        v1.removeIfNonNeighbor(v2);\n        v2.removeIfNonNeighbor(v1);\n      }\n    };\n\n    this.collapse = function (vertices, faces, u, v) {\n      // u and v are pointers to vertices of an edge\n      // Collapse the edge uv by moving vertex u onto v\n      if (!v) {\n        // u is a vertex all by itself so just delete it..\n        _this.removeVertex(u, vertices);\n\n        return;\n      }\n\n      var i;\n      var tmpVertices = [];\n\n      for (i = 0; i < u.neighbors.length; i++) {\n        tmpVertices.push(u.neighbors[i]);\n      } // delete triangles on edge uv:\n\n\n      for (i = u.faces.length - 1; i >= 0; i--) {\n        if (u.faces[i] && u.faces[i].hasVertex(v)) {\n          _this.removeFace(u.faces[i], faces);\n        }\n      } // update remaining triangles to have v instead of u\n\n\n      for (i = u.faces.length - 1; i >= 0; i--) {\n        u.faces[i].replaceVertex(u, v);\n      }\n\n      _this.removeVertex(u, vertices); // recompute the edge collapse costs in neighborhood\n\n\n      for (i = 0; i < tmpVertices.length; i++) {\n        _this.computeEdgeCostAtVertex(tmpVertices[i]);\n      }\n    };\n\n    this.minimumCostEdge = function (vertices) {\n      // O(n * n) approach. TODO optimize this\n      var least = vertices[0];\n\n      for (var i = 0; i < vertices.length; i++) {\n        if (vertices[i].collapseCost < least.collapseCost) {\n          least = vertices[i];\n        }\n      }\n\n      return least;\n    };\n\n    this.modify = function (geometry, targetFaces) {\n      geometry = geometry.clone();\n      var attributes = geometry.attributes; // this modifier can only process indexed and non-indexed geomtries with a position attribute\n\n      for (var name in attributes) {\n        if (name !== \"position\") geometry.deleteAttribute(name);\n      }\n\n      geometry = threeStdlib.mergeVertices(geometry); //\n      // put data of original geometry in different data structures\n      //\n\n      var vertices = [];\n      var faces = []; // add vertices\n\n      var positionAttribute = geometry.getAttribute(\"position\");\n\n      for (var i = 0; i < positionAttribute.count; i++) {\n        var v = new three.Vector3().fromBufferAttribute(positionAttribute, i);\n        var vertex = new Vertex(v, i);\n        vertices.push(vertex);\n      } // add faces\n\n\n      var geomIndex = geometry.getIndex();\n\n      if (geomIndex !== null) {\n        for (var _i = 0; _i < geomIndex.count; _i += 3) {\n          var a = geomIndex.getX(_i);\n          var b = geomIndex.getX(_i + 1);\n          var c = geomIndex.getX(_i + 2);\n          var triangle = new Triangle(vertices[a], vertices[b], vertices[c], a, b, c);\n          faces.push(triangle);\n        }\n      } else {\n        for (var _i2 = 0; _i2 < positionAttribute.count; _i2 += 3) {\n          var _a = _i2;\n\n          var _b = _i2 + 1;\n\n          var _c = _i2 + 2;\n\n          var _triangle = new Triangle(vertices[_a], vertices[_b], vertices[_c], _a, _b, _c);\n\n          faces.push(_triangle);\n        }\n      } // compute all edge collapse costs\n\n\n      for (var _i3 = 0, il = vertices.length; _i3 < il; _i3++) {\n        _this.computeEdgeCostAtVertex(vertices[_i3]);\n      }\n\n      var nextVertex;\n      var z = faces.length - targetFaces;\n\n      while (z--) {\n        nextVertex = _this.minimumCostEdge(vertices);\n\n        if (!nextVertex) {\n          console.log(\"THREE.SimplifyModifier: No next vertex\");\n          break;\n        } else if (faces.length <= targetFaces) {\n          break;\n        } else {\n          _this.collapse(vertices, faces, nextVertex, nextVertex.collapseNeighbor);\n        }\n      } //\n\n\n      var simplifiedGeometry = new three.BufferGeometry();\n      var position = [];\n      var index = []; //\n\n      for (var _i4 = 0; _i4 < vertices.length; _i4++) {\n        var _vertex = vertices[_i4].position;\n        position.push(_vertex.x, _vertex.y, _vertex.z);\n      } //\n\n\n      for (var _i5 = 0; _i5 < faces.length; _i5++) {\n        var face = faces[_i5];\n\n        var _a2 = vertices.indexOf(face.v1);\n\n        var _b2 = vertices.indexOf(face.v2);\n\n        var _c2 = vertices.indexOf(face.v3);\n\n        index.push(_a2, _b2, _c2);\n      } //\n\n\n      simplifiedGeometry.setAttribute(\"position\", new three.Float32BufferAttribute(position, 3));\n      simplifiedGeometry.setIndex(index);\n      return simplifiedGeometry;\n    };\n  }\n\n  var _proto3 = SimplifyModifier.prototype;\n\n  _proto3.removeVertex = function removeVertex(v, vertices) {\n    console.assert(v.faces.length === 0);\n\n    while (v.neighbors.length) {\n      var n = v.neighbors.pop();\n      removeFromArray(n.neighbors, v);\n    }\n\n    removeFromArray(vertices, v);\n  };\n\n  return SimplifyModifier;\n}();\n\nvar generateSimplifiedGeo = function generateSimplifiedGeo(geo, triTarget) {\n  var modifier = new SimplifyModifier();\n  return modifier.modify(geo, Math.floor(triTarget));\n};\n\nfunction Collidable(props) {\n  var children = props.children,\n      _props$triLimit = props.triLimit,\n      triLimit = _props$triLimit === void 0 ? 1000 : _props$triLimit,\n      _props$enabled = props.enabled,\n      enabled = _props$enabled === void 0 ? true : _props$enabled,\n      _props$hideCollisionM = props.hideCollisionMeshes,\n      hideCollisionMeshes = _props$hideCollisionM === void 0 ? false : _props$hideCollisionM;\n  var group = react.useRef(null);\n  var geoUUID = react.useRef();\n\n  var _useState = react.useState(),\n      collisionMeshes = _useState[0],\n      setCollisionMeshes = _useState[1];\n\n  var _useState2 = react.useState(),\n      collisionGeos = _useState2[0],\n      setCollisionGeos = _useState2[1]; // func to create uuid to know when to regenerate\n\n\n  var createUUID = function createUUID(meshes) {\n    return triLimit + \"-\" + getMeshesUUID(meshes);\n  }; // register collision meshes and collision geos\n\n\n  react.useEffect(function () {\n    if (!group.current || !enabled) {\n      setCollisionGeos(undefined);\n      setCollisionMeshes(undefined);\n      geoUUID.current = undefined;\n      return;\n    } // if the user names the meshes themselves, give them full control\n\n\n    var colliderMeshes = findColliderMeshes(group.current);\n\n    if (colliderMeshes) {\n      if (createUUID(colliderMeshes) === geoUUID.current) return;\n      setCollisionMeshes(colliderMeshes);\n\n      var _geos = colliderMeshes.map(function (m) {\n        return getTransformedMeshGeo(m, group.current);\n      });\n\n      setCollisionGeos(_geos);\n      geoUUID.current = createUUID(colliderMeshes);\n      return;\n    } // otherwise, use all the meshes in the model\n\n\n    var meshes = getMeshes(group.current);\n    if (createUUID(meshes) === geoUUID.current) return;\n    setCollisionMeshes(meshes);\n    geoUUID.current = createUUID(meshes); // aggregate geos in the model\n\n    var geos = meshes.map(function (m) {\n      return getTransformedMeshGeo(m, group.current);\n    }); // either use geo directly or bvh version, depending on tri count\n\n    var triCount = geos.reduce(function (c, g) {\n      return c + getGeometryTriCount(g);\n    }, 0);\n\n    if (triCount < triLimit) {\n      setCollisionGeos(geos);\n    } else {\n      var perc = triLimit / triCount;\n      var simpGeos = geos.map(function (g) {\n        return generateSimplifiedGeo(g, getGeometryTriCount(g) * perc);\n      }).filter(function (g) {\n        return g;\n      });\n      setCollisionGeos(simpGeos);\n    }\n  }, [children, triLimit, enabled]); // hide or show collision meshes\n\n  react.useEffect(function () {\n    if (!collisionMeshes) return;\n    collisionMeshes.map(function (collider) {\n      return collider.visible = !hideCollisionMeshes;\n    });\n    return function () {\n      collisionMeshes.map(function (collider) {\n        return collider.visible = true;\n      });\n    };\n  }, [collisionMeshes, hideCollisionMeshes]);\n  return /*#__PURE__*/React.createElement(\"group\", {\n    name: \"spacesvr-collidable\",\n    ref: group\n  }, children, enabled && collisionGeos && collisionGeos.map(function (geo, i) {\n    return /*#__PURE__*/React.createElement(TrimeshCollider, {\n      key: geo.uuid,\n      geo: geo\n    });\n  }));\n}\n\nfunction XRInteractable(props) {\n  var onClick = props.onClick,\n      onHover = props.onHover,\n      onUnHover = props.onUnHover,\n      children = props.children;\n  return /*#__PURE__*/React.createElement(\"group\", {\n    name: \"spacesvr-interactable\"\n  }, /*#__PURE__*/React.createElement(xr.Interactive, {\n    onHover: onHover,\n    onBlur: onUnHover,\n    onSelect: onClick ? function (e) {\n      return onClick(e.intersection);\n    } : undefined\n  }, children));\n}\n\nvar CLICK_TIMEOUT$1 = 0.4; // seconds\n\nvar MAX_DRAG = 0.1; // meters\n\nfunction MobileDesktopInteractable(props) {\n  var onClick = props.onClick,\n      onHover = props.onHover,\n      onUnHover = props.onUnHover,\n      passedRaycaster = props.raycaster,\n      children = props.children;\n  var gl = fiber.useThree(function (state) {\n    return state.gl;\n  });\n  var clock = fiber.useThree(function (state) {\n    return state.clock;\n  });\n\n  var _useEnvironment = useEnvironment(),\n      device = _useEnvironment.device;\n\n  var player = usePlayer();\n  var group = react.useRef(null);\n  var down = react.useMemo(function () {\n    return {\n      start: new three.Vector3(),\n      time: 0\n    };\n  }, []);\n  var intersection = react.useRef();\n  var RAYCASTER = passedRaycaster || player.raycaster;\n  var DETECT_HOVER = !!onHover || !!onUnHover; // only detect hover if we have a hover handler\n\n  var getIntersection = react.useCallback(function () {\n    if (!group.current) return undefined;\n    RAYCASTER.firstHitOnly = true;\n    var intersects = RAYCASTER.intersectObject(group.current, true);\n    RAYCASTER.firstHitOnly = false;\n    return intersects.length > 0 ? intersects[0] : undefined;\n  }, [RAYCASTER]); // continuously update the hover state if we have a hover handler\n\n  useLimitedFrame(17, function () {\n    if (!group.current || !DETECT_HOVER) return;\n    var inter = getIntersection();\n\n    if (inter) {\n      if (!intersection.current) {\n        if (onHover) onHover();\n      }\n\n      intersection.current = inter;\n    } else {\n      if (intersection.current) {\n        intersection.current = undefined;\n        if (onUnHover) onUnHover();\n      }\n    }\n  }); // enable bvh raycasting for children\n\n  react.useEffect(function () {\n    if (!group.current) return;\n    group.current.traverse(function (obj) {\n      var mesh = obj;\n      if (mesh.isMesh) enableBVHRaycast(mesh, 50);\n    });\n  }, []);\n  react.useEffect(function () {\n    var startPress = function startPress() {\n      RAYCASTER.ray.at(1, down.start);\n      down.time = clock.elapsedTime;\n    };\n\n    var endPress = function endPress() {\n      if (!onClick || !group.current) return;\n      var newPos = RAYCASTER.ray.at(1, new three.Vector3());\n      var dist = down.start.distanceTo(newPos);\n      var timeDiff = clock.elapsedTime - down.time;\n      if (dist > MAX_DRAG || timeDiff > CLICK_TIMEOUT$1) return; // either look for hover state or re-do raycast\n\n      if (DETECT_HOVER) {\n        if (intersection.current) onClick(intersection.current);\n      } else {\n        var inter = getIntersection();\n        if (inter) onClick(inter);\n      }\n    };\n\n    var startev = device.mobile ? \"touchstart\" : \"mousedown\";\n    var endev = device.mobile ? \"touchend\" : \"mouseup\";\n    gl.domElement.addEventListener(startev, startPress);\n    gl.domElement.addEventListener(endev, endPress);\n    return function () {\n      gl.domElement.removeEventListener(startev, startPress);\n      gl.domElement.removeEventListener(endev, endPress);\n    };\n  }, [DETECT_HOVER, RAYCASTER, clock, device.mobile, down, getIntersection, gl.domElement, onClick]);\n  return /*#__PURE__*/React.createElement(\"group\", {\n    name: \"spacesvr-interactable\",\n    ref: group\n  }, children);\n}\n\n/**\n * Interactable adds on click and hover methods to any group of Object3D's.\n */\nfunction Interactable(props) {\n  var _useEnvironment = useEnvironment(),\n      device = _useEnvironment.device;\n\n  if (device.xr) return /*#__PURE__*/React.createElement(XRInteractable, props);\n  return /*#__PURE__*/React.createElement(MobileDesktopInteractable, props);\n}\n\nvar ToolbeltContext = /*#__PURE__*/react.createContext({});\nvar useToolbelt = function useToolbelt() {\n  return react.useContext(ToolbeltContext);\n};\nvar useToolbeltState = function useToolbeltState(showOnSpawn) {\n  var _useState = react.useState(function () {\n    return new three.Scene();\n  }),\n      hudScene = _useState[0];\n\n  var rerender = useRerender();\n  var tools = react.useMemo(function () {\n    return [];\n  }, []);\n\n  var _useState2 = react.useState(showOnSpawn ? 0 : undefined),\n      activeIndex = _useState2[0],\n      setActiveIndex = _useState2[1];\n\n  var lastActiveIndex = react.useRef(0);\n\n  var _useState3 = react.useState(\"right\"),\n      direction = _useState3[0],\n      setDirection = _useState3[1];\n\n  var grant = react.useCallback(function (name, orderIndex) {\n    // make sure no tool with same name or key exists\n    if (tools.find(function (tool) {\n      return tool.name === name;\n    })) {\n      console.error(\"Toolbelt: Tool with same name already exists: \" + name);\n      return;\n    }\n\n    if (tools.length === 0) rerender();\n    var tool = {\n      name: name,\n      orderIndex: orderIndex || 0\n    };\n    tools.push(tool); // sort tools by orderIndex, then by name\n\n    tools.sort(function (a, b) {\n      return a.orderIndex !== b.orderIndex ? a.orderIndex - b.orderIndex : a.name.localeCompare(b.name);\n    });\n  }, [tools]);\n  var revoke = react.useCallback(function (name) {\n    var tool = tools.find(function (tool) {\n      return tool.name === name;\n    });\n\n    if (tool) {\n      tools.splice(tools.indexOf(tool), 1);\n    }\n  }, [tools]);\n  react.useEffect(function () {\n    var handleKeypress = function handleKeypress(e) {\n      if (isTyping() || e.metaKey || e.ctrlKey) return;\n\n      if (e.key == \"Tab\") {\n        if (e.shiftKey) {\n          setDirection(\"left\");\n          if (activeIndex === undefined) setActiveIndex(tools.length - 1);else if (activeIndex === 0) setActiveIndex(undefined);else setActiveIndex((activeIndex - 1 + tools.length) % tools.length);\n        } else {\n          setDirection(\"right\");\n          if (activeIndex === undefined) setActiveIndex(0);else if (activeIndex === tools.length - 1) setActiveIndex(undefined);else setActiveIndex((activeIndex + 1) % tools.length);\n        }\n\n        e.preventDefault();\n      }\n    };\n\n    document.addEventListener(\"keydown\", handleKeypress);\n    return function () {\n      return document.removeEventListener(\"keydown\", handleKeypress);\n    };\n  }, [activeIndex, tools]);\n  react.useEffect(function () {\n    if (activeIndex !== undefined) lastActiveIndex.current = activeIndex;\n  }, [activeIndex]);\n  var next = react.useCallback(function () {\n    setDirection(\"right\");\n\n    if (tools.length === 1) {\n      setActiveIndex(function (actInd) {\n        return actInd === undefined ? 0 : undefined;\n      });\n    } else {\n      setActiveIndex(function (actInd) {\n        return actInd !== undefined ? (actInd + 1) % tools.length : 0;\n      });\n    }\n  }, [tools]);\n  var prev = react.useCallback(function () {\n    setDirection(\"left\");\n\n    if (tools.length === 1) {\n      setActiveIndex(function (actInd) {\n        return actInd === undefined ? 0 : undefined;\n      });\n    } else {\n      setActiveIndex(function (actInd) {\n        return actInd !== undefined ? (actInd - 1 + tools.length) % tools.length : 0;\n      });\n    }\n  }, [tools]);\n  var hide = react.useCallback(function () {\n    setActiveIndex(undefined);\n  }, []);\n  var show = react.useCallback(function () {\n    setActiveIndex(function (oldInd) {\n      return oldInd === undefined ? lastActiveIndex.current : oldInd;\n    });\n  }, []);\n  return {\n    tools: tools,\n    activeTool: activeIndex !== undefined ? tools[activeIndex] : undefined,\n    grant: grant,\n    revoke: revoke,\n    hide: hide,\n    next: next,\n    prev: prev,\n    show: show,\n    activeIndex: activeIndex,\n    setActiveIndex: setActiveIndex,\n    hudScene: hudScene,\n    direction: direction\n  };\n};\n\nfunction ToolSwitcher() {\n  var toolbelt = useToolbelt();\n\n  var _useThree = fiber.useThree(),\n      size = _useThree.size,\n      gl = _useThree.gl;\n\n  var registered = react.useRef(false);\n  var DETECT_RANGE_X = screen.width * 0.05;\n  var DRAG_RANGE_X = screen.width * 0.08;\n  var DETECT_RANGE_Y = screen.height * 0.5;\n  var valid = react.useRef(false);\n  useDrag({\n    onStart: function onStart(_ref) {\n      var e = _ref.e,\n          touch = _ref.touch;\n      valid.current = false;\n      var inSideEdge = Math.min(touch.clientX, size.width - touch.clientX) < DETECT_RANGE_X;\n      var inTopThird = touch.clientY < DETECT_RANGE_Y; // ignore if not in top third or side edge\n\n      if (!inSideEdge || !inTopThird) return;\n      valid.current = true;\n      registered.current = false;\n      e.preventDefault();\n      e.stopPropagation();\n      e.stopImmediatePropagation();\n    },\n    onMove: function onMove(_ref2) {\n      var delta = _ref2.delta;\n      if (!valid.current || registered.current) return;\n\n      if (Math.abs(delta.x) > DRAG_RANGE_X) {\n        registered.current = true;\n\n        if (delta.x > 0) {\n          toolbelt.next();\n        } else {\n          toolbelt.prev();\n        }\n      }\n    }\n  }, gl.domElement, [screen.width, screen.height, toolbelt.next, toolbelt.prev]);\n  return null;\n}\n\nfunction Lights() {\n  return /*#__PURE__*/React.createElement(\"group\", {\n    name: \"lights\"\n  }, /*#__PURE__*/React.createElement(\"ambientLight\", {\n    intensity: Math.PI * 0.5\n  }), /*#__PURE__*/React.createElement(\"pointLight\", {\n    intensity: Math.PI * 0.5\n  }));\n}\n\nfunction _createForOfIteratorHelperLoose$8(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray$8(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray$8(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray$8(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$8(o, minLen); }\n\nfunction _arrayLikeToArray$8(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\nfunction WorldLights(props) {\n  var _props$enabled = props.enabled,\n      enabled = _props$enabled === void 0 ? true : _props$enabled,\n      directional = props.directional;\n\n  var _useThree = fiber.useThree(),\n      scene = _useThree.scene;\n\n  var group = react.useRef(null);\n  var toolbelt = useToolbelt();\n  var rerender = useRerender();\n  var trackedLights = react.useRef([]);\n  var renderedLights = react.useRef([]);\n  useLimitedFrame(1 / 2, function () {\n    var sceneLights = [];\n    scene.traverse(function (obj) {\n      if (obj instanceof three.Light && (!directional || obj instanceof three.AmbientLight)) {\n        sceneLights.push(obj);\n      }\n    });\n    var changed = false;\n\n    var _loop = function _loop() {\n      var light = _sceneLights[_i];\n\n      // if light is not rendered, register it\n      if (!renderedLights.current.find(function (obj) {\n        return obj.userData.uuid === light.uuid;\n      })) {\n        var newLight = light.clone();\n        newLight.userData.uuid = light.uuid;\n        renderedLights.current.push(newLight);\n        changed = true;\n      }\n    };\n\n    for (var _i = 0, _sceneLights = sceneLights; _i < _sceneLights.length; _i++) {\n      _loop();\n    } // if light is rendered but not in scene, unregister it\n\n\n    var _loop2 = function _loop2() {\n      var light = _step.value;\n\n      if (!sceneLights.find(function (obj) {\n        return obj.uuid === light.userData.uuid;\n      })) {\n        renderedLights.current.splice(renderedLights.current.indexOf(light), 1);\n        light.dispose();\n        changed = true;\n      }\n    };\n\n    for (var _iterator = _createForOfIteratorHelperLoose$8(renderedLights.current), _step; !(_step = _iterator()).done;) {\n      _loop2();\n    }\n\n    if (changed) {\n      rerender();\n      trackedLights.current = sceneLights;\n    }\n  });\n  useLimitedFrame(30, function (_ref) {\n    var camera = _ref.camera;\n    if (!enabled || !group.current) return;\n    group.current.position.copy(camera.position);\n    renderedLights.current.forEach(function (light) {\n      var trackedLight = trackedLights.current.find(function (li) {\n        return li.uuid === light.userData.uuid;\n      });\n      if (!trackedLight) return;\n      light.matrixWorld.copy(trackedLight.matrixWorld);\n    });\n  });\n  return /*#__PURE__*/React.createElement(React.Fragment, null, fiber.createPortal( /*#__PURE__*/React.createElement(\"group\", {\n    name: \"world-lights\",\n    ref: group\n  }, renderedLights.current.map(function (light) {\n    return /*#__PURE__*/React.createElement(\"primitive\", {\n      object: light,\n      key: light.uuid\n    });\n  })), toolbelt.hudScene));\n}\n\nfunction Toolbelt(props) {\n  var children = props.children,\n      _props$showOnSpawn = props.showOnSpawn,\n      showOnSpawn = _props$showOnSpawn === void 0 ? true : _props$showOnSpawn,\n      _props$worldLights = props.worldLights,\n      worldLights = _props$worldLights === void 0 ? true : _props$worldLights,\n      _props$localLights = props.localLights,\n      localLights = _props$localLights === void 0 ? true : _props$localLights;\n\n  var _useThree = fiber.useThree(),\n      camera = _useThree.camera;\n\n  var value = useToolbeltState(showOnSpawn);\n  var hudScene = value.hudScene; // hud render loop, use copied camera to render at 0,0,0\n\n  var _useState = react.useState(function () {\n    return camera.clone();\n  }),\n      camClone = _useState[0];\n\n  fiber.useFrame(function (_ref) {\n    var gl = _ref.gl;\n    var _cam = camera;\n    camClone.position.set(0, 0, 0);\n    camClone.quaternion.copy(_cam.quaternion);\n    camClone.near = _cam.near;\n    camClone.far = _cam.far;\n    camClone.aspect = _cam.aspect;\n    camClone.fov = _cam.fov;\n    camClone.updateProjectionMatrix(); // for all intents and purposes, the hud items are placed in real world coordinates\n    // this is very important for raycasting\n\n    hudScene.position.set(0, 0, 0);\n    gl.autoClear = false;\n    gl.clearDepth();\n    gl.render(hudScene, camClone);\n    hudScene.position.copy(camera.position);\n    hudScene.updateMatrixWorld(true);\n  }, 100);\n  return /*#__PURE__*/React.createElement(ToolbeltContext.Provider, {\n    value: value\n  }, /*#__PURE__*/React.createElement(ToolSwitcher, null), localLights && fiber.createPortal( /*#__PURE__*/React.createElement(Lights, null), hudScene), worldLights && /*#__PURE__*/React.createElement(WorldLights, null), children);\n}\n\nvar dummy$1 = new three.Quaternion(); // taken from https://gist.github.com/sketchpunk/3568150a04b973430dfe8fd29bf470c8\n\nvar QuaterionSpring = /*#__PURE__*/function () {\n  function QuaterionSpring(damping, stiffness) {\n    if (damping === void 0) {\n      damping = 5;\n    }\n\n    if (stiffness === void 0) {\n      stiffness = 30;\n    }\n\n    this.velocity = new Float32Array(4);\n    this.stiffness = stiffness;\n    this.damping = damping;\n  }\n\n  var _proto = QuaterionSpring.prototype;\n\n  _proto._velLenSqr = function _velLenSqr() {\n    return Math.pow(this.velocity[0], 2) + Math.pow(this.velocity[1], 2) + Math.pow(this.velocity[2], 2) + Math.pow(this.velocity[3], 2);\n  } // Harmonic oscillation\n  // https://stackoverflow.com/questions/44688112/spring-physics-applied-to-quaternions-using-python\n  ;\n\n  _proto.oscillationStep = function oscillationStep(cq, target, dt) {\n    // Check when the spring is done.\n    var dot = cq.dot(target);\n\n    if (dot >= 0.9999 && this._velLenSqr() < 0.000001) {\n      cq.copy(target);\n      return;\n    }\n\n    var tq = dummy$1;\n\n    if (dot < 0) {\n      // Use the closest rotation\n      tq.x = -target.x;\n      tq.y = -target.y;\n      tq.z = -target.z;\n      tq.w = -target.w;\n    } else {\n      tq.copy(target);\n    }\n\n    this.velocity[0] += (-this.stiffness * (cq.x - tq.x) - this.damping * this.velocity[0]) * dt;\n    this.velocity[1] += (-this.stiffness * (cq.y - tq.y) - this.damping * this.velocity[1]) * dt;\n    this.velocity[2] += (-this.stiffness * (cq.z - tq.z) - this.damping * this.velocity[2]) * dt;\n    this.velocity[3] += (-this.stiffness * (cq.w - tq.w) - this.damping * this.velocity[3]) * dt;\n    cq.x += this.velocity[0] * dt;\n    cq.y += this.velocity[1] * dt;\n    cq.z += this.velocity[2] * dt;\n    cq.w += this.velocity[3] * dt;\n    cq.normalize();\n  } // Critically Damped Spring\n  ;\n\n  _proto.criticallyStep = function criticallyStep(cq, target, dt) {\n    // Check when the spring is done.\n    var dot = cq.dot(target);\n\n    if (dot >= 0.9999 && this._velLenSqr() < 0.000001) {\n      cq.copy(target);\n      return;\n    }\n\n    var tq = dummy$1;\n\n    if (dot < 0) {\n      // Use the closest rotation\n      tq.x = -target.x;\n      tq.y = -target.y;\n      tq.z = -target.z;\n      tq.w = -target.w;\n    } else {\n      tq.copy(target);\n    }\n\n    var dSqrDt = this.damping * this.damping * dt,\n        n2 = 1 + this.damping * dt,\n        n2Sqr = n2 * n2;\n    this.velocity[0] = (this.velocity[0] - (cq.x - tq.x) * dSqrDt) / n2Sqr;\n    this.velocity[1] = (this.velocity[1] - (cq.y - tq.y) * dSqrDt) / n2Sqr;\n    this.velocity[2] = (this.velocity[2] - (cq.z - tq.z) * dSqrDt) / n2Sqr;\n    this.velocity[3] = (this.velocity[3] - (cq.w - tq.w) * dSqrDt) / n2Sqr;\n    cq.x += this.velocity[0] * dt;\n    cq.y += this.velocity[1] * dt;\n    cq.z += this.velocity[2] * dt;\n    cq.w += this.velocity[3] * dt;\n    cq.normalize();\n    return cq;\n  };\n\n  return QuaterionSpring;\n}();\n\n/**\n * Place the children in front of the camera with some sway\n * 1. I tried springing the quaternion, but it's not continuous and causes a jump\n * 2. I found a continuous quaternion spring, but it was not tight enough https://gist.github.com/sketchpunk/3568150a04b973430dfe8fd29bf470c8\n * 3. solution was to move tool in screen spacing by springing pos value offsets based on rotation velocity\n *    springed quat rotation still used for range\n *\n * @param props\n * @constructor\n */\nfunction HUD(props) {\n  var children = props.children,\n      pos = props.pos,\n      _props$pinY = props.pinY,\n      pinY = _props$pinY === void 0 ? false : _props$pinY,\n      distance = props.distance,\n      _props$range = props.range,\n      range = _props$range === void 0 ? 0 : _props$range,\n      bobStrength = props.bobStrength;\n\n  var _usePlayer = usePlayer(),\n      velocity = _usePlayer.velocity;\n\n  var t = 0.0001;\n  var group = react.useRef(null);\n\n  var _useState = react.useState(new three.Vector2()),\n      targetPos = _useState[0];\n\n  var _useState2 = react.useState(new three.Vector2().fromArray(pos)),\n      lerpedPos = _useState2[0];\n\n  var _useState3 = react.useState(new three.Quaternion()),\n      lerpedQuat = _useState3[0];\n\n  var _useState4 = react.useState(new three.Quaternion()),\n      targetQuat = _useState4[0];\n\n  var _useState5 = react.useState(new three.Quaternion()),\n      lastQuat = _useState5[0];\n\n  var _useState6 = react.useState(new three.Euler(0, 0, 0, \"YXZ\")),\n      lastEuler = _useState6[0];\n\n  var _useState7 = react.useState(new three.Euler(0, 0, 0, \"YXZ\")),\n      thisEuler = _useState7[0];\n\n  var _useState8 = react.useState(new three.Quaternion()),\n      dummy1 = _useState8[0];\n\n  var _useState9 = react.useState(new three.Quaternion()),\n      dummy2 = _useState9[0];\n\n  var _useState10 = react.useState(new three.Vector2()),\n      hud = _useState10[0];\n\n  var _useSpring = three$1.useSpring(function () {\n    return {\n      offset: [0, 0],\n      config: three$1.config.stiff\n    };\n  }),\n      spring = _useSpring[0],\n      set = _useSpring[1];\n\n  var qs = react.useMemo(function () {\n    return new QuaterionSpring(50, 100);\n  }, []);\n  fiber.useFrame(function (_ref, delta) {\n    var camera = _ref.camera,\n        clock = _ref.clock;\n    if (!group.current) return;\n    var alpha = 1 - Math.pow(t, delta); // apply passes pos and offset pos\n\n    var off = spring.offset.get();\n    targetPos.fromArray(pos);\n    targetPos.x += off[0] || 0;\n    targetPos.y += off[1] || 0;\n    lerpedPos.lerp(targetPos, alpha); // calculate x position based on camera and screen width\n\n    getHudPos(lerpedPos, camera, distance, hud);\n    group.current.position.set(hud.x, hud.y, -distance); // calculate rotation velocities about the respective ROTATION axis (not screen space)\n\n    dummy1.copy(lastQuat);\n    dummy2.copy(camera.quaternion);\n    thisEuler.setFromQuaternion(camera.quaternion);\n    var y_axis_vel = dummy1.multiply(dummy2.invert()).y / (delta || 0.00001);\n    var x_axis_vel = (thisEuler.x - lastEuler.x) / (delta || 0.00001); // implement range\n\n    var RANGE_SET = range > 0;\n\n    if (!RANGE_SET) {\n      lerpedQuat.copy(camera.quaternion);\n    } else {\n      // find angle along y axis\n      dummy1.copy(lerpedQuat);\n      dummy1.x = 0;\n      dummy1.z = 0;\n      dummy1.normalize();\n      dummy2.copy(camera.quaternion);\n      dummy2.x = 0;\n      dummy2.z = 0;\n      dummy2.normalize();\n      var angle = dummy1.angleTo(dummy2); // if out of range, move it back\n\n      if (angle > range) {\n        var diff = angle - range;\n        targetQuat.copy(lerpedQuat);\n        targetQuat.rotateTowards(camera.quaternion, diff);\n\n        if (!pinY) {\n          targetQuat.x = 0;\n          targetQuat.z = 0;\n          targetQuat.normalize();\n        }\n      } else {\n        // disable offsets if moving camera within range\n        x_axis_vel = 0;\n        y_axis_vel = 0;\n      }\n\n      qs.criticallyStep(lerpedQuat, targetQuat, delta);\n    } // bob a bit based on player velocity\n\n\n    var vel_len = velocity.get().length() > 1 ? 1 : 0;\n    var strength = bobStrength || Math.max(lerpedPos.length(), 0.05);\n    x_axis_vel += Math.sin(clock.elapsedTime * 15) * vel_len * 0.2 * strength;\n    y_axis_vel += Math.cos(clock.elapsedTime * 20 + 12) * vel_len * 0.1 * strength; // set spring targets based on velocities\n\n    var scale_ang = 0.1;\n    var max_ang = 0.3;\n    var x_off = three.MathUtils.clamp(-y_axis_vel * scale_ang, -max_ang, max_ang);\n    var y_off = three.MathUtils.clamp(-x_axis_vel * scale_ang, -max_ang, max_ang);\n    set({\n      offset: [x_off, y_off]\n    }); // range dependent, move items to camera quat\n\n    group.current.position.applyQuaternion(lerpedQuat); // needed so that children positions are applied in screen space\n    // should probably be moved to draggable .. ? idk, maybe the supposition is that children of hud are in screen space\n\n    group.current.quaternion.copy(camera.quaternion); // update last values\n\n    lastQuat.copy(camera.quaternion);\n    lastEuler.setFromQuaternion(camera.quaternion);\n  });\n  return /*#__PURE__*/React.createElement(\"group\", {\n    name: \"spacesvr-hud\",\n    ref: group\n  }, children);\n}\n\nfunction Draggable(props) {\n  var set = props.set,\n      distance = props.distance,\n      enabled = props.enabled,\n      children = props.children;\n  var toolbelt = useToolbelt();\n\n  var _useThree = fiber.useThree(),\n      size = _useThree.size,\n      gl = _useThree.gl;\n\n  var _useEnvironment = useEnvironment(),\n      device = _useEnvironment.device;\n\n  var _usePlayer = usePlayer(),\n      raycaster = _usePlayer.raycaster;\n\n  var group = react.useRef(null);\n  var DOWN_SWIPE_DIST = size.height * 0.28;\n  var SIDE_SWIPE_DIST = size.width * 0.3;\n  var valid = react.useRef(false);\n  useDrag({\n    onStart: function onStart(_ref) {\n      var e = _ref.e;\n      valid.current = false;\n      if (!group.current || !device.mobile || !enabled) return;\n      var intersections = raycaster.intersectObject(group.current, true);\n\n      if (intersections.length > 0) {\n        valid.current = true;\n        e.stopPropagation();\n      }\n    },\n    onMove: function onMove(_ref2) {\n      var delta = _ref2.delta;\n      if (!valid.current) return;\n      set({\n        pos: [delta.x * 0.003 * distance * 0.7, -delta.y * 0.003 * distance * (delta.y < 0 ? 0.15 : 0.5), 0]\n      });\n    },\n    onEnd: function onEnd(_ref3) {\n      var delta = _ref3.delta;\n      if (!valid.current) return;\n\n      if (delta.y > DOWN_SWIPE_DIST) {\n        toolbelt.hide();\n      } else if (Math.abs(delta.x) > SIDE_SWIPE_DIST) {\n        if (delta.x > 0) {\n          toolbelt.next();\n        } else {\n          toolbelt.prev();\n        }\n      }\n\n      set({\n        pos: [0, 0, 0]\n      });\n      valid.current = false;\n    }\n  }, gl.domElement, [device.mobile, enabled, toolbelt.hide, toolbelt.next, toolbelt.prev]);\n  return /*#__PURE__*/React.createElement(\"group\", {\n    ref: group\n  }, children);\n}\n\n/**\n * The logic to show a tool on screen and move it depending on the active tool\n */\nfunction OnScreen(props) {\n  var distance = props.distance,\n      name = props.name,\n      pos = props.pos,\n      disableDraggable = props.disableDraggable,\n      children = props.children;\n  var toolbelt = useToolbelt();\n  var camera = fiber.useThree(function (state) {\n    return state.camera;\n  });\n  var TOOL = toolbelt.tools.find(function (t) {\n    return t.name == name;\n  });\n  var TOOL_INDEX = TOOL ? toolbelt.tools.indexOf(TOOL) : undefined;\n  var ENABLED = toolbelt.activeIndex === TOOL_INDEX;\n\n  var _useSpring = three$1.useSpring(function () {\n    return {\n      pos: [0, 0, 0],\n      config: {\n        mass: 4,\n        friction: 90,\n        tension: 800\n      }\n    };\n  }),\n      spring = _useSpring[0],\n      set = _useSpring[1]; // animate position on tool switches\n\n\n  var lastActiveIndex = react.useRef();\n  react.useEffect(function () {\n    if (lastActiveIndex.current === toolbelt.activeIndex) return;\n    lastActiveIndex.current = toolbelt.activeIndex;\n    if (TOOL_INDEX === undefined) return;\n    var _cam = camera;\n    var AMT = 1.5;\n\n    if (ENABLED) {\n      // show it\n      if (toolbelt.direction !== \"up\") {\n        // unless the tool was hidden as will fly in bottom to top,\n        var _getHudPos = getHudPos([-AMT, 0], _cam, distance),\n            leftX = _getHudPos.x;\n\n        var _getHudPos2 = getHudPos([AMT, 0], _cam, distance),\n            rightX = _getHudPos2.x;\n\n        var _getHudPos3 = getHudPos(pos, _cam, distance),\n            x = _getHudPos3.x;\n\n        var swipeInX = toolbelt.direction === \"left\" ? rightX - x : leftX + x;\n        spring.pos.update({\n          immediate: true\n        });\n        set({\n          pos: [swipeInX, 0, distance]\n        });\n        spring.pos.finish();\n        spring.pos.update({\n          immediate: false\n        });\n      }\n\n      set({\n        pos: [0, 0, 0]\n      });\n    } else {\n      // swipe it away\n      var _getHudPos4 = getHudPos([-AMT, 0], _cam, distance * 2),\n          _leftX = _getHudPos4.x;\n\n      var _getHudPos5 = getHudPos([AMT, 0], _cam, distance * 2),\n          _rightX = _getHudPos5.x;\n\n      var _getHudPos6 = getHudPos(pos, _cam, distance),\n          _x = _getHudPos6.x;\n\n      var swipeOutX = (toolbelt.direction === \"left\" ? _leftX : _rightX) - _x;\n      set({\n        pos: [swipeOutX, 0, 0]\n      });\n    }\n  }, [ENABLED, TOOL_INDEX, camera, distance, pos, set, spring.pos, toolbelt.activeIndex, toolbelt.activeTool, toolbelt.direction]);\n  return /*#__PURE__*/React.createElement(three$1.animated.group, {\n    position: spring.pos,\n    name: \"onscreen\"\n  }, /*#__PURE__*/React.createElement(Draggable, {\n    set: set,\n    distance: distance,\n    enabled: ENABLED && !disableDraggable\n  }, children));\n}\n\nfunction FacePlayer(props) {\n  var children = props.children,\n      _props$enabled = props.enabled,\n      enabled = _props$enabled === void 0 ? true : _props$enabled,\n      _props$lockX = props.lockX,\n      lockX = _props$lockX === void 0 ? false : _props$lockX,\n      _props$lockY = props.lockY,\n      lockY = _props$lockY === void 0 ? false : _props$lockY,\n      _props$lockZ = props.lockZ,\n      lockZ = _props$lockZ === void 0 ? false : _props$lockZ;\n  var group = react.useRef(null);\n\n  var _useState = react.useState(new three.Euler()),\n      prev = _useState[0];\n\n  useLimitedFrame(50, function (_ref) {\n    var camera = _ref.camera;\n    if (!group.current) return;\n\n    if (!enabled) {\n      group.current.rotation.set(0, 0, 0);\n    } else {\n      prev.copy(group.current.rotation);\n      group.current.lookAt(camera.position);\n      if (lockX) group.current.rotation.x = prev.x;\n      if (lockY) group.current.rotation.y = prev.y;\n      if (lockZ) group.current.rotation.z = prev.z;\n    }\n  });\n  return /*#__PURE__*/React.createElement(\"group\", {\n    name: \"spacesvr-faceplayer\",\n    ref: group\n  }, children);\n}\n\n// if the children suspense, this will call set done once suspense is resolved\nfunction LifecycleDetector(props) {\n  var didMount = props.didMount,\n      setMounted = props.setMounted;\n  didMount.current = true;\n  react.useEffect(function () {\n    return function () {\n      setMounted(true);\n    };\n  }, []);\n  return null;\n}\n\n// adapted from https://github.com/pmndrs/drei/blob/master/src/core/Preload.tsx\nfunction ToolPreload(props) {\n  var setPreloadDone = props.setPreloadDone,\n      children = props.children;\n  var gl = fiber.useThree(function (_ref) {\n    var gl = _ref.gl;\n    return gl;\n  });\n  var camera = fiber.useThree(function (_ref2) {\n    var camera = _ref2.camera;\n    return camera;\n  });\n\n  var _useToolbelt = useToolbelt(),\n      hudScene = _useToolbelt.hudScene;\n\n  var didMount = react.useRef(false);\n\n  var _useState = react.useState(true),\n      firstRender = _useState[0],\n      setFirstRender = _useState[1];\n\n  var _useState2 = react.useState(false),\n      mounted = _useState2[0],\n      setMounted = _useState2[1]; // if the children don't suspense, the second render will detect that and mark it as finished\n\n\n  react.useEffect(function () {\n    if (firstRender) {\n      setFirstRender(false);\n      return;\n    }\n\n    if (!didMount.current) {\n      // mounted with no suspense trigger, so UnloadComponent will never be called\n      setMounted(true);\n    }\n  }, [firstRender]); // Layout effect because it must run before React commits\n\n  react.useLayoutEffect(function () {\n    if (!mounted) return; // compile the scene, then hit it with a cube camera\n\n    gl.compile(hudScene, camera);\n    var cubeRenderTarget = new three.WebGLCubeRenderTarget(128);\n    var cubeCamera = new three.CubeCamera(0.01, 100000, cubeRenderTarget);\n    cubeCamera.update(gl, hudScene);\n    cubeRenderTarget.dispose();\n    setPreloadDone(true);\n  }, [camera, gl, hudScene, mounted, setPreloadDone]);\n  return fiber.createPortal( /*#__PURE__*/React.createElement(\"group\", {\n    name: \"tool-preload\"\n  }, /*#__PURE__*/React.createElement(react.Suspense, {\n    fallback: /*#__PURE__*/React.createElement(LifecycleDetector, {\n      didMount: didMount,\n      setMounted: setMounted\n    })\n  }, children)), hudScene);\n}\n\n/**\n * Tool modifier will place its children in constant view of the camera\n *\n * pos will determine relative placement on [x, y] axis\n * face will make item face the player (defaults to true)\n *\n * @param props\n * @constructor\n */\nfunction Tool(props) {\n  var _toolbelt$activeTool;\n\n  var children = props.children,\n      name = props.name,\n      _props$pos = props.pos,\n      pos = _props$pos === void 0 ? [0, 0] : _props$pos,\n      _props$face = props.face,\n      face = _props$face === void 0 ? true : _props$face,\n      _props$pinY = props.pinY,\n      pinY = _props$pinY === void 0 ? false : _props$pinY,\n      range = props.range,\n      bobStrength = props.bobStrength,\n      orderIndex = props.orderIndex,\n      _props$disableDraggab = props.disableDraggable,\n      disableDraggable = _props$disableDraggab === void 0 ? false : _props$disableDraggab,\n      onSwitch = props.onSwitch;\n  var toolbelt = useToolbelt();\n  var ENABLED = ((_toolbelt$activeTool = toolbelt.activeTool) == null ? void 0 : _toolbelt$activeTool.name) === name;\n  var DISTANCE = 1;\n\n  var _useState = react.useState(false),\n      preloadDone = _useState[0],\n      setPreloadDone = _useState[1];\n\n  var _useSpring = three$1.useSpring({\n    prog: ENABLED ? 1 : 0,\n    config: {\n      mass: 4,\n      friction: 90,\n      tension: 800\n    }\n  }),\n      prog = _useSpring.prog;\n\n  var visible = useVisible(prog);\n  react.useEffect(function () {\n    toolbelt.grant(name, orderIndex);\n    return function () {\n      return toolbelt.revoke(name);\n    };\n  }, [name, toolbelt.grant, toolbelt.revoke, orderIndex]);\n  react.useEffect(function () {\n    var _toolbelt$activeTool2;\n\n    if (onSwitch) onSwitch(((_toolbelt$activeTool2 = toolbelt.activeTool) == null ? void 0 : _toolbelt$activeTool2.name) === name);\n  }, [toolbelt.activeTool, onSwitch, name]);\n\n  if (!preloadDone) {\n    return /*#__PURE__*/React.createElement(ToolPreload, {\n      setPreloadDone: setPreloadDone\n    }, children);\n  }\n\n  if (!visible) return null;\n  return /*#__PURE__*/React.createElement(React.Fragment, null, fiber.createPortal( /*#__PURE__*/React.createElement(\"group\", {\n    name: \"tool-\" + name\n  }, /*#__PURE__*/React.createElement(HUD, {\n    pos: pos,\n    pinY: pinY,\n    distance: DISTANCE,\n    range: range,\n    bobStrength: bobStrength\n  }, /*#__PURE__*/React.createElement(OnScreen, {\n    distance: DISTANCE,\n    name: name,\n    pos: pos,\n    disableDraggable: disableDraggable\n  }, /*#__PURE__*/React.createElement(FacePlayer, {\n    enabled: face\n  }, /*#__PURE__*/React.createElement(react.Suspense, {\n    fallback: null\n  }, visible && children))))), toolbelt.hudScene));\n}\n\nvar _excluded$j = [\"href\", \"target\", \"children\"];\nfunction Anchor(props) {\n  var href = props.href,\n      _props$target = props.target,\n      target = _props$target === void 0 ? \"_self\" : _props$target,\n      children = props.children,\n      rest = _objectWithoutPropertiesLoose__default[\"default\"](props, _excluded$j);\n\n  var gl = fiber.useThree(function (st) {\n    return st.gl;\n  });\n\n  var onClick = function onClick() {\n    if (gl.xr.isPresenting) {\n      var _gl$xr$getSession;\n\n      (_gl$xr$getSession = gl.xr.getSession()) == null ? void 0 : _gl$xr$getSession.end();\n    }\n\n    window.open(href, target);\n  };\n\n  return /*#__PURE__*/React.createElement(\"group\", _extends__default[\"default\"]({\n    name: \"spacesvr-anchor-\" + href\n  }, rest), /*#__PURE__*/React.createElement(Interactable, {\n    onClick: onClick\n  }, children));\n}\n\nfunction Floating(props) {\n  var children = props.children,\n      _props$height = props.height,\n      height = _props$height === void 0 ? 0.2 : _props$height,\n      _props$speed = props.speed,\n      speed = _props$speed === void 0 ? 1 : _props$speed;\n  var group = react.useRef(null);\n  var seed = react.useRef(Math.random());\n  useLimitedFrame(75, function (_ref) {\n    var clock = _ref.clock;\n    if (!group.current) return;\n    group.current.position.y = height * Math.sin(clock.elapsedTime * speed * 0.4 + seed.current * 10000);\n  });\n  return /*#__PURE__*/React.createElement(\"group\", {\n    name: \"spacesvr-floating\",\n    ref: group\n  }, children);\n}\n\nfunction Spinning(props) {\n  var children = props.children,\n      _props$xSpeed = props.xSpeed,\n      xSpeed = _props$xSpeed === void 0 ? 0 : _props$xSpeed,\n      _props$ySpeed = props.ySpeed,\n      ySpeed = _props$ySpeed === void 0 ? 1 : _props$ySpeed,\n      _props$zSpeed = props.zSpeed,\n      zSpeed = _props$zSpeed === void 0 ? 0 : _props$zSpeed;\n  var group = react.useRef(null);\n\n  var _useState = react.useState(Math.random()),\n      seed = _useState[0];\n\n  useLimitedFrame(75, function (_ref) {\n    var clock = _ref.clock;\n    if (!group.current) return;\n    group.current.rotation.x = clock.elapsedTime * xSpeed * 0.25 + xSpeed * seed * 100;\n    group.current.rotation.y = clock.elapsedTime * ySpeed * (0.25 + seed / 10) + ySpeed * seed * 1000;\n    group.current.rotation.z = clock.elapsedTime * zSpeed * 0.25 + zSpeed * seed * 40;\n  });\n  return /*#__PURE__*/React.createElement(\"group\", {\n    name: \"spacesvr-spinning\",\n    ref: group\n  }, children);\n}\n\n/**\n *  Lots of code copied from https://github.com/pmndrs/drei/blob/master/src/core/Effects.tsx\n */\nfunction Effects(props) {\n  var children = props.children;\n  react.useMemo(function () {\n    return fiber.extend({\n      EffectComposer: threeStdlib.EffectComposer,\n      RenderPass: threeStdlib.RenderPass,\n      ShaderPass: threeStdlib.ShaderPass\n    });\n  }, []);\n  var composer = react.useRef(null);\n\n  var _useThree = fiber.useThree(),\n      scene = _useThree.scene,\n      camera = _useThree.camera,\n      gl = _useThree.gl,\n      size = _useThree.size,\n      viewport = _useThree.viewport;\n\n  var _useState = react.useState(function () {\n    var t = new three.WebGLRenderTarget(size.width, size.height, {\n      type: three.UnsignedByteType,\n      format: three.RGBAFormat,\n      encoding: gl.outputEncoding,\n      depthBuffer: true,\n      stencilBuffer: true,\n      anisotropy: 2\n    });\n    t.samples = 4;\n    return t;\n  }),\n      target = _useState[0];\n\n  react.useEffect(function () {\n    var _composer$current, _composer$current2;\n\n    (_composer$current = composer.current) == null ? void 0 : _composer$current.setSize(size.width, size.height);\n    (_composer$current2 = composer.current) == null ? void 0 : _composer$current2.setPixelRatio(viewport.dpr);\n  }, [gl, size, viewport.dpr]);\n  fiber.useFrame(function () {\n    var _composer$current3;\n\n    if (!composer.current) return; // remove undefined passes\n\n    composer.current.passes = composer.current.passes.filter(function (pass) {\n      return pass !== undefined;\n    });\n    (_composer$current3 = composer.current) == null ? void 0 : _composer$current3.render();\n  }, 1); // build passes array\n\n  var passes = [];\n  passes.push( /*#__PURE__*/React.createElement(\"renderPass\", {\n    key: \"renderpass\",\n    attach: \"passes-\" + passes.length,\n    args: [scene, camera]\n  }));\n  react.Children.forEach(children, function (el) {\n    el && passes.push( /*#__PURE__*/react.cloneElement(el, {\n      key: passes.length,\n      attach: \"passes-\" + passes.length\n    }));\n  });\n  return /*#__PURE__*/React.createElement(\"effectComposer\", {\n    ref: composer,\n    args: [gl, target]\n  }, passes);\n}\n\nvar VisualContext = /*#__PURE__*/react.createContext({});\nvar useVisual = function useVisual() {\n  return react.useContext(VisualContext);\n};\nfunction Visual(props) {\n  var children = props.children;\n\n  var _useThree = fiber.useThree(),\n      scene = _useThree.scene,\n      camera = _useThree.camera,\n      gl = _useThree.gl;\n\n  var _useEnvironment = useEnvironment(),\n      device = _useEnvironment.device;\n\n  var childPasses = react.useRef([]);\n  var rerender = useRerender();\n  var registerPass = react.useCallback(function (p) {\n    childPasses.current.push(p);\n    childPasses.current.sort(function (a, b) {\n      return a.index - b.index;\n    });\n    rerender();\n  }, []);\n  var unregisterPass = react.useCallback(function (uuid) {\n    childPasses.current = childPasses.current.filter(function (p) {\n      return p.uuid !== uuid;\n    });\n    rerender();\n  }, []);\n  var USE_EFFECTS = childPasses.current.length > 0 && !device.xr;\n  fiber.useFrame(function () {\n    if (USE_EFFECTS) return;\n    gl.autoClear = true;\n    gl.render(scene, camera);\n  }, 1);\n  return /*#__PURE__*/React.createElement(VisualContext.Provider, {\n    value: {\n      registerPass: registerPass,\n      unregisterPass: unregisterPass\n    }\n  }, USE_EFFECTS && /*#__PURE__*/React.createElement(Effects, null, childPasses.current.map(function (p) {\n    return p.node;\n  })), children);\n}\n\nfunction VisualEffect(props) {\n  var index = props.index,\n      children = props.children;\n\n  var _useState = react.useState(function () {\n    return Math.random().toString(36).substring(2);\n  }),\n      uuid = _useState[0];\n\n  var _useVisual = useVisual(),\n      registerPass = _useVisual.registerPass,\n      unregisterPass = _useVisual.unregisterPass;\n\n  react.useEffect(function () {\n    if (!children) return;\n\n    if (!Array.isArray(children)) {\n      registerPass({\n        uuid: uuid,\n        node: children,\n        index: index\n      });\n    } else {\n      children.forEach(function (child, i) {\n        registerPass({\n          uuid: uuid,\n          node: child,\n          index: i\n        });\n      });\n    }\n\n    return function () {\n      return unregisterPass(uuid);\n    };\n  }, [children, index, registerPass, unregisterPass, uuid]);\n  return null;\n}\n\nvar _excluded$i = [\"args\", \"visible\", \"color\", \"onClick\", \"onHover\", \"onUnHover\", \"raycaster\"];\nvar HitBox = /*#__PURE__*/react.forwardRef(function (props, ref) {\n  var args = props.args,\n      _props$visible = props.visible,\n      visible = _props$visible === void 0 ? false : _props$visible,\n      _props$color = props.color,\n      color = _props$color === void 0 ? \"red\" : _props$color,\n      onClick = props.onClick,\n      onHover = props.onHover,\n      onUnHover = props.onUnHover,\n      raycaster = props.raycaster,\n      rest = _objectWithoutPropertiesLoose__default[\"default\"](props, _excluded$i);\n\n  return /*#__PURE__*/React.createElement(Interactable, {\n    onClick: onClick,\n    onHover: onHover,\n    onUnHover: onUnHover,\n    raycaster: raycaster\n  }, /*#__PURE__*/React.createElement(\"mesh\", _extends__default[\"default\"]({\n    visible: visible,\n    name: \"spacesvr-hitbox\",\n    ref: ref\n  }, rest), /*#__PURE__*/React.createElement(\"boxBufferGeometry\", {\n    args: args\n  }), visible && /*#__PURE__*/React.createElement(\"meshBasicMaterial\", {\n    color: color,\n    transparent: true,\n    opacity: 0.7\n  })));\n});\n\nvar _excluded$h = [\"args\", \"material\", \"children\"];\n\nfunction _createForOfIteratorHelperLoose$7(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray$7(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray$7(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray$7(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$7(o, minLen); }\n\nfunction _arrayLikeToArray$7(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\nvar local_cache = [];\nfunction RoundedBox(props) {\n  var _props$args = props.args;\n  _props$args = _props$args === void 0 ? [] : _props$args;\n\n  var _props$args$ = _props$args[0],\n      width = _props$args$ === void 0 ? 1 : _props$args$,\n      _props$args$2 = _props$args[1],\n      height = _props$args$2 === void 0 ? 1 : _props$args$2,\n      _props$args$3 = _props$args[2],\n      depth = _props$args$3 === void 0 ? 0.25 : _props$args$3,\n      material = props.material,\n      children = props.children,\n      rest = _objectWithoutPropertiesLoose__default[\"default\"](props, _excluded$h);\n\n  var _useState = react.useState(new three.Vector3(1, 1, 1)),\n      locScale = _useState[0],\n      setLocScale = _useState[1];\n\n  var geo = react.useMemo(function () {\n    var _closestBox$key, _closestBox, _closestBox$width, _closestBox2, _closestBox$height, _closestBox3, _closestBox$depth, _closestBox4;\n\n    var tolerance = 0.25; // 25% tolerance\n\n    var closestBox = undefined;\n    var closestOffset = Infinity;\n\n    for (var _iterator = _createForOfIteratorHelperLoose$7(local_cache), _step; !(_step = _iterator()).done;) {\n      var box = _step.value;\n      var scale = box.width / width;\n      var heightDiff = Math.abs(box.height - height * scale);\n      var depthDiff = Math.abs(box.depth - depth * scale);\n\n      if (heightDiff / box.height < tolerance && depthDiff / box.depth < tolerance && heightDiff + depthDiff < closestOffset) {\n        closestBox = box;\n        closestOffset = heightDiff + depthDiff;\n      }\n    }\n\n    var key = (_closestBox$key = (_closestBox = closestBox) == null ? void 0 : _closestBox.key) != null ? _closestBox$key : \"geo_rounded_box_\" + width + \"x\" + height + \"x\" + depth;\n    var w = (_closestBox$width = (_closestBox2 = closestBox) == null ? void 0 : _closestBox2.width) != null ? _closestBox$width : width;\n    var h = (_closestBox$height = (_closestBox3 = closestBox) == null ? void 0 : _closestBox3.height) != null ? _closestBox$height : height;\n    var d = (_closestBox$depth = (_closestBox4 = closestBox) == null ? void 0 : _closestBox4.depth) != null ? _closestBox$depth : depth;\n    var r = Math.min(w, h, d) / 2;\n\n    var get_geo = function get_geo() {\n      return cache.getResource(key, function () {\n        return new RoundedBoxGeometry.RoundedBoxGeometry(width, height, depth, 4, r);\n      });\n    }; // make sure to cache result if it's not already cached\n\n\n    if (!closestBox) local_cache.push({\n      key: key,\n      width: width,\n      height: height,\n      depth: depth\n    });\n    setLocScale(new three.Vector3(width / w, height / h, depth / d));\n    return get_geo();\n  }, [width, height, depth]);\n  return /*#__PURE__*/React.createElement(\"group\", _extends__default[\"default\"]({\n    name: \"spacesvr-rounded-box\"\n  }, rest), /*#__PURE__*/React.createElement(\"mesh\", {\n    scale: locScale,\n    material: material,\n    geometry: geo\n  }, children));\n}\n\nvar useIdeaMaterial = function useIdeaMaterial(idea, radius) {\n  var hex = react.useMemo(function () {\n    return (idea == null ? void 0 : idea.getHex()) || \"#808080\";\n  }, [idea]);\n  var seed = react.useMemo(function () {\n    return Math.random();\n  }, []);\n  var color = react.useMemo(function () {\n    return new three.Color(hex);\n  }, [hex]);\n\n  var _useSpring = three$1.useSpring({\n    col: hex\n  }),\n      col = _useSpring.col;\n\n  var NOISE_AMPLITUDE = radius * 0.32;\n  var NOISE_FREQ = 0.554 / radius;\n  var mat = react.useMemo(function () {\n    var material = new three.MeshStandardMaterial({\n      metalness: 0.18,\n      roughness: 0.49,\n      envMapIntensity: 0.66,\n      side: three.DoubleSide\n    });\n\n    material.onBeforeCompile = function (shader) {\n      shader.uniforms.radius = new three.Uniform(radius);\n      shader.uniforms.time = new three.Uniform(0);\n      shader.uniforms.color = new three.Uniform(color);\n      shader.uniforms.radiusVariationAmplitude = new three.Uniform(NOISE_AMPLITUDE);\n      shader.uniforms.radiusNoiseFrequency = new three.Uniform(NOISE_FREQ);\n      var uniforms = \"\\n        uniform float radius;\\n        uniform float time;\\n        uniform vec3 color;\\n        uniform float radiusVariationAmplitude;\\n        uniform float radiusNoiseFrequency;\\n      \";\n      shader.vertexShader = uniforms + vertHead + shader.vertexShader.replace(\"#include <begin_vertex>\", vert$1);\n      shader.fragmentShader = uniforms + shader.fragmentShader.replace(\"#include <dithering_fragment>\", frag$1);\n      material.userData.shader = shader;\n    };\n\n    return material;\n  }, [radius, color, NOISE_AMPLITUDE, NOISE_FREQ, frag$1, vert$1]);\n  useLimitedFrame(50, function (_ref) {\n    var _mat$userData;\n\n    var clock = _ref.clock;\n    if (!(mat != null && (_mat$userData = mat.userData) != null && _mat$userData.shader)) return;\n    mat.userData.shader.uniforms.time.value = clock.elapsedTime / 6 + seed * 100;\n    mat.userData.shader.uniforms.color.value.set(col.get());\n  });\n  return mat;\n};\nvar vertHead = \"\\n    // Description : Array and textureless GLSL 2D/3D/4D simplex\\n    //               noise functions.\\n    //      Author : Ian McEwan, Ashima Arts.\\n    //  Maintainer : ijm\\n    //     Lastmod : 20110822 (ijm)\\n    //     License : Copyright (C) 2011 Ashima Arts. All rights reserved.\\n    //               Distributed under the MIT License. See LICENSE file.\\n    //               https://github.com/ashima/webgl-noise\\n    //\\n    \\n    vec3 mod289(vec3 x) {\\n      return x - floor(x * (1.0 / 289.0)) * 289.0;\\n    }\\n    \\n    vec4 mod289(vec4 x) {\\n      return x - floor(x * (1.0 / 289.0)) * 289.0;\\n    }\\n    \\n    vec4 permute(vec4 x) {\\n         return mod289(((x*34.0)+1.0)*x);\\n    }\\n    \\n    vec4 taylorInvSqrt(vec4 r)\\n    {\\n      return 1.79284291400159 - 0.85373472095314 * r;\\n    }\\n    \\n    float snoise(vec3 v)\\n      {\\n      const vec2  C = vec2(1.0/6.0, 1.0/3.0) ;\\n      const vec4  D = vec4(0.0, 0.5, 1.0, 2.0);\\n    \\n    // First corner\\n      vec3 i  = floor(v + dot(v, C.yyy) );\\n      vec3 x0 =   v - i + dot(i, C.xxx) ;\\n    \\n    // Other corners\\n      vec3 g = step(x0.yzx, x0.xyz);\\n      vec3 l = 1.0 - g;\\n      vec3 i1 = min( g.xyz, l.zxy );\\n      vec3 i2 = max( g.xyz, l.zxy );\\n    \\n      //   x0 = x0 - 0.0 + 0.0 * C.xxx;\\n      //   x1 = x0 - i1  + 1.0 * C.xxx;\\n      //   x2 = x0 - i2  + 2.0 * C.xxx;\\n      //   x3 = x0 - 1.0 + 3.0 * C.xxx;\\n      vec3 x1 = x0 - i1 + C.xxx;\\n      vec3 x2 = x0 - i2 + C.yyy; // 2.0*C.x = 1/3 = C.y\\n      vec3 x3 = x0 - D.yyy;      // -1.0+3.0*C.x = -0.5 = -D.y\\n    \\n    // Permutations\\n      i = mod289(i);\\n      vec4 p = permute( permute( permute(\\n                 i.z + vec4(0.0, i1.z, i2.z, 1.0 ))\\n               + i.y + vec4(0.0, i1.y, i2.y, 1.0 ))\\n               + i.x + vec4(0.0, i1.x, i2.x, 1.0 ));\\n    \\n    // Gradients: 7x7 points over a square, mapped onto an octahedron.\\n    // The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294)\\n      float n_ = 0.142857142857; // 1.0/7.0\\n      vec3  ns = n_ * D.wyz - D.xzx;\\n    \\n      vec4 j = p - 49.0 * floor(p * ns.z * ns.z);  //  mod(p,7*7)\\n    \\n      vec4 x_ = floor(j * ns.z);\\n      vec4 y_ = floor(j - 7.0 * x_ );    // mod(j,N)\\n    \\n      vec4 x = x_ *ns.x + ns.yyyy;\\n      vec4 y = y_ *ns.x + ns.yyyy;\\n      vec4 h = 1.0 - abs(x) - abs(y);\\n    \\n      vec4 b0 = vec4( x.xy, y.xy );\\n      vec4 b1 = vec4( x.zw, y.zw );\\n    \\n      //vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0;\\n      //vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0;\\n      vec4 s0 = floor(b0)*2.0 + 1.0;\\n      vec4 s1 = floor(b1)*2.0 + 1.0;\\n      vec4 sh = -step(h, vec4(0.0));\\n    \\n      vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ;\\n      vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ;\\n    \\n      vec3 p0 = vec3(a0.xy,h.x);\\n      vec3 p1 = vec3(a0.zw,h.y);\\n      vec3 p2 = vec3(a1.xy,h.z);\\n      vec3 p3 = vec3(a1.zw,h.w);\\n    \\n    //Normalise gradients\\n      vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));\\n      p0 *= norm.x;\\n      p1 *= norm.y;\\n      p2 *= norm.z;\\n      p3 *= norm.w;\\n    \\n    // Mix final noise value\\n      vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);\\n      m = m * m;\\n      return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1),\\n                                    dot(p2,x2), dot(p3,x3) ) );\\n      }\\n              \\n    \\n    float fsnoise(float val1, float val2, float val3){\\n      return snoise(vec3(val1,val2,val3));\\n    }\\n    \\n    vec3 distortFunct(vec3 transformed, float factor) {\\n      float radiusVariation = -fsnoise(\\n        transformed.x * radiusNoiseFrequency + time,\\n        transformed.y * radiusNoiseFrequency + time,\\n        transformed.z * radiusNoiseFrequency + time \\n      ) * radiusVariationAmplitude * factor;\\n      return normalize(transformed) * (radiusVariation + radius);\\n    }\\n    \\n    vec3 orthogonal(vec3 v) {\\n      return normalize(abs(v.x) > abs(v.z) ? vec3(-v.y, v.x, 0.0)\\n      : vec3(0.0, -v.z, v.y));\\n    }\\n    \\n    vec3 distortNormal(vec3 position, vec3 distortedPosition, vec3 normal){\\n      vec3 tangent1 = orthogonal(normal);\\n      vec3 tangent2 = normalize(cross(normal, tangent1));\\n      vec3 nearby1 = position + tangent1 * 0.1;\\n      vec3 nearby2 = position + tangent2 * 0.1;\\n      vec3 distorted1 = distortFunct(nearby1, 1.0);\\n      vec3 distorted2 = distortFunct(nearby2, 1.0);\\n      return normalize(cross(distorted1 - distortedPosition, distorted2 - distortedPosition));\\n    }\\n\";\nvar vert$1 = \"\\n    #include <begin_vertex>\\n    float updateTime = time / 10.0;\\n    transformed = distortFunct(transformed, 1.0);\\n    vec3 distortedNormal = distortNormal(position, transformed, normal);\\n    vNormal = normal + distortedNormal;\\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(transformed,1.);\\n\";\nvar frag$1 = \"\\n    #include <dithering_fragment>\\n    float angle = clamp(dot(normalize(vNormal), vec3(0., -1., 0.)), 0., 1.);\\n    gl_FragColor = vec4(gl_FragColor.rgb * color, gl_FragColor.a);  \\n    gl_FragColor.rgb = mix(gl_FragColor.rgb, mix(color, vec3(0.), 0.5), angle);\\n\";\n\nfunction Bubbles(props) {\n  var numStops = props.numStops,\n      enabled = props.enabled,\n      offset = props.offset;\n  var group = react.useRef(null);\n  var mesh = react.useRef(null);\n  var clock = fiber.useThree(function (st) {\n    return st.clock;\n  });\n\n  var _useState = react.useState(new three.Vector3()),\n      pos = _useState[0];\n\n  var _useState2 = react.useState(new three.Object3D()),\n      obj = _useState2[0];\n\n  var startTime = react.useRef(0);\n  react.useEffect(function () {\n    startTime.current = clock.elapsedTime;\n  }, [enabled]);\n  useLimitedFrame(40, function (_ref) {\n    var clock = _ref.clock;\n    if (!mesh.current || !group.current) return;\n    group.current.updateMatrix();\n    group.current.matrix.decompose(pos, obj.quaternion, obj.scale);\n\n    for (var i = 0; i < numStops; i++) {\n      var perc = i / (numStops - 1);\n      obj.position.set(perc * pos.x, perc * pos.y, perc * pos.z);\n      var sc = 0.8 + perc * 4;\n      var delay = 60 / 1000;\n      var time = 400 / 1000;\n      var delta = clock.elapsedTime - startTime.current;\n      var iter = enabled ? i : numStops - i - 1;\n      var x = three.MathUtils.clamp((delta - iter * delay) / time, 0, 1);\n      var val = (Math.cos(Math.PI * x) + 1) / 2;\n      if (enabled) val = 1 - val;\n      obj.scale.setScalar(sc * 0.2 * val);\n      obj.updateMatrix();\n      mesh.current.setMatrixAt(i, obj.matrix);\n    }\n\n    mesh.current.instanceMatrix.needsUpdate = true;\n  });\n  var geo = react.useMemo(function () {\n    return new three.SphereBufferGeometry(0.05, 32, 16);\n  }, []);\n  var mat = useIdeaMaterial(undefined, 0.05);\n  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(\"group\", {\n    position: offset,\n    ref: group\n  }), /*#__PURE__*/React.createElement(\"instancedMesh\", {\n    args: [geo, mat, numStops],\n    ref: mesh\n  }));\n}\n\n/**\n * helper function to detect when text needs to be synced based on arbitrary values\n *\n * @param text\n * @param property\n * @param val\n */\nvar syncOnChange = function syncOnChange(text, property, val) {\n  if (text._needsSync) return;\n  if (!text.userData) text.userData = {};\n\n  if (text.userData[property] !== val) {\n    text.userData[property] = val;\n    text._needsSync = true;\n  }\n};\n\n/**\n * Given an input, handle logic for shift clicking to select text\n * @param input\n * @param newIndex\n */\nvar handleShiftSelect = function handleShiftSelect(input, newIndex) {\n  var HAS_SELECTION = input.selectionStart !== input.selectionEnd;\n\n  if (!HAS_SELECTION) {\n    if (newIndex < (input.selectionStart || 0)) {\n      input.setSelectionRange(newIndex, input.selectionStart || 0, \"backward\");\n    } else {\n      input.setSelectionRange(input.selectionStart || 0, newIndex, \"forward\");\n    }\n\n    return;\n  } // shift clicking to select text\n\n\n  var isForward = input.selectionDirection === \"forward\";\n  var start = input.selectionStart || 0;\n  var end = input.selectionEnd || 0;\n\n  if (isForward) {\n    if (start === newIndex) {\n      input.setSelectionRange(start, newIndex, \"none\");\n    } else if (newIndex > start) {\n      input.setSelectionRange(start, newIndex, \"forward\");\n    } else {\n      input.setSelectionRange(newIndex, start, \"backward\");\n    }\n  } else {\n    if (end === newIndex) {\n      input.setSelectionRange(newIndex, end, \"none\");\n    } else if (newIndex < end) {\n      input.setSelectionRange(newIndex, end, \"backward\");\n    } else {\n      input.setSelectionRange(end, newIndex, \"forward\");\n    }\n  }\n};\nvar dummy = new three.Vector2();\n\n/**\n * Return the caret position of the last click\n * @param text\n * @param raycaster\n */\nvar getClickedCaret = function getClickedCaret(text, raycaster) {\n  var intersections = raycaster.intersectObject(text, true);\n  if (intersections.length === 0) return null;\n  var inter = intersections[0];\n  var textPos = text.worldPositionToTextCoords(inter.point, dummy);\n  return troikaThreeText.getCaretAtPoint(text.textRenderInfo, textPos.x, textPos.y);\n};\nvar CLICK_TIMEOUT = 0.2; // seconds\n\n/**\n * Calling this indicates a click. Return whether it was a single, double, or triple click\n * @param clock\n * @param lastClickTime\n * @param lastDoubleClickTime\n */\n\nvar getClickType = function getClickType(clock, lastClickTime, lastDoubleClickTime) {\n  var time = clock.elapsedTime;\n  var clickTime = time - lastClickTime.current;\n  var doubleClickTime = time - lastDoubleClickTime.current;\n\n  if (clickTime < CLICK_TIMEOUT) {\n    if (doubleClickTime < CLICK_TIMEOUT * 2) {\n      lastDoubleClickTime.current = time;\n      return 3;\n    } else {\n      lastClickTime.current = time;\n      lastDoubleClickTime.current = time;\n      return 2;\n    }\n  } else {\n    lastClickTime.current = time;\n    return 1;\n  }\n};\n/**\n * Return the start and end indexes of the word that the caret is in\n * @param text\n * @param caret\n */\n\nvar getWordBoundsAtCaret = function getWordBoundsAtCaret(text, caret) {\n  var left = caret;\n  var right = caret;\n\n  while (left > 0 && text[left - 1] !== \" \") {\n    left--;\n  }\n\n  while (right < text.length && text[right] !== \" \") {\n    right++;\n  }\n\n  return [left, right];\n};\n\nvar RESET_TIMEOUT = 1; // seconds, amount of time to wait after reset before continuing to blink\n\n/**\n * Manages the blinking of a caret.\n * @param rate\n */\nvar useCaretBlink = function useCaretBlink(rate) {\n  if (rate === void 0) {\n    rate = 1;\n  }\n\n  var blinkRef = react.useRef(null);\n  var clock = fiber.useThree(function (st) {\n    return st.clock;\n  });\n  var startTime = react.useRef(0);\n  fiber.useFrame(function (_ref) {\n    var clock = _ref.clock;\n    if (!blinkRef.current) return;\n    var diff = clock.elapsedTime - startTime.current;\n\n    if (diff < RESET_TIMEOUT) {\n      blinkRef.current.visible = true;\n    } else {\n      // formula below makes sure that after exactly RESET_TIMEOUT, blinking starts with \"off\"\n      blinkRef.current.visible = Boolean(Math.round((-Math.sin(rate * Math.PI * 2 * (diff - RESET_TIMEOUT)) + 1) / 2));\n    }\n  });\n\n  var reset = function reset() {\n    startTime.current = clock.elapsedTime;\n  };\n\n  return {\n    blinkRef: blinkRef,\n    reset: reset\n  };\n};\n\nvar useDragSelect = function useDragSelect(input, text, raycaster, focusInput) {\n  var gl = fiber.useThree(function (state) {\n    return state.gl;\n  });\n  var mouse = fiber.useThree(function (state) {\n    return state.mouse;\n  });\n  var camera = fiber.useThree(function (state) {\n    return state.camera;\n  });\n\n  var _useEnvironment = useEnvironment(),\n      device = _useEnvironment.device;\n\n  var startCar = react.useRef(0);\n  var dragging = react.useRef(false);\n  react.useEffect(function () {\n    var _text = text.current;\n    if (!_text || !_text.textRenderInfo) return;\n\n    var handleMove = function handleMove() {\n      var car = getClickedCaret(_text, raycaster);\n      if (car == null) return;\n\n      if (!dragging.current) {\n        // consider it a drag when mouse moves by at least 1 character\n        if (car.charIndex === startCar.current) return;\n        dragging.current = true;\n        input.setSelectionRange(startCar.current, startCar.current);\n      }\n\n      handleShiftSelect(input, car.charIndex);\n    };\n\n    var touchMove = function touchMove(e) {\n      // because we stop propagation, we need to manually set the mouse position\n      mouse.x = e.touches[0].clientX / gl.domElement.clientWidth * 2 - 1;\n      mouse.y = -(e.touches[0].clientY / gl.domElement.clientHeight) * 2 + 1;\n      raycaster.setFromCamera(mouse, camera);\n      handleMove();\n    };\n\n    var dragEnd = function dragEnd() {\n      if (device.mobile) {\n        gl.domElement.removeEventListener(\"touchmove\", touchMove);\n        gl.domElement.removeEventListener(\"touchend\", dragEnd);\n      } else {\n        gl.domElement.removeEventListener(\"mousemove\", handleMove);\n        gl.domElement.removeEventListener(\"mouseup\", dragEnd);\n      }\n    };\n\n    var dragStart = function dragStart(e) {\n      dragging.current = false;\n      var car = getClickedCaret(_text, raycaster);\n      if (car === null) return;\n      focusInput();\n      e.stopPropagation(); // stop touch controls from running so screen doesn't move while dragging\n\n      startCar.current = car.charIndex;\n\n      if (device.mobile) {\n        gl.domElement.addEventListener(\"touchmove\", touchMove);\n        gl.domElement.addEventListener(\"touchend\", dragEnd);\n      } else {\n        gl.domElement.addEventListener(\"mousemove\", handleMove);\n        gl.domElement.addEventListener(\"mouseup\", dragEnd);\n      }\n    };\n\n    if (device.mobile) {\n      gl.domElement.addEventListener(\"touchstart\", dragStart);\n      return function () {\n        return gl.domElement.removeEventListener(\"touchstart\", dragStart);\n      };\n    } else {\n      gl.domElement.addEventListener(\"mousedown\", dragStart);\n      return function () {\n        return gl.domElement.removeEventListener(\"mousedown\", dragStart);\n      };\n    }\n  }, [gl.domElement, focusInput, input, text, device.mobile, mouse, camera, raycaster]);\n};\n\nvar _excluded$g = [\"value\", \"onChange\", \"onSubmit\", \"onFocus\", \"onBlur\", \"type\", \"font\", \"fontSize\", \"width\", \"placeholder\", \"raycaster\"];\nfunction TextInput(props) {\n  var value = props.value,\n      onChange = props.onChange,\n      onSubmit = props.onSubmit,\n      onFocus = props.onFocus,\n      onBlur = props.onBlur,\n      _props$type = props.type,\n      type = _props$type === void 0 ? \"text\" : _props$type,\n      _props$font = props.font,\n      font = _props$font === void 0 ? \"https://d27rt3a60hh1lx.cloudfront.net/fonts/Quicksand_Bold.otf\" : _props$font,\n      _props$fontSize = props.fontSize,\n      fontSize = _props$fontSize === void 0 ? 0.1 : _props$fontSize,\n      _props$width = props.width,\n      width = _props$width === void 0 ? 1 : _props$width,\n      placeholder = props.placeholder,\n      passedRaycaster = props.raycaster,\n      rest = _objectWithoutPropertiesLoose__default[\"default\"](props, _excluded$g);\n\n  var clock = fiber.useThree(function (st) {\n    return st.clock;\n  });\n  var camera = fiber.useThree(function (st) {\n    return st.camera;\n  });\n  var player = usePlayer();\n\n  var _useEnvironment = useEnvironment(),\n      device = _useEnvironment.device;\n\n  var RAYCASTER = passedRaycaster || player.raycaster;\n  var group = react.useRef(null);\n  var textRef = react.useRef();\n  var caret = react.useRef(null);\n  var highlight = react.useRef(null);\n\n  var _useState = react.useState(\"\"),\n      localValue = _useState[0],\n      setLocalValue = _useState[1];\n\n  var val = value != null ? value : localValue;\n\n  var setVal = function setVal(s) {\n    if (onChange) onChange(s);\n    setLocalValue(s);\n  };\n\n  var _useTextInput = useTextInput(type, val, setVal),\n      input = _useTextInput.input,\n      focused = _useTextInput.focused,\n      focusInput = _useTextInput.focusInput; // focus callback\n\n\n  react.useEffect(function () {\n    if (!onFocus) return;\n    input.addEventListener(\"focus\", onFocus);\n    return function () {\n      return input.removeEventListener(\"focus\", onFocus);\n    };\n  }, [input, onFocus]); // blur callback\n\n  react.useEffect(function () {\n    if (!onBlur) return;\n    input.addEventListener(\"blur\", onBlur);\n    return function () {\n      return input.removeEventListener(\"blur\", onBlur);\n    };\n  }, [input, onBlur]); // look at input when focused, only on mobile\n\n  react.useEffect(function () {\n    if (!group.current || !focused || !device.mobile) return;\n    var worldpos = group.current.getWorldPosition(new three.Vector3());\n    camera.lookAt(worldpos);\n  }, [focused, camera, device]);\n\n  var _useSpring = three$1.useSpring({\n    color: focused ? \"#000\" : \"#828282\"\n  }),\n      color = _useSpring.color;\n\n  var highlightMat = cache.useResource(\"spacesvr_textinput_highlight\", function () {\n    return new three.MeshStandardMaterial({\n      color: \"blue\",\n      transparent: true,\n      opacity: 0.3,\n      depthWrite: false\n    });\n  });\n  var BORDER = fontSize * 0.1;\n  var PADDING_X = fontSize * 0.5;\n  var INNER_WIDTH = width - PADDING_X * 2;\n  var INPUT_HEIGHT = fontSize * 1.75;\n  var INPUT_WIDTH = width;\n  var OUTER_HEIGHT = INPUT_HEIGHT + BORDER;\n  var OUTER_WIDTH = width + BORDER * 2;\n  var DEPTH = fontSize * 0.5;\n  var shift = useShiftHold();\n  var lastClickTime = react.useRef(0);\n  var lastDoubleClickTime = react.useRef(0);\n\n  var registerClick = function registerClick() {\n    focusInput();\n    var _text = textRef.current;\n    if (!_text || !_text.textRenderInfo || !input || !focused) return;\n    var car = getClickedCaret(_text, RAYCASTER);\n\n    if (car === null) {\n      // clicked in empty space in the text box\n      input.setSelectionRange(input.value.length, input.value.length);\n    } else if (!shift.current) {\n      var clickType = getClickType(clock, lastClickTime, lastDoubleClickTime);\n\n      if (clickType === 1) {\n        input.setSelectionRange(car.charIndex, car.charIndex);\n      } else if (clickType === 2) {\n        var wordBounds = getWordBoundsAtCaret(input.value, car.charIndex);\n        input.setSelectionRange(wordBounds[0], wordBounds[1]);\n      } else {\n        input.setSelectionRange(0, input.value.length);\n      }\n    } else {\n      lastClickTime.current = 0;\n      lastDoubleClickTime.current = 0;\n      handleShiftSelect(input, car.charIndex);\n    }\n  };\n\n  useDragSelect(input, textRef, RAYCASTER, focusInput);\n  useKeypress(\"Enter\", function () {\n    if (!focused || !onSubmit) return;\n    onSubmit(input.value);\n    input.blur();\n  }, [input, focused, onSubmit]);\n  var updateText = react.useCallback(function (leftOffset, width) {\n    var _text = textRef.current;\n    if (!_text) return;\n    if (!_text.clipRect) _text.clipRect = [0, 0, 0, 0];\n    _text.clipRect[0] = leftOffset;\n    _text.clipRect[1] = -Infinity;\n    _text.clipRect[2] = width + leftOffset;\n    _text.clipRect[3] = Infinity;\n    _text.minWidth = width;\n    _text.position.x = -width / 2 - leftOffset;\n\n    _text.sync();\n  }, []);\n  var SHOW_PLACEHOLDER = !focused && placeholder && !input.value;\n  var VAL = SHOW_PLACEHOLDER ? placeholder : type === \"password\" ? input.value.replace(/./g, \"•\") : input.value;\n  var COL = SHOW_PLACEHOLDER ? \"#828282\" : \"#000\";\n  var scrollLeft = react.useRef(0);\n  var blink = useCaretBlink(0.65);\n\n  if (textRef.current && input && caret.current && highlight.current) {\n    var _text = textRef.current;\n    var _caret = caret.current;\n    var _highlight = highlight.current;\n    _text.text = VAL;\n    _text.color = COL;\n    syncOnChange(_text, \"focused\", focused);\n    syncOnChange(_text, \"selectionStart\", input.selectionStart);\n    syncOnChange(_text, \"selectionEnd\", input.selectionEnd);\n    syncOnChange(_text, \"fontSize\", fontSize);\n    syncOnChange(_text, \"scrollLeft\", scrollLeft.current);\n    syncOnChange(_text, \"width\", width);\n\n    _text.sync(function () {\n      blink.reset();\n      var caretPositions = _text.textRenderInfo.caretPositions;\n      var TEXT_SELECTED = input.selectionStart !== input.selectionEnd && focused;\n      _caret.visible = false;\n      _highlight.visible = false; // CASE 1: not focused\n\n      if (!focused) {\n        updateText(0, INNER_WIDTH);\n      } // CASE 2: focused, maybe selected, get caret in view\n\n\n      if (focused) {\n        _caret.visible = true;\n        var activeSel = (TEXT_SELECTED && input.selectionDirection === \"forward\" ? input.selectionEnd : input.selectionStart) || 0; // get it all the way to the left\n\n        _caret.position.x = -INNER_WIDTH / 2 - scrollLeft.current; // calculate char indexes and x positions\n\n        var lastIndex = caretPositions.length - 2;\n        var activeIndex = Math.min(activeSel * 3, input.value.length * 3 - 2);\n        var lastCaretX = caretPositions[lastIndex];\n        var activeCaretX = activeSel == 0 ? 0 : caretPositions[activeIndex] || lastCaretX; // fallback for fast typing\n        // move it to the active character\n\n        if (activeCaretX !== undefined) {\n          _caret.position.x += activeCaretX;\n        } // scroll to keep caret in view if it goes too far right\n\n\n        if (_caret.position.x > INNER_WIDTH / 2) {\n          if (activeSel === input.value.length) {\n            // scroll one char right\n            scrollLeft.current += _caret.position.x - INNER_WIDTH / 2;\n            _caret.position.x = INNER_WIDTH / 2;\n          } else {\n            // center caret\n            scrollLeft.current += _caret.position.x;\n            _caret.position.x -= _caret.position.x;\n          }\n        } // scroll to keep caret in view if it goes too far left\n\n\n        if (_caret.position.x < -INNER_WIDTH / 2) {\n          scrollLeft.current += _caret.position.x;\n          _caret.position.x = 0;\n        } // right adjust\n\n\n        var lastCharOffset = INNER_WIDTH - lastCaretX + scrollLeft.current;\n\n        if (lastCharOffset > 0 && scrollLeft.current > 0) {\n          _caret.position.x += lastCharOffset;\n          scrollLeft.current -= lastCharOffset;\n        } // left adjust\n\n\n        if (scrollLeft.current < 0) {\n          _caret.position.x += scrollLeft.current;\n          scrollLeft.current = 0;\n        }\n\n        updateText(scrollLeft.current, INNER_WIDTH);\n      } // CASE 3: focused and selected, show highlight\n\n\n      if (TEXT_SELECTED) {\n        _highlight.visible = true;\n        _caret.visible = false;\n        var finalCharIndex = input.value.length * 3 - 2;\n        var startIndex = Math.min((input.selectionStart || 0) * 3, finalCharIndex);\n        var startX = caretPositions[startIndex];\n        var endIndex = Math.min((input.selectionEnd || 0) * 3, finalCharIndex);\n        var endX = caretPositions[endIndex];\n\n        if (startX !== undefined && endX !== undefined) {\n          var highWidth = endX - startX;\n          _highlight.position.x = -INNER_WIDTH / 2 + startX - scrollLeft.current + highWidth / 2;\n          _highlight.scale.x = highWidth;\n          var leftEdge = _highlight.position.x - _highlight.scale.x / 2;\n\n          if (leftEdge < -INNER_WIDTH / 2) {\n            var diff = -INNER_WIDTH / 2 - leftEdge;\n            _highlight.position.x += diff / 2;\n            _highlight.scale.x -= diff;\n          }\n\n          var rightEdge = _highlight.position.x + _highlight.scale.x / 2;\n\n          if (rightEdge > INNER_WIDTH / 2) {\n            var _diff = rightEdge - INNER_WIDTH / 2;\n\n            _highlight.position.x -= _diff / 2;\n            _highlight.scale.x -= _diff;\n          }\n        }\n      }\n    });\n  } // scroll the input if user is dragging a selection to the left or right\n\n\n  var SCROLL_BUFFER = fontSize;\n  var MOVE_SPEED = fontSize * 0.25;\n  useLimitedFrame(1, function () {\n    var _text = textRef.current;\n    var _caret = caret.current;\n    var TEXT_SELECTED = input.selectionStart !== input.selectionEnd && focused;\n    if (!_text || !_caret || !TEXT_SELECTED) return; // scroll to the right\n\n    if (_caret.position.x > INNER_WIDTH / 2 - SCROLL_BUFFER) {\n      scrollLeft.current += MOVE_SPEED;\n    } // scroll to the left\n\n\n    if (_caret.position.x < -INNER_WIDTH / 2 + SCROLL_BUFFER) {\n      scrollLeft.current -= MOVE_SPEED;\n    }\n  });\n  return /*#__PURE__*/React.createElement(\"group\", _extends__default[\"default\"]({\n    name: \"spacesvr-text-input\"\n  }, rest, {\n    ref: group\n  }), /*#__PURE__*/React.createElement(\"group\", {\n    name: \"content\",\n    \"position-z\": DEPTH / 2 + 0.001\n  }, /*#__PURE__*/React.createElement(react.Suspense, {\n    fallback: null\n  }, /*#__PURE__*/React.createElement(drei.Text, {\n    name: \"text\",\n    ref: textRef,\n    color: COL,\n    anchorX: \"left\",\n    fontSize: fontSize,\n    font: font,\n    maxWidth: INNER_WIDTH,\n    \"position-x\": -INNER_WIDTH / 2 // @ts-ignore\n    ,\n    whiteSpace: \"nowrap\",\n    renderOrder: 2\n  }, VAL)), /*#__PURE__*/React.createElement(\"group\", {\n    name: \"blink\",\n    ref: blink.blinkRef\n  }, /*#__PURE__*/React.createElement(\"mesh\", {\n    name: \"caret\",\n    ref: caret,\n    visible: false,\n    material: cache.mat_basic_black\n  }, /*#__PURE__*/React.createElement(\"planeBufferGeometry\", {\n    args: [0.075 * fontSize, fontSize]\n  }))), /*#__PURE__*/React.createElement(\"mesh\", {\n    name: \"highlight\",\n    ref: highlight,\n    visible: false,\n    material: highlightMat\n  }, /*#__PURE__*/React.createElement(\"boxBufferGeometry\", {\n    args: [1, fontSize, DEPTH * 0.45]\n  }))), /*#__PURE__*/React.createElement(HitBox, {\n    args: [INPUT_WIDTH, INPUT_HEIGHT, DEPTH],\n    raycaster: RAYCASTER,\n    onClick: registerClick\n  }), /*#__PURE__*/React.createElement(RoundedBox, {\n    args: [INPUT_WIDTH, INPUT_HEIGHT, DEPTH],\n    material: cache.mat_standard_white\n  }), /*#__PURE__*/React.createElement(RoundedBox, {\n    args: [OUTER_WIDTH, OUTER_HEIGHT, DEPTH],\n    \"position-z\": -0.001\n  }, /*#__PURE__*/React.createElement(three$1.animated.meshStandardMaterial, {\n    color: color\n  })));\n}\n\nvar _excluded$f = [\"children\", \"onClick\", \"font\", \"fontSize\", \"width\", \"maxWidth\", \"textColor\", \"color\", \"outline\", \"outlineColor\", \"idea\", \"raycaster\"];\nfunction Button$1(props) {\n  var children = props.children,\n      onClick = props.onClick,\n      _props$font = props.font,\n      font = _props$font === void 0 ? \"https://d27rt3a60hh1lx.cloudfront.net/fonts/Quicksand_Bold.otf\" : _props$font,\n      _props$fontSize = props.fontSize,\n      fontSize = _props$fontSize === void 0 ? 0.05 : _props$fontSize,\n      width = props.width,\n      maxWidth = props.maxWidth,\n      _props$textColor = props.textColor,\n      textColor = _props$textColor === void 0 ? \"black\" : _props$textColor,\n      _props$color = props.color,\n      color = _props$color === void 0 ? \"#fff\" : _props$color,\n      _props$outline = props.outline,\n      outline = _props$outline === void 0 ? true : _props$outline,\n      _props$outlineColor = props.outlineColor,\n      outlineColor = _props$outlineColor === void 0 ? \"white\" : _props$outlineColor,\n      idea = props.idea,\n      raycaster = props.raycaster,\n      rest = _objectWithoutPropertiesLoose__default[\"default\"](props, _excluded$f);\n\n  var textRef = react.useRef();\n\n  var _useState = react.useState([0, 0]),\n      dims = _useState[0],\n      setDims = _useState[1];\n\n  var _useState2 = react.useState(false),\n      hovered = _useState2[0],\n      setHovered = _useState2[1];\n\n  var _useState3 = react.useState(false),\n      clicked = _useState3[0],\n      setClicked = _useState3[1];\n\n  var REST_COLOR = react.useMemo(function () {\n    return idea ? idea.getHex() : color;\n  }, [color, idea]);\n  var HOVER_COLOR = react.useMemo(function () {\n    var hoverIdea = idea ? idea.clone() : new Idea().setFromHex(\"#\" + new three.Color(REST_COLOR).getHexString());\n    var offset = 0.175 * (hoverIdea.utility > 0.5 ? -1 : 1);\n    hoverIdea.setUtility(hoverIdea.utility + offset);\n    return hoverIdea.getHex();\n  }, [REST_COLOR, idea]);\n\n  var _useSpring = three$1.useSpring(_extends__default[\"default\"]({\n    animColor: hovered ? HOVER_COLOR : REST_COLOR,\n    scale: clicked ? 0.75 : 1\n  }, three$1.config.stiff)),\n      animColor = _useSpring.animColor,\n      scale = _useSpring.scale; // spring animation on click\n\n\n  react.useEffect(function () {\n    if (clicked) setTimeout(function () {\n      return setClicked(false);\n    }, 150);\n  }, [clicked]);\n\n  var onButtonClick = function onButtonClick() {\n    if (onClick) onClick();\n    setClicked(true);\n  }; // keep dimensions up to date\n\n\n  react.useLayoutEffect(function () {\n    textRef.current.addEventListener(\"synccomplete\", function () {\n      var _textRef$current;\n\n      var info = (_textRef$current = textRef.current) == null ? void 0 : _textRef$current.textRenderInfo;\n      if (!info) return;\n      var w = info.blockBounds[2] - info.blockBounds[0];\n      var h = info.blockBounds[3] - info.blockBounds[1];\n      setDims([w, h]);\n    });\n    textRef.current.sync();\n  }, []);\n  var PADDING = fontSize * 0.9;\n  var MAX_WIDTH = !maxWidth ? Infinity : width ? Math.max(width, maxWidth) : maxWidth;\n  var WIDTH = (width || dims[0]) + PADDING * 2;\n  var HEIGHT = dims[1] + PADDING;\n  var DEPTH = fontSize * 1.1;\n  var OUTLINE_WIDTH = outline ? fontSize * 0.075 : 0;\n  return /*#__PURE__*/React.createElement(\"group\", _extends__default[\"default\"]({\n    name: \"spacesvr-button-\" + children\n  }, rest), /*#__PURE__*/React.createElement(three$1.animated.group, {\n    scale: scale\n  }, /*#__PURE__*/React.createElement(drei.Text, {\n    ref: textRef,\n    color: textColor,\n    font: font,\n    fontSize: fontSize,\n    maxWidth: MAX_WIDTH,\n    outlineWidth: OUTLINE_WIDTH,\n    outlineColor: outlineColor,\n    anchorY: \"middle\",\n    textAlign: \"center\",\n    \"position-z\": DEPTH / 2 + 0.001,\n    renderOrder: 2\n  }, children), /*#__PURE__*/React.createElement(HitBox, {\n    args: [WIDTH, HEIGHT, DEPTH],\n    onClick: onButtonClick,\n    onHover: function onHover() {\n      return setHovered(true);\n    },\n    onUnHover: function onUnHover() {\n      return setHovered(false);\n    },\n    raycaster: raycaster\n  }), /*#__PURE__*/React.createElement(RoundedBox, {\n    args: [WIDTH, HEIGHT, DEPTH]\n  }, /*#__PURE__*/React.createElement(three$1.animated.meshStandardMaterial, {\n    color: animColor\n  }))));\n}\n\nfunction _createForOfIteratorHelperLoose$6(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray$6(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray$6(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray$6(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$6(o, minLen); }\n\nfunction _arrayLikeToArray$6(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\nfunction VisualDecisions(props) {\n  var decisions = props.decisions,\n      setCurKey = props.setCurKey,\n      width = props.width;\n  var FONT_FILE = \"https://d27rt3a60hh1lx.cloudfront.net/fonts/Quicksand_Bold.otf\";\n  var FONT_SIZE = 0.05;\n  var OUTLINE_WIDTH = FONT_SIZE * 0.1;\n  var PADDING_Y = 0.065;\n  var SPACING_Y = 0.015;\n  var SPACING_X = 0.08;\n  var PADDING_X = 0.025;\n\n  var _useState = react.useState(function () {\n    return new Map();\n  }),\n      dimMap = _useState[0];\n\n  var _useState2 = react.useState(false),\n      ready = _useState2[0],\n      setReady = _useState2[1]; // for every new set of values, generate a new text object and store width\n  // keep ready state in sync with whether all values have been measured\n\n\n  react.useEffect(function () {\n    if (decisions.every(function (d) {\n      return dimMap.has(d.name);\n    })) return;\n    setReady(false);\n\n    var _loop = function _loop() {\n      var decision = _step.value;\n      if (dimMap.has(decision.name)) return \"continue\";\n      setReady(false);\n      var t = new troikaThreeText.Text();\n      t.text = decision.name;\n      t.font = FONT_FILE;\n      t.fontSize = FONT_SIZE;\n      t.maxWidth = width;\n      t.outlineWidth = OUTLINE_WIDTH;\n      t.sync(function () {\n        var blockBounds = t.textRenderInfo.blockBounds;\n        var w = blockBounds[2] - blockBounds[0];\n        var h = blockBounds[3] - blockBounds[1];\n        dimMap.set(decision.name, {\n          w: w,\n          h: h\n        });\n        if (decisions.every(function (d) {\n          return dimMap.has(d.name);\n        })) setReady(true);\n      });\n    };\n\n    for (var _iterator = _createForOfIteratorHelperLoose$6(decisions), _step; !(_step = _iterator()).done;) {\n      var _ret = _loop();\n\n      if (_ret === \"continue\") continue;\n    }\n  }, [decisions, dimMap, FONT_SIZE, FONT_FILE, width, OUTLINE_WIDTH]);\n  var objValues = react.useMemo(function () {\n    var lines = [];\n    var thisLineWidth = 0;\n    var thisLineIndex = 0;\n    var y = -FONT_SIZE;\n    var lastHei = 0; // calculate lines and y positions\n\n    for (var _iterator2 = _createForOfIteratorHelperLoose$6(decisions), _step2; !(_step2 = _iterator2()).done;) {\n      var _dimMap$get2, _dimMap$get3;\n\n      var _decision = _step2.value;\n\n      var _wid = (((_dimMap$get2 = dimMap.get(_decision.name)) == null ? void 0 : _dimMap$get2.w) || 0) + PADDING_X * 2 + SPACING_X;\n\n      var hei = ((_dimMap$get3 = dimMap.get(_decision.name)) == null ? void 0 : _dimMap$get3.h) || 0;\n\n      if (thisLineWidth + _wid <= width) {\n        if (!lines[thisLineIndex]) lines.push({\n          y: y,\n          decisions: []\n        });\n        lines[thisLineIndex].decisions.push(_decision);\n        lastHei = hei;\n        thisLineWidth += _wid;\n      } else {\n        var _dimMap$get4;\n\n        // by default, overflow means new line\n        thisLineIndex++;\n\n        var _hei = ((_dimMap$get4 = dimMap.get(_decision.name)) == null ? void 0 : _dimMap$get4.h) || 0;\n\n        y -= lastHei / 2 + SPACING_Y + PADDING_Y + _hei / 2;\n\n        if (_hei > FONT_SIZE + OUTLINE_WIDTH * 2) {\n          // if it's taller than one line, force it to be on its own line\n          lines.push({\n            y: y,\n            decisions: [_decision]\n          });\n          y -= _hei / 2 + PADDING_Y + SPACING_Y;\n          thisLineIndex++;\n          thisLineWidth = 0;\n          lastHei = _hei;\n        } else {\n          // add to this new line\n          lines.push({\n            y: y,\n            decisions: [_decision]\n          });\n          thisLineWidth += _wid;\n          lastHei = _hei;\n        }\n      }\n    } // from lines, calculate x positions by centering each decision within its line\n\n\n    var objMap = [];\n\n    for (var _i = 0, _lines = lines; _i < _lines.length; _i++) {\n      var line = _lines[_i];\n      var lineObjMap = []; // place each decision in the center then shift left\n\n      var x = 0;\n\n      for (var _iterator3 = _createForOfIteratorHelperLoose$6(line.decisions), _step3; !(_step3 = _iterator3()).done;) {\n        var _dimMap$get;\n\n        var decision = _step3.value;\n        var wid = ((_dimMap$get = dimMap.get(decision.name)) == null ? void 0 : _dimMap$get.w) || 0;\n        x -= wid / 2;\n        lineObjMap.push({\n          decision: decision,\n          position: [x, line.y, 0]\n        });\n        x -= wid / 2 + PADDING_X * 2 + SPACING_X;\n      } // shift all decisions in the line to the right\n\n\n      var lineWid = -x - PADDING_X * 2 - SPACING_X;\n      var shift = lineWid / 2;\n\n      for (var _i2 = 0, _lineObjMap = lineObjMap; _i2 < _lineObjMap.length; _i2++) {\n        var obj = _lineObjMap[_i2];\n        obj.position[0] += shift;\n      }\n\n      objMap.push.apply(objMap, lineObjMap);\n    }\n\n    return objMap;\n  }, [decisions, dimMap, width, ready]);\n\n  var _useState3 = react.useState(Math.random()),\n      offset = _useState3[0];\n\n  var ideaMap = react.useMemo(function () {\n    var map = new Map();\n\n    for (var _iterator4 = _createForOfIteratorHelperLoose$6(decisions), _step4; !(_step4 = _iterator4()).done;) {\n      var decision = _step4.value;\n      var m = (offset + decisions.indexOf(decision) / decisions.length) % 1;\n      var s = 0.7;\n      map.set(decision.name, new Idea(m, s, decision.utility || 0.8));\n    }\n\n    return map;\n  }, [decisions, offset]);\n  if (!ready) return null;\n  return /*#__PURE__*/React.createElement(React.Fragment, null, objValues.map(function (_ref, i) {\n    var decision = _ref.decision,\n        position = _ref.position;\n    return /*#__PURE__*/React.createElement(\"group\", {\n      key: decision.name + i + position.toString(),\n      position: position\n    }, /*#__PURE__*/React.createElement(FacePlayer, null, /*#__PURE__*/React.createElement(Button$1, {\n      font: FONT_FILE,\n      fontSize: FONT_SIZE,\n      maxWidth: width,\n      idea: ideaMap.get(decision.name),\n      onClick: function onClick() {\n        if (decision.onClick) decision.onClick();\n        if (decision.nextKey) setCurKey(decision.nextKey || \"\");\n      }\n    }, decision.name)));\n  }));\n}\n\nfunction _createForOfIteratorHelperLoose$5(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray$5(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray$5(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray$5(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$5(o, minLen); }\n\nfunction _arrayLikeToArray$5(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\nvar FONT_FILE$1 = \"https://d27rt3a60hh1lx.cloudfront.net/fonts/Quicksand_Bold.otf\";\nfunction VisualInteraction(props) {\n  var interaction = props.interaction,\n      enabled = props.enabled,\n      width = props.width,\n      height = props.height,\n      setCurKey = props.setCurKey;\n  var effect = interaction.effect,\n      text = interaction.text,\n      input = interaction.input,\n      decisions = interaction.decisions;\n\n  var _useState = react.useState(false),\n      prevEnabled = _useState[0],\n      setPrevEnabled = _useState[1];\n\n  var _useSpring = three$1.useSpring({\n    posZ: enabled ? 0.003 : -0.003,\n    scaleY: enabled ? 1 : 0\n  }),\n      posZ = _useSpring.posZ,\n      scaleY = _useSpring.scaleY;\n\n  var onSubmit = react.useMemo(function () {\n    if (!decisions) return function () {\n      return;\n    };\n\n    var _loop = function _loop() {\n      var decision = _step.value;\n\n      if (decision.name === \"submit\") {\n        return {\n          v: function v() {\n            if (decision.onClick) decision.onClick();\n            if (decision.nextKey) setCurKey(decision.nextKey || \"\");\n          }\n        };\n      }\n    };\n\n    for (var _iterator = _createForOfIteratorHelperLoose$5(decisions), _step; !(_step = _iterator()).done;) {\n      var _ret = _loop();\n\n      if (typeof _ret === \"object\") return _ret.v;\n    }\n  }, [decisions, setCurKey]);\n  react.useEffect(function () {\n    if (prevEnabled !== enabled) {\n      setPrevEnabled(enabled);\n\n      if (enabled && effect) {\n        effect().then(function (newKey) {\n          if (newKey) {\n            setCurKey(newKey);\n          }\n        });\n      }\n    }\n  }, [effect, setCurKey, prevEnabled, enabled]);\n  var textStyles = {\n    font: FONT_FILE$1,\n    maxWidth: 0.8,\n    textAlign: \"center\",\n    fontSize: 0.06,\n    outlineWidth: 0.0065,\n    renderOrder: 10\n  };\n  if (!enabled) return null;\n  return /*#__PURE__*/React.createElement(three$1.animated.group, {\n    name: \"interaction-\" + text,\n    \"position-z\": posZ,\n    \"scale-y\": scaleY\n  }, /*#__PURE__*/React.createElement(drei.Text, _extends__default[\"default\"]({}, textStyles, {\n    anchorY: input ? \"bottom\" : \"middle\"\n  }), text), input && (input.persist || enabled) && /*#__PURE__*/React.createElement(TextInput, {\n    value: input.value,\n    onChange: input.setValue,\n    \"position-y\": -0.065,\n    onSubmit: onSubmit,\n    fontSize: 0.06,\n    width: width * 0.825,\n    type: input.type === \"email\" ? \"text\" : input.type\n  }), /*#__PURE__*/React.createElement(\"group\", {\n    \"position-y\": -height / 2\n  }, decisions && /*#__PURE__*/React.createElement(VisualDecisions, {\n    decisions: decisions,\n    width: width,\n    setCurKey: setCurKey\n  })));\n}\n\nvar _excluded$e = [\"numStops\", \"enabled\", \"side\", \"offset\", \"dialogue\", \"face\"];\nfunction Dialogue(props) {\n  var _props$numStops = props.numStops,\n      numStops = _props$numStops === void 0 ? 5 : _props$numStops,\n      _props$enabled = props.enabled,\n      enabled = _props$enabled === void 0 ? true : _props$enabled,\n      _props$side = props.side,\n      side = _props$side === void 0 ? \"left\" : _props$side,\n      _props$offset = props.offset,\n      offset = _props$offset === void 0 ? [side === \"right\" ? 0.4 : -0.4, 0, 0] : _props$offset,\n      dialogue = props.dialogue,\n      _props$face = props.face,\n      face = _props$face === void 0 ? true : _props$face,\n      rest = _objectWithoutPropertiesLoose__default[\"default\"](props, _excluded$e);\n\n  var _useState = react.useState(\"init\"),\n      curKey = _useState[0],\n      setCurKey = _useState[1];\n\n  var _useSpring = three$1.useSpring({\n    scale: enabled ? 1 : 0,\n    delay: enabled ? (numStops + 1) * 60 : 0\n  }),\n      scale = _useSpring.scale;\n\n  var group = react.useRef(null);\n  useLimitedFrame(40, function (_ref) {\n    var camera = _ref.camera;\n    if (!group.current) return;\n    group.current.position.x += side === \"right\" ? WIDTH : -WIDTH;\n    group.current.lookAt(camera.position);\n    group.current.position.set(0, 0, 0);\n  });\n  var WIDTH = 1;\n  var HEIGHT = 0.35;\n  var DEPTH = 0.125;\n  var POS_X = side === \"right\" ? WIDTH / 2 : -WIDTH / 2;\n  return /*#__PURE__*/React.createElement(\"group\", _extends__default[\"default\"]({\n    name: \"dialogue\"\n  }, rest), /*#__PURE__*/React.createElement(FacePlayer, {\n    enabled: face\n  }, /*#__PURE__*/React.createElement(Bubbles, {\n    numStops: numStops,\n    enabled: enabled,\n    offset: offset\n  }), /*#__PURE__*/React.createElement(\"group\", {\n    name: \"main-dialogue\",\n    position: offset\n  }, /*#__PURE__*/React.createElement(\"group\", {\n    name: \"look-at\",\n    ref: group\n  }, /*#__PURE__*/React.createElement(three$1.animated.group, {\n    scale: scale,\n    \"position-x\": POS_X\n  }, /*#__PURE__*/React.createElement(RoundedBox, {\n    args: [WIDTH, HEIGHT, DEPTH],\n    material: cache.mat_standard_cream_double\n  }), /*#__PURE__*/React.createElement(\"group\", {\n    name: \"interactions\",\n    \"position-z\": DEPTH / 2 + 0.003\n  }, dialogue.map(function (interaction) {\n    return /*#__PURE__*/React.createElement(VisualInteraction, {\n      key: interaction.key,\n      interaction: interaction,\n      enabled: interaction.key === curKey,\n      setCurKey: setCurKey,\n      width: WIDTH,\n      height: HEIGHT\n    });\n  })))))));\n}\n\nvar _excluded$d = [\"dark\"];\nvar IMAGE_SRC = \"https://d27rt3a60hh1lx.cloudfront.net/images/whiteArrow.png\";\nvar IMAGE_SRC_DARK = \"https://d27rt3a60hh1lx.cloudfront.net/images/blackArrow.png\";\nfunction Arrow(props) {\n  var dark = props.dark,\n      rest = _objectWithoutPropertiesLoose__default[\"default\"](props, _excluded$d);\n\n  var texture = useImage(dark ? IMAGE_SRC_DARK : IMAGE_SRC);\n  var arrowMat = cache.useResource(\"spacesvr_arrow_\" + (dark ? \"dark\" : \"light\"), function () {\n    return new three.MeshStandardMaterial({\n      map: texture,\n      alphaTest: 0.5,\n      transparent: true\n    });\n  });\n  return /*#__PURE__*/React.createElement(\"group\", _extends__default[\"default\"]({\n    name: \"spacesvr-arrow\"\n  }, rest), /*#__PURE__*/React.createElement(\"mesh\", {\n    scale: 0.004,\n    material: arrowMat\n  }, /*#__PURE__*/React.createElement(\"planeBufferGeometry\", {\n    args: [98, 51]\n  })));\n}\n\nvar _excluded$c = [\"keyCode\", \"keyPress\", \"onPress\"];\nfunction Key(props) {\n  var keyCode = props.keyCode,\n      _props$keyPress = props.keyPress,\n      keyPress = _props$keyPress === void 0 ? [keyCode] : _props$keyPress,\n      onPress = props.onPress,\n      rest = _objectWithoutPropertiesLoose__default[\"default\"](props, _excluded$c);\n\n  var _useState = react.useState(false),\n      pressed = _useState[0],\n      setPressed = _useState[1];\n\n  var _useSpring = three$1.useSpring(_extends__default[\"default\"]({\n    color: pressed ? \"#aaa\" : \"#fff\",\n    scale: pressed ? 0.5 : 1\n  }, three$1.config.stiff)),\n      color = _useSpring.color,\n      scale = _useSpring.scale;\n\n  var DEPTH = 0.25;\n  react.useEffect(function () {\n    var pressed = function pressed(e) {\n      return keyPress.map(function (k) {\n        return k.toLowerCase();\n      }).includes(e.key.toLowerCase());\n    };\n\n    var detectDown = function detectDown(e) {\n      if (e.key && pressed(e)) setPressed(true);\n    };\n\n    var detectUnPress = function detectUnPress(e) {\n      if (e.key && pressed(e)) setPressed(false);\n    };\n\n    var detectPress = function detectPress(e) {\n      if (e.key && pressed(e)) onPress == null ? void 0 : onPress(e);\n    };\n\n    document.addEventListener(\"keydown\", detectDown);\n    document.addEventListener(\"keyup\", detectUnPress);\n    document.addEventListener(\"keypress\", detectPress);\n    return function () {\n      document.removeEventListener(\"keydown\", detectDown);\n      document.removeEventListener(\"keyup\", detectUnPress);\n      document.removeEventListener(\"keypress\", detectPress);\n    };\n  }, [keyPress, onPress]);\n  return /*#__PURE__*/React.createElement(\"group\", _extends__default[\"default\"]({\n    name: \"spacesvr-key\"\n  }, rest), /*#__PURE__*/React.createElement(\"group\", {\n    \"position-z\": -DEPTH\n  }, /*#__PURE__*/React.createElement(three$1.animated.group, {\n    \"scale-z\": scale\n  }, /*#__PURE__*/React.createElement(\"group\", {\n    \"position-z\": DEPTH / 2\n  }, /*#__PURE__*/React.createElement(RoundedBox, {\n    args: [1, 1, DEPTH],\n    \"position-z\": -DEPTH / 2 - 0.01\n  }, /*#__PURE__*/React.createElement(three$1.animated.meshStandardMaterial, {\n    color: color\n  })), /*#__PURE__*/React.createElement(drei.Text, {\n    color: \"black\",\n    fontSize: 0.5,\n    renderOrder: 2\n  }, keyCode)))));\n}\n\nvar _excluded$b = [\"value\", \"onChange\", \"raycaster\"];\nfunction Switch(props) {\n  var value = props.value,\n      onChange = props.onChange,\n      passedRaycaster = props.raycaster,\n      rest = _objectWithoutPropertiesLoose__default[\"default\"](props, _excluded$b);\n\n  var _useState = react.useState(false),\n      localValue = _useState[0],\n      setLocalValue = _useState[1]; // if no value is passed, use local state\n\n\n  var val = value != null ? value : localValue;\n\n  var setVal = function setVal(v) {\n    if (onChange) onChange(v);\n    setLocalValue(v);\n  };\n\n  var SIZE = 0.075;\n  var BORDER = SIZE * 0.05;\n  var WIDTH = 2.5 * SIZE;\n  var HEIGHT = SIZE * 0.75;\n  var DEPTH = WIDTH * 0.1;\n  var OUTER_WIDTH = WIDTH + BORDER * 2;\n  var OUTER_HEIGHT = HEIGHT + BORDER;\n  var KNOB_SIZE = SIZE * 0.8;\n\n  var _useSpring = three$1.useSpring({\n    posX: val ? WIDTH / 2 : -WIDTH / 2,\n    knobColor: val ? \"#417E25\" : \"#828282\",\n    config: {\n      mass: 0.1\n    }\n  }),\n      posX = _useSpring.posX,\n      knobColor = _useSpring.knobColor;\n\n  var _useState2 = react.useState(new Idea(0, 0, 1)),\n      onIdea = _useState2[0];\n\n  var _useState3 = react.useState(new Idea(0, 0, 0.75)),\n      offIdea = _useState3[0];\n\n  return /*#__PURE__*/React.createElement(\"group\", _extends__default[\"default\"]({\n    name: \"spacesvr-switch-input\"\n  }, rest), /*#__PURE__*/React.createElement(three$1.animated.group, {\n    \"position-x\": posX\n  }, /*#__PURE__*/React.createElement(VisualIdea, {\n    scale: KNOB_SIZE,\n    idea: val ? onIdea : offIdea\n  })), /*#__PURE__*/React.createElement(HitBox, {\n    args: [KNOB_SIZE, KNOB_SIZE, KNOB_SIZE],\n    onClick: function onClick() {\n      return setVal(!val);\n    },\n    \"position-x\": val ? WIDTH / 2 : -WIDTH / 2,\n    raycaster: passedRaycaster\n  }), /*#__PURE__*/React.createElement(HitBox, {\n    args: [OUTER_WIDTH, OUTER_HEIGHT, DEPTH],\n    onClick: function onClick() {\n      return setVal(!val);\n    },\n    raycaster: passedRaycaster\n  }), /*#__PURE__*/React.createElement(RoundedBox, {\n    args: [WIDTH, HEIGHT, DEPTH]\n  }, /*#__PURE__*/React.createElement(three$1.animated.meshBasicMaterial, {\n    color: knobColor\n  })), /*#__PURE__*/React.createElement(RoundedBox, {\n    args: [OUTER_WIDTH, OUTER_HEIGHT, DEPTH],\n    material: cache.mat_basic_gray,\n    \"position-z\": -0.001\n  }));\n}\n\nvar NetworkContext = /*#__PURE__*/react.createContext({});\nvar useNetwork = function useNetwork() {\n  return react.useContext(NetworkContext);\n};\n\nvar useListener = function useListener() {\n  var cam = fiber.useThree(function (st) {\n    return st.camera;\n  });\n  return react.useMemo(function () {\n    var listen = new three.AudioListener();\n    cam.add(listen);\n    return listen;\n  }, [cam]);\n};\nvar useObj = function useObj() {\n  return react.useMemo(function () {\n    var o = new three.Object3D();\n    o.matrixAutoUpdate = false;\n    return o;\n  }, []);\n};\n\nvar useEntities = function useEntities() {\n  var _useNetwork = useNetwork(),\n      connections = _useNetwork.connections,\n      connected = _useNetwork.connected,\n      mediaConnections = _useNetwork.mediaConnections;\n\n  var _useEnvironment = useEnvironment(),\n      paused = _useEnvironment.paused;\n\n  var listener = useListener();\n\n  var _useState = react.useState(0);\n      _useState[0];\n      var setCt = _useState[1];\n\n  var rerender = function rerender() {\n    return setCt(Math.random());\n  };\n\n  var _useState2 = react.useState(true),\n      firstPaused = _useState2[0],\n      setFirstPaused = _useState2[1];\n\n  react.useEffect(function () {\n    return setFirstPaused(paused && firstPaused);\n  }, [paused, firstPaused]);\n  var entities = react.useMemo(function () {\n    return [];\n  }, []);\n\n  var needsAudio = function needsAudio(e) {\n    return mediaConnections.has(e.id) && !e.posAudio;\n  }; // check for a change in player list, re-render if there is a change\n\n\n  useLimitedFrame(3, function () {\n    if (!connected) return; // changed flag to trigger re-render at the end\n\n    var changed = false; // remove old entities\n\n    entities.map(function (e) {\n      if (!connections.has(e.id)) {\n        if (e.posAudio) {\n          e.posAudio.remove();\n          e.posAudio = undefined;\n        }\n\n        entities.splice(entities.indexOf(e), 1);\n        changed = true;\n      }\n    }); // add in new entities\n\n    var _loop = function _loop() {\n      var id = _Array$from[_i];\n\n      if (!entities.some(function (e) {\n        return e.id === id;\n      })) {\n        entities.push({\n          id: id,\n          posAudio: undefined\n        });\n        changed = true;\n      }\n    };\n\n    for (var _i = 0, _Array$from = Array.from(connections.keys()); _i < _Array$from.length; _i++) {\n      _loop();\n    } // dont run until first time unpaused to make sure audio context is running from first press\n\n\n    if (!firstPaused) {\n      // remove media connections streams that are no longer connected\n      entities.map(function (e) {\n        if (!mediaConnections.has(e.id)) {\n          var _e$posAudio;\n\n          (_e$posAudio = e.posAudio) == null ? void 0 : _e$posAudio.remove();\n          e.posAudio = undefined;\n          changed = true;\n        }\n      });\n      entities.filter(needsAudio).map(function (e) {\n        // add in new media connections if the stream is active\n        var mediaConn = mediaConnections.get(e.id);\n        if (!mediaConn) return;\n        if (!mediaConn.remoteStream) return;\n        console.log(\"adding audio for\", e.id);\n        var audioElem = document.createElement(\"audio\");\n        audioElem.srcObject = mediaConn.remoteStream; // remote is incoming, local is own voice\n\n        audioElem.muted = true;\n        audioElem.autoplay = true;\n        audioElem.loop = true; //@ts-ignore\n\n        audioElem.playsInline = true;\n        var posAudio = new three.PositionalAudio(listener);\n        posAudio.userData.peerId = e.id;\n        posAudio.setMediaStreamSource(audioElem.srcObject);\n        posAudio.setRefDistance(2);\n        posAudio.setDirectionalCone(200, 290, 0.35); // posAudio.add(new PositionalAudioHelper(posAudio, 1));\n\n        e.posAudio = posAudio;\n        changed = true;\n      });\n    }\n\n    if (changed) rerender();\n  });\n  return entities;\n};\n\nfunction _createForOfIteratorHelperLoose$4(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray$4(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray$4(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray$4(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$4(o, minLen); }\n\nfunction _arrayLikeToArray$4(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\nfunction NetworkedEntities() {\n  var _useNetwork = useNetwork(),\n      connected = _useNetwork.connected,\n      useChannel = _useNetwork.useChannel;\n\n  var mesh = react.useRef(null);\n  var geo = react.useMemo(function () {\n    return new three.CylinderBufferGeometry(0.3, 0.3, 1, 32);\n  }, []);\n  var mat = react.useMemo(function () {\n    return new three.MeshNormalMaterial();\n  }, []);\n  var obj = useObj();\n  var entities = useEntities(); // set up channel to send/receive data\n\n  var NETWORK_FPS = 12;\n  var SI = react.useMemo(function () {\n    return new snapshotInterpolation.SnapshotInterpolation(NETWORK_FPS);\n  }, []);\n  var entityChannel = useChannel(\"player\", \"stream\", function (m, s) {\n    if (!m.conn) return;\n    s[m.conn.peer] = m.data;\n    var state = Object.keys(s).map(function (key) {\n      return {\n        id: key,\n        x: s[key].pos[0],\n        y: s[key].pos[1],\n        z: s[key].pos[2],\n        q: {\n          x: s[key].rot[0],\n          y: s[key].rot[1],\n          z: s[key].rot[2],\n          w: s[key].rot[3]\n        }\n      };\n    });\n    SI.vault.add({\n      id: Math.random().toString(),\n      time: new Date().getTime(),\n      state: state\n    });\n  }); // send own player data\n\n  useLimitedFrame(NETWORK_FPS, function (_ref) {\n    var camera = _ref.camera;\n    if (!connected) return;\n    entityChannel.send({\n      pos: camera.position.toArray(),\n      rot: camera.quaternion.toArray()\n    });\n  }); // receive player data\n\n  useLimitedFrame(55, function () {\n    if (!mesh.current) return;\n    var snapshot = SI.calcInterpolation(\"x y z q(quat)\");\n    if (!snapshot) return;\n    var i = 0;\n\n    for (var _iterator = _createForOfIteratorHelperLoose$4(snapshot.state), _step; !(_step = _iterator()).done;) {\n      var _entities$i;\n\n      var entityState = _step.value;\n      var x = entityState.x,\n          y = entityState.y,\n          z = entityState.z,\n          q = entityState.q;\n      obj.position.set(x, y, z);\n      obj.position.y -= 0.2; // they were floating before, idk where the constant comes from really\n\n      var quat = q;\n      obj.quaternion.set(quat.x, quat.y, quat.z, quat.w);\n      obj.updateMatrix();\n      mesh.current.setMatrixAt(i, obj.matrix);\n      var posAudio = (_entities$i = entities[i]) == null ? void 0 : _entities$i.posAudio;\n\n      if (posAudio) {\n        obj.matrix.decompose(posAudio.position, posAudio.quaternion, posAudio.scale);\n        posAudio.rotation.y += Math.PI; // for some reason it's flipped\n\n        posAudio.updateMatrix();\n      }\n\n      i++;\n    }\n\n    mesh.current.instanceMatrix.needsUpdate = true;\n  });\n\n  if (!connected) {\n    return null;\n  }\n\n  return /*#__PURE__*/React.createElement(\"group\", {\n    name: \"spacesvr-entities\"\n  }, entities.map(function (entity) {\n    return entity.posAudio && /*#__PURE__*/React.createElement(\"primitive\", {\n      key: entity.posAudio.uuid,\n      object: entity.posAudio,\n      matrixAutoUpdate: false\n    });\n  }), /*#__PURE__*/React.createElement(\"instancedMesh\", {\n    ref: mesh,\n    args: [geo, mat, entities.length],\n    matrixAutoUpdate: false\n  }));\n}\n\nvar isLocalNetwork = function isLocalNetwork(hostname) {\n  if (hostname === void 0) {\n    hostname = window.location.hostname;\n  }\n\n  return [\"localhost\", \"127.0.0.1\", \"\", \"::1\"].includes(hostname) || hostname.startsWith(\"192.168.\") || hostname.startsWith(\"10.0.\") || hostname.endsWith(\".local\");\n};\n\nvar SESSION_ID = \"spacesvr-local-signalling\";\nvar TIMEOUT_MIN = 1.25;\nvar LocalSignaller = /*#__PURE__*/function () {\n  function LocalSignaller(peer) {\n    console.info(\"using local signaller\");\n    if (peer.id) this.peerId = peer.id;\n  }\n\n  var _proto = LocalSignaller.prototype;\n\n  _proto.readStore = function readStore() {\n    var str = localStorage.getItem(SESSION_ID);\n    if (!str) return [];\n\n    try {\n      return JSON.parse(str);\n    } catch (err) {\n      return [];\n    }\n  };\n\n  _proto.writeStore = function writeStore(peers) {\n    localStorage.setItem(SESSION_ID, JSON.stringify(peers));\n  };\n\n  _proto.cleanStore = function cleanStore() {\n    var peers = this.readStore();\n    var time = new Date().getTime();\n    var newPeers = peers.filter(function (peer) {\n      var keep = time - peer.last_seen <= TIMEOUT_MIN * 60 * 1000;\n      if (!keep) console.info(\"removing local peer with id \", peer.id);\n      return keep;\n    });\n    this.writeStore(newPeers);\n  };\n\n  _proto.join = /*#__PURE__*/function () {\n    var _join = _asyncToGenerator__default[\"default\"]( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n      var peer, peers;\n      return regeneratorRuntime.wrap(function _callee$(_context) {\n        while (1) {\n          switch (_context.prev = _context.next) {\n            case 0:\n              if (this.peerId) {\n                _context.next = 3;\n                break;\n              }\n\n              console.error(\"peer id not established, aborting signal\");\n              return _context.abrupt(\"return\");\n\n            case 3:\n              this.cleanStore();\n              console.info(\"local network detected, signalling with localStorage\");\n              peer = {\n                id: this.peerId,\n                last_seen: new Date().getTime()\n              };\n              peers = this.readStore();\n              peers.push(peer);\n              this.writeStore(peers);\n              return _context.abrupt(\"return\", peers.map(function (peer) {\n                return peer.id;\n              }));\n\n            case 10:\n            case \"end\":\n              return _context.stop();\n          }\n        }\n      }, _callee, this);\n    }));\n\n    function join() {\n      return _join.apply(this, arguments);\n    }\n\n    return join;\n  }();\n\n  _proto.leave = /*#__PURE__*/function () {\n    var _leave = _asyncToGenerator__default[\"default\"]( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n      var _this = this;\n\n      var peers, index;\n      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n        while (1) {\n          switch (_context2.prev = _context2.next) {\n            case 0:\n              if (this.peerId) {\n                _context2.next = 3;\n                break;\n              }\n\n              console.error(\"peer id not established, aborting signal\");\n              return _context2.abrupt(\"return\");\n\n            case 3:\n              console.info(\"updating local signal list to remove self\");\n              peers = this.readStore();\n              index = peers.findIndex(function (peer) {\n                return peer.id === _this.peerId;\n              });\n\n              if (index < 0) {\n                console.error(\"peer not in local signal list, aborting ...\");\n              } else {\n                peers.splice(index, 1);\n                this.writeStore(peers);\n              }\n\n            case 7:\n            case \"end\":\n              return _context2.stop();\n          }\n        }\n      }, _callee2, this);\n    }));\n\n    function leave() {\n      return _leave.apply(this, arguments);\n    }\n\n    return leave;\n  }();\n\n  _proto.wave = /*#__PURE__*/function () {\n    var _wave = _asyncToGenerator__default[\"default\"]( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {\n      var _this2 = this;\n\n      var peers, foundAndUpdated;\n      return regeneratorRuntime.wrap(function _callee3$(_context3) {\n        while (1) {\n          switch (_context3.prev = _context3.next) {\n            case 0:\n              if (this.peerId) {\n                _context3.next = 3;\n                break;\n              }\n\n              console.error(\"peer id not established, wave failed\");\n              return _context3.abrupt(\"return\", false);\n\n            case 3:\n              peers = this.readStore();\n              foundAndUpdated = false;\n              peers.map(function (peer) {\n                if (peer.id === _this2.peerId) {\n                  peer.last_seen = new Date().getTime();\n                  foundAndUpdated = true;\n                }\n              });\n              this.writeStore(peers);\n              return _context3.abrupt(\"return\", foundAndUpdated);\n\n            case 8:\n            case \"end\":\n              return _context3.stop();\n          }\n        }\n      }, _callee3, this);\n    }));\n\n    function wave() {\n      return _wave.apply(this, arguments);\n    }\n\n    return wave;\n  }();\n\n  return LocalSignaller;\n}();\n\nvar MuseSignaller = /*#__PURE__*/function () {\n  function MuseSignaller(peer, config) {\n    if (config === void 0) {\n      config = {};\n    }\n\n    console.info(\"using muse signaller\"); // set up signalling identification\n\n    if (config.sessionId) this.sessionId = config.sessionId;else if (config.worldName) this.worldName = config.worldName;else this.worldName = window.location.pathname; // where to point requests to\n\n    this.host = config.host || \"https://muse-web.onrender.com\";\n    if (config.sessionPassword) this.sessionPassword = config.sessionPassword;\n    if (peer.id) this.peerId = peer.id;\n  }\n\n  var _proto = MuseSignaller.prototype;\n\n  _proto.callBackend = /*#__PURE__*/function () {\n    var _callBackend = _asyncToGenerator__default[\"default\"]( /*#__PURE__*/regeneratorRuntime.mark(function _callee(path, body) {\n      return regeneratorRuntime.wrap(function _callee$(_context) {\n        while (1) {\n          switch (_context.prev = _context.next) {\n            case 0:\n              _context.next = 2;\n              return nodeFetch__default[\"default\"](this.host + \"/sessions/\" + path, {\n                method: \"POST\",\n                body: JSON.stringify(body),\n                headers: {\n                  \"Content-Type\": \"application/json\"\n                }\n              });\n\n            case 2:\n              return _context.abrupt(\"return\", _context.sent);\n\n            case 3:\n            case \"end\":\n              return _context.stop();\n          }\n        }\n      }, _callee, this);\n    }));\n\n    function callBackend(_x, _x2) {\n      return _callBackend.apply(this, arguments);\n    }\n\n    return callBackend;\n  }();\n\n  _proto.join = /*#__PURE__*/function () {\n    var _join = _asyncToGenerator__default[\"default\"]( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n      var body, response, json;\n      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n        while (1) {\n          switch (_context2.prev = _context2.next) {\n            case 0:\n              if (this.peerId) {\n                _context2.next = 3;\n                break;\n              }\n\n              console.error(\"peer id not established, aborting signal\");\n              return _context2.abrupt(\"return\");\n\n            case 3:\n              body = {\n                peer_id: this.peerId\n              };\n              if (this.sessionId) body.session_id = this.sessionId;else body.world = this.worldName;\n              if (this.sessionPassword) body.password = this.sessionPassword;\n              _context2.next = 8;\n              return this.callBackend(\"join\", body);\n\n            case 8:\n              response = _context2.sent;\n              _context2.next = 11;\n              return response.json();\n\n            case 11:\n              json = _context2.sent;\n\n              if (!(response.status !== 200)) {\n                _context2.next = 16;\n                break;\n              }\n\n              json = json;\n              console.error(\"failed to signal: \", json.message);\n              return _context2.abrupt(\"return\", undefined);\n\n            case 16:\n              json = json;\n              this.sessionId = json.session_id;\n              return _context2.abrupt(\"return\", json.peer_ids);\n\n            case 19:\n            case \"end\":\n              return _context2.stop();\n          }\n        }\n      }, _callee2, this);\n    }));\n\n    function join() {\n      return _join.apply(this, arguments);\n    }\n\n    return join;\n  }();\n\n  _proto.leave = /*#__PURE__*/function () {\n    var _leave = _asyncToGenerator__default[\"default\"]( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {\n      var body, response, json;\n      return regeneratorRuntime.wrap(function _callee3$(_context3) {\n        while (1) {\n          switch (_context3.prev = _context3.next) {\n            case 0:\n              if (!(!this.sessionId || !this.peerId)) {\n                _context3.next = 3;\n                break;\n              }\n\n              console.error(\"no session id / peer id, can't leave\");\n              return _context3.abrupt(\"return\");\n\n            case 3:\n              body = {\n                peer_id: this.peerId,\n                session_id: this.sessionId\n              };\n              _context3.next = 6;\n              return this.callBackend(\"leave\", body);\n\n            case 6:\n              response = _context3.sent;\n\n              if (!(response.status !== 200)) {\n                _context3.next = 12;\n                break;\n              }\n\n              _context3.next = 10;\n              return response.json();\n\n            case 10:\n              json = _context3.sent;\n              console.error(\"leave failed ... \", json.message);\n\n            case 12:\n            case \"end\":\n              return _context3.stop();\n          }\n        }\n      }, _callee3, this);\n    }));\n\n    function leave() {\n      return _leave.apply(this, arguments);\n    }\n\n    return leave;\n  }();\n\n  _proto.wave = /*#__PURE__*/function () {\n    var _wave = _asyncToGenerator__default[\"default\"]( /*#__PURE__*/regeneratorRuntime.mark(function _callee4() {\n      var body, response, json;\n      return regeneratorRuntime.wrap(function _callee4$(_context4) {\n        while (1) {\n          switch (_context4.prev = _context4.next) {\n            case 0:\n              if (!(!this.sessionId || !this.peerId)) {\n                _context4.next = 3;\n                break;\n              }\n\n              console.error(\"no session id / peer id, can't wave\");\n              return _context4.abrupt(\"return\", false);\n\n            case 3:\n              body = {\n                peer_id: this.peerId,\n                session_id: this.sessionId\n              };\n              _context4.next = 6;\n              return this.callBackend(\"wave\", body);\n\n            case 6:\n              response = _context4.sent;\n\n              if (!(response.status !== 200)) {\n                _context4.next = 13;\n                break;\n              }\n\n              _context4.next = 10;\n              return response.json();\n\n            case 10:\n              json = _context4.sent;\n              console.error(\"wave check failed ... \", json.message);\n              return _context4.abrupt(\"return\", false);\n\n            case 13:\n              return _context4.abrupt(\"return\", true);\n\n            case 14:\n            case \"end\":\n              return _context4.stop();\n          }\n        }\n      }, _callee4, this);\n    }));\n\n    function wave() {\n      return _wave.apply(this, arguments);\n    }\n\n    return wave;\n  }();\n\n  return MuseSignaller;\n}();\n\nvar MAX_TRIES = 4;\nvar useWaving = function useWaving(minuteFrequency, singaller, disconnect) {\n  var numFailed = react.useRef(0);\n  var waveLimiter = useLimiter(1 / (minuteFrequency * 60));\n  var failLimiter = useLimiter(1 / 10);\n  fiber.useFrame(function (_ref) {\n    var clock = _ref.clock;\n    if (!singaller || numFailed.current > MAX_TRIES) return;\n    var FAIL_STATE = numFailed.current > 0;\n\n    if (!(FAIL_STATE ? failLimiter : waveLimiter).isReady(clock)) {\n      return;\n    }\n\n    singaller.wave().then(function (succeeded) {\n      if (!succeeded) {\n        numFailed.current += 1;\n      } else {\n        numFailed.current = 0;\n      }\n\n      if (numFailed.current > MAX_TRIES) {\n        console.error(\"too many failed waves, disconnecting ...\");\n        disconnect();\n      }\n    });\n  });\n};\n\nfunction _createForOfIteratorHelperLoose$3(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray$3(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray$3(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray$3(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$3(o, minLen); }\n\nfunction _arrayLikeToArray$3(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\n/**\n * The most basic channel type just sends data to all the peers and receives\n * the same data.\n *\n * The state built locally, where the intention is that it can be recovered\n * on the fly.\n *\n * This is best used for data like streaming player position/rotation, where\n * old values don't matter.\n */\nvar StreamChannel = /*#__PURE__*/function () {\n  function StreamChannel(id, reducer, connections) {\n    this.id = id;\n    this.reducer = reducer;\n    this.connections = connections;\n    this.state = {};\n  }\n\n  var _proto = StreamChannel.prototype;\n\n  _proto.send = function send(data) {\n    for (var _iterator = _createForOfIteratorHelperLoose$3(this.connections.entries()), _step; !(_step = _iterator()).done;) {\n      var _step$value = _step.value,\n          conn = _step$value[1];\n\n      if (conn.open) {\n        conn.send({\n          id: this.id,\n          data: data\n        });\n      }\n    }\n  };\n\n  _proto.receive = function receive(message) {\n    this.reducer(message, this.state);\n  };\n\n  return StreamChannel;\n}();\n\nfunction _createForOfIteratorHelperLoose$2(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray$2(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray$2(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray$2(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$2(o, minLen); }\n\nfunction _arrayLikeToArray$2(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\n/**\n * This Channel is responsible for keeping one state synchronized across\n * all peers. It does this by keeping one local state.\n *\n * Every time a new connection appears, you \"greet\" them with a new state and a time\n * to represent when the peer was instantiated, letting older peers take precedence.\n *\n */\nvar SyncChannel = /*#__PURE__*/function () {\n  function SyncChannel(id, reducer, connections) {\n    this.id = id;\n    this.reducer = reducer;\n    this.initTime = new Date().getTime();\n    this.connections = connections;\n    this.state = {};\n  }\n\n  var _proto = SyncChannel.prototype;\n\n  _proto.send = function send(data) {\n    for (var _iterator = _createForOfIteratorHelperLoose$2(this.connections.entries()), _step; !(_step = _iterator()).done;) {\n      var _step$value = _step.value,\n          conn = _step$value[1];\n\n      if (conn.open) {\n        conn.send({\n          id: this.id,\n          data: data\n        });\n      }\n    }\n\n    this.reducer({\n      id: this.id,\n      data: data\n    }, this.state);\n  };\n\n  _proto.receive = function receive(message) {\n    if (message.greet) {\n      if (message.time && message.state) {\n        if (message.time < this.initTime) {\n          this.state = message.state;\n          this.initTime = message.time - 50; // add a buffer in case same peer sends it twice\n        }\n      }\n    } else {\n      this.reducer(message, this.state);\n    }\n  };\n\n  _proto.greet = function greet(conn) {\n    conn.send({\n      id: this.id,\n      time: this.initTime,\n      state: this.state,\n      greet: true\n    });\n  };\n\n  return SyncChannel;\n}();\n\nfunction _createForOfIteratorHelperLoose$1(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray$1(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray$1(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray$1(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$1(o, minLen); }\n\nfunction _arrayLikeToArray$1(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\nvar useChannels = function useChannels(connections) {\n  var channels = react.useMemo(function () {\n    return new Map();\n  }, []);\n\n  var receive = function receive(message) {\n    for (var _iterator = _createForOfIteratorHelperLoose$1(channels.entries()), _step; !(_step = _iterator()).done;) {\n      var _step$value = _step.value,\n          _id = _step$value[0],\n          channel = _step$value[1];\n\n      if (_id == message.id) {\n        channel.receive(message);\n      }\n    }\n  };\n\n  var greet = function greet(conn) {\n    for (var _iterator2 = _createForOfIteratorHelperLoose$1(channels.entries()), _step2; !(_step2 = _iterator2()).done;) {\n      var _step2$value = _step2.value,\n          channel = _step2$value[1];\n\n      if (channel instanceof SyncChannel) {\n        channel.greet(conn);\n      }\n    }\n  };\n\n  var useChannel = function useChannel(id, type, reducer) {\n    var channel = react.useMemo(function () {\n      if (type === \"stream\") return new StreamChannel(id, reducer, connections);\n      if (type === \"sync\") return new SyncChannel(id, reducer, connections);\n      return new StreamChannel(id, reducer, connections);\n    }, [id, type]); // keep reducer up to date\n\n    react.useEffect(function () {\n      channel.reducer = reducer;\n    }, [channel, reducer]); // keep channel registered\n\n    react.useEffect(function () {\n      if (channels.has(channel.id)) {\n        throw new Error(\"id '\" + channel.id + \"' has been taken, can't register channel ...\");\n      } else {\n        channels.set(channel.id, channel);\n      }\n\n      return function () {\n        if (!channels.has(channel.id)) return;\n        channels[\"delete\"](channel.id);\n      };\n    }, [channel]);\n    return channel;\n  };\n\n  return {\n    receive: receive,\n    greet: greet,\n    useChannel: useChannel\n  };\n};\n\n/**\n * WHen enabled, will ask user for mic permissions and return the local microphone stream\n * @param enabled\n */\n\nvar useMicrophone = function useMicrophone(enabled, inputDeviceId) {\n  if (enabled === void 0) {\n    enabled = true;\n  }\n\n  var _useEnvironment = useEnvironment(),\n      paused = _useEnvironment.paused;\n\n  var _useState = react.useState(true),\n      firstPaused = _useState[0],\n      setFirstPaused = _useState[1];\n\n  react.useEffect(function () {\n    return setFirstPaused(paused && firstPaused);\n  }, [paused, firstPaused]);\n\n  function iOS() {\n    return [\"iPad Simulator\", \"iPhone Simulator\", \"iPod Simulator\", \"iPad\", \"iPhone\", \"iPod\"].includes(navigator.platform) || // iPad on iOS 13 detection\n    navigator.userAgent.includes(\"Mac\") && \"ontouchend\" in document;\n  }\n\n  var _useState2 = react.useState(),\n      localStream = _useState2[0],\n      setLocalStream = _useState2[1]; // attempt to request permission for microphone, only try once\n\n\n  react.useEffect(function () {\n    var _navigator$mediaDevic;\n\n    // https://bugs.webkit.org/show_bug.cgi?id=230902#c47\n    if (!enabled || iOS() && firstPaused) return;\n    (_navigator$mediaDevic = navigator.mediaDevices) == null ? void 0 : _navigator$mediaDevic.getUserMedia({\n      audio: _extends__default[\"default\"]({\n        echoCancellation: true,\n        noiseSuppression: true,\n        autoGainControl: true\n      }, inputDeviceId ? {\n        deviceId: inputDeviceId\n      } : {})\n    }).then(function (stream) {\n      setLocalStream(stream);\n    })[\"catch\"](function (err) {\n      console.error(err);\n    });\n  }, [enabled, firstPaused, inputDeviceId]);\n  return localStream;\n};\n\nfunction _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n/**\n * When enabled, is responsible for requesting mic permissions, calling and answering peers to create media connections,\n * and closing media connections on disable\n *\n * @param enabled\n * @param peer\n * @param connections\n */\n\nvar useVoiceConnections = function useVoiceConnections(enabled, peer, connections, inputDeviceId) {\n  var mediaConns = react.useMemo(function () {\n    return new Map();\n  }, []);\n  var localStream = useMicrophone(enabled, inputDeviceId); // handle calling and answering peers\n\n  react.useEffect(function () {\n    if (!peer || !localStream || !enabled) return; // handle a new media connection (incoming or created\n\n    var handleMediaConn = function handleMediaConn(mediaConn) {\n      console.log(\"media connection opened with peer\", mediaConn.peer);\n      mediaConn.answer(localStream);\n      mediaConns.set(mediaConn.peer, mediaConn);\n      mediaConn.on(\"close\", function () {\n        console.log(\"closing voice stream with peer\", mediaConn.peer);\n        mediaConns[\"delete\"](mediaConn.peer);\n      });\n      mediaConn.on(\"error\", function (err) {\n        console.error(\"error with voice stream with peer\", mediaConn.peer, err);\n        mediaConns[\"delete\"](mediaConn.peer);\n      });\n    };\n\n    var call = function call(conn) {\n      console.log(\"calling peer with id\", conn.peer);\n      handleMediaConn(peer.call(conn.peer, localStream));\n      conn.on(\"close\", function () {\n        console.log(\"closing voice stream with peer\", conn.peer);\n        mediaConns[\"delete\"](conn.peer);\n      });\n    };\n\n    var handleDataConn = function handleDataConn(conn) {\n      conn.on(\"open\", function () {\n        return call(conn);\n      });\n    }; // set up incoming and outgoing calls for any future connections\n\n\n    peer.on(\"call\", handleMediaConn);\n    peer.on(\"connection\", handleDataConn); // call any already connected peers\n\n    for (var _iterator = _createForOfIteratorHelperLoose(connections), _step; !(_step = _iterator()).done;) {\n      var _step$value = _step.value,\n          peerId = _step$value[0],\n          conn = _step$value[1];\n      if (mediaConns.has(peerId)) return;\n      call(conn);\n    }\n\n    return function () {\n      peer.removeListener(\"call\", handleMediaConn);\n      peer.removeListener(\"connection\", call);\n    };\n  }, [connections, peer, localStream, mediaConns, enabled]); // close all media connections with peers on disable\n\n  react.useEffect(function () {\n    if (!enabled) {\n      mediaConns.forEach(function (conn) {\n        conn.close();\n        mediaConns[\"delete\"](conn.peer);\n      });\n    }\n  }, [enabled, mediaConns]);\n  return {\n    mediaConnections: mediaConns,\n    localStream: localStream\n  };\n};\n\nvar KEY = \"spacesvr-ice-servers\"; // 24 hours\n\nvar EXPIRE_TIME = 24 * 60 * 60 * 1000;\n\nvar storeLocalIceServers = function storeLocalIceServers(servers) {\n  var store = {\n    iceServers: servers,\n    time: new Date().getTime()\n  };\n  localStorage.setItem(KEY, JSON.stringify(store));\n};\n\nvar getLocalIceServers = function getLocalIceServers() {\n  var str = localStorage.getItem(KEY);\n  if (!str) return undefined;\n\n  try {\n    var res = JSON.parse(str); // clear if expired\n\n    if (new Date().getTime() - res.time > EXPIRE_TIME) {\n      localStorage.removeItem(KEY);\n      return undefined;\n    }\n\n    return res.iceServers;\n  } catch (err) {\n    return undefined;\n  }\n};\n\nvar getMuseIceServers = /*#__PURE__*/function () {\n  var _ref = _asyncToGenerator__default[\"default\"]( /*#__PURE__*/regeneratorRuntime.mark(function _callee(host) {\n    var local, res, json, servers;\n    return regeneratorRuntime.wrap(function _callee$(_context) {\n      while (1) {\n        switch (_context.prev = _context.next) {\n          case 0:\n            if (host === void 0) {\n              host = \"https://muse-web.onrender.com\";\n            }\n\n            local = getLocalIceServers();\n\n            if (!local) {\n              _context.next = 4;\n              break;\n            }\n\n            return _context.abrupt(\"return\", local);\n\n          case 4:\n            _context.prev = 4;\n            _context.next = 7;\n            return fetch(host + \"/sessions/get_ice\");\n\n          case 7:\n            res = _context.sent;\n            _context.next = 10;\n            return res.json();\n\n          case 10:\n            json = _context.sent;\n            servers = json.iceServers;\n            storeLocalIceServers(servers);\n            return _context.abrupt(\"return\", servers);\n\n          case 16:\n            _context.prev = 16;\n            _context.t0 = _context[\"catch\"](4);\n            console.error(\"failed to fetch ice servers\", _context.t0);\n            return _context.abrupt(\"return\", undefined);\n\n          case 20:\n          case \"end\":\n            return _context.stop();\n        }\n      }\n    }, _callee, null, [[4, 16]]);\n  }));\n\n  return function getMuseIceServers(_x) {\n    return _ref.apply(this, arguments);\n  };\n}();\n\nvar useConnection = function useConnection(externalConfig) {\n  var _useState = react.useState(false),\n      connected = _useState[0],\n      setConnected = _useState[1];\n\n  var _useState2 = react.useState(),\n      peer = _useState2[0],\n      setPeer = _useState2[1];\n\n  var connections = react.useMemo(function () {\n    return new Map();\n  }, []);\n\n  var _useState3 = react.useState(),\n      signaller = _useState3[0],\n      setSignaller = _useState3[1];\n\n  var channels = useChannels(connections); // given any connection, store and set up data channels\n\n  var registerConnection = function registerConnection(conn) {\n    conn.on(\"open\", function () {\n      console.log(\"connection opened with peer\", conn.peer);\n      conn.on(\"data\", function (message) {\n        return channels.receive(_extends__default[\"default\"]({\n          conn: conn\n        }, message));\n      });\n      conn.on(\"close\", function () {\n        console.log(\"connection closed with peer\");\n        connections[\"delete\"](conn.peer);\n      });\n      conn.on(\"error\", function () {\n        console.log(\"connection closed with peer\");\n        connections[\"delete\"](conn.peer);\n      });\n      channels.greet(conn);\n      connections.set(conn.peer, conn);\n    });\n  }; // attempt to connect to a p2p network\n\n\n  var connect = /*#__PURE__*/function () {\n    var _ref = _asyncToGenerator__default[\"default\"]( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(config) {\n      var finalConfig, servers, peerConfig, p;\n      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n        while (1) {\n          switch (_context2.prev = _context2.next) {\n            case 0:\n              console.log(\"connecting to network\");\n\n              if (!peer) {\n                _context2.next = 4;\n                break;\n              }\n\n              console.error(\"peer already created, aborting\");\n              return _context2.abrupt(\"return\");\n\n            case 4:\n              if (!connected) {\n                _context2.next = 7;\n                break;\n              }\n\n              console.error(\"already connected, aborting\");\n              return _context2.abrupt(\"return\");\n\n            case 7:\n              finalConfig = _extends__default[\"default\"]({}, externalConfig, config);\n\n              if (finalConfig.iceServers) {\n                _context2.next = 13;\n                break;\n              }\n\n              _context2.next = 11;\n              return getMuseIceServers(finalConfig.host);\n\n            case 11:\n              servers = _context2.sent;\n              if (servers) finalConfig.iceServers = servers;\n\n            case 13:\n              peerConfig = {};\n              if (finalConfig.iceServers) peerConfig.iceServers = finalConfig.iceServers;\n              p = new peerjs.Peer({\n                config: peerConfig\n              });\n              p.on(\"connection\", registerConnection); // incoming\n\n              p.on(\"close\", disconnect);\n              p.on(\"error\", function (err) {\n                if (err.message.includes(\"Could not connect to peer\")) {\n                  var messageWords = err.message.split(\" \");\n                  var connId = messageWords[messageWords.length - 1];\n                  console.error(\"could not establish connection to peer \" + connId);\n                } else {\n                  console.error(err);\n                }\n              });\n              p.on(\"open\", /*#__PURE__*/_asyncToGenerator__default[\"default\"]( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n                var s, ids;\n                return regeneratorRuntime.wrap(function _callee$(_context) {\n                  while (1) {\n                    switch (_context.prev = _context.next) {\n                      case 0:\n                        setConnected(true);\n                        s = isLocalNetwork() && !finalConfig.host ? new LocalSignaller(p) : new MuseSignaller(p, finalConfig);\n                        _context.next = 4;\n                        return s.join();\n\n                      case 4:\n                        ids = _context.sent;\n                        console.log(\"found peers:\", ids);\n\n                        if (ids) {\n                          _context.next = 8;\n                          break;\n                        }\n\n                        return _context.abrupt(\"return\");\n\n                      case 8:\n                        ids.map(function (id) {\n                          if (id === p.id) return;\n                          var conn = p.connect(id);\n                          registerConnection(conn);\n                        });\n                        setPeer(p);\n                        setSignaller(s);\n\n                      case 11:\n                      case \"end\":\n                        return _context.stop();\n                    }\n                  }\n                }, _callee);\n              })));\n\n            case 20:\n            case \"end\":\n              return _context2.stop();\n          }\n        }\n      }, _callee2);\n    }));\n\n    return function connect(_x) {\n      return _ref.apply(this, arguments);\n    };\n  }(); // attempt to disconnect from a p2p network\n\n\n  var disconnect = function disconnect() {\n    console.log(\"disconnecting from network\");\n\n    if (!connected) {\n      console.error(\"not connected, no need to disconnect\");\n      return;\n    }\n\n    if (!peer) {\n      console.error(\"peer doesn't exist, no need to disconnect\");\n      return;\n    }\n\n    if (!peer.disconnected) peer.disconnect();\n    if (signaller) signaller.leave();\n    connections.forEach(function (conn) {\n      return conn.close();\n    });\n    peer.destroy();\n    setConnected(false);\n    setPeer(undefined);\n  };\n\n  useWaving(1, signaller, disconnect);\n\n  var _useState4 = react.useState(!!externalConfig.voice),\n      voice = _useState4[0],\n      setVoice = _useState4[1];\n\n  var _useState5 = react.useState(),\n      inputDeviceId = _useState5[0],\n      setInputDevice = _useState5[1];\n\n  react.useEffect(function () {\n    return setVoice(!!externalConfig.voice);\n  }, [externalConfig.voice]);\n\n  var _useVoiceConnections = useVoiceConnections(voice, peer, connections, inputDeviceId),\n      mediaConnections = _useVoiceConnections.mediaConnections,\n      localStream = _useVoiceConnections.localStream;\n\n  return {\n    connected: connected,\n    connect: connect,\n    disconnect: disconnect,\n    connections: connections,\n    useChannel: channels.useChannel,\n    voice: voice,\n    setVoice: setVoice,\n    localStream: localStream,\n    mediaConnections: mediaConnections,\n    setInputDevice: setInputDevice\n  };\n};\n\nvar _excluded$a = [\"time\"];\nvar useModifiedStandardShader = function useModifiedStandardShader(config, vert, frag) {\n  var _config$time = config.time,\n      time = _config$time === void 0 ? true : _config$time,\n      rest = _objectWithoutPropertiesLoose__default[\"default\"](config, _excluded$a);\n\n  var mat = react.useMemo(function () {\n    var material = new three.MeshStandardMaterial(_extends__default[\"default\"]({\n      side: three.DoubleSide\n    }, rest));\n\n    material.onBeforeCompile = function (shader) {\n      shader.uniforms.time = new three.Uniform(0);\n      var uniforms = \"\\n        varying vec2 vUv;\\n        varying vec3 vNorm;\\n        varying vec3 vPos;\\n        uniform float time;\\n      \";\n      var varyingSet = \"\\n        vUv = uv;\\n        vPos = (modelMatrix * vec4(transformed, 1.0)).xyz;\\n      \";\n      shader.vertexShader = uniforms + shader.vertexShader.replace(\"#include <worldpos_vertex>\", vert + varyingSet + \"\\n#include <worldpos_vertex>\\n\");\n      shader.vertexShader = shader.vertexShader.replace(\"#include <begin_vertex>\", \"#include <begin_vertex>\\n\" + \"vNorm = normal;\\n\"); // gets inserted right here: https://github.com/mrdoob/three.js/blob/f16386d8bb3db60ce4f6254ccf006c2e0b90bc1c/src/renderers/shaders/ShaderLib/meshphysical.glsl.js#L171\n\n      shader.fragmentShader = uniforms + shader.fragmentShader.replace(\"#include <emissivemap_fragment>\", \"#include <emissivemap_fragment>\\n\" + frag);\n      material.userData.shader = shader;\n    };\n\n    material.customProgramCacheKey = function () {\n      return frag + vert + JSON.stringify(rest);\n    };\n\n    return material;\n  }, [frag, rest, time, vert]);\n  useLimitedFrame(70, function (_ref) {\n    var _mat$userData$shader, _mat$userData$shader$;\n\n    var clock = _ref.clock;\n    if (!time || !((_mat$userData$shader = mat.userData.shader) != null && (_mat$userData$shader$ = _mat$userData$shader.uniforms) != null && _mat$userData$shader$.time)) return;\n    mat.userData.shader.uniforms.time.value = clock.elapsedTime;\n  });\n  return mat;\n};\n\nvar vert = \"\\n\";\nvar GRAY = \"vec3(0.6)\";\nvar frag = \"\\n    diffuseColor.rgb = \" + GRAY + \";\\n    \\n    // apply grip\\n    float radius = 0.25;\\n    vec2 l = (fract((vUv - vec2(0.21, 0.)) * vec2(9., 0.)) - vec2(0.5, 0.));\\n    float blur = 5.;\\n    float circle_mask = 1.0 - smoothstep(radius - (radius * blur),radius + (radius * blur),dot(l,l) * 2.0);\\n    float side_mask = pow(abs(dot(vNorm, vec3(1.0, 0.0, 0.0))), 0.9);\\n    float up_mask = 0.2 * pow(dot(vNorm, vec3(0.0, 1.0, 0.0)), 1.);\\n    float grip_mask = min(1., (side_mask + up_mask)) * circle_mask;\\n    diffuseColor.rgb *= clamp(1. - (0.8 * grip_mask), 0., 1.);\\n    \\n    // apply speaker and mic\\n    // create mask for facing the camera\\n    float facing_mask = pow(clamp(dot(vNorm, vec3(0., 0., 1.0)), 0., 1.), 2000.);\\n    // create a mask for the bottom of the phone\\n    float bottom_mask = smoothstep(0.0, 0.2, abs(vUv.y + 0.1));\\n    float speaker_mask = facing_mask * bottom_mask;\\n    // diffuseColor.rgb = mix(diffuseColor.rgb, vec3(0.9), speaker_mask);\\n\";\n\nfunction TalkieModel(props) {\n  var width = props.width,\n      height = props.height,\n      depth = props.depth;\n  var mat = useModifiedStandardShader({\n    color: \"#cbcbcb\"\n  }, vert, frag);\n  var ANTENNA_WIDTH = width * 0.22;\n  var ANTENNA_HEIGHT = height * 0.45;\n  return /*#__PURE__*/React.createElement(\"group\", {\n    name: \"model\"\n  }, /*#__PURE__*/React.createElement(RoundedBox, {\n    args: [width, height, depth],\n    material: mat\n  }), /*#__PURE__*/React.createElement(RoundedBox, {\n    args: [ANTENNA_WIDTH, ANTENNA_HEIGHT, depth],\n    material: mat,\n    \"position-x\": -width / 2 + ANTENNA_WIDTH / 2,\n    \"position-y\": height / 2\n  }));\n}\n\nvar _excluded$9 = [\"width\", \"height\", \"children\"];\nfunction Pane(props) {\n  var width = props.width,\n      height = props.height,\n      children = props.children,\n      rest = _objectWithoutPropertiesLoose__default[\"default\"](props, _excluded$9);\n\n  var BORDER = 0.0075;\n  return /*#__PURE__*/React.createElement(\"group\", _extends__default[\"default\"]({\n    name: \"pane\"\n  }, rest), /*#__PURE__*/React.createElement(\"mesh\", {\n    material: cache.mat_standard_black\n  }, /*#__PURE__*/React.createElement(\"planeBufferGeometry\", {\n    args: [width + BORDER * 2, height + BORDER * 2]\n  })), /*#__PURE__*/React.createElement(\"mesh\", {\n    \"position-z\": 0.001\n  }, /*#__PURE__*/React.createElement(\"planeBufferGeometry\", {\n    args: [width, height]\n  }), /*#__PURE__*/React.createElement(\"meshStandardMaterial\", {\n    color: \"#20C20E\"\n  })), /*#__PURE__*/React.createElement(\"group\", {\n    name: \"content\",\n    \"position-z\": 0.002\n  }, children));\n}\n\nvar _excluded$8 = [\"onClick\", \"width\", \"children\", \"index\"];\nfunction Option(props) {\n  var onClick = props.onClick,\n      width = props.width,\n      children = props.children,\n      index = props.index,\n      rest = _objectWithoutPropertiesLoose__default[\"default\"](props, _excluded$8);\n\n  var _useState = react.useState(false),\n      hovered = _useState[0],\n      setHovered = _useState[1];\n\n  var _useSpring = three$1.useSpring({\n    color: hovered ? \"#b3b3b3\" : \"#ffffff\"\n  }),\n      color = _useSpring.color;\n\n  var PADDING_X = 0.015;\n  var PADDING_Y = 0.0125;\n  var FONT_SIZE = 0.02;\n  var DEPTH = 0.01;\n  var CLIP_WIDTH = index === 0 ? width - PADDING_X * 4 : width - PADDING_X * 2;\n  return /*#__PURE__*/React.createElement(\"group\", _extends__default[\"default\"]({\n    name: \"option\"\n  }, rest), /*#__PURE__*/React.createElement(RoundedBox, {\n    args: [width, FONT_SIZE + PADDING_Y * 2, DEPTH]\n  }, /*#__PURE__*/React.createElement(three$1.animated.meshStandardMaterial, {\n    color: color\n  })), /*#__PURE__*/React.createElement(HitBox, {\n    args: [width, FONT_SIZE + PADDING_Y * 2, DEPTH],\n    onClick: onClick,\n    onHover: function onHover() {\n      return setHovered(true);\n    },\n    onUnHover: function onUnHover() {\n      return setHovered(false);\n    }\n  }), /*#__PURE__*/React.createElement(\"group\", {\n    \"position-z\": DEPTH / 2 + 0.001\n  }, /*#__PURE__*/React.createElement(drei.Text, {\n    fontSize: FONT_SIZE,\n    color: \"black\",\n    anchorX: \"left\",\n    \"position-x\": -width / 2 + PADDING_X,\n    maxWidth: width // @ts-ignore\n    ,\n    whiteSpace: \"nowrap\",\n    clipRect: [0, -Infinity, CLIP_WIDTH, Infinity]\n  }, children)));\n}\n\nvar _excluded$7 = [\"value\", \"items\", \"onChange\", \"width\"];\nfunction DropDown(props) {\n  var _items$find;\n\n  var value = props.value,\n      items = props.items,\n      onChange = props.onChange,\n      _props$width = props.width,\n      width = _props$width === void 0 ? 1 : _props$width,\n      rest = _objectWithoutPropertiesLoose__default[\"default\"](props, _excluded$7);\n\n  var _useState = react.useState(false),\n      reset = _useState[0],\n      setReset = _useState[1];\n\n  var _useState2 = react.useState(false),\n      open = _useState2[0],\n      setOpen = _useState2[1];\n\n  var _useState3 = react.useState(0),\n      localIndex = _useState3[0],\n      setLocalIndex = _useState3[1];\n\n  var val = (_items$find = items.find(function (it) {\n    return it.value == value;\n  })) != null ? _items$find : items[localIndex];\n\n  var setVal = function setVal(value) {\n    var ind = items.findIndex(function (it) {\n      return it.value == value;\n    });\n    if (ind === -1) return;\n    if (onChange) onChange(items[ind]);\n    setLocalIndex(ind);\n  }; // keep local index up to date with incoming value\n\n\n  react.useEffect(function () {\n    if (!val) return;\n    var ind = items.findIndex(function (item) {\n      return item.value === (val == null ? void 0 : val.value);\n    });\n    if (ind === -1 || localIndex === ind) return;\n    setLocalIndex(ind);\n  }, [items, localIndex, val]);\n  var arr = open ? [].concat(items).sort(function (x, y) {\n    return x == val ? -1 : y == val ? 1 : 0;\n  }) : val ? [val] : [];\n  var transition = core.useTransition(arr, {\n    keys: function keys(item) {\n      return item.value;\n    },\n    trail: 300 / items.length,\n    from: {\n      scale: 0,\n      y: 0\n    },\n    enter: function enter(a, i) {\n      return {\n        scale: 1,\n        y: -0.05 * i\n      };\n    },\n    update: function update(a, i) {\n      return {\n        scale: 1,\n        y: -0.05 * i\n      };\n    },\n    leave: {\n      scale: 0,\n      y: 0\n    },\n    reset: reset,\n    onRest: function onRest() {\n      return setReset(false);\n    }\n  });\n\n  var _useSpring = three$1.useSpring({\n    rot: open ? Math.PI : 0,\n    posZ: open ? 0.025 : 0\n  }),\n      rot = _useSpring.rot,\n      posZ = _useSpring.posZ;\n\n  var _onClick = function onClick(value) {\n    if (open) {\n      setVal(value);\n      setReset(true);\n    }\n\n    setOpen(!open);\n  };\n\n  return /*#__PURE__*/React.createElement(\"group\", _extends__default[\"default\"]({\n    name: \"spacesvr-dropdown\"\n  }, rest), /*#__PURE__*/React.createElement(three$1.a.group, {\n    \"position-z\": posZ\n  }, transition(function (_ref, it, t, index) {\n    var scale = _ref.scale,\n        y = _ref.y;\n    return /*#__PURE__*/React.createElement(three$1.a.group, {\n      scale: scale,\n      \"position-y\": y\n    }, /*#__PURE__*/React.createElement(Option, {\n      onClick: function onClick() {\n        return _onClick(it.value);\n      },\n      width: width,\n      index: index\n    }, it.text));\n  }), items.length > 1 && /*#__PURE__*/React.createElement(three$1.a.group, {\n    \"rotation-z\": rot,\n    \"position-x\": width / 2 - 0.03 / 2 - 0.01,\n    \"position-z\": 0.01 / 2 + 0.001\n  }, /*#__PURE__*/React.createElement(Image$1, {\n    src: \"https://d27rt3a60hh1lx.cloudfront.net/icons/chevron-down.ktx2\",\n    scale: 0.03\n  }))));\n}\n\nfunction VoiceLevels(props) {\n  var _useNetwork = useNetwork(),\n      localStream = _useNetwork.localStream;\n\n  var _useState = react.useState(),\n      analyser = _useState[0],\n      setAnalyser = _useState[1];\n\n  var _useState2 = react.useState(document.createElement(\"canvas\")),\n      canvas = _useState2[0];\n\n  var _useState3 = react.useState(new Uint8Array(128)),\n      dataArray = _useState3[0];\n\n  var canvasTexture = react.useRef(null);\n  react.useEffect(function () {\n    if (!localStream) return; // @ts-ignore\n\n    var audioCtx = new (window.AudioContext || window.webkitAudioContext)();\n    var analyser = audioCtx.createAnalyser();\n    analyser.fftSize = 128;\n    var bufferLength = analyser.frequencyBinCount;\n    var dataArray = new Uint8Array(bufferLength);\n    analyser.getByteTimeDomainData(dataArray);\n    analyser.smoothingTimeConstant = 0.8;\n    var source = audioCtx.createMediaStreamSource(localStream);\n    source.connect(analyser);\n    setAnalyser(analyser);\n  }, [localStream]);\n  fiber.useFrame(function () {\n    var canvasCtx = canvas.getContext(\"2d\");\n    if (!analyser || !canvasCtx || !canvasTexture.current) return;\n    canvasTexture.current.needsUpdate = true;\n    analyser.getByteFrequencyData(dataArray);\n    analyser.smoothingTimeConstant = 0.85;\n    canvasCtx.clearRect(0, 0, canvas.width, canvas.height); // canvasCtx.fillStyle = \"#20C20E\";\n    // canvasCtx.fillRect(0, 0, canvas.width, canvas.height);\n\n    canvasCtx.fillStyle = \"rgb(0, 0, 0)\";\n    var buckets = 6;\n    var spacing = 4;\n    var height = 20;\n    var sliceWidth = canvas.width / buckets - spacing;\n    var x = 0;\n\n    for (var b = 0; b < buckets; b++) {\n      var base_perc = 0.2;\n      var realY = (dataArray[b] / 256.0 * (1 - base_perc) + base_perc) * canvas.height;\n      var y = 0;\n\n      while (y < realY) {\n        var nextY = Math.min(y + height, realY);\n        canvasCtx.fillRect(x, canvas.height - y, sliceWidth, height);\n        y = nextY + spacing;\n      }\n\n      x += sliceWidth + spacing;\n    }\n  });\n  if (!localStream) return null;\n  return /*#__PURE__*/React.createElement(\"group\", _extends__default[\"default\"]({\n    name: \"voice-levels\"\n  }, props), /*#__PURE__*/React.createElement(\"mesh\", null, /*#__PURE__*/React.createElement(\"planeBufferGeometry\", {\n    args: [0.095, 0.075]\n  }), /*#__PURE__*/React.createElement(\"meshStandardMaterial\", {\n    transparent: true\n  }, /*#__PURE__*/React.createElement(\"canvasTexture\", {\n    // minFilter={LinearFilter}\n    ref: canvasTexture,\n    args: [canvas],\n    attach: \"map\"\n  }))));\n}\n\nvar _excluded$6 = [\"width\"];\nfunction Request(props) {\n  var width = props.width,\n      rest = _objectWithoutPropertiesLoose__default[\"default\"](props, _excluded$6);\n\n  var FONT_SIZE = 0.0225;\n  var DEPTH = 0.01;\n  var PADDING_Y = 0.0125;\n  var NOT_AVAILABLE = !navigator.mediaDevices || !navigator.mediaDevices.getUserMedia;\n  var message = NOT_AVAILABLE ? \"this site cannot access your microphone\" : \"give this site access to your microphone to talk!\";\n  return /*#__PURE__*/React.createElement(\"group\", rest, /*#__PURE__*/React.createElement(drei.Text, {\n    fontSize: FONT_SIZE,\n    color: \"black\",\n    \"position-z\": DEPTH / 2 + 0.001,\n    maxWidth: width,\n    textAlign: \"center\"\n  }, message), /*#__PURE__*/React.createElement(RoundedBox, {\n    args: [width, FONT_SIZE * 2 + PADDING_Y * 4, DEPTH],\n    material: cache.mat_standard_white\n  }));\n}\n\nvar _excluded$5 = [\"width\"];\nfunction MicAccess(props) {\n  var width = props.width,\n      rest = _objectWithoutPropertiesLoose__default[\"default\"](props, _excluded$5);\n\n  var _useNetwork = useNetwork(),\n      localStream = _useNetwork.localStream,\n      setInputDevice = _useNetwork.setInputDevice;\n\n  var _useState = react.useState([]),\n      inputDevices = _useState[0],\n      setInputDevices = _useState[1];\n\n  var _useState2 = react.useState(),\n      selectedDevice = _useState2[0],\n      setSelectedDevice = _useState2[1];\n\n  var _useState3 = react.useState(false),\n      loading = _useState3[0],\n      setLoading = _useState3[1];\n\n  var _useState4 = react.useState(false),\n      mute = _useState4[0],\n      setMute = _useState4[1];\n\n  var permissionGranted = !!localStream;\n  var refreshDevices = react.useCallback(function () {\n    var _navigator$mediaDevic;\n\n    (_navigator$mediaDevic = navigator.mediaDevices) == null ? void 0 : _navigator$mediaDevic.enumerateDevices().then(function (devices) {\n      devices = devices.filter(function (device) {\n        return device.kind === \"audioinput\";\n      });\n      devices = devices.filter(function (device, index) {\n        return devices.findIndex(function (d) {\n          return d.groupId === device.groupId;\n        }) === index;\n      });\n      setInputDevices(devices);\n    });\n  }, []);\n  react.useEffect(function () {\n    if (localStream) refreshDevices();\n  }, [localStream, refreshDevices]);\n  react.useEffect(function () {\n    if (!navigator.mediaDevices) return;\n\n    navigator.mediaDevices.ondevicechange = function () {\n      return refreshDevices();\n    };\n  }, [refreshDevices]);\n  react.useEffect(function () {\n    var id = localStream == null ? void 0 : localStream.getTracks()[0].getSettings().deviceId;\n    setLoading(!!selectedDevice && selectedDevice !== id);\n  }, [localStream, selectedDevice]);\n  react.useEffect(function () {\n    if (!localStream) return;\n    localStream.getAudioTracks()[0].enabled = !mute;\n  }, [localStream, mute]);\n  return /*#__PURE__*/React.createElement(\"group\", _extends__default[\"default\"]({\n    name: \"mic-access\"\n  }, rest), /*#__PURE__*/React.createElement(Pane, {\n    width: width,\n    height: 0.1\n  }, /*#__PURE__*/React.createElement(Image$1, {\n    src: mute || !permissionGranted ? \"https://d27rt3a60hh1lx.cloudfront.net/icons/microphone-off.ktx2\" : \"https://d27rt3a60hh1lx.cloudfront.net/icons/microphone.ktx2\",\n    scale: 0.075,\n    \"position-x\": -width / 2 + 0.075 / 2 + 0.04\n  }), /*#__PURE__*/React.createElement(\"group\", {\n    \"position-x\": width / 2 - 0.075 / 2 - 0.04\n  }, loading || !permissionGranted && /*#__PURE__*/React.createElement(Spinning, {\n    ySpeed: 0,\n    zSpeed: 2\n  }, /*#__PURE__*/React.createElement(Image$1, {\n    src: \"https://d27rt3a60hh1lx.cloudfront.net/icons/loader.ktx2\",\n    scale: 0.075\n  })), !loading && /*#__PURE__*/React.createElement(VoiceLevels, {\n    \"position-x\": -0.01\n  })), permissionGranted && /*#__PURE__*/React.createElement(\"group\", {\n    \"position-y\": -0.095\n  }, /*#__PURE__*/React.createElement(Switch, {\n    value: mute,\n    onChange: setMute,\n    scale: 0.4,\n    \"position-x\": 0.07\n  }), /*#__PURE__*/React.createElement(drei.Text, {\n    fontSize: 0.035,\n    anchorX: \"right\",\n    \"position-x\": -0.01,\n    color: \"black\"\n  }, \"mute\")), permissionGranted && /*#__PURE__*/React.createElement(DropDown, {\n    \"position-y\": -0.15,\n    value: localStream == null ? void 0 : localStream.getTracks()[0].getSettings().deviceId,\n    items: inputDevices.map(function (device, i) {\n      return {\n        text: device.label || \"microphone \" + i,\n        value: device.deviceId\n      };\n    }),\n    width: width,\n    \"position-z\": 0,\n    onChange: function onChange(item) {\n      setInputDevice(item.value);\n      setSelectedDevice(item.value);\n    }\n  }), !permissionGranted && /*#__PURE__*/React.createElement(Request, {\n    \"position-y\": -0.125,\n    \"position-z\": 0.15,\n    width: width\n  })));\n}\n\nvar FONT_URL$3 = \"https://d27rt3a60hh1lx.cloudfront.net/fonts/Quicksand_Bold.otf\";\nfunction WalkieTalkie() {\n  var TOOL_NAME = \"Walkie Talkie\";\n  var toolbelt = useToolbelt();\n\n  var _useEnvironment = useEnvironment(),\n      device = _useEnvironment.device;\n\n  var WIDTH = 0.5;\n  var HEIGHT = 0.55;\n  var DEPTH = 0.1;\n  return /*#__PURE__*/React.createElement(Tool, {\n    name: TOOL_NAME,\n    pos: [0, 0],\n    range: device.mobile ? 0 : 0.2,\n    pinY: true\n  }, /*#__PURE__*/React.createElement(\"group\", {\n    \"position-y\": -0.05,\n    scale: 1.25\n  }, /*#__PURE__*/React.createElement(TalkieModel, {\n    width: WIDTH,\n    height: HEIGHT,\n    depth: DEPTH\n  }), /*#__PURE__*/React.createElement(\"group\", {\n    name: \"content\",\n    \"position-z\": 0.1 / 2 + 0.001\n  }, /*#__PURE__*/React.createElement(MicAccess, {\n    \"position-y\": 0.15,\n    width: WIDTH * 0.65\n  }), /*#__PURE__*/React.createElement(drei.Text, {\n    fontSize: 0.022,\n    color: \"black\",\n    font: FONT_URL$3,\n    maxWidth: WIDTH * 0.5,\n    anchorY: \"top\",\n    \"position-y\": -0.05,\n    textAlign: \"center\",\n    scale: 1.1\n  }, \"proximity voice chat is enabled in this world.\\n\\nwalk up to someone and say hello!\"), /*#__PURE__*/React.createElement(Button$1, {\n    onClick: function onClick() {\n      return toolbelt.hide();\n    },\n    fontSize: 0.03,\n    \"position-y\": -0.21,\n    \"rotation-x\": -0.4,\n    color: \"#f2445e\"\n  }, \"close\"))));\n}\n\nvar _excluded$4 = [\"children\", \"disableEntities\", \"autoconnect\"];\nfunction Network(props) {\n  var children = props.children,\n      disableEntities = props.disableEntities,\n      autoconnect = props.autoconnect,\n      connectionConfig = _objectWithoutPropertiesLoose__default[\"default\"](props, _excluded$4);\n\n  var connection = useConnection(connectionConfig);\n  var connected = connection.connected,\n      connect = connection.connect,\n      disconnect = connection.disconnect; // connect on start if autoconnect is enabled\n\n  react.useEffect(function () {\n    if (autoconnect) connect();\n  }, [autoconnect]); // log status on changes\n\n  var lastVal = react.useRef(false);\n  react.useEffect(function () {\n    if (lastVal.current !== connected) {\n      console.info(\"network \" + (connected ? \"connected\" : \"disconnected\"));\n      lastVal.current = connected;\n    }\n  }, [connected]); // disconnect on the way out (i hope it works)\n\n  react.useEffect(function () {\n    window.addEventListener(\"beforeunload\", disconnect);\n    return function () {\n      return window.removeEventListener(\"beforeunload\", disconnect);\n    };\n  }, [disconnect]);\n  return /*#__PURE__*/React.createElement(NetworkContext.Provider, {\n    value: connection\n  }, !disableEntities && /*#__PURE__*/React.createElement(NetworkedEntities, null), connection.voice && /*#__PURE__*/React.createElement(WalkieTalkie, null), children);\n}\n\nvar _excluded$3 = [\"children\"];\nvar defaultPhysicsProps = {\n  size: 50,\n  allowSleep: false,\n  gravity: [0, -9.8, 0],\n  defaultContactMaterial: {\n    friction: 0\n  }\n};\nfunction Physics(props) {\n  var children = props.children,\n      physicsProps = _objectWithoutPropertiesLoose__default[\"default\"](props, _excluded$3);\n\n  return /*#__PURE__*/React.createElement(cannon.Physics, _extends__default[\"default\"]({}, defaultPhysicsProps, physicsProps), /*#__PURE__*/React.createElement(react.Suspense, {\n    fallback: null\n  }, children));\n}\n\nfunction StandardReality(props) {\n  var children = props.children,\n      environmentProps = props.environmentProps,\n      physicsProps = props.physicsProps,\n      networkProps = props.networkProps,\n      playerProps = props.playerProps,\n      toolbeltProps = props.toolbeltProps,\n      _props$disableGround = props.disableGround,\n      disableGround = _props$disableGround === void 0 ? false : _props$disableGround;\n  return /*#__PURE__*/React.createElement(Environment, environmentProps, /*#__PURE__*/React.createElement(Physics, physicsProps, /*#__PURE__*/React.createElement(Player, playerProps, /*#__PURE__*/React.createElement(Toolbelt, toolbeltProps, /*#__PURE__*/React.createElement(Network, networkProps, /*#__PURE__*/React.createElement(Visual, null, !disableGround && /*#__PURE__*/React.createElement(InfinitePlane, null), children))))));\n}\n\nvar usePhotography = function usePhotography(cam) {\n  var _useEnvironment = useEnvironment(),\n      device = _useEnvironment.device;\n\n  var _useThree = fiber.useThree(),\n      scene = _useThree.scene;\n\n  var _useState = react.useState(),\n      data = _useState[0],\n      setData = _useState[1];\n\n  var resolution = react.useMemo(function () {\n    return new three.Vector2(3, 2).normalize().multiplyScalar(2186);\n  }, []);\n  var aspect = react.useMemo(function () {\n    return resolution.clone().normalize();\n  }, [resolution]);\n  var target = react.useMemo(function () {\n    return new three.WebGLRenderTarget(resolution.x, resolution.y, {\n      stencilBuffer: true,\n      // text boxes look strange without this idk man\n      minFilter: three.NearestFilter,\n      magFilter: three.NearestFilter,\n      format: three.RGBAFormat\n    });\n  }, [resolution]);\n  var renderer = react.useMemo(function () {\n    var r = new three.WebGLRenderer({\n      preserveDrawingBuffer: true,\n      precision: \"highp\",\n      antialias: true\n    });\n    r.physicallyCorrectLights = true;\n    r.toneMapping = three.NoToneMapping;\n    r.outputEncoding = three.sRGBEncoding;\n    return r;\n  }, []);\n  react.useEffect(function () {\n    renderer.setSize(target.width, target.height);\n    renderer.setPixelRatio(device.desktop ? 2 : 1); // could be 3, just really fat\n  }, [device.desktop, target.width, target.height, renderer]);\n  var takePicture = react.useCallback(function () {\n    if (!cam.current) return;\n    document.body.append(renderer.domElement);\n    cam.current.aspect = aspect.x / aspect.y;\n    renderer.render(scene, cam.current);\n    var today = new Date();\n    var name = document.title + \" - www.muse.place\" + window.location.pathname + \" - \" + today.toLocaleDateString(\"en-US\") + \" \" + today.getHours() + \":\" + today.getMinutes();\n\n    if (!device.mobile) {\n      var link = document.createElement(\"a\");\n      link.download = name + \".jpg\";\n      link.href = renderer.domElement.toDataURL(\"image/jpeg\");\n      link.click();\n      link.remove();\n    } else {\n      setData(renderer.domElement.toDataURL(\"image/jpeg\"));\n    }\n\n    document.body.removeChild(renderer.domElement);\n  }, [aspect.x, aspect.y, cam, device.mobile, renderer, scene]);\n  return {\n    resolution: resolution,\n    aspect: aspect,\n    takePicture: takePicture,\n    target: target,\n    renderer: renderer,\n    data: {\n      value: data,\n      set: setData\n    }\n  };\n};\n\nvar useRendering = function useRendering(enabled, cam, group, mesh, photo) {\n  var _useEnvironment = useEnvironment(),\n      paused = _useEnvironment.paused;\n\n  var _useThree = fiber.useThree(),\n      scene = _useThree.scene;\n\n  var dummy = react.useMemo(function () {\n    return new three.Vector3();\n  }, []);\n  var qummy = react.useMemo(function () {\n    return new three.Quaternion();\n  }, []); // prep render the camera until first pause to compile materials in advance rather than first time tool is enabled\n\n  var prepRendering = react.useRef(true);\n  react.useEffect(function () {\n    if (!paused) prepRendering.current = false;\n  }, [paused]);\n  useLimitedFrame(1 / 4, function (state) {\n    if (enabled || !prepRendering.current || !cam.current) return; // don't double render\n\n    state.gl.autoClear = true;\n    state.gl.setRenderTarget(photo.target);\n    state.gl.render(scene, cam.current);\n    state.gl.setRenderTarget(null);\n    state.gl.autoClear = false;\n  });\n  useLimitedFrame(24, function (state) {\n    if (!cam.current || !mesh.current || !group.current || !enabled) return; // move mesh to camera's position\n\n    mesh.current.getWorldPosition(dummy);\n    mesh.current.getWorldQuaternion(qummy);\n    cam.current.position.set(0, 0, 0.3).applyQuaternion(qummy); // move back 0.3m\n\n    cam.current.position.add(dummy);\n    cam.current.rotation.setFromQuaternion(qummy);\n    cam.current.aspect = photo.aspect.x / photo.aspect.y;\n    cam.current.updateProjectionMatrix(); // render to camera viewfinder\n\n    state.gl.autoClear = true;\n    state.gl.setRenderTarget(photo.target);\n    state.gl.render(scene, cam.current);\n    state.gl.setRenderTarget(null);\n    state.gl.autoClear = false;\n  });\n};\n\nvar FONT_FILE = \"https://d27rt3a60hh1lx.cloudfront.net/fonts/Quicksand_Bold.otf\";\nfunction Instruction(props) {\n  var open = props.open;\n      props.setOpen;\n\n  var _useEnvironment = useEnvironment(),\n      device = _useEnvironment.device;\n\n  var CLOSED_SCALE = device.mobile ? 0.5 : 0.5;\n\n  var _useSpring = three$1.useSpring({\n    scale: open ? 0 : CLOSED_SCALE\n  }),\n      scale = _useSpring.scale;\n\n  var FONT_SIZE = 0.055;\n  var DESKTOP_TEXT = \"Press          to \" + (open ? \"close\" : \"open\");\n  var MOBILE_TEXT = \"tap to open\";\n  return /*#__PURE__*/React.createElement(three$1.a.group, {\n    scale: scale,\n    \"position-x\": device.mobile ? -0.05 : -0.45,\n    \"position-y\": device.mobile ? -0.2 : 0.1,\n    \"position-z\": 0.25,\n    \"rotation-x\": 0.1,\n    \"rotation-y\": -0.4\n  }, /*#__PURE__*/React.createElement(Floating, {\n    height: FONT_SIZE * 0.1,\n    speed: device.mobile ? 8 : 0\n  }, /*#__PURE__*/React.createElement(drei.Text, {\n    color: \"white\",\n    fontSize: FONT_SIZE,\n    maxWidth: 100,\n    textAlign: \"center\",\n    outlineColor: \"black\",\n    outlineWidth: FONT_SIZE * 0.1,\n    font: FONT_FILE,\n    \"position-y\": -0.02\n  }, device.mobile ? MOBILE_TEXT : DESKTOP_TEXT)), device.desktop && /*#__PURE__*/React.createElement(Floating, {\n    height: FONT_SIZE * 0.1,\n    speed: 8\n  }, /*#__PURE__*/React.createElement(Key, {\n    keyCode: \"C\",\n    keyPress: [\"c\", \"C\"],\n    scale: 0.1,\n    \"position-x\": -0.035,\n    \"position-z\": 0.1,\n    \"rotation-x\": -0.3\n  })));\n}\n\nvar _excluded$2 = [\"cam\", \"open\", \"fov\"];\nvar FONT_URL$2 = \"https://d27rt3a60hh1lx.cloudfront.net/fonts/Quicksand_Bold.otf\";\nfunction DesktopControls(props) {\n  var cam = props.cam;\n      props.open;\n      var fov = props.fov,\n      rest = _objectWithoutPropertiesLoose__default[\"default\"](props, _excluded$2);\n\n  var LINE_LENGTH = 0.05;\n  var LINE_THICKNESS = 0.008;\n  var AREA_WIDTH = 0.24;\n  var INDICATOR_WIDTH = 0.18;\n\n  var _useSpring = three$1.useSpring({\n    posX: fov.normalized * -INDICATOR_WIDTH + INDICATOR_WIDTH / 2\n  }),\n      posX = _useSpring.posX;\n\n  react.useEffect(function () {\n    // increase/decrease fov on scroll\n    var onScroll = function onScroll(e) {\n      if (!cam.current) return;\n      var newVal = cam.current.fov + e.deltaY * 0.05;\n      fov.set(newVal);\n    };\n\n    window.addEventListener(\"wheel\", onScroll);\n    return function () {\n      return window.removeEventListener(\"wheel\", onScroll);\n    };\n  }, [cam, fov]);\n  return /*#__PURE__*/React.createElement(\"group\", rest, /*#__PURE__*/React.createElement(\"mesh\", {\n    material: cache.mat_standard_white\n  }, /*#__PURE__*/React.createElement(\"planeBufferGeometry\", {\n    args: [INDICATOR_WIDTH, LINE_THICKNESS]\n  })), /*#__PURE__*/React.createElement(three$1.animated.mesh, {\n    material: cache.mat_standard_red,\n    \"position-x\": posX,\n    \"position-y\": LINE_LENGTH / 2 - LINE_THICKNESS / 2\n  }, /*#__PURE__*/React.createElement(\"planeBufferGeometry\", {\n    args: [LINE_THICKNESS, LINE_LENGTH]\n  })), /*#__PURE__*/React.createElement(drei.Text, {\n    font: FONT_URL$2,\n    color: \"white\",\n    fontSize: 0.032,\n    anchorY: \"top\",\n    anchorX: \"right\",\n    \"position-y\": -0.02,\n    \"position-x\": AREA_WIDTH / 2,\n    \"position-z\": 0.01,\n    lineHeight: 1.3,\n    renderOrder: 10,\n    textAlign: \"center\",\n    maxWidth: AREA_WIDTH\n  }, \"Scroll to zoom\\n\\n\\nClick to shoot\\n\\n\\nPress        to close\"), /*#__PURE__*/React.createElement(Key, {\n    keyCode: \"C\",\n    scale: 0.05,\n    position: [0.025, -0.29, 0.03]\n  }));\n}\n\nvar _excluded$1 = [\"open\", \"pressed\", \"setPressed\", \"onPress\"];\nvar FONT_URL$1 = \"https://d27rt3a60hh1lx.cloudfront.net/fonts/Quicksand_Bold.otf\";\nfunction ShutterButton(props) {\n  var open = props.open,\n      pressed = props.pressed,\n      setPressed = props.setPressed,\n      onPress = props.onPress,\n      rest = _objectWithoutPropertiesLoose__default[\"default\"](props, _excluded$1);\n\n  var _useEnvironment = useEnvironment(),\n      device = _useEnvironment.device;\n\n  var _useState = react.useState(false),\n      pressedOnce = _useState[0],\n      setPressedOnce = _useState[1];\n\n  react.useEffect(function () {\n    if (pressed) {\n      setTimeout(function () {\n        return setPressed(false);\n      }, 750);\n      setPressedOnce(true);\n    }\n  }, [pressed, setPressed]);\n\n  var _useSpring = three$1.useSpring({\n    shutterY: !pressed ? 1 : 0.6,\n    config: three$1.config.stiff\n  }),\n      shutterY = _useSpring.shutterY;\n\n  return /*#__PURE__*/React.createElement(\"group\", rest, /*#__PURE__*/React.createElement(three$1.animated.group, {\n    \"scale-y\": shutterY\n  }, /*#__PURE__*/React.createElement(RoundedBox, {\n    args: [0.4, 0.55, 0.2],\n    material: cache.mat_standard_red\n  })), device.mobile && /*#__PURE__*/React.createElement(HitBox, {\n    args: [0.4, 0.55, 0.2],\n    onClick: onPress,\n    scale: 1.5,\n    \"position-y\": 0.2\n  }, \"close\"), !pressedOnce && open && device.mobile && /*#__PURE__*/React.createElement(Floating, {\n    height: 0.025,\n    speed: 15\n  }, /*#__PURE__*/React.createElement(drei.Text, {\n    font: FONT_URL$1,\n    fontSize: 0.15,\n    color: \"white\",\n    outlineColor: \"black\",\n    outlineWidth: 0.15 / 10,\n    anchorY: \"bottom\",\n    \"position-y\": 0.325\n  }, \"Tap to Shoot!\")), /*#__PURE__*/React.createElement(\"mesh\", {\n    name: \"cover-mesh\",\n    \"position-x\": 0.05,\n    material: cache.mat_standard_black,\n    \"position-y\": -0.17\n  }, /*#__PURE__*/React.createElement(\"boxBufferGeometry\", {\n    args: [0.5, 0.5, 0.3]\n  })));\n}\n\nvar MIN_FOV = 10;\nvar MAX_FOV = 85;\nvar useFov = function useFov(cam) {\n  var _useState = react.useState(50),\n      fov = _useState[0],\n      setFov = _useState[1];\n\n  var change = react.useCallback(function (newVal) {\n    if (!cam.current) return;\n    var fov = three.MathUtils.clamp(newVal, MIN_FOV, MAX_FOV);\n    cam.current.fov = fov;\n    cam.current.updateProjectionMatrix();\n    setFov(fov);\n  }, [cam]);\n  return {\n    val: fov,\n    normalized: (fov - MIN_FOV) / (MAX_FOV - MIN_FOV),\n    set: change,\n    min: MIN_FOV,\n    max: MAX_FOV\n  };\n};\n\nvar _excluded = [\"cam\", \"open\", \"setOpen\", \"fov\"];\nvar FONT_URL = \"https://d27rt3a60hh1lx.cloudfront.net/fonts/Quicksand_Bold.otf\";\nfunction MobileControls(props) {\n  var cam = props.cam,\n      open = props.open,\n      setOpen = props.setOpen,\n      fov = props.fov,\n      rest = _objectWithoutPropertiesLoose__default[\"default\"](props, _excluded);\n\n  var _useThree = fiber.useThree(),\n      gl = _useThree.gl;\n\n  var _usePlayer = usePlayer(),\n      raycaster = _usePlayer.raycaster;\n\n  var hitbox = react.useRef(null);\n  var touchInside = react.useRef(false);\n  var startVal = react.useRef();\n  var LINE_LENGTH = 0.05;\n  var LINE_THICKNESS = 0.008;\n  var AREA_HEIGHT = 0.35;\n\n  var _useSpring = three$1.useSpring({\n    posY: fov.normalized * -AREA_HEIGHT + AREA_HEIGHT / 2 - LINE_THICKNESS\n  }),\n      posY = _useSpring.posY;\n\n  useDrag({\n    onStart: function onStart(_ref) {\n      var e = _ref.e;\n      if (!hitbox.current) return;\n      var intersections = raycaster.intersectObject(hitbox.current);\n      if (intersections.length === 0) return;\n      touchInside.current = true;\n      e.stopImmediatePropagation();\n    },\n    onMove: function onMove(_ref2) {\n      var _cam$current;\n\n      var delta = _ref2.delta;\n      if (!touchInside.current) return;\n      if (!startVal.current) startVal.current = ((_cam$current = cam.current) == null ? void 0 : _cam$current.fov) || 0;\n      var newVal = startVal.current + delta.y * 0.5;\n      fov.set(newVal);\n    },\n    onEnd: function onEnd() {\n      touchInside.current = false;\n      startVal.current = undefined;\n    }\n  }, gl.domElement, [fov]);\n  return /*#__PURE__*/React.createElement(\"group\", rest, /*#__PURE__*/React.createElement(\"group\", {\n    \"position-y\": -0.15\n  }, /*#__PURE__*/React.createElement(HitBox, {\n    ref: hitbox,\n    args: [0.25, AREA_HEIGHT * 1.2, 0.05]\n  }), /*#__PURE__*/React.createElement(\"mesh\", {\n    material: cache.mat_standard_white\n  }, /*#__PURE__*/React.createElement(\"planeBufferGeometry\", {\n    args: [LINE_THICKNESS * 2, AREA_HEIGHT]\n  })), /*#__PURE__*/React.createElement(three$1.animated.mesh, {\n    material: cache.mat_standard_red,\n    \"position-y\": posY\n  }, /*#__PURE__*/React.createElement(\"planeBufferGeometry\", {\n    args: [LINE_LENGTH * 2, LINE_THICKNESS * 4]\n  }))), /*#__PURE__*/React.createElement(drei.Text, {\n    font: FONT_URL,\n    color: \"white\",\n    fontSize: 0.044,\n    anchorY: \"top\",\n    anchorX: \"center\",\n    \"position-y\": -0.35,\n    \"position-z\": 0.01,\n    lineHeight: 1.3,\n    renderOrder: 10,\n    textAlign: \"center\"\n  }, \"FOV Slider\"), open && /*#__PURE__*/React.createElement(Button$1, {\n    \"position-y\": 0.48,\n    \"position-x\": -1,\n    scale: 1.5,\n    \"rotation-x\": 0.2,\n    color: \"#ff0000\",\n    onClick: function onClick() {\n      return setOpen(false);\n    }\n  }, \"close\"));\n}\n\nvar _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5;\nvar Wrapper = styled__default[\"default\"].div(_templateObject || (_templateObject = _taggedTemplateLiteralLoose__default[\"default\"]([\"\\n  position: absolute;\\n  display: flex;\\n  flex-direction: column;\\n  z-index: 100;\\n  top: 50%;\\n  left: 50%;\\n  transform: translate(-50%, -50%);\\n  padding: 25px 25px 30px;\\n  box-sizing: border-box;\\n  background: black;\\n  width: 90vw;\\n\"])));\nvar Background = styled__default[\"default\"].div(_templateObject2 || (_templateObject2 = _taggedTemplateLiteralLoose__default[\"default\"]([\"\\n  position: absolute;\\n  z-index: 99;\\n  width: 100%;\\n  height: 100%;\\n  top: 0;\\n  left: 0;\\n  background: black;\\n  opacity: 0.6;\\n\"])));\nvar Image = styled__default[\"default\"].img(_templateObject3 || (_templateObject3 = _taggedTemplateLiteralLoose__default[\"default\"]([\"\\n  width: 100%;\\n  height: auto;\\n  object-fit: contain;\\n\"])));\nvar Text = styled__default[\"default\"].p(_templateObject4 || (_templateObject4 = _taggedTemplateLiteralLoose__default[\"default\"]([\"\\n  color: white;\\n  text-align: center;\\n  font-size: 1.15rem;\\n\"])));\nvar Button = styled__default[\"default\"].button(_templateObject5 || (_templateObject5 = _taggedTemplateLiteralLoose__default[\"default\"]([\"\\n  background: white;\\n  border: none;\\n  color: black;\\n  padding: 10px 20px;\\n  font-size: 1rem;\\n  font-family: inherit;\\n  border-radius: 10px;\\n  font-weight: bold;\\n  margin: 0 auto;\\n\"])));\nfunction PhotoPreview(props) {\n  var photo = props.photo;\n\n  var _useEnvironment = useEnvironment(),\n      containerRef = _useEnvironment.containerRef,\n      device = _useEnvironment.device;\n\n  if (!photo.data.value || !containerRef.current || !device.mobile) return null;\n  return /*#__PURE__*/React.createElement(drei.Html, null, /*#__PURE__*/reactDom.createPortal( /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Wrapper, null, /*#__PURE__*/React.createElement(Image, {\n    src: photo.data.value\n  }), /*#__PURE__*/React.createElement(Text, null, \"press and hold the image to save it\"), /*#__PURE__*/React.createElement(Button, {\n    onClick: function onClick() {\n      return photo.data.set(undefined);\n    }\n  }, \"close\")), /*#__PURE__*/React.createElement(Background, null)), containerRef.current));\n}\n\nvar AUDIO_URL = \"https://d27rt3a60hh1lx.cloudfront.net/tools/camera/shutter-sound.mp3\";\nvar CAMERA_MODEL_URL = \"https://d1htv66kutdwsl.cloudfront.net/0308efc4-0b68-4b2e-b688-92512323178b/aa44f4af-f7c2-4050-9e6c-536ee07bbb1a.glb\";\nvar TIMEOUT = 2; //s\n\nfunction Camera(props) {\n  var _toolbelt$activeTool;\n\n  var onCapture = props.onCapture;\n\n  var _useEnvironment = useEnvironment(),\n      device = _useEnvironment.device,\n      paused = _useEnvironment.paused;\n\n  var _useThree = fiber.useThree(),\n      scene = _useThree.scene,\n      clock = _useThree.clock;\n\n  var toolbelt = useToolbelt();\n  var cam = react.useRef();\n  var group = react.useRef(null);\n  var mesh = react.useRef(null);\n\n  var _useState = react.useState(false),\n      open = _useState[0],\n      setOpen = _useState[1];\n\n  var _useState2 = react.useState(false),\n      shutterPressed = _useState2[0],\n      setShutterPressed = _useState2[1];\n\n  var fov = useFov(cam);\n  var lastShotTime = react.useRef(0);\n  var ENABLED = ((_toolbelt$activeTool = toolbelt.activeTool) == null ? void 0 : _toolbelt$activeTool.name) === \"Camera\";\n  var photo = usePhotography(cam);\n  var dims = useHudDims();\n  var SCALE = Math.min(dims.width * 0.25, device.mobile ? 0.2 : 0.325);\n\n  var _useSpring = three$1.useSpring({\n    rotX: open ? 0 : 0.3,\n    rotY: open ? 0 : device.mobile ? Math.PI - 0.5 : -0.1,\n    scale: open ? SCALE : device.mobile ? 0.1 : 0.25,\n    config: three$1.config.stiff\n  }),\n      rotX = _useSpring.rotX,\n      rotY = _useSpring.rotY,\n      scale = _useSpring.scale;\n\n  useRendering(ENABLED && open, cam, group, mesh, photo);\n  var onClick = react.useCallback(function () {\n    if (shutterPressed) return;\n    if (lastShotTime.current + TIMEOUT > clock.getElapsedTime()) return;\n    lastShotTime.current = clock.getElapsedTime();\n    setShutterPressed(true);\n    var audio = new Audio(AUDIO_URL);\n    audio.play();\n    setTimeout(function () {\n      // let the shutter sound and anim play\n      photo.takePicture();\n      if (onCapture) onCapture();\n    }, 300);\n  }, [clock, onCapture, photo, shutterPressed]);\n  react.useEffect(function () {\n    if (!ENABLED || paused || device.mobile || !open) return;\n    document.addEventListener(\"click\", onClick);\n    return function () {\n      return document.removeEventListener(\"click\", onClick);\n    };\n  }, [ENABLED, device.mobile, onClick, open, paused]);\n  useKeypress(\"c\", function () {\n    if (isTyping() || !ENABLED) return;\n    setOpen(!open);\n  }, [ENABLED, open]);\n  var POS = open ? [0, 0] : device.mobile ? [0.9, 0.9] : [0.8, -0.8];\n  return /*#__PURE__*/React.createElement(\"group\", {\n    name: \"camera-tool-resources\",\n    ref: group\n  }, /*#__PURE__*/React.createElement(Tool, {\n    name: \"Camera\",\n    pos: POS,\n    pinY: true,\n    face: false,\n    disableDraggable: open,\n    onSwitch: function onSwitch(e) {\n      return !e && setOpen(false);\n    }\n  }, /*#__PURE__*/React.createElement(Instruction, {\n    open: open,\n    setOpen: setOpen\n  }), /*#__PURE__*/React.createElement(three$1.animated.group, {\n    scale: scale,\n    \"rotation-x\": rotX,\n    \"rotation-y\": rotY\n  }, /*#__PURE__*/React.createElement(Model, {\n    src: CAMERA_MODEL_URL,\n    center: true,\n    normalize: true,\n    \"rotation-y\": Math.PI,\n    scale: 3\n  }), device.mobile && !open && /*#__PURE__*/React.createElement(HitBox, {\n    args: [3, 1.8, 1.6],\n    \"position-z\": 0.3,\n    onClick: function onClick() {\n      return setOpen(true);\n    }\n  }), /*#__PURE__*/React.createElement(\"group\", {\n    name: \"top-row\",\n    position: [1, 0.7, 0.75]\n  }, /*#__PURE__*/React.createElement(ShutterButton, {\n    open: open,\n    pressed: shutterPressed,\n    setPressed: setShutterPressed,\n    onPress: onClick\n  })), /*#__PURE__*/React.createElement(\"group\", {\n    name: \"content\",\n    position: [0, -0.18, 1.101],\n    scale: 2\n  }, /*#__PURE__*/React.createElement(\"mesh\", {\n    ref: mesh,\n    name: \"viewfinder\",\n    position: [-0.15, 0.03, 0],\n    \"scale-x\": 1.1,\n    \"scale-y\": 1.1\n  }, /*#__PURE__*/React.createElement(\"planeBufferGeometry\", {\n    args: [photo.aspect.x, photo.aspect.y]\n  }), /*#__PURE__*/React.createElement(\"meshStandardMaterial\", {\n    map: photo.target.texture,\n    metalness: 0.68,\n    roughness: 0.7\n  })), device.desktop ? /*#__PURE__*/React.createElement(DesktopControls, {\n    cam: cam,\n    open: open,\n    fov: fov,\n    position: [0.485, 0.12, 0.005]\n  }) : /*#__PURE__*/React.createElement(MobileControls, {\n    cam: cam,\n    open: open,\n    setOpen: setOpen,\n    fov: fov,\n    position: [0.5, 0.12, 0.004]\n  })))), fiber.createPortal( /*#__PURE__*/React.createElement(drei.PerspectiveCamera, {\n    ref: cam,\n    near: 0.01,\n    far: 300\n  }), scene), /*#__PURE__*/React.createElement(PhotoPreview, {\n    photo: photo\n  }));\n}\n\nfunction LostWorld() {\n  return /*#__PURE__*/React.createElement(\"group\", {\n    name: \"lost-world\"\n  }, /*#__PURE__*/React.createElement(Fog, {\n    color: \"white\",\n    near: 0.1,\n    far: 15\n  }), /*#__PURE__*/React.createElement(\"directionalLight\", {\n    \"position-y\": 1,\n    intensity: 1.8\n  }), /*#__PURE__*/React.createElement(\"ambientLight\", {\n    intensity: 1\n  }), /*#__PURE__*/React.createElement(Background$1, {\n    color: \"white\"\n  }), /*#__PURE__*/React.createElement(LostFloor, null));\n}\n\nexports.Anchor = Anchor;\nexports.Arrow = Arrow;\nexports.Audio = Audio$1;\nexports.Background = Background$1;\nexports.Button = Button$1;\nexports.Camera = Camera;\nexports.Collidable = Collidable;\nexports.Dialogue = Dialogue;\nexports.Environment = Environment;\nexports.EnvironmentContext = EnvironmentContext;\nexports.FacePlayer = FacePlayer;\nexports.Floating = Floating;\nexports.Fog = Fog;\nexports.Frame = Frame;\nexports.HDRI = HDRI;\nexports.HitBox = HitBox;\nexports.Idea = Idea;\nexports.Image = Image$1;\nexports.InfinitePlane = InfinitePlane;\nexports.Interactable = Interactable;\nexports.Key = Key;\nexports.LookAtPlayer = LookAtPlayer;\nexports.LostFloor = LostFloor;\nexports.LostWorld = LostWorld;\nexports.Model = Model;\nexports.Network = Network;\nexports.NetworkContext = NetworkContext;\nexports.Physics = Physics;\nexports.Player = Player;\nexports.PlayerContext = PlayerContext;\nexports.RoundedBox = RoundedBox;\nexports.Site = Site;\nexports.Spinning = Spinning;\nexports.StandardReality = StandardReality;\nexports.Switch = Switch;\nexports.TextInput = TextInput;\nexports.Tool = Tool;\nexports.Toolbelt = Toolbelt;\nexports.ToolbeltContext = ToolbeltContext;\nexports.Video = Video;\nexports.Visual = Visual;\nexports.VisualContext = VisualContext;\nexports.VisualEffect = VisualEffect;\nexports.VisualIdea = VisualIdea;\nexports.VisualWorld = VisualWorld;\nexports.WalkieTalkie = WalkieTalkie;\nexports.World = World;\nexports.cache = cache;\nexports.enableBVHRaycast = enableBVHRaycast;\nexports.getHudDims = getHudDims;\nexports.getHudPos = getHudPos;\nexports.isTyping = isTyping;\nexports.useDrag = useDrag;\nexports.useEnvironment = useEnvironment;\nexports.useEnvironmentState = useEnvironmentState;\nexports.useHTMLInput = useHTMLInput;\nexports.useHudDims = useHudDims;\nexports.useImage = useImage;\nexports.useKeyboardLayout = useKeyboardLayout;\nexports.useKeypress = useKeypress;\nexports.useLimitedFrame = useLimitedFrame;\nexports.useLimiter = useLimiter;\nexports.useMetaHold = useMetaHold;\nexports.useModel = useModel;\nexports.useNetwork = useNetwork;\nexports.usePlayer = usePlayer;\nexports.useRerender = useRerender;\nexports.useShiftHold = useShiftHold;\nexports.useTextInput = useTextInput;\nexports.useToolbelt = useToolbelt;\nexports.useToolbeltState = useToolbeltState;\nexports.useTrimeshCollision = useTrimeshCollision$1;\nexports.useVisible = useVisible;\nexports.useVisual = useVisual;\n"]}