vishwam-react-ent-sdk 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/request.js","../src/components/CheckLiveness.js","../node_modules/babel-plugin-transform-async-to-promises/helpers.mjs","../src/components/ReadDocument.js","../src/components/Init.js","../src/components/FaceMatch.js"],"sourcesContent":["/* eslint-disable no-undef */\nexport async function request(url, payload, method, token) {\n console.log(url, payload, method, token)\n const response = await fetch(url, {\n body: payload,\n method: method,\n // eslint-disable-next-line no-undef\n headers: new Headers({\n Authorization: 'Bearer ' + token\n })\n })\n const string = await response.text()\n const json = string === '' ? {} : JSON.parse(string)\n return json\n}\n\nexport async function requestToken(url, expiry) {\n // eslint-disable-next-line no-undef\n const formData = new FormData()\n formData.append('expiry_at', expiry)\n formData.append('app_id', 'jio_re-vef')\n formData.append('app_key', 'dmlzaHdhbS1zZWxma3lj')\n formData.append('send_token', '1')\n\n const response = await fetch(url, { body: formData, method: 'POST' })\n const json = await response.json()\n return json.token\n}\n","/* eslint-disable no-undef */\nimport React, {\n Fragment,\n useRef,\n useCallback,\n useState,\n useEffect\n} from 'react'\nimport Webcam from 'react-webcam'\nimport styled from 'styled-components'\nimport { BrowserView, MobileView, isMobile } from 'react-device-detect'\nimport { request, requestToken } from '../request'\nimport * as faceapi from 'face-api.js'\nimport { ReactComponent as EnableCapture } from './../enabled.svg'\nimport { ReactComponent as DisabledCapture } from './../disabled.svg'\nimport { ReactComponent as Loader } from './../loading.svg'\n\nconst videoConstraints = {\n audio: false,\n video: {\n facingMode: 'user'\n }\n}\n\nfunction frontalFaceCheck(landmarks) {\n if (!landmarks || landmarks.length < 68) {\n return false\n }\n\n const leftEyeCenter = {\n x: (landmarks[36].x + landmarks[39].x) / 2,\n y: (landmarks[36].y + landmarks[39].y) / 2\n }\n\n const rightEyeCenter = {\n x: (landmarks[42].x + landmarks[45].x) / 2,\n y: (landmarks[42].y + landmarks[45].y) / 2\n }\n\n const faceMiddlePoint = {\n x: (leftEyeCenter.x + rightEyeCenter.x) / 2,\n y: (leftEyeCenter.y + rightEyeCenter.y) / 2\n }\n\n const ratio = {\n x:\n (rightEyeCenter.x - landmarks[30].x) /\n (landmarks[30].x - leftEyeCenter.x),\n y:\n (landmarks[66].y - landmarks[30].y) /\n (landmarks[30].y - faceMiddlePoint.y)\n }\n\n if (ratio.x > 0.75 && ratio.x < 1.33 && ratio.y > 0.56 && ratio.y < 1.56) {\n return true\n }\n\n return false\n}\n\nasync function callLiveness(\n url,\n appId,\n userId,\n referenceId,\n captureType,\n eyesCheck,\n storeId,\n whiteBackground,\n expiryIn,\n img,\n img2,\n imageType\n) {\n const formData = new FormData()\n formData.append('image', dataURItoBlob(img2, imageType))\n formData.append('image2', dataURItoBlob(img, imageType))\n formData.append('app_id', appId)\n formData.append('user_id', userId)\n formData.append('referenceId', referenceId)\n formData.append('capture_type', captureType)\n formData.append('eyesCheck', eyesCheck)\n formData.append('store_id', storeId)\n formData.append('whiteBackground', whiteBackground)\n\n console.log('Performing Token API call')\n\n const token = await requestToken(url + '/get_auth_token', expiryIn)\n\n console.log('Performing Read Document API call')\n\n const response = await request(\n url + '/check_liveness',\n formData,\n 'POST',\n token\n )\n return response\n}\n\n// polyfill based on https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia\n;(function polyfillGetUserMedia() {\n if (typeof window === 'undefined') {\n return\n }\n\n // Older browsers might not implement mediaDevices at all, so we set an empty object first\n if (navigator.mediaDevices === undefined) {\n navigator.mediaDevices = {}\n }\n\n // Some browsers partially implement mediaDevices. We can't just assign an object\n // with getUserMedia as it would overwrite existing properties.\n // Here, we will just add the getUserMedia property if it's missing.\n if (navigator.mediaDevices.getUserMedia === undefined) {\n navigator.mediaDevices.getUserMedia = function (constraints) {\n // First get ahold of the legacy getUserMedia, if present\n const getUserMedia =\n navigator.getUserMedia ||\n navigator.webkitGetUserMedia ||\n navigator.mozGetUserMedia ||\n navigator.msGetUserMedia\n\n // Some browsers just don't implement it - return a rejected promise with an error\n // to keep a consistent interface\n if (!getUserMedia) {\n return Promise.reject(\n new Error('getUserMedia is not implemented in this browser')\n )\n }\n\n // Otherwise, wrap the call to the old navigator.getUserMedia with a Promise\n return new Promise(function (resolve, reject) {\n getUserMedia.call(navigator, constraints, resolve, reject)\n })\n }\n }\n})()\n\nfunction CheckLiveness({\n url,\n appId,\n userId,\n referenceId,\n captureType,\n eyesCheck,\n storeId,\n whiteBackground,\n expiryIn,\n getLivenessResponse\n}) {\n const webcamRef = useRef()\n const [disabled, setDisabled] = useState(false)\n const [frontal, setFrontal] = useState(false)\n const [loading, setLoading] = useState(false)\n const [cameraAvailable, setCameraAvailable] = React.useState(false)\n const [loadingText, setLoadingText] = useState(\n 'Please wait, while the face detector is initializing'\n )\n\n let interval\n\n const faceDetectionTimeout = null\n\n let videoStream = null\n\n let stopFaceDetection = false\n\n const capture = useCallback(async () => {\n setLoadingText('Please wait while we process the image')\n setLoading(true)\n\n stopFaceDetection = true\n\n const imageSrc = isMobile\n ? captureSnapshot()\n : webcamRef.current.getScreenshot({\n width: 450,\n height: 450\n })\n const imageResized = await resizeImage(imageSrc, 450, 450)\n const img = imageResized.split(',')[1]\n const mimeString = imageSrc.split(',')[0].split(':')[1].split(';')[0]\n const imgStr = await resizeImage(imageSrc, 224, 224)\n const img2 = imgStr.split(',')[1]\n clearInterval(interval)\n\n const response = await callLiveness(\n url,\n appId,\n userId,\n referenceId,\n captureType,\n eyesCheck,\n storeId,\n whiteBackground,\n expiryIn,\n img,\n img2,\n mimeString\n )\n response.livenessImage = img2\n response.livenessImageType = mimeString\n getLivenessResponse(response)\n setLoading(false)\n response.status === 'success' && setDisabled(true)\n }, [webcamRef])\n\n useEffect(() => {\n return () => {\n clearInterval(interval)\n stopFaceDetection = true\n if (faceDetectionTimeout) {\n clearTimeout(faceDetectionTimeout)\n }\n console.log('came here return')\n if(!videoStream) {\n videoStream.getTracks().forEach(function (track) {\n track.stop()\n })\n }\n }\n }, [])\n\n async function detectFace() {\n const videoEl = document.getElementById('webcam')\n const options = new faceapi.TinyFaceDetectorOptions()\n const result = await faceapi\n .detectSingleFace(videoEl, options)\n .withFaceLandmarks(true)\n return result\n }\n\n useEffect(() => {\n // init()\n\n setTimeout(() => {\n async function initModels() {\n await faceapi.nets.tinyFaceDetector.loadFromUri(\n 'https://www.rocksetta.com/tensorflowjs/saved-models/face-api-js/'\n )\n await faceapi.nets.faceLandmark68TinyNet.loadFromUri(\n 'https://www.rocksetta.com/tensorflowjs/saved-models/face-api-js/'\n )\n }\n\n if (isMobile) {\n startCamera()\n } else {\n initModels()\n }\n\n // init()\n }, 500)\n }, [])\n\n async function startCamera() {\n if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) {\n console.log('enumerateDevices() not supported.')\n }\n\n // List cameras and microphones.\n\n navigator.mediaDevices\n .enumerateDevices()\n .then(function (devices) {\n devices.forEach(function (device) {\n console.log(\n device.kind + ': ' + device.label + ' id = ' + device.deviceId\n )\n })\n })\n .catch(function (err) {\n console.log(err.name + ': ' + err.message)\n })\n\n navigator.mediaDevices\n .getUserMedia(videoConstraints)\n .then((stream) => {\n videoStream = stream\n setCameraAvailable(true)\n handleSuccess(stream)\n })\n .catch((err) => {\n console.log(err)\n const errString = err.toString()\n if (errString.includes('NotReadableError')) {\n setTimeout(() => {\n startCamera()\n }, 1000)\n } else if (err.name === 'NotAllowedError') {\n console.log('Camera Permission denied')\n const errObj = {\n status: 'failed',\n error: err.name,\n message: 'Camera Permission Denied'\n }\n getLivenessResponse(errObj)\n } else {\n alert(`getUserMedia error: ${err.toString()}`)\n }\n })\n }\n\n function stopCamera() {\n // const videoElement = document.getElementById('webcam')\n clearInterval(interval)\n stopFaceDetection = true\n const videoElement = webcamRef.current\n videoElement.pause()\n videoStream.getTracks().forEach(function (track) {\n track.stop()\n })\n }\n\n function handleSuccess(stream) {\n const videoElement = webcamRef.current\n\n // eslint-disable-next-line no-unused-vars\n let elementRendered = false\n\n const elementInterval = setInterval(() => {\n if (videoElement === null || videoElement === undefined) {\n console.log('rendering element')\n } else {\n console.log('element rendered')\n elementRendered = true\n videoElement.srcObject = stream\n setTimeout(() => {\n videoElement.play()\n init()\n }, 500)\n clearInterval(elementInterval)\n }\n }, 100)\n }\n\n async function init() {\n let isFaceDetectorLoaded = false\n\n // faceDetectionTimeout = setTimeout(() => {\n // faceDetectionTimeout = null\n // if (!isFaceDetectorLoaded) {\n // clearInterval(interval)\n // stopFaceDetection = true\n // setFrontal(true)\n // setLoading(false)\n // setLoadingText('')\n // }\n // }, 1000 * 10)\n\n await faceapi.nets.tinyFaceDetector.loadFromUri(\n 'https://www.rocksetta.com/tensorflowjs/saved-models/face-api-js/'\n )\n await faceapi.nets.faceLandmark68TinyNet.loadFromUri(\n 'https://www.rocksetta.com/tensorflowjs/saved-models/face-api-js/'\n )\n\n isFaceDetectorLoaded = true\n\n setTimeout(runFaceDetection, 500)\n\n setLoading(false)\n setLoadingText('')\n }\n\n async function runFaceDetection() {\n if (!stopFaceDetection) {\n const detection = await detectFace()\n if (detection) {\n const isFrontal = frontalFaceCheck(detection.landmarks.positions)\n if (isFrontal) {\n setFrontal(true)\n } else {\n setFrontal(false)\n }\n }\n }\n\n if (!stopFaceDetection) {\n setTimeout(runFaceDetection, 100)\n }\n }\n\n function trimCanvas(c) {\n var ctx = c.getContext('2d')\n var copy = document.createElement('canvas').getContext('2d')\n var pixels = ctx.getImageData(0, 0, c.width, c.height)\n var l = pixels.data.length\n var i\n var bound = {\n top: null,\n left: null,\n right: null,\n bottom: null\n }\n var x\n var y\n\n // Iterate over every pixel to find the highest\n // and where it ends on every axis ()\n for (i = 0; i < l; i += 4) {\n if (pixels.data[i + 3] !== 0) {\n x = (i / 4) % c.width\n y = ~~(i / 4 / c.width)\n\n if (bound.top === null) {\n bound.top = y\n }\n\n if (bound.left === null) {\n bound.left = x\n } else if (x < bound.left) {\n bound.left = x\n }\n\n if (bound.right === null) {\n bound.right = x\n } else if (bound.right < x) {\n bound.right = x\n }\n\n if (bound.bottom === null) {\n bound.bottom = y\n } else if (bound.bottom < y) {\n bound.bottom = y\n }\n }\n }\n\n // Calculate the height and width of the content\n var trimHeight = bound.bottom - bound.top\n var trimWidth = bound.right - bound.left\n var trimmed = ctx.getImageData(bound.left, bound.top, trimWidth, trimHeight)\n\n copy.canvas.width = trimWidth\n copy.canvas.height = trimHeight\n copy.putImageData(trimmed, 0, 0)\n\n // Return trimmed canvas\n return copy.canvas\n }\n\n function captureSnapshot() {\n const videoElement = webcamRef.current\n if (videoElement != null) {\n const hiddenCanvas = document.getElementById('hidden-canvas')\n hiddenCanvas.setAttribute('width', videoElement.offsetWidth)\n hiddenCanvas.setAttribute(\n 'height',\n videoElement.videoHeight /\n (videoElement.videoWidth / videoElement.offsetWidth)\n )\n const ctx = hiddenCanvas.getContext('2d')\n const destWidth = 450\n const destHeight = 450\n var sourceWidth = videoElement.videoWidth\n var sourceHeight = videoElement.videoHeight\n\n var ratio = sourceWidth / destWidth\n\n ctx.canvas.width = destWidth\n ctx.canvas.height = destHeight\n\n ctx.translate(ctx.canvas.width, 0)\n ctx.scale(-1, 1)\n\n ctx.drawImage(\n videoElement,\n sourceWidth / 2 - (destWidth / 2) * ratio,\n sourceHeight / 2 - (destHeight / 2) * ratio,\n destWidth * ratio,\n destHeight * ratio,\n 0,\n 0,\n destWidth,\n destHeight\n )\n\n var trimmedCanvas = trimCanvas(hiddenCanvas)\n\n var imageData = trimmedCanvas.toDataURL('image/png')\n\n stopCamera()\n\n return imageData\n }\n }\n\n async function resizeImage(base64, height, width) {\n return new Promise((resolve, reject) => {\n const canvas = document.createElement('canvas')\n const ctx = canvas.getContext('2d')\n const canvasCopy = document.createElement('canvas')\n const copyContext = canvasCopy.getContext('2d')\n\n const img = new Image()\n img.src = base64\n\n img.onload = () => {\n canvasCopy.width = img.width\n canvasCopy.height = img.height\n copyContext.drawImage(img, 0, 0)\n\n canvas.width = width\n canvas.height = height\n ctx.drawImage(\n canvasCopy,\n 0,\n 0,\n canvasCopy.width,\n canvasCopy.height,\n 0,\n 0,\n canvas.width,\n canvas.height\n )\n\n resolve(canvas.toDataURL())\n }\n })\n }\n\n return (\n <Fragment>\n {loading ? (\n <LoadingContainer>\n <Loader\n style={{\n width: '50%',\n margin: 'auto'\n }}\n />\n <Text\n style={{\n width: '75%',\n fontSize: '1rem',\n marginTop: isMobile ? '-100%' : '-25%',\n marginBottom: '0',\n fontWeight: '400',\n color: '#0e0e0e'\n }}\n >\n {loadingText}\n </Text>\n </LoadingContainer>\n ) : (\n <Fragment>\n <BrowserView>\n <Container>\n <h1\n style={{\n margin: '4% 0 0 0',\n fontSize: '2em',\n textAlign: 'center'\n }}\n >\n Face Capture\n </h1>\n <Webcam\n id='webcam'\n mirrored\n audio={false}\n ref={webcamRef}\n forceScreenshotSourceSize\n screenshotQuality='1'\n screenshotFormat='image/jpeg'\n videoConstraints={videoConstraints}\n style={{\n margin: '5% 0',\n borderRadius: '50%',\n objectFit: 'cover',\n width: '25%',\n height: '85%',\n border: `3px solid ${frontal ? 'green' : 'red'}`\n }}\n />\n <Text\n style={{\n width: '75%',\n fontSize: '1rem',\n marginTop: '5%',\n marginBottom: '0',\n fontWeight: '400'\n }}\n >\n {loadingText}\n </Text>\n <Button disabled={disabled || !frontal} onClick={capture}>\n {disabled || frontal ? (\n <EnableCapture\n style={{\n width: '80px',\n height: '80px',\n pointerEvents: 'auto'\n }}\n />\n ) : (\n <DisabledCapture\n style={{\n width: '80px',\n height: '80px',\n pointerEvents: 'none'\n }}\n />\n )}\n </Button>\n </Container>\n </BrowserView>\n <MobileView>\n <MobileContainer>\n <h1\n style={{\n margin: '10% 0 0 0',\n fontSize: '1.8rem',\n textAlign: 'center'\n }}\n >\n Face Capture\n </h1>\n <video\n id='webcam'\n playsInline\n autoPlay\n ref={webcamRef}\n style={{\n margin: '5% 0%',\n borderRadius: '50%',\n objectFit: 'cover',\n height: window.screen.height * 0.37,\n width: window.screen.width * 0.8,\n transform: 'scaleX(-1)',\n border: `3px solid ${frontal ? 'green' : 'red'}`\n }}\n />\n <canvas\n id='hidden-canvas'\n style={{\n display: 'none'\n }}\n />\n <Text\n style={{\n width: '75%',\n fontSize: '1rem',\n marginTop: '2%',\n marginBottom: '0',\n fontWeight: '400'\n }}\n >\n {loadingText}\n </Text>\n {cameraAvailable ? (\n <div />\n ) : (\n <Text\n style={{\n width: '75%',\n fontSize: '1rem',\n marginTop: '0',\n marginBottom: '0',\n fontWeight: '400',\n color: '#0e0e0e'\n }}\n >\n Accessing camera.. Please wait..\n </Text>\n )}\n <Button disabled={disabled || !frontal} onClick={capture}>\n {disabled || frontal ? (\n <EnableCapture\n style={{\n width: '80px',\n height: '80px',\n pointerEvents: 'auto'\n }}\n />\n ) : (\n <DisabledCapture\n style={{\n width: '80px',\n height: '80px',\n pointerEvents: 'none'\n }}\n />\n )}\n </Button>\n </MobileContainer>\n </MobileView>\n </Fragment>\n )}\n </Fragment>\n )\n}\n\nconst Container = styled.div`\n display: grid;\n place-items: center;\n`\n\nconst MobileContainer = styled.div`\n display: grid;\n place-items: center;\n`\n\nconst Button = styled.button`\n padding: 10px;\n margin: 10px;\n background-color: inherit;\n border: none;\n cursor: pointer;\n`\n\nconst LoadingContainer = styled.div`\n display: grid;\n place-items: center;\n height: 100vh;\n`\n\nconst Text = styled.h6`\n line-height: 1.5em;\n // height: 5em;\n overflow: hidden;\n text-align: center;\n`\n\nfunction dataURItoBlob(dataURI, imageType) {\n var byteString = atob(dataURI)\n\n var ab = new ArrayBuffer(byteString.length)\n var ia = new Uint8Array(ab)\n for (var i = 0; i < byteString.length; i++) {\n ia[i] = byteString.charCodeAt(i)\n }\n\n var bb = new Blob([ab], { type: imageType })\n return bb\n}\n\nexport { CheckLiveness, callLiveness }\n","// A type of promise-like that resolves synchronously and supports only one observer\nexport const _Pact = /*#__PURE__*/(function() {\n\tfunction _Pact() {}\n\t_Pact.prototype.then = function(onFulfilled, onRejected) {\n\t\tconst result = new _Pact();\n\t\tconst state = this.s;\n\t\tif (state) {\n\t\t\tconst callback = state & 1 ? onFulfilled : onRejected;\n\t\t\tif (callback) {\n\t\t\t\ttry {\n\t\t\t\t\t_settle(result, 1, callback(this.v));\n\t\t\t\t} catch (e) {\n\t\t\t\t\t_settle(result, 2, e);\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t} else {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}\n\t\tthis.o = function(_this) {\n\t\t\ttry {\n\t\t\t\tconst value = _this.v;\n\t\t\t\tif (_this.s & 1) {\n\t\t\t\t\t_settle(result, 1, onFulfilled ? onFulfilled(value) : value);\n\t\t\t\t} else if (onRejected) {\n\t\t\t\t\t_settle(result, 1, onRejected(value));\n\t\t\t\t} else {\n\t\t\t\t\t_settle(result, 2, value);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t_settle(result, 2, e);\n\t\t\t}\n\t\t};\n\t\treturn result;\n\t}\n\treturn _Pact;\n})();\n\n// Settles a pact synchronously\nexport function _settle(pact, state, value) {\n\tif (!pact.s) {\n\t\tif (value instanceof _Pact) {\n\t\t\tif (value.s) {\n\t\t\t\tif (state & 1) {\n\t\t\t\t\tstate = value.s;\n\t\t\t\t}\n\t\t\t\tvalue = value.v;\n\t\t\t} else {\n\t\t\t\tvalue.o = _settle.bind(null, pact, state);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tif (value && value.then) {\n\t\t\tvalue.then(_settle.bind(null, pact, state), _settle.bind(null, pact, 2));\n\t\t\treturn;\n\t\t}\n\t\tpact.s = state;\n\t\tpact.v = value;\n\t\tconst observer = pact.o;\n\t\tif (observer) {\n\t\t\tobserver(pact);\n\t\t}\n\t}\n}\n\nexport function _isSettledPact(thenable) {\n\treturn thenable instanceof _Pact && thenable.s & 1;\n}\n\n// Converts argument to a function that always returns a Promise\nexport function _async(f) {\n\treturn function() {\n\t\tfor (var args = [], i = 0; i < arguments.length; i++) {\n\t\t\targs[i] = arguments[i];\n\t\t}\n\t\ttry {\n\t\t\treturn Promise.resolve(f.apply(this, args));\n\t\t} catch(e) {\n\t\t\treturn Promise.reject(e);\n\t\t}\n\t}\n}\n\n// Awaits on a value that may or may not be a Promise (equivalent to the await keyword in ES2015, with continuations passed explicitly)\nexport function _await(value, then, direct) {\n\tif (direct) {\n\t\treturn then ? then(value) : value;\n\t}\n\tif (!value || !value.then) {\n\t\tvalue = Promise.resolve(value);\n\t}\n\treturn then ? value.then(then) : value;\n}\n\n// Awaits on a value that may or may not be a Promise, then ignores it\nexport function _awaitIgnored(value, direct) {\n\tif (!direct) {\n\t\treturn value && value.then ? value.then(_empty) : Promise.resolve();\n\t}\n}\n\n// Proceeds after a value has resolved, or proceeds immediately if the value is not thenable\nexport function _continue(value, then) {\n\treturn value && value.then ? value.then(then) : then(value);\n}\n\n// Proceeds after a value has resolved, or proceeds immediately if the value is not thenable\nexport function _continueIgnored(value) {\n\tif (value && value.then) {\n\t\treturn value.then(_empty);\n\t}\n}\n\n// Asynchronously iterate through an object that has a length property, passing the index as the first argument to the callback (even as the length property changes)\nexport function _forTo(array, body, check) {\n\tvar i = -1, pact, reject;\n\tfunction _cycle(result) {\n\t\ttry {\n\t\t\twhile (++i < array.length && (!check || !check())) {\n\t\t\t\tresult = body(i);\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\t\tresult = result.v;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult.then(_cycle, reject || (reject = _settle.bind(null, pact = new _Pact(), 2)));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pact) {\n\t\t\t\t_settle(pact, 1, result);\n\t\t\t} else {\n\t\t\t\tpact = result;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t_settle(pact || (pact = new _Pact()), 2, e);\n\t\t}\n\t}\n\t_cycle();\n\treturn pact;\n}\n\n// Asynchronously iterate through an object's properties (including properties inherited from the prototype)\n// Uses a snapshot of the object's properties\nexport function _forIn(target, body, check) {\n\tvar keys = [];\n\tfor (var key in target) {\n\t\tkeys.push(key);\n\t}\n\treturn _forTo(keys, function(i) { return body(keys[i]); }, check);\n}\n\n// Asynchronously iterate through an object's own properties (excluding properties inherited from the prototype)\n// Uses a snapshot of the object's properties\nexport function _forOwn(target, body, check) {\n\tvar keys = [];\n\tfor (var key in target) {\n\t\tif (Object.prototype.hasOwnProperty.call(target, key)) {\n\t\t\tkeys.push(key);\n\t\t}\n\t}\n\treturn _forTo(keys, function(i) { return body(keys[i]); }, check);\n}\n\nexport const _iteratorSymbol = /*#__PURE__*/ typeof Symbol !== \"undefined\" ? (Symbol.iterator || (Symbol.iterator = Symbol(\"Symbol.iterator\"))) : \"@@iterator\";\n\n// Asynchronously iterate through an object's values\n// Uses for...of if the runtime supports it, otherwise iterates until length on a copy\nexport function _forOf(target, body, check) {\n\tif (typeof target[_iteratorSymbol] === \"function\") {\n\t\tvar iterator = target[_iteratorSymbol](), step, pact, reject;\n\t\tfunction _cycle(result) {\n\t\t\ttry {\n\t\t\t\twhile (!(step = iterator.next()).done && (!check || !check())) {\n\t\t\t\t\tresult = body(step.value);\n\t\t\t\t\tif (result && result.then) {\n\t\t\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\t\t\tresult = result.v;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresult.then(_cycle, reject || (reject = _settle.bind(null, pact = new _Pact(), 2)));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (pact) {\n\t\t\t\t\t_settle(pact, 1, result);\n\t\t\t\t} else {\n\t\t\t\t\tpact = result;\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t_settle(pact || (pact = new _Pact()), 2, e);\n\t\t\t}\n\t\t}\n\t\t_cycle();\n\t\tif (iterator.return) {\n\t\t\tvar _fixup = function(value) {\n\t\t\t\ttry {\n\t\t\t\t\tif (!step.done) {\n\t\t\t\t\t\titerator.return();\n\t\t\t\t\t}\n\t\t\t\t} catch(e) {\n\t\t\t\t}\n\t\t\t\treturn value;\n\t\t\t}\n\t\t\tif (pact && pact.then) {\n\t\t\t\treturn pact.then(_fixup, function(e) {\n\t\t\t\t\tthrow _fixup(e);\n\t\t\t\t});\n\t\t\t}\n\t\t\t_fixup();\n\t\t}\n\t\treturn pact;\n\t}\n\t// No support for Symbol.iterator\n\tif (!(\"length\" in target)) {\n\t\tthrow new TypeError(\"Object is not iterable\");\n\t}\n\t// Handle live collections properly\n\tvar values = [];\n\tfor (var i = 0; i < target.length; i++) {\n\t\tvalues.push(target[i]);\n\t}\n\treturn _forTo(values, function(i) { return body(values[i]); }, check);\n}\n\nexport const _asyncIteratorSymbol = /*#__PURE__*/ typeof Symbol !== \"undefined\" ? (Symbol.asyncIterator || (Symbol.asyncIterator = Symbol(\"Symbol.asyncIterator\"))) : \"@@asyncIterator\";\n\n// Asynchronously iterate on a value using it's async iterator if present, or its synchronous iterator if missing\nexport function _forAwaitOf(target, body, check) {\n\tif (typeof target[_asyncIteratorSymbol] === \"function\") {\n\t\tvar pact = new _Pact();\n\t\tvar iterator = target[_asyncIteratorSymbol]();\n\t\titerator.next().then(_resumeAfterNext).then(void 0, _reject);\n\t\treturn pact;\n\t\tfunction _resumeAfterBody(result) {\n\t\t\tif (check && check()) {\n\t\t\t\treturn _settle(pact, 1, iterator.return ? iterator.return().then(function() { return result; }) : result);\n\t\t\t}\n\t\t\titerator.next().then(_resumeAfterNext).then(void 0, _reject);\n\t\t}\n\t\tfunction _resumeAfterNext(step) {\n\t\t\tif (step.done) {\n\t\t\t\t_settle(pact, 1);\n\t\t\t} else {\n\t\t\t\tPromise.resolve(body(step.value)).then(_resumeAfterBody).then(void 0, _reject);\n\t\t\t}\n\t\t}\n\t\tfunction _reject(error) {\n\t\t\t_settle(pact, 2, iterator.return ? iterator.return().then(function() { return error; }) : error);\n\t\t}\n\t}\n\treturn Promise.resolve(_forOf(target, function(value) { return Promise.resolve(value).then(body); }, check));\n}\n\n// Asynchronously implement a generic for loop\nexport function _for(test, update, body) {\n\tvar stage;\n\tfor (;;) {\n\t\tvar shouldContinue = test();\n\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\tshouldContinue = shouldContinue.v;\n\t\t}\n\t\tif (!shouldContinue) {\n\t\t\treturn result;\n\t\t}\n\t\tif (shouldContinue.then) {\n\t\t\tstage = 0;\n\t\t\tbreak;\n\t\t}\n\t\tvar result = body();\n\t\tif (result && result.then) {\n\t\t\tif (_isSettledPact(result)) {\n\t\t\t\tresult = result.s;\n\t\t\t} else {\n\t\t\t\tstage = 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (update) {\n\t\t\tvar updateValue = update();\n\t\t\tif (updateValue && updateValue.then && !_isSettledPact(updateValue)) {\n\t\t\t\tstage = 2;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tvar pact = new _Pact();\n\tvar reject = _settle.bind(null, pact, 2);\n\t(stage === 0 ? shouldContinue.then(_resumeAfterTest) : stage === 1 ? result.then(_resumeAfterBody) : updateValue.then(_resumeAfterUpdate)).then(void 0, reject);\n\treturn pact;\n\tfunction _resumeAfterBody(value) {\n\t\tresult = value;\n\t\tdo {\n\t\t\tif (update) {\n\t\t\t\tupdateValue = update();\n\t\t\t\tif (updateValue && updateValue.then && !_isSettledPact(updateValue)) {\n\t\t\t\t\tupdateValue.then(_resumeAfterUpdate).then(void 0, reject);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tshouldContinue = test();\n\t\t\tif (!shouldContinue || (_isSettledPact(shouldContinue) && !shouldContinue.v)) {\n\t\t\t\t_settle(pact, 1, result);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (shouldContinue.then) {\n\t\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresult = body();\n\t\t\tif (_isSettledPact(result)) {\n\t\t\t\tresult = result.v;\n\t\t\t}\n\t\t} while (!result || !result.then);\n\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t}\n\tfunction _resumeAfterTest(shouldContinue) {\n\t\tif (shouldContinue) {\n\t\t\tresult = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t} else {\n\t\t\t\t_resumeAfterBody(result);\n\t\t\t}\n\t\t} else {\n\t\t\t_settle(pact, 1, result);\n\t\t}\n\t}\n\tfunction _resumeAfterUpdate() {\n\t\tif (shouldContinue = test()) {\n\t\t\tif (shouldContinue.then) {\n\t\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t} else {\n\t\t\t\t_resumeAfterTest(shouldContinue);\n\t\t\t}\n\t\t} else {\n\t\t\t_settle(pact, 1, result);\n\t\t}\n\t}\n}\n\n// Asynchronously implement a do ... while loop\nexport function _do(body, test) {\n\tvar awaitBody;\n\tdo {\n\t\tvar result = body();\n\t\tif (result && result.then) {\n\t\t\tif (_isSettledPact(result)) {\n\t\t\t\tresult = result.v;\n\t\t\t} else {\n\t\t\t\tawaitBody = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tvar shouldContinue = test();\n\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\tshouldContinue = shouldContinue.v;\n\t\t}\n\t\tif (!shouldContinue) {\n\t\t\treturn result;\n\t\t}\n\t} while (!shouldContinue.then);\n\tconst pact = new _Pact();\n\tconst reject = _settle.bind(null, pact, 2);\n\t(awaitBody ? result.then(_resumeAfterBody) : shouldContinue.then(_resumeAfterTest)).then(void 0, reject);\n\treturn pact;\n\tfunction _resumeAfterBody(value) {\n\t\tresult = value;\n\t\tfor (;;) {\n\t\t\tshouldContinue = test();\n\t\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\t\tshouldContinue = shouldContinue.v;\n\t\t\t}\n\t\t\tif (!shouldContinue) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (shouldContinue.then) {\n\t\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresult = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\tresult = result.v;\n\t\t\t\t} else {\n\t\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t_settle(pact, 1, result);\n\t}\n\tfunction _resumeAfterTest(shouldContinue) {\n\t\tif (shouldContinue) {\n\t\t\tdo {\n\t\t\t\tresult = body();\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\t\tresult = result.v;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tshouldContinue = test();\n\t\t\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\t\t\tshouldContinue = shouldContinue.v;\n\t\t\t\t}\n\t\t\t\tif (!shouldContinue) {\n\t\t\t\t\t_settle(pact, 1, result);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} while (!shouldContinue.then);\n\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t} else {\n\t\t\t_settle(pact, 1, result);\n\t\t}\n\t}\n}\n\n// Asynchronously implement a switch statement\nexport function _switch(discriminant, cases) {\n\tvar dispatchIndex = -1;\n\tvar awaitBody;\n\touter: {\n\t\tfor (var i = 0; i < cases.length; i++) {\n\t\t\tvar test = cases[i][0];\n\t\t\tif (test) {\n\t\t\t\tvar testValue = test();\n\t\t\t\tif (testValue && testValue.then) {\n\t\t\t\t\tbreak outer;\n\t\t\t\t}\n\t\t\t\tif (testValue === discriminant) {\n\t\t\t\t\tdispatchIndex = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Found the default case, set it as the pending dispatch case\n\t\t\t\tdispatchIndex = i;\n\t\t\t}\n\t\t}\n\t\tif (dispatchIndex !== -1) {\n\t\t\tdo {\n\t\t\t\tvar body = cases[dispatchIndex][1];\n\t\t\t\twhile (!body) {\n\t\t\t\t\tdispatchIndex++;\n\t\t\t\t\tbody = cases[dispatchIndex][1];\n\t\t\t\t}\n\t\t\t\tvar result = body();\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tawaitBody = true;\n\t\t\t\t\tbreak outer;\n\t\t\t\t}\n\t\t\t\tvar fallthroughCheck = cases[dispatchIndex][2];\n\t\t\t\tdispatchIndex++;\n\t\t\t} while (fallthroughCheck && !fallthroughCheck());\n\t\t\treturn result;\n\t\t}\n\t}\n\tconst pact = new _Pact();\n\tconst reject = _settle.bind(null, pact, 2);\n\t(awaitBody ? result.then(_resumeAfterBody) : testValue.then(_resumeAfterTest)).then(void 0, reject);\n\treturn pact;\n\tfunction _resumeAfterTest(value) {\n\t\tfor (;;) {\n\t\t\tif (value === discriminant) {\n\t\t\t\tdispatchIndex = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (++i === cases.length) {\n\t\t\t\tif (dispatchIndex !== -1) {\n\t\t\t\t\tbreak;\n\t\t\t\t} else {\n\t\t\t\t\t_settle(pact, 1, result);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\ttest = cases[i][0];\n\t\t\tif (test) {\n\t\t\t\tvalue = test();\n\t\t\t\tif (value && value.then) {\n\t\t\t\t\tvalue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdispatchIndex = i;\n\t\t\t}\n\t\t}\n\t\tdo {\n\t\t\tvar body = cases[dispatchIndex][1];\n\t\t\twhile (!body) {\n\t\t\t\tdispatchIndex++;\n\t\t\t\tbody = cases[dispatchIndex][1];\n\t\t\t}\n\t\t\tvar result = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar fallthroughCheck = cases[dispatchIndex][2];\n\t\t\tdispatchIndex++;\n\t\t} while (fallthroughCheck && !fallthroughCheck());\n\t\t_settle(pact, 1, result);\n\t}\n\tfunction _resumeAfterBody(result) {\n\t\tfor (;;) {\n\t\t\tvar fallthroughCheck = cases[dispatchIndex][2];\n\t\t\tif (!fallthroughCheck || fallthroughCheck()) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdispatchIndex++;\n\t\t\tvar body = cases[dispatchIndex][1];\n\t\t\twhile (!body) {\n\t\t\t\tdispatchIndex++;\n\t\t\t\tbody = cases[dispatchIndex][1];\n\t\t\t}\n\t\t\tresult = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t_settle(pact, 1, result);\n\t}\n}\n\n// Asynchronously call a function and pass the result to explicitly passed continuations\nexport function _call(body, then, direct) {\n\tif (direct) {\n\t\treturn then ? then(body()) : body();\n\t}\n\ttry {\n\t\tvar result = Promise.resolve(body());\n\t\treturn then ? result.then(then) : result;\n\t} catch (e) {\n\t\treturn Promise.reject(e);\n\t}\n}\n\n// Asynchronously call a function and swallow the result\nexport function _callIgnored(body, direct) {\n\treturn _call(body, _empty, direct);\n}\n\n// Asynchronously call a function and pass the result to explicitly passed continuations\nexport function _invoke(body, then) {\n\tvar result = body();\n\tif (result && result.then) {\n\t\treturn result.then(then);\n\t}\n\treturn then(result);\n}\n\n// Asynchronously call a function and swallow the result\nexport function _invokeIgnored(body) {\n\tvar result = body();\n\tif (result && result.then) {\n\t\treturn result.then(_empty);\n\t}\n}\n\n// Asynchronously call a function and send errors to recovery continuation\nexport function _catch(body, recover) {\n\ttry {\n\t\tvar result = body();\n\t} catch(e) {\n\t\treturn recover(e);\n\t}\n\tif (result && result.then) {\n\t\treturn result.then(void 0, recover);\n\t}\n\treturn result;\n}\n\n// Asynchronously await a promise and pass the result to a finally continuation\nexport function _finallyRethrows(body, finalizer) {\n\ttry {\n\t\tvar result = body();\n\t} catch (e) {\n\t\treturn finalizer(true, e);\n\t}\n\tif (result && result.then) {\n\t\treturn result.then(finalizer.bind(null, false), finalizer.bind(null, true));\n\t}\n\treturn finalizer(false, result);\n}\n\n// Asynchronously await a promise and invoke a finally continuation that always overrides the result\nexport function _finally(body, finalizer) {\n\ttry {\n\t\tvar result = body();\n\t} catch (e) {\n\t\treturn finalizer();\n\t}\n\tif (result && result.then) {\n\t\treturn result.then(finalizer, finalizer);\n\t}\n\treturn finalizer();\n}\n\n// Rethrow or return a value from a finally continuation\nexport function _rethrow(thrown, value) {\n\tif (thrown)\n\t\tthrow value;\n\treturn value;\n}\n\n// Empty function to implement break and other control flow that ignores asynchronous results\nexport function _empty() {\n}\n\n// Sentinel value for early returns in generators \nexport const _earlyReturn = /*#__PURE__*/ {};\n\n// Asynchronously call a function and send errors to recovery continuation, skipping early returns\nexport function _catchInGenerator(body, recover) {\n\treturn _catch(body, function(e) {\n\t\tif (e === _earlyReturn) {\n\t\t\tthrow e;\n\t\t}\n\t\treturn recover(e);\n\t});\n}\n\n// Asynchronous generator class; accepts the entrypoint of the generator, to which it passes itself when the generator should start\nexport const _AsyncGenerator = /*#__PURE__*/(function() {\n\tfunction _AsyncGenerator(entry) {\n\t\tthis._entry = entry;\n\t\tthis._pact = null;\n\t\tthis._resolve = null;\n\t\tthis._return = null;\n\t\tthis._promise = null;\n\t}\n\n\tfunction _wrapReturnedValue(value) {\n\t\treturn { value: value, done: true };\n\t}\n\tfunction _wrapYieldedValue(value) {\n\t\treturn { value: value, done: false };\n\t}\n\n\t_AsyncGenerator.prototype._yield = function(value) {\n\t\t// Yield the value to the pending next call\n\t\tthis._resolve(value && value.then ? value.then(_wrapYieldedValue) : _wrapYieldedValue(value));\n\t\t// Return a pact for an upcoming next/return/throw call\n\t\treturn this._pact = new _Pact();\n\t};\n\t_AsyncGenerator.prototype.next = function(value) {\n\t\t// Advance the generator, starting it if it has yet to be started\n\t\tconst _this = this;\n\t\treturn _this._promise = new Promise(function (resolve) {\n\t\t\tconst _pact = _this._pact;\n\t\t\tif (_pact === null) {\n\t\t\t\tconst _entry = _this._entry;\n\t\t\t\tif (_entry === null) {\n\t\t\t\t\t// Generator is started, but not awaiting a yield expression\n\t\t\t\t\t// Abandon the next call!\n\t\t\t\t\treturn resolve(_this._promise);\n\t\t\t\t}\n\t\t\t\t// Start the generator\n\t\t\t\t_this._entry = null;\n\t\t\t\t_this._resolve = resolve;\n\t\t\t\tfunction returnValue(value) {\n\t\t\t\t\t_this._resolve(value && value.then ? value.then(_wrapReturnedValue) : _wrapReturnedValue(value));\n\t\t\t\t\t_this._pact = null;\n\t\t\t\t\t_this._resolve = null;\n\t\t\t\t}\n\t\t\t\tvar result = _entry(_this);\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tresult.then(returnValue, function(error) {\n\t\t\t\t\t\tif (error === _earlyReturn) {\n\t\t\t\t\t\t\treturnValue(_this._return);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst pact = new _Pact();\n\t\t\t\t\t\t\t_this._resolve(pact);\n\t\t\t\t\t\t\t_this._pact = null;\n\t\t\t\t\t\t\t_this._resolve = null;\n\t\t\t\t\t\t\t_resolve(pact, 2, error);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturnValue(result);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Generator is started and a yield expression is pending, settle it\n\t\t\t\t_this._pact = null;\n\t\t\t\t_this._resolve = resolve;\n\t\t\t\t_settle(_pact, 1, value);\n\t\t\t}\n\t\t});\n\t};\n\t_AsyncGenerator.prototype.return = function(value) {\n\t\t// Early return from the generator if started, otherwise abandons the generator\n\t\tconst _this = this;\n\t\treturn _this._promise = new Promise(function (resolve) {\n\t\t\tconst _pact = _this._pact;\n\t\t\tif (_pact === null) {\n\t\t\t\tif (_this._entry === null) {\n\t\t\t\t\t// Generator is started, but not awaiting a yield expression\n\t\t\t\t\t// Abandon the return call!\n\t\t\t\t\treturn resolve(_this._promise);\n\t\t\t\t}\n\t\t\t\t// Generator is not started, abandon it and return the specified value\n\t\t\t\t_this._entry = null;\n\t\t\t\treturn resolve(value && value.then ? value.then(_wrapReturnedValue) : _wrapReturnedValue(value));\n\t\t\t}\n\t\t\t// Settle the yield expression with a rejected \"early return\" value\n\t\t\t_this._return = value;\n\t\t\t_this._resolve = resolve;\n\t\t\t_this._pact = null;\n\t\t\t_settle(_pact, 2, _earlyReturn);\n\t\t});\n\t};\n\t_AsyncGenerator.prototype.throw = function(error) {\n\t\t// Inject an exception into the pending yield expression\n\t\tconst _this = this;\n\t\treturn _this._promise = new Promise(function (resolve, reject) {\n\t\t\tconst _pact = _this._pact;\n\t\t\tif (_pact === null) {\n\t\t\t\tif (_this._entry === null) {\n\t\t\t\t\t// Generator is started, but not awaiting a yield expression\n\t\t\t\t\t// Abandon the throw call!\n\t\t\t\t\treturn resolve(_this._promise);\n\t\t\t\t}\n\t\t\t\t// Generator is not started, abandon it and return a rejected Promise containing the error\n\t\t\t\t_this._entry = null;\n\t\t\t\treturn reject(error);\n\t\t\t}\n\t\t\t// Settle the yield expression with the value as a rejection\n\t\t\t_this._resolve = resolve;\n\t\t\t_this._pact = null;\n\t\t\t_settle(_pact, 2, error);\n\t\t});\n\t};\n\n\t_AsyncGenerator.prototype[_asyncIteratorSymbol] = function() {\n\t\treturn this;\n\t};\n\t\n\treturn _AsyncGenerator;\n})();\n","/* eslint-disable no-undef */\nimport React, { Fragment, useRef, useCallback, useEffect } from 'react'\nimport Webcam from 'react-webcam'\nimport styled from 'styled-components'\nimport { BrowserView, MobileView, isMobile } from 'react-device-detect'\nimport { ReactComponent as EnableCapture } from './../enabled.svg'\nimport { ReactComponent as DisabledCapture } from './../disabled.svg'\nimport { ReactComponent as Cam } from './../cam.svg'\nimport { request, requestToken } from '../request'\nimport { ReactComponent as Loader } from './../loading.svg'\n\nconst aspectRatios = {\n addhar: 0.625,\n pan: 0.625,\n passport: 0.67,\n voter: 1.2,\n pwd: 1.414,\n others: 1.414\n}\n\nconst FACING_MODE_USER = 'user'\nconst FACING_MODE_ENVIRONMENT = 'environment'\n\nasync function readDocumentCall(\n url,\n appId,\n referenceId,\n userId,\n decision,\n isBack,\n expiryIn,\n docType,\n documentType,\n img,\n img2,\n type\n) {\n const formData = new FormData()\n formData.append('app_id', appId)\n formData.append('referenceId', referenceId)\n formData.append('user_id', userId)\n formData.append('decision', decision)\n formData.append('journey', getJourney(docType))\n formData.append('doc_type', getDocType(docType))\n formData.append('document', documentType)\n formData.append('is_back', isBack)\n formData.append('image', dataURItoBlob(img, type))\n formData.append('image2', dataURItoBlob(img2, type))\n console.log('Performing Token API call')\n const token = await requestToken(url + '/get_auth_token', expiryIn)\n console.log('Performing Read Document API call')\n const resp = await request(url + '/read_document', formData, 'POST', token)\n return resp\n}\n\n// polyfill based on https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia\n;(function polyfillGetUserMedia() {\n if (typeof window === 'undefined') {\n return\n }\n\n // Older browsers might not implement mediaDevices at all, so we set an empty object first\n if (navigator.mediaDevices === undefined) {\n navigator.mediaDevices = {}\n }\n\n // Some browsers partially implement mediaDevices. We can't just assign an object\n // with getUserMedia as it would overwrite existing properties.\n // Here, we will just add the getUserMedia property if it's missing.\n if (navigator.mediaDevices.getUserMedia === undefined) {\n navigator.mediaDevices.getUserMedia = function (constraints) {\n // First get ahold of the legacy getUserMedia, if present\n const getUserMedia =\n navigator.getUserMedia ||\n navigator.webkitGetUserMedia ||\n navigator.mozGetUserMedia ||\n navigator.msGetUserMedia ||\n navigator.mediaDevices.getUserMedia ||\n navigator.mediaDevices.webkitGetUserMedia ||\n navigator.mediaDevices.mozGetUserMedia ||\n navigator.mediaDevices.msGetUserMedia\n\n // Some browsers just don't implement it - return a rejected promise with an error\n // to keep a consistent interface\n if (!getUserMedia) {\n return Promise.reject(\n new Error('getUserMedia is not implemented in this browser')\n )\n }\n\n // Otherwise, wrap the call to the old navigator.getUserMedia with a Promise\n return new Promise(function (resolve, reject) {\n getUserMedia.call(navigator, constraints, resolve, reject)\n })\n }\n }\n})()\n\nfunction ReadDocument({\n url,\n appId,\n referenceId,\n userId,\n decision,\n isBack,\n expiryIn,\n docType,\n documentType,\n getReadDocumentImage\n}) {\n const webcamRef = useRef()\n\n const [facingMode, setFacingMode] = React.useState(FACING_MODE_ENVIRONMENT)\n const [loading, setLoading] = React.useState(false)\n const [enableCapture, setEnableCapture] = React.useState(false)\n const [cameraAvailable, setCameraAvailable] = React.useState(false)\n const [isOriented, setIsOriented] = React.useState(true)\n\n const videoConstraints = {\n audio: false,\n video: {\n facingMode: facingMode\n }\n }\n\n // useEffect(() => {\n // return () => {\n // // clearInterval(interval)\n // window.removeEventListener('deviceorientation', handleOrientation, true)\n // videoStream.getTracks().forEach(function (track) {\n // track.stop()\n // })\n // }\n // }, [])\n\n let videoStream = null\n let camFacingMode = FACING_MODE_ENVIRONMENT\n\n let isCameraOpened = false\n\n const handleClick = React.useCallback(async () => {\n const videoElement = webcamRef.current\n\n if (camFacingMode === FACING_MODE_ENVIRONMENT) {\n camFacingMode = FACING_MODE_USER\n // videoElement.style.transform = 'scaleX(-1)'\n } else {\n camFacingMode = FACING_MODE_ENVIRONMENT\n // videoElement.style.transform = 'none'\n }\n\n setFacingMode(camFacingMode)\n\n console.log(facingMode)\n\n const videoTracks = videoStream.getVideoTracks()\n if (videoTracks.length === 0) {\n return\n }\n\n videoTracks.forEach(function (track: { stop: () => void }) {\n track.stop()\n })\n\n try {\n videoStream = await navigator.mediaDevices.getUserMedia(videoConstraints)\n videoElement.srcObject = videoStream\n } catch (err) {\n console.log(err)\n alert(err.toString())\n }\n }, [])\n\n const capture = useCallback(async () => {\n setLoading(true)\n // const imgStr = webcamRef.current.getScreenshot()\n const imgStr = isMobile\n ? await captureSnapshot()\n : webcamRef.current.getScreenshot()\n const img = imgStr.split(',')[1]\n const mimeString = imgStr.split(',')[0].split(':')[1].split(';')[0]\n const img2Str = await resizeImage(imgStr, 224, 224)\n const img2 = img2Str.split(',')[1]\n const response = await readDocumentCall(\n url,\n appId,\n referenceId,\n userId,\n decision,\n isBack,\n expiryIn,\n docType,\n documentType,\n img,\n img2,\n mimeString\n )\n response.image = img\n response.type = mimeString\n getReadDocumentImage(response)\n setLoading(false)\n }, [webcamRef])\n\n useEffect(() => {\n console.log('Vishwam SDK initialized')\n // prepareFaceDetector()\n\n if (typeof DeviceMotionEvent.requestPermission === 'function') {\n DeviceOrientationEvent.requestPermission()\n .then((response) => {\n console.log(response)\n if (response === 'granted') {\n window.addEventListener(\n 'deviceorientation',\n handleOrientation,\n true\n )\n setIsOriented(true)\n initUIandCamera()\n } else {\n }\n })\n .catch((err) => {\n console.log(err)\n setIsOriented(false)\n })\n } else {\n setIsOriented(true)\n initUIandCamera()\n if (typeof DeviceOrientationEvent !== 'undefined') {\n window.addEventListener('deviceorientation', handleOrientation, true)\n } else {\n window.addEventListener('orientationchange', handleOrientationIos, true)\n }\n }\n\n // if (isMobile) {\n // const videoElement = webcamRef.current\n // videoElement.style.height =\n // aspectRatios[docType] * videoElement.offsetWidth + 'px'\n // videoElement.style.minHeight =\n // aspectRatios[docType] * videoElement.offsetWidth + 'px'\n // startCamera()\n // }\n }, [webcamRef])\n\n function startCamera() {\n if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) {\n console.log('enumerateDevices() not supported.')\n }\n\n // List cameras and microphones.\n\n navigator.mediaDevices\n .enumerateDevices()\n .then(function (devices) {\n devices.forEach(function (device) {\n console.log(\n device.kind + ': ' + device.label + ' id = ' + device.deviceId\n )\n })\n })\n .catch(function (err) {\n console.log(err)\n })\n\n const supportedConstraints =\n navigator.mediaDevices.getSupportedConstraints()\n\n console.log('supported constraints: ', supportedConstraints)\n\n navigator.mediaDevices\n .getUserMedia({\n audio: false,\n video: {\n facingMode: facingMode\n }\n })\n .then((stream) => {\n webcamRef.current.srcObject = stream\n videoStream = stream\n setCameraAvailable(true)\n isCameraOpened = true\n webcamRef.current.play()\n // detectPhoneTilt()\n })\n .catch((err) => {\n console.log(err)\n console.log(err.name)\n const errString = err.toString()\n setCameraAvailable(false)\n isCameraOpened = false\n\n if (errString.includes('NotReadableError')) {\n setTimeout(() => {\n startCamera()\n }, 1000)\n } else if (err.name === 'NotAllowedError') {\n console.log('Camera Permission denied')\n const errObj = {\n status: 'failed',\n error: err.name,\n message: 'Camera Permission Denied'\n }\n getReadDocumentImage(errObj)\n } else {\n alert(`getUserMedia error: ${err.toString()}`)\n }\n })\n }\n\n function initUIandCamera() {\n setTimeout(() => {\n if (isMobile) {\n const videoElement = webcamRef.current\n videoElement.style.height =\n aspectRatios[docType] * videoElement.offsetWidth + 'px'\n videoElement.style.minHeight =\n aspectRatios[docType] * videoElement.offsetWidth + 'px'\n startCamera()\n }\n }, 500)\n }\n\n function detectPhoneTilt() {\n // setIsOriented(true)\n // initUIandCamera()\n // window.addEventListener('deviceorientation', handleOrientation, true)\n // return\n console.log('type of DeviceOrientationEvent', typeof DeviceOrientationEvent)\n\n if (typeof DeviceMotionEvent.requestPermission === 'function') {\n console.log('Requesting device orientation')\n DeviceOrientationEvent.requestPermission()\n .then((response) => {\n console.log('Device orientation request response', response)\n if (response === 'granted') {\n window.addEventListener(\n 'deviceorientation',\n handleOrientation,\n true\n )\n setIsOriented(true)\n initUIandCamera()\n } else {\n alert('Device motion detection rejected')\n const errObj = {\n status: 'Failed',\n error: 'Device motion detection access rejected'\n }\n getReadDocumentImage(errObj)\n }\n })\n .catch((err) => {\n console.log('Device orientation request error', err)\n getReadDocumentImage(err)\n })\n } else {\n setIsOriented(true)\n initUIandCamera()\n if (typeof DeviceOrientationEvent !== 'undefined') {\n window.addEventListener('deviceorientation', handleOrientation, true)\n } else {\n window.addEventListener('orientationchange', handleOrientationIos, true)\n }\n }\n }\n\n function handleOrientation(event) {\n const beta = event.beta // vertical angle\n const gamma = event.gamma // horizontal angle\n\n const pitch = 10\n const roll = 10\n\n if (camFacingMode === FACING_MODE_ENVIRONMENT) {\n if (\n beta > 0 - pitch &&\n beta < pitch &&\n gamma > 0 - roll &&\n gamma < roll\n ) {\n enableDocCapture()\n } else {\n disableDocCapture()\n }\n } else {\n enableDocCapture()\n }\n }\n\n function handleOrientationIos(event) {\n console.log('Orientation Ios', event)\n }\n\n function enableDocCapture() {\n console.log('is camera available - ', isCameraOpened)\n if (isCameraOpened) {\n setEnableCapture(true)\n } else {\n setEnableCapture(false)\n }\n }\n\n function disableDocCapture() {\n setEnableCapture(false)\n }\n\n async function captureSnapshot() {\n const videoElement = webcamRef.current\n if (videoElement != null) {\n window.removeEventListener('deviceorientation', handleOrientation, true)\n const videoHeight = videoElement.offsetWidth * aspectRatios[docType]\n const hiddenCanvas = document.getElementById('hidden-canvas')\n hiddenCanvas.setAttribute('width', videoElement.offsetWidth)\n hiddenCanvas.setAttribute('height', videoHeight)\n const ctx = hiddenCanvas.getContext('2d')\n let destWidth = videoElement.videoWidth\n let destHeight = videoElement.videoWidth * aspectRatios[docType]\n var sourceWidth = videoElement.videoWidth\n var sourceHeight = videoElement.videoHeight\n\n var ratio = sourceWidth / destWidth\n ctx.canvas.width = destWidth\n ctx.canvas.height = destHeight\n\n if (facingMode === FACING_MODE_USER) {\n ctx.translate(ctx.canvas.width, 0)\n ctx.scale(-1, 1)\n }\n\n if (docType === 'pwd' || docType === 'others') {\n destWidth = destWidth * 0.5\n destHeight = destWidth * aspectRatios[docType]\n ctx.canvas.width = destWidth\n ctx.canvas.height = destHeight\n ctx.drawImage(\n videoElement,\n 0,\n 0,\n sourceWidth,\n sourceHeight,\n 0,\n 0,\n destWidth,\n destHeight\n )\n } else {\n ctx.drawImage(\n videoElement,\n sourceWidth / 2 - (destWidth / 2) * ratio,\n sourceHeight / 2 - (destHeight / 2) * ratio,\n destWidth * ratio,\n destHeight * ratio,\n 0,\n 0,\n destWidth,\n destHeight\n )\n }\n\n var imageData = hiddenCanvas.toDataURL('image/png')\n\n let imageStr\n\n if (docType === 'pwd' || docType === 'others') {\n imageStr = await resizeImage(imageData, destHeight, destWidth)\n } else {\n imageStr = imageData\n }\n\n stopCamera()\n\n return imageStr\n }\n }\n\n function stopCamera() {\n const videoElement = webcamRef.current\n if (videoElement) {\n videoElement.pause()\n }\n if (videoStream) {\n videoStream.getTracks().forEach(function (track) {\n track.stop()\n })\n }\n }\n\n async function resizeImage(base64, height, width) {\n return new Promise((resolve, reject) => {\n const canvas = document.createElement('canvas')\n const ctx = canvas.getContext('2d')\n const canvasCopy = document.createElement('canvas')\n const copyContext = canvasCopy.getContext('2d')\n\n const img = new Image()\n img.src = base64\n\n img.onload = () => {\n canvasCopy.width = img.width\n canvasCopy.height = img.height\n copyContext.drawImage(img, 0, 0)\n\n canvas.width = width\n canvas.height = height\n ctx.drawImage(\n canvasCopy,\n 0,\n 0,\n canvasCopy.width,\n canvasCopy.height,\n 0,\n 0,\n canvas.width,\n canvas.height\n )\n\n resolve(canvas.toDataURL())\n }\n })\n }\n\n return (\n <Fragment>\n {loading ? (\n <LoadingContainer>\n <Loader\n style={{\n width: '50%',\n margin: 'auto'\n }}\n />\n <Text\n style={{\n width: '50%',\n fontSize: '1rem',\n marginTop: isMobile ? '-100%' : '-25%',\n marginBottom: '0',\n fontWeight: '400',\n color: '#0e0e0e'\n }}\n >\n Please wait while we process the image\n </Text>\n </LoadingContainer>\n ) : (\n <Fragment>\n <BrowserView>\n <Container>\n <h1\n style={{\n margin: '4% 0 4% 0',\n fontSize: '2em',\n textAlign: 'center'\n }}\n >\n {' '}\n Capture Document{' '}\n </h1>\n <Webcam\n id='video'\n forceScreenshotSourceSize\n audio={false}\n ref={webcamRef}\n width={isMobile ? screen.width : screen.width / 3}\n screenshotQuality='1'\n screenshotFormat='image/jpeg'\n videoConstraints={{\n ...videoConstraints,\n facingMode\n }}\n />\n <Text\n style={{\n width: '75%',\n fontSize: '1rem',\n marginTop: '5%',\n marginBottom: '0',\n fontWeight: '400',\n color: `${enableCapture ? '#0e0e0e' : '#FF422C'}`\n }}\n >\n {enableCapture\n ? 'Make sure your document is without any glare and is fully inside'\n : 'Hold the phone flat while capturing. Do not tilt the phone while capturing.'}\n </Text>\n <Flex style={{ marginTop: '-4%' }}>\n <Button onClick={capture}>\n <EnableCapture\n style={{\n width: '80px',\n height: '80px',\n pointerEvents: 'auto'\n }}\n />\n </Button>\n <Button onClick={handleClick}>\n <Cam\n style={{ width: '100%', height: '80%', objectFit: 'cover' }}\n />\n </Button>\n </Flex>\n </Container>\n </BrowserView>\n <MobileView>\n {isOriented ? (\n <MobileContainer style={{ width: '100%' }}>\n <h1\n style={{\n margin: '5% 0 0 0',\n fontSize: '1.8rem',\n textAlign: 'center'\n }}\n >\n {' '}\n Capture Document{' '}\n </h1>\n <video\n style={{\n margin: '5% 0 5% 0',\n objectFit: 'cover',\n transform: `${\n facingMode === FACING_MODE_USER ? 'scaleX(-1)' : 'none'\n }`\n }}\n id='video'\n ref={webcamRef}\n playsInline\n autoPlay\n width={isMobile ? screen.width * 0.85 : screen.width / 3}\n />\n <canvas\n id='hidden-canvas'\n style={{\n display: 'none'\n }}\n />\n <Text\n style={{\n width: '75%',\n fontSize: '1rem',\n marginTop: '2%',\n marginBottom: '0',\n fontWeight: '400',\n color: `${enableCapture ? '#0e0e0e' : '#FF422C'}`\n }}\n >\n {enableCapture\n ? 'Make sure your document is without any glare and is fully inside'\n : 'Hold the phone flat while capturing. Do not tilt the phone while capturing.'}\n </Text>\n {cameraAvailable ? (\n <div />\n ) : (\n <Text\n style={{\n width: '75%',\n fontSize: '1rem',\n marginTop: '0',\n marginBottom: '0',\n fontWeight: '400',\n color: '#0e0e0e'\n }}\n >\n Accessing camera.. Please wait..\n </Text>\n )}\n <div\n id='capture-container'\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center'\n }}\n >\n {/* <div> */}\n {/* <Cam */}\n {/* style={{ */}\n {/* width: '25%', */}\n {/* height: '25%', */}\n {/* visibility: 'hidden', */}\n {/* pointerEvents: 'none', */}\n {/* objectFit: 'cover' */}\n {/* }} */}\n {/* /> */}\n {/* </div> */}\n <Button onClick={capture} disabled={!enableCapture}>\n {enableCapture ? (\n <EnableCapture\n style={{\n width: '70px',\n height: '70px',\n pointerEvents: 'auto'\n }}\n />\n ) : (\n <DisabledCapture\n style={{\n width: '70px',\n height: '70px',\n pointerEvents: 'none'\n }}\n />\n )}\n </Button>\n {/* <Button onClick={handleClick}> */}\n {/* <Cam */}\n {/* style={{ */}\n {/* width: '40%', */}\n {/* height: '40%', */}\n {/* objectFit: 'cover' */}\n {/* }} */}\n {/* /> */}\n {/* </Button> */}\n </div>\n </MobileContainer>\n ) : (\n <Fragment>\n <div\n style={{\n margin: '40% auto 0',\n textAlign: 'center'\n }}\n >\n <h3>\n Please allow device motion detection to capture document\n </h3>\n <button\n style={{\n margin: '5% auto 0',\n backgroundColor: '#4a6eff',\n borderColor: '#4a6eff',\n color: '#fff',\n borderRadius: '15px',\n padding: '10px 15px'\n }}\n onClick={detectPhoneTilt}\n >\n Allow device motion\n </button>\n </div>\n </Fragment>\n )}\n </MobileView>\n </Fragment>\n )}\n </Fragment>\n )\n}\n\nconst Container = styled.div`\n display: grid;\n place-items: center;\n`\n\nconst MobileContainer = styled.div`\n display: grid;\n place-items: center;\n`\n\nconst Text = styled.h6`\n line-height: 1.5em;\n height: 5em;\n overflow: hidden;\n text-align: center;\n`\n\nconst Flex = styled.div`\n display: flex;\n width: 20%;\n`\n\nconst Button = styled.button`\n padding: 5px;\n margin: 5px;\n background-color: inherit;\n border: none;\n cursor: pointer;\n`\n\nconst LoadingContainer = styled.div`\n display: grid;\n place-items: center;\n height: 100vh;\n`\n\nfunction dataURItoBlob(dataURI, imageType) {\n var byteString = atob(dataURI)\n\n var ab = new ArrayBuffer(byteString.length)\n var ia = new Uint8Array(ab)\n for (var i = 0; i < byteString.length; i++) {\n ia[i] = byteString.charCodeAt(i)\n }\n\n var bb = new Blob([ab], { type: imageType })\n return bb\n}\n\nfunction getDocType(docType) {\n switch (docType) {\n case 'addhar':\n return '1'\n case 'pan':\n return '2'\n case 'voter':\n return '4'\n case 'passport':\n return '3'\n case 'pwd':\n return 'pwd'\n case 'others':\n return 'others'\n default:\n return '1'\n }\n}\n\nfunction getJourney(docType) {\n return 'na'\n}\nexport { ReadDocument }\n","import * as faceapi from 'face-api.js'\n\nexport function prepareFaceDetector() {\n console.log('loading models')\n Promise.all([\n faceapi.nets.tinyFaceDetector.loadFromUri(\n 'https://www.rocksetta.com/tensorflowjs/saved-models/face-api-js/'\n ),\n // faceapi.nets.faceLandmark68Net.loadFromUri('../models'),\n faceapi.nets.faceLandmark68TinyNet.loadFromUri(\n 'https://www.rocksetta.com/tensorflowjs/saved-models/face-api-js/'\n )\n ]).then((data) => {\n console.log('loaded models')\n const baseImage = new Image()\n baseImage.src = `data:image/png;base64,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`\n baseImage.onload = async function () {\n console.log('loaded base image')\n const options = new faceapi.TinyFaceDetectorOptions()\n const useTinyModel = true\n\n console.log('calling face detector')\n\n let detection = null\n\n const startTime = new Date()\n\n detection = await faceapi\n .detectSingleFace(baseImage, options)\n .withFaceLandmarks(useTinyModel)\n\n const timeTaken = new Date() - startTime\n\n console.log('Time taken for first detection', timeTaken)\n }\n })\n}\n","import { request, requestToken } from '../request'\n\nexport async function faceMatch(\n url,\n referenceId,\n userId,\n appId,\n matchType,\n image,\n image2,\n imageType\n) {\n // eslint-disable-next-line no-undef\n const formData = new FormData()\n\n formData.append('referenceId', referenceId)\n formData.append('user_id', userId)\n formData.append('app_id', appId)\n formData.append('match_type', matchType)\n formData.append('image', dataURItoBlob(image, imageType))\n formData.append('image2', dataURItoBlob(image2, imageType))\n const token = await requestToken(url + '/v2/get_auth_token', '1h')\n const resp = await request(url + '/v1/face_match', formData, 'POST', token)\n return resp\n}\n\nfunction dataURItoBlob(dataURI, imageType) {\n var byteString = atob(dataURI)\n\n var ab = new ArrayBuffer(byteString.length)\n var ia = new Uint8Array(ab)\n for (var i = 0; i < byteString.length; i++) {\n ia[i] = byteString.charCodeAt(i)\n }\n\n var bb = new Blob([ab], { type: imageType })\n return bb\n}"],"names":["requestToken","url","expiry","formData","FormData","append","Promise","resolve","fetch","body","method","then","response","json","token","e","reject","request","payload","console","log","headers","Headers","Authorization","text","string","JSON","parse","callLiveness","appId","userId","referenceId","captureType","eyesCheck","storeId","whiteBackground","expiryIn","img","img2","imageType","dataURItoBlob","videoConstraints","audio","video","facingMode","frontalFaceCheck","landmarks","length","leftEyeCenter","x","y","rightEyeCenter","faceMiddlePoint","ratio","polyfillGetUserMedia","window","navigator","mediaDevices","undefined","getUserMedia","constraints","webkitGetUserMedia","mozGetUserMedia","msGetUserMedia","Error","call","CheckLiveness","_ref","resizeImage","base64","height","width","canvas","document","createElement","ctx","getContext","canvasCopy","copyContext","Image","src","onload","drawImage","toDataURL","runFaceDetection","_temp2","stopFaceDetection","setTimeout","_temp","detectFace","detection","isFrontal","positions","setFrontal","init","isFaceDetectorLoaded","faceapi","tinyFaceDetector","loadFromUri","faceLandmark68TinyNet","setLoading","setLoadingText","startCamera","enumerateDevices","devices","forEach","device","kind","label","deviceId","err","name","message","stream","videoStream","setCameraAvailable","handleSuccess","errString","toString","includes","errObj","status","error","getLivenessResponse","alert","videoEl","getElementById","options","withFaceLandmarks","webcamRef","useRef","_useState","useState","disabled","setDisabled","_useState2","frontal","_useState3","loading","_React$useState","React","cameraAvailable","_useState4","loadingText","interval","capture","useCallback","imageSrc","isMobile","captureSnapshot","current","getScreenshot","imageResized","split","mimeString","imgStr","clearInterval","livenessImage","livenessImageType","useEffect","getTracks","track","stop","initModels","stopCamera","videoElement","pause","elementInterval","setInterval","srcObject","play","trimCanvas","c","copy","pixels","getImageData","l","data","i","bound","top","left","right","bottom","trimHeight","trimWidth","trimmed","putImageData","hiddenCanvas","setAttribute","offsetWidth","videoHeight","videoWidth","destWidth","destHeight","sourceWidth","sourceHeight","translate","scale","trimmedCanvas","imageData","Fragment","LoadingContainer","Loader","style","margin","Text","fontSize","marginTop","marginBottom","fontWeight","color","BrowserView","Container","textAlign","Webcam","id","mirrored","ref","forceScreenshotSourceSize","screenshotQuality","screenshotFormat","borderRadius","objectFit","border","Button","onClick","EnableCapture","pointerEvents","DisabledCapture","MobileView","MobileContainer","playsInline","autoPlay","screen","transform","display","styled","div","_templateObject","_taggedTemplateLiteralLoose","_templateObject2","button","_templateObject3","_templateObject4","h6","_templateObject5","dataURI","byteString","atob","ab","ArrayBuffer","ia","Uint8Array","charCodeAt","bb","Blob","type","readDocumentCall","decision","isBack","docType","documentType","getJourney","getDocType","aspectRatios","addhar","pan","passport","voter","pwd","others","FACING_MODE_USER","FACING_MODE_ENVIRONMENT","ReadDocument","_temp4","imageStr","removeEventListener","handleOrientation","_temp3","_resizeImage","getReadDocumentImage","setFacingMode","_React$useState2","_React$useState3","enableCapture","setEnableCapture","_React$useState4","_React$useState5","isOriented","setIsOriented","camFacingMode","isCameraOpened","handleClick","videoTracks","getVideoTracks","_catch","_navigator$mediaDevic","img2Str","image","DeviceMotionEvent","requestPermission","DeviceOrientationEvent","addEventListener","initUIandCamera","handleOrientationIos","supportedConstraints","getSupportedConstraints","minHeight","detectPhoneTilt","event","beta","gamma","pitch","roll","enableDocCapture","disableDocCapture","_extends","Flex","Cam","alignItems","justifyContent","backgroundColor","borderColor","padding","_templateObject6","prepareFaceDetector","all","baseImage","useTinyModel","startTime","Date","_faceapi$detectSingle","timeTaken","faceMatch","matchType","image2"],"mappings":"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"}