020d0c804648a796988b100a73bbe291ded4c64a491fc62ee5b356e6131bd74c.json 29 KB

1
  1. {"ast":null,"code":"import { Vector3 } from \"@babylonjs/core/Maths/math.vector.js\";\nimport { Tools } from \"@babylonjs/core/Misc/tools.js\";\nimport { AnimationEvent } from \"@babylonjs/core/Animations/animationEvent.js\";\nimport { Sound } from \"@babylonjs/core/Audio/sound.js\";\nimport { WeightedSound } from \"@babylonjs/core/Audio/weightedsound.js\";\nimport { GLTFLoader, ArrayItem } from \"../glTFLoader.js\";\nconst NAME = \"MSFT_audio_emitter\";\n/**\n * [Specification](https://github.com/najadojo/glTF/blob/MSFT_audio_emitter/extensions/2.0/Vendor/MSFT_audio_emitter/README.md)\n * !!! Experimental Extension Subject to Changes !!!\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport class MSFT_audio_emitter {\n /**\n * @internal\n */\n constructor(loader) {\n /**\n * The name of this extension.\n */\n this.name = NAME;\n this._loader = loader;\n this.enabled = this._loader.isExtensionUsed(NAME);\n }\n /** @internal */\n dispose() {\n this._loader = null;\n this._clips = null;\n this._emitters = null;\n }\n /** @internal */\n onLoading() {\n const extensions = this._loader.gltf.extensions;\n if (extensions && extensions[this.name]) {\n const extension = extensions[this.name];\n this._clips = extension.clips;\n this._emitters = extension.emitters;\n ArrayItem.Assign(this._clips);\n ArrayItem.Assign(this._emitters);\n }\n }\n /**\n * @internal\n */\n loadSceneAsync(context, scene) {\n return GLTFLoader.LoadExtensionAsync(context, scene, this.name, (extensionContext, extension) => {\n const promises = new Array();\n promises.push(this._loader.loadSceneAsync(context, scene));\n for (const emitterIndex of extension.emitters) {\n const emitter = ArrayItem.Get(`${extensionContext}/emitters`, this._emitters, emitterIndex);\n if (emitter.refDistance != undefined || emitter.maxDistance != undefined || emitter.rolloffFactor != undefined || emitter.distanceModel != undefined || emitter.innerAngle != undefined || emitter.outerAngle != undefined) {\n throw new Error(`${extensionContext}: Direction or Distance properties are not allowed on emitters attached to a scene`);\n }\n promises.push(this._loadEmitterAsync(`${extensionContext}/emitters/${emitter.index}`, emitter));\n }\n return Promise.all(promises).then(() => {});\n });\n }\n /**\n * @internal\n */\n loadNodeAsync(context, node, assign) {\n return GLTFLoader.LoadExtensionAsync(context, node, this.name, (extensionContext, extension) => {\n const promises = new Array();\n return this._loader.loadNodeAsync(extensionContext, node, babylonMesh => {\n for (const emitterIndex of extension.emitters) {\n const emitter = ArrayItem.Get(`${extensionContext}/emitters`, this._emitters, emitterIndex);\n promises.push(this._loadEmitterAsync(`${extensionContext}/emitters/${emitter.index}`, emitter).then(() => {\n for (const sound of emitter._babylonSounds) {\n sound.attachToMesh(babylonMesh);\n if (emitter.innerAngle != undefined || emitter.outerAngle != undefined) {\n sound.setLocalDirectionToMesh(Vector3.Forward());\n sound.setDirectionalCone(2 * Tools.ToDegrees(emitter.innerAngle == undefined ? Math.PI : emitter.innerAngle), 2 * Tools.ToDegrees(emitter.outerAngle == undefined ? Math.PI : emitter.outerAngle), 0);\n }\n }\n }));\n }\n assign(babylonMesh);\n }).then(babylonMesh => {\n return Promise.all(promises).then(() => {\n return babylonMesh;\n });\n });\n });\n }\n /**\n * @internal\n */\n loadAnimationAsync(context, animation) {\n return GLTFLoader.LoadExtensionAsync(context, animation, this.name, (extensionContext, extension) => {\n return this._loader.loadAnimationAsync(context, animation).then(babylonAnimationGroup => {\n const promises = new Array();\n ArrayItem.Assign(extension.events);\n for (const event of extension.events) {\n promises.push(this._loadAnimationEventAsync(`${extensionContext}/events/${event.index}`, context, animation, event, babylonAnimationGroup));\n }\n return Promise.all(promises).then(() => {\n return babylonAnimationGroup;\n });\n });\n });\n }\n _loadClipAsync(context, clip) {\n if (clip._objectURL) {\n return clip._objectURL;\n }\n let promise;\n if (clip.uri) {\n promise = this._loader.loadUriAsync(context, clip, clip.uri);\n } else {\n const bufferView = ArrayItem.Get(`${context}/bufferView`, this._loader.gltf.bufferViews, clip.bufferView);\n promise = this._loader.loadBufferViewAsync(`/bufferViews/${bufferView.index}`, bufferView);\n }\n clip._objectURL = promise.then(data => {\n return URL.createObjectURL(new Blob([data], {\n type: clip.mimeType\n }));\n });\n return clip._objectURL;\n }\n _loadEmitterAsync(context, emitter) {\n emitter._babylonSounds = emitter._babylonSounds || [];\n if (!emitter._babylonData) {\n const clipPromises = new Array();\n const name = emitter.name || `emitter${emitter.index}`;\n const options = {\n loop: false,\n autoplay: false,\n volume: emitter.volume == undefined ? 1 : emitter.volume\n };\n for (let i = 0; i < emitter.clips.length; i++) {\n const clipContext = `/extensions/${this.name}/clips`;\n const clip = ArrayItem.Get(clipContext, this._clips, emitter.clips[i].clip);\n clipPromises.push(this._loadClipAsync(`${clipContext}/${emitter.clips[i].clip}`, clip).then(objectURL => {\n const sound = emitter._babylonSounds[i] = new Sound(name, objectURL, this._loader.babylonScene, null, options);\n sound.refDistance = emitter.refDistance || 1;\n sound.maxDistance = emitter.maxDistance || 256;\n sound.rolloffFactor = emitter.rolloffFactor || 1;\n sound.distanceModel = emitter.distanceModel || \"exponential\";\n }));\n }\n const promise = Promise.all(clipPromises).then(() => {\n const weights = emitter.clips.map(clip => {\n return clip.weight || 1;\n });\n const weightedSound = new WeightedSound(emitter.loop || false, emitter._babylonSounds, weights);\n if (emitter.innerAngle) {\n weightedSound.directionalConeInnerAngle = 2 * Tools.ToDegrees(emitter.innerAngle);\n }\n if (emitter.outerAngle) {\n weightedSound.directionalConeOuterAngle = 2 * Tools.ToDegrees(emitter.outerAngle);\n }\n if (emitter.volume) {\n weightedSound.volume = emitter.volume;\n }\n emitter._babylonData.sound = weightedSound;\n });\n emitter._babylonData = {\n loaded: promise\n };\n }\n return emitter._babylonData.loaded;\n }\n _getEventAction(context, sound, action, time, startOffset) {\n switch (action) {\n case \"play\" /* IMSFTAudioEmitter_AnimationEventAction.play */:\n {\n return currentFrame => {\n const frameOffset = (startOffset || 0) + (currentFrame - time);\n sound.play(frameOffset);\n };\n }\n case \"stop\" /* IMSFTAudioEmitter_AnimationEventAction.stop */:\n {\n return () => {\n sound.stop();\n };\n }\n case \"pause\" /* IMSFTAudioEmitter_AnimationEventAction.pause */:\n {\n return () => {\n sound.pause();\n };\n }\n default:\n {\n throw new Error(`${context}: Unsupported action ${action}`);\n }\n }\n }\n _loadAnimationEventAsync(context, animationContext, animation, event, babylonAnimationGroup) {\n if (babylonAnimationGroup.targetedAnimations.length == 0) {\n return Promise.resolve();\n }\n const babylonAnimation = babylonAnimationGroup.targetedAnimations[0];\n const emitterIndex = event.emitter;\n const emitter = ArrayItem.Get(`/extensions/${this.name}/emitters`, this._emitters, emitterIndex);\n return this._loadEmitterAsync(context, emitter).then(() => {\n const sound = emitter._babylonData.sound;\n if (sound) {\n const babylonAnimationEvent = new AnimationEvent(event.time, this._getEventAction(context, sound, event.action, event.time, event.startOffset));\n babylonAnimation.animation.addEvent(babylonAnimationEvent);\n // Make sure all started audio stops when this animation is terminated.\n babylonAnimationGroup.onAnimationGroupEndObservable.add(() => {\n sound.stop();\n });\n babylonAnimationGroup.onAnimationGroupPauseObservable.add(() => {\n sound.pause();\n });\n }\n });\n }\n}\nGLTFLoader.RegisterExtension(NAME, loader => new MSFT_audio_emitter(loader));","map":{"version":3,"names":["Vector3","Tools","AnimationEvent","Sound","WeightedSound","GLTFLoader","ArrayItem","NAME","MSFT_audio_emitter","constructor","loader","name","_loader","enabled","isExtensionUsed","dispose","_clips","_emitters","onLoading","extensions","gltf","extension","clips","emitters","Assign","loadSceneAsync","context","scene","LoadExtensionAsync","extensionContext","promises","Array","push","emitterIndex","emitter","Get","refDistance","undefined","maxDistance","rolloffFactor","distanceModel","innerAngle","outerAngle","Error","_loadEmitterAsync","index","Promise","all","then","loadNodeAsync","node","assign","babylonMesh","sound","_babylonSounds","attachToMesh","setLocalDirectionToMesh","Forward","setDirectionalCone","ToDegrees","Math","PI","loadAnimationAsync","animation","babylonAnimationGroup","events","event","_loadAnimationEventAsync","_loadClipAsync","clip","_objectURL","promise","uri","loadUriAsync","bufferView","bufferViews","loadBufferViewAsync","data","URL","createObjectURL","Blob","type","mimeType","_babylonData","clipPromises","options","loop","autoplay","volume","i","length","clipContext","objectURL","babylonScene","weights","map","weight","weightedSound","directionalConeInnerAngle","directionalConeOuterAngle","loaded","_getEventAction","action","time","startOffset","currentFrame","frameOffset","play","stop","pause","animationContext","targetedAnimations","resolve","babylonAnimation","babylonAnimationEvent","addEvent","onAnimationGroupEndObservable","add","onAnimationGroupPauseObservable","RegisterExtension"],"sources":["F:/workspace/202226701027/huinongbao-app/node_modules/@babylonjs/loaders/glTF/2.0/Extensions/MSFT_audio_emitter.js"],"sourcesContent":["import { Vector3 } from \"@babylonjs/core/Maths/math.vector.js\";\nimport { Tools } from \"@babylonjs/core/Misc/tools.js\";\nimport { AnimationEvent } from \"@babylonjs/core/Animations/animationEvent.js\";\nimport { Sound } from \"@babylonjs/core/Audio/sound.js\";\nimport { WeightedSound } from \"@babylonjs/core/Audio/weightedsound.js\";\nimport { GLTFLoader, ArrayItem } from \"../glTFLoader.js\";\nconst NAME = \"MSFT_audio_emitter\";\n/**\n * [Specification](https://github.com/najadojo/glTF/blob/MSFT_audio_emitter/extensions/2.0/Vendor/MSFT_audio_emitter/README.md)\n * !!! Experimental Extension Subject to Changes !!!\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport class MSFT_audio_emitter {\n /**\n * @internal\n */\n constructor(loader) {\n /**\n * The name of this extension.\n */\n this.name = NAME;\n this._loader = loader;\n this.enabled = this._loader.isExtensionUsed(NAME);\n }\n /** @internal */\n dispose() {\n this._loader = null;\n this._clips = null;\n this._emitters = null;\n }\n /** @internal */\n onLoading() {\n const extensions = this._loader.gltf.extensions;\n if (extensions && extensions[this.name]) {\n const extension = extensions[this.name];\n this._clips = extension.clips;\n this._emitters = extension.emitters;\n ArrayItem.Assign(this._clips);\n ArrayItem.Assign(this._emitters);\n }\n }\n /**\n * @internal\n */\n loadSceneAsync(context, scene) {\n return GLTFLoader.LoadExtensionAsync(context, scene, this.name, (extensionContext, extension) => {\n const promises = new Array();\n promises.push(this._loader.loadSceneAsync(context, scene));\n for (const emitterIndex of extension.emitters) {\n const emitter = ArrayItem.Get(`${extensionContext}/emitters`, this._emitters, emitterIndex);\n if (emitter.refDistance != undefined ||\n emitter.maxDistance != undefined ||\n emitter.rolloffFactor != undefined ||\n emitter.distanceModel != undefined ||\n emitter.innerAngle != undefined ||\n emitter.outerAngle != undefined) {\n throw new Error(`${extensionContext}: Direction or Distance properties are not allowed on emitters attached to a scene`);\n }\n promises.push(this._loadEmitterAsync(`${extensionContext}/emitters/${emitter.index}`, emitter));\n }\n return Promise.all(promises).then(() => { });\n });\n }\n /**\n * @internal\n */\n loadNodeAsync(context, node, assign) {\n return GLTFLoader.LoadExtensionAsync(context, node, this.name, (extensionContext, extension) => {\n const promises = new Array();\n return this._loader\n .loadNodeAsync(extensionContext, node, (babylonMesh) => {\n for (const emitterIndex of extension.emitters) {\n const emitter = ArrayItem.Get(`${extensionContext}/emitters`, this._emitters, emitterIndex);\n promises.push(this._loadEmitterAsync(`${extensionContext}/emitters/${emitter.index}`, emitter).then(() => {\n for (const sound of emitter._babylonSounds) {\n sound.attachToMesh(babylonMesh);\n if (emitter.innerAngle != undefined || emitter.outerAngle != undefined) {\n sound.setLocalDirectionToMesh(Vector3.Forward());\n sound.setDirectionalCone(2 * Tools.ToDegrees(emitter.innerAngle == undefined ? Math.PI : emitter.innerAngle), 2 * Tools.ToDegrees(emitter.outerAngle == undefined ? Math.PI : emitter.outerAngle), 0);\n }\n }\n }));\n }\n assign(babylonMesh);\n })\n .then((babylonMesh) => {\n return Promise.all(promises).then(() => {\n return babylonMesh;\n });\n });\n });\n }\n /**\n * @internal\n */\n loadAnimationAsync(context, animation) {\n return GLTFLoader.LoadExtensionAsync(context, animation, this.name, (extensionContext, extension) => {\n return this._loader.loadAnimationAsync(context, animation).then((babylonAnimationGroup) => {\n const promises = new Array();\n ArrayItem.Assign(extension.events);\n for (const event of extension.events) {\n promises.push(this._loadAnimationEventAsync(`${extensionContext}/events/${event.index}`, context, animation, event, babylonAnimationGroup));\n }\n return Promise.all(promises).then(() => {\n return babylonAnimationGroup;\n });\n });\n });\n }\n _loadClipAsync(context, clip) {\n if (clip._objectURL) {\n return clip._objectURL;\n }\n let promise;\n if (clip.uri) {\n promise = this._loader.loadUriAsync(context, clip, clip.uri);\n }\n else {\n const bufferView = ArrayItem.Get(`${context}/bufferView`, this._loader.gltf.bufferViews, clip.bufferView);\n promise = this._loader.loadBufferViewAsync(`/bufferViews/${bufferView.index}`, bufferView);\n }\n clip._objectURL = promise.then((data) => {\n return URL.createObjectURL(new Blob([data], { type: clip.mimeType }));\n });\n return clip._objectURL;\n }\n _loadEmitterAsync(context, emitter) {\n emitter._babylonSounds = emitter._babylonSounds || [];\n if (!emitter._babylonData) {\n const clipPromises = new Array();\n const name = emitter.name || `emitter${emitter.index}`;\n const options = {\n loop: false,\n autoplay: false,\n volume: emitter.volume == undefined ? 1 : emitter.volume,\n };\n for (let i = 0; i < emitter.clips.length; i++) {\n const clipContext = `/extensions/${this.name}/clips`;\n const clip = ArrayItem.Get(clipContext, this._clips, emitter.clips[i].clip);\n clipPromises.push(this._loadClipAsync(`${clipContext}/${emitter.clips[i].clip}`, clip).then((objectURL) => {\n const sound = (emitter._babylonSounds[i] = new Sound(name, objectURL, this._loader.babylonScene, null, options));\n sound.refDistance = emitter.refDistance || 1;\n sound.maxDistance = emitter.maxDistance || 256;\n sound.rolloffFactor = emitter.rolloffFactor || 1;\n sound.distanceModel = emitter.distanceModel || \"exponential\";\n }));\n }\n const promise = Promise.all(clipPromises).then(() => {\n const weights = emitter.clips.map((clip) => {\n return clip.weight || 1;\n });\n const weightedSound = new WeightedSound(emitter.loop || false, emitter._babylonSounds, weights);\n if (emitter.innerAngle) {\n weightedSound.directionalConeInnerAngle = 2 * Tools.ToDegrees(emitter.innerAngle);\n }\n if (emitter.outerAngle) {\n weightedSound.directionalConeOuterAngle = 2 * Tools.ToDegrees(emitter.outerAngle);\n }\n if (emitter.volume) {\n weightedSound.volume = emitter.volume;\n }\n emitter._babylonData.sound = weightedSound;\n });\n emitter._babylonData = {\n loaded: promise,\n };\n }\n return emitter._babylonData.loaded;\n }\n _getEventAction(context, sound, action, time, startOffset) {\n switch (action) {\n case \"play\" /* IMSFTAudioEmitter_AnimationEventAction.play */: {\n return (currentFrame) => {\n const frameOffset = (startOffset || 0) + (currentFrame - time);\n sound.play(frameOffset);\n };\n }\n case \"stop\" /* IMSFTAudioEmitter_AnimationEventAction.stop */: {\n return () => {\n sound.stop();\n };\n }\n case \"pause\" /* IMSFTAudioEmitter_AnimationEventAction.pause */: {\n return () => {\n sound.pause();\n };\n }\n default: {\n throw new Error(`${context}: Unsupported action ${action}`);\n }\n }\n }\n _loadAnimationEventAsync(context, animationContext, animation, event, babylonAnimationGroup) {\n if (babylonAnimationGroup.targetedAnimations.length == 0) {\n return Promise.resolve();\n }\n const babylonAnimation = babylonAnimationGroup.targetedAnimations[0];\n const emitterIndex = event.emitter;\n const emitter = ArrayItem.Get(`/extensions/${this.name}/emitters`, this._emitters, emitterIndex);\n return this._loadEmitterAsync(context, emitter).then(() => {\n const sound = emitter._babylonData.sound;\n if (sound) {\n const babylonAnimationEvent = new AnimationEvent(event.time, this._getEventAction(context, sound, event.action, event.time, event.startOffset));\n babylonAnimation.animation.addEvent(babylonAnimationEvent);\n // Make sure all started audio stops when this animation is terminated.\n babylonAnimationGroup.onAnimationGroupEndObservable.add(() => {\n sound.stop();\n });\n babylonAnimationGroup.onAnimationGroupPauseObservable.add(() => {\n sound.pause();\n });\n }\n });\n }\n}\nGLTFLoader.RegisterExtension(NAME, (loader) => new MSFT_audio_emitter(loader));\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,sCAAsC;AAC9D,SAASC,KAAK,QAAQ,+BAA+B;AACrD,SAASC,cAAc,QAAQ,8CAA8C;AAC7E,SAASC,KAAK,QAAQ,gCAAgC;AACtD,SAASC,aAAa,QAAQ,wCAAwC;AACtE,SAASC,UAAU,EAAEC,SAAS,QAAQ,kBAAkB;AACxD,MAAMC,IAAI,GAAG,oBAAoB;AACjC;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,kBAAkB,CAAC;EAC5B;AACJ;AACA;EACIC,WAAWA,CAACC,MAAM,EAAE;IAChB;AACR;AACA;IACQ,IAAI,CAACC,IAAI,GAAGJ,IAAI;IAChB,IAAI,CAACK,OAAO,GAAGF,MAAM;IACrB,IAAI,CAACG,OAAO,GAAG,IAAI,CAACD,OAAO,CAACE,eAAe,CAACP,IAAI,CAAC;EACrD;EACA;EACAQ,OAAOA,CAAA,EAAG;IACN,IAAI,CAACH,OAAO,GAAG,IAAI;IACnB,IAAI,CAACI,MAAM,GAAG,IAAI;IAClB,IAAI,CAACC,SAAS,GAAG,IAAI;EACzB;EACA;EACAC,SAASA,CAAA,EAAG;IACR,MAAMC,UAAU,GAAG,IAAI,CAACP,OAAO,CAACQ,IAAI,CAACD,UAAU;IAC/C,IAAIA,UAAU,IAAIA,UAAU,CAAC,IAAI,CAACR,IAAI,CAAC,EAAE;MACrC,MAAMU,SAAS,GAAGF,UAAU,CAAC,IAAI,CAACR,IAAI,CAAC;MACvC,IAAI,CAACK,MAAM,GAAGK,SAAS,CAACC,KAAK;MAC7B,IAAI,CAACL,SAAS,GAAGI,SAAS,CAACE,QAAQ;MACnCjB,SAAS,CAACkB,MAAM,CAAC,IAAI,CAACR,MAAM,CAAC;MAC7BV,SAAS,CAACkB,MAAM,CAAC,IAAI,CAACP,SAAS,CAAC;IACpC;EACJ;EACA;AACJ;AACA;EACIQ,cAAcA,CAACC,OAAO,EAAEC,KAAK,EAAE;IAC3B,OAAOtB,UAAU,CAACuB,kBAAkB,CAACF,OAAO,EAAEC,KAAK,EAAE,IAAI,CAAChB,IAAI,EAAE,CAACkB,gBAAgB,EAAER,SAAS,KAAK;MAC7F,MAAMS,QAAQ,GAAG,IAAIC,KAAK,CAAC,CAAC;MAC5BD,QAAQ,CAACE,IAAI,CAAC,IAAI,CAACpB,OAAO,CAACa,cAAc,CAACC,OAAO,EAAEC,KAAK,CAAC,CAAC;MAC1D,KAAK,MAAMM,YAAY,IAAIZ,SAAS,CAACE,QAAQ,EAAE;QAC3C,MAAMW,OAAO,GAAG5B,SAAS,CAAC6B,GAAG,CAAC,GAAGN,gBAAgB,WAAW,EAAE,IAAI,CAACZ,SAAS,EAAEgB,YAAY,CAAC;QAC3F,IAAIC,OAAO,CAACE,WAAW,IAAIC,SAAS,IAChCH,OAAO,CAACI,WAAW,IAAID,SAAS,IAChCH,OAAO,CAACK,aAAa,IAAIF,SAAS,IAClCH,OAAO,CAACM,aAAa,IAAIH,SAAS,IAClCH,OAAO,CAACO,UAAU,IAAIJ,SAAS,IAC/BH,OAAO,CAACQ,UAAU,IAAIL,SAAS,EAAE;UACjC,MAAM,IAAIM,KAAK,CAAC,GAAGd,gBAAgB,oFAAoF,CAAC;QAC5H;QACAC,QAAQ,CAACE,IAAI,CAAC,IAAI,CAACY,iBAAiB,CAAC,GAAGf,gBAAgB,aAAaK,OAAO,CAACW,KAAK,EAAE,EAAEX,OAAO,CAAC,CAAC;MACnG;MACA,OAAOY,OAAO,CAACC,GAAG,CAACjB,QAAQ,CAAC,CAACkB,IAAI,CAAC,MAAM,CAAE,CAAC,CAAC;IAChD,CAAC,CAAC;EACN;EACA;AACJ;AACA;EACIC,aAAaA,CAACvB,OAAO,EAAEwB,IAAI,EAAEC,MAAM,EAAE;IACjC,OAAO9C,UAAU,CAACuB,kBAAkB,CAACF,OAAO,EAAEwB,IAAI,EAAE,IAAI,CAACvC,IAAI,EAAE,CAACkB,gBAAgB,EAAER,SAAS,KAAK;MAC5F,MAAMS,QAAQ,GAAG,IAAIC,KAAK,CAAC,CAAC;MAC5B,OAAO,IAAI,CAACnB,OAAO,CACdqC,aAAa,CAACpB,gBAAgB,EAAEqB,IAAI,EAAGE,WAAW,IAAK;QACxD,KAAK,MAAMnB,YAAY,IAAIZ,SAAS,CAACE,QAAQ,EAAE;UAC3C,MAAMW,OAAO,GAAG5B,SAAS,CAAC6B,GAAG,CAAC,GAAGN,gBAAgB,WAAW,EAAE,IAAI,CAACZ,SAAS,EAAEgB,YAAY,CAAC;UAC3FH,QAAQ,CAACE,IAAI,CAAC,IAAI,CAACY,iBAAiB,CAAC,GAAGf,gBAAgB,aAAaK,OAAO,CAACW,KAAK,EAAE,EAAEX,OAAO,CAAC,CAACc,IAAI,CAAC,MAAM;YACtG,KAAK,MAAMK,KAAK,IAAInB,OAAO,CAACoB,cAAc,EAAE;cACxCD,KAAK,CAACE,YAAY,CAACH,WAAW,CAAC;cAC/B,IAAIlB,OAAO,CAACO,UAAU,IAAIJ,SAAS,IAAIH,OAAO,CAACQ,UAAU,IAAIL,SAAS,EAAE;gBACpEgB,KAAK,CAACG,uBAAuB,CAACxD,OAAO,CAACyD,OAAO,CAAC,CAAC,CAAC;gBAChDJ,KAAK,CAACK,kBAAkB,CAAC,CAAC,GAAGzD,KAAK,CAAC0D,SAAS,CAACzB,OAAO,CAACO,UAAU,IAAIJ,SAAS,GAAGuB,IAAI,CAACC,EAAE,GAAG3B,OAAO,CAACO,UAAU,CAAC,EAAE,CAAC,GAAGxC,KAAK,CAAC0D,SAAS,CAACzB,OAAO,CAACQ,UAAU,IAAIL,SAAS,GAAGuB,IAAI,CAACC,EAAE,GAAG3B,OAAO,CAACQ,UAAU,CAAC,EAAE,CAAC,CAAC;cACzM;YACJ;UACJ,CAAC,CAAC,CAAC;QACP;QACAS,MAAM,CAACC,WAAW,CAAC;MACvB,CAAC,CAAC,CACGJ,IAAI,CAAEI,WAAW,IAAK;QACvB,OAAON,OAAO,CAACC,GAAG,CAACjB,QAAQ,CAAC,CAACkB,IAAI,CAAC,MAAM;UACpC,OAAOI,WAAW;QACtB,CAAC,CAAC;MACN,CAAC,CAAC;IACN,CAAC,CAAC;EACN;EACA;AACJ;AACA;EACIU,kBAAkBA,CAACpC,OAAO,EAAEqC,SAAS,EAAE;IACnC,OAAO1D,UAAU,CAACuB,kBAAkB,CAACF,OAAO,EAAEqC,SAAS,EAAE,IAAI,CAACpD,IAAI,EAAE,CAACkB,gBAAgB,EAAER,SAAS,KAAK;MACjG,OAAO,IAAI,CAACT,OAAO,CAACkD,kBAAkB,CAACpC,OAAO,EAAEqC,SAAS,CAAC,CAACf,IAAI,CAAEgB,qBAAqB,IAAK;QACvF,MAAMlC,QAAQ,GAAG,IAAIC,KAAK,CAAC,CAAC;QAC5BzB,SAAS,CAACkB,MAAM,CAACH,SAAS,CAAC4C,MAAM,CAAC;QAClC,KAAK,MAAMC,KAAK,IAAI7C,SAAS,CAAC4C,MAAM,EAAE;UAClCnC,QAAQ,CAACE,IAAI,CAAC,IAAI,CAACmC,wBAAwB,CAAC,GAAGtC,gBAAgB,WAAWqC,KAAK,CAACrB,KAAK,EAAE,EAAEnB,OAAO,EAAEqC,SAAS,EAAEG,KAAK,EAAEF,qBAAqB,CAAC,CAAC;QAC/I;QACA,OAAOlB,OAAO,CAACC,GAAG,CAACjB,QAAQ,CAAC,CAACkB,IAAI,CAAC,MAAM;UACpC,OAAOgB,qBAAqB;QAChC,CAAC,CAAC;MACN,CAAC,CAAC;IACN,CAAC,CAAC;EACN;EACAI,cAAcA,CAAC1C,OAAO,EAAE2C,IAAI,EAAE;IAC1B,IAAIA,IAAI,CAACC,UAAU,EAAE;MACjB,OAAOD,IAAI,CAACC,UAAU;IAC1B;IACA,IAAIC,OAAO;IACX,IAAIF,IAAI,CAACG,GAAG,EAAE;MACVD,OAAO,GAAG,IAAI,CAAC3D,OAAO,CAAC6D,YAAY,CAAC/C,OAAO,EAAE2C,IAAI,EAAEA,IAAI,CAACG,GAAG,CAAC;IAChE,CAAC,MACI;MACD,MAAME,UAAU,GAAGpE,SAAS,CAAC6B,GAAG,CAAC,GAAGT,OAAO,aAAa,EAAE,IAAI,CAACd,OAAO,CAACQ,IAAI,CAACuD,WAAW,EAAEN,IAAI,CAACK,UAAU,CAAC;MACzGH,OAAO,GAAG,IAAI,CAAC3D,OAAO,CAACgE,mBAAmB,CAAC,gBAAgBF,UAAU,CAAC7B,KAAK,EAAE,EAAE6B,UAAU,CAAC;IAC9F;IACAL,IAAI,CAACC,UAAU,GAAGC,OAAO,CAACvB,IAAI,CAAE6B,IAAI,IAAK;MACrC,OAAOC,GAAG,CAACC,eAAe,CAAC,IAAIC,IAAI,CAAC,CAACH,IAAI,CAAC,EAAE;QAAEI,IAAI,EAAEZ,IAAI,CAACa;MAAS,CAAC,CAAC,CAAC;IACzE,CAAC,CAAC;IACF,OAAOb,IAAI,CAACC,UAAU;EAC1B;EACA1B,iBAAiBA,CAAClB,OAAO,EAAEQ,OAAO,EAAE;IAChCA,OAAO,CAACoB,cAAc,GAAGpB,OAAO,CAACoB,cAAc,IAAI,EAAE;IACrD,IAAI,CAACpB,OAAO,CAACiD,YAAY,EAAE;MACvB,MAAMC,YAAY,GAAG,IAAIrD,KAAK,CAAC,CAAC;MAChC,MAAMpB,IAAI,GAAGuB,OAAO,CAACvB,IAAI,IAAI,UAAUuB,OAAO,CAACW,KAAK,EAAE;MACtD,MAAMwC,OAAO,GAAG;QACZC,IAAI,EAAE,KAAK;QACXC,QAAQ,EAAE,KAAK;QACfC,MAAM,EAAEtD,OAAO,CAACsD,MAAM,IAAInD,SAAS,GAAG,CAAC,GAAGH,OAAO,CAACsD;MACtD,CAAC;MACD,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGvD,OAAO,CAACZ,KAAK,CAACoE,MAAM,EAAED,CAAC,EAAE,EAAE;QAC3C,MAAME,WAAW,GAAG,eAAe,IAAI,CAAChF,IAAI,QAAQ;QACpD,MAAM0D,IAAI,GAAG/D,SAAS,CAAC6B,GAAG,CAACwD,WAAW,EAAE,IAAI,CAAC3E,MAAM,EAAEkB,OAAO,CAACZ,KAAK,CAACmE,CAAC,CAAC,CAACpB,IAAI,CAAC;QAC3Ee,YAAY,CAACpD,IAAI,CAAC,IAAI,CAACoC,cAAc,CAAC,GAAGuB,WAAW,IAAIzD,OAAO,CAACZ,KAAK,CAACmE,CAAC,CAAC,CAACpB,IAAI,EAAE,EAAEA,IAAI,CAAC,CAACrB,IAAI,CAAE4C,SAAS,IAAK;UACvG,MAAMvC,KAAK,GAAInB,OAAO,CAACoB,cAAc,CAACmC,CAAC,CAAC,GAAG,IAAItF,KAAK,CAACQ,IAAI,EAAEiF,SAAS,EAAE,IAAI,CAAChF,OAAO,CAACiF,YAAY,EAAE,IAAI,EAAER,OAAO,CAAE;UAChHhC,KAAK,CAACjB,WAAW,GAAGF,OAAO,CAACE,WAAW,IAAI,CAAC;UAC5CiB,KAAK,CAACf,WAAW,GAAGJ,OAAO,CAACI,WAAW,IAAI,GAAG;UAC9Ce,KAAK,CAACd,aAAa,GAAGL,OAAO,CAACK,aAAa,IAAI,CAAC;UAChDc,KAAK,CAACb,aAAa,GAAGN,OAAO,CAACM,aAAa,IAAI,aAAa;QAChE,CAAC,CAAC,CAAC;MACP;MACA,MAAM+B,OAAO,GAAGzB,OAAO,CAACC,GAAG,CAACqC,YAAY,CAAC,CAACpC,IAAI,CAAC,MAAM;QACjD,MAAM8C,OAAO,GAAG5D,OAAO,CAACZ,KAAK,CAACyE,GAAG,CAAE1B,IAAI,IAAK;UACxC,OAAOA,IAAI,CAAC2B,MAAM,IAAI,CAAC;QAC3B,CAAC,CAAC;QACF,MAAMC,aAAa,GAAG,IAAI7F,aAAa,CAAC8B,OAAO,CAACoD,IAAI,IAAI,KAAK,EAAEpD,OAAO,CAACoB,cAAc,EAAEwC,OAAO,CAAC;QAC/F,IAAI5D,OAAO,CAACO,UAAU,EAAE;UACpBwD,aAAa,CAACC,yBAAyB,GAAG,CAAC,GAAGjG,KAAK,CAAC0D,SAAS,CAACzB,OAAO,CAACO,UAAU,CAAC;QACrF;QACA,IAAIP,OAAO,CAACQ,UAAU,EAAE;UACpBuD,aAAa,CAACE,yBAAyB,GAAG,CAAC,GAAGlG,KAAK,CAAC0D,SAAS,CAACzB,OAAO,CAACQ,UAAU,CAAC;QACrF;QACA,IAAIR,OAAO,CAACsD,MAAM,EAAE;UAChBS,aAAa,CAACT,MAAM,GAAGtD,OAAO,CAACsD,MAAM;QACzC;QACAtD,OAAO,CAACiD,YAAY,CAAC9B,KAAK,GAAG4C,aAAa;MAC9C,CAAC,CAAC;MACF/D,OAAO,CAACiD,YAAY,GAAG;QACnBiB,MAAM,EAAE7B;MACZ,CAAC;IACL;IACA,OAAOrC,OAAO,CAACiD,YAAY,CAACiB,MAAM;EACtC;EACAC,eAAeA,CAAC3E,OAAO,EAAE2B,KAAK,EAAEiD,MAAM,EAAEC,IAAI,EAAEC,WAAW,EAAE;IACvD,QAAQF,MAAM;MACV,KAAK,MAAM,CAAC;QAAmD;UAC3D,OAAQG,YAAY,IAAK;YACrB,MAAMC,WAAW,GAAG,CAACF,WAAW,IAAI,CAAC,KAAKC,YAAY,GAAGF,IAAI,CAAC;YAC9DlD,KAAK,CAACsD,IAAI,CAACD,WAAW,CAAC;UAC3B,CAAC;QACL;MACA,KAAK,MAAM,CAAC;QAAmD;UAC3D,OAAO,MAAM;YACTrD,KAAK,CAACuD,IAAI,CAAC,CAAC;UAChB,CAAC;QACL;MACA,KAAK,OAAO,CAAC;QAAoD;UAC7D,OAAO,MAAM;YACTvD,KAAK,CAACwD,KAAK,CAAC,CAAC;UACjB,CAAC;QACL;MACA;QAAS;UACL,MAAM,IAAIlE,KAAK,CAAC,GAAGjB,OAAO,wBAAwB4E,MAAM,EAAE,CAAC;QAC/D;IACJ;EACJ;EACAnC,wBAAwBA,CAACzC,OAAO,EAAEoF,gBAAgB,EAAE/C,SAAS,EAAEG,KAAK,EAAEF,qBAAqB,EAAE;IACzF,IAAIA,qBAAqB,CAAC+C,kBAAkB,CAACrB,MAAM,IAAI,CAAC,EAAE;MACtD,OAAO5C,OAAO,CAACkE,OAAO,CAAC,CAAC;IAC5B;IACA,MAAMC,gBAAgB,GAAGjD,qBAAqB,CAAC+C,kBAAkB,CAAC,CAAC,CAAC;IACpE,MAAM9E,YAAY,GAAGiC,KAAK,CAAChC,OAAO;IAClC,MAAMA,OAAO,GAAG5B,SAAS,CAAC6B,GAAG,CAAC,eAAe,IAAI,CAACxB,IAAI,WAAW,EAAE,IAAI,CAACM,SAAS,EAAEgB,YAAY,CAAC;IAChG,OAAO,IAAI,CAACW,iBAAiB,CAAClB,OAAO,EAAEQ,OAAO,CAAC,CAACc,IAAI,CAAC,MAAM;MACvD,MAAMK,KAAK,GAAGnB,OAAO,CAACiD,YAAY,CAAC9B,KAAK;MACxC,IAAIA,KAAK,EAAE;QACP,MAAM6D,qBAAqB,GAAG,IAAIhH,cAAc,CAACgE,KAAK,CAACqC,IAAI,EAAE,IAAI,CAACF,eAAe,CAAC3E,OAAO,EAAE2B,KAAK,EAAEa,KAAK,CAACoC,MAAM,EAAEpC,KAAK,CAACqC,IAAI,EAAErC,KAAK,CAACsC,WAAW,CAAC,CAAC;QAC/IS,gBAAgB,CAAClD,SAAS,CAACoD,QAAQ,CAACD,qBAAqB,CAAC;QAC1D;QACAlD,qBAAqB,CAACoD,6BAA6B,CAACC,GAAG,CAAC,MAAM;UAC1DhE,KAAK,CAACuD,IAAI,CAAC,CAAC;QAChB,CAAC,CAAC;QACF5C,qBAAqB,CAACsD,+BAA+B,CAACD,GAAG,CAAC,MAAM;UAC5DhE,KAAK,CAACwD,KAAK,CAAC,CAAC;QACjB,CAAC,CAAC;MACN;IACJ,CAAC,CAAC;EACN;AACJ;AACAxG,UAAU,CAACkH,iBAAiB,CAAChH,IAAI,EAAGG,MAAM,IAAK,IAAIF,kBAAkB,CAACE,MAAM,CAAC,CAAC","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}