@microblink/camera-manager 7.2.3 → 7.2.5

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.
@@ -1 +0,0 @@
1
- {"version":3,"file":"camera-manager.js","sources":["../../../node_modules/.pnpm/rvfc-polyfill@1.0.7/node_modules/rvfc-polyfill/index.js","../src/core/cameraNames.ts","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/TemplateTag/TemplateTag.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/trimResultTransformer/trimResultTransformer.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/stripIndentTransformer/stripIndentTransformer.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/replaceResultTransformer/replaceResultTransformer.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/replaceSubstitutionTransformer/replaceSubstitutionTransformer.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/inlineArrayTransformer/inlineArrayTransformer.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/splitStringTransformer/splitStringTransformer.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/removeNonPrintingValuesTransformer/removeNonPrintingValuesTransformer.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/commaLists/commaLists.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/commaListsAnd/commaListsAnd.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/commaListsOr/commaListsOr.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/html/html.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/safeHtml/safeHtml.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/oneLine/oneLine.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/oneLineTrim/oneLineTrim.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/oneLineCommaLists/oneLineCommaLists.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/oneLineCommaListsOr/oneLineCommaListsOr.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/oneLineCommaListsAnd/oneLineCommaListsAnd.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/inlineLists/inlineLists.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/oneLineInlineLists/oneLineInlineLists.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/stripIndent/stripIndent.js","../../../node_modules/.pnpm/common-tags@1.8.2/node_modules/common-tags/es/stripIndents/stripIndents.js","../src/core/iosCameraNames.ts","../src/core/utils.ts","../src/core/cameraError.ts","../src/core/cameraUtils.ts","../src/core/Camera.ts","../src/core/cameraManagerStore.ts","../../../node_modules/.pnpm/@wessberg+connection-observer@1.0.5/node_modules/@wessberg/connection-observer/dist/index.js","../../../node_modules/.pnpm/rad-event-listener@0.2.4/node_modules/rad-event-listener/esm/mod.js","../src/core/VideoFrameProcessor.ts","../src/core/CameraManager.ts","../src/ui/CameraUiStoreContext.tsx","../src/ui/locales/en.ts","../src/ui/LocalizationContext.tsx","../../shared-components/src/SmartEnvironmentProvider.tsx","../../shared-components/src/eventFixer.ts","../src/ui/assets/camera.svg?component-solid","../src/ui/assets/check.svg?component-solid","../src/ui/assets/general-c-chevron-down.svg?component-solid","../src/ui/CameraSelector.tsx","../src/ui/Header.tsx","../../shared-components/src/renderWithOwner.ts","../src/ui/SolidShadowRoot.tsx","../src/ui/zustandRefStore.tsx","../../../node_modules/.pnpm/@solid-primitives+utils@6.3.0_solid-js@1.9.5/node_modules/@solid-primitives/utils/dist/index.js","../../../node_modules/.pnpm/@solid-primitives+resize-observer@2.1.0_solid-js@1.9.5/node_modules/@solid-primitives/resize-observer/dist/index.js","../src/ui/determineFitMode.ts","../src/ui/getVisibleVideoArea.ts","../../shared-components/src/Modal.tsx","../src/ui/CameraErrorModal.tsx","../src/ui/CaptureScreen.tsx","../src/ui/RootComponent.tsx","../src/ui/createCameraManagerUi.tsx","../src/index.ts"],"sourcesContent":["if (typeof HTMLVideoElement !== 'undefined' && !('requestVideoFrameCallback' in HTMLVideoElement.prototype) && 'getVideoPlaybackQuality' in HTMLVideoElement.prototype) {\r\n HTMLVideoElement.prototype._rvfcpolyfillmap = {}\r\n HTMLVideoElement.prototype.requestVideoFrameCallback = function (callback) {\r\n const handle = performance.now()\r\n const quality = this.getVideoPlaybackQuality()\r\n const baseline = this.mozPresentedFrames || this.mozPaintedFrames || quality.totalVideoFrames - quality.droppedVideoFrames\r\n\r\n const check = (old, now) => {\r\n const newquality = this.getVideoPlaybackQuality()\r\n const presentedFrames = this.mozPresentedFrames || this.mozPaintedFrames || newquality.totalVideoFrames - newquality.droppedVideoFrames\r\n if (presentedFrames > baseline) {\r\n const processingDuration = this.mozFrameDelay || (newquality.totalFrameDelay - quality.totalFrameDelay) || 0\r\n const timediff = now - old // HighRes diff\r\n callback(now, {\r\n presentationTime: now + processingDuration * 1000,\r\n expectedDisplayTime: now + timediff,\r\n width: this.videoWidth,\r\n height: this.videoHeight,\r\n mediaTime: Math.max(0, this.currentTime || 0) + timediff / 1000,\r\n presentedFrames,\r\n processingDuration\r\n })\r\n delete this._rvfcpolyfillmap[handle]\r\n } else {\r\n this._rvfcpolyfillmap[handle] = requestAnimationFrame(newer => check(now, newer))\r\n }\r\n }\r\n this._rvfcpolyfillmap[handle] = requestAnimationFrame(newer => check(handle, newer))\r\n return handle\r\n }\r\n\r\n HTMLVideoElement.prototype.cancelVideoFrameCallback = function (handle) {\r\n cancelAnimationFrame(this._rvfcpolyfillmap[handle])\r\n delete this._rvfcpolyfillmap[handle]\r\n }\r\n}\r\n","/**\n * Copyright (c) 2025 Microblink Ltd. All rights reserved.\n */\n\n/**\n * Generic keywords for back camera.\n */\nexport const backCameraKeywords = [\n // English\n \"back\",\n \"rear\",\n // German\n \"rück\",\n // French\n \"arrière\",\n // Spanish\n \"trasera\",\n // Portuguese\n \"trás\",\n \"traseira\",\n // Italian\n \"posteriore\",\n // Dutch\n \"achterzijde\",\n // Swedish\n \"baksidan\",\n // Danish\n \"bagside\",\n // Norwegian\n \"bak\",\n // Finnish\n \"takakamera\",\n // Greek\n \"πίσω\",\n // Catalan\n \"darrere\",\n // Russian\n \"задней\",\n // Polish\n \"tylny\",\n // Romanian\n \"spate\",\n // Hungarian\n \"hátsó\",\n // Czech\n \"zadní\",\n // Slovak\n \"zadná\",\n // Ukrainian\n \"задня\",\n // Croatian\n \"stražnja\",\n // Arabic\n \"الخلفية\",\n // Hebrew\n \"אחורית\",\n // Turkish\n \"arka\",\n // Chinese (Simplified)\n \"后面\",\n \"后置\",\n // Chinese (Traditional)\n \"後面\",\n \"後置\",\n \"背面\",\n \"背置\",\n // Korean\n \"후\",\n // Japanese\n \"背面\",\n // Thai\n \"หลัง\",\n // Indonesian\n \"belakang\",\n // Hindi\n \"बैक\",\n // Latin American Spanish\n \"posterior\",\n] as const satisfies string[];\n\n/**\n * Generic keywords for front camera.\n */\nexport const frontCameraKeywords = [\n // English\n \"front\",\n // German\n \"vorder\",\n // French\n \"avant\",\n // Spanish\n \"frontal\",\n // Portuguese\n \"frente\",\n // Italian\n \"frontale\",\n // Dutch\n \"voorzijde\",\n // Swedish\n \"framsidan\",\n // Danish\n \"forside\",\n // Norwegian\n \"front\",\n // Finnish\n \"etukamera\",\n // Greek\n \"μπροστά\",\n // Catalan\n \"davant\",\n // Russian\n \"передняя\",\n // Polish\n \"przedni\",\n // Romanian\n \"față\",\n // Hungarian\n \"elülső\",\n // Czech\n \"přední\",\n // Slovak\n \"predná\",\n // Ukrainian\n \"передня\",\n // Croatian\n \"prednja\",\n // Arabic\n \"الأمامية\",\n // Hebrew\n \"קדמית\",\n // Turkish\n \"ön\",\n // Chinese (Simplified)\n \"前面\",\n \"前置\",\n // Chinese (Traditional)\n \"前面\",\n \"前置\",\n // Korean\n \"전면\",\n // Japanese\n \"前面\",\n // Thai\n \"หน้า\",\n // Indonesian\n \"depan\",\n // Hindi\n \"फ्रंट\",\n // Latin American Spanish\n \"frontal\",\n] as const satisfies string[];\n\n/**\n * Localizations for iOS back camera.\n */\nexport const backCameraLocalizations = [\n \"후면 카메라\",\n \"後置相機\",\n \"Задна камера\",\n \"後置鏡頭\",\n \"Camera mặt sau\",\n \"Hátoldali kamera\",\n \"Cámara trasera\",\n \"Back Camera\",\n \"Kamera på baksidan\",\n \"Πίσω κάμερα\",\n \"Bagsidekamera\",\n \"Zadná kamera\",\n \"Fotocamera (posteriore)\",\n \"Câmara traseira\",\n \"מצלמה אחורית\",\n \"Takakamera\",\n \"Rückkamera\",\n \"Caméra arrière\",\n \"Zadní fotoaparát\",\n \"Артқы камера\",\n \"Tylny aparat\",\n \"बैक कैमरा\",\n \"Hátsó kamera\",\n \"Camera aan achterzijde\",\n \"Kamera Belakang\",\n \"Câmera Traseira\",\n \"Stražnja kamera\",\n \"الكاميرا الخلفية\",\n \"Càmera posterior\",\n \"Fotocamera posteriore\",\n \"Càmera del darrere\",\n \"กล้องด้านหลัง\",\n \"Cameră spate\",\n \"Kamera, bagside\",\n \"背面カメラ\",\n \"Задня камера\",\n \"Arka Kamera\",\n \"后置相机\",\n \"Камера на задней панели\",\n \"后置镜头\",\n \"Kamera bak\",\n \"Задняя камера\",\n \"Aparat tylny\",\n \"Kamera på baksiden\",\n \"Câmera de Trás\",\n] as const satisfies string[];\n\n/**\n * Localizations for iOS back dual wide camera.\n */\nexport const backDualWideCameraLocalizations = [\n \"Cameră dublă cu obiectiv superangular spate\",\n \"מצלמה כפולה רחבה אחורית\",\n \"Артқы қос кең бұрышты камера\",\n \"Câmara grande angular dupla traseira\",\n \"Πίσω διπλή ευρεία κάμερα\",\n \"後置雙廣角鏡頭相機\",\n \"Задна двойна широкоъгълна камера\",\n \"Càmera dual posterior amb gran angular\",\n \"Zadná duálna širokouhlá kamera\",\n \"كاميرا خلفية مزدوجة عريضة\",\n \"Задняя двойная широкоугольная камера\",\n \"Задня здвоєна ширококутна камера\",\n \"Cámara amplia posterior doble\",\n \"Dwikamera Lebar Belakang\",\n \"Tylny dwuobiektywowy aparat szerokokątny\",\n \"Dubbel vidvinkelkamera på baksidan\",\n \"Back Dual Wide Camera\",\n \"Hátsó, kettős, széles látószögű kamera\",\n \"후면 듀얼 와이드 카메라\",\n \"Double caméra grand angle arrière\",\n \"Fotocamera doppia con grandangolo (posteriore)\",\n \"Double appareil photo grand angle arrière\",\n \"Zadní duální širokoúhlý fotoaparát\",\n \"Çift Geniş Kamera Arka Yüzü\",\n \"Laajakulmainen kaksoistakakamera\",\n \"Rückseitige Dual-Weitwinkelkamera\",\n \"बैक ड्युअल वाइड कैमरा\",\n \"后置双广角镜头\",\n \"Câmera Dupla Grande-Angular Traseira\",\n \"後置雙廣角相機\",\n \"กล้องคู่ด้านหลังมุมกว้าง\",\n \"Kamera Lebar Belakang Ganda\",\n \"Dobbelt vidvinkelkamera bak\",\n \"Camera kép rộng mặt sau\",\n \"Cámara trasera dual con gran angular\",\n \"背面デュアル広角カメラ\",\n \"Stražnja dvostruka široka kamera\",\n] as const satisfies string[];\n\n/**\n * Check if a string contains any of the keywords.\n *\n * @param string - The string to check.\n * @param keywords - The keywords to check.\n * @returns true if the string contains any of the keywords.\n */\nexport const containsKeyword = (string: string, keywords: string[]) => {\n return keywords.some((keyword) => string.toLowerCase().includes(keyword));\n};\n\n/**\n * Checks if a string is a back camera name.\n *\n * @param string - The string to check.\n * @returns true if the string is a back camera name.\n */\nexport const isBackCameraName = (string: string) =>\n containsKeyword(string, backCameraKeywords);\n\n/**\n * Checks if a string is a front camera name.\n *\n * @param string - The string to check.\n * @returns true if the string is a front camera name.\n */\nexport const isFrontCameraName = (string: string) =>\n containsKeyword(string, frontCameraKeywords);\n","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _templateObject = _taggedTemplateLiteral(['', ''], ['', '']);\n\nfunction _taggedTemplateLiteral(strings, raw) { return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @class TemplateTag\n * @classdesc Consumes a pipeline of composable transformer plugins and produces a template tag.\n */\nvar TemplateTag = function () {\n /**\n * constructs a template tag\n * @constructs TemplateTag\n * @param {...Object} [...transformers] - an array or arguments list of transformers\n * @return {Function} - a template tag\n */\n function TemplateTag() {\n var _this = this;\n\n for (var _len = arguments.length, transformers = Array(_len), _key = 0; _key < _len; _key++) {\n transformers[_key] = arguments[_key];\n }\n\n _classCallCheck(this, TemplateTag);\n\n this.tag = function (strings) {\n for (var _len2 = arguments.length, expressions = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n expressions[_key2 - 1] = arguments[_key2];\n }\n\n if (typeof strings === 'function') {\n // if the first argument passed is a function, assume it is a template tag and return\n // an intermediary tag that processes the template using the aforementioned tag, passing the\n // result to our tag\n return _this.interimTag.bind(_this, strings);\n }\n\n if (typeof strings === 'string') {\n // if the first argument passed is a string, just transform it\n return _this.transformEndResult(strings);\n }\n\n // else, return a transformed end result of processing the template with our tag\n strings = strings.map(_this.transformString.bind(_this));\n return _this.transformEndResult(strings.reduce(_this.processSubstitutions.bind(_this, expressions)));\n };\n\n // if first argument is an array, extrude it as a list of transformers\n if (transformers.length > 0 && Array.isArray(transformers[0])) {\n transformers = transformers[0];\n }\n\n // if any transformers are functions, this means they are not initiated - automatically initiate them\n this.transformers = transformers.map(function (transformer) {\n return typeof transformer === 'function' ? transformer() : transformer;\n });\n\n // return an ES2015 template tag\n return this.tag;\n }\n\n /**\n * Applies all transformers to a template literal tagged with this method.\n * If a function is passed as the first argument, assumes the function is a template tag\n * and applies it to the template, returning a template tag.\n * @param {(Function|String|Array<String>)} strings - Either a template tag or an array containing template strings separated by identifier\n * @param {...*} ...expressions - Optional list of substitution values.\n * @return {(String|Function)} - Either an intermediary tag function or the results of processing the template.\n */\n\n\n _createClass(TemplateTag, [{\n key: 'interimTag',\n\n\n /**\n * An intermediary template tag that receives a template tag and passes the result of calling the template with the received\n * template tag to our own template tag.\n * @param {Function} nextTag - the received template tag\n * @param {Array<String>} template - the template to process\n * @param {...*} ...substitutions - `substitutions` is an array of all substitutions in the template\n * @return {*} - the final processed value\n */\n value: function interimTag(previousTag, template) {\n for (var _len3 = arguments.length, substitutions = Array(_len3 > 2 ? _len3 - 2 : 0), _key3 = 2; _key3 < _len3; _key3++) {\n substitutions[_key3 - 2] = arguments[_key3];\n }\n\n return this.tag(_templateObject, previousTag.apply(undefined, [template].concat(substitutions)));\n }\n\n /**\n * Performs bulk processing on the tagged template, transforming each substitution and then\n * concatenating the resulting values into a string.\n * @param {Array<*>} substitutions - an array of all remaining substitutions present in this template\n * @param {String} resultSoFar - this iteration's result string so far\n * @param {String} remainingPart - the template chunk after the current substitution\n * @return {String} - the result of joining this iteration's processed substitution with the result\n */\n\n }, {\n key: 'processSubstitutions',\n value: function processSubstitutions(substitutions, resultSoFar, remainingPart) {\n var substitution = this.transformSubstitution(substitutions.shift(), resultSoFar);\n return ''.concat(resultSoFar, substitution, remainingPart);\n }\n\n /**\n * Iterate through each transformer, applying the transformer's `onString` method to the template\n * strings before all substitutions are processed.\n * @param {String} str - The input string\n * @return {String} - The final results of processing each transformer\n */\n\n }, {\n key: 'transformString',\n value: function transformString(str) {\n var cb = function cb(res, transform) {\n return transform.onString ? transform.onString(res) : res;\n };\n return this.transformers.reduce(cb, str);\n }\n\n /**\n * When a substitution is encountered, iterates through each transformer and applies the transformer's\n * `onSubstitution` method to the substitution.\n * @param {*} substitution - The current substitution\n * @param {String} resultSoFar - The result up to and excluding this substitution.\n * @return {*} - The final result of applying all substitution transformations.\n */\n\n }, {\n key: 'transformSubstitution',\n value: function transformSubstitution(substitution, resultSoFar) {\n var cb = function cb(res, transform) {\n return transform.onSubstitution ? transform.onSubstitution(res, resultSoFar) : res;\n };\n return this.transformers.reduce(cb, substitution);\n }\n\n /**\n * Iterates through each transformer, applying the transformer's `onEndResult` method to the\n * template literal after all substitutions have finished processing.\n * @param {String} endResult - The processed template, just before it is returned from the tag\n * @return {String} - The final results of processing each transformer\n */\n\n }, {\n key: 'transformEndResult',\n value: function transformEndResult(endResult) {\n var cb = function cb(res, transform) {\n return transform.onEndResult ? transform.onEndResult(res) : res;\n };\n return this.transformers.reduce(cb, endResult);\n }\n }]);\n\n return TemplateTag;\n}();\n\nexport default TemplateTag;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9UZW1wbGF0ZVRhZy9UZW1wbGF0ZVRhZy5qcyJdLCJuYW1lcyI6WyJUZW1wbGF0ZVRhZyIsInRyYW5zZm9ybWVycyIsInRhZyIsInN0cmluZ3MiLCJleHByZXNzaW9ucyIsImludGVyaW1UYWciLCJiaW5kIiwidHJhbnNmb3JtRW5kUmVzdWx0IiwibWFwIiwidHJhbnNmb3JtU3RyaW5nIiwicmVkdWNlIiwicHJvY2Vzc1N1YnN0aXR1dGlvbnMiLCJsZW5ndGgiLCJBcnJheSIsImlzQXJyYXkiLCJ0cmFuc2Zvcm1lciIsInByZXZpb3VzVGFnIiwidGVtcGxhdGUiLCJzdWJzdGl0dXRpb25zIiwicmVzdWx0U29GYXIiLCJyZW1haW5pbmdQYXJ0Iiwic3Vic3RpdHV0aW9uIiwidHJhbnNmb3JtU3Vic3RpdHV0aW9uIiwic2hpZnQiLCJjb25jYXQiLCJzdHIiLCJjYiIsInJlcyIsInRyYW5zZm9ybSIsIm9uU3RyaW5nIiwib25TdWJzdGl0dXRpb24iLCJlbmRSZXN1bHQiLCJvbkVuZFJlc3VsdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTs7OztJQUlxQkEsVztBQUNuQjs7Ozs7O0FBTUEseUJBQTZCO0FBQUE7O0FBQUEsc0NBQWRDLFlBQWM7QUFBZEEsa0JBQWM7QUFBQTs7QUFBQTs7QUFBQSxTQXVCN0JDLEdBdkI2QixHQXVCdkIsVUFBQ0MsT0FBRCxFQUE2QjtBQUFBLHlDQUFoQkMsV0FBZ0I7QUFBaEJBLG1CQUFnQjtBQUFBOztBQUNqQyxVQUFJLE9BQU9ELE9BQVAsS0FBbUIsVUFBdkIsRUFBbUM7QUFDakM7QUFDQTtBQUNBO0FBQ0EsZUFBTyxNQUFLRSxVQUFMLENBQWdCQyxJQUFoQixDQUFxQixLQUFyQixFQUEyQkgsT0FBM0IsQ0FBUDtBQUNEOztBQUVELFVBQUksT0FBT0EsT0FBUCxLQUFtQixRQUF2QixFQUFpQztBQUMvQjtBQUNBLGVBQU8sTUFBS0ksa0JBQUwsQ0FBd0JKLE9BQXhCLENBQVA7QUFDRDs7QUFFRDtBQUNBQSxnQkFBVUEsUUFBUUssR0FBUixDQUFZLE1BQUtDLGVBQUwsQ0FBcUJILElBQXJCLENBQTBCLEtBQTFCLENBQVosQ0FBVjtBQUNBLGFBQU8sTUFBS0Msa0JBQUwsQ0FDTEosUUFBUU8sTUFBUixDQUFlLE1BQUtDLG9CQUFMLENBQTBCTCxJQUExQixDQUErQixLQUEvQixFQUFxQ0YsV0FBckMsQ0FBZixDQURLLENBQVA7QUFHRCxLQXpDNEI7O0FBQzNCO0FBQ0EsUUFBSUgsYUFBYVcsTUFBYixHQUFzQixDQUF0QixJQUEyQkMsTUFBTUMsT0FBTixDQUFjYixhQUFhLENBQWIsQ0FBZCxDQUEvQixFQUErRDtBQUM3REEscUJBQWVBLGFBQWEsQ0FBYixDQUFmO0FBQ0Q7O0FBRUQ7QUFDQSxTQUFLQSxZQUFMLEdBQW9CQSxhQUFhTyxHQUFiLENBQWlCLHVCQUFlO0FBQ2xELGFBQU8sT0FBT08sV0FBUCxLQUF1QixVQUF2QixHQUFvQ0EsYUFBcEMsR0FBb0RBLFdBQTNEO0FBQ0QsS0FGbUIsQ0FBcEI7O0FBSUE7QUFDQSxXQUFPLEtBQUtiLEdBQVo7QUFDRDs7QUFFRDs7Ozs7Ozs7Ozs7Ozs7QUE0QkE7Ozs7Ozs7OytCQVFXYyxXLEVBQWFDLFEsRUFBNEI7QUFBQSx5Q0FBZkMsYUFBZTtBQUFmQSxxQkFBZTtBQUFBOztBQUNsRCxhQUFPLEtBQUtoQixHQUFaLGtCQUFrQmMsOEJBQVlDLFFBQVosU0FBeUJDLGFBQXpCLEVBQWxCO0FBQ0Q7O0FBRUQ7Ozs7Ozs7Ozs7O3lDQVFxQkEsYSxFQUFlQyxXLEVBQWFDLGEsRUFBZTtBQUM5RCxVQUFNQyxlQUFlLEtBQUtDLHFCQUFMLENBQ25CSixjQUFjSyxLQUFkLEVBRG1CLEVBRW5CSixXQUZtQixDQUFyQjtBQUlBLGFBQU8sR0FBR0ssTUFBSCxDQUFVTCxXQUFWLEVBQXVCRSxZQUF2QixFQUFxQ0QsYUFBckMsQ0FBUDtBQUNEOztBQUVEOzs7Ozs7Ozs7b0NBTWdCSyxHLEVBQUs7QUFDbkIsVUFBTUMsS0FBSyxTQUFMQSxFQUFLLENBQUNDLEdBQUQsRUFBTUMsU0FBTjtBQUFBLGVBQ1RBLFVBQVVDLFFBQVYsR0FBcUJELFVBQVVDLFFBQVYsQ0FBbUJGLEdBQW5CLENBQXJCLEdBQStDQSxHQUR0QztBQUFBLE9BQVg7QUFFQSxhQUFPLEtBQUsxQixZQUFMLENBQWtCUyxNQUFsQixDQUF5QmdCLEVBQXpCLEVBQTZCRCxHQUE3QixDQUFQO0FBQ0Q7O0FBRUQ7Ozs7Ozs7Ozs7MENBT3NCSixZLEVBQWNGLFcsRUFBYTtBQUMvQyxVQUFNTyxLQUFLLFNBQUxBLEVBQUssQ0FBQ0MsR0FBRCxFQUFNQyxTQUFOO0FBQUEsZUFDVEEsVUFBVUUsY0FBVixHQUNJRixVQUFVRSxjQUFWLENBQXlCSCxHQUF6QixFQUE4QlIsV0FBOUIsQ0FESixHQUVJUSxHQUhLO0FBQUEsT0FBWDtBQUlBLGFBQU8sS0FBSzFCLFlBQUwsQ0FBa0JTLE1BQWxCLENBQXlCZ0IsRUFBekIsRUFBNkJMLFlBQTdCLENBQVA7QUFDRDs7QUFFRDs7Ozs7Ozs7O3VDQU1tQlUsUyxFQUFXO0FBQzVCLFVBQU1MLEtBQUssU0FBTEEsRUFBSyxDQUFDQyxHQUFELEVBQU1DLFNBQU47QUFBQSxlQUNUQSxVQUFVSSxXQUFWLEdBQXdCSixVQUFVSSxXQUFWLENBQXNCTCxHQUF0QixDQUF4QixHQUFxREEsR0FENUM7QUFBQSxPQUFYO0FBRUEsYUFBTyxLQUFLMUIsWUFBTCxDQUFrQlMsTUFBbEIsQ0FBeUJnQixFQUF6QixFQUE2QkssU0FBN0IsQ0FBUDtBQUNEOzs7Ozs7ZUFuSGtCL0IsVyIsImZpbGUiOiJUZW1wbGF0ZVRhZy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGNsYXNzIFRlbXBsYXRlVGFnXG4gKiBAY2xhc3NkZXNjIENvbnN1bWVzIGEgcGlwZWxpbmUgb2YgY29tcG9zYWJsZSB0cmFuc2Zvcm1lciBwbHVnaW5zIGFuZCBwcm9kdWNlcyBhIHRlbXBsYXRlIHRhZy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGVtcGxhdGVUYWcge1xuICAvKipcbiAgICogY29uc3RydWN0cyBhIHRlbXBsYXRlIHRhZ1xuICAgKiBAY29uc3RydWN0cyBUZW1wbGF0ZVRhZ1xuICAgKiBAcGFyYW0gIHsuLi5PYmplY3R9IFsuLi50cmFuc2Zvcm1lcnNdIC0gYW4gYXJyYXkgb3IgYXJndW1lbnRzIGxpc3Qgb2YgdHJhbnNmb3JtZXJzXG4gICAqIEByZXR1cm4ge0Z1bmN0aW9ufSAgICAgICAgICAgICAgICAgICAgLSBhIHRlbXBsYXRlIHRhZ1xuICAgKi9cbiAgY29uc3RydWN0b3IoLi4udHJhbnNmb3JtZXJzKSB7XG4gICAgLy8gaWYgZmlyc3QgYXJndW1lbnQgaXMgYW4gYXJyYXksIGV4dHJ1ZGUgaXQgYXMgYSBsaXN0IG9mIHRyYW5zZm9ybWVyc1xuICAgIGlmICh0cmFuc2Zvcm1lcnMubGVuZ3RoID4gMCAmJiBBcnJheS5pc0FycmF5KHRyYW5zZm9ybWVyc1swXSkpIHtcbiAgICAgIHRyYW5zZm9ybWVycyA9IHRyYW5zZm9ybWVyc1swXTtcbiAgICB9XG5cbiAgICAvLyBpZiBhbnkgdHJhbnNmb3JtZXJzIGFyZSBmdW5jdGlvbnMsIHRoaXMgbWVhbnMgdGhleSBhcmUgbm90IGluaXRpYXRlZCAtIGF1dG9tYXRpY2FsbHkgaW5pdGlhdGUgdGhlbVxuICAgIHRoaXMudHJhbnNmb3JtZXJzID0gdHJhbnNmb3JtZXJzLm1hcCh0cmFuc2Zvcm1lciA9PiB7XG4gICAgICByZXR1cm4gdHlwZW9mIHRyYW5zZm9ybWVyID09PSAnZnVuY3Rpb24nID8gdHJhbnNmb3JtZXIoKSA6IHRyYW5zZm9ybWVyO1xuICAgIH0pO1xuXG4gICAgLy8gcmV0dXJuIGFuIEVTMjAxNSB0ZW1wbGF0ZSB0YWdcbiAgICByZXR1cm4gdGhpcy50YWc7XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBhbGwgdHJhbnNmb3JtZXJzIHRvIGEgdGVtcGxhdGUgbGl0ZXJhbCB0YWdnZWQgd2l0aCB0aGlzIG1ldGhvZC5cbiAgICogSWYgYSBmdW5jdGlvbiBpcyBwYXNzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LCBhc3N1bWVzIHRoZSBmdW5jdGlvbiBpcyBhIHRlbXBsYXRlIHRhZ1xuICAgKiBhbmQgYXBwbGllcyBpdCB0byB0aGUgdGVtcGxhdGUsIHJldHVybmluZyBhIHRlbXBsYXRlIHRhZy5cbiAgICogQHBhcmFtICB7KEZ1bmN0aW9ufFN0cmluZ3xBcnJheTxTdHJpbmc+KX0gc3RyaW5ncyAgICAgICAgLSBFaXRoZXIgYSB0ZW1wbGF0ZSB0YWcgb3IgYW4gYXJyYXkgY29udGFpbmluZyB0ZW1wbGF0ZSBzdHJpbmdzIHNlcGFyYXRlZCBieSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSAgey4uLip9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmV4cHJlc3Npb25zIC0gT3B0aW9uYWwgbGlzdCBvZiBzdWJzdGl0dXRpb24gdmFsdWVzLlxuICAgKiBAcmV0dXJuIHsoU3RyaW5nfEZ1bmN0aW9uKX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIEVpdGhlciBhbiBpbnRlcm1lZGlhcnkgdGFnIGZ1bmN0aW9uIG9yIHRoZSByZXN1bHRzIG9mIHByb2Nlc3NpbmcgdGhlIHRlbXBsYXRlLlxuICAgKi9cbiAgdGFnID0gKHN0cmluZ3MsIC4uLmV4cHJlc3Npb25zKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBzdHJpbmdzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBpZiB0aGUgZmlyc3QgYXJndW1lbnQgcGFzc2VkIGlzIGEgZnVuY3Rpb24sIGFzc3VtZSBpdCBpcyBhIHRlbXBsYXRlIHRhZyBhbmQgcmV0dXJuXG4gICAgICAvLyBhbiBpbnRlcm1lZGlhcnkgdGFnIHRoYXQgcHJvY2Vzc2VzIHRoZSB0ZW1wbGF0ZSB1c2luZyB0aGUgYWZvcmVtZW50aW9uZWQgdGFnLCBwYXNzaW5nIHRoZVxuICAgICAgLy8gcmVzdWx0IHRvIG91ciB0YWdcbiAgICAgIHJldHVybiB0aGlzLmludGVyaW1UYWcuYmluZCh0aGlzLCBzdHJpbmdzKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHN0cmluZ3MgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBpZiB0aGUgZmlyc3QgYXJndW1lbnQgcGFzc2VkIGlzIGEgc3RyaW5nLCBqdXN0IHRyYW5zZm9ybSBpdFxuICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtRW5kUmVzdWx0KHN0cmluZ3MpO1xuICAgIH1cblxuICAgIC8vIGVsc2UsIHJldHVybiBhIHRyYW5zZm9ybWVkIGVuZCByZXN1bHQgb2YgcHJvY2Vzc2luZyB0aGUgdGVtcGxhdGUgd2l0aCBvdXIgdGFnXG4gICAgc3RyaW5ncyA9IHN0cmluZ3MubWFwKHRoaXMudHJhbnNmb3JtU3RyaW5nLmJpbmQodGhpcykpO1xuICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybUVuZFJlc3VsdChcbiAgICAgIHN0cmluZ3MucmVkdWNlKHRoaXMucHJvY2Vzc1N1YnN0aXR1dGlvbnMuYmluZCh0aGlzLCBleHByZXNzaW9ucykpLFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEFuIGludGVybWVkaWFyeSB0ZW1wbGF0ZSB0YWcgdGhhdCByZWNlaXZlcyBhIHRlbXBsYXRlIHRhZyBhbmQgcGFzc2VzIHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGUgdGVtcGxhdGUgd2l0aCB0aGUgcmVjZWl2ZWRcbiAgICogdGVtcGxhdGUgdGFnIHRvIG91ciBvd24gdGVtcGxhdGUgdGFnLlxuICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gICAgICAgIG5leHRUYWcgICAgICAgICAgLSB0aGUgcmVjZWl2ZWQgdGVtcGxhdGUgdGFnXG4gICAqIEBwYXJhbSAge0FycmF5PFN0cmluZz59ICAgdGVtcGxhdGUgICAgICAgICAtIHRoZSB0ZW1wbGF0ZSB0byBwcm9jZXNzXG4gICAqIEBwYXJhbSAgey4uLip9ICAgICAgICAgICAgLi4uc3Vic3RpdHV0aW9ucyAtIGBzdWJzdGl0dXRpb25zYCBpcyBhbiBhcnJheSBvZiBhbGwgc3Vic3RpdHV0aW9ucyBpbiB0aGUgdGVtcGxhdGVcbiAgICogQHJldHVybiB7Kn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gdGhlIGZpbmFsIHByb2Nlc3NlZCB2YWx1ZVxuICAgKi9cbiAgaW50ZXJpbVRhZyhwcmV2aW91c1RhZywgdGVtcGxhdGUsIC4uLnN1YnN0aXR1dGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy50YWdgJHtwcmV2aW91c1RhZyh0ZW1wbGF0ZSwgLi4uc3Vic3RpdHV0aW9ucyl9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBidWxrIHByb2Nlc3Npbmcgb24gdGhlIHRhZ2dlZCB0ZW1wbGF0ZSwgdHJhbnNmb3JtaW5nIGVhY2ggc3Vic3RpdHV0aW9uIGFuZCB0aGVuXG4gICAqIGNvbmNhdGVuYXRpbmcgdGhlIHJlc3VsdGluZyB2YWx1ZXMgaW50byBhIHN0cmluZy5cbiAgICogQHBhcmFtICB7QXJyYXk8Kj59IHN1YnN0aXR1dGlvbnMgLSBhbiBhcnJheSBvZiBhbGwgcmVtYWluaW5nIHN1YnN0aXR1dGlvbnMgcHJlc2VudCBpbiB0aGlzIHRlbXBsYXRlXG4gICAqIEBwYXJhbSAge1N0cmluZ30gICByZXN1bHRTb0ZhciAgIC0gdGhpcyBpdGVyYXRpb24ncyByZXN1bHQgc3RyaW5nIHNvIGZhclxuICAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgcmVtYWluaW5nUGFydCAtIHRoZSB0ZW1wbGF0ZSBjaHVuayBhZnRlciB0aGUgY3VycmVudCBzdWJzdGl0dXRpb25cbiAgICogQHJldHVybiB7U3RyaW5nfSAgICAgICAgICAgICAgICAgLSB0aGUgcmVzdWx0IG9mIGpvaW5pbmcgdGhpcyBpdGVyYXRpb24ncyBwcm9jZXNzZWQgc3Vic3RpdHV0aW9uIHdpdGggdGhlIHJlc3VsdFxuICAgKi9cbiAgcHJvY2Vzc1N1YnN0aXR1dGlvbnMoc3Vic3RpdHV0aW9ucywgcmVzdWx0U29GYXIsIHJlbWFpbmluZ1BhcnQpIHtcbiAgICBjb25zdCBzdWJzdGl0dXRpb24gPSB0aGlzLnRyYW5zZm9ybVN1YnN0aXR1dGlvbihcbiAgICAgIHN1YnN0aXR1dGlvbnMuc2hpZnQoKSxcbiAgICAgIHJlc3VsdFNvRmFyLFxuICAgICk7XG4gICAgcmV0dXJuICcnLmNvbmNhdChyZXN1bHRTb0Zhciwgc3Vic3RpdHV0aW9uLCByZW1haW5pbmdQYXJ0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRlIHRocm91Z2ggZWFjaCB0cmFuc2Zvcm1lciwgYXBwbHlpbmcgdGhlIHRyYW5zZm9ybWVyJ3MgYG9uU3RyaW5nYCBtZXRob2QgdG8gdGhlIHRlbXBsYXRlXG4gICAqIHN0cmluZ3MgYmVmb3JlIGFsbCBzdWJzdGl0dXRpb25zIGFyZSBwcm9jZXNzZWQuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSAgc3RyIC0gVGhlIGlucHV0IHN0cmluZ1xuICAgKiBAcmV0dXJuIHtTdHJpbmd9ICAgICAtIFRoZSBmaW5hbCByZXN1bHRzIG9mIHByb2Nlc3NpbmcgZWFjaCB0cmFuc2Zvcm1lclxuICAgKi9cbiAgdHJhbnNmb3JtU3RyaW5nKHN0cikge1xuICAgIGNvbnN0IGNiID0gKHJlcywgdHJhbnNmb3JtKSA9PlxuICAgICAgdHJhbnNmb3JtLm9uU3RyaW5nID8gdHJhbnNmb3JtLm9uU3RyaW5nKHJlcykgOiByZXM7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtZXJzLnJlZHVjZShjYiwgc3RyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIGEgc3Vic3RpdHV0aW9uIGlzIGVuY291bnRlcmVkLCBpdGVyYXRlcyB0aHJvdWdoIGVhY2ggdHJhbnNmb3JtZXIgYW5kIGFwcGxpZXMgdGhlIHRyYW5zZm9ybWVyJ3NcbiAgICogYG9uU3Vic3RpdHV0aW9uYCBtZXRob2QgdG8gdGhlIHN1YnN0aXR1dGlvbi5cbiAgICogQHBhcmFtICB7Kn0gICAgICBzdWJzdGl0dXRpb24gLSBUaGUgY3VycmVudCBzdWJzdGl0dXRpb25cbiAgICogQHBhcmFtICB7U3RyaW5nfSByZXN1bHRTb0ZhciAgLSBUaGUgcmVzdWx0IHVwIHRvIGFuZCBleGNsdWRpbmcgdGhpcyBzdWJzdGl0dXRpb24uXG4gICAqIEByZXR1cm4geyp9ICAgICAgICAgICAgICAgICAgIC0gVGhlIGZpbmFsIHJlc3VsdCBvZiBhcHBseWluZyBhbGwgc3Vic3RpdHV0aW9uIHRyYW5zZm9ybWF0aW9ucy5cbiAgICovXG4gIHRyYW5zZm9ybVN1YnN0aXR1dGlvbihzdWJzdGl0dXRpb24sIHJlc3VsdFNvRmFyKSB7XG4gICAgY29uc3QgY2IgPSAocmVzLCB0cmFuc2Zvcm0pID0+XG4gICAgICB0cmFuc2Zvcm0ub25TdWJzdGl0dXRpb25cbiAgICAgICAgPyB0cmFuc2Zvcm0ub25TdWJzdGl0dXRpb24ocmVzLCByZXN1bHRTb0ZhcilcbiAgICAgICAgOiByZXM7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtZXJzLnJlZHVjZShjYiwgc3Vic3RpdHV0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRlcyB0aHJvdWdoIGVhY2ggdHJhbnNmb3JtZXIsIGFwcGx5aW5nIHRoZSB0cmFuc2Zvcm1lcidzIGBvbkVuZFJlc3VsdGAgbWV0aG9kIHRvIHRoZVxuICAgKiB0ZW1wbGF0ZSBsaXRlcmFsIGFmdGVyIGFsbCBzdWJzdGl0dXRpb25zIGhhdmUgZmluaXNoZWQgcHJvY2Vzc2luZy5cbiAgICogQHBhcmFtICB7U3RyaW5nfSBlbmRSZXN1bHQgLSBUaGUgcHJvY2Vzc2VkIHRlbXBsYXRlLCBqdXN0IGJlZm9yZSBpdCBpcyByZXR1cm5lZCBmcm9tIHRoZSB0YWdcbiAgICogQHJldHVybiB7U3RyaW5nfSAgICAgICAgICAgLSBUaGUgZmluYWwgcmVzdWx0cyBvZiBwcm9jZXNzaW5nIGVhY2ggdHJhbnNmb3JtZXJcbiAgICovXG4gIHRyYW5zZm9ybUVuZFJlc3VsdChlbmRSZXN1bHQpIHtcbiAgICBjb25zdCBjYiA9IChyZXMsIHRyYW5zZm9ybSkgPT5cbiAgICAgIHRyYW5zZm9ybS5vbkVuZFJlc3VsdCA/IHRyYW5zZm9ybS5vbkVuZFJlc3VsdChyZXMpIDogcmVzO1xuICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybWVycy5yZWR1Y2UoY2IsIGVuZFJlc3VsdCk7XG4gIH1cbn1cbiJdfQ==","/**\n * TemplateTag transformer that trims whitespace on the end result of a tagged template\n * @param {String} side = '' - The side of the string to trim. Can be 'start' or 'end' (alternatively 'left' or 'right')\n * @return {Object} - a TemplateTag transformer\n */\nvar trimResultTransformer = function trimResultTransformer() {\n var side = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n return {\n onEndResult: function onEndResult(endResult) {\n if (side === '') {\n return endResult.trim();\n }\n\n side = side.toLowerCase();\n\n if (side === 'start' || side === 'left') {\n return endResult.replace(/^\\s*/, '');\n }\n\n if (side === 'end' || side === 'right') {\n return endResult.replace(/\\s*$/, '');\n }\n\n throw new Error('Side not supported: ' + side);\n }\n };\n};\n\nexport default trimResultTransformer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90cmltUmVzdWx0VHJhbnNmb3JtZXIvdHJpbVJlc3VsdFRyYW5zZm9ybWVyLmpzIl0sIm5hbWVzIjpbInRyaW1SZXN1bHRUcmFuc2Zvcm1lciIsInNpZGUiLCJvbkVuZFJlc3VsdCIsImVuZFJlc3VsdCIsInRyaW0iLCJ0b0xvd2VyQ2FzZSIsInJlcGxhY2UiLCJFcnJvciJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0FBS0EsSUFBTUEsd0JBQXdCLFNBQXhCQSxxQkFBd0I7QUFBQSxNQUFDQyxJQUFELHVFQUFRLEVBQVI7QUFBQSxTQUFnQjtBQUM1Q0MsZUFENEMsdUJBQ2hDQyxTQURnQyxFQUNyQjtBQUNyQixVQUFJRixTQUFTLEVBQWIsRUFBaUI7QUFDZixlQUFPRSxVQUFVQyxJQUFWLEVBQVA7QUFDRDs7QUFFREgsYUFBT0EsS0FBS0ksV0FBTCxFQUFQOztBQUVBLFVBQUlKLFNBQVMsT0FBVCxJQUFvQkEsU0FBUyxNQUFqQyxFQUF5QztBQUN2QyxlQUFPRSxVQUFVRyxPQUFWLENBQWtCLE1BQWxCLEVBQTBCLEVBQTFCLENBQVA7QUFDRDs7QUFFRCxVQUFJTCxTQUFTLEtBQVQsSUFBa0JBLFNBQVMsT0FBL0IsRUFBd0M7QUFDdEMsZUFBT0UsVUFBVUcsT0FBVixDQUFrQixNQUFsQixFQUEwQixFQUExQixDQUFQO0FBQ0Q7O0FBRUQsWUFBTSxJQUFJQyxLQUFKLDBCQUFpQ04sSUFBakMsQ0FBTjtBQUNEO0FBakIyQyxHQUFoQjtBQUFBLENBQTlCOztBQW9CQSxlQUFlRCxxQkFBZiIsImZpbGUiOiJ0cmltUmVzdWx0VHJhbnNmb3JtZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRlbXBsYXRlVGFnIHRyYW5zZm9ybWVyIHRoYXQgdHJpbXMgd2hpdGVzcGFjZSBvbiB0aGUgZW5kIHJlc3VsdCBvZiBhIHRhZ2dlZCB0ZW1wbGF0ZVxuICogQHBhcmFtICB7U3RyaW5nfSBzaWRlID0gJycgLSBUaGUgc2lkZSBvZiB0aGUgc3RyaW5nIHRvIHRyaW0uIENhbiBiZSAnc3RhcnQnIG9yICdlbmQnIChhbHRlcm5hdGl2ZWx5ICdsZWZ0JyBvciAncmlnaHQnKVxuICogQHJldHVybiB7T2JqZWN0fSAgICAgICAgICAgLSBhIFRlbXBsYXRlVGFnIHRyYW5zZm9ybWVyXG4gKi9cbmNvbnN0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciA9IChzaWRlID0gJycpID0+ICh7XG4gIG9uRW5kUmVzdWx0KGVuZFJlc3VsdCkge1xuICAgIGlmIChzaWRlID09PSAnJykge1xuICAgICAgcmV0dXJuIGVuZFJlc3VsdC50cmltKCk7XG4gICAgfVxuXG4gICAgc2lkZSA9IHNpZGUudG9Mb3dlckNhc2UoKTtcblxuICAgIGlmIChzaWRlID09PSAnc3RhcnQnIHx8IHNpZGUgPT09ICdsZWZ0Jykge1xuICAgICAgcmV0dXJuIGVuZFJlc3VsdC5yZXBsYWNlKC9eXFxzKi8sICcnKTtcbiAgICB9XG5cbiAgICBpZiAoc2lkZSA9PT0gJ2VuZCcgfHwgc2lkZSA9PT0gJ3JpZ2h0Jykge1xuICAgICAgcmV0dXJuIGVuZFJlc3VsdC5yZXBsYWNlKC9cXHMqJC8sICcnKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNpZGUgbm90IHN1cHBvcnRlZDogJHtzaWRlfWApO1xuICB9LFxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lcjtcbiJdfQ==","function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n/**\n * strips indentation from a template literal\n * @param {String} type = 'initial' - whether to remove all indentation or just leading indentation. can be 'all' or 'initial'\n * @return {Object} - a TemplateTag transformer\n */\nvar stripIndentTransformer = function stripIndentTransformer() {\n var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'initial';\n return {\n onEndResult: function onEndResult(endResult) {\n if (type === 'initial') {\n // remove the shortest leading indentation from each line\n var match = endResult.match(/^[^\\S\\n]*(?=\\S)/gm);\n var indent = match && Math.min.apply(Math, _toConsumableArray(match.map(function (el) {\n return el.length;\n })));\n if (indent) {\n var regexp = new RegExp('^.{' + indent + '}', 'gm');\n return endResult.replace(regexp, '');\n }\n return endResult;\n }\n if (type === 'all') {\n // remove all indentation from each line\n return endResult.replace(/^[^\\S\\n]+/gm, '');\n }\n throw new Error('Unknown type: ' + type);\n }\n };\n};\n\nexport default stripIndentTransformer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdHJpcEluZGVudFRyYW5zZm9ybWVyL3N0cmlwSW5kZW50VHJhbnNmb3JtZXIuanMiXSwibmFtZXMiOlsic3RyaXBJbmRlbnRUcmFuc2Zvcm1lciIsInR5cGUiLCJvbkVuZFJlc3VsdCIsImVuZFJlc3VsdCIsIm1hdGNoIiwiaW5kZW50IiwiTWF0aCIsIm1pbiIsIm1hcCIsImVsIiwibGVuZ3RoIiwicmVnZXhwIiwiUmVnRXhwIiwicmVwbGFjZSIsIkVycm9yIl0sIm1hcHBpbmdzIjoiOztBQUFBOzs7OztBQUtBLElBQU1BLHlCQUF5QixTQUF6QkEsc0JBQXlCO0FBQUEsTUFBQ0MsSUFBRCx1RUFBUSxTQUFSO0FBQUEsU0FBdUI7QUFDcERDLGVBRG9ELHVCQUN4Q0MsU0FEd0MsRUFDN0I7QUFDckIsVUFBSUYsU0FBUyxTQUFiLEVBQXdCO0FBQ3RCO0FBQ0EsWUFBTUcsUUFBUUQsVUFBVUMsS0FBVixDQUFnQixtQkFBaEIsQ0FBZDtBQUNBLFlBQU1DLFNBQVNELFNBQVNFLEtBQUtDLEdBQUwsZ0NBQVlILE1BQU1JLEdBQU4sQ0FBVTtBQUFBLGlCQUFNQyxHQUFHQyxNQUFUO0FBQUEsU0FBVixDQUFaLEVBQXhCO0FBQ0EsWUFBSUwsTUFBSixFQUFZO0FBQ1YsY0FBTU0sU0FBUyxJQUFJQyxNQUFKLFNBQWlCUCxNQUFqQixRQUE0QixJQUE1QixDQUFmO0FBQ0EsaUJBQU9GLFVBQVVVLE9BQVYsQ0FBa0JGLE1BQWxCLEVBQTBCLEVBQTFCLENBQVA7QUFDRDtBQUNELGVBQU9SLFNBQVA7QUFDRDtBQUNELFVBQUlGLFNBQVMsS0FBYixFQUFvQjtBQUNsQjtBQUNBLGVBQU9FLFVBQVVVLE9BQVYsQ0FBa0IsYUFBbEIsRUFBaUMsRUFBakMsQ0FBUDtBQUNEO0FBQ0QsWUFBTSxJQUFJQyxLQUFKLG9CQUEyQmIsSUFBM0IsQ0FBTjtBQUNEO0FBakJtRCxHQUF2QjtBQUFBLENBQS9COztBQW9CQSxlQUFlRCxzQkFBZiIsImZpbGUiOiJzdHJpcEluZGVudFRyYW5zZm9ybWVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBzdHJpcHMgaW5kZW50YXRpb24gZnJvbSBhIHRlbXBsYXRlIGxpdGVyYWxcbiAqIEBwYXJhbSAge1N0cmluZ30gdHlwZSA9ICdpbml0aWFsJyAtIHdoZXRoZXIgdG8gcmVtb3ZlIGFsbCBpbmRlbnRhdGlvbiBvciBqdXN0IGxlYWRpbmcgaW5kZW50YXRpb24uIGNhbiBiZSAnYWxsJyBvciAnaW5pdGlhbCdcbiAqIEByZXR1cm4ge09iamVjdH0gICAgICAgICAgICAgICAgICAtIGEgVGVtcGxhdGVUYWcgdHJhbnNmb3JtZXJcbiAqL1xuY29uc3Qgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lciA9ICh0eXBlID0gJ2luaXRpYWwnKSA9PiAoe1xuICBvbkVuZFJlc3VsdChlbmRSZXN1bHQpIHtcbiAgICBpZiAodHlwZSA9PT0gJ2luaXRpYWwnKSB7XG4gICAgICAvLyByZW1vdmUgdGhlIHNob3J0ZXN0IGxlYWRpbmcgaW5kZW50YXRpb24gZnJvbSBlYWNoIGxpbmVcbiAgICAgIGNvbnN0IG1hdGNoID0gZW5kUmVzdWx0Lm1hdGNoKC9eW15cXFNcXG5dKig/PVxcUykvZ20pO1xuICAgICAgY29uc3QgaW5kZW50ID0gbWF0Y2ggJiYgTWF0aC5taW4oLi4ubWF0Y2gubWFwKGVsID0+IGVsLmxlbmd0aCkpO1xuICAgICAgaWYgKGluZGVudCkge1xuICAgICAgICBjb25zdCByZWdleHAgPSBuZXcgUmVnRXhwKGBeLnske2luZGVudH19YCwgJ2dtJyk7XG4gICAgICAgIHJldHVybiBlbmRSZXN1bHQucmVwbGFjZShyZWdleHAsICcnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbmRSZXN1bHQ7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAnYWxsJykge1xuICAgICAgLy8gcmVtb3ZlIGFsbCBpbmRlbnRhdGlvbiBmcm9tIGVhY2ggbGluZVxuICAgICAgcmV0dXJuIGVuZFJlc3VsdC5yZXBsYWNlKC9eW15cXFNcXG5dKy9nbSwgJycpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gdHlwZTogJHt0eXBlfWApO1xuICB9LFxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHN0cmlwSW5kZW50VHJhbnNmb3JtZXI7XG4iXX0=","/**\n * Replaces tabs, newlines and spaces with the chosen value when they occur in sequences\n * @param {(String|RegExp)} replaceWhat - the value or pattern that should be replaced\n * @param {*} replaceWith - the replacement value\n * @return {Object} - a TemplateTag transformer\n */\nvar replaceResultTransformer = function replaceResultTransformer(replaceWhat, replaceWith) {\n return {\n onEndResult: function onEndResult(endResult) {\n if (replaceWhat == null || replaceWith == null) {\n throw new Error('replaceResultTransformer requires at least 2 arguments.');\n }\n return endResult.replace(replaceWhat, replaceWith);\n }\n };\n};\n\nexport default replaceResultTransformer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXIvcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyLmpzIl0sIm5hbWVzIjpbInJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciIsInJlcGxhY2VXaGF0IiwicmVwbGFjZVdpdGgiLCJvbkVuZFJlc3VsdCIsImVuZFJlc3VsdCIsIkVycm9yIiwicmVwbGFjZSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztBQU1BLElBQU1BLDJCQUEyQixTQUEzQkEsd0JBQTJCLENBQUNDLFdBQUQsRUFBY0MsV0FBZDtBQUFBLFNBQStCO0FBQzlEQyxlQUQ4RCx1QkFDbERDLFNBRGtELEVBQ3ZDO0FBQ3JCLFVBQUlILGVBQWUsSUFBZixJQUF1QkMsZUFBZSxJQUExQyxFQUFnRDtBQUM5QyxjQUFNLElBQUlHLEtBQUosQ0FDSix5REFESSxDQUFOO0FBR0Q7QUFDRCxhQUFPRCxVQUFVRSxPQUFWLENBQWtCTCxXQUFsQixFQUErQkMsV0FBL0IsQ0FBUDtBQUNEO0FBUjZELEdBQS9CO0FBQUEsQ0FBakM7O0FBV0EsZUFBZUYsd0JBQWYiLCJmaWxlIjoicmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXBsYWNlcyB0YWJzLCBuZXdsaW5lcyBhbmQgc3BhY2VzIHdpdGggdGhlIGNob3NlbiB2YWx1ZSB3aGVuIHRoZXkgb2NjdXIgaW4gc2VxdWVuY2VzXG4gKiBAcGFyYW0gIHsoU3RyaW5nfFJlZ0V4cCl9IHJlcGxhY2VXaGF0IC0gdGhlIHZhbHVlIG9yIHBhdHRlcm4gdGhhdCBzaG91bGQgYmUgcmVwbGFjZWRcbiAqIEBwYXJhbSAgeyp9ICAgICAgICAgICAgICAgcmVwbGFjZVdpdGggLSB0aGUgcmVwbGFjZW1lbnQgdmFsdWVcbiAqIEByZXR1cm4ge09iamVjdH0gICAgICAgICAgICAgICAgICAgICAgLSBhIFRlbXBsYXRlVGFnIHRyYW5zZm9ybWVyXG4gKi9cbmNvbnN0IHJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciA9IChyZXBsYWNlV2hhdCwgcmVwbGFjZVdpdGgpID0+ICh7XG4gIG9uRW5kUmVzdWx0KGVuZFJlc3VsdCkge1xuICAgIGlmIChyZXBsYWNlV2hhdCA9PSBudWxsIHx8IHJlcGxhY2VXaXRoID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ3JlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciByZXF1aXJlcyBhdCBsZWFzdCAyIGFyZ3VtZW50cy4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGVuZFJlc3VsdC5yZXBsYWNlKHJlcGxhY2VXaGF0LCByZXBsYWNlV2l0aCk7XG4gIH0sXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyO1xuIl19","var replaceSubstitutionTransformer = function replaceSubstitutionTransformer(replaceWhat, replaceWith) {\n return {\n onSubstitution: function onSubstitution(substitution, resultSoFar) {\n if (replaceWhat == null || replaceWith == null) {\n throw new Error('replaceSubstitutionTransformer requires at least 2 arguments.');\n }\n\n // Do not touch if null or undefined\n if (substitution == null) {\n return substitution;\n } else {\n return substitution.toString().replace(replaceWhat, replaceWith);\n }\n }\n };\n};\n\nexport default replaceSubstitutionTransformer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXBsYWNlU3Vic3RpdHV0aW9uVHJhbnNmb3JtZXIvcmVwbGFjZVN1YnN0aXR1dGlvblRyYW5zZm9ybWVyLmpzIl0sIm5hbWVzIjpbInJlcGxhY2VTdWJzdGl0dXRpb25UcmFuc2Zvcm1lciIsInJlcGxhY2VXaGF0IiwicmVwbGFjZVdpdGgiLCJvblN1YnN0aXR1dGlvbiIsInN1YnN0aXR1dGlvbiIsInJlc3VsdFNvRmFyIiwiRXJyb3IiLCJ0b1N0cmluZyIsInJlcGxhY2UiXSwibWFwcGluZ3MiOiJBQUFBLElBQU1BLGlDQUFpQyxTQUFqQ0EsOEJBQWlDLENBQUNDLFdBQUQsRUFBY0MsV0FBZDtBQUFBLFNBQStCO0FBQ3BFQyxrQkFEb0UsMEJBQ3JEQyxZQURxRCxFQUN2Q0MsV0FEdUMsRUFDMUI7QUFDeEMsVUFBSUosZUFBZSxJQUFmLElBQXVCQyxlQUFlLElBQTFDLEVBQWdEO0FBQzlDLGNBQU0sSUFBSUksS0FBSixDQUNKLCtEQURJLENBQU47QUFHRDs7QUFFRDtBQUNBLFVBQUlGLGdCQUFnQixJQUFwQixFQUEwQjtBQUN4QixlQUFPQSxZQUFQO0FBQ0QsT0FGRCxNQUVPO0FBQ0wsZUFBT0EsYUFBYUcsUUFBYixHQUF3QkMsT0FBeEIsQ0FBZ0NQLFdBQWhDLEVBQTZDQyxXQUE3QyxDQUFQO0FBQ0Q7QUFDRjtBQWRtRSxHQUEvQjtBQUFBLENBQXZDOztBQWlCQSxlQUFlRiw4QkFBZiIsImZpbGUiOiJyZXBsYWNlU3Vic3RpdHV0aW9uVHJhbnNmb3JtZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCByZXBsYWNlU3Vic3RpdHV0aW9uVHJhbnNmb3JtZXIgPSAocmVwbGFjZVdoYXQsIHJlcGxhY2VXaXRoKSA9PiAoe1xuICBvblN1YnN0aXR1dGlvbihzdWJzdGl0dXRpb24sIHJlc3VsdFNvRmFyKSB7XG4gICAgaWYgKHJlcGxhY2VXaGF0ID09IG51bGwgfHwgcmVwbGFjZVdpdGggPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAncmVwbGFjZVN1YnN0aXR1dGlvblRyYW5zZm9ybWVyIHJlcXVpcmVzIGF0IGxlYXN0IDIgYXJndW1lbnRzLicsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIERvIG5vdCB0b3VjaCBpZiBudWxsIG9yIHVuZGVmaW5lZFxuICAgIGlmIChzdWJzdGl0dXRpb24gPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHN1YnN0aXR1dGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHN1YnN0aXR1dGlvbi50b1N0cmluZygpLnJlcGxhY2UocmVwbGFjZVdoYXQsIHJlcGxhY2VXaXRoKTtcbiAgICB9XG4gIH0sXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgcmVwbGFjZVN1YnN0aXR1dGlvblRyYW5zZm9ybWVyO1xuIl19","var defaults = {\n separator: '',\n conjunction: '',\n serial: false\n};\n\n/**\n * Converts an array substitution to a string containing a list\n * @param {String} [opts.separator = ''] - the character that separates each item\n * @param {String} [opts.conjunction = ''] - replace the last separator with this\n * @param {Boolean} [opts.serial = false] - include the separator before the conjunction? (Oxford comma use-case)\n *\n * @return {Object} - a TemplateTag transformer\n */\nvar inlineArrayTransformer = function inlineArrayTransformer() {\n var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaults;\n return {\n onSubstitution: function onSubstitution(substitution, resultSoFar) {\n // only operate on arrays\n if (Array.isArray(substitution)) {\n var arrayLength = substitution.length;\n var separator = opts.separator;\n var conjunction = opts.conjunction;\n var serial = opts.serial;\n // join each item in the array into a string where each item is separated by separator\n // be sure to maintain indentation\n var indent = resultSoFar.match(/(\\n?[^\\S\\n]+)$/);\n if (indent) {\n substitution = substitution.join(separator + indent[1]);\n } else {\n substitution = substitution.join(separator + ' ');\n }\n // if conjunction is set, replace the last separator with conjunction, but only if there is more than one substitution\n if (conjunction && arrayLength > 1) {\n var separatorIndex = substitution.lastIndexOf(separator);\n substitution = substitution.slice(0, separatorIndex) + (serial ? separator : '') + ' ' + conjunction + substitution.slice(separatorIndex + 1);\n }\n }\n return substitution;\n }\n };\n};\n\nexport default inlineArrayTransformer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbmxpbmVBcnJheVRyYW5zZm9ybWVyL2lubGluZUFycmF5VHJhbnNmb3JtZXIuanMiXSwibmFtZXMiOlsiZGVmYXVsdHMiLCJzZXBhcmF0b3IiLCJjb25qdW5jdGlvbiIsInNlcmlhbCIsImlubGluZUFycmF5VHJhbnNmb3JtZXIiLCJvcHRzIiwib25TdWJzdGl0dXRpb24iLCJzdWJzdGl0dXRpb24iLCJyZXN1bHRTb0ZhciIsIkFycmF5IiwiaXNBcnJheSIsImFycmF5TGVuZ3RoIiwibGVuZ3RoIiwiaW5kZW50IiwibWF0Y2giLCJqb2luIiwic2VwYXJhdG9ySW5kZXgiLCJsYXN0SW5kZXhPZiIsInNsaWNlIl0sIm1hcHBpbmdzIjoiQUFBQSxJQUFNQSxXQUFXO0FBQ2ZDLGFBQVcsRUFESTtBQUVmQyxlQUFhLEVBRkU7QUFHZkMsVUFBUTtBQUhPLENBQWpCOztBQU1BOzs7Ozs7OztBQVFBLElBQU1DLHlCQUF5QixTQUF6QkEsc0JBQXlCO0FBQUEsTUFBQ0MsSUFBRCx1RUFBUUwsUUFBUjtBQUFBLFNBQXNCO0FBQ25ETSxrQkFEbUQsMEJBQ3BDQyxZQURvQyxFQUN0QkMsV0FEc0IsRUFDVDtBQUN4QztBQUNBLFVBQUlDLE1BQU1DLE9BQU4sQ0FBY0gsWUFBZCxDQUFKLEVBQWlDO0FBQy9CLFlBQU1JLGNBQWNKLGFBQWFLLE1BQWpDO0FBQ0EsWUFBTVgsWUFBWUksS0FBS0osU0FBdkI7QUFDQSxZQUFNQyxjQUFjRyxLQUFLSCxXQUF6QjtBQUNBLFlBQU1DLFNBQVNFLEtBQUtGLE1BQXBCO0FBQ0E7QUFDQTtBQUNBLFlBQU1VLFNBQVNMLFlBQVlNLEtBQVosQ0FBa0IsZ0JBQWxCLENBQWY7QUFDQSxZQUFJRCxNQUFKLEVBQVk7QUFDVk4seUJBQWVBLGFBQWFRLElBQWIsQ0FBa0JkLFlBQVlZLE9BQU8sQ0FBUCxDQUE5QixDQUFmO0FBQ0QsU0FGRCxNQUVPO0FBQ0xOLHlCQUFlQSxhQUFhUSxJQUFiLENBQWtCZCxZQUFZLEdBQTlCLENBQWY7QUFDRDtBQUNEO0FBQ0EsWUFBSUMsZUFBZVMsY0FBYyxDQUFqQyxFQUFvQztBQUNsQyxjQUFNSyxpQkFBaUJULGFBQWFVLFdBQWIsQ0FBeUJoQixTQUF6QixDQUF2QjtBQUNBTSx5QkFDRUEsYUFBYVcsS0FBYixDQUFtQixDQUFuQixFQUFzQkYsY0FBdEIsS0FDQ2IsU0FBU0YsU0FBVCxHQUFxQixFQUR0QixJQUVBLEdBRkEsR0FHQUMsV0FIQSxHQUlBSyxhQUFhVyxLQUFiLENBQW1CRixpQkFBaUIsQ0FBcEMsQ0FMRjtBQU1EO0FBQ0Y7QUFDRCxhQUFPVCxZQUFQO0FBQ0Q7QUE1QmtELEdBQXRCO0FBQUEsQ0FBL0I7O0FBK0JBLGVBQWVILHNCQUFmIiwiZmlsZSI6ImlubGluZUFycmF5VHJhbnNmb3JtZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBkZWZhdWx0cyA9IHtcbiAgc2VwYXJhdG9yOiAnJyxcbiAgY29uanVuY3Rpb246ICcnLFxuICBzZXJpYWw6IGZhbHNlLFxufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBhcnJheSBzdWJzdGl0dXRpb24gdG8gYSBzdHJpbmcgY29udGFpbmluZyBhIGxpc3RcbiAqIEBwYXJhbSAge1N0cmluZ30gW29wdHMuc2VwYXJhdG9yID0gJyddIC0gdGhlIGNoYXJhY3RlciB0aGF0IHNlcGFyYXRlcyBlYWNoIGl0ZW1cbiAqIEBwYXJhbSAge1N0cmluZ30gW29wdHMuY29uanVuY3Rpb24gPSAnJ10gIC0gcmVwbGFjZSB0aGUgbGFzdCBzZXBhcmF0b3Igd2l0aCB0aGlzXG4gKiBAcGFyYW0gIHtCb29sZWFufSBbb3B0cy5zZXJpYWwgPSBmYWxzZV0gLSBpbmNsdWRlIHRoZSBzZXBhcmF0b3IgYmVmb3JlIHRoZSBjb25qdW5jdGlvbj8gKE94Zm9yZCBjb21tYSB1c2UtY2FzZSlcbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9ICAgICAgICAgICAgICAgICAgICAgLSBhIFRlbXBsYXRlVGFnIHRyYW5zZm9ybWVyXG4gKi9cbmNvbnN0IGlubGluZUFycmF5VHJhbnNmb3JtZXIgPSAob3B0cyA9IGRlZmF1bHRzKSA9PiAoe1xuICBvblN1YnN0aXR1dGlvbihzdWJzdGl0dXRpb24sIHJlc3VsdFNvRmFyKSB7XG4gICAgLy8gb25seSBvcGVyYXRlIG9uIGFycmF5c1xuICAgIGlmIChBcnJheS5pc0FycmF5KHN1YnN0aXR1dGlvbikpIHtcbiAgICAgIGNvbnN0IGFycmF5TGVuZ3RoID0gc3Vic3RpdHV0aW9uLmxlbmd0aDtcbiAgICAgIGNvbnN0IHNlcGFyYXRvciA9IG9wdHMuc2VwYXJhdG9yO1xuICAgICAgY29uc3QgY29uanVuY3Rpb24gPSBvcHRzLmNvbmp1bmN0aW9uO1xuICAgICAgY29uc3Qgc2VyaWFsID0gb3B0cy5zZXJpYWw7XG4gICAgICAvLyBqb2luIGVhY2ggaXRlbSBpbiB0aGUgYXJyYXkgaW50byBhIHN0cmluZyB3aGVyZSBlYWNoIGl0ZW0gaXMgc2VwYXJhdGVkIGJ5IHNlcGFyYXRvclxuICAgICAgLy8gYmUgc3VyZSB0byBtYWludGFpbiBpbmRlbnRhdGlvblxuICAgICAgY29uc3QgaW5kZW50ID0gcmVzdWx0U29GYXIubWF0Y2goLyhcXG4/W15cXFNcXG5dKykkLyk7XG4gICAgICBpZiAoaW5kZW50KSB7XG4gICAgICAgIHN1YnN0aXR1dGlvbiA9IHN1YnN0aXR1dGlvbi5qb2luKHNlcGFyYXRvciArIGluZGVudFsxXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdWJzdGl0dXRpb24gPSBzdWJzdGl0dXRpb24uam9pbihzZXBhcmF0b3IgKyAnICcpO1xuICAgICAgfVxuICAgICAgLy8gaWYgY29uanVuY3Rpb24gaXMgc2V0LCByZXBsYWNlIHRoZSBsYXN0IHNlcGFyYXRvciB3aXRoIGNvbmp1bmN0aW9uLCBidXQgb25seSBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHN1YnN0aXR1dGlvblxuICAgICAgaWYgKGNvbmp1bmN0aW9uICYmIGFycmF5TGVuZ3RoID4gMSkge1xuICAgICAgICBjb25zdCBzZXBhcmF0b3JJbmRleCA9IHN1YnN0aXR1dGlvbi5sYXN0SW5kZXhPZihzZXBhcmF0b3IpO1xuICAgICAgICBzdWJzdGl0dXRpb24gPVxuICAgICAgICAgIHN1YnN0aXR1dGlvbi5zbGljZSgwLCBzZXBhcmF0b3JJbmRleCkgK1xuICAgICAgICAgIChzZXJpYWwgPyBzZXBhcmF0b3IgOiAnJykgK1xuICAgICAgICAgICcgJyArXG4gICAgICAgICAgY29uanVuY3Rpb24gK1xuICAgICAgICAgIHN1YnN0aXR1dGlvbi5zbGljZShzZXBhcmF0b3JJbmRleCArIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3Vic3RpdHV0aW9uO1xuICB9LFxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGlubGluZUFycmF5VHJhbnNmb3JtZXI7XG4iXX0=","var splitStringTransformer = function splitStringTransformer(splitBy) {\n return {\n onSubstitution: function onSubstitution(substitution, resultSoFar) {\n if (splitBy != null && typeof splitBy === 'string') {\n if (typeof substitution === 'string' && substitution.includes(splitBy)) {\n substitution = substitution.split(splitBy);\n }\n } else {\n throw new Error('You need to specify a string character to split by.');\n }\n return substitution;\n }\n };\n};\n\nexport default splitStringTransformer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zcGxpdFN0cmluZ1RyYW5zZm9ybWVyL3NwbGl0U3RyaW5nVHJhbnNmb3JtZXIuanMiXSwibmFtZXMiOlsic3BsaXRTdHJpbmdUcmFuc2Zvcm1lciIsIm9uU3Vic3RpdHV0aW9uIiwic3Vic3RpdHV0aW9uIiwicmVzdWx0U29GYXIiLCJzcGxpdEJ5IiwiaW5jbHVkZXMiLCJzcGxpdCIsIkVycm9yIl0sIm1hcHBpbmdzIjoiQUFBQSxJQUFNQSx5QkFBeUIsU0FBekJBLHNCQUF5QjtBQUFBLFNBQVk7QUFDekNDLGtCQUR5QywwQkFDMUJDLFlBRDBCLEVBQ1pDLFdBRFksRUFDQztBQUN4QyxVQUFJQyxXQUFXLElBQVgsSUFBbUIsT0FBT0EsT0FBUCxLQUFtQixRQUExQyxFQUFvRDtBQUNsRCxZQUFJLE9BQU9GLFlBQVAsS0FBd0IsUUFBeEIsSUFBb0NBLGFBQWFHLFFBQWIsQ0FBc0JELE9BQXRCLENBQXhDLEVBQXdFO0FBQ3RFRix5QkFBZUEsYUFBYUksS0FBYixDQUFtQkYsT0FBbkIsQ0FBZjtBQUNEO0FBQ0YsT0FKRCxNQUlPO0FBQ0wsY0FBTSxJQUFJRyxLQUFKLENBQVUscURBQVYsQ0FBTjtBQUNEO0FBQ0QsYUFBT0wsWUFBUDtBQUNEO0FBVndDLEdBQVo7QUFBQSxDQUEvQjs7QUFhQSxlQUFlRixzQkFBZiIsImZpbGUiOiJzcGxpdFN0cmluZ1RyYW5zZm9ybWVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3Qgc3BsaXRTdHJpbmdUcmFuc2Zvcm1lciA9IHNwbGl0QnkgPT4gKHtcbiAgb25TdWJzdGl0dXRpb24oc3Vic3RpdHV0aW9uLCByZXN1bHRTb0Zhcikge1xuICAgIGlmIChzcGxpdEJ5ICE9IG51bGwgJiYgdHlwZW9mIHNwbGl0QnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAodHlwZW9mIHN1YnN0aXR1dGlvbiA9PT0gJ3N0cmluZycgJiYgc3Vic3RpdHV0aW9uLmluY2x1ZGVzKHNwbGl0QnkpKSB7XG4gICAgICAgIHN1YnN0aXR1dGlvbiA9IHN1YnN0aXR1dGlvbi5zcGxpdChzcGxpdEJ5KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbmVlZCB0byBzcGVjaWZ5IGEgc3RyaW5nIGNoYXJhY3RlciB0byBzcGxpdCBieS4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1YnN0aXR1dGlvbjtcbiAgfSxcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBzcGxpdFN0cmluZ1RyYW5zZm9ybWVyO1xuIl19","var isValidValue = function isValidValue(x) {\n return x != null && !Number.isNaN(x) && typeof x !== 'boolean';\n};\n\nvar removeNonPrintingValuesTransformer = function removeNonPrintingValuesTransformer() {\n return {\n onSubstitution: function onSubstitution(substitution) {\n if (Array.isArray(substitution)) {\n return substitution.filter(isValidValue);\n }\n if (isValidValue(substitution)) {\n return substitution;\n }\n return '';\n }\n };\n};\n\nexport default removeNonPrintingValuesTransformer;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZW1vdmVOb25QcmludGluZ1ZhbHVlc1RyYW5zZm9ybWVyL3JlbW92ZU5vblByaW50aW5nVmFsdWVzVHJhbnNmb3JtZXIuanMiXSwibmFtZXMiOlsiaXNWYWxpZFZhbHVlIiwieCIsIk51bWJlciIsImlzTmFOIiwicmVtb3ZlTm9uUHJpbnRpbmdWYWx1ZXNUcmFuc2Zvcm1lciIsIm9uU3Vic3RpdHV0aW9uIiwic3Vic3RpdHV0aW9uIiwiQXJyYXkiLCJpc0FycmF5IiwiZmlsdGVyIl0sIm1hcHBpbmdzIjoiQUFBQSxJQUFNQSxlQUFlLFNBQWZBLFlBQWU7QUFBQSxTQUNuQkMsS0FBSyxJQUFMLElBQWEsQ0FBQ0MsT0FBT0MsS0FBUCxDQUFhRixDQUFiLENBQWQsSUFBaUMsT0FBT0EsQ0FBUCxLQUFhLFNBRDNCO0FBQUEsQ0FBckI7O0FBR0EsSUFBTUcscUNBQXFDLFNBQXJDQSxrQ0FBcUM7QUFBQSxTQUFPO0FBQ2hEQyxrQkFEZ0QsMEJBQ2pDQyxZQURpQyxFQUNuQjtBQUMzQixVQUFJQyxNQUFNQyxPQUFOLENBQWNGLFlBQWQsQ0FBSixFQUFpQztBQUMvQixlQUFPQSxhQUFhRyxNQUFiLENBQW9CVCxZQUFwQixDQUFQO0FBQ0Q7QUFDRCxVQUFJQSxhQUFhTSxZQUFiLENBQUosRUFBZ0M7QUFDOUIsZUFBT0EsWUFBUDtBQUNEO0FBQ0QsYUFBTyxFQUFQO0FBQ0Q7QUFUK0MsR0FBUDtBQUFBLENBQTNDOztBQVlBLGVBQWVGLGtDQUFmIiwiZmlsZSI6InJlbW92ZU5vblByaW50aW5nVmFsdWVzVHJhbnNmb3JtZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBpc1ZhbGlkVmFsdWUgPSB4ID0+XG4gIHggIT0gbnVsbCAmJiAhTnVtYmVyLmlzTmFOKHgpICYmIHR5cGVvZiB4ICE9PSAnYm9vbGVhbic7XG5cbmNvbnN0IHJlbW92ZU5vblByaW50aW5nVmFsdWVzVHJhbnNmb3JtZXIgPSAoKSA9PiAoe1xuICBvblN1YnN0aXR1dGlvbihzdWJzdGl0dXRpb24pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShzdWJzdGl0dXRpb24pKSB7XG4gICAgICByZXR1cm4gc3Vic3RpdHV0aW9uLmZpbHRlcihpc1ZhbGlkVmFsdWUpO1xuICAgIH1cbiAgICBpZiAoaXNWYWxpZFZhbHVlKHN1YnN0aXR1dGlvbikpIHtcbiAgICAgIHJldHVybiBzdWJzdGl0dXRpb247XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfSxcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCByZW1vdmVOb25QcmludGluZ1ZhbHVlc1RyYW5zZm9ybWVyO1xuIl19","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\n\nvar commaLists = new TemplateTag(inlineArrayTransformer({ separator: ',' }), stripIndentTransformer, trimResultTransformer);\n\nexport default commaLists;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYUxpc3RzL2NvbW1hTGlzdHMuanMiXSwibmFtZXMiOlsiVGVtcGxhdGVUYWciLCJzdHJpcEluZGVudFRyYW5zZm9ybWVyIiwiaW5saW5lQXJyYXlUcmFuc2Zvcm1lciIsInRyaW1SZXN1bHRUcmFuc2Zvcm1lciIsImNvbW1hTGlzdHMiLCJzZXBhcmF0b3IiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFdBQVAsTUFBd0IsZ0JBQXhCO0FBQ0EsT0FBT0Msc0JBQVAsTUFBbUMsMkJBQW5DO0FBQ0EsT0FBT0Msc0JBQVAsTUFBbUMsMkJBQW5DO0FBQ0EsT0FBT0MscUJBQVAsTUFBa0MsMEJBQWxDOztBQUVBLElBQU1DLGFBQWEsSUFBSUosV0FBSixDQUNqQkUsdUJBQXVCLEVBQUVHLFdBQVcsR0FBYixFQUF2QixDQURpQixFQUVqQkosc0JBRmlCLEVBR2pCRSxxQkFIaUIsQ0FBbkI7O0FBTUEsZUFBZUMsVUFBZiIsImZpbGUiOiJjb21tYUxpc3RzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRlbXBsYXRlVGFnIGZyb20gJy4uL1RlbXBsYXRlVGFnJztcbmltcG9ydCBzdHJpcEluZGVudFRyYW5zZm9ybWVyIGZyb20gJy4uL3N0cmlwSW5kZW50VHJhbnNmb3JtZXInO1xuaW1wb3J0IGlubGluZUFycmF5VHJhbnNmb3JtZXIgZnJvbSAnLi4vaW5saW5lQXJyYXlUcmFuc2Zvcm1lcic7XG5pbXBvcnQgdHJpbVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3RyaW1SZXN1bHRUcmFuc2Zvcm1lcic7XG5cbmNvbnN0IGNvbW1hTGlzdHMgPSBuZXcgVGVtcGxhdGVUYWcoXG4gIGlubGluZUFycmF5VHJhbnNmb3JtZXIoeyBzZXBhcmF0b3I6ICcsJyB9KSxcbiAgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lcixcbiAgdHJpbVJlc3VsdFRyYW5zZm9ybWVyLFxuKTtcblxuZXhwb3J0IGRlZmF1bHQgY29tbWFMaXN0cztcbiJdfQ==","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\n\nvar commaListsAnd = new TemplateTag(inlineArrayTransformer({ separator: ',', conjunction: 'and' }), stripIndentTransformer, trimResultTransformer);\n\nexport default commaListsAnd;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYUxpc3RzQW5kL2NvbW1hTGlzdHNBbmQuanMiXSwibmFtZXMiOlsiVGVtcGxhdGVUYWciLCJzdHJpcEluZGVudFRyYW5zZm9ybWVyIiwiaW5saW5lQXJyYXlUcmFuc2Zvcm1lciIsInRyaW1SZXN1bHRUcmFuc2Zvcm1lciIsImNvbW1hTGlzdHNBbmQiLCJzZXBhcmF0b3IiLCJjb25qdW5jdGlvbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBUCxNQUF3QixnQkFBeEI7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxxQkFBUCxNQUFrQywwQkFBbEM7O0FBRUEsSUFBTUMsZ0JBQWdCLElBQUlKLFdBQUosQ0FDcEJFLHVCQUF1QixFQUFFRyxXQUFXLEdBQWIsRUFBa0JDLGFBQWEsS0FBL0IsRUFBdkIsQ0FEb0IsRUFFcEJMLHNCQUZvQixFQUdwQkUscUJBSG9CLENBQXRCOztBQU1BLGVBQWVDLGFBQWYiLCJmaWxlIjoiY29tbWFMaXN0c0FuZC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZW1wbGF0ZVRhZyBmcm9tICcuLi9UZW1wbGF0ZVRhZyc7XG5pbXBvcnQgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lciBmcm9tICcuLi9zdHJpcEluZGVudFRyYW5zZm9ybWVyJztcbmltcG9ydCBpbmxpbmVBcnJheVRyYW5zZm9ybWVyIGZyb20gJy4uL2lubGluZUFycmF5VHJhbnNmb3JtZXInO1xuaW1wb3J0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuXG5jb25zdCBjb21tYUxpc3RzQW5kID0gbmV3IFRlbXBsYXRlVGFnKFxuICBpbmxpbmVBcnJheVRyYW5zZm9ybWVyKHsgc2VwYXJhdG9yOiAnLCcsIGNvbmp1bmN0aW9uOiAnYW5kJyB9KSxcbiAgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lcixcbiAgdHJpbVJlc3VsdFRyYW5zZm9ybWVyLFxuKTtcblxuZXhwb3J0IGRlZmF1bHQgY29tbWFMaXN0c0FuZDtcbiJdfQ==","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\n\nvar commaListsOr = new TemplateTag(inlineArrayTransformer({ separator: ',', conjunction: 'or' }), stripIndentTransformer, trimResultTransformer);\n\nexport default commaListsOr;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYUxpc3RzT3IvY29tbWFMaXN0c09yLmpzIl0sIm5hbWVzIjpbIlRlbXBsYXRlVGFnIiwic3RyaXBJbmRlbnRUcmFuc2Zvcm1lciIsImlubGluZUFycmF5VHJhbnNmb3JtZXIiLCJ0cmltUmVzdWx0VHJhbnNmb3JtZXIiLCJjb21tYUxpc3RzT3IiLCJzZXBhcmF0b3IiLCJjb25qdW5jdGlvbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBUCxNQUF3QixnQkFBeEI7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxxQkFBUCxNQUFrQywwQkFBbEM7O0FBRUEsSUFBTUMsZUFBZSxJQUFJSixXQUFKLENBQ25CRSx1QkFBdUIsRUFBRUcsV0FBVyxHQUFiLEVBQWtCQyxhQUFhLElBQS9CLEVBQXZCLENBRG1CLEVBRW5CTCxzQkFGbUIsRUFHbkJFLHFCQUhtQixDQUFyQjs7QUFNQSxlQUFlQyxZQUFmIiwiZmlsZSI6ImNvbW1hTGlzdHNPci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZW1wbGF0ZVRhZyBmcm9tICcuLi9UZW1wbGF0ZVRhZyc7XG5pbXBvcnQgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lciBmcm9tICcuLi9zdHJpcEluZGVudFRyYW5zZm9ybWVyJztcbmltcG9ydCBpbmxpbmVBcnJheVRyYW5zZm9ybWVyIGZyb20gJy4uL2lubGluZUFycmF5VHJhbnNmb3JtZXInO1xuaW1wb3J0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuXG5jb25zdCBjb21tYUxpc3RzT3IgPSBuZXcgVGVtcGxhdGVUYWcoXG4gIGlubGluZUFycmF5VHJhbnNmb3JtZXIoeyBzZXBhcmF0b3I6ICcsJywgY29uanVuY3Rpb246ICdvcicgfSksXG4gIHN0cmlwSW5kZW50VHJhbnNmb3JtZXIsXG4gIHRyaW1SZXN1bHRUcmFuc2Zvcm1lcixcbik7XG5cbmV4cG9ydCBkZWZhdWx0IGNvbW1hTGlzdHNPcjtcbiJdfQ==","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\nimport splitStringTransformer from '../splitStringTransformer';\nimport removeNonPrintingValuesTransformer from '../removeNonPrintingValuesTransformer';\n\nvar html = new TemplateTag(splitStringTransformer('\\n'), removeNonPrintingValuesTransformer, inlineArrayTransformer, stripIndentTransformer, trimResultTransformer);\n\nexport default html;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9odG1sL2h0bWwuanMiXSwibmFtZXMiOlsiVGVtcGxhdGVUYWciLCJzdHJpcEluZGVudFRyYW5zZm9ybWVyIiwiaW5saW5lQXJyYXlUcmFuc2Zvcm1lciIsInRyaW1SZXN1bHRUcmFuc2Zvcm1lciIsInNwbGl0U3RyaW5nVHJhbnNmb3JtZXIiLCJyZW1vdmVOb25QcmludGluZ1ZhbHVlc1RyYW5zZm9ybWVyIiwiaHRtbCJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBUCxNQUF3QixnQkFBeEI7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxxQkFBUCxNQUFrQywwQkFBbEM7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxrQ0FBUCxNQUErQyx1Q0FBL0M7O0FBRUEsSUFBTUMsT0FBTyxJQUFJTixXQUFKLENBQ1hJLHVCQUF1QixJQUF2QixDQURXLEVBRVhDLGtDQUZXLEVBR1hILHNCQUhXLEVBSVhELHNCQUpXLEVBS1hFLHFCQUxXLENBQWI7O0FBUUEsZUFBZUcsSUFBZiIsImZpbGUiOiJodG1sLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRlbXBsYXRlVGFnIGZyb20gJy4uL1RlbXBsYXRlVGFnJztcbmltcG9ydCBzdHJpcEluZGVudFRyYW5zZm9ybWVyIGZyb20gJy4uL3N0cmlwSW5kZW50VHJhbnNmb3JtZXInO1xuaW1wb3J0IGlubGluZUFycmF5VHJhbnNmb3JtZXIgZnJvbSAnLi4vaW5saW5lQXJyYXlUcmFuc2Zvcm1lcic7XG5pbXBvcnQgdHJpbVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3RyaW1SZXN1bHRUcmFuc2Zvcm1lcic7XG5pbXBvcnQgc3BsaXRTdHJpbmdUcmFuc2Zvcm1lciBmcm9tICcuLi9zcGxpdFN0cmluZ1RyYW5zZm9ybWVyJztcbmltcG9ydCByZW1vdmVOb25QcmludGluZ1ZhbHVlc1RyYW5zZm9ybWVyIGZyb20gJy4uL3JlbW92ZU5vblByaW50aW5nVmFsdWVzVHJhbnNmb3JtZXInO1xuXG5jb25zdCBodG1sID0gbmV3IFRlbXBsYXRlVGFnKFxuICBzcGxpdFN0cmluZ1RyYW5zZm9ybWVyKCdcXG4nKSxcbiAgcmVtb3ZlTm9uUHJpbnRpbmdWYWx1ZXNUcmFuc2Zvcm1lcixcbiAgaW5saW5lQXJyYXlUcmFuc2Zvcm1lcixcbiAgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lcixcbiAgdHJpbVJlc3VsdFRyYW5zZm9ybWVyLFxuKTtcblxuZXhwb3J0IGRlZmF1bHQgaHRtbDtcbiJdfQ==","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\nimport splitStringTransformer from '../splitStringTransformer';\nimport replaceSubstitutionTransformer from '../replaceSubstitutionTransformer';\n\nvar safeHtml = new TemplateTag(splitStringTransformer('\\n'), inlineArrayTransformer, stripIndentTransformer, trimResultTransformer, replaceSubstitutionTransformer(/&/g, '&amp;'), replaceSubstitutionTransformer(/</g, '&lt;'), replaceSubstitutionTransformer(/>/g, '&gt;'), replaceSubstitutionTransformer(/\"/g, '&quot;'), replaceSubstitutionTransformer(/'/g, '&#x27;'), replaceSubstitutionTransformer(/`/g, '&#x60;'));\n\nexport default safeHtml;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zYWZlSHRtbC9zYWZlSHRtbC5qcyJdLCJuYW1lcyI6WyJUZW1wbGF0ZVRhZyIsInN0cmlwSW5kZW50VHJhbnNmb3JtZXIiLCJpbmxpbmVBcnJheVRyYW5zZm9ybWVyIiwidHJpbVJlc3VsdFRyYW5zZm9ybWVyIiwic3BsaXRTdHJpbmdUcmFuc2Zvcm1lciIsInJlcGxhY2VTdWJzdGl0dXRpb25UcmFuc2Zvcm1lciIsInNhZmVIdG1sIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFQLE1BQXdCLGdCQUF4QjtBQUNBLE9BQU9DLHNCQUFQLE1BQW1DLDJCQUFuQztBQUNBLE9BQU9DLHNCQUFQLE1BQW1DLDJCQUFuQztBQUNBLE9BQU9DLHFCQUFQLE1BQWtDLDBCQUFsQztBQUNBLE9BQU9DLHNCQUFQLE1BQW1DLDJCQUFuQztBQUNBLE9BQU9DLDhCQUFQLE1BQTJDLG1DQUEzQzs7QUFFQSxJQUFNQyxXQUFXLElBQUlOLFdBQUosQ0FDZkksdUJBQXVCLElBQXZCLENBRGUsRUFFZkYsc0JBRmUsRUFHZkQsc0JBSGUsRUFJZkUscUJBSmUsRUFLZkUsK0JBQStCLElBQS9CLEVBQXFDLE9BQXJDLENBTGUsRUFNZkEsK0JBQStCLElBQS9CLEVBQXFDLE1BQXJDLENBTmUsRUFPZkEsK0JBQStCLElBQS9CLEVBQXFDLE1BQXJDLENBUGUsRUFRZkEsK0JBQStCLElBQS9CLEVBQXFDLFFBQXJDLENBUmUsRUFTZkEsK0JBQStCLElBQS9CLEVBQXFDLFFBQXJDLENBVGUsRUFVZkEsK0JBQStCLElBQS9CLEVBQXFDLFFBQXJDLENBVmUsQ0FBakI7O0FBYUEsZUFBZUMsUUFBZiIsImZpbGUiOiJzYWZlSHRtbC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZW1wbGF0ZVRhZyBmcm9tICcuLi9UZW1wbGF0ZVRhZyc7XG5pbXBvcnQgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lciBmcm9tICcuLi9zdHJpcEluZGVudFRyYW5zZm9ybWVyJztcbmltcG9ydCBpbmxpbmVBcnJheVRyYW5zZm9ybWVyIGZyb20gJy4uL2lubGluZUFycmF5VHJhbnNmb3JtZXInO1xuaW1wb3J0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuaW1wb3J0IHNwbGl0U3RyaW5nVHJhbnNmb3JtZXIgZnJvbSAnLi4vc3BsaXRTdHJpbmdUcmFuc2Zvcm1lcic7XG5pbXBvcnQgcmVwbGFjZVN1YnN0aXR1dGlvblRyYW5zZm9ybWVyIGZyb20gJy4uL3JlcGxhY2VTdWJzdGl0dXRpb25UcmFuc2Zvcm1lcic7XG5cbmNvbnN0IHNhZmVIdG1sID0gbmV3IFRlbXBsYXRlVGFnKFxuICBzcGxpdFN0cmluZ1RyYW5zZm9ybWVyKCdcXG4nKSxcbiAgaW5saW5lQXJyYXlUcmFuc2Zvcm1lcixcbiAgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lcixcbiAgdHJpbVJlc3VsdFRyYW5zZm9ybWVyLFxuICByZXBsYWNlU3Vic3RpdHV0aW9uVHJhbnNmb3JtZXIoLyYvZywgJyZhbXA7JyksXG4gIHJlcGxhY2VTdWJzdGl0dXRpb25UcmFuc2Zvcm1lcigvPC9nLCAnJmx0OycpLFxuICByZXBsYWNlU3Vic3RpdHV0aW9uVHJhbnNmb3JtZXIoLz4vZywgJyZndDsnKSxcbiAgcmVwbGFjZVN1YnN0aXR1dGlvblRyYW5zZm9ybWVyKC9cIi9nLCAnJnF1b3Q7JyksXG4gIHJlcGxhY2VTdWJzdGl0dXRpb25UcmFuc2Zvcm1lcigvJy9nLCAnJiN4Mjc7JyksXG4gIHJlcGxhY2VTdWJzdGl0dXRpb25UcmFuc2Zvcm1lcigvYC9nLCAnJiN4NjA7JyksXG4pO1xuXG5leHBvcnQgZGVmYXVsdCBzYWZlSHRtbDtcbiJdfQ==","import TemplateTag from '../TemplateTag';\nimport trimResultTransformer from '../trimResultTransformer';\nimport replaceResultTransformer from '../replaceResultTransformer';\n\nvar oneLine = new TemplateTag(replaceResultTransformer(/(?:\\n(?:\\s*))+/g, ' '), trimResultTransformer);\n\nexport default oneLine;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vbmVMaW5lL29uZUxpbmUuanMiXSwibmFtZXMiOlsiVGVtcGxhdGVUYWciLCJ0cmltUmVzdWx0VHJhbnNmb3JtZXIiLCJyZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXIiLCJvbmVMaW5lIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFQLE1BQXdCLGdCQUF4QjtBQUNBLE9BQU9DLHFCQUFQLE1BQWtDLDBCQUFsQztBQUNBLE9BQU9DLHdCQUFQLE1BQXFDLDZCQUFyQzs7QUFFQSxJQUFNQyxVQUFVLElBQUlILFdBQUosQ0FDZEUseUJBQXlCLGlCQUF6QixFQUE0QyxHQUE1QyxDQURjLEVBRWRELHFCQUZjLENBQWhCOztBQUtBLGVBQWVFLE9BQWYiLCJmaWxlIjoib25lTGluZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZW1wbGF0ZVRhZyBmcm9tICcuLi9UZW1wbGF0ZVRhZyc7XG5pbXBvcnQgdHJpbVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3RyaW1SZXN1bHRUcmFuc2Zvcm1lcic7XG5pbXBvcnQgcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3JlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lcic7XG5cbmNvbnN0IG9uZUxpbmUgPSBuZXcgVGVtcGxhdGVUYWcoXG4gIHJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lcigvKD86XFxuKD86XFxzKikpKy9nLCAnICcpLFxuICB0cmltUmVzdWx0VHJhbnNmb3JtZXIsXG4pO1xuXG5leHBvcnQgZGVmYXVsdCBvbmVMaW5lO1xuIl19","import TemplateTag from '../TemplateTag';\nimport trimResultTransformer from '../trimResultTransformer';\nimport replaceResultTransformer from '../replaceResultTransformer';\n\nvar oneLineTrim = new TemplateTag(replaceResultTransformer(/(?:\\n\\s*)/g, ''), trimResultTransformer);\n\nexport default oneLineTrim;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vbmVMaW5lVHJpbS9vbmVMaW5lVHJpbS5qcyJdLCJuYW1lcyI6WyJUZW1wbGF0ZVRhZyIsInRyaW1SZXN1bHRUcmFuc2Zvcm1lciIsInJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciIsIm9uZUxpbmVUcmltIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFQLE1BQXdCLGdCQUF4QjtBQUNBLE9BQU9DLHFCQUFQLE1BQWtDLDBCQUFsQztBQUNBLE9BQU9DLHdCQUFQLE1BQXFDLDZCQUFyQzs7QUFFQSxJQUFNQyxjQUFjLElBQUlILFdBQUosQ0FDbEJFLHlCQUF5QixZQUF6QixFQUF1QyxFQUF2QyxDQURrQixFQUVsQkQscUJBRmtCLENBQXBCOztBQUtBLGVBQWVFLFdBQWYiLCJmaWxlIjoib25lTGluZVRyaW0uanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVGVtcGxhdGVUYWcgZnJvbSAnLi4vVGVtcGxhdGVUYWcnO1xuaW1wb3J0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuaW1wb3J0IHJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi9yZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXInO1xuXG5jb25zdCBvbmVMaW5lVHJpbSA9IG5ldyBUZW1wbGF0ZVRhZyhcbiAgcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyKC8oPzpcXG5cXHMqKS9nLCAnJyksXG4gIHRyaW1SZXN1bHRUcmFuc2Zvcm1lcixcbik7XG5cbmV4cG9ydCBkZWZhdWx0IG9uZUxpbmVUcmltO1xuIl19","import TemplateTag from '../TemplateTag';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\nimport replaceResultTransformer from '../replaceResultTransformer';\n\nvar oneLineCommaLists = new TemplateTag(inlineArrayTransformer({ separator: ',' }), replaceResultTransformer(/(?:\\s+)/g, ' '), trimResultTransformer);\n\nexport default oneLineCommaLists;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vbmVMaW5lQ29tbWFMaXN0cy9vbmVMaW5lQ29tbWFMaXN0cy5qcyJdLCJuYW1lcyI6WyJUZW1wbGF0ZVRhZyIsImlubGluZUFycmF5VHJhbnNmb3JtZXIiLCJ0cmltUmVzdWx0VHJhbnNmb3JtZXIiLCJyZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXIiLCJvbmVMaW5lQ29tbWFMaXN0cyIsInNlcGFyYXRvciJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBUCxNQUF3QixnQkFBeEI7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxxQkFBUCxNQUFrQywwQkFBbEM7QUFDQSxPQUFPQyx3QkFBUCxNQUFxQyw2QkFBckM7O0FBRUEsSUFBTUMsb0JBQW9CLElBQUlKLFdBQUosQ0FDeEJDLHVCQUF1QixFQUFFSSxXQUFXLEdBQWIsRUFBdkIsQ0FEd0IsRUFFeEJGLHlCQUF5QixVQUF6QixFQUFxQyxHQUFyQyxDQUZ3QixFQUd4QkQscUJBSHdCLENBQTFCOztBQU1BLGVBQWVFLGlCQUFmIiwiZmlsZSI6Im9uZUxpbmVDb21tYUxpc3RzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRlbXBsYXRlVGFnIGZyb20gJy4uL1RlbXBsYXRlVGFnJztcbmltcG9ydCBpbmxpbmVBcnJheVRyYW5zZm9ybWVyIGZyb20gJy4uL2lubGluZUFycmF5VHJhbnNmb3JtZXInO1xuaW1wb3J0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuaW1wb3J0IHJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi9yZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXInO1xuXG5jb25zdCBvbmVMaW5lQ29tbWFMaXN0cyA9IG5ldyBUZW1wbGF0ZVRhZyhcbiAgaW5saW5lQXJyYXlUcmFuc2Zvcm1lcih7IHNlcGFyYXRvcjogJywnIH0pLFxuICByZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXIoLyg/OlxccyspL2csICcgJyksXG4gIHRyaW1SZXN1bHRUcmFuc2Zvcm1lcixcbik7XG5cbmV4cG9ydCBkZWZhdWx0IG9uZUxpbmVDb21tYUxpc3RzO1xuIl19","import TemplateTag from '../TemplateTag';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\nimport replaceResultTransformer from '../replaceResultTransformer';\n\nvar oneLineCommaListsOr = new TemplateTag(inlineArrayTransformer({ separator: ',', conjunction: 'or' }), replaceResultTransformer(/(?:\\s+)/g, ' '), trimResultTransformer);\n\nexport default oneLineCommaListsOr;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vbmVMaW5lQ29tbWFMaXN0c09yL29uZUxpbmVDb21tYUxpc3RzT3IuanMiXSwibmFtZXMiOlsiVGVtcGxhdGVUYWciLCJpbmxpbmVBcnJheVRyYW5zZm9ybWVyIiwidHJpbVJlc3VsdFRyYW5zZm9ybWVyIiwicmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyIiwib25lTGluZUNvbW1hTGlzdHNPciIsInNlcGFyYXRvciIsImNvbmp1bmN0aW9uIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFQLE1BQXdCLGdCQUF4QjtBQUNBLE9BQU9DLHNCQUFQLE1BQW1DLDJCQUFuQztBQUNBLE9BQU9DLHFCQUFQLE1BQWtDLDBCQUFsQztBQUNBLE9BQU9DLHdCQUFQLE1BQXFDLDZCQUFyQzs7QUFFQSxJQUFNQyxzQkFBc0IsSUFBSUosV0FBSixDQUMxQkMsdUJBQXVCLEVBQUVJLFdBQVcsR0FBYixFQUFrQkMsYUFBYSxJQUEvQixFQUF2QixDQUQwQixFQUUxQkgseUJBQXlCLFVBQXpCLEVBQXFDLEdBQXJDLENBRjBCLEVBRzFCRCxxQkFIMEIsQ0FBNUI7O0FBTUEsZUFBZUUsbUJBQWYiLCJmaWxlIjoib25lTGluZUNvbW1hTGlzdHNPci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZW1wbGF0ZVRhZyBmcm9tICcuLi9UZW1wbGF0ZVRhZyc7XG5pbXBvcnQgaW5saW5lQXJyYXlUcmFuc2Zvcm1lciBmcm9tICcuLi9pbmxpbmVBcnJheVRyYW5zZm9ybWVyJztcbmltcG9ydCB0cmltUmVzdWx0VHJhbnNmb3JtZXIgZnJvbSAnLi4vdHJpbVJlc3VsdFRyYW5zZm9ybWVyJztcbmltcG9ydCByZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXIgZnJvbSAnLi4vcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyJztcblxuY29uc3Qgb25lTGluZUNvbW1hTGlzdHNPciA9IG5ldyBUZW1wbGF0ZVRhZyhcbiAgaW5saW5lQXJyYXlUcmFuc2Zvcm1lcih7IHNlcGFyYXRvcjogJywnLCBjb25qdW5jdGlvbjogJ29yJyB9KSxcbiAgcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyKC8oPzpcXHMrKS9nLCAnICcpLFxuICB0cmltUmVzdWx0VHJhbnNmb3JtZXIsXG4pO1xuXG5leHBvcnQgZGVmYXVsdCBvbmVMaW5lQ29tbWFMaXN0c09yO1xuIl19","import TemplateTag from '../TemplateTag';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\nimport replaceResultTransformer from '../replaceResultTransformer';\n\nvar oneLineCommaListsAnd = new TemplateTag(inlineArrayTransformer({ separator: ',', conjunction: 'and' }), replaceResultTransformer(/(?:\\s+)/g, ' '), trimResultTransformer);\n\nexport default oneLineCommaListsAnd;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vbmVMaW5lQ29tbWFMaXN0c0FuZC9vbmVMaW5lQ29tbWFMaXN0c0FuZC5qcyJdLCJuYW1lcyI6WyJUZW1wbGF0ZVRhZyIsImlubGluZUFycmF5VHJhbnNmb3JtZXIiLCJ0cmltUmVzdWx0VHJhbnNmb3JtZXIiLCJyZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXIiLCJvbmVMaW5lQ29tbWFMaXN0c0FuZCIsInNlcGFyYXRvciIsImNvbmp1bmN0aW9uIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFQLE1BQXdCLGdCQUF4QjtBQUNBLE9BQU9DLHNCQUFQLE1BQW1DLDJCQUFuQztBQUNBLE9BQU9DLHFCQUFQLE1BQWtDLDBCQUFsQztBQUNBLE9BQU9DLHdCQUFQLE1BQXFDLDZCQUFyQzs7QUFFQSxJQUFNQyx1QkFBdUIsSUFBSUosV0FBSixDQUMzQkMsdUJBQXVCLEVBQUVJLFdBQVcsR0FBYixFQUFrQkMsYUFBYSxLQUEvQixFQUF2QixDQUQyQixFQUUzQkgseUJBQXlCLFVBQXpCLEVBQXFDLEdBQXJDLENBRjJCLEVBRzNCRCxxQkFIMkIsQ0FBN0I7O0FBTUEsZUFBZUUsb0JBQWYiLCJmaWxlIjoib25lTGluZUNvbW1hTGlzdHNBbmQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVGVtcGxhdGVUYWcgZnJvbSAnLi4vVGVtcGxhdGVUYWcnO1xuaW1wb3J0IGlubGluZUFycmF5VHJhbnNmb3JtZXIgZnJvbSAnLi4vaW5saW5lQXJyYXlUcmFuc2Zvcm1lcic7XG5pbXBvcnQgdHJpbVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3RyaW1SZXN1bHRUcmFuc2Zvcm1lcic7XG5pbXBvcnQgcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3JlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lcic7XG5cbmNvbnN0IG9uZUxpbmVDb21tYUxpc3RzQW5kID0gbmV3IFRlbXBsYXRlVGFnKFxuICBpbmxpbmVBcnJheVRyYW5zZm9ybWVyKHsgc2VwYXJhdG9yOiAnLCcsIGNvbmp1bmN0aW9uOiAnYW5kJyB9KSxcbiAgcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyKC8oPzpcXHMrKS9nLCAnICcpLFxuICB0cmltUmVzdWx0VHJhbnNmb3JtZXIsXG4pO1xuXG5leHBvcnQgZGVmYXVsdCBvbmVMaW5lQ29tbWFMaXN0c0FuZDtcbiJdfQ==","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\n\nvar inlineLists = new TemplateTag(inlineArrayTransformer, stripIndentTransformer, trimResultTransformer);\n\nexport default inlineLists;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbmxpbmVMaXN0cy9pbmxpbmVMaXN0cy5qcyJdLCJuYW1lcyI6WyJUZW1wbGF0ZVRhZyIsInN0cmlwSW5kZW50VHJhbnNmb3JtZXIiLCJpbmxpbmVBcnJheVRyYW5zZm9ybWVyIiwidHJpbVJlc3VsdFRyYW5zZm9ybWVyIiwiaW5saW5lTGlzdHMiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFdBQVAsTUFBd0IsZ0JBQXhCO0FBQ0EsT0FBT0Msc0JBQVAsTUFBbUMsMkJBQW5DO0FBQ0EsT0FBT0Msc0JBQVAsTUFBbUMsMkJBQW5DO0FBQ0EsT0FBT0MscUJBQVAsTUFBa0MsMEJBQWxDOztBQUVBLElBQU1DLGNBQWMsSUFBSUosV0FBSixDQUNsQkUsc0JBRGtCLEVBRWxCRCxzQkFGa0IsRUFHbEJFLHFCQUhrQixDQUFwQjs7QUFNQSxlQUFlQyxXQUFmIiwiZmlsZSI6ImlubGluZUxpc3RzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRlbXBsYXRlVGFnIGZyb20gJy4uL1RlbXBsYXRlVGFnJztcbmltcG9ydCBzdHJpcEluZGVudFRyYW5zZm9ybWVyIGZyb20gJy4uL3N0cmlwSW5kZW50VHJhbnNmb3JtZXInO1xuaW1wb3J0IGlubGluZUFycmF5VHJhbnNmb3JtZXIgZnJvbSAnLi4vaW5saW5lQXJyYXlUcmFuc2Zvcm1lcic7XG5pbXBvcnQgdHJpbVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3RyaW1SZXN1bHRUcmFuc2Zvcm1lcic7XG5cbmNvbnN0IGlubGluZUxpc3RzID0gbmV3IFRlbXBsYXRlVGFnKFxuICBpbmxpbmVBcnJheVRyYW5zZm9ybWVyLFxuICBzdHJpcEluZGVudFRyYW5zZm9ybWVyLFxuICB0cmltUmVzdWx0VHJhbnNmb3JtZXIsXG4pO1xuXG5leHBvcnQgZGVmYXVsdCBpbmxpbmVMaXN0cztcbiJdfQ==","import TemplateTag from '../TemplateTag';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\nimport replaceResultTransformer from '../replaceResultTransformer';\n\nvar oneLineInlineLists = new TemplateTag(inlineArrayTransformer, replaceResultTransformer(/(?:\\s+)/g, ' '), trimResultTransformer);\n\nexport default oneLineInlineLists;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vbmVMaW5lSW5saW5lTGlzdHMvb25lTGluZUlubGluZUxpc3RzLmpzIl0sIm5hbWVzIjpbIlRlbXBsYXRlVGFnIiwiaW5saW5lQXJyYXlUcmFuc2Zvcm1lciIsInRyaW1SZXN1bHRUcmFuc2Zvcm1lciIsInJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciIsIm9uZUxpbmVJbmxpbmVMaXN0cyJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBUCxNQUF3QixnQkFBeEI7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxxQkFBUCxNQUFrQywwQkFBbEM7QUFDQSxPQUFPQyx3QkFBUCxNQUFxQyw2QkFBckM7O0FBRUEsSUFBTUMscUJBQXFCLElBQUlKLFdBQUosQ0FDekJDLHNCQUR5QixFQUV6QkUseUJBQXlCLFVBQXpCLEVBQXFDLEdBQXJDLENBRnlCLEVBR3pCRCxxQkFIeUIsQ0FBM0I7O0FBTUEsZUFBZUUsa0JBQWYiLCJmaWxlIjoib25lTGluZUlubGluZUxpc3RzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRlbXBsYXRlVGFnIGZyb20gJy4uL1RlbXBsYXRlVGFnJztcbmltcG9ydCBpbmxpbmVBcnJheVRyYW5zZm9ybWVyIGZyb20gJy4uL2lubGluZUFycmF5VHJhbnNmb3JtZXInO1xuaW1wb3J0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuaW1wb3J0IHJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi9yZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXInO1xuXG5jb25zdCBvbmVMaW5lSW5saW5lTGlzdHMgPSBuZXcgVGVtcGxhdGVUYWcoXG4gIGlubGluZUFycmF5VHJhbnNmb3JtZXIsXG4gIHJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lcigvKD86XFxzKykvZywgJyAnKSxcbiAgdHJpbVJlc3VsdFRyYW5zZm9ybWVyLFxuKTtcblxuZXhwb3J0IGRlZmF1bHQgb25lTGluZUlubGluZUxpc3RzO1xuIl19","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\n\nvar stripIndent = new TemplateTag(stripIndentTransformer, trimResultTransformer);\n\nexport default stripIndent;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdHJpcEluZGVudC9zdHJpcEluZGVudC5qcyJdLCJuYW1lcyI6WyJUZW1wbGF0ZVRhZyIsInN0cmlwSW5kZW50VHJhbnNmb3JtZXIiLCJ0cmltUmVzdWx0VHJhbnNmb3JtZXIiLCJzdHJpcEluZGVudCJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBUCxNQUF3QixnQkFBeEI7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxxQkFBUCxNQUFrQywwQkFBbEM7O0FBRUEsSUFBTUMsY0FBYyxJQUFJSCxXQUFKLENBQ2xCQyxzQkFEa0IsRUFFbEJDLHFCQUZrQixDQUFwQjs7QUFLQSxlQUFlQyxXQUFmIiwiZmlsZSI6InN0cmlwSW5kZW50LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRlbXBsYXRlVGFnIGZyb20gJy4uL1RlbXBsYXRlVGFnJztcbmltcG9ydCBzdHJpcEluZGVudFRyYW5zZm9ybWVyIGZyb20gJy4uL3N0cmlwSW5kZW50VHJhbnNmb3JtZXInO1xuaW1wb3J0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuXG5jb25zdCBzdHJpcEluZGVudCA9IG5ldyBUZW1wbGF0ZVRhZyhcbiAgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lcixcbiAgdHJpbVJlc3VsdFRyYW5zZm9ybWVyLFxuKTtcblxuZXhwb3J0IGRlZmF1bHQgc3RyaXBJbmRlbnQ7XG4iXX0=","import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\n\nvar stripIndents = new TemplateTag(stripIndentTransformer('all'), trimResultTransformer);\n\nexport default stripIndents;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdHJpcEluZGVudHMvc3RyaXBJbmRlbnRzLmpzIl0sIm5hbWVzIjpbIlRlbXBsYXRlVGFnIiwic3RyaXBJbmRlbnRUcmFuc2Zvcm1lciIsInRyaW1SZXN1bHRUcmFuc2Zvcm1lciIsInN0cmlwSW5kZW50cyJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBUCxNQUF3QixnQkFBeEI7QUFDQSxPQUFPQyxzQkFBUCxNQUFtQywyQkFBbkM7QUFDQSxPQUFPQyxxQkFBUCxNQUFrQywwQkFBbEM7O0FBRUEsSUFBTUMsZUFBZSxJQUFJSCxXQUFKLENBQ25CQyx1QkFBdUIsS0FBdkIsQ0FEbUIsRUFFbkJDLHFCQUZtQixDQUFyQjs7QUFLQSxlQUFlQyxZQUFmIiwiZmlsZSI6InN0cmlwSW5kZW50cy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUZW1wbGF0ZVRhZyBmcm9tICcuLi9UZW1wbGF0ZVRhZyc7XG5pbXBvcnQgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lciBmcm9tICcuLi9zdHJpcEluZGVudFRyYW5zZm9ybWVyJztcbmltcG9ydCB0cmltUmVzdWx0VHJhbnNmb3JtZXIgZnJvbSAnLi4vdHJpbVJlc3VsdFRyYW5zZm9ybWVyJztcblxuY29uc3Qgc3RyaXBJbmRlbnRzID0gbmV3IFRlbXBsYXRlVGFnKFxuICBzdHJpcEluZGVudFRyYW5zZm9ybWVyKCdhbGwnKSxcbiAgdHJpbVJlc3VsdFRyYW5zZm9ybWVyLFxuKTtcblxuZXhwb3J0IGRlZmF1bHQgc3RyaXBJbmRlbnRzO1xuIl19","/**\n * Copyright (c) 2025 Microblink Ltd. All rights reserved.\n */\n\n/**\n * Localizations for iOS back dual wide camera.\n */\nexport const backDualWideCameraLocalizations = [\n \"Cameră dublă cu obiectiv superangular spate\",\n \"מצלמה כפולה רחבה אחורית\",\n \"Артқы қос кең бұрышты камера\",\n \"Câmara grande angular dupla traseira\",\n \"Πίσω διπλή ευρεία κάμερα\",\n \"後置雙廣角鏡頭相機\",\n \"Задна двойна широкоъгълна камера\",\n \"Càmera dual posterior amb gran angular\",\n \"Zadná duálna širokouhlá kamera\",\n \"كاميرا خلفية مزدوجة عريضة\",\n \"Задняя двойная широкоугольная камера\",\n \"Задня здвоєна ширококутна камера\",\n \"Cámara amplia posterior doble\",\n \"Dwikamera Lebar Belakang\",\n \"Tylny dwuobiektywowy aparat szerokokątny\",\n \"Dubbel vidvinkelkamera på baksidan\",\n \"Back Dual Wide Camera\",\n \"Hátsó, kettős, széles látószögű kamera\",\n \"후면 듀얼 와이드 카메라\",\n \"Double caméra grand angle arrière\",\n \"Fotocamera doppia con grandangolo (posteriore)\",\n \"Double appareil photo grand angle arrière\",\n \"Zadní duální širokoúhlý fotoaparát\",\n \"Çift Geniş Kamera Arka Yüzü\",\n \"Laajakulmainen kaksoistakakamera\",\n \"Rückseitige Dual-Weitwinkelkamera\",\n \"बैक ड्युअल वाइड कैमरा\",\n \"后置双广角镜头\",\n \"Câmera Dupla Grande-Angular Traseira\",\n \"後置雙廣角相機\",\n \"กล้องคู่ด้านหลังมุมกว้าง\",\n \"Kamera Lebar Belakang Ganda\",\n \"Dobbelt vidvinkelkamera bak\",\n \"Camera kép rộng mặt sau\",\n \"Cámara trasera dual con gran angular\",\n \"背面デュアル広角カメラ\",\n \"Stražnja dvostruka široka kamera\",\n];\n","/**\n * Copyright (c) 2025 Microblink Ltd. All rights reserved.\n */\n\n/**\n * Gets the average of an array of numbers.\n *\n * @param arr - The array of numbers to get the average of.\n * @returns The average of the array.\n */\nexport function getAverage(arr: number[]) {\n return arr.reduce((p, c) => p + c, 0) / arr.length;\n}\n\n/**\n * Converts an unknown value to an error.\n *\n * @param thrown - The value to convert to an error.\n * @returns The error.\n */\nexport const asError = (thrown: unknown): Error => {\n if (thrown instanceof Error) return thrown;\n try {\n return new Error(JSON.stringify(thrown));\n } catch {\n // fallback in case there's an error stringifying.\n // for example, due to circular references.\n return new Error(String(thrown));\n }\n};\n\n/**\n * Gets the key with the highest value in a map.\n *\n * @param map - The map to get the key with the highest value from.\n * @returns The key with the highest value.\n */\nexport function getKeyWithHighestValue(map: Map<string, number>) {\n let maxKey: string | null = null;\n let maxValue = -Infinity;\n\n map.forEach((value, key) => {\n if (value > maxValue) {\n maxValue = value;\n maxKey = key;\n }\n });\n\n return maxKey;\n}\n","/**\n * Copyright (c) 2025 Microblink Ltd. All rights reserved.\n */\n\n/**\n * A camera error code.\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport type CameraErrorCode = \"PERMISSION_DENIED\" | (string & {});\n\n/**\n * A camera error.\n */\nexport class CameraError extends Error {\n code: CameraErrorCode;\n\n /**\n * Creates a new camera error.\n *\n * @param message - The error message.\n * @param code - The error code.\n * @param cause - The cause of the error.\n */\n constructor(message: string, code: CameraErrorCode, cause?: Error) {\n super(message);\n this.code = code;\n this.cause = cause;\n }\n}\n","/**\n * Copyright (c) 2025 Microblink Ltd. All rights reserved.\n */\n\n// TODO: use https://github.com/hexagon/proper-tags\n\nimport { stripIndents } from \"common-tags\";\nimport {\n Camera,\n FacingMode,\n VideoResolutionName,\n videoResolutions,\n} from \"./Camera\";\nimport { isBackCameraName, isFrontCameraName } from \"./cameraNames\";\nimport { backDualWideCameraLocalizations } from \"./iosCameraNames\";\nimport { asError } from \"./utils\";\nimport { CameraError } from \"./cameraError\";\n\n/**\n * Trigger camera permission dialog.\n *\n * @returns resolves when the camera permission is granted\n */\nexport const askForCameraPermission = async () => {\n try {\n const mediaStream = await navigator.mediaDevices.getUserMedia({\n video: true,\n });\n\n closeStreamTracks(mediaStream);\n } catch (error) {\n console.log(error);\n\n const newError = new CameraError(\n \"Camera permission not given\",\n \"PERMISSION_DENIED\",\n asError(error),\n );\n\n throw newError;\n }\n};\n\n/**\n * Returns available camera devices on the user's device.\n *\n * @returns An array of `InputDeviceInfo` objects representing the available camera devices.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/InputDeviceInfo for more details.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/enumerateDevices for more details.\n */\nexport const obtainVideoInputDevices = async () => {\n if (!isSecureContext) {\n throw new Error(stripIndents`\n Cameras can only be used in a secure context:\n https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts\n `);\n }\n\n await askForCameraPermission();\n\n const allDevices = await navigator.mediaDevices.enumerateDevices();\n\n const cameraDevices = allDevices.filter((device) => {\n // we don't check `instanceof` because of mocking in tests\n return device.kind === \"videoinput\";\n });\n\n return cameraDevices as InputDeviceInfo[];\n};\n\n/**\n * Closes all tracks on a media stream.\n *\n * @param stream - The media stream to close.\n */\nexport const closeStreamTracks = (stream: MediaStream) => {\n const tracks = stream.getTracks();\n for (const track of tracks) {\n track.stop();\n }\n};\n\n/**\n * Creates a media stream constraints object.\n *\n * @param resolution - The resolution to create constraints for.\n * @param facing - The facing mode to create constraints for.\n * @param id - The device ID to create constraints for.\n */\nexport const createConstraints = (\n resolution: VideoResolutionName,\n facing?: FacingMode,\n id?: Camera[\"deviceInfo\"][\"deviceId\"],\n) => {\n const constraints: MediaStreamConstraints = {\n video: {\n deviceId: id ? { exact: id } : undefined,\n frameRate: 30,\n aspectRatio: {\n exact:\n videoResolutions[resolution].width /\n videoResolutions[resolution].height,\n },\n width: {\n ideal: videoResolutions[resolution].width,\n },\n height: {\n ideal: videoResolutions[resolution].height,\n },\n facingMode: facing,\n },\n audio: false,\n };\n\n return constraints;\n};\n\n/**\n * Scores a camera based on its capabilities.\n * Higher score means better camera.\n *\n * @param camera - The camera to score.\n * @returns The score of the camera.\n */\nexport function scoreCameraCapabilities(camera: Camera): number {\n let score = 0;\n if (camera.torchSupported) score += 1;\n if (camera.singleShotSupported) score += 1;\n return score;\n}\n\n/**\n * Filters cameras based on facing mode.\n *\n * @param cameras - The cameras to filter.\n * @param requestedFacing - The facing mode to filter by.\n * @returns The filtered cameras.\n */\nexport function filterCamerasByFacing(\n cameras: Camera[],\n requestedFacing: FacingMode,\n): Camera[] {\n return cameras.filter((camera) => {\n if (requestedFacing === \"back\" || requestedFacing === undefined) {\n return isBackCameraName(camera.name);\n } else {\n return isFrontCameraName(camera.name);\n }\n });\n}\n\n/**\n * Finds the ideal camera based on the provided constraints.\n *\n * @param cameras - Available `Camera`s on the device.\n * @param resolution - Ideal resolution for the camera stream, will fall back to the closest available resolution.\n * @param requestedFacing - Ideal facing mode for the camera stream. If not provided, will default to back camera.\n * If no facing mode is available, will return a best effort match.\n *\n * @returns A `Camera` instance that matches the provided constraints, with an active stream.\n */\nexport const findIdealCamera = async (\n cameras: Camera[],\n resolution: VideoResolutionName = \"4k\",\n requestedFacing: FacingMode = \"back\",\n): Promise<Camera> => {\n // if there are no cameras, throw an error\n if (cameras.length === 0) {\n throw new Error(\"No cameras found\");\n }\n\n // if there's only one camera, we can return it immediately\n if (cameras.length === 1) {\n await cameras[0].startStream(resolution);\n return cameras[0];\n }\n\n // Filter cameras by facing mode\n let cameraPool = filterCamerasByFacing(cameras, requestedFacing);\n\n // if there's only one camera in the pool and it matches the requested facing\n // we can return it immediately\n if (cameraPool.length === 1) {\n await cameraPool[0].startStream(resolution);\n return cameraPool[0];\n }\n\n // if there are no cameras in the pool, use all cameras\n if (cameraPool.length === 0) {\n console.debug(\"No camera found with requested facing, using all cameras\");\n cameraPool = cameras;\n }\n\n // early exit for iPhone 12+\n // Dual wide camera is the best, if it exists and requested facing is back\n if (requestedFacing === \"back\") {\n const dualWideCamera = cameraPool.find((camera) =>\n backDualWideCameraLocalizations.includes(camera.name),\n );\n\n if (dualWideCamera) {\n await dualWideCamera.startStream(resolution);\n return dualWideCamera;\n }\n }\n\n // if we're looking for a front camera, return the last one in the pool\n if (requestedFacing === \"front\") {\n const lastCamera = cameraPool[cameraPool.length - 1];\n await lastCamera.startStream(resolution);\n return lastCamera;\n }\n\n // Score and test each camera\n const cameraScores = new Map<Camera, number>();\n let bestCamera: Camera | undefined;\n let maxScore = -Infinity;\n\n // we iterate in reverse order to prioritize the last camera\n // this is usually the best camera on Android\n for (let i = cameraPool.length - 1; i >= 0; i--) {\n const camera = cameraPool[i];\n\n try {\n // Start stream to detect capabilities\n await camera.startStream(resolution);\n\n // Score the camera now that we have its capabilities\n const score = scoreCameraCapabilities(camera);\n cameraScores.set(camera, score);\n\n // Update best camera if this one has a higher score\n if (score > maxScore) {\n // Stop stream on previous best camera if it exists\n if (bestCamera && bestCamera !== camera) {\n bestCamera.stopStream();\n }\n maxScore = score;\n bestCamera = camera;\n } else {\n // Not the best camera, stop its stream\n camera.stopStream();\n }\n\n // Perfect match - has both torch and single shot support\n if (score === 2) {\n console.debug(\"Found camera with all capabilities, returning early\");\n return camera;\n }\n } catch (error) {\n console.warn(`Failed to test camera ${camera.name}:`, error);\n // Stop stream if it was started\n camera.stopStream();\n }\n }\n\n // Return the best camera we found\n if (bestCamera) {\n return bestCamera;\n }\n\n // If we haven't found any working camera, try one last time with the first camera\n const firstCamera = cameraPool[0];\n await firstCamera.startStream(resolution);\n return firstCamera;\n};\n\n/**\n * Creates an array of `Camera` instances with stream from native `deviceInfo` objects.\n *\n * @param cameras - The input device info to create cameras from.\n * @returns The created cameras.\n */\nexport function createCameras(cameras: InputDeviceInfo[]) {\n const camerasWithStream: Camera[] = [];\n\n for (const device of cameras) {\n const camera = new Camera(device);\n if (camera !== null) {\n camerasWithStream.push(camera);\n }\n }\n\n return camerasWithStream;\n}\n","/**\n * Copyright (c) 2025 Microblink Ltd. All rights reserved.\n */\n\nimport { isBackCameraName, isFrontCameraName } from \"./cameraNames\";\nimport { closeStreamTracks, createConstraints } from \"./cameraUtils\";\n\nexport type FacingMode = \"front\" | \"back\" | undefined;\n\n/**\n * Available video resolutions for the camera stream.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints/width for width details.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints/height for height details.\n */\nexport const videoResolutions = {\n \"720p\": { width: 1280, height: 720 },\n \"1080p\": { width: 1920, height: 1080 },\n \"4k\": { width: 3840, height: 2160 },\n} as const satisfies Record<string, Resolution>;\n\n/**\n * Represents a video resolution.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints/width for width details.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints/height for height details.\n */\nexport type Resolution = {\n width: number;\n height: number;\n};\n\n/**\n * Represents a video resolution name.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints/width for width details.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints/height for height details.\n */\nexport type VideoResolutionName = keyof typeof videoResolutions;\n\n/**\n * Returns the longer side of a resolution.\n *\n * @param resolution - The resolution to get the longer side of.\n * @returns The longer side of the resolution.\n */\nexport function returnLongerSide(resolution: Resolution): number {\n return Math.max(resolution.width, resolution.height);\n}\n\n/**\n * Normalizes a resolution to the longer side.\n *\n * @param resolution - The resolution to normalize.\n * @returns The normalized resolution.\n */\nexport function getNormalizedResolution(resolution: Resolution): Resolution {\n const normalized = {\n width: Math.max(resolution.width, resolution.height),\n height: Math.min(resolution.width, resolution.height),\n };\n\n // account for errors in floating point calculations\n const epsilon = 0.0001;\n if (Math.abs(normalized.width / normalized.height - 16 / 9) > epsilon) {\n console.warn(\n `Resolution ${JSON.stringify(\n resolution,\n )} is not 16:9, may cause issues with some video players.`,\n );\n }\n\n return normalized;\n}\n\n/**\n * Matches the closest resolution to the given resolution.\n *\n * @param resolution - The resolution to match.\n * @returns The closest resolution.\n */\nexport function matchClosestResolution(\n resolution: Resolution,\n): VideoResolutionName {\n const actualWidth = returnLongerSide(resolution);\n if (actualWidth > 1920) {\n return \"4k\";\n } else if (actualWidth > 1280) {\n return \"1080p\";\n } else {\n return \"720p\";\n }\n}\n\n/**\n * Finds the closest resolution key to the given resolution.\n *\n * @param videoTrackResolution - The resolution to find the closest key for.\n * @returns The closest resolution key.\n */\nexport function findResolutionKey(\n videoTrackResolution: Resolution,\n): VideoResolutionName {\n // can be inverted in portrait mode on mobile\n const normalizedResolution = getNormalizedResolution(videoTrackResolution);\n // find a matching resolution in `videoResolutions`\n const resolutionMatch = Object.entries(videoResolutions).find(\n ([key, value]) => {\n return (\n value.width === normalizedResolution.width &&\n value.height === normalizedResolution.height\n );\n },\n );\n\n if (!resolutionMatch) {\n const closestMatch = matchClosestResolution(videoTrackResolution);\n\n console.warn(\n `No exact resolution match found for ${JSON.stringify(videoTrackResolution)}, categorizing as ${closestMatch}`,\n );\n\n return closestMatch;\n }\n\n const resolutionKey = resolutionMatch[0] as keyof typeof videoResolutions;\n\n return resolutionKey;\n}\n\n/**\n * Represents a camera device and its active stream.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack/getCapabilities for more details.\n */\nexport class Camera {\n /**\n * The device info.\n */\n deviceInfo: InputDeviceInfo;\n\n /**\n * Stream capabilities as reported by the stream.\n *\n * On iOS it's the same as `deviceCapabilities`. Firefox is only reporting\n * rudimentary capabilities, so we can't rely on this for picking the right\n * camera.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack/getCapabilities\n */\n streamCapabilities?: ReturnType<MediaStreamTrack[\"getCapabilities\"]>;\n activeStream: MediaStream | undefined;\n name: string;\n facingMode: FacingMode;\n torchSupported = false;\n torchEnabled = false;\n singleShotSupported = false;\n maxSupportedResolution?: VideoResolutionName;\n\n /**\n * Reference to the original instance before it was proxied.\n */\n original = this;\n\n notify: (reason?: unknown) => void;\n notifyStateChange?: (camera: Camera, reason?: unknown) => void;\n\n /**\n * Device capabilities as reported by the device.\n *\n * Not available on Firefox.\n * Chrome doesn't report the torch capability, so we have to check for it on the stream.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/InputDeviceInfo/getCapabilities\n *\n * @deprecated Not used. Reconsider using once Firefox and Chrome align on this.\n */\n #deviceCapabilities?: ReturnType<InputDeviceInfo[\"getCapabilities\"]>;\n\n /**\n * Creates a new Camera instance.\n *\n * @param deviceInfo - The device info.\n */\n constructor(deviceInfo: InputDeviceInfo) {\n if (deviceInfo.kind !== \"videoinput\") {\n throw new Error(\"Device is not a video input device\");\n }\n\n this.deviceInfo = deviceInfo;\n this.name = deviceInfo.label;\n\n if (isFrontCameraName(deviceInfo.label)) {\n this.facingMode = \"front\";\n }\n\n if (isBackCameraName(deviceInfo.label)) {\n this.facingMode = \"back\";\n }\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const originalRef = this;\n\n // Apply the proxy to the instance\n const proxy = new Proxy(this, {\n set(target, property, value, receiver) {\n const oldValue = Reflect.get(target, property, receiver);\n\n const change = {\n property,\n oldValue,\n value,\n };\n\n originalRef.notify(change);\n\n return Reflect.set(target, property, value, receiver);\n },\n });\n\n this.notify = (reason?: unknown) => {\n this.notifyStateChange?.(proxy, reason);\n };\n\n // randomly rename the camera every 1-2 seconds\n // setInterval(\n // () => {\n // proxy.name = `${deviceInfo.label} ${Math.random()}`;\n // },\n // Math.random() * 1000 + 1000,\n // );\n\n return proxy;\n }\n\n /**\n * Starts a stream with the specified resolution.\n *\n * @param resolution - The resolution to start the stream with.\n * @returns The stream.\n */\n async startStream(resolution: VideoResolutionName): Promise<MediaStream> {\n if (this.activeStream) {\n return this.activeStream;\n }\n\n // use max supported resolution if we know it\n if (this.maxSupportedResolution) {\n resolution = this.maxSupportedResolution;\n }\n\n const stream = await this.acquireStreamWithFallback(resolution);\n\n this.populateCapabilities(stream);\n this.activeStream = stream;\n\n const videoTrack = stream.getVideoTracks()[0];\n\n // Happens when camera device disconnects\n videoTrack.onended = (e) => {\n this.stopStream();\n this.notify({\n event: e,\n payload: \"TRACK_END\",\n });\n };\n\n return stream;\n }\n\n /**\n * Acquires a camera stream with the specified resolution.\n * If acquisition fails, it tries a lower resolution as fallback.\n *\n * @param resolution - The resolution to acquire the stream with.\n * @returns The stream.\n */\n private async acquireStreamWithFallback(\n resolution: VideoResolutionName,\n ): Promise<MediaStream> {\n try {\n const constraints = createConstraints(\n resolution,\n this.facingMode,\n this.deviceInfo.deviceId,\n );\n\n // can throw if device is currently in use by another process\n return await navigator.mediaDevices.getUserMedia(constraints);\n } catch (error) {\n // This branch shouldn't happen as we are using `ideal` when making\n // constraints, however it's a good fallback to have\n console.warn(\n `Can't get camera stream for ${this.name} at ${resolution}`,\n error,\n );\n\n let currentResolutionIndex =\n Object.keys(videoResolutions).indexOf(resolution);\n\n if (currentResolutionIndex === 0) {\n throw new Error(\"Failed to get camera stream\");\n }\n\n // try a lower index\n const fallbackResolution = Object.keys(videoResolutions)[\n currentResolutionIndex - 1\n ] as VideoResolutionName;\n\n return await this.acquireStreamWithFallback(fallbackResolution);\n }\n }\n\n /**\n * Populates the camera instance with capabilities from the stream.\n *\n * @param stream - The stream to populate the capabilities from.\n */\n private populateCapabilities(stream: MediaStream) {\n this.streamCapabilities = stream.getVideoTracks()[0].getCapabilities();\n\n const videoTrack = stream.getVideoTracks()[0];\n const trackSettings = videoTrack.getSettings();\n\n if (!trackSettings.width || !trackSettings.height) {\n throw new Error(\n \"Video track resolution not available. Should not happen.\",\n );\n }\n\n const videoTrackResolution = {\n width: trackSettings.width,\n height: trackSettings.height,\n };\n\n const resolutionKey = findResolutionKey(videoTrackResolution);\n\n // store the max supported resolution\n if (!this.maxSupportedResolution && resolutionKey) {\n this.maxSupportedResolution = resolutionKey;\n }\n\n if (\"torch\" in this.streamCapabilities) {\n this.torchSupported = true;\n }\n\n if (\n \"focusMode\" in this.streamCapabilities &&\n this.streamCapabilities.focusMode?.includes(\"single-shot\")\n ) {\n this.singleShotSupported = true;\n }\n\n // check for front/back mismatch and correct it\n if (\n this.facingMode === \"front\" &&\n this.streamCapabilities.facingMode?.includes(\"environment\")\n ) {\n this.facingMode = \"back\";\n console.warn(\"Front camera selected, but facingMode is environment\");\n }\n\n if (\n this.facingMode === \"back\" &&\n this.streamCapabilities.facingMode?.includes(\"user\")\n ) {\n this.facingMode = \"front\";\n console.warn(\"Back camera selected, but facingMode is user\");\n }\n\n // no facing mode present on construction\n if (!this.facingMode) {\n if (this.streamCapabilities.facingMode?.includes(\"environment\")) {\n this.facingMode = \"back\";\n }\n if (this.streamCapabilities.facingMode?.includes(\"user\")) {\n this.facingMode = \"front\";\n }\n }\n }\n\n /**\n * Toggles the torch on the camera.\n *\n * @returns The torch status.\n */\n async toggleTorch() {\n const videoTrack = this.getVideoTrack();\n\n if (!videoTrack) {\n throw new Error(\"No active stream on Camera instance.\");\n }\n\n if (!this.torchSupported) {\n throw new Error(\"Torch not supported on this device.\");\n }\n\n try {\n await videoTrack.applyConstraints({\n advanced: [\n {\n torch: !this.torchEnabled,\n },\n ],\n });\n this.torchEnabled = !this.torchEnabled;\n } catch (error) {\n console.error(\"Failed to toggle torch\", error);\n // TODO: check assumption - can it fail even if supported?\n this.torchEnabled = false;\n this.torchSupported = false;\n throw new Error(\"Failed to toggle torch\", { cause: error });\n }\n\n return this.torchEnabled;\n }\n\n /**\n * Stops the stream on the camera.\n */\n stopStream() {\n if (this.activeStream) {\n console.debug(`Stopping active stream on ${this.name}`);\n closeStreamTracks(this.activeStream);\n this.activeStream = undefined;\n this.streamCapabilities = undefined;\n this.torchEnabled = false;\n }\n }\n\n /**\n * Gets the video track on the camera.\n *\n * @returns The video track.\n */\n getVideoTrack() {\n if (!this.activeStream) {\n console.warn(`No active stream on Camera instance: ${this.name}.`);\n return;\n }\n\n return this.activeStream.getVideoTracks()[0];\n }\n}\n","/**\n * Copyright (c) 2025 Microblink Ltd. All rights reserved.\n */\n\nimport { subscribeWithSelector } from \"zustand/middleware\";\nimport { createStore as createZustandStore } from \"zustand/vanilla\";\nimport { Camera, FacingMode } from \"./Camera\";\nimport { CameraError } from \"./cameraError\";\n\n/**\n * The playback state of the camera manager.\n */\nexport type PlaybackState = \"idle\" | \"playback\" | \"capturing\";\n\n/**\n * The camera manager store.\n */\nexport type CameraManagerStore = {\n /**\n * The video element that will display the camera stream.\n */\n videoElement?: HTMLVideoElement;\n\n /**\n * The list of cameras that are available to the user.\n */\n cameras: Camera[];\n\n /**\n * The facing mode filter that will be used to filter the available cameras.\n * Can be a single facing mode or an array of facing modes.\n */\n facingFilter?: FacingMode[];\n\n /**\n * The currently selected camera.\n */\n selectedCamera?: Camera;\n\n /**\n * Capturing / playing / idle.\n */\n playbackState: PlaybackState;\n\n /**\n * Indicates if the camera is currently being swapped.\n */\n isSwappingCamera: boolean;\n\n /**\n * Indicates if camera list is currently being queried.\n */\n isQueryingCameras: boolean;\n\n /**\n * Indicates if the captured frames will be mirrored horizontally\n */\n mirrorX: boolean;\n\n /**\n * If the Camera manager has encountered an error, this will be set to the error.\n */\n errorState?: Error | CameraError;\n};\n\n/**\n * The initial state of the camera manager store.\n *\n * We can use optional properties to select what to reset.\n */\nconst initialState: CameraManagerStore = {\n cameras: [],\n facingFilter: undefined,\n videoElement: undefined,\n playbackState: \"idle\",\n selectedCamera: undefined,\n isSwappingCamera: false,\n isQueryingCameras: false,\n mirrorX: false,\n errorState: undefined,\n};\n\n/**\n * ⚠️ DANGER AHEAD ⚠️\n *\n * The Zustand store. Use only if you know what you're doing.\n *\n * Never set the state as this will break the application logic. We do not have\n * two-way binding. Make sure you only observe the state.\n *\n * Prefer using subscriptions if you require observable state.\n *\n * @see https://github.com/pmndrs/zustand for more details.\n */\nexport const cameraManagerStore = createZustandStore<CameraManagerStore>()(\n // this is important! Otherwise solid-zustand will start mutating the initial state\n subscribeWithSelector(() => structuredClone(initialState)),\n);\n\n/**\n * Resets the store to its initial state.\n *\n * Stops all camera streams as a side effect.\n */\nexport const resetCameraManagerStore = () => {\n console.debug(\"Stopping all cameras and resetting the `cameraManagerStore`.\");\n // Stop all cameras\n cameraManagerStore.getState().cameras.forEach((camera) => {\n camera.stopStream();\n });\n cameraManagerStore.setState(structuredClone(initialState));\n};\n","const ORIGINAL_ATTACH_SHADOW = Element.prototype.attachShadow;\n\n/**\n * Returns true if the environment is relying on the ShadyDOM polyfill.\n */\nfunction isShady() {\n return typeof window.ShadyDOM !== \"undefined\" && typeof ShadowRoot !== \"undefined\";\n}\n/**\n * Returns true if the environment supports ShadowRoots\n */\nfunction supportsShadowRoots() {\n return typeof ShadowRoot !== \"undefined\";\n}\n\n/**\n * Patches Element.prototype.attachShadow such that it can be tracked with root-level MutationObservers\n */\nfunction patchElementPrototypeAttachShadow(callback) {\n // If Shadow DOM is not available, or if it is based on the ShadyDOM polyfill, there's nothing (or no need) to patch\n if (ORIGINAL_ATTACH_SHADOW == null || isShady())\n return;\n Element.prototype.attachShadow = function (shadowRootInitDict) {\n const shadowRoot = ORIGINAL_ATTACH_SHADOW.call(this, shadowRootInitDict);\n // Invoke the callback with the ShadowRoot\n callback(shadowRoot);\n // Return the new ShadowRoot\n return shadowRoot;\n };\n}\n\n/**\n * Creates a PausableQueue.\n */\nfunction createPausableQueue(job, ...queueItems) {\n const queue = new Set(queueItems);\n let running = false;\n const flush = () => {\n for (const queuedNode of queue) {\n job(queuedNode);\n }\n // Clear the queue\n queue.clear();\n };\n return {\n isRunning() {\n return running;\n },\n schedule(node) {\n queue.add(node);\n if (running) {\n flush();\n }\n },\n stop() {\n running = false;\n },\n run() {\n // If the queue is already running, do nothing\n if (running)\n return;\n running = true;\n flush();\n }\n };\n}\n\nconst MUTATION_OBSERVER_INIT = {\n childList: true,\n subtree: true\n};\n\n/**\n * Enqueues the given function for the next microtask\n */\nconst nextMicrotask = (func) => {\n if (typeof queueMicrotask !== \"undefined\")\n queueMicrotask(func);\n else if (typeof Promise !== \"undefined\")\n Promise.resolve().then(() => func());\n else\n setTimeout(() => func(), 0);\n};\n\n/**\n * Converts a NodeList to an array.\n * It may be as easy as spreading it if the environment supports iterable DOM Collections\n */\nfunction nodeListToArray(nodeList) {\n if (typeof Symbol !== \"undefined\" && nodeList[Symbol.iterator] != null) {\n return [...nodeList];\n }\n else {\n const arr = [];\n for (let i = 0; i < nodeList.length; i++) {\n arr[i] = nodeList[i];\n }\n return arr;\n }\n}\n/**\n * Queries the given root if possible and returns an array of Nodes\n * matching that query\n */\nfunction queryRoot(root, query) {\n if (isShady()) {\n return new Set(nodeListToArray(window.ShadyDOM.nativeMethods.querySelectorAll.call(document.documentElement, query)));\n }\n return new Set(!(\"querySelectorAll\" in root) ? [] : nodeListToArray(root.querySelectorAll(query)));\n}\n\n/**\n * Merges the given iterables of Nodes into one\n */\nfunction mergeNodes(a, b) {\n return new Set([...(a == null ? [] : a), ...(b == null ? [] : b)]);\n}\n\nfunction isDocumentOrShadowRoot(root) {\n return \"activeElement\" in root;\n}\nfunction observeMissingRoots(root = document.documentElement) {\n if (isDocumentOrShadowRoot(root)) {\n observeRoot(root);\n }\n // When using the ShadyDOM, we don't need to find all deep roots, but can instead rely on the native/original\n // declaration of querySelectorAll.\n if (isShady() && root instanceof ShadowRoot)\n return;\n // If the browser doesn't support Shadow Roots (polyfilled or not), there's no point in applying additional work at this point\n if (!supportsShadowRoots())\n return;\n const childNodes = root.childNodes;\n const shadowRoot = \"shadowRoot\" in root && root.shadowRoot != null ? [root.shadowRoot] : [];\n for (const node of [...childNodes, ...shadowRoot]) {\n observeMissingRoots(node);\n }\n}\n\nfunction isConnected(node) {\n if (\"isConnected\" in Node.prototype)\n return node.isConnected;\n return node.ownerDocument == null || !(node.ownerDocument.compareDocumentPosition(node) & node.DOCUMENT_POSITION_DISCONNECTED);\n}\n\nconst CONNECTION_OBSERVER_INTERNALS_MAP = new Map();\nfunction initializeConnectionObserver(observer, callback) {\n /**\n * The ConnectionRecord queue\n */\n const queue = new Set();\n /**\n * The Set of all observed targets\n */\n const observedTargets = new Set();\n /**\n * A Map between query selectors and Nodes that matches them\n */\n const rootToQuerySelectorToMatchedNodesMap = new Map();\n /**\n * A WeakMap between Nodes and their last 'connected' value\n */\n const nodeToLastConnectionValueMap = new WeakMap();\n /**\n * Whether a flush is scheduled\n */\n let scheduled = false;\n /**\n * Whether the queue is currently being flushed\n */\n let flushing = false;\n let hasFoundMissingRoots = false;\n /**\n * Flushes the ConnectionRecord queue\n */\n const flush = () => {\n flushing = true;\n const arr = [...queue];\n if (arr.length > 0) {\n callback(arr, observer);\n }\n queue.clear();\n scheduled = false;\n flushing = false;\n };\n /**\n * Schedules a new read/write\n * batch if one isn't pending.\n */\n const scheduleFlush = () => {\n if (!scheduled) {\n scheduled = true;\n nextMicrotask(flush);\n }\n };\n /**\n * Adds the given ConnectionRecord to the queue\n */\n const addToQueue = (entry) => {\n queue.add(entry);\n if (!flushing) {\n scheduleFlush();\n }\n };\n /**\n * Clears the queue and returns the popped contents of it\n */\n const clearQueue = () => {\n const items = [...queue];\n queue.clear();\n return items;\n };\n /**\n * Clears the observed targets\n */\n const clearObservedTargets = () => {\n observedTargets.clear();\n };\n /**\n * Executes the given query on the given root and\n * handles all of the nodes, including any that has been\n * matched previously, as mutations\n */\n const queryRootAndHandleMutationChanges = (root, query) => {\n let oldQuerySelectorMap = rootToQuerySelectorToMatchedNodesMap.get(root);\n // Check which nodes currently match the query\n const currentNodes = queryRoot(root, query);\n // Whatever nodes that has been matched for the query on the target previously\n const oldNodes = oldQuerySelectorMap == null ? undefined : oldQuerySelectorMap.get(query);\n // Combine the nodes matching the query with the ones that did did so previously\n const mergedNodes = mergeNodes(currentNodes, oldNodes);\n handleMutationChange(mergedNodes);\n // Update the observed nodes such that they only consider the currently matched nodes\n if (oldQuerySelectorMap == null) {\n oldQuerySelectorMap = new Map();\n rootToQuerySelectorToMatchedNodesMap.set(root, oldQuerySelectorMap);\n }\n oldQuerySelectorMap.set(query, currentNodes);\n };\n /**\n * Handles a mutation change for a the given target Nodes\n */\n const handleMutationChange = (targetNodes) => {\n for (const targetNode of targetNodes) {\n // Take the cached last connected value of this particular Node\n const lastValue = nodeToLastConnectionValueMap.get(targetNode);\n // Check if it is connected\n const isTargetNodeConnected = isConnected(targetNode);\n // If it isn't equal to the last value, or if there is no last value, invoke the observer\n if (lastValue !== isTargetNodeConnected) {\n nodeToLastConnectionValueMap.set(targetNode, isTargetNodeConnected);\n addToQueue({\n connected: isTargetNodeConnected,\n target: targetNode\n });\n }\n }\n };\n /**\n * Adds the given target to the Set of observed targets\n */\n const addObservedTarget = (target) => {\n // Now that a target node is to observed, run the root observer queue (if it isn't already running)\n rootObserverQueue.run();\n if (!hasFoundMissingRoots) {\n hasFoundMissingRoots = true;\n observeMissingRoots();\n }\n observedTargets.add(target);\n if (typeof target !== \"string\") {\n handleMutationChange([target]);\n }\n else {\n for (const root of OBSERVED_ROOTS) {\n queryRootAndHandleMutationChanges(root, target);\n }\n }\n };\n const internals = {\n observedTargets,\n queryRootAndHandleMutationChanges,\n handleMutationChange,\n addObservedTarget,\n clearObservedTargets,\n clearQueue\n };\n CONNECTION_OBSERVER_INTERNALS_MAP.set(observer, internals);\n}\n\n/**\n * A callback that will be invoked for all MutationRecords\n */\nconst mutationCallback = (mutations) => {\n for (const mutation of mutations) {\n if (mutation.type !== \"childList\")\n continue;\n for (const observer of CONNECTION_OBSERVER_INTERNALS_MAP.values()) {\n for (const target of observer.observedTargets) {\n if (typeof target === \"string\") {\n observer.queryRootAndHandleMutationChanges(mutation.target, target);\n }\n else {\n observer.handleMutationChange([target]);\n }\n }\n }\n }\n};\n\n/**\n * The Set of all observed roots\n */\nconst OBSERVED_ROOTS = new Set();\nconst observeRoot = (() => {\n let instance;\n /**\n * Observes the given root for changes to its childList (including its subtree)\n */\n return function (root) {\n if (OBSERVED_ROOTS.has(root))\n return;\n OBSERVED_ROOTS.add(root);\n if (instance == null) {\n // Prepare MutationObserver right off the bat. Reuse the same instance\n instance = new MutationObserver(mutationCallback);\n }\n instance.observe(root, MUTATION_OBSERVER_INIT);\n };\n})();\n\n// Creates a pausable queue and pass document.documentElement as the initial queue payload\nconst rootObserverQueue = createPausableQueue(observeRoot, document.documentElement);\n\n/**\n * An Observer that tracks the DOM-insertion state of observed nodes across Shadow boundaries.\n */\nclass ConnectionObserver {\n constructor(callback) {\n if (new.target === undefined) {\n throw new TypeError(`Constructor ${ConnectionObserver.name} requires 'new'`);\n }\n // Validate that a Callback is given\n if (callback === undefined) {\n throw new ReferenceError(`Failed to construct '${ConnectionObserver.name}': 1 argument required, but only 0 present.`);\n }\n // Validate that the given callback is in fact a function\n else if (typeof callback !== \"function\") {\n throw new TypeError(`Failed to construct '${ConnectionObserver.name}': The callback provided as parameter 1 is not a function.`);\n }\n // Add this ConnectionObserver to the Set of ConnectionObservers\n initializeConnectionObserver(this, callback);\n }\n /**\n * The Symbol.@@toStringTag value\n */\n get [Symbol.toStringTag]() {\n return `ConnectionObserver`;\n }\n /**\n * Observe the given node or query selector for connections/disconnections.\n * If given a Node, that specific Node will be observed. If given a query selector, such\n * as for example \"img[data-some-attr]\", for each new MutationRecord, the query selector\n * will be executed and the matched nodes will be observed for connections/disconnections\n */\n observe(target) {\n // Ensure that a target is given\n if (target === undefined) {\n throw new ReferenceError(`Failed to execute '${this.observe.name}' on '${ConnectionObserver.name}': 1 argument required, but only 0 present.`);\n }\n // Ensure that it is in fact a Node\n else if (typeof target !== \"string\" && !(target instanceof Node)) {\n throw new TypeError(`Failed to execute '${this.observe.name}' on '${ConnectionObserver.name}': parameter 1 is not of type 'Node' or a DOMString.`);\n }\n const internals = CONNECTION_OBSERVER_INTERNALS_MAP.get(this);\n if (internals == null)\n return;\n // Mark the target as observed\n internals.addObservedTarget(target);\n }\n /**\n * Takes the records immediately (instead of waiting for the next flush)\n */\n takeRecords() {\n const internals = CONNECTION_OBSERVER_INTERNALS_MAP.get(this);\n if (internals == null)\n return [];\n return internals.clearQueue();\n }\n /**\n * Disconnects the ConnectionObserver such that none of its callbacks will be invoked any longer\n */\n disconnect() {\n const internals = CONNECTION_OBSERVER_INTERNALS_MAP.get(this);\n if (internals == null)\n return;\n internals.clearObservedTargets();\n }\n}\n\n// Patch attachShadow such that we can track Shadow roots. Pass new ShadowRoots on to the root observer queue\npatchElementPrototypeAttachShadow(rootObserverQueue.schedule.bind(rootObserverQueue));\n\nexport { ConnectionObserver };\n//# sourceMappingURL=index.js.map\n","export function radEventListener(element, \n// recreate the args for addEventListener\n...args) {\n element.addEventListener(...args);\n return () => {\n element.removeEventListener(...args);\n };\n}\nexport { radEventListener as on };\nexport function rad(element, gen) {\n let cleanup;\n gen((listener, options) => {\n element.addEventListener(listener, options);\n cleanup = () => element.removeEventListener(listener, options);\n });\n if (!cleanup) {\n throw new Error(\"you forgot to add event listener\");\n }\n return cleanup;\n}\n","/**\n * Copyright (c) 2025 Microblink Ltd. All rights reserved.\n */\n\nexport type CanvasRenderingMode = \"2d\" | \"webgl2\";\nexport type ImageSource = HTMLVideoElement | HTMLCanvasElement | ImageBitmap;\n\n/**\n * Options for the VideoFrameProcessor.\n */\nexport type VideoFrameProcessorInitOptions = {\n canvasRenderingMode?: CanvasRenderingMode;\n fallbackWebGlTo2d?: boolean;\n};\n\n/**\n * Check if an ArrayBuffer is detached\n * @param buffer - ArrayBuffer to check\n * @returns true if the buffer is detached, false otherwise\n */\nexport function isBufferDetached(buffer: ArrayBuffer): boolean {\n const actualBuffer = getBuffer(buffer);\n // es2024\n if (\"detached\" in actualBuffer) {\n const detached = actualBuffer.detached as boolean;\n return detached;\n }\n // fallback\n try {\n // Try to create a view on the buffer\n new Uint8Array(actualBuffer);\n return false; // If successful, buffer is not detached\n } catch (e) {\n return true; // If it throws, buffer is detached\n }\n}\n\n/**\n * The extraction area.\n */\nexport type ExtractionArea = {\n x: number;\n y: number;\n width: number;\n height: number;\n};\n\n/**\n * VideoFrameProcessor captures frames from video or image sources using either 2D or WebGL2 rendering\n */\nexport class VideoFrameProcessor {\n #canvas: HTMLCanvasElement;\n #context2d: CanvasRenderingContext2D | null = null;\n #contextWebGl2: WebGL2RenderingContext | null = null;\n #webGl2Texture: WebGLTexture | null = null;\n #webGl2Framebuffer: WebGLFramebuffer | null = null;\n #buffer: Uint8ClampedArray | null = null;\n #cachedWidth = 0;\n #cachedHeight = 0;\n #canvasRenderingMode: CanvasRenderingMode;\n #requiredPackAlignment = 4;\n\n /**\n * Creates a new VideoFrameProcessor.\n *\n * @param options - The options for the VideoFrameProcessor.\n */\n constructor(options: VideoFrameProcessorInitOptions = {}) {\n const { canvasRenderingMode = \"webgl2\", fallbackWebGlTo2d = true } =\n options;\n\n this.#canvasRenderingMode = canvasRenderingMode;\n this.#canvas = document.createElement(\"canvas\");\n\n // Initialize rendering context\n if (canvasRenderingMode === \"2d\") {\n this.#initialize2dContext();\n } else if (canvasRenderingMode === \"webgl2\") {\n try {\n this.#initializeWebGl2Context();\n } catch (error) {\n if (fallbackWebGlTo2d) {\n console.warn(\n \"Failed to create WebGL2 context, falling back to 2D canvas\",\n );\n this.#canvasRenderingMode = \"2d\";\n this.#initialize2dContext();\n } else {\n throw error;\n }\n }\n } else {\n throw new Error(\n `Unsupported rendering context: ${canvasRenderingMode as CanvasRenderingMode}`,\n );\n }\n }\n\n /**\n * Initializes the 2D canvas context.\n */\n #initialize2dContext(): void {\n const ctx = this.#canvas.getContext(\"2d\", {\n alpha: false,\n willReadFrequently: true,\n });\n if (!ctx) throw new Error(\"CanvasRenderingContext2D is missing!\");\n this.#context2d = ctx;\n }\n\n /**\n * Initializes the WebGL2 context and resources.\n */\n #initializeWebGl2Context(): void {\n // Create and configure WebGL2 context\n const ctx = this.#canvas.getContext(\"webgl2\", {\n alpha: false,\n depth: false,\n stencil: false,\n antialias: false,\n premultipliedAlpha: false,\n preserveDrawingBuffer: false,\n desynchronized: false,\n powerPreference: \"high-performance\",\n });\n if (!ctx) throw new Error(\"WebGL2RenderingContext is missing!\");\n this.#contextWebGl2 = ctx;\n\n // Create texture\n const texture = ctx.createTexture();\n if (!texture) throw new Error(\"Failed to create WebGL texture\");\n this.#webGl2Texture = texture;\n\n // Configure texture\n ctx.bindTexture(ctx.TEXTURE_2D, texture);\n ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_WRAP_S, ctx.CLAMP_TO_EDGE);\n ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_WRAP_T, ctx.CLAMP_TO_EDGE);\n ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_MIN_FILTER, ctx.NEAREST);\n ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_MAG_FILTER, ctx.NEAREST);\n\n // Create framebuffer\n const framebuffer = ctx.createFramebuffer();\n if (!framebuffer) throw new Error(\"Failed to create framebuffer\");\n this.#webGl2Framebuffer = framebuffer;\n\n // Configure framebuffer\n ctx.bindFramebuffer(ctx.FRAMEBUFFER, framebuffer);\n ctx.framebufferTexture2D(\n ctx.FRAMEBUFFER,\n ctx.COLOR_ATTACHMENT0,\n ctx.TEXTURE_2D,\n texture,\n 0,\n );\n }\n\n /**\n * Returns ownership of an ArrayBuffer to the processor for reuse.\n *\n * This should only be called with ArrayBuffers that were originally from this processor.\n * Typically used after transferring the buffer to/from a worker.\n *\n * @param arrayBuffer - The array buffer to reattach.\n */\n reattachArrayBuffer(arrayBuffer: ArrayBufferLike): void {\n // Might be a view, so get the underlying buffer\n const actualBuffer = getBuffer(arrayBuffer);\n\n if (isBufferDetached(actualBuffer)) {\n throw new Error(\"Can't use a detached array buffer!\");\n }\n\n const requiredSize = this.#cachedWidth * this.#cachedHeight * 4;\n\n // Only accept buffers that match our expected size\n if (actualBuffer.byteLength === requiredSize) {\n this.#buffer = new Uint8ClampedArray(actualBuffer);\n } else {\n throw new Error(\n `ArrayBuffer size mismatch: expected ${requiredSize}, got ${actualBuffer.byteLength}`,\n );\n }\n }\n\n /**\n * Used to check if the processor owns the buffer.\n *\n * @returns true if the processor owns the buffer, false otherwise.\n */\n isBufferDetached(): boolean {\n if (!this.#buffer) {\n throw new Error(\"Buffer is missing!\");\n }\n return isBufferDetached(this.#buffer.buffer);\n }\n\n /**\n * Extracts image data from a source element.\n *\n * @param source - The source element to extract image data from.\n * @param area - The extraction area.\n * @returns The image data.\n */\n getImageData(source: ImageSource, area?: ExtractionArea): ImageData {\n return this.#canvasRenderingMode === \"2d\"\n ? this.#getImageData2d(source, area)\n : this.#getImageDataWebGl2(source, area);\n }\n\n /**\n * Used to get the current ImageData object with the current buffer. Useful\n * when you need to get the same `ImageData` object multiple times after the\n * original `ImageData` buffer has been detached\n *\n * @returns ImageData object with the current buffer\n */\n getCurrentImageData(): ImageData {\n if (!this.#buffer) {\n throw new Error(\"Buffer is missing!\");\n }\n return new ImageData(this.#buffer, this.#cachedWidth, this.#cachedHeight);\n }\n\n /**\n * Extract image data using 2D canvas.\n *\n * @param source - The source element to extract image data from.\n * @param area - The extraction area.\n * @returns The image data.\n */\n #getImageData2d(source: ImageSource, area?: ExtractionArea): ImageData {\n if (!this.#context2d)\n throw new Error(\"CanvasRenderingContext2D is missing!\");\n\n const fullWidth = \"videoWidth\" in source ? source.videoWidth : source.width;\n const fullHeight =\n \"videoHeight\" in source ? source.videoHeight : source.height;\n\n // Use area dimensions if provided, otherwise use full dimensions\n const x = area?.x ?? 0;\n const y = area?.y ?? 0;\n const w = area?.width ?? fullWidth;\n const h = area?.height ?? fullHeight;\n\n // Resize canvas if source dimensions change, or if the area is different\n this.#updateCanvasSize(w, h);\n\n // Draw source and extract pixels\n this.#context2d.drawImage(source, x, y, w, h);\n return this.#context2d.getImageData(0, 0, w, h);\n }\n\n /**\n * Extract image data using WebGL2.\n *\n * @param source - The source element to extract image data from.\n * @param area - The extraction area.\n * @returns The image data.\n */\n #getImageDataWebGl2(source: ImageSource, area?: ExtractionArea): ImageData {\n if (\n !this.#contextWebGl2 ||\n !this.#webGl2Texture ||\n !this.#webGl2Framebuffer\n ) {\n throw new Error(\"WebGL2 context or resources are missing!\");\n }\n\n const fullWidth = \"videoWidth\" in source ? source.videoWidth : source.width;\n const fullHeight =\n \"videoHeight\" in source ? source.videoHeight : source.height;\n\n // Use area dimensions if provided, otherwise use full dimensions\n const x = area?.x ?? 0;\n const y = area?.y ?? 0;\n const w = area?.width ?? fullWidth;\n const h = area?.height ?? fullHeight;\n\n // Resize canvas if source dimensions change, or if the area is different\n\n const requiredSize = w * h * 4;\n\n // Resize canvas if needed\n this.#updateCanvasSize(w, h);\n\n // Prepare buffer\n // Check for detached buffer\n if (this.isBufferDetached()) {\n throw new Error(\"Buffer is detached!\");\n }\n\n // Ensure buffer size matches requirements\n if (!this.#buffer || this.#buffer.length !== requiredSize) {\n this.#buffer = new Uint8ClampedArray(requiredSize);\n }\n\n // Draw source to texture\n const gl = this.#contextWebGl2;\n gl.bindTexture(gl.TEXTURE_2D, this.#webGl2Texture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);\n gl.bindFramebuffer(gl.FRAMEBUFFER, this.#webGl2Framebuffer);\n\n // Read pixels\n try {\n gl.pixelStorei(gl.PACK_ALIGNMENT, this.#requiredPackAlignment);\n gl.readPixels(x, y, w, h, gl.RGBA, gl.UNSIGNED_BYTE, this.#buffer);\n } catch (error) {\n // Try fallback to alignment=1 if not already using it\n if (this.#requiredPackAlignment !== 1) {\n this.#requiredPackAlignment = 1;\n gl.pixelStorei(gl.PACK_ALIGNMENT, 1);\n\n // Create fresh buffer since the previous one may be in an undefined state\n const newBuffer = new Uint8ClampedArray(requiredSize);\n gl.readPixels(0, 0, w, h, gl.RGBA, gl.UNSIGNED_BYTE, newBuffer);\n\n // Use the new buffer\n this.#buffer = newBuffer;\n\n return new ImageData(newBuffer, w, h);\n }\n throw error;\n }\n\n return new ImageData(this.#buffer, w, h);\n }\n\n /**\n * Update canvas dimensions if needed.\n *\n * This canvas is the orientation-aware.\n *\n * @param width - The width of the canvas.\n * @param height - The height of the canvas.\n */\n #updateCanvasSize(width: number, height: number): void {\n if (this.#cachedWidth !== width || this.#cachedHeight !== height) {\n this.#canvas.width = width;\n this.#canvas.height = height;\n this.#cachedWidth = width;\n this.#cachedHeight = height;\n\n // Reset buffer when dimensions change\n const requiredSize = width * height * 4;\n\n this.#buffer = new Uint8ClampedArray(requiredSize);\n }\n }\n\n /**\n * Clean up resources.\n */\n dispose(): void {\n if (this.#contextWebGl2) {\n if (this.#webGl2Texture) {\n this.#contextWebGl2.deleteTexture(this.#webGl2Texture);\n this.#webGl2Texture = null;\n }\n if (this.#webGl2Framebuffer) {\n this.#contextWebGl2.deleteFramebuffer(this.#webGl2Framebuffer);\n this.#webGl2Framebuffer = null;\n }\n }\n this.#context2d = null;\n this.#contextWebGl2 = null;\n this.#buffer = null;\n }\n}\n\n/**\n * Converts a view to a buffer, since both match the type signature of\n * `ArrayBufferLike`.\n *\n * @param buffer - The buffer or view to convert\n * @returns The actual underlying buffer\n */\nexport const getBuffer = (buffer: ArrayBufferLike) => {\n // check if it's a view\n if (ArrayBuffer.isView(buffer)) {\n return buffer.buffer;\n } else {\n return buffer;\n }\n};\n","/**\n * Copyright (c) 2025 Microblink Ltd. All rights reserved.\n */\n\nimport { ConnectionObserver } from \"@wessberg/connection-observer\";\nimport { rad, radEventListener } from \"rad-event-listener\";\n\nimport { Camera, FacingMode, VideoResolutionName } from \"./Camera\";\nimport {\n createCameras,\n findIdealCamera,\n obtainVideoInputDevices,\n} from \"./cameraUtils\";\nimport { CameraError } from \"./cameraError\";\n\nimport {\n PlaybackState,\n resetCameraManagerStore as resetStore,\n cameraManagerStore as store,\n} from \"./cameraManagerStore\";\n\nimport { stripIndents } from \"common-tags\";\nimport { Promisable } from \"type-fest\";\nimport { asError } from \"./utils\";\nimport {\n ExtractionArea,\n isBufferDetached,\n VideoFrameProcessor,\n VideoFrameProcessorInitOptions,\n} from \"./VideoFrameProcessor\";\n\n/**\n * A callback that will be triggered on each frame when the playback state is\n * \"capturing\".\n *\n * @param frame - The frame to capture.\n * @returns The frame.\n */\nexport type FrameCaptureCallback = (\n frame: ImageData,\n) => Promisable<ArrayBufferLike | void>;\n\n/**\n * A camera getter.\n *\n * @param cameras - The cameras to get.\n * @returns The camera.\n */\ntype CameraGetter = (cameras: Camera[]) => Camera | undefined;\n\n/**\n * A camera preference.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints/facingMode for facing mode details.\n */\nexport type CameraPreference =\n | {\n // Only a camera is provided.\n preferredCamera: Camera | undefined; // undefined means \"auto\"\n preferredFacing?: undefined;\n }\n | {\n // Only a camera getter is provided.\n preferredCamera: CameraGetter | undefined; // undefined means \"auto\"\n preferredFacing?: undefined;\n }\n | {\n // Only a facing is provided.\n preferredFacing: FacingMode;\n preferredCamera?: undefined;\n }\n | {\n // Neither is provided.\n preferredCamera?: undefined;\n preferredFacing?: undefined;\n };\n\n/**\n * Options for starting a camera stream.\n *\n * @param autoplay - If true, the camera stream will be started automatically.\n * @param preferredCamera - The camera to start the stream with.\n * @param preferredFacing - The facing mode to start the stream with.\n */\nexport type StartCameraStreamOptions = {\n autoplay?: boolean;\n} & CameraPreference;\n\n/**\n * Options for the CameraManager.\n *\n * @param mirrorFrontCameras - If true, front-facing cameras will be mirrored horizontally when started.\n */\nexport type CameraManagerOptions = {\n /** If true, the camera stream will be mirrored horizontally when started. */\n mirrorFrontCameras: boolean;\n};\n\n/**\n * Default options for the CameraManager.\n */\nexport const defaultCameraManagerOptions: CameraManagerOptions = {\n mirrorFrontCameras: true,\n} as const;\n\n/**\n * The CameraManager class.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack/getCapabilities for more details.\n */\nexport class CameraManager {\n #resumeRequest?: Exclude<PlaybackState, \"idle\">;\n #resolution: VideoResolutionName = \"4k\";\n #extractionArea?: ExtractionArea;\n\n #videoFrameRequestId:\n | ReturnType<HTMLVideoElement[\"requestVideoFrameCallback\"]>\n | undefined;\n #videoFrameProcessor: VideoFrameProcessor;\n #mirrorFrontCameras: boolean;\n\n #eventListenerCleanup?: () => void;\n\n /**\n * If true, the user has initiated an abort. This will prevent the\n * CameraManager from throwing errors when the user interrupts the process.\n */\n #userInitiatedAbort = false;\n\n /**\n * If true, the user has initiated an abort. This will prevent the\n * CameraManager from throwing errors when the user interrupts the process.\n */\n get userInitiatedAbort() {\n return this.#userInitiatedAbort;\n }\n\n set userInitiatedAbort(value: boolean) {\n this.#userInitiatedAbort = value;\n }\n\n /**\n * Sets the area of the video frame that will be extracted.\n *\n * @param extractionArea The area of the video frame that will be extracted.\n */\n setExtractionArea(extractionArea: ExtractionArea) {\n this.#extractionArea = extractionArea;\n }\n\n /**\n * Callbacks that will be triggered on each frame when the playback state is\n * \"capturing\".\n */\n #frameCaptureCallbacks = new Set<FrameCaptureCallback>();\n\n /**\n * Creates a new CameraManager instance.\n *\n * @param options - The options for the CameraManager.\n * @param videoFrameProcessorOptions - The options for the VideoFrameProcessor.\n */\n constructor(\n options: Partial<CameraManagerOptions> = {},\n videoFrameProcessorOptions?: VideoFrameProcessorInitOptions,\n ) {\n const { mirrorFrontCameras }: CameraManagerOptions = {\n ...defaultCameraManagerOptions,\n ...options,\n };\n\n this.#videoFrameProcessor = new VideoFrameProcessor(\n videoFrameProcessorOptions,\n );\n this.#mirrorFrontCameras = mirrorFrontCameras;\n }\n\n /**\n * Sets the resolution of the camera stream.\n *\n * @param resolution - The resolution to set.\n */\n setResolution = async (resolution: VideoResolutionName) => {\n this.#resolution = resolution;\n\n const playbackState = this.getState().playbackState;\n\n if (playbackState !== \"idle\") {\n this.#resumeRequest = playbackState;\n this.stopStream();\n await this.startCameraStream();\n }\n };\n\n /**\n * The resolution of the camera stream.\n */\n get resolution() {\n return this.#resolution;\n }\n\n /**\n * True if there is a video playing or capturing\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/MediaSession/playbackState for more details.\n */\n get isActive() {\n // TODO: see if we can simplify this, by observing the video playback state\n return store.getState().playbackState !== \"idle\";\n }\n\n /**\n * Sets the facing filter.\n *\n * @param facingFilter - The facing filter.\n */\n setFacingFilter(facingFilter: FacingMode[]) {\n store.setState({\n facingFilter,\n });\n }\n\n /**\n * Returns the cameras that are available to the user, filtered by the facing mode.\n * If no facing mode is set, all cameras are returned.\n *\n * @returns The cameras that are available to the user, filtered by the facing mode.\n */\n async getCameraDevices() {\n let allCameras = store.getState().cameras;\n const facingFilter = store.getState().facingFilter;\n\n if (!allCameras.length) {\n await this.refreshCameraDevices();\n }\n\n // get fresh state\n allCameras = store.getState().cameras;\n\n if (!facingFilter) {\n return allCameras;\n }\n\n const filteredCameras = allCameras.filter((camera) =>\n facingFilter.includes(camera.facingMode),\n );\n\n return filteredCameras;\n }\n\n /**\n * Single-time setup for a video element.\n *\n * @param videoElement - The video element to initialize.\n */\n #initVideoElement(videoElement: HTMLVideoElement) {\n if (!(videoElement instanceof HTMLVideoElement)) {\n throw new Error(\n `Expected an HTMLVideoElement, got ${typeof videoElement}`,\n {\n cause: videoElement,\n },\n );\n }\n\n store.setState({\n videoElement,\n });\n\n const videoEventCleanup = rad(videoElement, (add) => {\n const events: (keyof HTMLVideoElementEventMap)[] = [\n \"abort\",\n // \"error\",\n // \"canplay\",\n // \"canplaythrough\",\n // \"loadeddata\",\n // \"loadedmetadata\",\n // \"play\",\n // \"playing\",\n // \"pause\",\n // \"waiting\",\n // \"seeking\",\n // \"seeked\",\n // \"ended\",\n // \"stalled\",\n // \"suspend\",\n // \"timeupdate\",\n // \"ratechange\",\n // \"durationchange\",\n ];\n events.forEach((event) => {\n add(event, () => {\n console.debug(`Video event: ${event}`);\n });\n });\n });\n\n // video disconnect / dismount callback\n const connectionObserver = new ConnectionObserver((entries) => {\n if (!entries[0].connected) {\n this.releaseVideoElement();\n }\n });\n connectionObserver.observe(videoElement);\n\n // set up video for autoplay\n videoElement.setAttribute(\"playsInline\", \"\");\n videoElement.setAttribute(\"muted\", \"\");\n videoElement.controls = false;\n\n // add event listener which will pause the stream\n // when the website is in the background\n let previousPlaybackState: PlaybackState = \"idle\";\n\n // TODO: doesn't work if document is unfocused during stream starting\n const cleanupVisibilityListener = radEventListener(\n document,\n \"visibilitychange\",\n async () => {\n const isHidden = document.hidden;\n\n if (isHidden) {\n previousPlaybackState = store.getState().playbackState;\n this.stopStream();\n return;\n }\n\n // Visible again\n // Resume stream when document becomes visible\n switch (previousPlaybackState) {\n case \"playback\":\n await this.startCameraStream();\n await this.startPlayback();\n break;\n case \"capturing\":\n await this.startCameraStream();\n await this.startFrameCapture();\n break;\n }\n },\n );\n\n this.#eventListenerCleanup = () => {\n cleanupVisibilityListener();\n videoEventCleanup();\n };\n }\n\n /**\n * Initializes the CameraManager with a video element.\n *\n * @param videoElement - The video element to initialize.\n */\n initVideoElement(videoElement: HTMLVideoElement) {\n try {\n this.#initVideoElement(videoElement);\n } catch (error) {\n if (this.userInitiatedAbort) {\n this.reset();\n } else {\n throw error;\n }\n }\n }\n\n /**\n * Adds a callback that will be triggered on each frame when the playback state\n * is \"capturing\".\n *\n * @param frameCaptureCallback - The callback to add.\n * @returns a cleanup function to remove the callback\n */\n addFrameCaptureCallback(frameCaptureCallback: FrameCaptureCallback) {\n this.#frameCaptureCallbacks.add(frameCaptureCallback);\n return () => this.#frameCaptureCallbacks.delete(frameCaptureCallback);\n }\n\n /**\n * Cleans up the video element, and stops the stream.\n */\n releaseVideoElement() {\n this.#eventListenerCleanup?.();\n store.setState({\n videoElement: undefined,\n });\n this.stopStream();\n }\n\n // TODO: might become a private method in the future as an implementation detail of `startStream`\n /**\n * Select a camera device from available ones.\n *\n * @param camera - The camera to select.\n */\n async selectCamera(camera: Camera) {\n // DOES NOT MODIFY playbackState\n\n // if playing or capturing frames, we need to resume after we're done swapping\n const playbackState = store.getState().playbackState;\n\n if (playbackState !== \"idle\") {\n this.#resumeRequest = playbackState;\n }\n\n const state = store.getState();\n\n // no-op if we're already selected\n if (state.selectedCamera === camera) {\n console.debug(\"Already selected\");\n return;\n }\n\n // prevent race conditions\n if (state.isSwappingCamera) {\n console.debug(\"Already swapping\");\n return;\n }\n\n store.setState({\n isSwappingCamera: true,\n });\n\n // stop the previous camera stream if it exists\n if (state.selectedCamera?.activeStream) {\n console.debug(\"Stopping previous stream\");\n state.selectedCamera.stopStream();\n }\n\n // clear the video element source\n if (state.videoElement) {\n state.videoElement.srcObject = null;\n }\n\n store.setState({\n selectedCamera: camera,\n isSwappingCamera: false,\n });\n\n if (this.#resumeRequest === \"playback\") {\n console.debug(\"Starting new stream\");\n await this.startPlayback();\n }\n\n if (this.#resumeRequest === \"capturing\") {\n console.debug(\"Resuming frame capture\");\n await this.startFrameCapture();\n }\n\n // remove the resume request\n this.#resumeRequest = undefined;\n }\n\n /**\n * Refreshes available devices on the system and updates the state.\n *\n * @returns resolves when the camera devices are refreshed\n */\n async refreshCameraDevices() {\n // prevent race conditions\n if (\n store.getState().isQueryingCameras ||\n store.getState().isSwappingCamera\n ) {\n console.debug(\"Already querying cameras\");\n return;\n }\n\n store.setState({\n isQueryingCameras: true,\n });\n\n const availableCameras = await obtainVideoInputDevices().catch((err) => {\n store.setState({\n errorState: asError(err),\n isQueryingCameras: false,\n });\n // rethrow error\n throw err;\n });\n\n const cameras = createCameras(availableCameras);\n\n cameras.forEach((camera) => {\n // avoid reassigning listeners\n if (camera.notifyStateChange) {\n return;\n }\n\n camera.notifyStateChange = (camInstance, reason) => {\n // TODO: Why does `queueMicrotask` or `setTimeout` work here?\n window.queueMicrotask(() => {\n store.setState({\n cameras: [...store.getState().cameras],\n });\n\n const selectedCamera = store.getState().selectedCamera;\n\n if (!selectedCamera) {\n return;\n }\n\n let streamError: Error | undefined;\n\n if (\n typeof reason === \"object\" &&\n reason !== null &&\n \"payload\" in reason &&\n reason.payload === \"TRACK_END\"\n ) {\n streamError = new Error(\"Camera stream ended unexpectedly\");\n }\n\n if (camInstance === selectedCamera) {\n store.setState({\n selectedCamera,\n errorState: streamError,\n });\n }\n });\n };\n });\n\n store.setState({\n cameras: cameras,\n isQueryingCameras: false,\n });\n }\n\n /**\n * Starts the video playback\n *\n * @returns resolves when playback starts\n */\n async startPlayback() {\n const state = store.getState();\n\n // No-op if we're already playing.\n if (this.isActive && !this.#resumeRequest) {\n // console.debug(\"Already playing\");\n return;\n }\n\n if (!state.videoElement) {\n console.warn(\"Starting playback - no video element present.\");\n return;\n }\n\n if (!state.selectedCamera) {\n console.warn(\"Select a camera first.\");\n return;\n }\n\n // assign new stream if it doesn't exist\n if (!state.selectedCamera.activeStream) {\n const stream = await state.selectedCamera.startStream(this.resolution);\n state.videoElement.srcObject = stream;\n }\n\n try {\n this.#applyMirrorIfNeeded();\n\n await state.videoElement.play();\n store.setState({\n playbackState: \"playback\",\n });\n } catch (error) {\n console.error(\"Failed to start playback\", error);\n store.setState({\n errorState: asError(error),\n });\n throw error;\n }\n }\n\n /**\n * Starts playback and frame capturing.\n *\n * @returns resolves when frame capture starts\n */\n async #startFrameCapture() {\n const state = store.getState();\n\n if (this.userInitiatedAbort) {\n return;\n }\n\n // No-op if we're already capturing frames\n if (\n state.playbackState === \"capturing\" &&\n this.#resumeRequest !== \"capturing\"\n ) {\n return;\n }\n // otherwise, we're resuming or starting\n\n if (!state.videoElement) {\n console.warn(\n \"Missing video element. Setup a video element first using `initVideoElement`\",\n );\n return;\n }\n\n if (!state.selectedCamera) {\n console.warn(\n \"No active camera! Select a camera first, or use `startCameraStream`\",\n );\n return;\n }\n\n await this.startPlayback();\n\n store.setState({\n playbackState: \"capturing\",\n });\n\n this.#queueFrame();\n\n this.#resumeRequest = undefined;\n }\n\n /**\n * Starts capturing frames from the video element.\n *\n * @returns resolves when frame capture starts\n */\n startFrameCapture = async () => {\n try {\n await this.#startFrameCapture();\n } catch (error) {\n if (this.userInitiatedAbort) {\n this.reset();\n } else {\n throw error;\n }\n }\n };\n\n /**\n * Starts a camera stream.\n *\n * @param params - The parameters for the camera stream.\n * @returns resolves when the camera stream starts\n */\n async #startCameraStream({\n autoplay = true,\n preferredCamera,\n preferredFacing,\n }: StartCameraStreamOptions = {}) {\n const videoElement = store.getState().videoElement;\n\n if (!videoElement) {\n console.warn(\"Can't start stream without a video element\");\n return;\n }\n\n if (this.isActive && !this.#resumeRequest) {\n console.warn(\"Already streaming\");\n return;\n }\n\n // Use the preferred camera if provided\n if (preferredCamera instanceof Camera) {\n await this.selectCamera(preferredCamera);\n }\n\n if (!store.getState().selectedCamera) {\n // Select a camera if none is preselected\n try {\n // This returns a list of cameras filtered by facing mode\n const cameras = await this.getCameraDevices();\n\n let selectedCamera: Camera | undefined;\n\n if (!cameras.length) {\n console.log(\"Camera list is empty\");\n throw new Error(\n `No cameras found matching the filter ${preferredFacing}`,\n );\n }\n\n // If a camera getter is provided, use it to select the camera\n // from the available cameras\n if (typeof preferredCamera === \"function\") {\n selectedCamera = preferredCamera(cameras);\n if (!selectedCamera) {\n console.warn(\n `No camera found matching the preferred camera function, falling back to facing mode`,\n );\n }\n }\n\n // Otherwise, use use the `findIdealCamera` function to select the camera\n if (!selectedCamera) {\n selectedCamera = await findIdealCamera(\n cameras,\n this.resolution,\n preferredFacing,\n );\n }\n\n if (!selectedCamera) {\n throw new Error(\n `No cameras found matching the filter ${preferredFacing}`,\n );\n }\n\n await this.selectCamera(selectedCamera);\n\n // clear error state if the error was a permission error\n // and the user has granted permission\n if (this.#hasPermissionError()) {\n store.setState({\n errorState: undefined,\n });\n }\n } catch (error) {\n store.setState({\n errorState: asError(error),\n });\n throw error;\n }\n }\n\n // capture new state as it's been modified\n const selectedCamera = store.getState().selectedCamera;\n\n // something went wrong during camera selection?\n if (!selectedCamera) {\n console.warn(\"No selected camera!\");\n throw new Error(\"No selected camera\");\n }\n\n const stream = await selectedCamera.startStream(this.#resolution);\n\n if (!videoElement.isConnected) {\n throw new Error(\"Video element needs to be in the document!\");\n }\n\n videoElement.srcObject = stream;\n\n store.setState({\n videoElement,\n });\n\n if (autoplay) {\n await this.startPlayback();\n }\n }\n\n /**\n * Starts a best-effort camera stream. Will pick a camera automatically if\n * none is selected.\n *\n * @param params - The parameters for the camera stream.\n * @returns resolves when the camera stream starts\n */\n async startCameraStream(params: StartCameraStreamOptions = {}) {\n try {\n await this.#startCameraStream(params);\n } catch (error) {\n if (this.userInitiatedAbort) {\n this.reset();\n } else {\n throw error;\n }\n }\n }\n\n /**\n * Checks if the error state is a permission error.\n *\n * @returns true if the error state is a permission error\n */\n #hasPermissionError = () => {\n const errorState = store.getState().errorState;\n\n return (\n errorState instanceof CameraError &&\n errorState.code === \"PERMISSION_DENIED\"\n );\n };\n\n /**\n * Pauses capturing frames, without stopping playback.\n */\n stopFrameCapture() {\n store.setState({\n playbackState: \"playback\",\n });\n }\n\n /**\n * Stops the currently active stream. Also stops the video playback and capturing process.\n */\n stopStream() {\n console.debug(\"stopStream called\");\n const state = store.getState();\n this.pausePlayback();\n\n state.selectedCamera?.stopStream();\n\n if (state.videoElement) {\n state.videoElement.srcObject = null;\n }\n }\n\n /**\n * Pauses the video playback. This will also stop the capturing process.\n */\n pausePlayback() {\n console.debug(\"pausePlayback called\");\n const video = store.getState().videoElement;\n\n store.setState({\n playbackState: \"idle\",\n });\n\n if (!video) {\n return;\n }\n\n if (this.#videoFrameRequestId) {\n video.cancelVideoFrameCallback(this.#videoFrameRequestId);\n }\n\n video.pause();\n }\n\n /**\n * The main recognition loop. Do not call this method directly, use `#queueFrame` instead.\n */\n async #loop() {\n const state = store.getState();\n\n if (this.#videoFrameRequestId === undefined) {\n console.error(\"Missing request ID\");\n return;\n }\n\n if (!state.videoElement) {\n // shouldn't happen as disconnecting is handled by an observer which will\n // pause the loop\n console.warn(\"Missing video element, should not happen\");\n return;\n }\n\n const isSameOrientation =\n state.videoElement.videoHeight >= state.videoElement.videoWidth ===\n this.#extractionArea!.height >= this.#extractionArea!.width;\n\n if (!isSameOrientation) {\n // elements not in sync, wait for next frame\n return this.#queueFrame();\n }\n\n if (this.#frameCaptureCallbacks.size !== 0) {\n const capturedFrame = this.#videoFrameProcessor.getImageData(\n state.videoElement,\n this.#extractionArea,\n );\n\n // Iterate over all frame capture callbacks\n for (const callback of this.#frameCaptureCallbacks) {\n const workingFrame = isBufferDetached(capturedFrame.data)\n ? this.#videoFrameProcessor.getCurrentImageData()\n : capturedFrame;\n\n // Process the frame and potentially get a new buffer back\n const returnedBuffer = await callback(workingFrame);\n\n // Exit current iteration if we didn't get a buffer back\n if (!returnedBuffer) {\n continue;\n }\n\n if (!(returnedBuffer instanceof ArrayBuffer)) {\n throw new Error(\n stripIndents`\n Frame capture callback did not return an ArrayBuffer.\n Make sure to return the underlying buffer, not the view.\n `,\n );\n }\n\n // Return the buffer to the processor\n this.#videoFrameProcessor.reattachArrayBuffer(returnedBuffer);\n }\n }\n\n this.#queueFrame();\n }\n\n /**\n * Queues the next frame to be processed.\n */\n #queueFrame() {\n const state = store.getState();\n\n if (state.playbackState !== \"capturing\") {\n return;\n }\n\n if (!state.videoElement) {\n console.warn(\"Missing video element, should not happen\");\n return;\n }\n\n // clean up previous frame callback if it exists\n if (this.#videoFrameRequestId) {\n state.videoElement.cancelVideoFrameCallback(this.#videoFrameRequestId);\n }\n\n this.#videoFrameRequestId = state.videoElement.requestVideoFrameCallback(\n () => void this.#loop(),\n );\n }\n\n /**\n * Applies a mirror effect to the video if the camera is front-facing.\n * Assumes that desktop devices don't return a facing mode and that they are front-facing.\n */\n #applyMirrorIfNeeded() {\n const camera = store.getState().selectedCamera;\n\n if (!camera) {\n console.warn(\"No camera selected\");\n return;\n }\n\n if (!this.#mirrorFrontCameras) {\n return;\n }\n\n if (camera.facingMode !== \"back\") {\n this.setCameraMirrorX(true);\n } else {\n this.setCameraMirrorX(false);\n }\n }\n\n /**\n * If true, the video and captured frames will be mirrored horizontally.\n *\n * @param mirrorX - If true, the video and captured frames will be mirrored horizontally.\n */\n setCameraMirrorX(mirrorX: boolean) {\n const currentState = store.getState();\n const videoElement = currentState.videoElement;\n\n if (!videoElement) {\n console.warn(\"Mirror video - no video element present.\");\n return;\n }\n\n // Skip if the mirror state is already what we want\n if (currentState.mirrorX === mirrorX) {\n return;\n }\n\n if (mirrorX) {\n videoElement.style.scale = \"-1 1\";\n } else {\n videoElement.style.removeProperty(\"scale\");\n }\n\n store.setState({ mirrorX });\n }\n\n // The \"typeof\" is necessary to avoid a circular dependency when resolving types\n\n /**\n * Allows the user to subscribe to state changes inside the Camera Manager.\n * Implemented using Zustand. For usage information, see\n * @see https://github.com/pmndrs/zustand#using-subscribe-with-selector for more details.\n *\n * @returns a cleanup function to remove the subscription\n */\n subscribe: typeof store.subscribe = store.subscribe;\n\n /**\n * Gets the current internal state of the CameraManager.\n *\n * @returns the current state of the CameraManager\n */\n getState: typeof store.getState = store.getState;\n\n /**\n * Resets the CameraManager and stops all streams.\n */\n reset() {\n console.debug(\"Resetting camera manager\");\n this.#frameCaptureCallbacks.clear();\n this.stopStream();\n resetStore();\n }\n}\n","/**\n * Copyright (c) 2025 Microblink Ltd. All rights reserved.\n */\n\nimport {\n createContext,\n onCleanup,\n ParentComponent,\n useContext,\n} from \"solid-js\";\nimport { MountableElement } from \"solid-js/web\";\nimport { createWithSignal } from \"solid-zustand\";\nimport { CameraManager } from \"../core/CameraManager\";\nimport { cameraManagerStore } from \"../core/cameraManagerStore\";\nimport { DismountCallback } from \"./createCameraManagerUi\";\n\n/**\n * The CameraUiStoreContext.\n */\nconst CameraUiStoreContext = createContext<CameraUiStore>();\n\n/**\n * Creates a camera manager solid store.\n */\nfunction createCameraManagerSolidStore() {\n return createWithSignal(cameraManagerStore);\n}\n\n/**\n * !IMPORTANT: this is not a reactive store. It's just a plain javascript object exposed\n * as a context. The store is `cameraManagerSolidStore`, and it doesn't have anything\n * related to the Camera Manager UI component\n */\nexport type CameraUiStore = {\n /** Function which will dismount the component */\n dismountCameraUi: () => void;\n\n /** The camera manager. */\n cameraManager: CameraManager;\n\n /** This is the camera manager zustand store converted to SolidJS' signal store via `solid-zustand` */\n cameraManagerSolidStore: ReturnType<typeof createCameraManagerSolidStore>;\n\n /** The mountable HTML element. */\n mountTarget: MountableElement;\n\n /** Whether to show the mirror camera button */\n showMirrorCameraButton: boolean;\n /** Whether to show the torch button */\n showTorchButton: boolean;\n /** Whether to show the close button */\n showCloseButton: boolean;\n /** Whether to show the camera error modal */\n showCameraErrorModal: boolean;\n /** Sets a callback to be called when the component is unmounted.\n * Returns a cleanup function that removes the callback when called.\n */\n addOnDismountCallback: (fn: DismountCallback) => () => void;\n};\n\n/**\n * The CameraUiStoreProvider component.\n */\nexport const CameraUiStoreProvider: ParentComponent<{\n dismountCameraUi: () => void;\n cameraManager: CameraManager;\n mountTarget: MountableElement;\n showMirrorCameraButton: boolean;\n showTorchButton: boolean;\n showCloseButton: boolean;\n showCameraErrorModal: boolean;\n addOnDismountCallback: (fn: DismountCallback) => () => void;\n}> = (props) => {\n // initial context value\n const contextValue: CameraUiStore = {\n cameraManagerSolidStore: createCameraManagerSolidStore(),\n // eslint-disable-next-line solid/reactivity\n cameraManager: props.cameraManager,\n // eslint-disable-next-line solid/reactivity\n dismountCameraUi: () => {\n props.cameraManager.userInitiatedAbort = true;\n props.dismountCameraUi();\n },\n // eslint-disable-next-line solid/reactivity\n addOnDismountCallback: props.addOnDismountCallback,\n // eslint-disable-next-line solid/reactivity\n mountTarget: props.mountTarget,\n // eslint-disable-next-line solid/reactivity\n showMirrorCameraButton: props.showMirrorCameraButton,\n // eslint-disable-next-line solid/reactivity\n showTorchButton: props.showTorchButton,\n // eslint-disable-next-line solid/reactivity\n showCloseButton: props.showCloseButton,\n // eslint-disable-next-line solid/reactivity\n showCameraErrorModal: props.showCameraErrorModal,\n };\n\n onCleanup(() => {\n console.debug(\"CameraUiStoreProvider cleanup\");\n // props.dismount(); // this is recursive!!!\n });\n\n return (\n <CameraUiStoreContext.Provider value={contextValue}>\n {props.children}\n </CameraUiStoreContext.Provider>\n );\n};\n\n/**\n * The useCameraUiStore hook.\n */\nexport function useCameraUiStore() {\n const ctx = useContext(CameraUiStoreContext);\n if (!ctx) {\n throw new Error(\"StoreContext.Provider not in scope\");\n }\n\n return ctx;\n}\n","/**\n * Copyright (c) 2025 Microblink Ltd. All rights reserved.\n */\n\n/**\n * The default English localization strings.\n */\nexport default {\n selected_camera: \"Selected camera\",\n loading_cameras: \"Loading cameras...\",\n select_a_camera: \"Select a camera\",\n select_camera: \"Select camera\",\n close: \"Close\",\n torch: \"Torch\",\n mirror_camera: \"Mirror camera\",\n scan_document: \"Scan a document\",\n camera_error_title: \"Camera permission required\",\n camera_error_details:\n \"Please allow camera access in your browser and try again.\",\n camera_error_cancel_btn: \"Cancel\",\n camera_error_primary_btn: \"Retry\",\n} as const;\n","/**\n * Copyright (c) 2025 Microblink Ltd. All rights reserved.\n */\n\nimport { ParentComponent, createContext, onMount, useContext } from \"solid-js\";\nimport { SetStoreFunction, createStore } from \"solid-js/store\";\n\nimport enLocaleStrings from \"./locales/en\";\n\n/**\n * The camera UI locale record.\n */\nexport type CameraUiLocaleRecord = typeof enLocaleStrings;\n\n/**\n * The camera UI localization strings.\n */\nexport type CameraUiLocalizationStrings = {\n // This allows for autocomplete for defaults, but also overriding\n // https://twitter.com/mattpocockuk/status/1709281782325977101\n // eslint-disable-next-line @typescript-eslint/ban-types\n [K in keyof CameraUiLocaleRecord]: CameraUiLocaleRecord[K] | (string & {});\n};\n\n/**\n * The localization context.\n */\nconst LocalizationContext = createContext<{\n t: CameraUiLocalizationStrings;\n updateLocalization: SetStoreFunction<CameraUiLocalizationStrings>;\n}>();\n\n/**\n * The localization provider.\n */\nexport const LocalizationProvider: ParentComponent<{\n userStrings?: Partial<CameraUiLocalizationStrings>;\n // A hacky way to lift the `updateLocalizationStore` function out of the Context\n setLocalizationRef: (\n fn: SetStoreFunction<CameraUiLocalizationStrings>,\n ) => void;\n}> = (props) => {\n const [localizationStore, updateLocalizationStore] =\n createStore<CameraUiLocalizationStrings>(\n // we structure clone to avoid proxying to the original object\n structuredClone({\n ...enLocaleStrings,\n // we don't care on init\n // eslint-disable-next-line solid/reactivity\n ...props.userStrings,\n }),\n );\n\n onMount(() => {\n props.setLocalizationRef(updateLocalizationStore);\n });\n\n const contextValue = {\n t: localizationStore,\n updateLocalization: updateLocalizationStore,\n };\n\n return (\n <LocalizationContext.Provider value={contextValue}>\n {props.children}\n </LocalizationContext.Provider>\n );\n};\n\n/**\n * The use localization hook.\n */\nexport function useLocalization() {\n const ctx = useContext(LocalizationContext);\n if (!ctx) {\n throw new Error(\"LocalizationContext.Provider not in scope.\");\n }\n return ctx;\n}\n","/**\n * Copyright (c) 2025 Microblink Ltd. All rights reserved.\n */\n\nimport { EnvironmentProvider } from \"@ark-ui/solid/environment\";\nimport { Component, createSignal, JSX, onMount, Show } from \"solid-js\";\n\nexport const SmartEnvironmentProvider: Component<{\n children: (rootNode: Node) => JSX.Element;\n}> = (props) => {\n const [rootNode, setRootNode] = createSignal<Node>();\n const [ref, setRef] = createSignal<HTMLSpanElement>();\n\n onMount(() => {\n const spanRef = ref();\n\n if (!spanRef) {\n return;\n }\n\n setRootNode(spanRef.getRootNode());\n });\n\n return (\n <>\n <Show when={rootNode()} fallback={<span ref={setRef} />}>\n {(rootNode) => (\n <EnvironmentProvider value={() => rootNode()}>\n {props.children(rootNode())}\n </EnvironmentProvider>\n )}\n </Show>\n </>\n );\n};\n","/**\n * Copyright (c) 2025 Microblink Ltd. All rights reserved.\n */\n\nimport { HTMLProps } from \"@ark-ui/solid/factory\";\nimport { JSX } from \"solid-js/jsx-runtime\";\nimport { Simplify } from \"type-fest\";\n\ntype ElementType = Simplify<keyof JSX.IntrinsicElements>;\n\n/**\n * Fixes bad implementation of event handlers in Ark UI\n *\n * https://github.com/chakra-ui/ark/issues/3146#issuecomment-2556518786\n *\n * https://docs.solidjs.com/concepts/components/event-handlers#list-of-delegated-events\n */\nexport function eventFixer<E extends ElementType>(props: HTMLProps<E>) {\n const newObj: Record<string, unknown> = {};\n\n Object.entries(props).forEach(([key, value]) => {\n const lowerCaseKey = key.toLowerCase();\n let trimmedKey = lowerCaseKey;\n\n // it's an event handler\n if (lowerCaseKey.startsWith(\"on\")) {\n trimmedKey = lowerCaseKey.slice(2);\n\n const newKey = `on:${trimmedKey}`;\n newObj[newKey] = value;\n\n // removed as it's safer to do an all events?\n\n // if it's a delegated event\n // if (DelegatedEvents.has(trimmedKey)) {\n // const newKey = `on:${trimmedKey}`;\n // newObj[newKey] = value;\n // } else {\n // // if it's a non-delegated event\n // newObj[trimmedKey] = value;\n // }\n } else {\n // if it's not an event handler\n newObj[trimmedKey] = value;\n }\n });\n\n return newObj;\n}\n","export default (props = {}) => <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 20 20\"{...props}><g fill=\"#fff\" fill-rule=\"evenodd\" clip-rule=\"evenodd\"><path d=\"M6.322 2.988A1.67 1.67 0 0 1 7.5 2.5h5a1.667 1.667 0 0 1 1.667 1.667A.833.833 0 0 0 15 5h.833a2.5 2.5 0 0 1 2.5 2.5V15a2.5 2.5 0 0 1-2.5 2.5H4.167a2.5 2.5 0 0 1-2.5-2.5V7.5a2.5 2.5 0 0 1 2.5-2.5H5a.833.833 0 0 0 .833-.833c0-.442.176-.866.489-1.179M4.167 6.667a.833.833 0 0 0-.834.833V15a.833.833 0 0 0 .834.833h11.666a.834.834 0 0 0 .834-.833V7.5a.833.833 0 0 0-.834-.833H15a2.5 2.5 0 0 1-2.5-2.5h-5a2.5 2.5 0 0 1-2.5 2.5z\"/><path d=\"M10 9.167a1.667 1.667 0 1 0 0 3.333 1.667 1.667 0 0 0 0-3.333m-3.333 1.666a3.333 3.333 0 1 1 6.666 0 3.333 3.333 0 0 1-6.666 0\"/></g></svg>","export default (props = {}) => <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 20 20\"{...props}><path stroke=\"#fff\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4.167 10.833 7.5 14.167l8.333-8.334\"/></svg>","export default (props = {}) => <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 20 20\"{...props}><path fill=\"#fff\" fill-rule=\"evenodd\" d=\"M4.41 6.91a.833.833 0 0 1 1.18 0L10 11.323l4.41-4.411a.833.833 0 1 1 1.18 1.178l-5 5a.833.833 0 0 1-1.18 0l-5-5a.833.833 0 0 1 0-1.178\" clip-rule=\"evenodd\"/></svg>","/**\n * Copyright (c) 2025 Microblink Ltd. All rights reserved.\n */\n\nimport { createListCollection, Select } from \"@ark-ui/solid/select\";\nimport { SmartEnvironmentProvider } from \"@microblink/shared-components/SmartEnvironmentProvider\";\n\nimport { Component, createSignal, Index, Show } from \"solid-js\";\nimport { eventFixer } from \"@microblink/shared-components/eventFixer\";\nimport IconCamera from \"./assets/camera.svg?component-solid\";\nimport IconCheck from \"./assets/check.svg?component-solid\";\nimport IconChevronDown from \"./assets/general-c-chevron-down.svg?component-solid\";\nimport { useCameraUiStore } from \"./CameraUiStoreContext\";\nimport { useLocalization } from \"./LocalizationContext\";\n\n/**\n * A camera option.\n */\ntype CameraOption = {\n value: string;\n label: string;\n};\n\n/**\n * The CameraSelector component.\n */\nexport const CameraSelector: Component = () => {\n const { cameraManagerSolidStore, cameraManager } = useCameraUiStore();\n const { t } = useLocalization();\n\n const cameras = cameraManagerSolidStore((x) => x.cameras);\n const selectedCamera = cameraManagerSolidStore((x) => x.selectedCamera);\n const isQueryingCameras = cameraManagerSolidStore((x) => x.isQueryingCameras);\n const facingFilter = cameraManagerSolidStore((x) => x.facingFilter);\n\n const [isSwapping, setIsSwapping] = createSignal(false);\n\n const isDisabled = () => isQueryingCameras() || isSwapping();\n\n const camerasWithFacingFilter = () => {\n const $facingFilter = facingFilter();\n if (!$facingFilter) {\n return cameras();\n }\n\n return cameras().filter((camera) =>\n $facingFilter.includes(camera.facingMode),\n );\n };\n\n const createCameraOptions = () => [\n ...camerasWithFacingFilter().map((camera) => ({\n value: camera.deviceInfo.deviceId,\n label: camera.name,\n })),\n ];\n\n const cameraCollection = () =>\n createListCollection({\n items: [...createCameraOptions()],\n });\n\n const selectedCameraInCollection = () => {\n const $selectedCamera = selectedCamera();\n if (!$selectedCamera) {\n return;\n }\n\n const foundCamera = cameraCollection().find(\n $selectedCamera.deviceInfo.deviceId,\n );\n\n if (!foundCamera) {\n return;\n }\n\n return [foundCamera.value];\n };\n\n const isFakeCamera = (value: string) => {\n return fakeCameras.some((fakeCamera) => fakeCamera.value === value);\n };\n\n const selectCameraById = async (id: string) => {\n setIsSwapping(true);\n const camera = cameras().find(\n (camera) => camera.deviceInfo.deviceId === id,\n );\n\n if (!camera) {\n console.warn(\"No camera\");\n return;\n }\n\n await cameraManager.selectCamera(camera);\n setIsSwapping(false);\n };\n\n return (\n <SmartEnvironmentProvider>\n {() => (\n <>\n <Select.Root\n part=\"camera-select-part\"\n collection={cameraCollection()}\n value={selectedCameraInCollection()}\n positioning={{\n placement: \"top\",\n }}\n lazyMount={true}\n disabled={isDisabled()}\n onValueChange={(details) => {\n if (isFakeCamera(details.value[0])) {\n console.warn(\"Fake camera, skipping\");\n return;\n }\n void selectCameraById(details.value[0]);\n }}\n >\n <Select.Label class=\"sr-only\">{t.selected_camera}</Select.Label>\n {/* Trigger */}\n <Select.Trigger\n asChild={(selectProps) => {\n return (\n <button\n {...eventFixer(selectProps())}\n // Unterminated string literal if using regular multiline quotes\n class={`flex px-4 py-2 items-center gap-2 rounded-full bg-dark-100/50 backdrop-blur-xl\n whitespace-nowrap text-base color-white font-500 cursor-pointer appearance-none\n border-none disabled:opacity-50 disabled:cursor-not-allowed max-w-[100%]`}\n >\n <IconCamera class=\"size-6 shrink-0\" aria-hidden />\n <Select.ValueText\n class=\"truncate\"\n placeholder={\n isQueryingCameras()\n ? t.loading_cameras\n : t.select_a_camera\n }\n />\n <Select.Indicator class=\"shrink-0 data-[state=open]:scale-y-[-1]\">\n <IconChevronDown class=\"size-6 shrink-0\" />\n </Select.Indicator>\n </button>\n );\n }}\n />\n {/* Dropdown */}\n <Select.Positioner>\n <Select.Content>\n <Select.ItemGroup class=\"rounded-4 overflow-hidden text-base color-white\">\n <Index each={cameraCollection().items}>\n {(camera, index) => {\n return (\n <Select.Item\n item={camera()}\n class=\"flex py-3 pl-4 pr-12 cursor-pointer select-none relative gap-[1px]\n bg-dark-100/50 backdrop-blur-xl data-[highlighted]:bg-gray-500/50\"\n >\n <Select.ItemText class=\"truncate\">\n {camera().label}\n </Select.ItemText>\n <Select.ItemIndicator class=\"absolute right-4\">\n <IconCheck class=\"size-6 shrink-0\" />\n </Select.ItemIndicator>\n {/* separator */}\n <Show when={index !== 0}>\n <div class=\"h-[1px] absolute left-0 right-0 top-[-1px] bg-white pointer-events-none\" />\n </Show>\n </Select.Item>\n );\n }}\n </Index>\n </Select.ItemGroup>\n </Select.Content>\n </Select.Positioner>\n </Select.Root>\n </>\n )}\n </SmartEnvironmentProvider>\n );\n};\n\n/**\n * The fake cameras.\n */\nconst fakeCameras: CameraOption[] = [\n {\n value: \"5\",\n label: \"Back Camera 2\",\n },\n {\n value: \"2\",\n label: \"Back Triple Camera\",\n },\n {\n value: \"1\",\n label: \"Back Dual Wide Camera\",\n },\n {\n value: \"3\",\n label: \"Front Camera 5\",\n },\n {\n value: \"4\",\n label: \"Some random desktop camera\",\n },\n];\n","/**\n * Copyright (c) 2025 Microblink Ltd. All rights reserved.\n */\n\n/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport { Component, JSX, ParentComponent, Show } from \"solid-js\";\nimport CloseIcon from \"~icons/material-symbols/close\";\nimport FlashOff from \"~icons/material-symbols/flash-off\";\nimport FlashOn from \"~icons/material-symbols/flash-on\";\nimport MirrorIcon from \"~icons/material-symbols/flip\";\nimport { CameraSelector } from \"./CameraSelector\";\nimport { useCameraUiStore } from \"./CameraUiStoreContext\";\nimport { useLocalization } from \"./LocalizationContext\";\n\nimport { Tooltip } from \"@ark-ui/solid/tooltip\";\nimport { eventFixer } from \"@microblink/shared-components/eventFixer\";\nimport { SmartEnvironmentProvider } from \"@microblink/shared-components/SmartEnvironmentProvider\";\n\n/**\n * The Header component.\n */\nexport const Header: Component = () => {\n const {\n dismountCameraUi,\n cameraManagerSolidStore,\n cameraManager,\n showMirrorCameraButton,\n showTorchButton,\n showCloseButton,\n } = useCameraUiStore();\n const { t } = useLocalization();\n const isMirrored = cameraManagerSolidStore((s) => s.mirrorX);\n const selectedCamera = cameraManagerSolidStore((s) => s.selectedCamera);\n const cameras = cameraManagerSolidStore((s) => s.cameras);\n const isActive = cameraManagerSolidStore((s) => s.playbackState !== \"idle\");\n\n // Same instance of selected camera, so we can't reuse `selectedCamera` signal\n // to trigger signal updates\n const torchEnabled = cameraManagerSolidStore(\n (s) => s.selectedCamera?.torchEnabled,\n );\n\n const hasTorch = () => selectedCamera()?.torchSupported;\n\n const toggleTorch = () => {\n const camera = selectedCamera();\n if (!camera) {\n return;\n }\n\n void camera.toggleTorch();\n };\n\n const toggleMirrorX = () => {\n cameraManager.setCameraMirrorX(!cameraManagerSolidStore.getState().mirrorX);\n };\n\n return (\n <SmartEnvironmentProvider>\n {() => (\n <div\n class={`z-2 relative gap-2 grid justify-between items-center grid-cols-[1fr_auto_1fr]\n py-4 color-white lerp:px-3@xs,8@lg`}\n >\n <div\n class={\"justify-self-start flex flex-nowrap gap-4 auto-cols-auto\"}\n >\n {/* Mirror button */}\n <Show when={showMirrorCameraButton && isActive()}>\n <ToolbarButton\n part=\"mirror-camera-button-part\"\n tooltipLabel={t.mirror_camera}\n onClick={() => toggleMirrorX()}\n >\n <span class=\"sr-only\">{t.mirror_camera}</span>\n <MirrorIcon\n class={\n \"size-6 shrink-0 transition-transform duration-300 ease-in-out\"\n }\n style={{\n transform: isMirrored() ? \"scaleX(-1)\" : \"scaleX(1)\",\n }}\n />\n </ToolbarButton>\n </Show>\n\n {/* Torch */}\n <Show when={showTorchButton && hasTorch() && isActive()}>\n <ToolbarButton\n part=\"torch-button-part\"\n onClick={() => toggleTorch()}\n tooltipLabel={t.torch}\n >\n <Show when={!torchEnabled()}>\n <span class=\"sr-only\">{t.torch}</span>\n <FlashOn class=\"size-6 shrink-0\" />\n </Show>\n <Show when={torchEnabled()}>\n <FlashOff class=\"size-6 shrink-0\" />\n </Show>\n </ToolbarButton>\n </Show>\n </div>\n\n {/* camera selector */}\n <div class=\"justify-self-center min-w-0 w-full\">\n <Show when={cameras().length > 1}>\n <CameraSelector />\n </Show>\n </div>\n\n {/* close button */}\n <Show when={showCloseButton}>\n <div class=\"justify-self-end\">\n {/* close button */}\n <ToolbarButton\n part=\"close-button-part\"\n onClick={() => dismountCameraUi()}\n tooltipLabel={t.close}\n >\n <span class=\"sr-only\">{t.close}</span>\n <CloseIcon class=\"size-6 shrink-0\" />\n </ToolbarButton>\n </div>\n </Show>\n </div>\n )}\n </SmartEnvironmentProvider>\n );\n};\n\n/**\n * The toolbar button props.\n */\ntype ToolbarButtonProps = {\n tooltipLabel: string;\n} & JSX.ButtonHTMLAttributes<HTMLButtonElement>;\n\n/**\n * The toolbar button component.\n */\nconst ToolbarButton: ParentComponent<ToolbarButtonProps> = (props) => {\n return (\n <Tooltip.Root>\n {/* Button */}\n <Tooltip.Trigger\n {...props}\n asChild={(tooltipProps) => {\n return (\n <button\n {...eventFixer(tooltipProps())}\n class={`rounded-full bg-dark-500 bg-opacity-50 backdrop-blur grid place-items-center\n size-12 appearance-none border-none cursor-pointer`}\n >\n {props.children}\n </button>\n );\n }}\n />\n {/* Tooltip */}\n <Tooltip.Positioner>\n <Tooltip.Content\n class={`bg-dark-500 bg-opacity-50 backdrop-blur color-white text-align-center p-2\n rounded-md text-sm drop-shadow-md`}\n >\n {props.tooltipLabel}\n </Tooltip.Content>\n </Tooltip.Positioner>\n </Tooltip.Root>\n );\n};\n","/**\n * Copyright (c) 2025 Microblink Ltd. All rights reserved.\n */\n\nimport { JSX, Owner, createRoot } from \"solid-js\";\nimport { MountableElement, insert } from \"solid-js/web\";\n\n/**\n * A custom render function that allows you to specify the owner of the rendered component.\n * This is useful when you want to render a component into a different owner than the current one.\n *\n * Discussion: https://discord.com/channels/722131463138705510/1346100647824724008\n *\n * @param code The JSX code to render\n * @param element the element to render the code into\n * @param owner the SolidJS owner\n */\nexport const renderWithOwner = (\n code: () => JSX.Element,\n element: MountableElement,\n owner: Owner | null,\n) => {\n return createRoot((dispose) => {\n insert(element, code(), element.firstChild ? null : undefined);\n\n return () => {\n dispose();\n element.textContent = \"\";\n };\n }, owner);\n};\n","/**\n * Copyright (c) 2025 Microblink Ltd. All rights reserved.\n */\n\nimport { renderWithOwner } from \"@microblink/shared-components/renderWithOwner\";\nimport { getOwner, JSX, ParentComponent, Show, splitProps } from \"solid-js\";\n\n/**\n * The SolidShadowRoot props.\n */\ntype SolidShadowRootProps = {\n /**\n * Disables shadow root, mostly useful for debugging.\n */\n disableShadowRoot?: boolean;\n /**\n * A ref to the div element.\n */\n getRef?: (el: HTMLDivElement) => void;\n} & JSX.HTMLAttributes<HTMLDivElement>;\n\n/**\n * The SolidShadowRoot component.\n */\nexport const SolidShadowRoot: ParentComponent<SolidShadowRootProps> = (\n props,\n) => {\n // We use `getOwner` in case of async rendering, for instance, it was used to\n // test rendering after a timeout.\n const owner = getOwner();\n const [local, others] = splitProps(props, [\n \"children\",\n \"disableShadowRoot\",\n \"getRef\",\n ]);\n\n return (\n <div\n {...others}\n ref={(ref) => {\n if (local.disableShadowRoot) {\n return;\n }\n\n const shadowRoot = ref.attachShadow({ mode: \"open\" });\n\n renderWithOwner(() => <>{local.children}</>, shadowRoot, owner);\n }}\n >\n <Show when={local.disableShadowRoot}>{local.children}</Show>\n </div>\n );\n};\n","/**\n * Copyright (c) 2025 Microblink Ltd. All rights reserved.\n */\n\nimport { Owner } from \"solid-js\";\nimport { createWithSignal } from \"solid-zustand\";\nimport { subscribeWithSelector } from \"zustand/middleware\";\nimport { createStore } from \"zustand/vanilla\";\n\n/**\n * The camera UI refs.\n */\nexport type CameraUiRefs = {\n /** The feedback layer. */\n feedbackLayer: HTMLDivElement;\n /** The overlay layer. */\n overlayLayer: HTMLDivElement;\n /** The owner of the component. */\n owner: Owner;\n};\n\n/**\n * The initial state of the camera UI refs.\n */\nconst initialState: CameraUiRefs = {\n feedbackLayer: null!,\n overlayLayer: null!,\n owner: null!,\n};\n\n/**\n * The camera UI ref store.\n */\nexport const cameraUiRefStore = createStore<CameraUiRefs>()(\n // this is important! Otherwise, solid-zustand will start mutating the initial state\n subscribeWithSelector(() => structuredClone(initialState)),\n);\n\n/**\n * The camera UI ref signal store.\n */\nexport const cameraUiRefSignalStore = createWithSignal(cameraUiRefStore);\n","import { getOwner, onCleanup, createSignal, untrack, sharedConfig, onMount, DEV, equalFn, } from \"solid-js\";\nimport { isServer } from \"solid-js/web\";\nexport * from \"./types.js\";\n//\n// GENERAL HELPERS:\n//\nexport { isServer };\nexport const isClient = !isServer;\nexport const isDev = isClient && !!DEV;\nexport const isProd = !isDev;\n/** no operation */\nexport const noop = (() => void 0);\nexport const trueFn = () => true;\nexport const falseFn = () => false;\n/** @deprecated use {@link equalFn} from \"solid-js\" */\nexport const defaultEquals = equalFn;\nexport const EQUALS_FALSE_OPTIONS = { equals: false };\nexport const INTERNAL_OPTIONS = { internal: true };\n/**\n * Check if the value is an instance of ___\n */\nexport const ofClass = (v, c) => v instanceof c || (v && v.constructor === c);\n/** Check if value is typeof \"object\" or \"function\" */\nexport function isObject(value) {\n return value !== null && (typeof value === \"object\" || typeof value === \"function\");\n}\nexport const isNonNullable = (i) => i != null;\nexport const filterNonNullable = (arr) => arr.filter(isNonNullable);\nexport const compare = (a, b) => (a < b ? -1 : a > b ? 1 : 0);\n/**\n * Check shallow array equality\n */\nexport const arrayEquals = (a, b) => a === b || (a.length === b.length && a.every((e, i) => e === b[i]));\n/**\n * Returns a function that will call all functions in the order they were chained with the same arguments.\n */\nexport function chain(callbacks) {\n return (...args) => {\n for (const callback of callbacks)\n callback && callback(...args);\n };\n}\n/**\n * Returns a function that will call all functions in the reversed order with the same arguments.\n */\nexport function reverseChain(callbacks) {\n return (...args) => {\n for (let i = callbacks.length - 1; i >= 0; i--) {\n const callback = callbacks[i];\n callback && callback(...args);\n }\n };\n}\nexport const clamp = (n, min, max) => Math.min(Math.max(n, min), max);\n/**\n * Accesses the value of a MaybeAccessor\n * @example\n * ```ts\n * access(\"foo\") // => \"foo\"\n * access(() => \"foo\") // => \"foo\"\n * ```\n */\nexport const access = (v) => typeof v === \"function\" && !v.length ? v() : v;\nexport const asArray = (value) => Array.isArray(value) ? value : value ? [value] : [];\n/**\n * Access an array of MaybeAccessors\n * @example\n * const list = [1, 2, () => 3)] // T: MaybeAccessor<number>[]\n * const newList = accessArray(list) // T: number[]\n */\nexport const accessArray = (list) => list.map(v => access(v));\n/**\n * Run the function if the accessed value is not `undefined` nor `null`\n * @param value\n * @param fn\n */\nexport const withAccess = (value, fn) => {\n const _value = access(value);\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n typeof _value != null && fn(_value);\n};\nexport const asAccessor = (v) => (typeof v === \"function\" ? v : () => v);\n/** If value is a function – call it with a given arguments – otherwise get the value as is */\nexport function accessWith(valueOrFn, ...args) {\n return typeof valueOrFn === \"function\" ? valueOrFn(...args) : valueOrFn;\n}\nexport function defer(deps, fn, initialValue) {\n const isArray = Array.isArray(deps);\n let prevInput;\n let shouldDefer = true;\n return prevValue => {\n let input;\n if (isArray) {\n input = Array(deps.length);\n for (let i = 0; i < deps.length; i++)\n input[i] = deps[i]();\n }\n else\n input = deps();\n if (shouldDefer) {\n shouldDefer = false;\n prevInput = input;\n return initialValue;\n }\n const result = untrack(() => fn(input, prevInput, prevValue));\n prevInput = input;\n return result;\n };\n}\n/**\n * Get entries of an object\n */\nexport const entries = Object.entries;\n/**\n * Get keys of an object\n */\nexport const keys = Object.keys;\n/**\n * Solid's `onCleanup` that doesn't warn in development if used outside of a component.\n */\nexport const tryOnCleanup = isDev\n ? fn => (getOwner() ? onCleanup(fn) : fn)\n : onCleanup;\nexport const createCallbackStack = () => {\n let stack = [];\n const clear = () => (stack = []);\n return {\n push: (...callbacks) => stack.push(...callbacks),\n execute(arg0, arg1, arg2, arg3) {\n stack.forEach(cb => cb(arg0, arg1, arg2, arg3));\n clear();\n },\n clear,\n };\n};\n/**\n * Group synchronous function calls.\n * @param fn\n * @returns `fn`\n */\nexport function createMicrotask(fn) {\n let calls = 0;\n let args;\n onCleanup(() => (calls = 0));\n return (...a) => {\n (args = a), calls++;\n queueMicrotask(() => --calls === 0 && fn(...args));\n };\n}\n/**\n * A hydratable version of the {@link createSignal}. It will use the serverValue on the server and the update function on the client. If initialized during hydration it will use serverValue as the initial value and update it once hydration is complete.\n *\n * @param serverValue initial value of the state on the server\n * @param update called once on the client or on hydration to initialize the value\n * @param options {@link SignalOptions}\n * @returns\n * ```ts\n * [state: Accessor<T>, setState: Setter<T>]\n * ```\n * @see {@link createSignal}\n */\nexport function createHydratableSignal(serverValue, update, options) {\n if (isServer) {\n return createSignal(serverValue, options);\n }\n if (sharedConfig.context) {\n const [state, setState] = createSignal(serverValue, options);\n onMount(() => setState(() => update()));\n return [state, setState];\n }\n return createSignal(update(), options);\n}\n/** @deprecated use {@link createHydratableSignal} instead */\nexport const createHydrateSignal = createHydratableSignal;\n/**\n * Handle items removed and added to the array by diffing it by refference.\n *\n * @param current new array instance\n * @param prev previous array copy\n * @param handleAdded called once for every added item to array\n * @param handleRemoved called once for every removed from array\n */\nexport function handleDiffArray(current, prev, handleAdded, handleRemoved) {\n const currLength = current.length;\n const prevLength = prev.length;\n let i = 0;\n if (!prevLength) {\n for (; i < currLength; i++)\n handleAdded(current[i]);\n return;\n }\n if (!currLength) {\n for (; i < prevLength; i++)\n handleRemoved(prev[i]);\n return;\n }\n for (; i < prevLength; i++) {\n if (prev[i] !== current[i])\n break;\n }\n let prevEl;\n let currEl;\n prev = prev.slice(i);\n current = current.slice(i);\n for (prevEl of prev) {\n if (!current.includes(prevEl))\n handleRemoved(prevEl);\n }\n for (currEl of current) {\n if (!prev.includes(currEl))\n handleAdded(currEl);\n }\n}\n","import { makeEventListener } from \"@solid-primitives/event-listener\";\nimport { createHydratableSingletonRoot } from \"@solid-primitives/rootless\";\nimport { createHydratableStaticStore, createStaticStore } from \"@solid-primitives/static-store\";\nimport { access, asArray, handleDiffArray, noop, filterNonNullable, } from \"@solid-primitives/utils\";\nimport { createEffect, onCleanup, sharedConfig } from \"solid-js\";\nimport { isServer } from \"solid-js/web\";\n/**\n * Instantiate a new ResizeObserver that automatically get's disposed on cleanup.\n *\n * @param callback handler called once element size changes\n * @param options ResizeObserver options\n * @returns `observe` and `unobserve` functions\n */\nexport function makeResizeObserver(callback, options) {\n if (isServer) {\n return { observe: noop, unobserve: noop };\n }\n const observer = new ResizeObserver(callback);\n onCleanup(observer.disconnect.bind(observer));\n return {\n observe: ref => observer.observe(ref, options),\n unobserve: observer.unobserve.bind(observer),\n };\n}\n/**\n * Create resize observer instance, listening for changes to size of the reactive {@link targets} array.\n *\n * @param targets Elements to be observed. Can be a reactive signal or store top-level array.\n * @param onResize - Function handler to trigger on element resize\n *\n * @example\n * ```tsx\n * let ref\n * createResizeObserver(() => ref, ({ width, height }, el) => {\n * if (el === ref) console.log(width, height)\n * });\n * <div ref={ref}/>\n * ```\n */\nexport function createResizeObserver(targets, onResize, options) {\n if (isServer)\n return;\n const previousMap = new WeakMap(), { observe, unobserve } = makeResizeObserver(entries => {\n for (const entry of entries) {\n const { contentRect, target } = entry, width = Math.round(contentRect.width), height = Math.round(contentRect.height), previous = previousMap.get(target);\n if (!previous || previous.width !== width || previous.height !== height) {\n onResize(contentRect, target, entry);\n previousMap.set(target, { width, height });\n }\n }\n }, options);\n createEffect((prev) => {\n const refs = filterNonNullable(asArray(access(targets)));\n handleDiffArray(refs, prev, observe, unobserve);\n return refs;\n }, []);\n}\nconst WINDOW_SIZE_FALLBACK = { width: 0, height: 0 };\n/**\n * @returns object with width and height dimensions of window, page and screen.\n */\nexport function getWindowSize() {\n if (isServer)\n return { ...WINDOW_SIZE_FALLBACK };\n return {\n width: window.innerWidth,\n height: window.innerHeight,\n };\n}\n/**\n * Creates a reactive store-like object of current width and height dimensions of window, page and screen.\n * @example\n * const size = createWindowSize();\n * createEffect(() => {\n * console.log(size.width, size.height)\n * })\n */\nexport function createWindowSize() {\n if (isServer) {\n return WINDOW_SIZE_FALLBACK;\n }\n const [size, setSize] = createHydratableStaticStore(WINDOW_SIZE_FALLBACK, getWindowSize);\n makeEventListener(window, \"resize\", () => setSize(getWindowSize()));\n return size;\n}\n/**\n * Returns a reactive store-like object of current width and height dimensions of window, page and screen.\n *\n * This is a [singleton root](https://github.com/solidjs-community/solid-primitives/tree/main/packages/rootless#createSingletonRoot) primitive.\n *\n * @example\n * const size = useWindowSize();\n * createEffect(() => {\n * console.log(size.width, size.height)\n * })\n */\nexport const useWindowSize = \n/*#__PURE__*/ createHydratableSingletonRoot(createWindowSize);\nconst ELEMENT_SIZE_FALLBACK = { width: null, height: null };\n/**\n * @param target html element\n * @returns object with width and height dimensions of provided {@link target} element.\n */\nexport function getElementSize(target) {\n if (isServer || !target) {\n return { ...ELEMENT_SIZE_FALLBACK };\n }\n const { width, height } = target.getBoundingClientRect();\n return { width, height };\n}\nexport function createElementSize(target) {\n if (isServer) {\n return ELEMENT_SIZE_FALLBACK;\n }\n const isFn = typeof target === \"function\";\n const [size, setSize] = createStaticStore(sharedConfig.context || isFn ? ELEMENT_SIZE_FALLBACK : getElementSize(target));\n const ro = new ResizeObserver(([e]) => setSize(getElementSize(e.target)));\n onCleanup(() => ro.disconnect());\n if (isFn) {\n createEffect(() => {\n const el = target();\n if (el) {\n setSize(getElementSize(el));\n ro.observe(el);\n onCleanup(() => ro.unobserve(el));\n }\n });\n }\n else {\n ro.observe(target);\n onCleanup(() => ro.unobserve(target));\n }\n return size;\n}\n","/**\n * Copyright (c) 2025 Microblink Ltd. All rights reserved.\n */\n\nimport { FitMode } from \"./CaptureScreen\";\n\n/**\n * Determines the fit mode for the video element based on the container and video dimensions.\n *\n * `cover` is only used when the cropped fraction is less than 10%.\n *\n * When using object-fit: cover, the video is scaled by\n * `s = max(Cw / Vw, Ch / Vh)`\n * so that one dimension exactly fills the container while the other overflows.\n * The overflowing dimension is then centered and cropped.\n *\n * For the dimension that overflows:\n * - If width is the dominant factor `(Cw/Vw > Ch/Vh)`, then\n * - `visible dimension = s * Vh` (actual scaled video height)\n * - `visible fraction = containerHeight / (s * Vh)`\n * - `croppedFraction = 1 - (containerHeight / (s * Vh))`\n *\n * - Otherwise, if height is dominant, then\n * - `visible dimension = s * Vw` (actual scaled video width)\n * - `visible fraction = containerWidth / (s * Vw)`\n * - `croppedFraction = 1 - (containerWidth / (s * Vw))`\n *\n * The croppedFraction represents the relative amount (fraction) of the video that is cropped\n * along the overflowing dimension. We choose \"cover\" only when the croppedFraction is below 10%.\n *\n * @param Cw - The container width.\n * @param Ch - The container height.\n * @param Vw - The video width.\n * @param Vh - The video height.\n * @returns The fit mode.\n */\nexport const determineFitMode = (\n Cw: number,\n Ch: number,\n Vw: number,\n Vh: number,\n): FitMode => {\n // Compute the overall scale used for object-fit: cover.\n // We want to fill the container completely, so we scale by the maximum required factor.\n const scaleCover = Math.max(Cw / Vw, Ch / Vh);\n\n // Determine the cropped fraction for the overflowing dimension.\n let croppedFraction = 0;\n if (Cw / Vw > Ch / Vh) {\n // When Cw/Vw > Ch/Vh, the video is scaled by width.\n // The width exactly fills the container.\n // The height becomes: scaleCover * Vh, which is greater than Ch.\n // The visible fraction of the video's height is Ch / (scaleCover * Vh).\n // Hence, the cropped fraction is the remaining part.\n const visible = scaleCover * Vh;\n croppedFraction = 1 - Ch / visible;\n } else {\n // When Cw/Vw <= Ch/Vh, the video is scaled by height.\n // The height exactly fills the container.\n // The width becomes: scaleCover * Vw, which is greater than Cw.\n // The visible fraction of the video's width is Cw / (scaleCover * Vw).\n // Hence, the cropped fraction is the remaining part.\n const visible = scaleCover * Vw;\n croppedFraction = 1 - Cw / visible;\n }\n\n // Use 'cover' if the cropped fraction is less than 10%; otherwise use 'contain'.\n if (croppedFraction < 0.1) {\n return \"cover\";\n } else {\n return \"contain\";\n }\n};\n","/**\n * Copyright (c) 2025 Microblink Ltd. All rights reserved.\n */\n\nimport { ExtractionArea } from \"../core/VideoFrameProcessor\";\n\n/**\n * Computes the visible portion of the video (in the video's natural coordinate space)\n * when rendered with object-fit: cover.\n *\n * @param containerWidth - The width of the container.\n * @param containerHeight - The height of the container.\n * @param videoWidth - The width of the video.\n * @param videoHeight - The height of the video.\n * @returns The visible portion of the video.\n */\nexport function getVisibleVideoArea(\n containerWidth: number,\n containerHeight: number,\n videoWidth: number,\n videoHeight: number,\n): ExtractionArea {\n // Compute scale factors for each dimension.\n const scaleX = containerWidth / videoWidth;\n const scaleY = containerHeight / videoHeight;\n // The overall scale used for object-fit: cover.\n const s = Math.max(scaleX, scaleY);\n\n if (scaleX >= scaleY) {\n // Video is scaled based on its width.\n // The scaled video's width is exactly containerWidth,\n // and its height is videoHeight * s (which is greater than containerHeight).\n // Therefore, in natural coordinates, the full video width is visible,\n // and the visible height is the container's height divided by s.\n const visibleNaturalHeight = Math.round(containerHeight / s);\n const y = Math.round((videoHeight - visibleNaturalHeight) / 2);\n return { x: 0, y: y, width: videoWidth, height: visibleNaturalHeight };\n } else {\n // Video is scaled based on its height.\n // The scaled video's height is exactly containerHeight,\n // and its width is videoWidth * s (which exceeds containerWidth).\n // Therefore, the full video height is visible,\n // and the visible width in natural coordinates is containerWidth divided by s.\n const visibleNaturalWidth = Math.round(containerWidth / s);\n const x = Math.round((videoWidth - visibleNaturalWidth) / 2);\n return { x: x, y: 0, width: visibleNaturalWidth, height: videoHeight };\n }\n}\n","/**\n * Copyright (c) 2025 Microblink Ltd. All rights reserved.\n */\n\nimport { Dialog } from \"@ark-ui/solid/dialog\";\nimport { JSX, ParentComponent, Show } from \"solid-js\";\nimport { Portal } from \"solid-js/web\";\nimport { SmartEnvironmentProvider } from \"./SmartEnvironmentProvider\";\n\nimport styles from \"./styles.module.scss\";\n\ntype ModalProps = {\n mountTarget: HTMLElement;\n headerImage?: JSX.Element;\n header?: string | JSX.Element;\n actions?: JSX.Element;\n showCloseButton?: boolean;\n onCloseClicked?: () => void;\n modalStyle?: \"compact\" | \"default\" | \"large\";\n} & Dialog.RootProps;\n\nexport const Modal: ParentComponent<ModalProps> = (props) => {\n const getPaddingClass = () => {\n switch (props.modalStyle) {\n case \"compact\":\n return styles.compact;\n case \"large\":\n return styles.compact;\n case \"default\":\n default:\n return undefined;\n }\n };\n\n return (\n <SmartEnvironmentProvider>\n {() => (\n <Dialog.Root\n // prevent closing by clicking outside\n onFocusOutside={(e) => e.preventDefault()}\n onInteractOutside={(e) => e.preventDefault()}\n restoreFocus\n unmountOnExit\n lazyMount\n // TODO: report bug to Ark UI\n // https://github.com/chakra-ui/zag/blob/a3ea8a50672aac3f25e5644d4708b9d8286a4302/CHANGELOG.md?plain=1#L1030C56-L1030C67\n // breaks focus trap\n // role=\"alertdialog\"\n {...props}\n >\n {/* Ark UI renders an empty portal even if it's not open, which is why\n we need to wrap it in a <Show>\n https://github.com/chakra-ui/ark/discussions/3252\n */}\n <Show when={props.open}>\n <Portal mount={props.mountTarget}>\n <Dialog.Positioner class={styles.dialogPositioner}>\n <Dialog.Backdrop class={styles.dialogBackdrop} />\n <Dialog.Content\n class={`${styles.dialogContent} ${getPaddingClass()}`}\n >\n {/* Close button */}\n <Show when={props.showCloseButton}>\n <Dialog.CloseTrigger\n class={styles.closeButton}\n onClick={props.onCloseClicked}\n >\n <span class={styles.closeButtonInner}>&times;</span>\n </Dialog.CloseTrigger>\n </Show>\n\n {/* headerImage */}\n <Show when={props.headerImage}>{props.headerImage}</Show>\n\n {/* header */}\n <Show when={props.header}>\n {(header) => (\n <Dialog.Title class={styles.dialogTitle}>\n {header()}\n </Dialog.Title>\n )}\n </Show>\n\n {/* Main content */}\n <Dialog.Description class={styles.contentOut}>\n {props.children}\n </Dialog.Description>\n\n {/* Action buttons */}\n <Show when={props.actions}>\n <div>{props.actions}</div>\n </Show>\n </Dialog.Content>\n </Dialog.Positioner>\n </Portal>\n </Show>\n </Dialog.Root>\n )}\n </SmartEnvironmentProvider>\n );\n};\n\ntype AlertModalProps = {\n mountTarget: HTMLElement;\n header: string;\n text: string;\n open: boolean;\n primaryButtonText?: string;\n secondaryButtonText?: string;\n onPrimaryClick: () => void;\n onSecondaryClick: () => void;\n};\n\nexport const AlertModal: ParentComponent<AlertModalProps> = ({\n mountTarget,\n header,\n text,\n open,\n onPrimaryClick,\n onSecondaryClick,\n primaryButtonText = \"Retry\",\n secondaryButtonText = \"Cancel\",\n}) => {\n let primaryButtonEl!: HTMLButtonElement;\n\n return (\n <Modal\n mountTarget={mountTarget}\n header={<span class={styles.alertTitle}>{header}</span>}\n initialFocusEl={() => primaryButtonEl}\n open={open}\n actions={\n <div class={styles.actions}>\n <button\n class={styles.secondaryActionButton}\n onClick={() => onSecondaryClick()}\n >\n {secondaryButtonText}\n </button>\n <button\n ref={primaryButtonEl}\n class={styles.primaryActionButton}\n onClick={() => onPrimaryClick()}\n >\n {primaryButtonText}\n </button>\n </div>\n }\n modalStyle=\"compact\"\n >\n <p class={styles.alertText}>{text}</p>\n </Modal>\n );\n};\n","/**\n * Copyright (c) 2025 Microblink Ltd. All rights reserved.\n */\n\nimport { AlertModal } from \"@microblink/shared-components/AlertModal\";\nimport { Component, Show } from \"solid-js\";\nimport { useCameraUiStore } from \"./CameraUiStoreContext\";\nimport { cameraUiRefSignalStore } from \"./zustandRefStore\";\nimport { useLocalization } from \"./LocalizationContext\";\n\n/**\n * The CameraErrorModal component.\n */\nconst CameraErrorModal: Component = () => {\n const { t } = useLocalization();\n\n const { cameraManagerSolidStore, cameraManager, dismountCameraUi } =\n useCameraUiStore();\n const errorState = cameraManagerSolidStore((x) => x.errorState);\n const overlayLayer = cameraUiRefSignalStore((x) => x.overlayLayer);\n\n // TODO: handle only permission error for now\n\n return (\n <>\n <Show when={errorState()}>\n <AlertModal\n mountTarget={overlayLayer()}\n header={t.camera_error_title}\n open={true}\n onPrimaryClick={() => void cameraManager.startCameraStream()}\n onSecondaryClick={() => dismountCameraUi()}\n primaryButtonText={t.camera_error_primary_btn}\n secondaryButtonText={t.camera_error_cancel_btn}\n text={t.camera_error_details}\n />\n </Show>\n </>\n );\n};\n\nexport { CameraErrorModal };\n","/**\n * Copyright (c) 2025 Microblink Ltd. All rights reserved.\n */\n\nimport { SmartEnvironmentProvider } from \"@microblink/shared-components/SmartEnvironmentProvider\";\nimport {\n Component,\n createEffect,\n createSignal,\n getOwner,\n onCleanup,\n onMount,\n Show,\n} from \"solid-js\";\n\nimport { Dialog } from \"@ark-ui/solid/dialog\";\n\nimport { useCameraUiStore } from \"./CameraUiStoreContext\";\nimport { Header } from \"./Header\";\n\nimport { SolidShadowRoot } from \"./SolidShadowRoot\";\n\nimport normalize from \"@csstools/normalize.css?inline\";\nimport { Portal } from \"solid-js/web\";\nimport { MOUNT_POINT_ID } from \"./createCameraManagerUi\";\nimport { useLocalization } from \"./LocalizationContext\";\nimport rootStyles from \"./styles/root-styles.scss?inline\";\nimport variables from \"./styles/variables.scss?inline\";\nimport { cameraUiRefSignalStore } from \"./zustandRefStore\";\n\nimport { makeResizeObserver } from \"@solid-primitives/resize-observer\";\nimport { determineFitMode } from \"./determineFitMode\";\nimport { getVisibleVideoArea } from \"./getVisibleVideoArea\";\nimport { CameraErrorModal } from \"./CameraErrorModal\";\n\n// TODO: Full screen background\n\n/**\n * The capture screen shadow root host ID.\n */\nexport const CAPTURE_SCREEN_SHADOW_ROOT_HOST_ID = \"capture-screen-host\";\n\n/**\n * The fit mode.\n */\nexport type FitMode = \"contain\" | \"cover\";\n\n/**\n * The CaptureScreen component.\n */\nexport const CaptureScreen: Component = () => {\n const { cameraManager, mountTarget, showCameraErrorModal } =\n useCameraUiStore();\n\n const [videoRef, setVideoRef] = createSignal<HTMLVideoElement>();\n // Reference to the feedback layer, using signals because of 1 tick rendering\n // delay due to attaching shadow root\n const [feedbackRef, setFeedbackRef] = createSignal<HTMLDivElement>();\n const [overlayLayerRef, setOverlayLayerRef] = createSignal<HTMLDivElement>();\n\n /** We use only 1 shadow root. If not portalled, enable SolidShadowRoot */\n const isPortalled = () => mountTarget.parentNode === document.body;\n\n const [fitMode, setFitMode] = createSignal<FitMode>(\"contain\");\n\n /**\n * Adjusts the video fit.\n */\n function adjustVideoFit() {\n const video = videoRef();\n\n if (!video) {\n return;\n }\n\n const Cw = video.clientWidth;\n const Ch = video.clientHeight;\n const Vw = video.videoWidth;\n const Vh = video.videoHeight;\n\n const newFitMode = determineFitMode(Cw, Ch, Vw, Vh);\n\n setFitMode(newFitMode);\n\n // TODO: Should we move this to the camera manager?\n if (newFitMode === \"cover\") {\n const visibleArea = getVisibleVideoArea(Cw, Ch, Vw, Vh);\n cameraManager.setExtractionArea(visibleArea);\n } else {\n cameraManager.setExtractionArea({\n x: 0,\n y: 0,\n width: Vw,\n height: Vh,\n });\n }\n }\n\n // resize observer effect\n onMount(() => {\n const video = videoRef();\n\n if (!video) {\n return;\n }\n\n const { observe, unobserve } = makeResizeObserver(adjustVideoFit);\n\n observe(video);\n\n video.addEventListener(\"loadedmetadata\", adjustVideoFit);\n\n onCleanup(() => {\n unobserve(video);\n video.removeEventListener(\"loadedmetadata\", adjustVideoFit);\n });\n });\n\n // owner effect\n onMount(() => {\n const owner = getOwner();\n\n if (!owner) {\n return;\n }\n\n cameraUiRefSignalStore.setState({\n owner,\n });\n });\n\n createEffect(() => {\n const $videoRef = videoRef();\n const $feedbackRef = feedbackRef();\n const $overlayLayerRef = overlayLayerRef();\n\n if (!$videoRef || !$feedbackRef || !$overlayLayerRef) {\n return;\n }\n\n cameraUiRefSignalStore.setState({\n feedbackLayer: $feedbackRef,\n overlayLayer: $overlayLayerRef,\n });\n\n cameraManager.initVideoElement($videoRef);\n });\n\n return (\n <SolidShadowRoot\n id={!isPortalled() ? CAPTURE_SCREEN_SHADOW_ROOT_HOST_ID : undefined}\n // We disable the shadow root if the component is portalled as it's\n // already provided by the portal\n disableShadowRoot={isPortalled()}\n style={\n isPortalled()\n ? {\n height: \"100%\",\n }\n : undefined\n }\n >\n <style>{variables}</style>\n <style>{normalize}</style>\n <style>{rootStyles}</style>\n <style\n id=\"camera-manager-style\"\n ref={(ref) => {\n if (window.__mbCameraManagerCssCode) {\n ref.innerHTML = window.__mbCameraManagerCssCode;\n }\n }}\n />\n\n <div\n class=\"bg-dark-500 color-white size-full relative min-h-[300px]\"\n part=\"capture-screen-part\"\n >\n {/* Toolbar header */}\n <Header />\n\n {/* Video feed */}\n <video\n part=\"video-element-part\"\n class=\"block absolute top-0 left-0 size-full\"\n style={{\n \"object-fit\": fitMode(),\n }}\n ref={setVideoRef}\n />\n\n {/* Feedback node used for showing UI messages during scanning */}\n <div\n ref={setFeedbackRef}\n class=\"absolute top-0 left-0 w-full h-full z-1\"\n id=\"feedback-layer\"\n />\n\n {/* Overlay node used for displaying dialogs */}\n <div\n ref={setOverlayLayerRef}\n // overlay layer is above the feedback layer and Header\n // `data-scope` is a hack to only apply z-index if there is a modal present inside this div\n // TODO: see if there is a better way to handle this\n // do we need full-screen overlay? (positioner only)\n class=\"absolute top-0 left-0 w-full h-full has-[[data-scope]]:z-2\"\n id=\"overlay-layer\"\n />\n\n {/* Error modals need to be rendered after the overlayLayer ref is present */}\n <Show when={showCameraErrorModal}>\n <CameraErrorModal />\n </Show>\n </div>\n </SolidShadowRoot>\n );\n};\n\n/**\n * The CaptureScreenPortalled component.\n */\nexport const CaptureScreenPortalled: Component = () => {\n const { t } = useLocalization();\n\n // we need to close the modal before the camera manager is destroyed\n // so we use the addOnDismountCallback which are run before dismounting\n // the SolidJS Camera Manager component\n const [isOpen, setIsOpen] = createSignal(true);\n const { addOnDismountCallback } = useCameraUiStore();\n\n addOnDismountCallback(() => {\n setIsOpen(false);\n });\n\n return (\n <Portal\n useShadow={true}\n mount={document.getElementById(MOUNT_POINT_ID)!}\n // TODO: see if there is a better way to handle this\n ref={(ref) => {\n ref.id = CAPTURE_SCREEN_SHADOW_ROOT_HOST_ID;\n // TODO: this needs to be configurable by the user\n ref.style.zIndex = \"1000\";\n ref.style.position = \"fixed\";\n ref.id = \"mb-camera-host\";\n return ref;\n }}\n >\n <SmartEnvironmentProvider>\n {(rootNode) => (\n <Dialog.Root\n open={isOpen()}\n lazyMount\n unmountOnExit\n // hack to prevent focusing any items, but focusing on the shadow root\n initialFocusEl={() => {\n const dummyNode = document.createElement(\"div\");\n dummyNode.tabIndex = -1;\n rootNode.appendChild(dummyNode);\n setTimeout(() => {\n dummyNode.remove();\n }, 0);\n return dummyNode;\n }}\n >\n <Dialog.Positioner>\n <Dialog.Content\n aria-labelledby=\"dialog-title\"\n class=\"h-vh supports-[(height:100dvh)]:h-dvh top-0 left-0 w-full fixed\"\n >\n <Dialog.Title class=\"sr-only\" id=\"dialog-title\">\n {t.scan_document}\n </Dialog.Title>\n <CaptureScreen />\n </Dialog.Content>\n </Dialog.Positioner>\n </Dialog.Root>\n )}\n </SmartEnvironmentProvider>\n </Portal>\n );\n};\n","/**\n * Copyright (c) 2025 Microblink Ltd. All rights reserved.\n */\n\n/* @refresh reload */\n\nimport { Component } from \"solid-js\";\nimport { Dynamic } from \"solid-js/web\";\nimport { CaptureScreen, CaptureScreenPortalled } from \"./CaptureScreen\";\n\nimport { useCameraUiStore } from \"./CameraUiStoreContext\";\n\n/**\n * The root component.\n */\nconst RootComponent: Component = () => {\n const { mountTarget } = useCameraUiStore();\n\n return (\n <>\n <Dynamic\n component={\n mountTarget.parentNode === document.body\n ? CaptureScreenPortalled\n : CaptureScreen\n }\n />\n </>\n );\n};\n\nexport { RootComponent };\n","/**\n * Copyright (c) 2025 Microblink Ltd. All rights reserved.\n */\n\nimport { render } from \"solid-js/web\";\n\nimport { SetStoreFunction } from \"solid-js/store\";\nimport { CameraManager } from \"../core/CameraManager\";\nimport { CameraUiStoreProvider } from \"./CameraUiStoreContext\";\nimport {\n CameraUiLocalizationStrings,\n LocalizationProvider,\n} from \"./LocalizationContext\";\nimport { RootComponent } from \"./RootComponent\";\nimport { cameraUiRefStore } from \"./zustandRefStore\";\n\n/**\n * The default mount point ID.\n */\nexport const MOUNT_POINT_ID = \"camera-manager-mount-point\";\n\n// this triggers extraction of CSS from the UnoCSS plugin\nimport { Owner } from \"solid-js\";\nimport \"virtual:uno.css\";\n\n/**\n * The camera manager component.\n */\nexport type CameraManagerComponent = {\n /** The camera manager. */\n cameraManager: CameraManager;\n /** Updates the localization strings */\n updateLocalization: SetStoreFunction<CameraUiLocalizationStrings>;\n /** Dismounts the component from the DOM and unloads the SDK */\n dismount: () => void;\n /**\n * Sets a callback to be called when the component is unmounted.\n * Returns a cleanup function that removes the callback when called.\n */\n addOnDismountCallback: (fn: DismountCallback) => () => void;\n /**\n * The feedback layer node that can be used to append custom feedback elements\n */\n feedbackLayerNode: HTMLDivElement;\n /**\n * The overlay layer node that can be used to append custom overlay elements\n */\n overlayLayerNode: HTMLDivElement;\n\n /**\n * The owner of the component.\n *\n * @see https://docs.solidjs.com/reference/reactive-utilities/get-owner\n */\n owner: Owner;\n};\n\n/**\n * A dismount callback.\n */\nexport type DismountCallback = () => void;\n\n/**\n * The camera manager UI options.\n */\nexport type CameraManagerUiOptions = {\n /**\n * The localization strings.\n */\n localizationStrings?: Partial<CameraUiLocalizationStrings>;\n /**\n * If set to `true`, the mirror camera button will be shown.\n *\n * @defaultValue false\n */\n showMirrorCameraButton?: boolean;\n /**\n * If set to `true`, the torch button will be shown.\n *\n * @defaultValue true\n */\n showTorchButton?: boolean;\n /**\n * If set to `true`, the close button will be shown.\n *\n * @defaultValue true\n */\n showCloseButton?: boolean;\n /**\n * If set to `true`, the camera error modal will be shown.\n *\n * @defaultValue true\n */\n showCameraErrorModal?: boolean;\n};\n\n/**\n * Creates a new Camera Manager UI component.\n *\n * @param cameraManager - The camera manager.\n * @param target - The target element to mount the component to.\n * @param options - The options for the camera manager UI.\n * @returns The camera manager UI component.\n */\nexport function createCameraManagerUi(\n cameraManager: CameraManager,\n target?: HTMLElement,\n {\n localizationStrings,\n showMirrorCameraButton = false,\n showTorchButton = true,\n showCloseButton = true,\n showCameraErrorModal = true,\n }: CameraManagerUiOptions = {},\n): Promise<CameraManagerComponent> {\n // The mountable HTML element.\n let mountTarget: HTMLElement;\n const dismountCallbacks = new Set<DismountCallback>();\n\n // A reference to the `updateLocalization` function inside the `LocalizationProvider`\n let updateLocalizationRef!: SetStoreFunction<CameraUiLocalizationStrings>;\n\n // This function is called by the `LocalizationProvider` to lift the state update function up\n const setLocalizationRef = (\n setter: SetStoreFunction<CameraUiLocalizationStrings>,\n ) => {\n updateLocalizationRef = setter;\n };\n\n /**\n * Cleans up the camera manager.\n */\n const cleanupCameraManager = () => {\n cameraManager.reset();\n };\n\n // A reference to the dismount function.\n let dismountRef: () => void;\n\n /**\n * Dismounts the camera manager UI.\n */\n const dismountCameraManagerUi = () => {\n try {\n console.debug(\"🧱 Dismounting camera manager UI\");\n for (const callback of dismountCallbacks) {\n callback();\n }\n dismountCallbacks.clear();\n\n cleanupCameraManager();\n\n // We need to delay the dismount to give time for cleanups to run\n // use 2 rAFs to ensure that all cleanup functions are run\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n if (dismountRef) {\n // Check if it exists\n dismountRef();\n }\n\n mountTarget.remove();\n\n cleanupCameraManager();\n });\n });\n } catch (e) {\n console.warn(\"Error while dismounting camera manager UI\", e);\n // component is already unmounted\n }\n };\n\n /**\n * We create a dummy element that will be the target of the `dismount()` function if no target is provided.\n * If we simply provide `document.body`, `dismount()` will clear the entire document body:\n *\n * https://www.solidjs.com/docs/latest/api#render\n *\n * This is a DX optimization so that users don't need to provide their own\n * dummy mount points if they are using a portalled component anyway\n */\n const newMountTarget = document.createElement(\"div\");\n newMountTarget.id = MOUNT_POINT_ID;\n mountTarget = newMountTarget;\n\n if (target) {\n target.appendChild(newMountTarget);\n } else {\n document.body.appendChild(newMountTarget);\n }\n\n /**\n * Adds a callback to be called when the component is unmounted.\n * Returns a cleanup function that removes the callback when called.\n *\n * @param fn - The callback function to be called when the component is unmounted\n * @returns A cleanup function that removes the callback when called\n */\n const addOnDismountCallback = (fn: DismountCallback) => {\n dismountCallbacks.add(fn);\n\n return () => {\n dismountCallbacks.delete(fn);\n };\n };\n\n /**\n * Renders the camera manager UI.\n */\n dismountRef = render(\n () => (\n <LocalizationProvider\n userStrings={localizationStrings}\n setLocalizationRef={setLocalizationRef}\n >\n <CameraUiStoreProvider\n addOnDismountCallback={addOnDismountCallback}\n dismountCameraUi={dismountCameraManagerUi}\n cameraManager={cameraManager}\n showMirrorCameraButton={showMirrorCameraButton}\n showTorchButton={showTorchButton}\n showCloseButton={showCloseButton}\n showCameraErrorModal={showCameraErrorModal}\n mountTarget={mountTarget}\n >\n <RootComponent />\n </CameraUiStoreProvider>\n </LocalizationProvider>\n ),\n mountTarget,\n );\n\n // The exposed API for the component\n const exposedComponentApi: CameraManagerComponent = {\n updateLocalization: updateLocalizationRef,\n /**\n * Adds a callback to be called when the component is unmounted.\n * Returns a cleanup function that removes the callback when called.\n *\n * @param fn - The callback function to be called when the component is unmounted\n * @returns A cleanup function that removes the callback when called\n */\n addOnDismountCallback,\n cameraManager,\n // we know these are defined because `createCameraManagerUi` resolves when they are defined\n // TODO: maybe don't use getters but make sure they are defined\n get feedbackLayerNode() {\n return cameraUiRefStore.getState().feedbackLayer;\n },\n get overlayLayerNode() {\n return cameraUiRefStore.getState().overlayLayer;\n },\n get owner() {\n return cameraUiRefStore.getState().owner;\n },\n dismount: dismountCameraManagerUi,\n };\n\n // Resolves the promise when all references are ready, accounting for potential parent node change of shadow roots.\n return new Promise<CameraManagerComponent>((resolve) => {\n let videoExists = false;\n let feedbackExists = false;\n let overlayExists = false;\n\n // Initialize with no-op functions\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n let unsubscribeFeedbackLayer = () => {};\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n let unsubscribeOverlayLayer = () => {};\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n let unsubscribeVideo = () => {};\n\n const checkReady = () => {\n if (videoExists && feedbackExists && overlayExists) {\n unsubscribeFeedbackLayer();\n unsubscribeOverlayLayer();\n unsubscribeVideo();\n resolve(exposedComponentApi);\n }\n };\n\n // Assign the actual unsubscribe functions\n unsubscribeFeedbackLayer = cameraUiRefStore.subscribe(\n (x) => x.feedbackLayer,\n (feedbackLayer) => {\n if (feedbackLayer) {\n feedbackExists = true;\n }\n checkReady();\n },\n {\n fireImmediately: true,\n },\n );\n\n unsubscribeOverlayLayer = cameraUiRefStore.subscribe(\n (x) => x.overlayLayer,\n (overlayLayer) => {\n if (overlayLayer) {\n overlayExists = true;\n }\n checkReady();\n },\n {\n fireImmediately: true,\n },\n );\n\n unsubscribeVideo = cameraManager.subscribe(\n (state) => state.videoElement,\n (videoElement) => {\n if (videoElement) {\n videoExists = true;\n checkReady();\n }\n },\n {\n fireImmediately: true,\n },\n );\n });\n}\n","/**\n * Copyright (c) 2025 Microblink Ltd. All rights reserved.\n */\n\n/**\n * @packageDocumentation\n * Camera management utilities for web applications - provides camera access, selection, and video stream handling.\n * This package includes both core camera management functionality and UI components for camera selection\n * and feedback, with support for multiple camera devices and orientations.\n */\n\nimport \"rvfc-polyfill\";\n\nexport * from \"./core/Camera\";\nexport * from \"./core/cameraError\";\nexport * from \"./core/cameraManagerStore\";\nexport * from \"./core/CameraManager\";\nexport * from \"./core/VideoFrameProcessor\";\n\nexport * from \"./ui/createCameraManagerUi\";\nexport { cameraUiRefStore } from \"./ui/zustandRefStore\";\nexport type { CameraUiRefs } from \"./ui/zustandRefStore\";\nexport type {\n CameraUiLocalizationStrings,\n CameraUiLocaleRecord,\n} from \"./ui/LocalizationContext\";\n\n// https://newsletter.daishikato.com/p/detecting-dual-module-issues-in-jotai\nconst testSymbol = Symbol();\n\n/**\n * The global interface.\n */\ndeclare global {\n /* eslint-disable no-var */\n var __CAMERA_MANAGER__: typeof testSymbol;\n}\n\nglobalThis.__CAMERA_MANAGER__ ||= testSymbol;\nif (globalThis.__CAMERA_MANAGER__ !== testSymbol) {\n console.warn(\n \"Detected multiple instances of @microblink/camera-manager. This can lead to unexpected behavior.\",\n );\n}\n"],"names":["TemplateTag","template","cb","trimResultTransformer","stripIndentTransformer","replaceResultTransformer","replaceSubstitutionTransformer","inlineArrayTransformer","splitStringTransformer","isValidValue","removeNonPrintingValuesTransformer","initialState","createZustandStore","store","selectedCamera","resetStore","CameraUiStoreContext","createContext","createCameraManagerSolidStore","createWithSignal","cameraManagerStore","CameraUiStoreProvider","props","contextValue","cameraManagerSolidStore","cameraManager","dismountCameraUi","userInitiatedAbort","addOnDismountCallback","mountTarget","showMirrorCameraButton","showTorchButton","showCloseButton","showCameraErrorModal","onCleanup","console","debug","_$createComponent","Provider","value","children","useCameraUiStore","ctx","useContext","Error","LocalizationContext","LocalizationProvider","localizationStore","updateLocalizationStore","createStore","structuredClone","enLocaleStrings","userStrings","onMount","setLocalizationRef","t","updateLocalization","useLocalization","SmartEnvironmentProvider","rootNode","setRootNode","createSignal","ref","setRef","spanRef","getRootNode","Show","when","fallback","_el$","_tmpl$","_$use","EnvironmentProvider","_$spread","CameraSelector","cameras","x","isQueryingCameras","facingFilter","isSwapping","setIsSwapping","isDisabled","camerasWithFacingFilter","$facingFilter","filter","camera","includes","facingMode","createCameraOptions","map","deviceInfo","deviceId","label","name","cameraCollection","createListCollection","items","selectedCameraInCollection","$selectedCamera","foundCamera","find","isFakeCamera","fakeCameras","some","fakeCamera","selectCameraById","id","warn","selectCamera","Select","Root","part","collection","positioning","placement","lazyMount","disabled","onValueChange","details","Label","selected_camera","Trigger","asChild","selectProps","_$mergeProps","eventFixer","IconCamera","ValueText","placeholder","loading_cameras","select_a_camera","Indicator","IconChevronDown","Positioner","Content","ItemGroup","Index","each","index","Item","item","ItemText","ItemIndicator","IconCheck","_tmpl$2","Header","isMirrored","s","mirrorX","isActive","playbackState","torchEnabled","hasTorch","torchSupported","toggleTorch","toggleMirrorX","setCameraMirrorX","getState","_tmpl$3","_el$2","firstChild","_el$5","nextSibling","ToolbarButton","tooltipLabel","mirror_camera","onClick","_el$3","MirrorIcon","style","transform","_$memo","torch","_el$4","FlashOn","FlashOff","length","_el$6","close","_el$7","CloseIcon","Tooltip","tooltipProps","_el$8","_tmpl$4","SolidShadowRoot","owner","getOwner","local","others","splitProps","disableShadowRoot","shadowRoot","attachShadow","mode","renderWithOwner","feedbackLayer","overlayLayer","cameraUiRefStore","subscribeWithSelector","cameraUiRefSignalStore","Modal","getPaddingClass","modalStyle","styles","compact","undefined","Dialog","onFocusOutside","e","preventDefault","onInteractOutside","restoreFocus","unmountOnExit","open","Portal","mount","dialogPositioner","Backdrop","dialogBackdrop","dialogContent","CloseTrigger","closeButton","onCloseClicked","_$effect","_$className","closeButtonInner","headerImage","header","Title","dialogTitle","Description","contentOut","actions","AlertModal","text","onPrimaryClick","onSecondaryClick","primaryButtonText","secondaryButtonText","primaryButtonEl","_$insert","alertTitle","initialFocusEl","_tmpl$5","$$click","_ref$","_p$","_v$","_v$2","secondaryActionButton","_v$3","primaryActionButton","a","alertText","_$delegateEvents","CameraErrorModal","errorState","camera_error_title","startCameraStream","camera_error_primary_btn","camera_error_cancel_btn","camera_error_details","CAPTURE_SCREEN_SHADOW_ROOT_HOST_ID","CaptureScreen","videoRef","setVideoRef","feedbackRef","setFeedbackRef","overlayLayerRef","setOverlayLayerRef","isPortalled","parentNode","document","body","fitMode","setFitMode","adjustVideoFit","video","Cw","clientWidth","Ch","clientHeight","Vw","videoWidth","Vh","videoHeight","newFitMode","determineFitMode","visibleArea","getVisibleVideoArea","setExtractionArea","y","width","height","observe","unobserve","makeResizeObserver","addEventListener","removeEventListener","setState","createEffect","$videoRef","$feedbackRef","$overlayLayerRef","initVideoElement","variables","normalize","rootStyles","window","__mbCameraManagerCssCode","innerHTML","_$p","setProperty","removeProperty","CaptureScreenPortalled","isOpen","setIsOpen","useShadow","getElementById","MOUNT_POINT_ID","zIndex","position","dummyNode","createElement","tabIndex","appendChild","setTimeout","remove","scan_document","RootComponent","Dynamic","component","createCameraManagerUi","target","localizationStrings","dismountCallbacks","Set","updateLocalizationRef","setter","cleanupCameraManager","reset","dismountRef","dismountCameraManagerUi","callback","clear","requestAnimationFrame","newMountTarget","fn","add","delete","render","exposedComponentApi","feedbackLayerNode","overlayLayerNode","dismount","Promise","resolve","videoExists","feedbackExists","overlayExists","unsubscribeFeedbackLayer","unsubscribeOverlayLayer","unsubscribeVideo","checkReady","subscribe","fireImmediately","state","videoElement"],"mappings":"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","x_google_ignoreList":[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,30,31,47,48]}