capacitor-camera-view 2.3.1 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CapacitorCameraView.podspec +1 -1
- package/Package.swift +1 -1
- package/README.md +341 -48
- package/android/build.gradle +0 -1
- package/android/src/main/AndroidManifest.xml +0 -1
- package/android/src/main/java/com/michaelwolz/capacitorcameraview/CameraError.kt +42 -0
- package/android/src/main/java/com/michaelwolz/capacitorcameraview/CameraView.kt +946 -205
- package/android/src/main/java/com/michaelwolz/capacitorcameraview/CameraViewPlugin.kt +87 -43
- package/android/src/main/java/com/michaelwolz/capacitorcameraview/model/BarcodeDetectionResult.kt +28 -2
- package/android/src/main/java/com/michaelwolz/capacitorcameraview/model/CameraDevice.kt +6 -1
- package/android/src/main/java/com/michaelwolz/capacitorcameraview/model/CameraSessionConfiguration.kt +15 -1
- package/android/src/main/java/com/michaelwolz/capacitorcameraview/model/TorchModeState.kt +15 -0
- package/android/src/main/java/com/michaelwolz/capacitorcameraview/model/WebBoundingRect.kt +1 -1
- package/android/src/main/java/com/michaelwolz/capacitorcameraview/utils.kt +73 -19
- package/dist/docs.json +487 -30
- package/dist/esm/definitions.d.ts +494 -27
- package/dist/esm/definitions.js.map +1 -1
- package/dist/esm/utils.d.ts +59 -15
- package/dist/esm/utils.js +79 -38
- package/dist/esm/utils.js.map +1 -1
- package/dist/esm/web.d.ts +191 -13
- package/dist/esm/web.js +626 -142
- package/dist/esm/web.js.map +1 -1
- package/dist/plugin.cjs.js +713 -180
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/plugin.js +713 -180
- package/dist/plugin.js.map +1 -1
- package/ios/Sources/CameraViewPlugin/CameraError.swift +147 -2
- package/ios/Sources/CameraViewPlugin/CameraEvents.swift +41 -19
- package/ios/Sources/CameraViewPlugin/CameraSessionConfiguration.swift +29 -1
- package/ios/Sources/CameraViewPlugin/CameraViewManager+BarcodeScan.swift +78 -23
- package/ios/Sources/CameraViewPlugin/CameraViewManager+DeferredStart.swift +37 -0
- package/ios/Sources/CameraViewPlugin/CameraViewManager+Focus.swift +131 -0
- package/ios/Sources/CameraViewPlugin/CameraViewManager+Lifecycle.swift +156 -0
- package/ios/Sources/CameraViewPlugin/CameraViewManager+PhotoCapture.swift +73 -41
- package/ios/Sources/CameraViewPlugin/CameraViewManager+ResolutionSelection.swift +57 -0
- package/ios/Sources/CameraViewPlugin/CameraViewManager+Rotation.swift +195 -0
- package/ios/Sources/CameraViewPlugin/CameraViewManager+VideoDataOutput.swift +24 -12
- package/ios/Sources/CameraViewPlugin/CameraViewManager+VideoRecording.swift +22 -73
- package/ios/Sources/CameraViewPlugin/CameraViewManager+Zoom.swift +113 -0
- package/ios/Sources/CameraViewPlugin/CameraViewManager.swift +450 -403
- package/ios/Sources/CameraViewPlugin/CameraViewPlugin.swift +111 -69
- package/ios/Sources/CameraViewPlugin/Utils.swift +61 -7
- package/package.json +25 -9
package/dist/plugin.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.cjs.js","sources":["esm/index.js","esm/utils.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\n/**\n * The main Capacitor Camera View plugin instance.\n */\nconst CameraView = registerPlugin('CameraView', {\n web: () => import('./web').then((m) => new m.CameraViewWeb()),\n});\nexport * from './definitions';\nexport { CameraView };\n//# sourceMappingURL=index.js.map","/**\n * Converts canvas to base64 string\n */\nexport function canvasToBase64(canvas, quality) {\n const dataUrl = canvas.toDataURL('image/jpeg', quality);\n return dataUrl.split(',')[1];\n}\n/**\n * Calculates the visible area of the video based on object-fit: cover\n */\nexport function calculateVisibleArea(video) {\n // Get the displayed dimensions of the video element\n const videoRect = video.getBoundingClientRect();\n const displayWidth = videoRect.width;\n const displayHeight = videoRect.height;\n // Get the intrinsic dimensions of the video\n const videoWidth = video.videoWidth;\n const videoHeight = video.videoHeight;\n // Calculate which portion of the video is visible (for object-fit: cover)\n const videoAspect = videoWidth / videoHeight;\n const displayAspect = displayWidth / displayHeight;\n let sourceX = 0;\n let sourceY = 0;\n let sourceWidth = videoWidth;\n let sourceHeight = videoHeight;\n // If video aspect ratio is greater than display aspect ratio,\n // the video is cropped on the sides\n if (videoAspect > displayAspect) {\n sourceWidth = videoHeight * displayAspect;\n sourceX = (videoWidth - sourceWidth) / 2;\n }\n // Otherwise the video is cropped on the top and bottom\n else {\n sourceHeight = videoWidth / displayAspect;\n sourceY = (videoHeight - sourceHeight) / 2;\n }\n return {\n sourceX,\n sourceY,\n sourceWidth,\n sourceHeight,\n displayWidth,\n displayHeight,\n };\n}\n/**\n * Draws the visible area of the video to the canvas\n */\nexport function drawVisibleAreaToCanvas(canvas, videoElement, area) {\n const { sourceX, sourceY, sourceWidth, sourceHeight, displayWidth, displayHeight } = area;\n // Set canvas size to match the displayed dimensions\n canvas.width = displayWidth;\n canvas.height = displayHeight;\n const ctx = canvas.getContext('2d', { alpha: false });\n if (!ctx) {\n throw new Error('Could not get canvas context');\n }\n // Draw only the visible portion of the video to match what the user sees\n ctx.drawImage(videoElement, sourceX, sourceY, sourceWidth, sourceHeight, 0, 0, displayWidth, displayHeight);\n}\n/**\n * Transforms barcode coordinates from the video source space to display space\n * accounting for object-fit: cover scaling and cropping.\n *\n * @param barcodeBoundingBox The original barcode bounding box from the detector\n * @param videoElement The video element with the camera stream\n * @returns The transformed bounding box coordinates in display space\n */\nexport function transformBarcodeBoundingBox(barcodeBoundingBox, videoElement) {\n // Get the video element's displayed dimensions\n const videoRect = videoElement.getBoundingClientRect();\n const displayWidth = videoRect.width;\n const displayHeight = videoRect.height;\n // Get original video dimensions\n const videoWidth = videoElement.videoWidth;\n const videoHeight = videoElement.videoHeight;\n // Calculate scaling and positioning for object-fit: cover\n const videoAspect = videoWidth / videoHeight;\n const displayAspect = displayWidth / displayHeight;\n let scaledX, scaledY, scaledWidth, scaledHeight;\n if (videoAspect > displayAspect) {\n // Video is wider than display area - height matches, width is centered and cropped\n const scale = displayHeight / videoHeight;\n const scaledVideoWidth = videoWidth * scale;\n const cropX = (scaledVideoWidth - displayWidth) / 2;\n scaledWidth = barcodeBoundingBox.width * scale;\n scaledHeight = barcodeBoundingBox.height * scale;\n scaledX = barcodeBoundingBox.x * scale - cropX;\n scaledY = barcodeBoundingBox.y * scale;\n }\n else {\n // Video is taller than display area - width matches, height is centered and cropped\n const scale = displayWidth / videoWidth;\n const scaledVideoHeight = videoHeight * scale;\n const cropY = (scaledVideoHeight - displayHeight) / 2;\n scaledWidth = barcodeBoundingBox.width * scale;\n scaledHeight = barcodeBoundingBox.height * scale;\n scaledX = barcodeBoundingBox.x * scale;\n scaledY = barcodeBoundingBox.y * scale - cropY;\n }\n return {\n x: scaledX,\n y: scaledY,\n width: scaledWidth,\n height: scaledHeight,\n };\n}\n//# sourceMappingURL=utils.js.map","var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n};\nvar _CameraViewWeb_isRunning;\nimport { WebPlugin } from '@capacitor/core';\nimport { calculateVisibleArea, canvasToBase64, drawVisibleAreaToCanvas, transformBarcodeBoundingBox } from './utils';\nexport const BARCODE_TYPE_TO_WEB_FORMAT = {\n qr: 'qr_code',\n code128: 'code_128',\n code39: 'code_39',\n code39Mod43: null,\n code93: 'code_93',\n ean8: 'ean_8',\n ean13: 'ean_13',\n interleaved2of5: 'itf',\n itf14: 'itf',\n pdf417: 'pdf417',\n aztec: 'aztec',\n dataMatrix: 'data_matrix',\n upce: 'upc_e',\n};\n/**\n * Web implementation of the CameraViewPlugin.\n * Optimized for performance and battery efficiency.\n */\nexport class CameraViewWeb extends WebPlugin {\n constructor() {\n super();\n // DOM elements\n this.videoElement = null;\n this.canvasElement = null;\n // Stream state\n this.stream = null;\n _CameraViewWeb_isRunning.set(this, false);\n // Configuration state\n this.currentCamera = 'environment'; // Default to back camera\n this.currentZoom = 1.0;\n this.currentFlashMode = 'off';\n // Barcode detection support\n this.barcodeDetectionSupported = false;\n this.barcodeDetector = null;\n // Recording state\n this.mediaRecorder = null;\n this.recordedChunks = [];\n this.recordingAudioTrack = null;\n this.recordingResolve = null;\n this.recordingReject = null;\n this.checkBarcodeDetectionSupport();\n }\n /**\n * Start the camera with the given configuration\n */\n async start(options) {\n if (__classPrivateFieldGet(this, _CameraViewWeb_isRunning, \"f\")) {\n return;\n }\n const permissionStatus = await this.requestPermissions();\n if (permissionStatus.camera !== 'granted') {\n throw new Error('Camera permission was not granted');\n }\n try {\n // Set up video element if it doesn't exist\n if (!this.videoElement) {\n await this.setupVideoElement(options === null || options === void 0 ? void 0 : options.containerElementId);\n }\n // Set up video constraints based on options\n const videoConstraints = {};\n // Prefer deviceId if specified\n if (options === null || options === void 0 ? void 0 : options.deviceId) {\n videoConstraints.deviceId = { exact: options.deviceId };\n // Remember the current camera mode (though we're using a specific device)\n this.currentCamera = (options === null || options === void 0 ? void 0 : options.position) === 'front' ? 'user' : 'environment';\n }\n else {\n // Fall back to facing mode\n const facingMode = (options === null || options === void 0 ? void 0 : options.position) === 'front' ? 'user' : 'environment';\n this.currentCamera = facingMode;\n videoConstraints.facingMode = facingMode;\n }\n const constraints = {\n video: videoConstraints,\n audio: false,\n };\n this.stream = await navigator.mediaDevices.getUserMedia(constraints);\n if (this.videoElement) {\n this.videoElement.srcObject = this.stream;\n this.videoElement.play();\n __classPrivateFieldSet(this, _CameraViewWeb_isRunning, true, \"f\");\n // If barcode detection is enabled and supported, start detection\n if (options === null || options === void 0 ? void 0 : options.enableBarcodeDetection) {\n await this.checkBarcodeDetectionSupport();\n if (this.barcodeDetectionSupported) {\n await this.configureBarcodeDetector(options === null || options === void 0 ? void 0 : options.barcodeTypes);\n this.startBarcodeDetection();\n }\n }\n }\n }\n catch (err) {\n throw new Error(`Failed to start camera: ${this.formatError(err)}`);\n }\n }\n /**\n * Stop the camera and release resources\n */\n async stop() {\n var _a;\n if (!__classPrivateFieldGet(this, _CameraViewWeb_isRunning, \"f\")) {\n return;\n }\n try {\n // Stop any active recording\n if (this.mediaRecorder && this.mediaRecorder.state !== 'inactive') {\n // Reject any pending stopRecording promise since we're force-stopping\n (_a = this.recordingReject) === null || _a === void 0 ? void 0 : _a.call(this, new Error('Camera session stopped while recording'));\n this.recordingResolve = null;\n this.recordingReject = null;\n this.mediaRecorder.stop();\n this.mediaRecorder = null;\n }\n this.recordedChunks = [];\n if (this.recordingAudioTrack) {\n this.recordingAudioTrack.stop();\n this.recordingAudioTrack = null;\n }\n // Stop all tracks in the stream\n if (this.stream) {\n this.stream.getTracks().forEach((track) => track.stop());\n this.stream = null;\n }\n // Clear video source\n if (this.videoElement) {\n this.videoElement = null;\n }\n __classPrivateFieldSet(this, _CameraViewWeb_isRunning, false, \"f\");\n }\n catch (err) {\n throw new Error(`Failed to stop camera: ${this.formatError(err)}`);\n }\n }\n /**\n * Check if the camera is currently running\n */\n async isRunning() {\n return { isRunning: __classPrivateFieldGet(this, _CameraViewWeb_isRunning, \"f\") };\n }\n /**\n * Capture a photo using the camera and return it as a base64-encoded JPEG image.\n * Preserves what the user actually sees in the UI, including cropping from object-fit: cover.\n */\n async capture(options) {\n const videoElement = this.videoElement;\n if (!__classPrivateFieldGet(this, _CameraViewWeb_isRunning, \"f\") || !videoElement) {\n throw new Error('Camera is not running');\n }\n try {\n const canvas = this.getCanvasElement();\n const visibleArea = calculateVisibleArea(videoElement);\n drawVisibleAreaToCanvas(canvas, videoElement, visibleArea);\n const quality = Math.min(1.0, Math.max(0.1, options.quality / 100));\n if (options.saveToFile) {\n // Create a blob from canvas and return a blob URL\n return new Promise((resolve, reject) => {\n canvas.toBlob((blob) => {\n if (!blob) {\n reject(new Error('Failed to create blob from canvas'));\n return;\n }\n const url = URL.createObjectURL(blob);\n resolve({ webPath: url });\n }, 'image/jpeg', quality);\n });\n }\n else {\n // Return base64 data\n const base64Data = canvasToBase64(canvas, quality);\n return { photo: base64Data };\n }\n }\n catch (err) {\n throw new Error(`Failed to capture photo: ${this.formatError(err)}`);\n }\n }\n /**\n * Web implementation already uses images from the video stream, so this is the same as `capture()`\n */\n async captureSample(options) {\n return this.capture(options);\n }\n /**\n * Start recording video using MediaRecorder API\n */\n async startRecording(options) {\n if (!__classPrivateFieldGet(this, _CameraViewWeb_isRunning, \"f\") || !this.videoElement) {\n throw new Error('Camera is not running');\n }\n if (this.mediaRecorder) {\n throw new Error('Recording is already in progress');\n }\n try {\n let stream = this.stream;\n // If audio is requested, get a new stream with audio track\n if ((options === null || options === void 0 ? void 0 : options.enableAudio) && stream) {\n const audioStream = await navigator.mediaDevices.getUserMedia({ audio: true });\n const audioTrack = audioStream.getAudioTracks()[0];\n this.recordingAudioTrack = audioTrack;\n const videoTracks = stream.getVideoTracks();\n stream = new MediaStream([...videoTracks, audioTrack]);\n }\n if (!stream) {\n throw new Error('No camera stream available');\n }\n this.recordedChunks = [];\n const mimeType = ['video/webm;codecs=vp9', 'video/webm', 'video/mp4'].find((type) => MediaRecorder.isTypeSupported(type));\n if (!mimeType) {\n throw new Error('No supported video recording format found');\n }\n this.mediaRecorder = new MediaRecorder(stream, { mimeType });\n this.mediaRecorder.ondataavailable = (event) => {\n if (event.data && event.data.size > 0) {\n this.recordedChunks.push(event.data);\n }\n };\n this.mediaRecorder.onstop = () => {\n var _a;\n // Stop audio track if it was added for recording\n if (this.recordingAudioTrack) {\n this.recordingAudioTrack.stop();\n this.recordingAudioTrack = null;\n }\n const blob = new Blob(this.recordedChunks, { type: mimeType });\n const url = URL.createObjectURL(blob);\n this.recordedChunks = [];\n this.mediaRecorder = null;\n (_a = this.recordingResolve) === null || _a === void 0 ? void 0 : _a.call(this, { webPath: url });\n this.recordingResolve = null;\n this.recordingReject = null;\n };\n this.mediaRecorder.onerror = (event) => {\n var _a, _b, _c;\n if (this.recordingAudioTrack) {\n this.recordingAudioTrack.stop();\n this.recordingAudioTrack = null;\n }\n this.mediaRecorder = null;\n this.recordedChunks = [];\n const errorMessage = (_b = (_a = event.error) === null || _a === void 0 ? void 0 : _a.message) !== null && _b !== void 0 ? _b : 'Unknown recording error';\n (_c = this.recordingReject) === null || _c === void 0 ? void 0 : _c.call(this, new Error('Recording error: ' + errorMessage));\n this.recordingResolve = null;\n this.recordingReject = null;\n };\n this.mediaRecorder.start(100); // Collect data in 100ms chunks\n }\n catch (err) {\n if (this.recordingAudioTrack) {\n this.recordingAudioTrack.stop();\n this.recordingAudioTrack = null;\n }\n this.mediaRecorder = null;\n this.recordedChunks = [];\n throw new Error(`Failed to start recording: ${this.formatError(err)}`);\n }\n }\n /**\n * Stop the current video recording\n */\n async stopRecording() {\n if (!this.mediaRecorder) {\n throw new Error('No recording is in progress');\n }\n return new Promise((resolve, reject) => {\n var _a;\n this.recordingResolve = resolve;\n this.recordingReject = reject;\n (_a = this.mediaRecorder) === null || _a === void 0 ? void 0 : _a.stop();\n });\n }\n /**\n * Flip between front and back camera\n */\n async flipCamera() {\n if (!__classPrivateFieldGet(this, _CameraViewWeb_isRunning, \"f\")) {\n throw new Error('Camera is not running');\n }\n try {\n // Switch current camera\n this.currentCamera = this.currentCamera === 'user' ? 'environment' : 'user';\n // Stop current stream\n if (this.stream) {\n this.stream.getTracks().forEach((track) => track.stop());\n }\n // Restart with new facing mode\n const constraints = {\n video: {\n facingMode: this.currentCamera,\n },\n audio: false,\n };\n this.stream = await navigator.mediaDevices.getUserMedia(constraints);\n if (this.videoElement) {\n this.videoElement.srcObject = this.stream;\n }\n }\n catch (err) {\n throw new Error(`Failed to flip camera: ${this.formatError(err)}`);\n }\n }\n /**\n * Get available camera devices\n */\n async getAvailableDevices() {\n try {\n const devices = await navigator.mediaDevices.enumerateDevices();\n const videoDevices = devices.filter((device) => device.kind === 'videoinput');\n return {\n devices: videoDevices.map((device) => ({\n id: device.deviceId,\n name: device.label || `Camera ${device.deviceId.substring(0, 5)}`,\n position: device.label.toLowerCase().includes('front') ? 'front' : 'back',\n })),\n };\n }\n catch (err) {\n console.error('Failed to get available devices', err);\n return { devices: [] };\n }\n }\n /**\n * Get current zoom information (web has limited zoom support)\n */\n async getZoom() {\n // Web has limited zoom capabilities in most browsers,\n // we fake zoomin by scaling the video element\n return {\n min: 1.0,\n max: 3.0,\n current: this.currentZoom,\n };\n }\n /**\n * Set zoom level (limited support in web)\n */\n async setZoom(options) {\n // Store the requested zoom level\n this.currentZoom = options.level;\n // Apply visual zoom using CSS transform when native zoom isn't supported\n if (this.videoElement) {\n this.videoElement.style.transition = options.ramp ? 'transform 0.2s ease-in-out' : 'none';\n const scale = Math.max(1.0, Math.min(options.level, 3.0)); // Limit scale to reasonable bounds\n this.videoElement.style.transform = `scale(${scale})`;\n this.videoElement.style.transformOrigin = 'center';\n }\n }\n /**\n * Get current flash mode\n */\n async getFlashMode() {\n return { flashMode: this.currentFlashMode };\n }\n /**\n * Get supported flash modes\n */\n async getSupportedFlashModes() {\n // Web has limited flash control\n return { flashModes: ['off'] };\n }\n /**\n * Set flash mode (limited support in web)\n */\n async setFlashMode(options) {\n this.currentFlashMode = options.mode;\n console.warn('Flash mode control is not fully supported in the web implementation');\n }\n /**\n * Check if torch is available (not supported in web)\n */\n async isTorchAvailable() {\n // Torch is not supported in web implementation\n return { available: false };\n }\n /**\n * Get torch mode (not supported in web)\n */\n async getTorchMode() {\n // Torch is not supported in web implementation\n return { enabled: false, level: 0.0 };\n }\n /**\n * Set torch mode (not supported in web)\n */\n async setTorchMode() {\n // Torch is not supported in web implementation\n throw this.unimplemented('Torch control is not supported in web implementation.');\n }\n /**\n * Check camera and microphone permission without requesting\n */\n async checkPermissions() {\n try {\n // Use Permissions API if available\n if (navigator.permissions) {\n const [cameraResult, microphoneResult] = await Promise.all([\n navigator.permissions.query({ name: 'camera' }),\n navigator.permissions.query({ name: 'microphone' }),\n ]);\n return {\n camera: cameraResult.state === 'granted' ? 'granted' : cameraResult.state === 'denied' ? 'denied' : 'prompt',\n microphone: microphoneResult.state === 'granted'\n ? 'granted'\n : microphoneResult.state === 'denied'\n ? 'denied'\n : 'prompt',\n };\n }\n // If Permissions API is not available, fall back to checking the active stream\n return {\n camera: this.stream ? 'granted' : 'prompt',\n microphone: 'prompt',\n };\n }\n catch (err) {\n // If permissions API is not supported or fails\n return {\n camera: 'prompt',\n microphone: 'prompt',\n };\n }\n }\n /**\n * Request camera and/or microphone permissions from the user.\n * By default, only camera permission is requested.\n */\n async requestPermissions(options) {\n var _a;\n const permissions = (_a = options === null || options === void 0 ? void 0 : options.permissions) !== null && _a !== void 0 ? _a : ['camera'];\n const result = { camera: 'prompt', microphone: 'prompt' };\n // Request camera permission if included\n if (permissions.includes('camera')) {\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ video: true });\n stream.getTracks().forEach((track) => track.stop());\n result.camera = 'granted';\n }\n catch (_b) {\n result.camera = 'denied';\n }\n }\n else {\n // Still report current status even if not requesting\n result.camera = (await this.checkPermissions()).camera;\n }\n // Request microphone permission only if explicitly included\n if (permissions.includes('microphone')) {\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n stream.getTracks().forEach((track) => track.stop());\n result.microphone = 'granted';\n }\n catch (_c) {\n result.microphone = 'denied';\n }\n }\n else {\n result.microphone = (await this.checkPermissions()).microphone;\n }\n return result;\n }\n /**\n * Start barcode detection if supported\n */\n async startBarcodeDetection() {\n const barcodeDetector = this.barcodeDetector;\n const videoElement = this.videoElement;\n if (!this.barcodeDetectionSupported || !barcodeDetector || !videoElement) {\n return;\n }\n // Make sure video is fully loaded before starting detection\n if (videoElement.readyState < 2) {\n await new Promise((resolve) => {\n const loadHandler = () => {\n videoElement.removeEventListener('loadeddata', loadHandler);\n resolve();\n };\n videoElement.addEventListener('loadeddata', loadHandler);\n });\n }\n // Add throttling to reduce CPU usage\n let lastDetectionTime = 0;\n const minTimeBetweenDetections = 100; // ms\n // Set up periodic frame analysis for barcode detection\n const detectFrame = async () => {\n if (!__classPrivateFieldGet(this, _CameraViewWeb_isRunning, \"f\") || !videoElement || !barcodeDetector) {\n return;\n }\n const now = Date.now();\n if (now - lastDetectionTime >= minTimeBetweenDetections) {\n try {\n const barcodes = await barcodeDetector.detect(videoElement);\n lastDetectionTime = now;\n if (barcodes.length > 0) {\n const barcode = barcodes[0];\n // Transform barcode coordinates using the utility function\n const boundingRect = transformBarcodeBoundingBox(barcode.boundingBox, videoElement);\n this.notifyListeners('barcodeDetected', {\n value: barcode.rawValue,\n type: barcode.format.toLowerCase(),\n boundingRect,\n });\n }\n }\n catch (err) {\n console.error('Barcode detection error', err);\n }\n }\n if (__classPrivateFieldGet(this, _CameraViewWeb_isRunning, \"f\")) {\n requestAnimationFrame(detectFrame);\n }\n };\n requestAnimationFrame(detectFrame);\n }\n /**\n * Clean up resources when the plugin is disposed\n */\n async handleOnDestroy() {\n var _a;\n await this.stop();\n // Remove elements from DOM\n if ((_a = this.videoElement) === null || _a === void 0 ? void 0 : _a.parentNode) {\n this.videoElement.parentNode.removeChild(this.videoElement);\n this.videoElement = null;\n }\n if (this.canvasElement) {\n this.canvasElement = null;\n }\n this.barcodeDetector = null;\n }\n /**\n * Check if barcode detection is supported in this browser\n */\n async checkBarcodeDetectionSupport() {\n if ('BarcodeDetector' in window) {\n try {\n this.barcodeDetector = new BarcodeDetector();\n this.barcodeDetectionSupported = true;\n }\n catch (e) {\n console.warn('BarcodeDetector is not supported by this browser.');\n this.barcodeDetectionSupported = false;\n }\n }\n }\n /**\n * Configure the barcode detector with requested barcode formats.\n * Unsupported formats are ignored and logged.\n */\n async configureBarcodeDetector(barcodeTypes) {\n if (!this.barcodeDetectionSupported) {\n return;\n }\n if (!(barcodeTypes === null || barcodeTypes === void 0 ? void 0 : barcodeTypes.length)) {\n this.barcodeDetector = new BarcodeDetector();\n return;\n }\n const requestedFormats = barcodeTypes\n .map((barcodeType) => {\n const webFormat = BARCODE_TYPE_TO_WEB_FORMAT[barcodeType];\n if (!webFormat) {\n console.warn(`[CameraView] Barcode type \"${barcodeType}\" is not supported by the web BarcodeDetector API.`);\n }\n return webFormat;\n })\n .filter((format) => format !== null);\n if (!requestedFormats.length) {\n console.warn('[CameraView] No requested barcode types are supported on web. Falling back to all supported formats.');\n this.barcodeDetector = new BarcodeDetector();\n return;\n }\n const uniqueRequestedFormats = Array.from(new Set(requestedFormats));\n try {\n const supportedFormats = await BarcodeDetector.getSupportedFormats();\n const configuredFormats = uniqueRequestedFormats.filter((format) => supportedFormats.includes(format));\n const ignoredFormats = uniqueRequestedFormats.filter((format) => !supportedFormats.includes(format));\n if (ignoredFormats.length) {\n console.warn(`[CameraView] Ignoring unsupported barcode formats for this browser: ${ignoredFormats.join(', ')}.`);\n }\n if (!configuredFormats.length) {\n console.warn('[CameraView] No requested barcode formats are available in this browser. Falling back to all supported formats.');\n this.barcodeDetector = new BarcodeDetector();\n return;\n }\n this.barcodeDetector = new BarcodeDetector({ formats: configuredFormats });\n }\n catch (error) {\n console.warn('[CameraView] Failed to resolve supported barcode formats; falling back to unfiltered detector.', error);\n this.barcodeDetector = new BarcodeDetector();\n }\n }\n /**\n * Set up the video element for the camera view\n */\n async setupVideoElement(containerElementId) {\n this.videoElement = document.createElement('video');\n this.videoElement.playsInline = true;\n this.videoElement.autoplay = true;\n this.videoElement.muted = true;\n this.videoElement.style.width = '100%';\n this.videoElement.style.height = '100%';\n this.videoElement.style.objectFit = 'cover';\n // If a container ID is provided, find that element and append the video to it\n if (containerElementId) {\n const container = document.getElementById(containerElementId);\n if (!container) {\n throw new Error(`Container element with ID ${containerElementId} not found`);\n }\n container.appendChild(this.videoElement);\n }\n else {\n // Otherwise, append to body as fallback\n document.body.appendChild(this.videoElement);\n }\n }\n /**\n * Ensures canvas element exists and returns it\n */\n getCanvasElement() {\n if (!this.canvasElement) {\n this.canvasElement = document.createElement('canvas');\n }\n return this.canvasElement;\n }\n /**\n * Format error message\n */\n formatError(err) {\n return err instanceof Error ? err.message : String(err);\n }\n}\n_CameraViewWeb_isRunning = new WeakMap();\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","this","WebPlugin"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin.cjs.js","sources":["esm/index.js","esm/utils.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\n/**\n * The main Capacitor Camera View plugin instance.\n */\nconst CameraView = registerPlugin('CameraView', {\n web: () => import('./web').then((m) => new m.CameraViewWeb()),\n});\nexport * from './definitions';\nexport { CameraView };\n//# sourceMappingURL=index.js.map","/**\n * Converts canvas to base64 string\n */\nexport function canvasToBase64(canvas, quality) {\n const dataUrl = canvas.toDataURL('image/jpeg', quality);\n return dataUrl.split(',')[1];\n}\n/**\n * Calculates the visible area of the video based on object-fit: cover.\n *\n * The `output*` dimensions default to the visible crop's intrinsic (source)\n * pixel size, so a capture keeps the full detail the stream delivers for that\n * region instead of being downscaled to CSS pixels.\n */\nexport function calculateVisibleArea(video) {\n // Get the displayed dimensions of the video element\n const videoRect = video.getBoundingClientRect();\n const displayWidth = videoRect.width;\n const displayHeight = videoRect.height;\n // Get the intrinsic dimensions of the video\n const videoWidth = video.videoWidth;\n const videoHeight = video.videoHeight;\n // Calculate which portion of the video is visible (for object-fit: cover)\n const videoAspect = videoWidth / videoHeight;\n const displayAspect = displayWidth / displayHeight;\n let sourceX = 0;\n let sourceY = 0;\n let sourceWidth = videoWidth;\n let sourceHeight = videoHeight;\n // If video aspect ratio is greater than display aspect ratio,\n // the video is cropped on the sides\n if (videoAspect > displayAspect) {\n sourceWidth = videoHeight * displayAspect;\n sourceX = (videoWidth - sourceWidth) / 2;\n }\n // Otherwise the video is cropped on the top and bottom\n else {\n sourceHeight = videoWidth / displayAspect;\n sourceY = (videoHeight - sourceHeight) / 2;\n }\n // Rasterize the capture at the visible crop's native resolution. Rounding\n // keeps the canvas dimensions integral without distorting the aspect ratio.\n const outputWidth = Math.round(sourceWidth);\n const outputHeight = Math.round(sourceHeight);\n return {\n sourceX,\n sourceY,\n sourceWidth,\n sourceHeight,\n displayWidth,\n displayHeight,\n outputWidth,\n outputHeight,\n };\n}\n/**\n * The full video frame as a {@link VisibleArea}: no cropping, rasterized at\n * the stream's intrinsic resolution.\n *\n * Used when the session was started with an explicit `aspectRatio`, where the\n * cross-platform contract is that `capture()` returns the full sensor-ratio\n * frame rather than the on-screen cover-cropped region.\n */\nexport function calculateFullFrameArea(video) {\n const videoRect = video.getBoundingClientRect();\n return {\n sourceX: 0,\n sourceY: 0,\n sourceWidth: video.videoWidth,\n sourceHeight: video.videoHeight,\n displayWidth: videoRect.width,\n displayHeight: videoRect.height,\n outputWidth: video.videoWidth,\n outputHeight: video.videoHeight,\n };\n}\n/**\n * Further crops a {@link VisibleArea} to account for a CSS `transform: scale()`\n * zoom applied to the video element.\n *\n * The CSS-fallback zoom magnifies the preview about its center, but\n * `getBoundingClientRect()` reports the post-transform size and therefore\n * leaves the crop unchanged. Tightening the source rectangle by `scale`, kept\n * centered, makes a capture match what the user actually sees.\n *\n * A `scale <= 1` (no zoom) returns the area unchanged.\n */\nexport function applyCssZoomCrop(area, scale) {\n if (!(scale > 1)) {\n return area;\n }\n const sourceWidth = area.sourceWidth / scale;\n const sourceHeight = area.sourceHeight / scale;\n return Object.assign(Object.assign({}, area), { sourceX: area.sourceX + (area.sourceWidth - sourceWidth) / 2, sourceY: area.sourceY + (area.sourceHeight - sourceHeight) / 2, sourceWidth,\n sourceHeight, outputWidth: Math.round(sourceWidth), outputHeight: Math.round(sourceHeight) });\n}\n/**\n * Draws the visible area of the video to the canvas at the crop's target\n * output resolution (see {@link VisibleArea.outputWidth}).\n */\nexport function drawVisibleAreaToCanvas(canvas, videoElement, area) {\n const { sourceX, sourceY, sourceWidth, sourceHeight, outputWidth, outputHeight } = area;\n // Sized to the crop's intrinsic pixel size rather than the CSS-pixel preview\n // size, so the JPEG keeps the stream's real detail.\n canvas.width = outputWidth;\n canvas.height = outputHeight;\n const ctx = canvas.getContext('2d', { alpha: false });\n if (!ctx) {\n throw new Error('Could not get canvas context');\n }\n // Draw only the visible portion of the video to match what the user sees\n ctx.drawImage(videoElement, sourceX, sourceY, sourceWidth, sourceHeight, 0, 0, outputWidth, outputHeight);\n}\n/**\n * Transforms barcode coordinates from the video source space to display space,\n * accounting for how the video element is scaled into its container.\n *\n * Both `object-fit` modes are a single-scale, centered mapping and share one\n * formula, differing only in which axis scale wins: `'cover'` takes the larger\n * (center-cropped), `'fit'` the smaller (letterboxed).\n *\n * @param barcodeBoundingBox The original barcode bounding box from the detector\n * @param videoElement The video element with the camera stream\n * @param scaleMode Whether the preview uses `cover` or `fit` scaling\n * @returns The transformed bounding box coordinates in display space\n */\nexport function transformBarcodeBoundingBox(barcodeBoundingBox, videoElement, scaleMode = 'cover') {\n // Get the video element's displayed dimensions\n const videoRect = videoElement.getBoundingClientRect();\n const displayWidth = videoRect.width;\n const displayHeight = videoRect.height;\n // Get original video dimensions\n const videoWidth = videoElement.videoWidth;\n const videoHeight = videoElement.videoHeight;\n const scaleX = displayWidth / videoWidth;\n const scaleY = displayHeight / videoHeight;\n const scale = scaleMode === 'fit' ? Math.min(scaleX, scaleY) : Math.max(scaleX, scaleY);\n // Centering offset of the scaled frame within the container: negative on a\n // cropped axis, positive on a letterboxed one.\n const offsetX = (displayWidth - videoWidth * scale) / 2;\n const offsetY = (displayHeight - videoHeight * scale) / 2;\n return {\n x: barcodeBoundingBox.x * scale + offsetX,\n y: barcodeBoundingBox.y * scale + offsetY,\n width: barcodeBoundingBox.width * scale,\n height: barcodeBoundingBox.height * scale,\n };\n}\n//# sourceMappingURL=utils.js.map","var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n};\nvar _CameraViewWeb_isRunning;\nimport { WebPlugin } from '@capacitor/core';\nimport { applyCssZoomCrop, calculateFullFrameArea, calculateVisibleArea, canvasToBase64, drawVisibleAreaToCanvas, transformBarcodeBoundingBox, } from './utils';\n/**\n * Suppression window in milliseconds during which a repeat of the same barcode\n * (identical value + type) is not re-emitted. A genuinely new code still emits\n * immediately. Kept consistent with the iOS and Android implementations.\n */\nexport const BARCODE_SUPPRESSION_WINDOW_MS = 500;\n/**\n * Once the per-key dedupe map grows past this size, expired entries are pruned\n * so a long session scanning many different codes stays bounded. Kept\n * consistent with the iOS and Android implementations.\n */\nexport const BARCODE_DEDUPE_MAP_PRUNE_THRESHOLD = 64;\n/**\n * Backstop for the \"wait until the video is ready\" step in\n * {@link CameraViewWeb.startBarcodeDetection}. If the video element never\n * fires `loadeddata` (e.g. a stalled stream), the wait settles anyway after\n * this many milliseconds instead of leaving a dangling listener and a\n * permanently pending promise.\n */\nexport const BARCODE_VIDEO_READY_TIMEOUT_MS = 5000;\n/**\n * Baseline `ideal` capture resolution requested from `getUserMedia` in\n * {@link CameraViewWeb.start}. Without any width/height hint, browsers default\n * to a low-resolution stream (often 640x480), which caps capture quality.\n *\n * These are `ideal` (not `exact`/`min`) so devices that cannot deliver\n * 1080p-class video still start at their best available resolution rather\n * than failing acquisition.\n */\nexport const DEFAULT_IDEAL_CAPTURE_WIDTH = 1920;\nexport const DEFAULT_IDEAL_CAPTURE_HEIGHT = 1080;\n/**\n * Bounds for the CSS `transform: scale()` zoom simulation used when the browser\n * does not expose a native `zoom` track capability. `getZoom` reports this\n * range and `setZoom` clamps the applied scale to it in fallback mode.\n */\nexport const SIMULATED_ZOOM_MIN = 1.0;\nexport const SIMULATED_ZOOM_MAX = 3.0;\nexport const BARCODE_TYPE_TO_WEB_FORMAT = {\n qr: 'qr_code',\n code128: 'code_128',\n code39: 'code_39',\n code39Mod43: null,\n code93: 'code_93',\n codabar: 'codabar',\n ean8: 'ean_8',\n ean13: 'ean_13',\n interleaved2of5: 'itf',\n itf14: 'itf',\n pdf417: 'pdf417',\n aztec: 'aztec',\n dataMatrix: 'data_matrix',\n upcA: 'upc_a',\n upce: 'upc_e',\n};\n/**\n * Inverse of {@link BARCODE_TYPE_TO_WEB_FORMAT}: maps the web BarcodeDetector\n * format back onto the cross-platform {@link BarcodeType} vocabulary so the\n * `barcodeDetected` event emits the same `type` values as iOS and Android.\n *\n * Note: `interleaved2of5` and `itf14` both map to the web format `itf`, so the\n * inversion has a collision that is resolved by insertion order — `itf14` comes\n * last in {@link BARCODE_TYPE_TO_WEB_FORMAT} and wins, which is the intended\n * result for `itf` detections.\n */\nexport const WEB_FORMAT_TO_BARCODE_TYPE = Object.entries(BARCODE_TYPE_TO_WEB_FORMAT).reduce((acc, [barcodeType, webFormat]) => {\n if (webFormat) {\n acc[webFormat] = barcodeType;\n }\n return acc;\n}, {});\n/**\n * Error thrown by the web implementation for a rejected plugin call.\n *\n * Carries a stable `code` from the {@link CameraErrorCode} vocabulary, the\n * same public contract iOS and Android provide, so consumers can `switch` on\n * `error.code` instead of matching on the human-readable `message`.\n *\n * Methods that reject via `WebPlugin.unimplemented()` are the one exception:\n * those keep Capacitor's own `UNIMPLEMENTED` convention.\n */\nexport class CameraViewError extends Error {\n constructor(message, code) {\n super(message);\n this.name = 'CameraViewError';\n this.code = code;\n }\n}\n/**\n * Classifies a `getUserMedia` failure into the closest-fitting\n * {@link CameraErrorCode}, shared by every acquisition site.\n *\n * `kind` selects which media type's dedicated codes apply for `NotFoundError`/\n * `NotReadableError` so a missing/busy camera and a missing/busy microphone\n * aren't conflated. Anything unmappable falls back to `UNKNOWN_ERROR`.\n */\nexport function classifyGetUserMediaErrorCode(err, kind) {\n if (err instanceof DOMException) {\n switch (err.name) {\n case 'NotAllowedError':\n return 'PERMISSION_DENIED';\n case 'NotFoundError':\n return kind === 'camera' ? 'CAMERA_UNAVAILABLE' : 'AUDIO_DEVICE_UNAVAILABLE';\n case 'NotReadableError':\n return kind === 'camera' ? 'DEVICE_LOCKED' : 'AUDIO_INPUT_ADDITION_FAILED';\n }\n }\n return 'UNKNOWN_ERROR';\n}\n/**\n * Web implementation of the CameraViewPlugin.\n * Optimized for performance and battery efficiency.\n */\nexport class CameraViewWeb extends WebPlugin {\n constructor() {\n super();\n // DOM elements\n this.videoElement = null;\n this.canvasElement = null;\n // Stream state\n this.stream = null;\n _CameraViewWeb_isRunning.set(this, false);\n // Configuration state\n this.currentCamera = 'environment'; // Default to back camera\n this.currentZoom = 1.0;\n // Whether the current zoom is applied through the native track `zoom`\n // capability (`applyConstraints`) rather than the CSS `transform: scale()`\n // simulation. Capture only needs to compensate for the transform in the\n // CSS-fallback case.\n this.usingNativeZoom = false;\n this.currentFlashMode = 'off';\n // The aspect ratio the current session was started with, or null when the\n // option was omitted. Selects the capture contract: with an explicit ratio,\n // capture() returns the full sensor-ratio frame (cross-platform contract);\n // without it, the legacy web behavior of capturing the visible\n // (cover-cropped) preview region is preserved.\n this.sessionAspectRatio = null;\n // How the current session scales the preview into its container. `'fit'`\n // (object-fit: contain) letterboxes the whole frame; `'cover'` (the default)\n // center-crops it. Selects the barcode-transform variant and, together with\n // the aspect ratio, the capture crop.\n this.sessionPreviewScaleMode = 'cover';\n // Resolution/aspect-ratio constraints of the current session, kept so\n // flipCamera() re-acquires the stream with the same resolution contract\n // instead of falling back to the browser default.\n this.sessionResolutionConstraints = {};\n // Barcode detection support\n this.barcodeDetectionSupported = false;\n this.barcodeDetector = null;\n // Scopes the barcode detection loop to a single start()/stop() session so a\n // rapid stop() -> start() can't let the old loop mistake the new session's\n // running flag for its own and keep polling a detached video element.\n this.barcodeDetectionAbortController = null;\n // The most recently scheduled `requestAnimationFrame` id for the barcode\n // detection loop, so `stop()` can cancel a queued-but-not-yet-run frame\n // outright.\n this.barcodeAnimationFrameId = null;\n // Recording state\n this.mediaRecorder = null;\n this.recordedChunks = [];\n this.recordingAudioTrack = null;\n this.recordingResolve = null;\n this.recordingReject = null;\n this.checkBarcodeDetectionSupport();\n }\n /**\n * Start the camera with the given configuration\n */\n async start(options) {\n var _a, _b, _c, _d;\n // A session is already running. Per the cross-platform contract, reject\n // instead of silently reconfiguring or no-op'ing: callers who need a\n // different configuration (e.g. a different position or resolution) must\n // call `stop()` first and then `start()` again with the new options.\n if (__classPrivateFieldGet(this, _CameraViewWeb_isRunning, \"f\")) {\n throw new CameraViewError('Camera session is already running. Call stop() first.', 'SESSION_ALREADY_RUNNING');\n }\n try {\n // Set up video element if it doesn't exist\n if (!this.videoElement) {\n await this.setupVideoElement(options === null || options === void 0 ? void 0 : options.containerElementId);\n }\n }\n catch (err) {\n // The only failure path in setupVideoElement() is the target container\n // element not being found, which is the web equivalent of \"could not\n // find the view to render the camera preview into\".\n throw new CameraViewError(`Failed to start camera: ${this.formatError(err)}`, 'WEBVIEW_UNAVAILABLE');\n }\n // Apply the preview scale mode to the video element. `'fit'` letterboxes\n // the whole frame (object-fit: contain); the empty bars show the container's\n // own background. `'cover'` keeps the long-standing center-cropped preview.\n this.sessionPreviewScaleMode = (_a = options === null || options === void 0 ? void 0 : options.previewScaleMode) !== null && _a !== void 0 ? _a : 'cover';\n if (this.videoElement) {\n this.videoElement.style.objectFit = this.sessionPreviewScaleMode === 'fit' ? 'contain' : 'cover';\n }\n // Set up video constraints based on options\n this.sessionAspectRatio = (_b = options === null || options === void 0 ? void 0 : options.aspectRatio) !== null && _b !== void 0 ? _b : null;\n this.sessionResolutionConstraints = this.buildResolutionConstraints(options);\n const videoConstraints = Object.assign({}, this.sessionResolutionConstraints);\n // Prefer deviceId if specified\n if (options === null || options === void 0 ? void 0 : options.deviceId) {\n videoConstraints.deviceId = { exact: options.deviceId };\n // Remember the current camera mode (though we're using a specific device)\n this.currentCamera = (options === null || options === void 0 ? void 0 : options.position) === 'front' ? 'user' : 'environment';\n }\n else {\n // Fall back to facing mode\n const facingMode = (options === null || options === void 0 ? void 0 : options.position) === 'front' ? 'user' : 'environment';\n this.currentCamera = facingMode;\n videoConstraints.facingMode = facingMode;\n }\n const constraints = {\n video: videoConstraints,\n audio: false,\n };\n // Acquire the camera exactly once, using the real constraints, and derive\n // the permission outcome from this single call. Probing permission with a\n // throwaway acquisition first would double startup latency, flash the\n // camera indicator twice, and risk a spurious NotReadableError on devices\n // where the camera is exclusive.\n try {\n this.stream = await navigator.mediaDevices.getUserMedia(constraints);\n }\n catch (err) {\n throw this.mapStartAcquisitionError(err);\n }\n try {\n if (this.videoElement) {\n this.videoElement.srcObject = this.stream;\n // Some browsers' autoplay policies can reject `play()` (e.g. lack of a\n // recent user gesture). The element is muted + playsInline, which satisfies\n // autoplay policies in virtually all cases, but a rejection must still be\n // handled here rather than left as an unhandled promise rejection.\n try {\n await this.videoElement.play();\n }\n catch (err) {\n console.warn('[CameraView] Failed to autoplay the video preview', err);\n }\n __classPrivateFieldSet(this, _CameraViewWeb_isRunning, true, \"f\");\n // Apply the initial zoom. This also re-establishes zoom on the freshly\n // created video element after a stop()/start() cycle, keeping the\n // applied zoom in sync with `currentZoom` instead of silently resetting\n // to an untransformed element. A zoom failure must not abort start().\n try {\n await this.setZoom({ level: (_c = options === null || options === void 0 ? void 0 : options.zoomFactor) !== null && _c !== void 0 ? _c : 1.0 });\n }\n catch (err) {\n console.warn('[CameraView] Failed to apply initial zoom factor', err);\n }\n // If barcode detection is enabled and supported, start detection\n if (options === null || options === void 0 ? void 0 : options.enableBarcodeDetection) {\n await this.checkBarcodeDetectionSupport();\n if (this.barcodeDetectionSupported) {\n await this.configureBarcodeDetector(options === null || options === void 0 ? void 0 : options.barcodeTypes);\n this.startBarcodeDetection();\n }\n }\n }\n }\n catch (err) {\n // The stream was already acquired here, so its tracks are still live.\n // Tear down the partially-initialized session state so the thrown error\n // leaves a clean slate for a subsequent start().\n (_d = this.stream) === null || _d === void 0 ? void 0 : _d.getTracks().forEach((track) => track.stop());\n this.stream = null;\n __classPrivateFieldSet(this, _CameraViewWeb_isRunning, false, \"f\");\n if (this.videoElement) {\n this.videoElement.srcObject = null;\n }\n throw new CameraViewError(`Failed to start camera: ${this.formatError(err)}`, 'UNKNOWN_ERROR');\n }\n }\n /**\n * Builds the resolution/aspect-ratio part of the `getUserMedia` video\n * constraints for a session.\n *\n * `captureMaxDimension` replaces the ideal width (the longer edge in the\n * stream's landscape-oriented coordinate space) and the ideal height is\n * derived from the configured ratio. Everything stays `ideal` so acquisition\n * degrades gracefully on devices that cannot deliver the request.\n */\n buildResolutionConstraints(options) {\n var _a;\n const ratio = (options === null || options === void 0 ? void 0 : options.aspectRatio) === '4:3' ? 4 / 3 : 16 / 9;\n const idealWidth = (_a = options === null || options === void 0 ? void 0 : options.captureMaxDimension) !== null && _a !== void 0 ? _a : DEFAULT_IDEAL_CAPTURE_WIDTH;\n const idealHeight = Math.round(idealWidth / ratio);\n const constraints = {\n width: { ideal: idealWidth },\n height: { ideal: idealHeight },\n };\n if (options === null || options === void 0 ? void 0 : options.aspectRatio) {\n constraints.aspectRatio = { ideal: ratio };\n }\n return constraints;\n }\n /**\n * Map a `getUserMedia` failure from the real-constraints acquisition in\n * `start()` onto the plugin's error contract.\n *\n * `NotAllowedError` maps to `PERMISSION_DENIED`, `NotFoundError` (no\n * matching device) to `CAMERA_UNAVAILABLE`, and `NotReadableError` (device\n * claimed by another process) to `DEVICE_LOCKED`, matching the codes\n * iOS/Android use. Anything else falls back to `UNKNOWN_ERROR`.\n */\n mapStartAcquisitionError(err) {\n if (err instanceof DOMException) {\n switch (err.name) {\n case 'NotAllowedError':\n return new CameraViewError('Camera permission was not granted', 'PERMISSION_DENIED');\n case 'NotFoundError':\n return new CameraViewError('Failed to start camera: No camera matching the requested configuration was found.', 'CAMERA_UNAVAILABLE');\n case 'NotReadableError':\n return new CameraViewError('Failed to start camera: The camera could not be started, possibly because it is already in use by another application.', 'DEVICE_LOCKED');\n }\n }\n return new CameraViewError(`Failed to start camera: ${this.formatError(err)}`, 'UNKNOWN_ERROR');\n }\n /**\n * Stop the camera and release resources\n */\n async stop() {\n var _a, _b, _c;\n if (!__classPrivateFieldGet(this, _CameraViewWeb_isRunning, \"f\")) {\n return;\n }\n try {\n // Tear down the barcode detection session tied to this camera session\n // first: abort settles any pending video-ready wait in\n // startBarcodeDetection, and cancelling the animation frame stops a\n // queued detectFrame call from ever running. Together these ensure no\n // stale loop can survive into a subsequent start().\n (_a = this.barcodeDetectionAbortController) === null || _a === void 0 ? void 0 : _a.abort();\n this.barcodeDetectionAbortController = null;\n if (this.barcodeAnimationFrameId !== null) {\n cancelAnimationFrame(this.barcodeAnimationFrameId);\n this.barcodeAnimationFrameId = null;\n }\n // Stop any active recording\n if (this.mediaRecorder && this.mediaRecorder.state !== 'inactive') {\n // Reject any pending stopRecording promise since we're force-stopping.\n // There is no dedicated code for this case, so it falls back to\n // UNKNOWN_ERROR per the plugin's documented \"anything unmappable\"\n // contract.\n (_b = this.recordingReject) === null || _b === void 0 ? void 0 : _b.call(this, new CameraViewError('Camera session stopped while recording', 'UNKNOWN_ERROR'));\n this.recordingResolve = null;\n this.recordingReject = null;\n this.mediaRecorder.stop();\n this.mediaRecorder = null;\n }\n this.recordedChunks = [];\n if (this.recordingAudioTrack) {\n this.recordingAudioTrack.stop();\n this.recordingAudioTrack = null;\n }\n // Stop all tracks in the stream\n if (this.stream) {\n this.stream.getTracks().forEach((track) => track.stop());\n this.stream = null;\n }\n // Detach the stream and remove the video element from the DOM\n if (this.videoElement) {\n this.videoElement.pause();\n this.videoElement.srcObject = null;\n (_c = this.videoElement.parentNode) === null || _c === void 0 ? void 0 : _c.removeChild(this.videoElement);\n this.videoElement = null;\n }\n __classPrivateFieldSet(this, _CameraViewWeb_isRunning, false, \"f\");\n }\n catch (err) {\n // No dedicated code for a teardown failure; falls back to UNKNOWN_ERROR\n // per the plugin's documented \"anything unmappable\" contract.\n throw new CameraViewError(`Failed to stop camera: ${this.formatError(err)}`, 'UNKNOWN_ERROR');\n }\n }\n /**\n * Check if the camera is currently running\n */\n async isRunning() {\n return { isRunning: __classPrivateFieldGet(this, _CameraViewWeb_isRunning, \"f\") };\n }\n /**\n * Capture a photo using the camera and return it as a base64-encoded JPEG image.\n * Preserves what the user actually sees in the UI, including cropping from object-fit: cover.\n */\n async capture(options) {\n var _a;\n const videoElement = this.videoElement;\n if (!__classPrivateFieldGet(this, _CameraViewWeb_isRunning, \"f\") || !videoElement) {\n throw new CameraViewError('Camera is not running', 'SESSION_NOT_RUNNING');\n }\n try {\n const canvas = this.getCanvasElement();\n // `fit` mode letterboxes the whole frame and an explicit `aspectRatio`\n // contractually returns the full sensor-ratio frame, so both capture\n // uncropped. Otherwise capture the visible (cover-cropped) region so the\n // output matches what the user sees.\n const captureArea = this.sessionPreviewScaleMode === 'fit' || this.sessionAspectRatio\n ? calculateFullFrameArea(videoElement)\n : calculateVisibleArea(videoElement);\n // In CSS-fallback zoom mode the preview is magnified about its center via\n // `transform: scale()`, so tighten the source crop to match the zoomed\n // viewport (this preserves the frame's aspect ratio). Native-zoom mode\n // needs no compensation: the track already delivers the zoomed frame.\n const visibleArea = applyCssZoomCrop(captureArea, this.getCssZoomScale());\n drawVisibleAreaToCanvas(canvas, videoElement, visibleArea);\n // Mirror the native platforms' default: `quality` is optional and defaults\n // to 90 when omitted. Without this, `options?.quality / 100` would be\n // `NaN` for an undefined quality, which is passed silently to `toBlob`/\n // `toDataURL` (both treat an invalid quality as \"use the default\"), so a\n // caller relying on the documented default would get a different result\n // on web than on iOS/Android.\n const requestedQuality = (_a = options === null || options === void 0 ? void 0 : options.quality) !== null && _a !== void 0 ? _a : 90;\n const quality = Math.min(1.0, Math.max(0.1, requestedQuality / 100));\n if (options === null || options === void 0 ? void 0 : options.saveToFile) {\n // Create a blob from canvas and return a blob URL.\n // `path` is native-only (no filesystem path on web), so it is omitted here.\n return new Promise((resolve, reject) => {\n canvas.toBlob((blob) => {\n if (!blob) {\n reject(new CameraViewError('Failed to create blob from canvas', 'IMAGE_COMPRESSION_FAILED'));\n return;\n }\n const url = URL.createObjectURL(blob);\n resolve({ webPath: url });\n }, 'image/jpeg', quality);\n });\n }\n else {\n // Return base64 data\n const base64Data = canvasToBase64(canvas, quality);\n return { photo: base64Data };\n }\n }\n catch (err) {\n throw new CameraViewError(`Failed to capture photo: ${this.formatError(err)}`, 'FRAME_CAPTURE_ERROR');\n }\n }\n /**\n * Web implementation already uses images from the video stream, so this is the same as `capture()`\n */\n async captureSample(options) {\n return this.capture(options);\n }\n /**\n * Start recording video using MediaRecorder API\n */\n async startRecording(options) {\n if (!__classPrivateFieldGet(this, _CameraViewWeb_isRunning, \"f\") || !this.videoElement) {\n throw new CameraViewError('Camera is not running', 'SESSION_NOT_RUNNING');\n }\n if (this.mediaRecorder) {\n throw new CameraViewError('Recording is already in progress', 'RECORDING_ALREADY_IN_PROGRESS');\n }\n try {\n let stream = this.stream;\n // If audio is requested, get a new stream with audio track\n if ((options === null || options === void 0 ? void 0 : options.enableAudio) && stream) {\n const audioStream = await navigator.mediaDevices.getUserMedia({ audio: true });\n const audioTrack = audioStream.getAudioTracks()[0];\n this.recordingAudioTrack = audioTrack;\n const videoTracks = stream.getVideoTracks();\n stream = new MediaStream([...videoTracks, audioTrack]);\n }\n if (!stream) {\n throw new Error('No camera stream available');\n }\n this.recordedChunks = [];\n const mimeType = ['video/webm;codecs=vp9', 'video/webm', 'video/mp4'].find((type) => MediaRecorder.isTypeSupported(type));\n if (!mimeType) {\n throw new Error('No supported video recording format found');\n }\n this.mediaRecorder = new MediaRecorder(stream, { mimeType });\n this.mediaRecorder.ondataavailable = (event) => {\n if (event.data && event.data.size > 0) {\n this.recordedChunks.push(event.data);\n }\n };\n this.mediaRecorder.onstop = () => {\n var _a;\n // Stop audio track if it was added for recording\n if (this.recordingAudioTrack) {\n this.recordingAudioTrack.stop();\n this.recordingAudioTrack = null;\n }\n const blob = new Blob(this.recordedChunks, { type: mimeType });\n const url = URL.createObjectURL(blob);\n this.recordedChunks = [];\n this.mediaRecorder = null;\n (_a = this.recordingResolve) === null || _a === void 0 ? void 0 : _a.call(this, { webPath: url });\n this.recordingResolve = null;\n this.recordingReject = null;\n };\n this.mediaRecorder.onerror = (event) => {\n var _a, _b, _c;\n if (this.recordingAudioTrack) {\n this.recordingAudioTrack.stop();\n this.recordingAudioTrack = null;\n }\n this.mediaRecorder = null;\n this.recordedChunks = [];\n const errorMessage = (_b = (_a = event.error) === null || _a === void 0 ? void 0 : _a.message) !== null && _b !== void 0 ? _b : 'Unknown recording error';\n // A generic MediaRecorder runtime failure has no dedicated code, so\n // it falls back to UNKNOWN_ERROR per the plugin's documented\n // \"anything unmappable\" contract.\n (_c = this.recordingReject) === null || _c === void 0 ? void 0 : _c.call(this, new CameraViewError('Recording error: ' + errorMessage, 'UNKNOWN_ERROR'));\n this.recordingResolve = null;\n this.recordingReject = null;\n };\n this.mediaRecorder.start(100); // Collect data in 100ms chunks\n }\n catch (err) {\n if (this.recordingAudioTrack) {\n this.recordingAudioTrack.stop();\n this.recordingAudioTrack = null;\n }\n this.mediaRecorder = null;\n this.recordedChunks = [];\n throw new CameraViewError(`Failed to start recording: ${this.formatError(err)}`, this.mapRecordingStartErrorCode(err));\n }\n }\n /**\n * Maps a failure caught by `startRecording()`'s try/catch onto the closest-\n * fitting `CameraErrorCode`, without altering the existing wrapped message.\n *\n * A `DOMException` here can only come from the microphone `getUserMedia`\n * call, so it is classified with `kind: 'microphone'`. The two other\n * distinguishable failures are plain `Error`s matched by message text.\n */\n mapRecordingStartErrorCode(err) {\n if (err instanceof DOMException) {\n return classifyGetUserMediaErrorCode(err, 'microphone');\n }\n if (err instanceof Error) {\n if (err.message === 'No camera stream available') {\n return 'CAMERA_UNAVAILABLE';\n }\n if (err.message === 'No supported video recording format found') {\n return 'CONFIGURATION_FAILED';\n }\n }\n return 'UNKNOWN_ERROR';\n }\n /**\n * Stop the current video recording\n */\n async stopRecording() {\n if (!this.mediaRecorder) {\n throw new CameraViewError('No recording is in progress', 'NO_RECORDING_IN_PROGRESS');\n }\n // A stop is already pending. Reject this second call instead of\n // overwriting the pending callbacks, which would orphan the first caller's\n // promise forever.\n if (this.recordingResolve || this.recordingReject) {\n throw new CameraViewError('stopRecording() is already pending', 'UNKNOWN_ERROR');\n }\n return new Promise((resolve, reject) => {\n var _a;\n this.recordingResolve = resolve;\n this.recordingReject = reject;\n (_a = this.mediaRecorder) === null || _a === void 0 ? void 0 : _a.stop();\n });\n }\n /**\n * Flip between front and back camera\n */\n async flipCamera() {\n var _a;\n if (!__classPrivateFieldGet(this, _CameraViewWeb_isRunning, \"f\")) {\n throw new CameraViewError('Camera is not running', 'SESSION_NOT_RUNNING');\n }\n // Flipping restarts the stream and stops the tracks the MediaRecorder is\n // consuming, which would silently freeze an in-progress recording. Reject\n // instead so the caller can stop recording first; the recording stays\n // intact.\n if (this.mediaRecorder && this.mediaRecorder.state !== 'inactive') {\n throw new CameraViewError('Cannot flip camera while a recording is in progress', 'RECORDING_ALREADY_IN_PROGRESS');\n }\n // The candidate facing mode, kept local until the new stream is actually\n // live: `currentCamera` (and the previous stream) must not be touched\n // before that point, or a failed re-acquisition below would leave the\n // session state pointing at a camera that isn't running while the\n // previous camera's tracks have already been stopped.\n const nextCamera = this.currentCamera === 'user' ? 'environment' : 'user';\n // Acquire the new-facing stream with the new facing mode, keeping the\n // session's resolution/aspect-ratio constraints so the flipped stream\n // honors the same contract as the one it replaces.\n const constraints = {\n video: Object.assign(Object.assign({}, this.sessionResolutionConstraints), { facingMode: nextCamera }),\n audio: false,\n };\n let newStream;\n try {\n newStream = await navigator.mediaDevices.getUserMedia(constraints);\n }\n catch (err) {\n // Acquisition failed: `stream`/`currentCamera` haven't been touched, so\n // the previous camera is still attached and running. Just surface the\n // error. The only `getUserMedia` call in this method re-acquires the\n // camera (never the microphone), so classify with kind: 'camera'.\n throw new CameraViewError(`Failed to flip camera: ${this.formatError(err)}`, classifyGetUserMediaErrorCode(err, 'camera'));\n }\n // The new stream is live: safe to stop the previous stream's tracks and\n // commit the flipped state.\n (_a = this.stream) === null || _a === void 0 ? void 0 : _a.getTracks().forEach((track) => track.stop());\n this.stream = newStream;\n this.currentCamera = nextCamera;\n if (this.videoElement) {\n this.videoElement.srcObject = newStream;\n }\n // Re-apply the session's zoom level to the new stream through the normal\n // setZoom() path - a flip otherwise silently drops native-zoom's applied\n // constraint (reset on the fresh track) or leaves CSS-fallback's\n // transform stale against the fresh element state. Best-effort: a zoom\n // failure must not fail the flip itself.\n try {\n await this.setZoom({ level: this.currentZoom });\n }\n catch (err) {\n console.warn('[CameraView] Failed to re-apply zoom after flipping camera', err);\n }\n }\n /**\n * Get available camera devices.\n *\n * Position detection prefers the `facingMode` capability of the active video\n * track, since it is a standardized signal rather than a locale-dependent\n * string. Every other device falls back to matching the English word \"front\"\n * in `device.label` — which is empty for all devices until camera permission\n * has been granted once, so the fallback resolves to `'back'` in that case.\n */\n async getAvailableDevices() {\n var _a;\n try {\n const devices = await navigator.mediaDevices.enumerateDevices();\n const videoDevices = devices.filter((device) => device.kind === 'videoinput');\n const activeTrack = this.getVideoTrack();\n const activeDeviceId = activeTrack === null || activeTrack === void 0 ? void 0 : activeTrack.getSettings().deviceId;\n const activeFacingMode = activeTrack && typeof activeTrack.getCapabilities === 'function'\n ? (_a = activeTrack.getCapabilities().facingMode) === null || _a === void 0 ? void 0 : _a[0]\n : undefined;\n return {\n devices: videoDevices.map((device) => {\n const position = device.deviceId === activeDeviceId && activeFacingMode\n ? activeFacingMode === 'user'\n ? 'front'\n : 'back'\n : device.label.toLowerCase().includes('front')\n ? 'front'\n : 'back';\n return {\n id: device.deviceId,\n name: device.label || `Camera ${device.deviceId.substring(0, 5)}`,\n position,\n };\n }),\n };\n }\n catch (err) {\n console.error('Failed to get available devices', err);\n return { devices: [] };\n }\n }\n /**\n * Get current zoom information.\n *\n * When the active video track exposes a native `zoom` capability (Chromium\n * on capable cameras), the real min/max/current are reported. Otherwise the\n * simulated CSS-scale range is returned.\n */\n async getZoom() {\n const track = this.getVideoTrack();\n const capability = this.getNativeZoomCapability(track);\n if (track && capability) {\n const settings = track.getSettings();\n return {\n min: capability.min,\n max: capability.max,\n current: typeof settings.zoom === 'number' ? settings.zoom : this.currentZoom,\n };\n }\n // No native zoom: report the simulated CSS-scale range.\n return {\n min: SIMULATED_ZOOM_MIN,\n max: SIMULATED_ZOOM_MAX,\n current: this.currentZoom,\n };\n }\n /**\n * Set the zoom level.\n *\n * Prefers real zoom via `track.applyConstraints({ advanced: [{ zoom }] })`\n * when the browser exposes the native `zoom` capability, clamping to the\n * reported range. Falls back to a CSS `transform: scale()` simulation\n * otherwise.\n */\n async setZoom(options) {\n const track = this.getVideoTrack();\n const capability = this.getNativeZoomCapability(track);\n if (track && capability) {\n const clamped = Math.max(capability.min, Math.min(options.level, capability.max));\n await track.applyConstraints({ advanced: [{ zoom: clamped }] });\n this.currentZoom = clamped;\n this.usingNativeZoom = true;\n // Clear any CSS transform left over from a previous fallback so the two\n // zoom mechanisms can't stack.\n if (this.videoElement) {\n this.videoElement.style.transform = '';\n }\n return;\n }\n // CSS-transform fallback.\n this.usingNativeZoom = false;\n this.currentZoom = options.level;\n if (this.videoElement) {\n this.videoElement.style.transition = options.ramp ? 'transform 0.2s ease-in-out' : 'none';\n this.videoElement.style.transform = `scale(${this.getCssZoomScale()})`;\n this.videoElement.style.transformOrigin = 'center';\n }\n }\n /**\n * The video track backing the active stream, or `null`.\n */\n getVideoTrack() {\n var _a, _b;\n return (_b = (_a = this.stream) === null || _a === void 0 ? void 0 : _a.getVideoTracks()[0]) !== null && _b !== void 0 ? _b : null;\n }\n /**\n * Reads the native `zoom` capability off a track, if the browser both\n * supports `getCapabilities()` and exposes a usable `zoom` range on this\n * device. Returns `null` when native zoom is unavailable (CSS fallback).\n */\n getNativeZoomCapability(track) {\n if (!track || typeof track.getCapabilities !== 'function') {\n return null;\n }\n const zoom = track.getCapabilities().zoom;\n if (zoom && typeof zoom.min === 'number' && typeof zoom.max === 'number' && zoom.max > zoom.min) {\n return zoom;\n }\n return null;\n }\n /**\n * The effective CSS `transform: scale()` factor currently applied to the\n * preview: `1` when native zoom is in use (no transform), otherwise\n * `currentZoom` clamped to the simulated range. Used both to set the\n * transform and to compensate captures for it.\n */\n getCssZoomScale() {\n if (this.usingNativeZoom) {\n return 1;\n }\n return Math.max(SIMULATED_ZOOM_MIN, Math.min(this.currentZoom, SIMULATED_ZOOM_MAX));\n }\n /**\n * Set the focus/metering point (not supported in web).\n *\n * The `pointsOfInterest` media-track constraint has effectively no browser\n * support, so this rejects with `unimplemented` rather than silently doing\n * nothing. Left as a hook for a future implementation.\n */\n async setFocusPoint() {\n throw this.unimplemented('Focus point control is not supported in the web implementation.');\n }\n /**\n * Get current flash mode\n */\n async getFlashMode() {\n return { flashMode: this.currentFlashMode };\n }\n /**\n * Get supported flash modes\n */\n async getSupportedFlashModes() {\n // Web has limited flash control\n return { flashModes: ['off'] };\n }\n /**\n * Set flash mode (limited support in web).\n *\n * Only `'off'` is supported on web; any other mode rejects rather than\n * silently accepting a mode it cannot apply.\n */\n async setFlashMode(options) {\n if (options.mode !== 'off') {\n throw this.unimplemented('Flash mode control is not supported in the web implementation.');\n }\n this.currentFlashMode = 'off';\n }\n /**\n * Check if torch is available (not supported in web)\n */\n async isTorchAvailable() {\n // Torch is not supported in web implementation\n return { available: false };\n }\n /**\n * Get torch mode (not supported in web).\n *\n * Follows the documented contract for `getTorchMode()`: callers must check\n * `isTorchAvailable()` first, which always reports `false` on web, so this throws\n * rather than returning a fabricated \"off\" state.\n */\n async getTorchMode() {\n throw this.unimplemented('Torch control is not supported in web implementation.');\n }\n /**\n * Set torch mode (not supported in web)\n */\n async setTorchMode() {\n // Torch is not supported in web implementation\n throw this.unimplemented('Torch control is not supported in web implementation.');\n }\n /**\n * Check camera and microphone permission without requesting\n */\n async checkPermissions() {\n const [camera, microphone] = await Promise.all([\n this.checkSinglePermission('camera'),\n this.checkSinglePermission('microphone'),\n ]);\n return { camera, microphone };\n }\n /**\n * Resolves the current state of a single permission.\n *\n * Queried independently per permission name so one unsupported query (e.g.\n * Firefox does not support querying `'microphone'`) rejects on its own\n * instead of collapsing *both* permissions to `'prompt'`.\n */\n async checkSinglePermission(name) {\n if (navigator.permissions) {\n try {\n const result = await navigator.permissions.query({ name: name });\n return result.state === 'granted' ? 'granted' : result.state === 'denied' ? 'denied' : 'prompt';\n }\n catch (_a) {\n // This permission name is not supported by the Permissions API in this\n // browser; fall through to the best-effort fallback below instead of\n // failing the other permission's check too.\n }\n }\n // If the Permissions API is unavailable/unsupported for this name, fall back to\n // checking the active stream for camera; there is no equivalent signal for\n // microphone without an active audio track, so it stays 'prompt'.\n if (name === 'camera') {\n return this.stream ? 'granted' : 'prompt';\n }\n return 'prompt';\n }\n /**\n * Request camera and/or microphone permissions from the user.\n * By default, only camera permission is requested.\n */\n async requestPermissions(options) {\n var _a;\n const permissions = (_a = options === null || options === void 0 ? void 0 : options.permissions) !== null && _a !== void 0 ? _a : ['camera'];\n const result = { camera: 'prompt', microphone: 'prompt' };\n // Request camera permission if included\n if (permissions.includes('camera')) {\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ video: true });\n stream.getTracks().forEach((track) => track.stop());\n result.camera = 'granted';\n }\n catch (_b) {\n result.camera = 'denied';\n }\n }\n else {\n // Still report current status even if not requesting\n result.camera = (await this.checkPermissions()).camera;\n }\n // Request microphone permission only if explicitly included\n if (permissions.includes('microphone')) {\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n stream.getTracks().forEach((track) => track.stop());\n result.microphone = 'granted';\n }\n catch (_c) {\n result.microphone = 'denied';\n }\n }\n else {\n result.microphone = (await this.checkPermissions()).microphone;\n }\n return result;\n }\n /**\n * Start barcode detection if supported\n */\n async startBarcodeDetection() {\n var _a;\n const barcodeDetector = this.barcodeDetector;\n const videoElement = this.videoElement;\n if (!this.barcodeDetectionSupported || !barcodeDetector || !videoElement) {\n return;\n }\n // Scope this loop to its own session. Aborting the previous controller\n // (defensive - start() only calls in here once per session) and handing\n // out a fresh signal means a stale detectFrame closure from an earlier\n // session can never mistake a later session's #isRunning === true for\n // its own \"keep going\" signal.\n (_a = this.barcodeDetectionAbortController) === null || _a === void 0 ? void 0 : _a.abort();\n const abortController = new AbortController();\n this.barcodeDetectionAbortController = abortController;\n const { signal } = abortController;\n // Make sure video is fully loaded before starting detection. The wait\n // settles - without starting detection - as soon as the session is\n // stopped (`signal` aborts), and a timeout backstops the case where the\n // video never fires `loadeddata` at all, so neither path leaves a\n // dangling listener or a permanently pending promise.\n if (videoElement.readyState < 2) {\n const videoReady = await new Promise((resolve) => {\n const cleanup = () => {\n videoElement.removeEventListener('loadeddata', loadHandler);\n signal.removeEventListener('abort', abortHandler);\n clearTimeout(timeoutId);\n };\n const loadHandler = () => {\n cleanup();\n resolve(true);\n };\n const abortHandler = () => {\n cleanup();\n resolve(false);\n };\n const timeoutId = setTimeout(() => {\n cleanup();\n resolve(false);\n }, BARCODE_VIDEO_READY_TIMEOUT_MS);\n videoElement.addEventListener('loadeddata', loadHandler);\n signal.addEventListener('abort', abortHandler);\n });\n if (!videoReady || signal.aborted) {\n return;\n }\n }\n if (signal.aborted) {\n return;\n }\n // Add throttling to reduce CPU usage\n let lastDetectionTime = 0;\n const minTimeBetweenDetections = 100; // ms\n // Dedupe state: timestamps of recently emitted barcodes keyed by value +\n // type. A per-key map (rather than a single \"last\" slot) is required so\n // multiple codes in frame can't alternate and defeat the suppression\n // window. Closure-local, so it resets on every start().\n const recentBarcodeEmitTimes = new Map();\n // Set up periodic frame analysis for barcode detection\n const detectFrame = async () => {\n var _a;\n // `signal.aborted` is this loop's own session check: it stays true for\n // this closure even if a rapid stop() -> start() flips #isRunning back\n // to true for a *new* session before this frame runs. `#isRunning` is\n // kept as a defensive secondary check.\n if (signal.aborted || !__classPrivateFieldGet(this, _CameraViewWeb_isRunning, \"f\") || !videoElement || !barcodeDetector) {\n return;\n }\n // Monotonic clock: a backward wall-clock jump must not extend the\n // throttle or suppression windows arbitrarily.\n const now = performance.now();\n if (now - lastDetectionTime >= minTimeBetweenDetections) {\n try {\n const barcodes = await barcodeDetector.detect(videoElement);\n lastDetectionTime = now;\n if (barcodes.length > 0) {\n const barcode = barcodes[0];\n // Normalize the web BarcodeDetector format onto the shared BarcodeType\n // vocabulary. Fall back to the raw format for the few detector formats\n // that have no BarcodeType equivalent (e.g. 'unknown'); the emitted\n // `type` is therefore `BarcodeType | string`.\n const type = (_a = WEB_FORMAT_TO_BARCODE_TYPE[barcode.format]) !== null && _a !== void 0 ? _a : barcode.format;\n // Rate control: suppress re-emission of the same code (value + type)\n // within the suppression window. A genuinely new code has a different\n // key and emits immediately. Timestamps are tracked per key so\n // multiple codes in frame can't alternate and defeat the window.\n const barcodeKey = `${type}\\u0000${barcode.rawValue}`;\n const lastEmit = recentBarcodeEmitTimes.get(barcodeKey);\n if (lastEmit === undefined || now - lastEmit >= BARCODE_SUPPRESSION_WINDOW_MS) {\n // Prune expired entries once the map grows, keeping it bounded\n // during long sessions that scan many different codes.\n if (recentBarcodeEmitTimes.size > BARCODE_DEDUPE_MAP_PRUNE_THRESHOLD) {\n for (const [key, emitTime] of recentBarcodeEmitTimes) {\n if (now - emitTime >= BARCODE_SUPPRESSION_WINDOW_MS) {\n recentBarcodeEmitTimes.delete(key);\n }\n }\n }\n recentBarcodeEmitTimes.set(barcodeKey, now);\n // Transform barcode coordinates using the utility function,\n // accounting for the session's preview scale mode (cover crops,\n // fit letterboxes) so the rect lands over the on-screen barcode.\n const boundingRect = transformBarcodeBoundingBox(barcode.boundingBox, videoElement, this.sessionPreviewScaleMode);\n this.notifyListeners('barcodeDetected', {\n value: barcode.rawValue,\n type,\n boundingRect,\n });\n }\n }\n }\n catch (err) {\n console.error('Barcode detection error', err);\n }\n }\n if (!signal.aborted && __classPrivateFieldGet(this, _CameraViewWeb_isRunning, \"f\")) {\n this.barcodeAnimationFrameId = requestAnimationFrame(detectFrame);\n }\n };\n this.barcodeAnimationFrameId = requestAnimationFrame(detectFrame);\n }\n /**\n * Check if barcode detection is supported in this browser\n */\n async checkBarcodeDetectionSupport() {\n if ('BarcodeDetector' in window) {\n try {\n this.barcodeDetector = new BarcodeDetector();\n this.barcodeDetectionSupported = true;\n }\n catch (e) {\n console.warn('BarcodeDetector is not supported by this browser.');\n this.barcodeDetectionSupported = false;\n }\n }\n }\n /**\n * Configure the barcode detector with requested barcode formats.\n * Unsupported formats are ignored and logged.\n */\n async configureBarcodeDetector(barcodeTypes) {\n if (!this.barcodeDetectionSupported) {\n return;\n }\n if (!(barcodeTypes === null || barcodeTypes === void 0 ? void 0 : barcodeTypes.length)) {\n this.barcodeDetector = new BarcodeDetector();\n return;\n }\n const requestedFormats = barcodeTypes\n .map((barcodeType) => {\n const webFormat = BARCODE_TYPE_TO_WEB_FORMAT[barcodeType];\n if (!webFormat) {\n console.warn(`[CameraView] Barcode type \"${barcodeType}\" is not supported by the web BarcodeDetector API.`);\n }\n return webFormat;\n })\n .filter((format) => format !== null);\n if (!requestedFormats.length) {\n console.warn('[CameraView] No requested barcode types are supported on web. Falling back to all supported formats.');\n this.barcodeDetector = new BarcodeDetector();\n return;\n }\n const uniqueRequestedFormats = Array.from(new Set(requestedFormats));\n try {\n const supportedFormats = await BarcodeDetector.getSupportedFormats();\n const configuredFormats = uniqueRequestedFormats.filter((format) => supportedFormats.includes(format));\n const ignoredFormats = uniqueRequestedFormats.filter((format) => !supportedFormats.includes(format));\n if (ignoredFormats.length) {\n console.warn(`[CameraView] Ignoring unsupported barcode formats for this browser: ${ignoredFormats.join(', ')}.`);\n }\n if (!configuredFormats.length) {\n console.warn('[CameraView] No requested barcode formats are available in this browser. Falling back to all supported formats.');\n this.barcodeDetector = new BarcodeDetector();\n return;\n }\n this.barcodeDetector = new BarcodeDetector({ formats: configuredFormats });\n }\n catch (error) {\n console.warn('[CameraView] Failed to resolve supported barcode formats; falling back to unfiltered detector.', error);\n this.barcodeDetector = new BarcodeDetector();\n }\n }\n /**\n * Set up the video element for the camera view\n */\n async setupVideoElement(containerElementId) {\n this.videoElement = document.createElement('video');\n this.videoElement.playsInline = true;\n this.videoElement.autoplay = true;\n this.videoElement.muted = true;\n this.videoElement.style.width = '100%';\n this.videoElement.style.height = '100%';\n this.videoElement.style.objectFit = 'cover';\n // If a container ID is provided, find that element and append the video to it\n if (containerElementId) {\n const container = document.getElementById(containerElementId);\n if (!container) {\n throw new Error(`Container element with ID ${containerElementId} not found`);\n }\n container.appendChild(this.videoElement);\n }\n else {\n // Otherwise, append to body as fallback\n document.body.appendChild(this.videoElement);\n }\n }\n /**\n * Ensures canvas element exists and returns it\n */\n getCanvasElement() {\n if (!this.canvasElement) {\n this.canvasElement = document.createElement('canvas');\n }\n return this.canvasElement;\n }\n /**\n * Format error message\n */\n formatError(err) {\n return err instanceof Error ? err.message : String(err);\n }\n}\n_CameraViewWeb_isRunning = new WeakMap();\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","this","WebPlugin"],"mappings":";;;;AACA;AACA;AACA;AACK,MAAC,UAAU,GAAGA,mBAAc,CAAC,YAAY,EAAE;AAChD,IAAI,GAAG,EAAE,MAAM,mDAAe,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;AACjE,CAAC;;ACND;AACA;AACA;AACO,SAAS,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE;AAChD,IAAI,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,YAAY,EAAE,OAAO,CAAC;AAC3D,IAAI,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,oBAAoB,CAAC,KAAK,EAAE;AAC5C;AACA,IAAI,MAAM,SAAS,GAAG,KAAK,CAAC,qBAAqB,EAAE;AACnD,IAAI,MAAM,YAAY,GAAG,SAAS,CAAC,KAAK;AACxC,IAAI,MAAM,aAAa,GAAG,SAAS,CAAC,MAAM;AAC1C;AACA,IAAI,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU;AACvC,IAAI,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW;AACzC;AACA,IAAI,MAAM,WAAW,GAAG,UAAU,GAAG,WAAW;AAChD,IAAI,MAAM,aAAa,GAAG,YAAY,GAAG,aAAa;AACtD,IAAI,IAAI,OAAO,GAAG,CAAC;AACnB,IAAI,IAAI,OAAO,GAAG,CAAC;AACnB,IAAI,IAAI,WAAW,GAAG,UAAU;AAChC,IAAI,IAAI,YAAY,GAAG,WAAW;AAClC;AACA;AACA,IAAI,IAAI,WAAW,GAAG,aAAa,EAAE;AACrC,QAAQ,WAAW,GAAG,WAAW,GAAG,aAAa;AACjD,QAAQ,OAAO,GAAG,CAAC,UAAU,GAAG,WAAW,IAAI,CAAC;AAChD,IAAI;AACJ;AACA,SAAS;AACT,QAAQ,YAAY,GAAG,UAAU,GAAG,aAAa;AACjD,QAAQ,OAAO,GAAG,CAAC,WAAW,GAAG,YAAY,IAAI,CAAC;AAClD,IAAI;AACJ;AACA;AACA,IAAI,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;AAC/C,IAAI,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;AACjD,IAAI,OAAO;AACX,QAAQ,OAAO;AACf,QAAQ,OAAO;AACf,QAAQ,WAAW;AACnB,QAAQ,YAAY;AACpB,QAAQ,YAAY;AACpB,QAAQ,aAAa;AACrB,QAAQ,WAAW;AACnB,QAAQ,YAAY;AACpB,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,sBAAsB,CAAC,KAAK,EAAE;AAC9C,IAAI,MAAM,SAAS,GAAG,KAAK,CAAC,qBAAqB,EAAE;AACnD,IAAI,OAAO;AACX,QAAQ,OAAO,EAAE,CAAC;AAClB,QAAQ,OAAO,EAAE,CAAC;AAClB,QAAQ,WAAW,EAAE,KAAK,CAAC,UAAU;AACrC,QAAQ,YAAY,EAAE,KAAK,CAAC,WAAW;AACvC,QAAQ,YAAY,EAAE,SAAS,CAAC,KAAK;AACrC,QAAQ,aAAa,EAAE,SAAS,CAAC,MAAM;AACvC,QAAQ,WAAW,EAAE,KAAK,CAAC,UAAU;AACrC,QAAQ,YAAY,EAAE,KAAK,CAAC,WAAW;AACvC,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,gBAAgB,CAAC,IAAI,EAAE,KAAK,EAAE;AAC9C,IAAI,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE;AACtB,QAAQ,OAAO,IAAI;AACnB,IAAI;AACJ,IAAI,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,GAAG,KAAK;AAChD,IAAI,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,GAAG,KAAK;AAClD,IAAI,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,WAAW,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,YAAY,GAAG,YAAY,IAAI,CAAC,EAAE,WAAW;AAC7L,QAAQ,YAAY,EAAE,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;AACrG;AACA;AACA;AACA;AACA;AACO,SAAS,uBAAuB,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE;AACpE,IAAI,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,IAAI;AAC3F;AACA;AACA,IAAI,MAAM,CAAC,KAAK,GAAG,WAAW;AAC9B,IAAI,MAAM,CAAC,MAAM,GAAG,YAAY;AAChC,IAAI,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AACzD,IAAI,IAAI,CAAC,GAAG,EAAE;AACd,QAAQ,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC;AACvD,IAAI;AACJ;AACA,IAAI,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,YAAY,CAAC;AAC7G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,2BAA2B,CAAC,kBAAkB,EAAE,YAAY,EAAE,SAAS,GAAG,OAAO,EAAE;AACnG;AACA,IAAI,MAAM,SAAS,GAAG,YAAY,CAAC,qBAAqB,EAAE;AAC1D,IAAI,MAAM,YAAY,GAAG,SAAS,CAAC,KAAK;AACxC,IAAI,MAAM,aAAa,GAAG,SAAS,CAAC,MAAM;AAC1C;AACA,IAAI,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU;AAC9C,IAAI,MAAM,WAAW,GAAG,YAAY,CAAC,WAAW;AAChD,IAAI,MAAM,MAAM,GAAG,YAAY,GAAG,UAAU;AAC5C,IAAI,MAAM,MAAM,GAAG,aAAa,GAAG,WAAW;AAC9C,IAAI,MAAM,KAAK,GAAG,SAAS,KAAK,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;AAC3F;AACA;AACA,IAAI,MAAM,OAAO,GAAG,CAAC,YAAY,GAAG,UAAU,GAAG,KAAK,IAAI,CAAC;AAC3D,IAAI,MAAM,OAAO,GAAG,CAAC,aAAa,GAAG,WAAW,GAAG,KAAK,IAAI,CAAC;AAC7D,IAAI,OAAO;AACX,QAAQ,CAAC,EAAE,kBAAkB,CAAC,CAAC,GAAG,KAAK,GAAG,OAAO;AACjD,QAAQ,CAAC,EAAE,kBAAkB,CAAC,CAAC,GAAG,KAAK,GAAG,OAAO;AACjD,QAAQ,KAAK,EAAE,kBAAkB,CAAC,KAAK,GAAG,KAAK;AAC/C,QAAQ,MAAM,EAAE,kBAAkB,CAAC,MAAM,GAAG,KAAK;AACjD,KAAK;AACL;;ACnJA,IAAI,sBAAsB,GAAG,CAACC,SAAI,IAAIA,SAAI,CAAC,sBAAsB,KAAK,UAAU,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE;AAC1G,IAAI,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,CAAC,EAAE,MAAM,IAAI,SAAS,CAAC,+CAA+C,CAAC;AAChG,IAAI,IAAI,OAAO,KAAK,KAAK,UAAU,GAAG,QAAQ,KAAK,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,SAAS,CAAC,0EAA0E,CAAC;AACtL,IAAI,OAAO,IAAI,KAAK,GAAG,GAAG,CAAC,GAAG,IAAI,KAAK,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;AACjG,CAAC;AACD,IAAI,sBAAsB,GAAG,CAACA,SAAI,IAAIA,SAAI,CAAC,sBAAsB,KAAK,UAAU,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE;AACjH,IAAI,IAAI,IAAI,KAAK,GAAG,EAAE,MAAM,IAAI,SAAS,CAAC,gCAAgC,CAAC;AAC3E,IAAI,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,CAAC,EAAE,MAAM,IAAI,SAAS,CAAC,+CAA+C,CAAC;AAChG,IAAI,IAAI,OAAO,KAAK,KAAK,UAAU,GAAG,QAAQ,KAAK,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,SAAS,CAAC,yEAAyE,CAAC;AACrL,IAAI,OAAO,CAAC,IAAI,KAAK,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,KAAK;AAC7G,CAAC;AACD,IAAI,wBAAwB;AAG5B;AACA;AACA;AACA;AACA;AACO,MAAM,6BAA6B,GAAG,GAAG;AAChD;AACA;AACA;AACA;AACA;AACO,MAAM,kCAAkC,GAAG,EAAE;AACpD;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAM,8BAA8B,GAAG,IAAI;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAM,2BAA2B,GAAG,IAAI;AAE/C;AACA;AACA;AACA;AACA;AACO,MAAM,kBAAkB,GAAG,GAAG;AAC9B,MAAM,kBAAkB,GAAG,GAAG;AAC9B,MAAM,0BAA0B,GAAG;AAC1C,IAAI,EAAE,EAAE,SAAS;AACjB,IAAI,OAAO,EAAE,UAAU;AACvB,IAAI,MAAM,EAAE,SAAS;AACrB,IAAI,WAAW,EAAE,IAAI;AACrB,IAAI,MAAM,EAAE,SAAS;AACrB,IAAI,OAAO,EAAE,SAAS;AACtB,IAAI,IAAI,EAAE,OAAO;AACjB,IAAI,KAAK,EAAE,QAAQ;AACnB,IAAI,eAAe,EAAE,KAAK;AAC1B,IAAI,KAAK,EAAE,KAAK;AAChB,IAAI,MAAM,EAAE,QAAQ;AACpB,IAAI,KAAK,EAAE,OAAO;AAClB,IAAI,UAAU,EAAE,aAAa;AAC7B,IAAI,IAAI,EAAE,OAAO;AACjB,IAAI,IAAI,EAAE,OAAO;AACjB,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAM,0BAA0B,GAAG,MAAM,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC,KAAK;AAC/H,IAAI,IAAI,SAAS,EAAE;AACnB,QAAQ,GAAG,CAAC,SAAS,CAAC,GAAG,WAAW;AACpC,IAAI;AACJ,IAAI,OAAO,GAAG;AACd,CAAC,EAAE,EAAE,CAAC;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAM,eAAe,SAAS,KAAK,CAAC;AAC3C,IAAI,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE;AAC/B,QAAQ,KAAK,CAAC,OAAO,CAAC;AACtB,QAAQ,IAAI,CAAC,IAAI,GAAG,iBAAiB;AACrC,QAAQ,IAAI,CAAC,IAAI,GAAG,IAAI;AACxB,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,6BAA6B,CAAC,GAAG,EAAE,IAAI,EAAE;AACzD,IAAI,IAAI,GAAG,YAAY,YAAY,EAAE;AACrC,QAAQ,QAAQ,GAAG,CAAC,IAAI;AACxB,YAAY,KAAK,iBAAiB;AAClC,gBAAgB,OAAO,mBAAmB;AAC1C,YAAY,KAAK,eAAe;AAChC,gBAAgB,OAAO,IAAI,KAAK,QAAQ,GAAG,oBAAoB,GAAG,0BAA0B;AAC5F,YAAY,KAAK,kBAAkB;AACnC,gBAAgB,OAAO,IAAI,KAAK,QAAQ,GAAG,eAAe,GAAG,6BAA6B;AAC1F;AACA,IAAI;AACJ,IAAI,OAAO,eAAe;AAC1B;AACA;AACA;AACA;AACA;AACO,MAAM,aAAa,SAASC,cAAS,CAAC;AAC7C,IAAI,WAAW,GAAG;AAClB,QAAQ,KAAK,EAAE;AACf;AACA,QAAQ,IAAI,CAAC,YAAY,GAAG,IAAI;AAChC,QAAQ,IAAI,CAAC,aAAa,GAAG,IAAI;AACjC;AACA,QAAQ,IAAI,CAAC,MAAM,GAAG,IAAI;AAC1B,QAAQ,wBAAwB,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC;AACjD;AACA,QAAQ,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;AAC3C,QAAQ,IAAI,CAAC,WAAW,GAAG,GAAG;AAC9B;AACA;AACA;AACA;AACA,QAAQ,IAAI,CAAC,eAAe,GAAG,KAAK;AACpC,QAAQ,IAAI,CAAC,gBAAgB,GAAG,KAAK;AACrC;AACA;AACA;AACA;AACA;AACA,QAAQ,IAAI,CAAC,kBAAkB,GAAG,IAAI;AACtC;AACA;AACA;AACA;AACA,QAAQ,IAAI,CAAC,uBAAuB,GAAG,OAAO;AAC9C;AACA;AACA;AACA,QAAQ,IAAI,CAAC,4BAA4B,GAAG,EAAE;AAC9C;AACA,QAAQ,IAAI,CAAC,yBAAyB,GAAG,KAAK;AAC9C,QAAQ,IAAI,CAAC,eAAe,GAAG,IAAI;AACnC;AACA;AACA;AACA,QAAQ,IAAI,CAAC,+BAA+B,GAAG,IAAI;AACnD;AACA;AACA;AACA,QAAQ,IAAI,CAAC,uBAAuB,GAAG,IAAI;AAC3C;AACA,QAAQ,IAAI,CAAC,aAAa,GAAG,IAAI;AACjC,QAAQ,IAAI,CAAC,cAAc,GAAG,EAAE;AAChC,QAAQ,IAAI,CAAC,mBAAmB,GAAG,IAAI;AACvC,QAAQ,IAAI,CAAC,gBAAgB,GAAG,IAAI;AACpC,QAAQ,IAAI,CAAC,eAAe,GAAG,IAAI;AACnC,QAAQ,IAAI,CAAC,4BAA4B,EAAE;AAC3C,IAAI;AACJ;AACA;AACA;AACA,IAAI,MAAM,KAAK,CAAC,OAAO,EAAE;AACzB,QAAQ,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;AAC1B;AACA;AACA;AACA;AACA,QAAQ,IAAI,sBAAsB,CAAC,IAAI,EAAE,wBAAwB,EAAE,GAAG,CAAC,EAAE;AACzE,YAAY,MAAM,IAAI,eAAe,CAAC,uDAAuD,EAAE,yBAAyB,CAAC;AACzH,QAAQ;AACR,QAAQ,IAAI;AACZ;AACA,YAAY,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AACpC,gBAAgB,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC;AAC1H,YAAY;AACZ,QAAQ;AACR,QAAQ,OAAO,GAAG,EAAE;AACpB;AACA;AACA;AACA,YAAY,MAAM,IAAI,eAAe,CAAC,CAAC,wBAAwB,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,qBAAqB,CAAC;AAChH,QAAQ;AACR;AACA;AACA;AACA,QAAQ,IAAI,CAAC,uBAAuB,GAAG,CAAC,EAAE,GAAG,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,gBAAgB,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,EAAE,GAAG,OAAO;AACjK,QAAQ,IAAI,IAAI,CAAC,YAAY,EAAE;AAC/B,YAAY,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,uBAAuB,KAAK,KAAK,GAAG,SAAS,GAAG,OAAO;AAC5G,QAAQ;AACR;AACA,QAAQ,IAAI,CAAC,kBAAkB,GAAG,CAAC,EAAE,GAAG,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,WAAW,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,EAAE,GAAG,IAAI;AACpJ,QAAQ,IAAI,CAAC,4BAA4B,GAAG,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC;AACpF,QAAQ,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,4BAA4B,CAAC;AACrF;AACA,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE;AAChF,YAAY,gBAAgB,CAAC,QAAQ,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,EAAE;AACnE;AACA,YAAY,IAAI,CAAC,aAAa,GAAG,CAAC,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,QAAQ,MAAM,OAAO,GAAG,MAAM,GAAG,aAAa;AAC1I,QAAQ;AACR,aAAa;AACb;AACA,YAAY,MAAM,UAAU,GAAG,CAAC,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,QAAQ,MAAM,OAAO,GAAG,MAAM,GAAG,aAAa;AACxI,YAAY,IAAI,CAAC,aAAa,GAAG,UAAU;AAC3C,YAAY,gBAAgB,CAAC,UAAU,GAAG,UAAU;AACpD,QAAQ;AACR,QAAQ,MAAM,WAAW,GAAG;AAC5B,YAAY,KAAK,EAAE,gBAAgB;AACnC,YAAY,KAAK,EAAE,KAAK;AACxB,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,QAAQ,IAAI;AACZ,YAAY,IAAI,CAAC,MAAM,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC,WAAW,CAAC;AAChF,QAAQ;AACR,QAAQ,OAAO,GAAG,EAAE;AACpB,YAAY,MAAM,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC;AACpD,QAAQ;AACR,QAAQ,IAAI;AACZ,YAAY,IAAI,IAAI,CAAC,YAAY,EAAE;AACnC,gBAAgB,IAAI,CAAC,YAAY,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM;AACzD;AACA;AACA;AACA;AACA,gBAAgB,IAAI;AACpB,oBAAoB,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;AAClD,gBAAgB;AAChB,gBAAgB,OAAO,GAAG,EAAE;AAC5B,oBAAoB,OAAO,CAAC,IAAI,CAAC,mDAAmD,EAAE,GAAG,CAAC;AAC1F,gBAAgB;AAChB,gBAAgB,sBAAsB,CAAC,IAAI,EAAE,wBAAwB,EAAE,IAAI,EAAE,GAAG,CAAC;AACjF;AACA;AACA;AACA;AACA,gBAAgB,IAAI;AACpB,oBAAoB,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,OAAO,CAAC,UAAU,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC;AACnK,gBAAgB;AAChB,gBAAgB,OAAO,GAAG,EAAE;AAC5B,oBAAoB,OAAO,CAAC,IAAI,CAAC,kDAAkD,EAAE,GAAG,CAAC;AACzF,gBAAgB;AAChB;AACA,gBAAgB,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,OAAO,CAAC,sBAAsB,EAAE;AACtG,oBAAoB,MAAM,IAAI,CAAC,4BAA4B,EAAE;AAC7D,oBAAoB,IAAI,IAAI,CAAC,yBAAyB,EAAE;AACxD,wBAAwB,MAAM,IAAI,CAAC,wBAAwB,CAAC,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;AACnI,wBAAwB,IAAI,CAAC,qBAAqB,EAAE;AACpD,oBAAoB;AACpB,gBAAgB;AAChB,YAAY;AACZ,QAAQ;AACR,QAAQ,OAAO,GAAG,EAAE;AACpB;AACA;AACA;AACA,YAAY,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;AACnH,YAAY,IAAI,CAAC,MAAM,GAAG,IAAI;AAC9B,YAAY,sBAAsB,CAAC,IAAI,EAAE,wBAAwB,EAAE,KAAK,EAAE,GAAG,CAAC;AAC9E,YAAY,IAAI,IAAI,CAAC,YAAY,EAAE;AACnC,gBAAgB,IAAI,CAAC,YAAY,CAAC,SAAS,GAAG,IAAI;AAClD,YAAY;AACZ,YAAY,MAAM,IAAI,eAAe,CAAC,CAAC,wBAAwB,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC;AAC1G,QAAQ;AACR,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,0BAA0B,CAAC,OAAO,EAAE;AACxC,QAAQ,IAAI,EAAE;AACd,QAAQ,MAAM,KAAK,GAAG,CAAC,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,WAAW,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC;AACxH,QAAQ,MAAM,UAAU,GAAG,CAAC,EAAE,GAAG,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,mBAAmB,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,EAAE,GAAG,2BAA2B;AAC5K,QAAQ,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC;AAC1D,QAAQ,MAAM,WAAW,GAAG;AAC5B,YAAY,KAAK,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE;AACxC,YAAY,MAAM,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE;AAC1C,SAAS;AACT,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE;AACnF,YAAY,WAAW,CAAC,WAAW,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE;AACtD,QAAQ;AACR,QAAQ,OAAO,WAAW;AAC1B,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,wBAAwB,CAAC,GAAG,EAAE;AAClC,QAAQ,IAAI,GAAG,YAAY,YAAY,EAAE;AACzC,YAAY,QAAQ,GAAG,CAAC,IAAI;AAC5B,gBAAgB,KAAK,iBAAiB;AACtC,oBAAoB,OAAO,IAAI,eAAe,CAAC,mCAAmC,EAAE,mBAAmB,CAAC;AACxG,gBAAgB,KAAK,eAAe;AACpC,oBAAoB,OAAO,IAAI,eAAe,CAAC,mFAAmF,EAAE,oBAAoB,CAAC;AACzJ,gBAAgB,KAAK,kBAAkB;AACvC,oBAAoB,OAAO,IAAI,eAAe,CAAC,wHAAwH,EAAE,eAAe,CAAC;AACzL;AACA,QAAQ;AACR,QAAQ,OAAO,IAAI,eAAe,CAAC,CAAC,wBAAwB,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC;AACvG,IAAI;AACJ;AACA;AACA;AACA,IAAI,MAAM,IAAI,GAAG;AACjB,QAAQ,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE;AACtB,QAAQ,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,wBAAwB,EAAE,GAAG,CAAC,EAAE;AAC1E,YAAY;AACZ,QAAQ;AACR,QAAQ,IAAI;AACZ;AACA;AACA;AACA;AACA;AACA,YAAY,CAAC,EAAE,GAAG,IAAI,CAAC,+BAA+B,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE;AACvG,YAAY,IAAI,CAAC,+BAA+B,GAAG,IAAI;AACvD,YAAY,IAAI,IAAI,CAAC,uBAAuB,KAAK,IAAI,EAAE;AACvD,gBAAgB,oBAAoB,CAAC,IAAI,CAAC,uBAAuB,CAAC;AAClE,gBAAgB,IAAI,CAAC,uBAAuB,GAAG,IAAI;AACnD,YAAY;AACZ;AACA,YAAY,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,KAAK,UAAU,EAAE;AAC/E;AACA;AACA;AACA;AACA,gBAAgB,CAAC,EAAE,GAAG,IAAI,CAAC,eAAe,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,eAAe,CAAC,wCAAwC,EAAE,eAAe,CAAC,CAAC;AAC9K,gBAAgB,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5C,gBAAgB,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3C,gBAAgB,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE;AACzC,gBAAgB,IAAI,CAAC,aAAa,GAAG,IAAI;AACzC,YAAY;AACZ,YAAY,IAAI,CAAC,cAAc,GAAG,EAAE;AACpC,YAAY,IAAI,IAAI,CAAC,mBAAmB,EAAE;AAC1C,gBAAgB,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE;AAC/C,gBAAgB,IAAI,CAAC,mBAAmB,GAAG,IAAI;AAC/C,YAAY;AACZ;AACA,YAAY,IAAI,IAAI,CAAC,MAAM,EAAE;AAC7B,gBAAgB,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;AACxE,gBAAgB,IAAI,CAAC,MAAM,GAAG,IAAI;AAClC,YAAY;AACZ;AACA,YAAY,IAAI,IAAI,CAAC,YAAY,EAAE;AACnC,gBAAgB,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;AACzC,gBAAgB,IAAI,CAAC,YAAY,CAAC,SAAS,GAAG,IAAI;AAClD,gBAAgB,CAAC,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC;AAC1H,gBAAgB,IAAI,CAAC,YAAY,GAAG,IAAI;AACxC,YAAY;AACZ,YAAY,sBAAsB,CAAC,IAAI,EAAE,wBAAwB,EAAE,KAAK,EAAE,GAAG,CAAC;AAC9E,QAAQ;AACR,QAAQ,OAAO,GAAG,EAAE;AACpB;AACA;AACA,YAAY,MAAM,IAAI,eAAe,CAAC,CAAC,uBAAuB,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC;AACzG,QAAQ;AACR,IAAI;AACJ;AACA;AACA;AACA,IAAI,MAAM,SAAS,GAAG;AACtB,QAAQ,OAAO,EAAE,SAAS,EAAE,sBAAsB,CAAC,IAAI,EAAE,wBAAwB,EAAE,GAAG,CAAC,EAAE;AACzF,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI,MAAM,OAAO,CAAC,OAAO,EAAE;AAC3B,QAAQ,IAAI,EAAE;AACd,QAAQ,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY;AAC9C,QAAQ,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,wBAAwB,EAAE,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE;AAC3F,YAAY,MAAM,IAAI,eAAe,CAAC,uBAAuB,EAAE,qBAAqB,CAAC;AACrF,QAAQ;AACR,QAAQ,IAAI;AACZ,YAAY,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE;AAClD;AACA;AACA;AACA;AACA,YAAY,MAAM,WAAW,GAAG,IAAI,CAAC,uBAAuB,KAAK,KAAK,IAAI,IAAI,CAAC;AAC/E,kBAAkB,sBAAsB,CAAC,YAAY;AACrD,kBAAkB,oBAAoB,CAAC,YAAY,CAAC;AACpD;AACA;AACA;AACA;AACA,YAAY,MAAM,WAAW,GAAG,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC;AACrF,YAAY,uBAAuB,CAAC,MAAM,EAAE,YAAY,EAAE,WAAW,CAAC;AACtE;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,MAAM,gBAAgB,GAAG,CAAC,EAAE,GAAG,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,OAAO,CAAC,OAAO,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE;AACjJ,YAAY,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,gBAAgB,GAAG,GAAG,CAAC,CAAC;AAChF,YAAY,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,OAAO,CAAC,UAAU,EAAE;AACtF;AACA;AACA,gBAAgB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK;AACxD,oBAAoB,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK;AAC5C,wBAAwB,IAAI,CAAC,IAAI,EAAE;AACnC,4BAA4B,MAAM,CAAC,IAAI,eAAe,CAAC,mCAAmC,EAAE,0BAA0B,CAAC,CAAC;AACxH,4BAA4B;AAC5B,wBAAwB;AACxB,wBAAwB,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;AAC7D,wBAAwB,OAAO,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;AACjD,oBAAoB,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC;AAC7C,gBAAgB,CAAC,CAAC;AAClB,YAAY;AACZ,iBAAiB;AACjB;AACA,gBAAgB,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC;AAClE,gBAAgB,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE;AAC5C,YAAY;AACZ,QAAQ;AACR,QAAQ,OAAO,GAAG,EAAE;AACpB,YAAY,MAAM,IAAI,eAAe,CAAC,CAAC,yBAAyB,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,qBAAqB,CAAC;AACjH,QAAQ;AACR,IAAI;AACJ;AACA;AACA;AACA,IAAI,MAAM,aAAa,CAAC,OAAO,EAAE;AACjC,QAAQ,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;AACpC,IAAI;AACJ;AACA;AACA;AACA,IAAI,MAAM,cAAc,CAAC,OAAO,EAAE;AAClC,QAAQ,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,wBAAwB,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AAChG,YAAY,MAAM,IAAI,eAAe,CAAC,uBAAuB,EAAE,qBAAqB,CAAC;AACrF,QAAQ;AACR,QAAQ,IAAI,IAAI,CAAC,aAAa,EAAE;AAChC,YAAY,MAAM,IAAI,eAAe,CAAC,kCAAkC,EAAE,+BAA+B,CAAC;AAC1G,QAAQ;AACR,QAAQ,IAAI;AACZ,YAAY,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM;AACpC;AACA,YAAY,IAAI,CAAC,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,OAAO,CAAC,WAAW,KAAK,MAAM,EAAE;AACnG,gBAAgB,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AAC9F,gBAAgB,MAAM,UAAU,GAAG,WAAW,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;AAClE,gBAAgB,IAAI,CAAC,mBAAmB,GAAG,UAAU;AACrD,gBAAgB,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,EAAE;AAC3D,gBAAgB,MAAM,GAAG,IAAI,WAAW,CAAC,CAAC,GAAG,WAAW,EAAE,UAAU,CAAC,CAAC;AACtE,YAAY;AACZ,YAAY,IAAI,CAAC,MAAM,EAAE;AACzB,gBAAgB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC;AAC7D,YAAY;AACZ,YAAY,IAAI,CAAC,cAAc,GAAG,EAAE;AACpC,YAAY,MAAM,QAAQ,GAAG,CAAC,uBAAuB,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;AACrI,YAAY,IAAI,CAAC,QAAQ,EAAE;AAC3B,gBAAgB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC;AAC5E,YAAY;AACZ,YAAY,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC;AACxE,YAAY,IAAI,CAAC,aAAa,CAAC,eAAe,GAAG,CAAC,KAAK,KAAK;AAC5D,gBAAgB,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE;AACvD,oBAAoB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;AACxD,gBAAgB;AAChB,YAAY,CAAC;AACb,YAAY,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,MAAM;AAC9C,gBAAgB,IAAI,EAAE;AACtB;AACA,gBAAgB,IAAI,IAAI,CAAC,mBAAmB,EAAE;AAC9C,oBAAoB,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE;AACnD,oBAAoB,IAAI,CAAC,mBAAmB,GAAG,IAAI;AACnD,gBAAgB;AAChB,gBAAgB,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC9E,gBAAgB,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;AACrD,gBAAgB,IAAI,CAAC,cAAc,GAAG,EAAE;AACxC,gBAAgB,IAAI,CAAC,aAAa,GAAG,IAAI;AACzC,gBAAgB,CAAC,EAAE,GAAG,IAAI,CAAC,gBAAgB,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;AACjH,gBAAgB,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5C,gBAAgB,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3C,YAAY,CAAC;AACb,YAAY,IAAI,CAAC,aAAa,CAAC,OAAO,GAAG,CAAC,KAAK,KAAK;AACpD,gBAAgB,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE;AAC9B,gBAAgB,IAAI,IAAI,CAAC,mBAAmB,EAAE;AAC9C,oBAAoB,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE;AACnD,oBAAoB,IAAI,CAAC,mBAAmB,GAAG,IAAI;AACnD,gBAAgB;AAChB,gBAAgB,IAAI,CAAC,aAAa,GAAG,IAAI;AACzC,gBAAgB,IAAI,CAAC,cAAc,GAAG,EAAE;AACxC,gBAAgB,MAAM,YAAY,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC,KAAK,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,EAAE,GAAG,yBAAyB;AACzK;AACA;AACA;AACA,gBAAgB,CAAC,EAAE,GAAG,IAAI,CAAC,eAAe,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,eAAe,CAAC,mBAAmB,GAAG,YAAY,EAAE,eAAe,CAAC,CAAC;AACxK,gBAAgB,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5C,gBAAgB,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3C,YAAY,CAAC;AACb,YAAY,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC1C,QAAQ;AACR,QAAQ,OAAO,GAAG,EAAE;AACpB,YAAY,IAAI,IAAI,CAAC,mBAAmB,EAAE;AAC1C,gBAAgB,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE;AAC/C,gBAAgB,IAAI,CAAC,mBAAmB,GAAG,IAAI;AAC/C,YAAY;AACZ,YAAY,IAAI,CAAC,aAAa,GAAG,IAAI;AACrC,YAAY,IAAI,CAAC,cAAc,GAAG,EAAE;AACpC,YAAY,MAAM,IAAI,eAAe,CAAC,CAAC,2BAA2B,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC;AAClI,QAAQ;AACR,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,0BAA0B,CAAC,GAAG,EAAE;AACpC,QAAQ,IAAI,GAAG,YAAY,YAAY,EAAE;AACzC,YAAY,OAAO,6BAA6B,CAAC,GAAG,EAAE,YAAY,CAAC;AACnE,QAAQ;AACR,QAAQ,IAAI,GAAG,YAAY,KAAK,EAAE;AAClC,YAAY,IAAI,GAAG,CAAC,OAAO,KAAK,4BAA4B,EAAE;AAC9D,gBAAgB,OAAO,oBAAoB;AAC3C,YAAY;AACZ,YAAY,IAAI,GAAG,CAAC,OAAO,KAAK,2CAA2C,EAAE;AAC7E,gBAAgB,OAAO,sBAAsB;AAC7C,YAAY;AACZ,QAAQ;AACR,QAAQ,OAAO,eAAe;AAC9B,IAAI;AACJ;AACA;AACA;AACA,IAAI,MAAM,aAAa,GAAG;AAC1B,QAAQ,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;AACjC,YAAY,MAAM,IAAI,eAAe,CAAC,6BAA6B,EAAE,0BAA0B,CAAC;AAChG,QAAQ;AACR;AACA;AACA;AACA,QAAQ,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,eAAe,EAAE;AAC3D,YAAY,MAAM,IAAI,eAAe,CAAC,oCAAoC,EAAE,eAAe,CAAC;AAC5F,QAAQ;AACR,QAAQ,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK;AAChD,YAAY,IAAI,EAAE;AAClB,YAAY,IAAI,CAAC,gBAAgB,GAAG,OAAO;AAC3C,YAAY,IAAI,CAAC,eAAe,GAAG,MAAM;AACzC,YAAY,CAAC,EAAE,GAAG,IAAI,CAAC,aAAa,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC,IAAI,EAAE;AACpF,QAAQ,CAAC,CAAC;AACV,IAAI;AACJ;AACA;AACA;AACA,IAAI,MAAM,UAAU,GAAG;AACvB,QAAQ,IAAI,EAAE;AACd,QAAQ,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,wBAAwB,EAAE,GAAG,CAAC,EAAE;AAC1E,YAAY,MAAM,IAAI,eAAe,CAAC,uBAAuB,EAAE,qBAAqB,CAAC;AACrF,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,KAAK,UAAU,EAAE;AAC3E,YAAY,MAAM,IAAI,eAAe,CAAC,qDAAqD,EAAE,+BAA+B,CAAC;AAC7H,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,QAAQ,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,KAAK,MAAM,GAAG,aAAa,GAAG,MAAM;AACjF;AACA;AACA;AACA,QAAQ,MAAM,WAAW,GAAG;AAC5B,YAAY,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,4BAA4B,CAAC,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;AAClH,YAAY,KAAK,EAAE,KAAK;AACxB,SAAS;AACT,QAAQ,IAAI,SAAS;AACrB,QAAQ,IAAI;AACZ,YAAY,SAAS,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC,WAAW,CAAC;AAC9E,QAAQ;AACR,QAAQ,OAAO,GAAG,EAAE;AACpB;AACA;AACA;AACA;AACA,YAAY,MAAM,IAAI,eAAe,CAAC,CAAC,uBAAuB,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,6BAA6B,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AACtI,QAAQ;AACR;AACA;AACA,QAAQ,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;AAC/G,QAAQ,IAAI,CAAC,MAAM,GAAG,SAAS;AAC/B,QAAQ,IAAI,CAAC,aAAa,GAAG,UAAU;AACvC,QAAQ,IAAI,IAAI,CAAC,YAAY,EAAE;AAC/B,YAAY,IAAI,CAAC,YAAY,CAAC,SAAS,GAAG,SAAS;AACnD,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,QAAQ,IAAI;AACZ,YAAY,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;AAC3D,QAAQ;AACR,QAAQ,OAAO,GAAG,EAAE;AACpB,YAAY,OAAO,CAAC,IAAI,CAAC,4DAA4D,EAAE,GAAG,CAAC;AAC3F,QAAQ;AACR,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,MAAM,mBAAmB,GAAG;AAChC,QAAQ,IAAI,EAAE;AACd,QAAQ,IAAI;AACZ,YAAY,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,gBAAgB,EAAE;AAC3E,YAAY,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,KAAK,YAAY,CAAC;AACzF,YAAY,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,EAAE;AACpD,YAAY,MAAM,cAAc,GAAG,WAAW,KAAK,IAAI,IAAI,WAAW,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ;AAC/H,YAAY,MAAM,gBAAgB,GAAG,WAAW,IAAI,OAAO,WAAW,CAAC,eAAe,KAAK;AAC3F,kBAAkB,CAAC,EAAE,GAAG,WAAW,CAAC,eAAe,EAAE,CAAC,UAAU,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;AAC3G,kBAAkB,SAAS;AAC3B,YAAY,OAAO;AACnB,gBAAgB,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK;AACtD,oBAAoB,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,KAAK,cAAc,IAAI;AAC3E,0BAA0B,gBAAgB,KAAK;AAC/C,8BAA8B;AAC9B,8BAA8B;AAC9B,0BAA0B,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO;AACrE,8BAA8B;AAC9B,8BAA8B,MAAM;AACpC,oBAAoB,OAAO;AAC3B,wBAAwB,EAAE,EAAE,MAAM,CAAC,QAAQ;AAC3C,wBAAwB,IAAI,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACzF,wBAAwB,QAAQ;AAChC,qBAAqB;AACrB,gBAAgB,CAAC,CAAC;AAClB,aAAa;AACb,QAAQ;AACR,QAAQ,OAAO,GAAG,EAAE;AACpB,YAAY,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,GAAG,CAAC;AACjE,YAAY,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE;AAClC,QAAQ;AACR,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,MAAM,OAAO,GAAG;AACpB,QAAQ,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE;AAC1C,QAAQ,MAAM,UAAU,GAAG,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC;AAC9D,QAAQ,IAAI,KAAK,IAAI,UAAU,EAAE;AACjC,YAAY,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,EAAE;AAChD,YAAY,OAAO;AACnB,gBAAgB,GAAG,EAAE,UAAU,CAAC,GAAG;AACnC,gBAAgB,GAAG,EAAE,UAAU,CAAC,GAAG;AACnC,gBAAgB,OAAO,EAAE,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,GAAG,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW;AAC7F,aAAa;AACb,QAAQ;AACR;AACA,QAAQ,OAAO;AACf,YAAY,GAAG,EAAE,kBAAkB;AACnC,YAAY,GAAG,EAAE,kBAAkB;AACnC,YAAY,OAAO,EAAE,IAAI,CAAC,WAAW;AACrC,SAAS;AACT,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,MAAM,OAAO,CAAC,OAAO,EAAE;AAC3B,QAAQ,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE;AAC1C,QAAQ,MAAM,UAAU,GAAG,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC;AAC9D,QAAQ,IAAI,KAAK,IAAI,UAAU,EAAE;AACjC,YAAY,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC;AAC7F,YAAY,MAAM,KAAK,CAAC,gBAAgB,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;AAC3E,YAAY,IAAI,CAAC,WAAW,GAAG,OAAO;AACtC,YAAY,IAAI,CAAC,eAAe,GAAG,IAAI;AACvC;AACA;AACA,YAAY,IAAI,IAAI,CAAC,YAAY,EAAE;AACnC,gBAAgB,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE;AACtD,YAAY;AACZ,YAAY;AACZ,QAAQ;AACR;AACA,QAAQ,IAAI,CAAC,eAAe,GAAG,KAAK;AACpC,QAAQ,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,KAAK;AACxC,QAAQ,IAAI,IAAI,CAAC,YAAY,EAAE;AAC/B,YAAY,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,GAAG,OAAO,CAAC,IAAI,GAAG,4BAA4B,GAAG,MAAM;AACrG,YAAY,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;AAClF,YAAY,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,eAAe,GAAG,QAAQ;AAC9D,QAAQ;AACR,IAAI;AACJ;AACA;AACA;AACA,IAAI,aAAa,GAAG;AACpB,QAAQ,IAAI,EAAE,EAAE,EAAE;AAClB,QAAQ,OAAO,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,EAAE,GAAG,IAAI;AAC1I,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI,uBAAuB,CAAC,KAAK,EAAE;AACnC,QAAQ,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,eAAe,KAAK,UAAU,EAAE;AACnE,YAAY,OAAO,IAAI;AACvB,QAAQ;AACR,QAAQ,MAAM,IAAI,GAAG,KAAK,CAAC,eAAe,EAAE,CAAC,IAAI;AACjD,QAAQ,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;AACzG,YAAY,OAAO,IAAI;AACvB,QAAQ;AACR,QAAQ,OAAO,IAAI;AACnB,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,eAAe,GAAG;AACtB,QAAQ,IAAI,IAAI,CAAC,eAAe,EAAE;AAClC,YAAY,OAAO,CAAC;AACpB,QAAQ;AACR,QAAQ,OAAO,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;AAC3F,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,MAAM,aAAa,GAAG;AAC1B,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,iEAAiE,CAAC;AACnG,IAAI;AACJ;AACA;AACA;AACA,IAAI,MAAM,YAAY,GAAG;AACzB,QAAQ,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,gBAAgB,EAAE;AACnD,IAAI;AACJ;AACA;AACA;AACA,IAAI,MAAM,sBAAsB,GAAG;AACnC;AACA,QAAQ,OAAO,EAAE,UAAU,EAAE,CAAC,KAAK,CAAC,EAAE;AACtC,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,MAAM,YAAY,CAAC,OAAO,EAAE;AAChC,QAAQ,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE;AACpC,YAAY,MAAM,IAAI,CAAC,aAAa,CAAC,gEAAgE,CAAC;AACtG,QAAQ;AACR,QAAQ,IAAI,CAAC,gBAAgB,GAAG,KAAK;AACrC,IAAI;AACJ;AACA;AACA;AACA,IAAI,MAAM,gBAAgB,GAAG;AAC7B;AACA,QAAQ,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE;AACnC,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,MAAM,YAAY,GAAG;AACzB,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,uDAAuD,CAAC;AACzF,IAAI;AACJ;AACA;AACA;AACA,IAAI,MAAM,YAAY,GAAG;AACzB;AACA,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,uDAAuD,CAAC;AACzF,IAAI;AACJ;AACA;AACA;AACA,IAAI,MAAM,gBAAgB,GAAG;AAC7B,QAAQ,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;AACvD,YAAY,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC;AAChD,YAAY,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC;AACpD,SAAS,CAAC;AACV,QAAQ,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE;AACrC,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,MAAM,qBAAqB,CAAC,IAAI,EAAE;AACtC,QAAQ,IAAI,SAAS,CAAC,WAAW,EAAE;AACnC,YAAY,IAAI;AAChB,gBAAgB,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAChF,gBAAgB,OAAO,MAAM,CAAC,KAAK,KAAK,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC,KAAK,KAAK,QAAQ,GAAG,QAAQ,GAAG,QAAQ;AAC/G,YAAY;AACZ,YAAY,OAAO,EAAE,EAAE;AACvB;AACA;AACA;AACA,YAAY;AACZ,QAAQ;AACR;AACA;AACA;AACA,QAAQ,IAAI,IAAI,KAAK,QAAQ,EAAE;AAC/B,YAAY,OAAO,IAAI,CAAC,MAAM,GAAG,SAAS,GAAG,QAAQ;AACrD,QAAQ;AACR,QAAQ,OAAO,QAAQ;AACvB,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI,MAAM,kBAAkB,CAAC,OAAO,EAAE;AACtC,QAAQ,IAAI,EAAE;AACd,QAAQ,MAAM,WAAW,GAAG,CAAC,EAAE,GAAG,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,WAAW,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC;AACpJ,QAAQ,MAAM,MAAM,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE;AACjE;AACA,QAAQ,IAAI,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;AAC5C,YAAY,IAAI;AAChB,gBAAgB,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzF,gBAAgB,MAAM,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;AACnE,gBAAgB,MAAM,CAAC,MAAM,GAAG,SAAS;AACzC,YAAY;AACZ,YAAY,OAAO,EAAE,EAAE;AACvB,gBAAgB,MAAM,CAAC,MAAM,GAAG,QAAQ;AACxC,YAAY;AACZ,QAAQ;AACR,aAAa;AACb;AACA,YAAY,MAAM,CAAC,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,gBAAgB,EAAE,EAAE,MAAM;AAClE,QAAQ;AACR;AACA,QAAQ,IAAI,WAAW,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE;AAChD,YAAY,IAAI;AAChB,gBAAgB,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzF,gBAAgB,MAAM,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;AACnE,gBAAgB,MAAM,CAAC,UAAU,GAAG,SAAS;AAC7C,YAAY;AACZ,YAAY,OAAO,EAAE,EAAE;AACvB,gBAAgB,MAAM,CAAC,UAAU,GAAG,QAAQ;AAC5C,YAAY;AACZ,QAAQ;AACR,aAAa;AACb,YAAY,MAAM,CAAC,UAAU,GAAG,CAAC,MAAM,IAAI,CAAC,gBAAgB,EAAE,EAAE,UAAU;AAC1E,QAAQ;AACR,QAAQ,OAAO,MAAM;AACrB,IAAI;AACJ;AACA;AACA;AACA,IAAI,MAAM,qBAAqB,GAAG;AAClC,QAAQ,IAAI,EAAE;AACd,QAAQ,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe;AACpD,QAAQ,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY;AAC9C,QAAQ,IAAI,CAAC,IAAI,CAAC,yBAAyB,IAAI,CAAC,eAAe,IAAI,CAAC,YAAY,EAAE;AAClF,YAAY;AACZ,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,QAAQ,CAAC,EAAE,GAAG,IAAI,CAAC,+BAA+B,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC,KAAK,EAAE;AACnG,QAAQ,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE;AACrD,QAAQ,IAAI,CAAC,+BAA+B,GAAG,eAAe;AAC9D,QAAQ,MAAM,EAAE,MAAM,EAAE,GAAG,eAAe;AAC1C;AACA;AACA;AACA;AACA;AACA,QAAQ,IAAI,YAAY,CAAC,UAAU,GAAG,CAAC,EAAE;AACzC,YAAY,MAAM,UAAU,GAAG,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK;AAC9D,gBAAgB,MAAM,OAAO,GAAG,MAAM;AACtC,oBAAoB,YAAY,CAAC,mBAAmB,CAAC,YAAY,EAAE,WAAW,CAAC;AAC/E,oBAAoB,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC;AACrE,oBAAoB,YAAY,CAAC,SAAS,CAAC;AAC3C,gBAAgB,CAAC;AACjB,gBAAgB,MAAM,WAAW,GAAG,MAAM;AAC1C,oBAAoB,OAAO,EAAE;AAC7B,oBAAoB,OAAO,CAAC,IAAI,CAAC;AACjC,gBAAgB,CAAC;AACjB,gBAAgB,MAAM,YAAY,GAAG,MAAM;AAC3C,oBAAoB,OAAO,EAAE;AAC7B,oBAAoB,OAAO,CAAC,KAAK,CAAC;AAClC,gBAAgB,CAAC;AACjB,gBAAgB,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM;AACnD,oBAAoB,OAAO,EAAE;AAC7B,oBAAoB,OAAO,CAAC,KAAK,CAAC;AAClC,gBAAgB,CAAC,EAAE,8BAA8B,CAAC;AAClD,gBAAgB,YAAY,CAAC,gBAAgB,CAAC,YAAY,EAAE,WAAW,CAAC;AACxE,gBAAgB,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,CAAC;AAC9D,YAAY,CAAC,CAAC;AACd,YAAY,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,OAAO,EAAE;AAC/C,gBAAgB;AAChB,YAAY;AACZ,QAAQ;AACR,QAAQ,IAAI,MAAM,CAAC,OAAO,EAAE;AAC5B,YAAY;AACZ,QAAQ;AACR;AACA,QAAQ,IAAI,iBAAiB,GAAG,CAAC;AACjC,QAAQ,MAAM,wBAAwB,GAAG,GAAG,CAAC;AAC7C;AACA;AACA;AACA;AACA,QAAQ,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAAE;AAChD;AACA,QAAQ,MAAM,WAAW,GAAG,YAAY;AACxC,YAAY,IAAI,EAAE;AAClB;AACA;AACA;AACA;AACA,YAAY,IAAI,MAAM,CAAC,OAAO,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,wBAAwB,EAAE,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,eAAe,EAAE;AACrI,gBAAgB;AAChB,YAAY;AACZ;AACA;AACA,YAAY,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE;AACzC,YAAY,IAAI,GAAG,GAAG,iBAAiB,IAAI,wBAAwB,EAAE;AACrE,gBAAgB,IAAI;AACpB,oBAAoB,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,YAAY,CAAC;AAC/E,oBAAoB,iBAAiB,GAAG,GAAG;AAC3C,oBAAoB,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AAC7C,wBAAwB,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC;AACnD;AACA;AACA;AACA;AACA,wBAAwB,MAAM,IAAI,GAAG,CAAC,EAAE,GAAG,0BAA0B,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,EAAE,KAAK,KAAK,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,MAAM;AACtI;AACA;AACA;AACA;AACA,wBAAwB,MAAM,UAAU,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC7E,wBAAwB,MAAM,QAAQ,GAAG,sBAAsB,CAAC,GAAG,CAAC,UAAU,CAAC;AAC/E,wBAAwB,IAAI,QAAQ,KAAK,SAAS,IAAI,GAAG,GAAG,QAAQ,IAAI,6BAA6B,EAAE;AACvG;AACA;AACA,4BAA4B,IAAI,sBAAsB,CAAC,IAAI,GAAG,kCAAkC,EAAE;AAClG,gCAAgC,KAAK,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,sBAAsB,EAAE;AACtF,oCAAoC,IAAI,GAAG,GAAG,QAAQ,IAAI,6BAA6B,EAAE;AACzF,wCAAwC,sBAAsB,CAAC,MAAM,CAAC,GAAG,CAAC;AAC1E,oCAAoC;AACpC,gCAAgC;AAChC,4BAA4B;AAC5B,4BAA4B,sBAAsB,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC;AACvE;AACA;AACA;AACA,4BAA4B,MAAM,YAAY,GAAG,2BAA2B,CAAC,OAAO,CAAC,WAAW,EAAE,YAAY,EAAE,IAAI,CAAC,uBAAuB,CAAC;AAC7I,4BAA4B,IAAI,CAAC,eAAe,CAAC,iBAAiB,EAAE;AACpE,gCAAgC,KAAK,EAAE,OAAO,CAAC,QAAQ;AACvD,gCAAgC,IAAI;AACpC,gCAAgC,YAAY;AAC5C,6BAA6B,CAAC;AAC9B,wBAAwB;AACxB,oBAAoB;AACpB,gBAAgB;AAChB,gBAAgB,OAAO,GAAG,EAAE;AAC5B,oBAAoB,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,CAAC;AACjE,gBAAgB;AAChB,YAAY;AACZ,YAAY,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,sBAAsB,CAAC,IAAI,EAAE,wBAAwB,EAAE,GAAG,CAAC,EAAE;AAChG,gBAAgB,IAAI,CAAC,uBAAuB,GAAG,qBAAqB,CAAC,WAAW,CAAC;AACjF,YAAY;AACZ,QAAQ,CAAC;AACT,QAAQ,IAAI,CAAC,uBAAuB,GAAG,qBAAqB,CAAC,WAAW,CAAC;AACzE,IAAI;AACJ;AACA;AACA;AACA,IAAI,MAAM,4BAA4B,GAAG;AACzC,QAAQ,IAAI,iBAAiB,IAAI,MAAM,EAAE;AACzC,YAAY,IAAI;AAChB,gBAAgB,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,EAAE;AAC5D,gBAAgB,IAAI,CAAC,yBAAyB,GAAG,IAAI;AACrD,YAAY;AACZ,YAAY,OAAO,CAAC,EAAE;AACtB,gBAAgB,OAAO,CAAC,IAAI,CAAC,mDAAmD,CAAC;AACjF,gBAAgB,IAAI,CAAC,yBAAyB,GAAG,KAAK;AACtD,YAAY;AACZ,QAAQ;AACR,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI,MAAM,wBAAwB,CAAC,YAAY,EAAE;AACjD,QAAQ,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE;AAC7C,YAAY;AACZ,QAAQ;AACR,QAAQ,IAAI,EAAE,YAAY,KAAK,IAAI,IAAI,YAAY,KAAK,MAAM,GAAG,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,EAAE;AAChG,YAAY,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,EAAE;AACxD,YAAY;AACZ,QAAQ;AACR,QAAQ,MAAM,gBAAgB,GAAG;AACjC,aAAa,GAAG,CAAC,CAAC,WAAW,KAAK;AAClC,YAAY,MAAM,SAAS,GAAG,0BAA0B,CAAC,WAAW,CAAC;AACrE,YAAY,IAAI,CAAC,SAAS,EAAE;AAC5B,gBAAgB,OAAO,CAAC,IAAI,CAAC,CAAC,2BAA2B,EAAE,WAAW,CAAC,kDAAkD,CAAC,CAAC;AAC3H,YAAY;AACZ,YAAY,OAAO,SAAS;AAC5B,QAAQ,CAAC;AACT,aAAa,MAAM,CAAC,CAAC,MAAM,KAAK,MAAM,KAAK,IAAI,CAAC;AAChD,QAAQ,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE;AACtC,YAAY,OAAO,CAAC,IAAI,CAAC,sGAAsG,CAAC;AAChI,YAAY,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,EAAE;AACxD,YAAY;AACZ,QAAQ;AACR,QAAQ,MAAM,sBAAsB,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,gBAAgB,CAAC,CAAC;AAC5E,QAAQ,IAAI;AACZ,YAAY,MAAM,gBAAgB,GAAG,MAAM,eAAe,CAAC,mBAAmB,EAAE;AAChF,YAAY,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAClH,YAAY,MAAM,cAAc,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAChH,YAAY,IAAI,cAAc,CAAC,MAAM,EAAE;AACvC,gBAAgB,OAAO,CAAC,IAAI,CAAC,CAAC,oEAAoE,EAAE,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACjI,YAAY;AACZ,YAAY,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE;AAC3C,gBAAgB,OAAO,CAAC,IAAI,CAAC,iHAAiH,CAAC;AAC/I,gBAAgB,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,EAAE;AAC5D,gBAAgB;AAChB,YAAY;AACZ,YAAY,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC;AACtF,QAAQ;AACR,QAAQ,OAAO,KAAK,EAAE;AACtB,YAAY,OAAO,CAAC,IAAI,CAAC,gGAAgG,EAAE,KAAK,CAAC;AACjI,YAAY,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,EAAE;AACxD,QAAQ;AACR,IAAI;AACJ;AACA;AACA;AACA,IAAI,MAAM,iBAAiB,CAAC,kBAAkB,EAAE;AAChD,QAAQ,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AAC3D,QAAQ,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG,IAAI;AAC5C,QAAQ,IAAI,CAAC,YAAY,CAAC,QAAQ,GAAG,IAAI;AACzC,QAAQ,IAAI,CAAC,YAAY,CAAC,KAAK,GAAG,IAAI;AACtC,QAAQ,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM;AAC9C,QAAQ,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;AAC/C,QAAQ,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,GAAG,OAAO;AACnD;AACA,QAAQ,IAAI,kBAAkB,EAAE;AAChC,YAAY,MAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,CAAC,kBAAkB,CAAC;AACzE,YAAY,IAAI,CAAC,SAAS,EAAE;AAC5B,gBAAgB,MAAM,IAAI,KAAK,CAAC,CAAC,0BAA0B,EAAE,kBAAkB,CAAC,UAAU,CAAC,CAAC;AAC5F,YAAY;AACZ,YAAY,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC;AACpD,QAAQ;AACR,aAAa;AACb;AACA,YAAY,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC;AACxD,QAAQ;AACR,IAAI;AACJ;AACA;AACA;AACA,IAAI,gBAAgB,GAAG;AACvB,QAAQ,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;AACjC,YAAY,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;AACjE,QAAQ;AACR,QAAQ,OAAO,IAAI,CAAC,aAAa;AACjC,IAAI;AACJ;AACA;AACA;AACA,IAAI,WAAW,CAAC,GAAG,EAAE;AACrB,QAAQ,OAAO,GAAG,YAAY,KAAK,GAAG,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC;AAC/D,IAAI;AACJ;AACA,wBAAwB,GAAG,IAAI,OAAO,EAAE;;;;;;;;;;;;;;;;;;;"}
|