appium-android-driver 5.4.2 → 5.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/index.js +1 -9
- package/build/lib/android-helpers.js +10 -194
- package/build/lib/android-helpers.js.map +1 -1
- package/build/lib/bootstrap.js +4 -45
- package/build/lib/bootstrap.js.map +1 -1
- package/build/lib/commands/actions.js +3 -78
- package/build/lib/commands/actions.js.map +1 -1
- package/build/lib/commands/alert.js +3 -10
- package/build/lib/commands/alert.js.map +1 -1
- package/build/lib/commands/app-management.js +4 -32
- package/build/lib/commands/app-management.js.map +1 -1
- package/build/lib/commands/context.js +6 -78
- package/build/lib/commands/context.js.map +1 -1
- package/build/lib/commands/coverage.js +1 -6
- package/build/lib/commands/coverage.js.map +1 -1
- package/build/lib/commands/element.js +4 -47
- package/build/lib/commands/element.js.map +1 -1
- package/build/lib/commands/emu-console.js +2 -7
- package/build/lib/commands/emu-console.js.map +1 -1
- package/build/lib/commands/execute.js +1 -13
- package/build/lib/commands/execute.js.map +1 -1
- package/build/lib/commands/file-actions.js +3 -44
- package/build/lib/commands/file-actions.js.map +1 -1
- package/build/lib/commands/find.js +3 -16
- package/build/lib/commands/find.js.map +1 -1
- package/build/lib/commands/general.js +4 -78
- package/build/lib/commands/general.js.map +1 -1
- package/build/lib/commands/ime.js +3 -14
- package/build/lib/commands/ime.js.map +1 -1
- package/build/lib/commands/index.js +3 -27
- package/build/lib/commands/index.js.map +1 -1
- package/build/lib/commands/intent.js +1 -40
- package/build/lib/commands/intent.js.map +1 -1
- package/build/lib/commands/log.js +3 -35
- package/build/lib/commands/log.js.map +1 -1
- package/build/lib/commands/media-projection.js +2 -47
- package/build/lib/commands/media-projection.js.map +1 -1
- package/build/lib/commands/network.js +4 -40
- package/build/lib/commands/network.js.map +1 -1
- package/build/lib/commands/performance.js +5 -57
- package/build/lib/commands/performance.js.map +1 -1
- package/build/lib/commands/recordscreen.js +1 -59
- package/build/lib/commands/recordscreen.js.map +1 -1
- package/build/lib/commands/shell.js +1 -15
- package/build/lib/commands/shell.js.map +1 -1
- package/build/lib/commands/streamscreen.js +7 -74
- package/build/lib/commands/streamscreen.js.map +1 -1
- package/build/lib/commands/system-bars.js +1 -23
- package/build/lib/commands/system-bars.js.map +1 -1
- package/build/lib/commands/touch.js +13 -79
- package/build/lib/commands/touch.js.map +1 -1
- package/build/lib/desired-caps.js +3 -4
- package/build/lib/desired-caps.js.map +1 -1
- package/build/lib/driver.js +8 -97
- package/build/lib/driver.js.map +1 -1
- package/build/lib/logger.js +1 -5
- package/build/lib/logger.js.map +1 -1
- package/build/lib/uiautomator.js +3 -24
- package/build/lib/uiautomator.js.map +1 -1
- package/build/lib/unlock-helpers.js +1 -61
- package/build/lib/unlock-helpers.js.map +1 -1
- package/build/lib/utils.js +1 -7
- package/build/lib/utils.js.map +1 -1
- package/build/lib/webview-helpers.js +1 -94
- package/build/lib/webview-helpers.js.map +1 -1
- package/lib/android-helpers.js +2 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streamscreen.js","names":["commands","RECORDING_INTERVAL_SEC","STREAMING_STARTUP_TIMEOUT_MS","GSTREAMER_BINARY","system","isWindows","GST_INSPECT_BINARY","REQUIRED_GST_PLUGINS","avdec_h264","h264parse","jpegenc","tcpserversink","multipartmux","SCREENRECORD_BINARY","GST_TUTORIAL_URL","DEFAULT_HOST","TCP_HOST","DEFAULT_PORT","DEFAULT_QUALITY","DEFAULT_BITRATE","BOUNDARY_STRING","ADB_SCREEN_STREAMING_FEATURE","createStreamingLogger","streamName","udid","logger","getLogger","_","truncate","length","omission","verifyStreamingRequirements","adb","trim","shell","Error","gstreamerCheckPromises","binaryName","push","fs","which","e","B","all","moduleCheckPromises","name","modName","toPairs","stdout","exec","includes","getDeviceInfo","log","output","result","key","pattern","match","debug","parseInt","curDeviceId","initDeviceStreamingProc","deviceInfo","opts","width","height","bitRate","adjustedWidth","adjustedHeight","adjustedBitrate","screenRecordCmd","adbArgs","executable","defaultArgs","deviceStreaming","spawn","path","on","code","signal","isStarted","deviceStreamingLogger","errorsListener","chunk","stderr","toString","startupListener","isEmpty","info","util","quote","waitForCondition","waitMs","intervalMs","errorAndThrow","message","removeListener","initGstreamerPipeline","deviceStreamingProc","quality","tcpPort","considerRotation","logPipelineDetails","gstreamerPipeline","SubProcess","Math","max","fps","stdio","gstreamerLogger","gstOutputListener","didFail","rep","start","checkPortStatus","ign","extractRemoteAddress","req","headers","socket","remoteAddress","connection","mobileStartScreenStreaming","options","ensureFeatureEnabled","host","port","pathname","isUndefined","_screenStreamingProps","kill","mjpegSocket","mjpegServer","resolve","reject","net","createConnection","http","createServer","res","currentPathname","url","parse","writeHead","Connection","write","end","Pragma","pipe","warn","listen","error","timeout","isRunning","stop","destroy","listening","close","mobileStopScreenStreaming","e1"],"sources":["../../../lib/commands/streamscreen.js"],"sourcesContent":["import _ from 'lodash';\nimport { fs, system, logger, util } from 'appium/support';\nimport { exec, SubProcess } from 'teen_process';\nimport { checkPortStatus } from 'portscanner';\nimport http from 'http';\nimport net from 'net';\nimport B from 'bluebird';\nimport { waitForCondition } from 'asyncbox';\nimport { spawn } from 'child_process';\nimport url from 'url';\n\nconst commands = {};\n\nconst RECORDING_INTERVAL_SEC = 5;\nconst STREAMING_STARTUP_TIMEOUT_MS = 5000;\nconst GSTREAMER_BINARY = `gst-launch-1.0${system.isWindows() ? '.exe' : ''}`;\nconst GST_INSPECT_BINARY = `gst-inspect-1.0${system.isWindows() ? '.exe' : ''}`;\nconst REQUIRED_GST_PLUGINS = {\n avdec_h264: 'gst-libav',\n h264parse: 'gst-plugins-bad',\n jpegenc: 'gst-plugins-good',\n tcpserversink: 'gst-plugins-base',\n multipartmux: 'gst-plugins-good',\n};\nconst SCREENRECORD_BINARY = 'screenrecord';\nconst GST_TUTORIAL_URL = 'https://gstreamer.freedesktop.org/documentation/installing/index.html';\nconst DEFAULT_HOST = '127.0.0.1';\nconst TCP_HOST = '127.0.0.1';\nconst DEFAULT_PORT = 8093;\nconst DEFAULT_QUALITY = 70;\nconst DEFAULT_BITRATE = 4000000; // 4 Mbps\nconst BOUNDARY_STRING = '--2ae9746887f170b8cf7c271047ce314c';\n\nconst ADB_SCREEN_STREAMING_FEATURE = 'adb_screen_streaming';\n\nfunction createStreamingLogger (streamName, udid) {\n return logger.getLogger(`${streamName}@` + _.truncate(udid, {\n length: 8,\n omission: '',\n }));\n}\n\nasync function verifyStreamingRequirements (adb) {\n if (!_.trim(await adb.shell(['which', SCREENRECORD_BINARY]))) {\n throw new Error(\n `The required '${SCREENRECORD_BINARY}' binary is not available on the device under test`);\n }\n\n const gstreamerCheckPromises = [];\n for (const binaryName of [GSTREAMER_BINARY, GST_INSPECT_BINARY]) {\n gstreamerCheckPromises.push((async () => {\n try {\n await fs.which(binaryName);\n } catch (e) {\n throw new Error(`The '${binaryName}' binary is not available in the PATH on the host system. ` +\n `See ${GST_TUTORIAL_URL} for more details on how to install it.`);\n }\n })());\n }\n await B.all(gstreamerCheckPromises);\n\n const moduleCheckPromises = [];\n for (const [name, modName] of _.toPairs(REQUIRED_GST_PLUGINS)) {\n moduleCheckPromises.push((async () => {\n const {stdout} = await exec(GST_INSPECT_BINARY, [name]);\n if (!_.includes(stdout, modName)) {\n throw new Error(\n `The required GStreamer plugin '${name}' from '${modName}' module is not installed. ` +\n `See ${GST_TUTORIAL_URL} for more details on how to install it.`);\n }\n })());\n }\n await B.all(moduleCheckPromises);\n}\n\nasync function getDeviceInfo (adb, log = null) {\n const output = await adb.shell(['dumpsys', 'display']);\n const result = {};\n for (const [key, pattern] of [\n ['width', /\\bdeviceWidth=(\\d+)/],\n ['height', /\\bdeviceHeight=(\\d+)/],\n ['fps', /\\bfps=(\\d+)/],\n ]) {\n const match = pattern.exec(output);\n if (!match) {\n log?.debug(output);\n throw new Error(`Cannot parse the device ${key} from the adb command output. ` +\n `Check the server log for more details.`);\n }\n result[key] = parseInt(match[1], 10);\n }\n result.udid = adb.curDeviceId;\n return result;\n}\n\nasync function initDeviceStreamingProc (adb, log, deviceInfo, opts = {}) {\n const {\n width,\n height,\n bitRate,\n } = opts;\n const adjustedWidth = parseInt(width, 10) || deviceInfo.width;\n const adjustedHeight = parseInt(height, 10) || deviceInfo.height;\n const adjustedBitrate = parseInt(bitRate, 10) || DEFAULT_BITRATE;\n let screenRecordCmd = SCREENRECORD_BINARY +\n ` --output-format=h264` +\n // 5 seconds is fine to detect rotation changes\n ` --time-limit=${RECORDING_INTERVAL_SEC}`;\n if (width || height) {\n screenRecordCmd += ` --size=${adjustedWidth}x${adjustedHeight}`;\n }\n if (bitRate) {\n screenRecordCmd += ` --bit-rate=${adjustedBitrate}`;\n }\n const adbArgs = [\n ...adb.executable.defaultArgs,\n 'exec-out',\n // The loop is required, because by default the maximum record duration\n // for screenrecord is always limited\n `while true; do ${screenRecordCmd} -; done`,\n ];\n const deviceStreaming = spawn(adb.executable.path, adbArgs);\n deviceStreaming.on('exit', (code, signal) => {\n log.debug(`Device streaming process exited with code ${code}, signal ${signal}`);\n });\n\n let isStarted = false;\n const deviceStreamingLogger = createStreamingLogger(SCREENRECORD_BINARY, deviceInfo.udid);\n const errorsListener = (chunk) => {\n const stderr = chunk.toString();\n if (_.trim(stderr)) {\n deviceStreamingLogger.debug(stderr);\n }\n };\n deviceStreaming.stderr.on('data', errorsListener);\n\n const startupListener = (chunk) => {\n if (!isStarted) {\n isStarted = !_.isEmpty(chunk);\n }\n };\n deviceStreaming.stdout.on('data', startupListener);\n\n try {\n log.info(`Starting device streaming: ${util.quote([adb.executable.path, ...adbArgs])}`);\n await waitForCondition(() => isStarted, {\n waitMs: STREAMING_STARTUP_TIMEOUT_MS,\n intervalMs: 300,\n });\n } catch (e) {\n log.errorAndThrow(\n `Cannot start the screen streaming process. Original error: ${e.message}`);\n } finally {\n deviceStreaming.stderr.removeListener('data', errorsListener);\n deviceStreaming.stdout.removeListener('data', startupListener);\n }\n return deviceStreaming;\n}\n\nasync function initGstreamerPipeline (deviceStreamingProc, deviceInfo, log, opts = {}) {\n const {\n width,\n height,\n quality,\n tcpPort,\n considerRotation,\n logPipelineDetails,\n } = opts;\n const adjustedWidth = parseInt(width, 10) || deviceInfo.width;\n const adjustedHeight = parseInt(height, 10) || deviceInfo.height;\n const gstreamerPipeline = new SubProcess(GSTREAMER_BINARY, [\n '-v',\n 'fdsrc', 'fd=0',\n '!', 'video/x-h264,' +\n `width=${considerRotation ? Math.max(adjustedWidth, adjustedHeight) : adjustedWidth},` +\n `height=${considerRotation ? Math.max(adjustedWidth, adjustedHeight) : adjustedHeight},` +\n `framerate=${deviceInfo.fps}/1,` +\n 'byte-stream=true',\n '!', 'h264parse',\n '!', 'queue', 'leaky=downstream',\n '!', 'avdec_h264',\n '!', 'queue', 'leaky=downstream',\n '!', 'jpegenc', `quality=${quality}`,\n '!', 'multipartmux', `boundary=${BOUNDARY_STRING}`,\n '!', 'tcpserversink', `host=${TCP_HOST}`, `port=${tcpPort}`,\n ], {\n stdio: [deviceStreamingProc.stdout, 'pipe', 'pipe']\n });\n gstreamerPipeline.on('exit', (code, signal) => {\n log.debug(`Pipeline streaming process exited with code ${code}, signal ${signal}`);\n });\n const gstreamerLogger = createStreamingLogger('gst', deviceInfo.udid);\n const gstOutputListener = (stdout, stderr) => {\n if (_.trim(stderr || stdout)) {\n gstreamerLogger.debug(stderr || stdout);\n }\n };\n gstreamerPipeline.on('output', gstOutputListener);\n let didFail = false;\n try {\n log.info(`Starting GStreamer pipeline: ${gstreamerPipeline.rep}`);\n await gstreamerPipeline.start(0);\n await waitForCondition(async () => {\n try {\n return (await checkPortStatus(tcpPort, TCP_HOST)) === 'open';\n } catch (ign) {\n return false;\n }\n }, {\n waitMs: STREAMING_STARTUP_TIMEOUT_MS,\n intervalMs: 300,\n });\n } catch (e) {\n didFail = true;\n log.errorAndThrow(\n `Cannot start the screen streaming pipeline. Original error: ${e.message}`);\n } finally {\n if (!logPipelineDetails || didFail) {\n gstreamerPipeline.removeListener('output', gstOutputListener);\n }\n }\n return gstreamerPipeline;\n}\n\nfunction extractRemoteAddress (req) {\n return req.headers['x-forwarded-for']\n || req.socket.remoteAddress\n || req.connection.remoteAddress\n || req.connection.socket.remoteAddress;\n}\n\n\n/**\n * @typedef {Object} StartScreenStreamingOptions\n *\n * @property {?number} width - The scaled width of the device's screen. If unset then the script will assign it\n * to the actual screen width measured in pixels.\n * @property {?number} height - The scaled height of the device's screen. If unset then the script will assign it\n * to the actual screen height measured in pixels.\n * @property {?number} bitRate - The video bit rate for the video, in bits per second.\n * The default value is 4000000 (4 Mb/s). You can increase the bit rate to improve video quality,\n * but doing so results in larger movie files.\n * @property {?string} host [127.0.0.1] - The IP address/host name to start the MJPEG server on.\n * You can set it to `0.0.0.0` to trigger the broadcast on all available network interfaces.\n * @property {?string} pathname - The HTTP request path the MJPEG server should be available on.\n * If unset then any pathname on the given `host`/`port` combination will work. Note that the value\n * should always start with a single slash: `/`\n * @property {?number} tcpPort [8094] - The port number to start the internal TCP MJPEG broadcast on.\n * This type of broadcast always starts on the loopback interface (`127.0.0.1`).\n * @property {?number} port [8093] - The port number to start the MJPEG server on.\n * @property {?number} quality [70] - The quality value for the streamed JPEG images.\n * This number should be in range [1, 100], where 100 is the best quality.\n * @property {?boolean} considerRotation [false] - If set to `true` then GStreamer pipeline will\n * increase the dimensions of the resulting images to properly fit images in both landscape and\n * portrait orientations. Set it to `true` if the device rotation is not going to be the same during the\n * broadcasting session.\n * @property {?boolean} logPipelineDetails [false] - Whether to log GStreamer pipeline events into\n * the standard log output. Might be useful for debugging purposes.\n */\n\n/**\n * Starts device screen broadcast by creating MJPEG server.\n * Multiple calls to this method have no effect unless the previous streaming\n * session is stopped.\n * This method only works if the `adb_screen_streaming` feature is\n * enabled on the server side.\n *\n * @param {?StartScreenStreamingOptions} options - The available options.\n * @throws {Error} If screen streaming has failed to start or\n * is not supported on the host system or\n * the corresponding server feature is not enabled.\n */\ncommands.mobileStartScreenStreaming = async function mobileStartScreenStreaming (options = {}) {\n this.ensureFeatureEnabled(ADB_SCREEN_STREAMING_FEATURE);\n\n const {\n width,\n height,\n bitRate,\n host = DEFAULT_HOST,\n port = DEFAULT_PORT,\n pathname,\n tcpPort = DEFAULT_PORT + 1,\n quality = DEFAULT_QUALITY,\n considerRotation = false,\n logPipelineDetails = false,\n } = options;\n\n if (_.isUndefined(this._screenStreamingProps)) {\n await verifyStreamingRequirements(this.adb);\n }\n if (!_.isEmpty(this._screenStreamingProps)) {\n this.log.info(`The screen streaming session is already running. ` +\n `Stop it first in order to start a new one.`);\n return;\n }\n if ((await checkPortStatus(port, host)) === 'open') {\n this.log.info(`The port #${port} at ${host} is busy. ` +\n `Assuming the screen streaming is already running`);\n return;\n }\n if ((await checkPortStatus(tcpPort, TCP_HOST)) === 'open') {\n this.log.errorAndThrow(`The port #${tcpPort} at ${TCP_HOST} is busy. ` +\n `Make sure there are no leftovers from previous sessions.`);\n }\n this._screenStreamingProps = null;\n\n const deviceInfo = await getDeviceInfo(this.adb, this.log);\n const deviceStreamingProc = await initDeviceStreamingProc(this.adb, this.log, deviceInfo, {\n width,\n height,\n bitRate,\n });\n let gstreamerPipeline;\n try {\n gstreamerPipeline = await initGstreamerPipeline(deviceStreamingProc, deviceInfo, this.log, {\n width,\n height,\n quality,\n tcpPort,\n considerRotation,\n logPipelineDetails,\n });\n } catch (e) {\n if (deviceStreamingProc.kill(0)) {\n deviceStreamingProc.kill();\n }\n throw e;\n }\n\n let mjpegSocket;\n let mjpegServer;\n try {\n await new B((resolve, reject) => {\n mjpegSocket = net.createConnection(tcpPort, TCP_HOST, () => {\n this.log.info(`Successfully connected to MJPEG stream at tcp://${TCP_HOST}:${tcpPort}`);\n mjpegServer = http.createServer((req, res) => {\n const remoteAddress = extractRemoteAddress(req);\n const currentPathname = url.parse(req.url).pathname;\n this.log.info(`Got an incoming screen bradcasting request from ${remoteAddress} ` +\n `(${req.headers['user-agent'] || 'User Agent unknown'}) at ${currentPathname}`);\n\n if (pathname && currentPathname !== pathname) {\n this.log.info('Rejecting the broadcast request since it does not match the given pathname');\n res.writeHead(404, {\n Connection: 'close',\n 'Content-Type': 'text/plain; charset=utf-8',\n });\n res.write(`'${currentPathname}' did not match any known endpoints`);\n res.end();\n return;\n }\n\n this.log.info('Starting MJPEG broadcast');\n res.writeHead(200, {\n 'Cache-Control': 'no-store, no-cache, must-revalidate, pre-check=0, post-check=0, max-age=0',\n Pragma: 'no-cache',\n Connection: 'close',\n 'Content-Type': `multipart/x-mixed-replace; boundary=${BOUNDARY_STRING}`\n });\n\n mjpegSocket.pipe(res);\n });\n mjpegServer.on('error', (e) => {\n this.log.warn(e);\n reject(e);\n });\n mjpegServer.on('close', () => {\n this.log.debug(`MJPEG server at http://${host}:${port} has been closed`);\n });\n mjpegServer.on('listening', () => {\n this.log.info(`Successfully started MJPEG server at http://${host}:${port}`);\n resolve();\n });\n mjpegServer.listen(port, host);\n });\n mjpegSocket.on('error', (e) => {\n this.log.error(e);\n reject(e);\n });\n }).timeout(STREAMING_STARTUP_TIMEOUT_MS,\n `Cannot connect to the streaming server within ${STREAMING_STARTUP_TIMEOUT_MS}ms`);\n } catch (e) {\n if (deviceStreamingProc.kill(0)) {\n deviceStreamingProc.kill();\n }\n if (gstreamerPipeline.isRunning) {\n await gstreamerPipeline.stop();\n }\n if (mjpegSocket) {\n mjpegSocket.destroy();\n }\n if (mjpegServer && mjpegServer.listening) {\n mjpegServer.close();\n }\n throw e;\n }\n\n this._screenStreamingProps = {\n deviceStreamingProc,\n gstreamerPipeline,\n mjpegSocket,\n mjpegServer,\n };\n};\n\n/**\n * Stop screen streaming.\n * If no screen streaming server has been started then nothing is done.\n */\ncommands.mobileStopScreenStreaming = async function mobileStopScreenStreaming (/* options = {} */) {\n if (_.isEmpty(this._screenStreamingProps)) {\n if (!_.isUndefined(this._screenStreamingProps)) {\n this.log.debug(`Screen streaming is not running. There is nothing to stop`);\n }\n return;\n }\n\n const {\n deviceStreamingProc,\n gstreamerPipeline,\n mjpegSocket,\n mjpegServer,\n } = this._screenStreamingProps;\n\n try {\n mjpegSocket.end();\n if (mjpegServer.listening) {\n mjpegServer.close();\n }\n if (deviceStreamingProc.kill(0)) {\n deviceStreamingProc.kill('SIGINT');\n }\n if (gstreamerPipeline.isRunning) {\n try {\n await gstreamerPipeline.stop('SIGINT');\n } catch (e) {\n this.log.warn(e);\n try {\n await gstreamerPipeline.stop('SIGKILL');\n } catch (e1) {\n this.log.error(e1);\n }\n }\n }\n this.log.info(`Successfully terminated the screen streaming MJPEG server`);\n } finally {\n this._screenStreamingProps = null;\n }\n};\n\n\nexport default commands;\n"],"mappings":";;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAEA,MAAMA,QAAQ,GAAG,EAAjB;AAEA,MAAMC,sBAAsB,GAAG,CAA/B;AACA,MAAMC,4BAA4B,GAAG,IAArC;AACA,MAAMC,gBAAgB,GAAI,iBAAgBC,eAAA,CAAOC,SAAP,KAAqB,MAArB,GAA8B,EAAG,EAA3E;AACA,MAAMC,kBAAkB,GAAI,kBAAiBF,eAAA,CAAOC,SAAP,KAAqB,MAArB,GAA8B,EAAG,EAA9E;AACA,MAAME,oBAAoB,GAAG;EAC3BC,UAAU,EAAE,WADe;EAE3BC,SAAS,EAAE,iBAFgB;EAG3BC,OAAO,EAAE,kBAHkB;EAI3BC,aAAa,EAAE,kBAJY;EAK3BC,YAAY,EAAE;AALa,CAA7B;AAOA,MAAMC,mBAAmB,GAAG,cAA5B;AACA,MAAMC,gBAAgB,GAAG,uEAAzB;AACA,MAAMC,YAAY,GAAG,WAArB;AACA,MAAMC,QAAQ,GAAG,WAAjB;AACA,MAAMC,YAAY,GAAG,IAArB;AACA,MAAMC,eAAe,GAAG,EAAxB;AACA,MAAMC,eAAe,GAAG,OAAxB;AACA,MAAMC,eAAe,GAAG,oCAAxB;AAEA,MAAMC,4BAA4B,GAAG,sBAArC;;AAEA,SAASC,qBAAT,CAAgCC,UAAhC,EAA4CC,IAA5C,EAAkD;EAChD,OAAOC,eAAA,CAAOC,SAAP,CAAkB,GAAEH,UAAW,GAAd,GAAmBI,eAAA,CAAEC,QAAF,CAAWJ,IAAX,EAAiB;IAC1DK,MAAM,EAAE,CADkD;IAE1DC,QAAQ,EAAE;EAFgD,CAAjB,CAApC,CAAP;AAID;;AAED,eAAeC,2BAAf,CAA4CC,GAA5C,EAAiD;EAC/C,IAAI,CAACL,eAAA,CAAEM,IAAF,CAAO,MAAMD,GAAG,CAACE,KAAJ,CAAU,CAAC,OAAD,EAAUrB,mBAAV,CAAV,CAAb,CAAL,EAA8D;IAC5D,MAAM,IAAIsB,KAAJ,CACH,iBAAgBtB,mBAAoB,oDADjC,CAAN;EAED;;EAED,MAAMuB,sBAAsB,GAAG,EAA/B;;EACA,KAAK,MAAMC,UAAX,IAAyB,CAAClC,gBAAD,EAAmBG,kBAAnB,CAAzB,EAAiE;IAC/D8B,sBAAsB,CAACE,IAAvB,CAA4B,CAAC,YAAY;MACvC,IAAI;QACF,MAAMC,WAAA,CAAGC,KAAH,CAASH,UAAT,CAAN;MACD,CAFD,CAEE,OAAOI,CAAP,EAAU;QACV,MAAM,IAAIN,KAAJ,CAAW,QAAOE,UAAW,4DAAnB,GACb,OAAMvB,gBAAiB,yCADpB,CAAN;MAED;IACF,CAP2B,GAA5B;EAQD;;EACD,MAAM4B,iBAAA,CAAEC,GAAF,CAAMP,sBAAN,CAAN;EAEA,MAAMQ,mBAAmB,GAAG,EAA5B;;EACA,KAAK,MAAM,CAACC,IAAD,EAAOC,OAAP,CAAX,IAA8BnB,eAAA,CAAEoB,OAAF,CAAUxC,oBAAV,CAA9B,EAA+D;IAC7DqC,mBAAmB,CAACN,IAApB,CAAyB,CAAC,YAAY;MACpC,MAAM;QAACU;MAAD,IAAW,MAAM,IAAAC,kBAAA,EAAK3C,kBAAL,EAAyB,CAACuC,IAAD,CAAzB,CAAvB;;MACA,IAAI,CAAClB,eAAA,CAAEuB,QAAF,CAAWF,MAAX,EAAmBF,OAAnB,CAAL,EAAkC;QAChC,MAAM,IAAIX,KAAJ,CACH,kCAAiCU,IAAK,WAAUC,OAAQ,6BAAzD,GACC,OAAMhC,gBAAiB,yCAFpB,CAAN;MAGD;IACF,CAPwB,GAAzB;EAQD;;EACD,MAAM4B,iBAAA,CAAEC,GAAF,CAAMC,mBAAN,CAAN;AACD;;AAED,eAAeO,aAAf,CAA8BnB,GAA9B,EAAmCoB,GAAG,GAAG,IAAzC,EAA+C;EAC7C,MAAMC,MAAM,GAAG,MAAMrB,GAAG,CAACE,KAAJ,CAAU,CAAC,SAAD,EAAY,SAAZ,CAAV,CAArB;EACA,MAAMoB,MAAM,GAAG,EAAf;;EACA,KAAK,MAAM,CAACC,GAAD,EAAMC,OAAN,CAAX,IAA6B,CAC3B,CAAC,OAAD,EAAU,qBAAV,CAD2B,EAE3B,CAAC,QAAD,EAAW,sBAAX,CAF2B,EAG3B,CAAC,KAAD,EAAQ,aAAR,CAH2B,CAA7B,EAIG;IACD,MAAMC,KAAK,GAAGD,OAAO,CAACP,IAAR,CAAaI,MAAb,CAAd;;IACA,IAAI,CAACI,KAAL,EAAY;MACVL,GAAG,SAAH,IAAAA,GAAG,WAAH,YAAAA,GAAG,CAAEM,KAAL,CAAWL,MAAX;MACA,MAAM,IAAIlB,KAAJ,CAAW,2BAA0BoB,GAAI,gCAA/B,GACb,wCADG,CAAN;IAED;;IACDD,MAAM,CAACC,GAAD,CAAN,GAAcI,QAAQ,CAACF,KAAK,CAAC,CAAD,CAAN,EAAW,EAAX,CAAtB;EACD;;EACDH,MAAM,CAAC9B,IAAP,GAAcQ,GAAG,CAAC4B,WAAlB;EACA,OAAON,MAAP;AACD;;AAED,eAAeO,uBAAf,CAAwC7B,GAAxC,EAA6CoB,GAA7C,EAAkDU,UAAlD,EAA8DC,IAAI,GAAG,EAArE,EAAyE;EACvE,MAAM;IACJC,KADI;IAEJC,MAFI;IAGJC;EAHI,IAIFH,IAJJ;EAKA,MAAMI,aAAa,GAAGR,QAAQ,CAACK,KAAD,EAAQ,EAAR,CAAR,IAAuBF,UAAU,CAACE,KAAxD;EACA,MAAMI,cAAc,GAAGT,QAAQ,CAACM,MAAD,EAAS,EAAT,CAAR,IAAwBH,UAAU,CAACG,MAA1D;EACA,MAAMI,eAAe,GAAGV,QAAQ,CAACO,OAAD,EAAU,EAAV,CAAR,IAAyB/C,eAAjD;EACA,IAAImD,eAAe,GAAGzD,mBAAmB,GACtC,uBADmB,GAGnB,iBAAgBZ,sBAAuB,EAH1C;;EAIA,IAAI+D,KAAK,IAAIC,MAAb,EAAqB;IACnBK,eAAe,IAAK,WAAUH,aAAc,IAAGC,cAAe,EAA9D;EACD;;EACD,IAAIF,OAAJ,EAAa;IACXI,eAAe,IAAK,eAAcD,eAAgB,EAAlD;EACD;;EACD,MAAME,OAAO,GAAG,CACd,GAAGvC,GAAG,CAACwC,UAAJ,CAAeC,WADJ,EAEd,UAFc,EAKb,kBAAiBH,eAAgB,UALpB,CAAhB;EAOA,MAAMI,eAAe,GAAG,IAAAC,oBAAA,EAAM3C,GAAG,CAACwC,UAAJ,CAAeI,IAArB,EAA2BL,OAA3B,CAAxB;EACAG,eAAe,CAACG,EAAhB,CAAmB,MAAnB,EAA2B,CAACC,IAAD,EAAOC,MAAP,KAAkB;IAC3C3B,GAAG,CAACM,KAAJ,CAAW,6CAA4CoB,IAAK,YAAWC,MAAO,EAA9E;EACD,CAFD;EAIA,IAAIC,SAAS,GAAG,KAAhB;EACA,MAAMC,qBAAqB,GAAG3D,qBAAqB,CAACT,mBAAD,EAAsBiD,UAAU,CAACtC,IAAjC,CAAnD;;EACA,MAAM0D,cAAc,GAAIC,KAAD,IAAW;IAChC,MAAMC,MAAM,GAAGD,KAAK,CAACE,QAAN,EAAf;;IACA,IAAI1D,eAAA,CAAEM,IAAF,CAAOmD,MAAP,CAAJ,EAAoB;MAClBH,qBAAqB,CAACvB,KAAtB,CAA4B0B,MAA5B;IACD;EACF,CALD;;EAMAV,eAAe,CAACU,MAAhB,CAAuBP,EAAvB,CAA0B,MAA1B,EAAkCK,cAAlC;;EAEA,MAAMI,eAAe,GAAIH,KAAD,IAAW;IACjC,IAAI,CAACH,SAAL,EAAgB;MACdA,SAAS,GAAG,CAACrD,eAAA,CAAE4D,OAAF,CAAUJ,KAAV,CAAb;IACD;EACF,CAJD;;EAKAT,eAAe,CAAC1B,MAAhB,CAAuB6B,EAAvB,CAA0B,MAA1B,EAAkCS,eAAlC;;EAEA,IAAI;IACFlC,GAAG,CAACoC,IAAJ,CAAU,8BAA6BC,aAAA,CAAKC,KAAL,CAAW,CAAC1D,GAAG,CAACwC,UAAJ,CAAeI,IAAhB,EAAsB,GAAGL,OAAzB,CAAX,CAA8C,EAArF;IACA,MAAM,IAAAoB,0BAAA,EAAiB,MAAMX,SAAvB,EAAkC;MACtCY,MAAM,EAAE1F,4BAD8B;MAEtC2F,UAAU,EAAE;IAF0B,CAAlC,CAAN;EAID,CAND,CAME,OAAOpD,CAAP,EAAU;IACVW,GAAG,CAAC0C,aAAJ,CACG,8DAA6DrD,CAAC,CAACsD,OAAQ,EAD1E;EAED,CATD,SASU;IACRrB,eAAe,CAACU,MAAhB,CAAuBY,cAAvB,CAAsC,MAAtC,EAA8Cd,cAA9C;IACAR,eAAe,CAAC1B,MAAhB,CAAuBgD,cAAvB,CAAsC,MAAtC,EAA8CV,eAA9C;EACD;;EACD,OAAOZ,eAAP;AACD;;AAED,eAAeuB,qBAAf,CAAsCC,mBAAtC,EAA2DpC,UAA3D,EAAuEV,GAAvE,EAA4EW,IAAI,GAAG,EAAnF,EAAuF;EACrF,MAAM;IACJC,KADI;IAEJC,MAFI;IAGJkC,OAHI;IAIJC,OAJI;IAKJC,gBALI;IAMJC;EANI,IAOFvC,IAPJ;EAQA,MAAMI,aAAa,GAAGR,QAAQ,CAACK,KAAD,EAAQ,EAAR,CAAR,IAAuBF,UAAU,CAACE,KAAxD;EACA,MAAMI,cAAc,GAAGT,QAAQ,CAACM,MAAD,EAAS,EAAT,CAAR,IAAwBH,UAAU,CAACG,MAA1D;EACA,MAAMsC,iBAAiB,GAAG,IAAIC,wBAAJ,CAAerG,gBAAf,EAAiC,CACzD,IADyD,EAEzD,OAFyD,EAEhD,MAFgD,EAGzD,GAHyD,EAGpD,kBACF,SAAQkG,gBAAgB,GAAGI,IAAI,CAACC,GAAL,CAASvC,aAAT,EAAwBC,cAAxB,CAAH,GAA6CD,aAAc,GADjF,GAEF,UAASkC,gBAAgB,GAAGI,IAAI,CAACC,GAAL,CAASvC,aAAT,EAAwBC,cAAxB,CAAH,GAA6CA,cAAe,GAFnF,GAGF,aAAYN,UAAU,CAAC6C,GAAI,KAHzB,GAIH,kBAPuD,EAQzD,GARyD,EAQpD,WARoD,EASzD,GATyD,EASpD,OAToD,EAS3C,kBAT2C,EAUzD,GAVyD,EAUpD,YAVoD,EAWzD,GAXyD,EAWpD,OAXoD,EAW3C,kBAX2C,EAYzD,GAZyD,EAYpD,SAZoD,EAYxC,WAAUR,OAAQ,EAZsB,EAazD,GAbyD,EAapD,cAboD,EAanC,YAAW/E,eAAgB,EAbQ,EAczD,GAdyD,EAcpD,eAdoD,EAclC,QAAOJ,QAAS,EAdkB,EAcd,QAAOoF,OAAQ,EAdD,CAAjC,EAevB;IACDQ,KAAK,EAAE,CAACV,mBAAmB,CAAClD,MAArB,EAA6B,MAA7B,EAAqC,MAArC;EADN,CAfuB,CAA1B;EAkBAuD,iBAAiB,CAAC1B,EAAlB,CAAqB,MAArB,EAA6B,CAACC,IAAD,EAAOC,MAAP,KAAkB;IAC7C3B,GAAG,CAACM,KAAJ,CAAW,+CAA8CoB,IAAK,YAAWC,MAAO,EAAhF;EACD,CAFD;EAGA,MAAM8B,eAAe,GAAGvF,qBAAqB,CAAC,KAAD,EAAQwC,UAAU,CAACtC,IAAnB,CAA7C;;EACA,MAAMsF,iBAAiB,GAAG,CAAC9D,MAAD,EAASoC,MAAT,KAAoB;IAC5C,IAAIzD,eAAA,CAAEM,IAAF,CAAOmD,MAAM,IAAIpC,MAAjB,CAAJ,EAA8B;MAC5B6D,eAAe,CAACnD,KAAhB,CAAsB0B,MAAM,IAAIpC,MAAhC;IACD;EACF,CAJD;;EAKAuD,iBAAiB,CAAC1B,EAAlB,CAAqB,QAArB,EAA+BiC,iBAA/B;EACA,IAAIC,OAAO,GAAG,KAAd;;EACA,IAAI;IACF3D,GAAG,CAACoC,IAAJ,CAAU,gCAA+Be,iBAAiB,CAACS,GAAI,EAA/D;IACA,MAAMT,iBAAiB,CAACU,KAAlB,CAAwB,CAAxB,CAAN;IACA,MAAM,IAAAtB,0BAAA,EAAiB,YAAY;MACjC,IAAI;QACF,OAAO,CAAC,MAAM,IAAAuB,4BAAA,EAAgBd,OAAhB,EAAyBpF,QAAzB,CAAP,MAA+C,MAAtD;MACD,CAFD,CAEE,OAAOmG,GAAP,EAAY;QACZ,OAAO,KAAP;MACD;IACF,CANK,EAMH;MACDvB,MAAM,EAAE1F,4BADP;MAED2F,UAAU,EAAE;IAFX,CANG,CAAN;EAUD,CAbD,CAaE,OAAOpD,CAAP,EAAU;IACVsE,OAAO,GAAG,IAAV;IACA3D,GAAG,CAAC0C,aAAJ,CACG,+DAA8DrD,CAAC,CAACsD,OAAQ,EAD3E;EAED,CAjBD,SAiBU;IACR,IAAI,CAACO,kBAAD,IAAuBS,OAA3B,EAAoC;MAClCR,iBAAiB,CAACP,cAAlB,CAAiC,QAAjC,EAA2Cc,iBAA3C;IACD;EACF;;EACD,OAAOP,iBAAP;AACD;;AAED,SAASa,oBAAT,CAA+BC,GAA/B,EAAoC;EAClC,OAAOA,GAAG,CAACC,OAAJ,CAAY,iBAAZ,KACFD,GAAG,CAACE,MAAJ,CAAWC,aADT,IAEFH,GAAG,CAACI,UAAJ,CAAeD,aAFb,IAGFH,GAAG,CAACI,UAAJ,CAAeF,MAAf,CAAsBC,aAH3B;AAID;;AA2CDxH,QAAQ,CAAC0H,0BAAT,GAAsC,eAAeA,0BAAf,CAA2CC,OAAO,GAAG,EAArD,EAAyD;EAC7F,KAAKC,oBAAL,CAA0BvG,4BAA1B;EAEA,MAAM;IACJ2C,KADI;IAEJC,MAFI;IAGJC,OAHI;IAIJ2D,IAAI,GAAG9G,YAJH;IAKJ+G,IAAI,GAAG7G,YALH;IAMJ8G,QANI;IAOJ3B,OAAO,GAAGnF,YAAY,GAAG,CAPrB;IAQJkF,OAAO,GAAGjF,eARN;IASJmF,gBAAgB,GAAG,KATf;IAUJC,kBAAkB,GAAG;EAVjB,IAWFqB,OAXJ;;EAaA,IAAIhG,eAAA,CAAEqG,WAAF,CAAc,KAAKC,qBAAnB,CAAJ,EAA+C;IAC7C,MAAMlG,2BAA2B,CAAC,KAAKC,GAAN,CAAjC;EACD;;EACD,IAAI,CAACL,eAAA,CAAE4D,OAAF,CAAU,KAAK0C,qBAAf,CAAL,EAA4C;IAC1C,KAAK7E,GAAL,CAASoC,IAAT,CAAe,mDAAD,GACX,4CADH;IAEA;EACD;;EACD,IAAI,CAAC,MAAM,IAAA0B,4BAAA,EAAgBY,IAAhB,EAAsBD,IAAtB,CAAP,MAAwC,MAA5C,EAAoD;IAClD,KAAKzE,GAAL,CAASoC,IAAT,CAAe,aAAYsC,IAAK,OAAMD,IAAK,YAA7B,GACX,kDADH;IAEA;EACD;;EACD,IAAI,CAAC,MAAM,IAAAX,4BAAA,EAAgBd,OAAhB,EAAyBpF,QAAzB,CAAP,MAA+C,MAAnD,EAA2D;IACzD,KAAKoC,GAAL,CAAS0C,aAAT,CAAwB,aAAYM,OAAQ,OAAMpF,QAAS,YAApC,GACpB,0DADH;EAED;;EACD,KAAKiH,qBAAL,GAA6B,IAA7B;EAEA,MAAMnE,UAAU,GAAG,MAAMX,aAAa,CAAC,KAAKnB,GAAN,EAAW,KAAKoB,GAAhB,CAAtC;EACA,MAAM8C,mBAAmB,GAAG,MAAMrC,uBAAuB,CAAC,KAAK7B,GAAN,EAAW,KAAKoB,GAAhB,EAAqBU,UAArB,EAAiC;IACxFE,KADwF;IAExFC,MAFwF;IAGxFC;EAHwF,CAAjC,CAAzD;EAKA,IAAIqC,iBAAJ;;EACA,IAAI;IACFA,iBAAiB,GAAG,MAAMN,qBAAqB,CAACC,mBAAD,EAAsBpC,UAAtB,EAAkC,KAAKV,GAAvC,EAA4C;MACzFY,KADyF;MAEzFC,MAFyF;MAGzFkC,OAHyF;MAIzFC,OAJyF;MAKzFC,gBALyF;MAMzFC;IANyF,CAA5C,CAA/C;EAQD,CATD,CASE,OAAO7D,CAAP,EAAU;IACV,IAAIyD,mBAAmB,CAACgC,IAApB,CAAyB,CAAzB,CAAJ,EAAiC;MAC/BhC,mBAAmB,CAACgC,IAApB;IACD;;IACD,MAAMzF,CAAN;EACD;;EAED,IAAI0F,WAAJ;EACA,IAAIC,WAAJ;;EACA,IAAI;IACF,MAAM,IAAI1F,iBAAJ,CAAM,CAAC2F,OAAD,EAAUC,MAAV,KAAqB;MAC/BH,WAAW,GAAGI,YAAA,CAAIC,gBAAJ,CAAqBpC,OAArB,EAA8BpF,QAA9B,EAAwC,MAAM;QAC1D,KAAKoC,GAAL,CAASoC,IAAT,CAAe,mDAAkDxE,QAAS,IAAGoF,OAAQ,EAArF;QACAgC,WAAW,GAAGK,aAAA,CAAKC,YAAL,CAAkB,CAACrB,GAAD,EAAMsB,GAAN,KAAc;UAC5C,MAAMnB,aAAa,GAAGJ,oBAAoB,CAACC,GAAD,CAA1C;;UACA,MAAMuB,eAAe,GAAGC,YAAA,CAAIC,KAAJ,CAAUzB,GAAG,CAACwB,GAAd,EAAmBd,QAA3C;;UACA,KAAK3E,GAAL,CAASoC,IAAT,CAAe,mDAAkDgC,aAAc,GAAjE,GACX,IAAGH,GAAG,CAACC,OAAJ,CAAY,YAAZ,KAA6B,oBAAqB,QAAOsB,eAAgB,EAD/E;;UAGA,IAAIb,QAAQ,IAAIa,eAAe,KAAKb,QAApC,EAA8C;YAC5C,KAAK3E,GAAL,CAASoC,IAAT,CAAc,4EAAd;YACAmD,GAAG,CAACI,SAAJ,CAAc,GAAd,EAAmB;cACjBC,UAAU,EAAE,OADK;cAEjB,gBAAgB;YAFC,CAAnB;YAIAL,GAAG,CAACM,KAAJ,CAAW,IAAGL,eAAgB,qCAA9B;YACAD,GAAG,CAACO,GAAJ;YACA;UACD;;UAED,KAAK9F,GAAL,CAASoC,IAAT,CAAc,0BAAd;UACAmD,GAAG,CAACI,SAAJ,CAAc,GAAd,EAAmB;YACjB,iBAAiB,2EADA;YAEjBI,MAAM,EAAE,UAFS;YAGjBH,UAAU,EAAE,OAHK;YAIjB,gBAAiB,uCAAsC5H,eAAgB;UAJtD,CAAnB;UAOA+G,WAAW,CAACiB,IAAZ,CAAiBT,GAAjB;QACD,CA1Ba,CAAd;QA2BAP,WAAW,CAACvD,EAAZ,CAAe,OAAf,EAAyBpC,CAAD,IAAO;UAC7B,KAAKW,GAAL,CAASiG,IAAT,CAAc5G,CAAd;UACA6F,MAAM,CAAC7F,CAAD,CAAN;QACD,CAHD;QAIA2F,WAAW,CAACvD,EAAZ,CAAe,OAAf,EAAwB,MAAM;UAC5B,KAAKzB,GAAL,CAASM,KAAT,CAAgB,0BAAyBmE,IAAK,IAAGC,IAAK,kBAAtD;QACD,CAFD;QAGAM,WAAW,CAACvD,EAAZ,CAAe,WAAf,EAA4B,MAAM;UAChC,KAAKzB,GAAL,CAASoC,IAAT,CAAe,+CAA8CqC,IAAK,IAAGC,IAAK,EAA1E;UACAO,OAAO;QACR,CAHD;QAIAD,WAAW,CAACkB,MAAZ,CAAmBxB,IAAnB,EAAyBD,IAAzB;MACD,CAzCa,CAAd;MA0CAM,WAAW,CAACtD,EAAZ,CAAe,OAAf,EAAyBpC,CAAD,IAAO;QAC7B,KAAKW,GAAL,CAASmG,KAAT,CAAe9G,CAAf;QACA6F,MAAM,CAAC7F,CAAD,CAAN;MACD,CAHD;IAID,CA/CK,EA+CH+G,OA/CG,CA+CKtJ,4BA/CL,EAgDH,iDAAgDA,4BAA6B,IAhD1E,CAAN;EAiDD,CAlDD,CAkDE,OAAOuC,CAAP,EAAU;IACV,IAAIyD,mBAAmB,CAACgC,IAApB,CAAyB,CAAzB,CAAJ,EAAiC;MAC/BhC,mBAAmB,CAACgC,IAApB;IACD;;IACD,IAAI3B,iBAAiB,CAACkD,SAAtB,EAAiC;MAC/B,MAAMlD,iBAAiB,CAACmD,IAAlB,EAAN;IACD;;IACD,IAAIvB,WAAJ,EAAiB;MACfA,WAAW,CAACwB,OAAZ;IACD;;IACD,IAAIvB,WAAW,IAAIA,WAAW,CAACwB,SAA/B,EAA0C;MACxCxB,WAAW,CAACyB,KAAZ;IACD;;IACD,MAAMpH,CAAN;EACD;;EAED,KAAKwF,qBAAL,GAA6B;IAC3B/B,mBAD2B;IAE3BK,iBAF2B;IAG3B4B,WAH2B;IAI3BC;EAJ2B,CAA7B;AAMD,CApID;;AA0IApI,QAAQ,CAAC8J,yBAAT,GAAqC,eAAeA,yBAAf,GAA8D;EACjG,IAAInI,eAAA,CAAE4D,OAAF,CAAU,KAAK0C,qBAAf,CAAJ,EAA2C;IACzC,IAAI,CAACtG,eAAA,CAAEqG,WAAF,CAAc,KAAKC,qBAAnB,CAAL,EAAgD;MAC9C,KAAK7E,GAAL,CAASM,KAAT,CAAgB,2DAAhB;IACD;;IACD;EACD;;EAED,MAAM;IACJwC,mBADI;IAEJK,iBAFI;IAGJ4B,WAHI;IAIJC;EAJI,IAKF,KAAKH,qBALT;;EAOA,IAAI;IACFE,WAAW,CAACe,GAAZ;;IACA,IAAId,WAAW,CAACwB,SAAhB,EAA2B;MACzBxB,WAAW,CAACyB,KAAZ;IACD;;IACD,IAAI3D,mBAAmB,CAACgC,IAApB,CAAyB,CAAzB,CAAJ,EAAiC;MAC/BhC,mBAAmB,CAACgC,IAApB,CAAyB,QAAzB;IACD;;IACD,IAAI3B,iBAAiB,CAACkD,SAAtB,EAAiC;MAC/B,IAAI;QACF,MAAMlD,iBAAiB,CAACmD,IAAlB,CAAuB,QAAvB,CAAN;MACD,CAFD,CAEE,OAAOjH,CAAP,EAAU;QACV,KAAKW,GAAL,CAASiG,IAAT,CAAc5G,CAAd;;QACA,IAAI;UACF,MAAM8D,iBAAiB,CAACmD,IAAlB,CAAuB,SAAvB,CAAN;QACD,CAFD,CAEE,OAAOK,EAAP,EAAW;UACX,KAAK3G,GAAL,CAASmG,KAAT,CAAeQ,EAAf;QACD;MACF;IACF;;IACD,KAAK3G,GAAL,CAASoC,IAAT,CAAe,2DAAf;EACD,CArBD,SAqBU;IACR,KAAKyC,qBAAL,GAA6B,IAA7B;EACD;AACF,CAvCD;;eA0CejI,Q"}
|
|
1
|
+
{"version":3,"file":"streamscreen.js","names":["commands","RECORDING_INTERVAL_SEC","STREAMING_STARTUP_TIMEOUT_MS","GSTREAMER_BINARY","system","isWindows","GST_INSPECT_BINARY","REQUIRED_GST_PLUGINS","avdec_h264","h264parse","jpegenc","tcpserversink","multipartmux","SCREENRECORD_BINARY","GST_TUTORIAL_URL","DEFAULT_HOST","TCP_HOST","DEFAULT_PORT","DEFAULT_QUALITY","DEFAULT_BITRATE","BOUNDARY_STRING","ADB_SCREEN_STREAMING_FEATURE","createStreamingLogger","streamName","udid","logger","getLogger","_","truncate","length","omission","verifyStreamingRequirements","adb","trim","shell","Error","gstreamerCheckPromises","binaryName","push","fs","which","e","B","all","moduleCheckPromises","name","modName","toPairs","stdout","exec","includes","getDeviceInfo","log","output","result","key","pattern","match","debug","parseInt","curDeviceId","initDeviceStreamingProc","deviceInfo","opts","width","height","bitRate","adjustedWidth","adjustedHeight","adjustedBitrate","screenRecordCmd","adbArgs","executable","defaultArgs","deviceStreaming","spawn","path","on","code","signal","isStarted","deviceStreamingLogger","errorsListener","chunk","stderr","toString","startupListener","isEmpty","info","util","quote","waitForCondition","waitMs","intervalMs","errorAndThrow","message","removeListener","initGstreamerPipeline","deviceStreamingProc","quality","tcpPort","considerRotation","logPipelineDetails","gstreamerPipeline","SubProcess","Math","max","fps","stdio","gstreamerLogger","gstOutputListener","didFail","rep","start","checkPortStatus","ign","extractRemoteAddress","req","headers","socket","remoteAddress","connection","mobileStartScreenStreaming","options","ensureFeatureEnabled","host","port","pathname","isUndefined","_screenStreamingProps","kill","mjpegSocket","mjpegServer","resolve","reject","net","createConnection","http","createServer","res","currentPathname","url","parse","writeHead","Connection","write","end","Pragma","pipe","warn","listen","error","timeout","isRunning","stop","destroy","listening","close","mobileStopScreenStreaming","e1"],"sources":["../../../lib/commands/streamscreen.js"],"sourcesContent":["import _ from 'lodash';\nimport { fs, system, logger, util } from 'appium/support';\nimport { exec, SubProcess } from 'teen_process';\nimport { checkPortStatus } from 'portscanner';\nimport http from 'http';\nimport net from 'net';\nimport B from 'bluebird';\nimport { waitForCondition } from 'asyncbox';\nimport { spawn } from 'child_process';\nimport url from 'url';\n\nconst commands = {};\n\nconst RECORDING_INTERVAL_SEC = 5;\nconst STREAMING_STARTUP_TIMEOUT_MS = 5000;\nconst GSTREAMER_BINARY = `gst-launch-1.0${system.isWindows() ? '.exe' : ''}`;\nconst GST_INSPECT_BINARY = `gst-inspect-1.0${system.isWindows() ? '.exe' : ''}`;\nconst REQUIRED_GST_PLUGINS = {\n avdec_h264: 'gst-libav',\n h264parse: 'gst-plugins-bad',\n jpegenc: 'gst-plugins-good',\n tcpserversink: 'gst-plugins-base',\n multipartmux: 'gst-plugins-good',\n};\nconst SCREENRECORD_BINARY = 'screenrecord';\nconst GST_TUTORIAL_URL = 'https://gstreamer.freedesktop.org/documentation/installing/index.html';\nconst DEFAULT_HOST = '127.0.0.1';\nconst TCP_HOST = '127.0.0.1';\nconst DEFAULT_PORT = 8093;\nconst DEFAULT_QUALITY = 70;\nconst DEFAULT_BITRATE = 4000000; // 4 Mbps\nconst BOUNDARY_STRING = '--2ae9746887f170b8cf7c271047ce314c';\n\nconst ADB_SCREEN_STREAMING_FEATURE = 'adb_screen_streaming';\n\nfunction createStreamingLogger (streamName, udid) {\n return logger.getLogger(`${streamName}@` + _.truncate(udid, {\n length: 8,\n omission: '',\n }));\n}\n\nasync function verifyStreamingRequirements (adb) {\n if (!_.trim(await adb.shell(['which', SCREENRECORD_BINARY]))) {\n throw new Error(\n `The required '${SCREENRECORD_BINARY}' binary is not available on the device under test`);\n }\n\n const gstreamerCheckPromises = [];\n for (const binaryName of [GSTREAMER_BINARY, GST_INSPECT_BINARY]) {\n gstreamerCheckPromises.push((async () => {\n try {\n await fs.which(binaryName);\n } catch (e) {\n throw new Error(`The '${binaryName}' binary is not available in the PATH on the host system. ` +\n `See ${GST_TUTORIAL_URL} for more details on how to install it.`);\n }\n })());\n }\n await B.all(gstreamerCheckPromises);\n\n const moduleCheckPromises = [];\n for (const [name, modName] of _.toPairs(REQUIRED_GST_PLUGINS)) {\n moduleCheckPromises.push((async () => {\n const {stdout} = await exec(GST_INSPECT_BINARY, [name]);\n if (!_.includes(stdout, modName)) {\n throw new Error(\n `The required GStreamer plugin '${name}' from '${modName}' module is not installed. ` +\n `See ${GST_TUTORIAL_URL} for more details on how to install it.`);\n }\n })());\n }\n await B.all(moduleCheckPromises);\n}\n\nasync function getDeviceInfo (adb, log = null) {\n const output = await adb.shell(['dumpsys', 'display']);\n const result = {};\n for (const [key, pattern] of [\n ['width', /\\bdeviceWidth=(\\d+)/],\n ['height', /\\bdeviceHeight=(\\d+)/],\n ['fps', /\\bfps=(\\d+)/],\n ]) {\n const match = pattern.exec(output);\n if (!match) {\n log?.debug(output);\n throw new Error(`Cannot parse the device ${key} from the adb command output. ` +\n `Check the server log for more details.`);\n }\n result[key] = parseInt(match[1], 10);\n }\n result.udid = adb.curDeviceId;\n return result;\n}\n\nasync function initDeviceStreamingProc (adb, log, deviceInfo, opts = {}) {\n const {\n width,\n height,\n bitRate,\n } = opts;\n const adjustedWidth = parseInt(width, 10) || deviceInfo.width;\n const adjustedHeight = parseInt(height, 10) || deviceInfo.height;\n const adjustedBitrate = parseInt(bitRate, 10) || DEFAULT_BITRATE;\n let screenRecordCmd = SCREENRECORD_BINARY +\n ` --output-format=h264` +\n // 5 seconds is fine to detect rotation changes\n ` --time-limit=${RECORDING_INTERVAL_SEC}`;\n if (width || height) {\n screenRecordCmd += ` --size=${adjustedWidth}x${adjustedHeight}`;\n }\n if (bitRate) {\n screenRecordCmd += ` --bit-rate=${adjustedBitrate}`;\n }\n const adbArgs = [\n ...adb.executable.defaultArgs,\n 'exec-out',\n // The loop is required, because by default the maximum record duration\n // for screenrecord is always limited\n `while true; do ${screenRecordCmd} -; done`,\n ];\n const deviceStreaming = spawn(adb.executable.path, adbArgs);\n deviceStreaming.on('exit', (code, signal) => {\n log.debug(`Device streaming process exited with code ${code}, signal ${signal}`);\n });\n\n let isStarted = false;\n const deviceStreamingLogger = createStreamingLogger(SCREENRECORD_BINARY, deviceInfo.udid);\n const errorsListener = (chunk) => {\n const stderr = chunk.toString();\n if (_.trim(stderr)) {\n deviceStreamingLogger.debug(stderr);\n }\n };\n deviceStreaming.stderr.on('data', errorsListener);\n\n const startupListener = (chunk) => {\n if (!isStarted) {\n isStarted = !_.isEmpty(chunk);\n }\n };\n deviceStreaming.stdout.on('data', startupListener);\n\n try {\n log.info(`Starting device streaming: ${util.quote([adb.executable.path, ...adbArgs])}`);\n await waitForCondition(() => isStarted, {\n waitMs: STREAMING_STARTUP_TIMEOUT_MS,\n intervalMs: 300,\n });\n } catch (e) {\n log.errorAndThrow(\n `Cannot start the screen streaming process. Original error: ${e.message}`);\n } finally {\n deviceStreaming.stderr.removeListener('data', errorsListener);\n deviceStreaming.stdout.removeListener('data', startupListener);\n }\n return deviceStreaming;\n}\n\nasync function initGstreamerPipeline (deviceStreamingProc, deviceInfo, log, opts = {}) {\n const {\n width,\n height,\n quality,\n tcpPort,\n considerRotation,\n logPipelineDetails,\n } = opts;\n const adjustedWidth = parseInt(width, 10) || deviceInfo.width;\n const adjustedHeight = parseInt(height, 10) || deviceInfo.height;\n const gstreamerPipeline = new SubProcess(GSTREAMER_BINARY, [\n '-v',\n 'fdsrc', 'fd=0',\n '!', 'video/x-h264,' +\n `width=${considerRotation ? Math.max(adjustedWidth, adjustedHeight) : adjustedWidth},` +\n `height=${considerRotation ? Math.max(adjustedWidth, adjustedHeight) : adjustedHeight},` +\n `framerate=${deviceInfo.fps}/1,` +\n 'byte-stream=true',\n '!', 'h264parse',\n '!', 'queue', 'leaky=downstream',\n '!', 'avdec_h264',\n '!', 'queue', 'leaky=downstream',\n '!', 'jpegenc', `quality=${quality}`,\n '!', 'multipartmux', `boundary=${BOUNDARY_STRING}`,\n '!', 'tcpserversink', `host=${TCP_HOST}`, `port=${tcpPort}`,\n ], {\n stdio: [deviceStreamingProc.stdout, 'pipe', 'pipe']\n });\n gstreamerPipeline.on('exit', (code, signal) => {\n log.debug(`Pipeline streaming process exited with code ${code}, signal ${signal}`);\n });\n const gstreamerLogger = createStreamingLogger('gst', deviceInfo.udid);\n const gstOutputListener = (stdout, stderr) => {\n if (_.trim(stderr || stdout)) {\n gstreamerLogger.debug(stderr || stdout);\n }\n };\n gstreamerPipeline.on('output', gstOutputListener);\n let didFail = false;\n try {\n log.info(`Starting GStreamer pipeline: ${gstreamerPipeline.rep}`);\n await gstreamerPipeline.start(0);\n await waitForCondition(async () => {\n try {\n return (await checkPortStatus(tcpPort, TCP_HOST)) === 'open';\n } catch (ign) {\n return false;\n }\n }, {\n waitMs: STREAMING_STARTUP_TIMEOUT_MS,\n intervalMs: 300,\n });\n } catch (e) {\n didFail = true;\n log.errorAndThrow(\n `Cannot start the screen streaming pipeline. Original error: ${e.message}`);\n } finally {\n if (!logPipelineDetails || didFail) {\n gstreamerPipeline.removeListener('output', gstOutputListener);\n }\n }\n return gstreamerPipeline;\n}\n\nfunction extractRemoteAddress (req) {\n return req.headers['x-forwarded-for']\n || req.socket.remoteAddress\n || req.connection.remoteAddress\n || req.connection.socket.remoteAddress;\n}\n\n\n/**\n * @typedef {Object} StartScreenStreamingOptions\n *\n * @property {?number} width - The scaled width of the device's screen. If unset then the script will assign it\n * to the actual screen width measured in pixels.\n * @property {?number} height - The scaled height of the device's screen. If unset then the script will assign it\n * to the actual screen height measured in pixels.\n * @property {?number} bitRate - The video bit rate for the video, in bits per second.\n * The default value is 4000000 (4 Mb/s). You can increase the bit rate to improve video quality,\n * but doing so results in larger movie files.\n * @property {?string} host [127.0.0.1] - The IP address/host name to start the MJPEG server on.\n * You can set it to `0.0.0.0` to trigger the broadcast on all available network interfaces.\n * @property {?string} pathname - The HTTP request path the MJPEG server should be available on.\n * If unset then any pathname on the given `host`/`port` combination will work. Note that the value\n * should always start with a single slash: `/`\n * @property {?number} tcpPort [8094] - The port number to start the internal TCP MJPEG broadcast on.\n * This type of broadcast always starts on the loopback interface (`127.0.0.1`).\n * @property {?number} port [8093] - The port number to start the MJPEG server on.\n * @property {?number} quality [70] - The quality value for the streamed JPEG images.\n * This number should be in range [1, 100], where 100 is the best quality.\n * @property {?boolean} considerRotation [false] - If set to `true` then GStreamer pipeline will\n * increase the dimensions of the resulting images to properly fit images in both landscape and\n * portrait orientations. Set it to `true` if the device rotation is not going to be the same during the\n * broadcasting session.\n * @property {?boolean} logPipelineDetails [false] - Whether to log GStreamer pipeline events into\n * the standard log output. Might be useful for debugging purposes.\n */\n\n/**\n * Starts device screen broadcast by creating MJPEG server.\n * Multiple calls to this method have no effect unless the previous streaming\n * session is stopped.\n * This method only works if the `adb_screen_streaming` feature is\n * enabled on the server side.\n *\n * @param {?StartScreenStreamingOptions} options - The available options.\n * @throws {Error} If screen streaming has failed to start or\n * is not supported on the host system or\n * the corresponding server feature is not enabled.\n */\ncommands.mobileStartScreenStreaming = async function mobileStartScreenStreaming (options = {}) {\n this.ensureFeatureEnabled(ADB_SCREEN_STREAMING_FEATURE);\n\n const {\n width,\n height,\n bitRate,\n host = DEFAULT_HOST,\n port = DEFAULT_PORT,\n pathname,\n tcpPort = DEFAULT_PORT + 1,\n quality = DEFAULT_QUALITY,\n considerRotation = false,\n logPipelineDetails = false,\n } = options;\n\n if (_.isUndefined(this._screenStreamingProps)) {\n await verifyStreamingRequirements(this.adb);\n }\n if (!_.isEmpty(this._screenStreamingProps)) {\n this.log.info(`The screen streaming session is already running. ` +\n `Stop it first in order to start a new one.`);\n return;\n }\n if ((await checkPortStatus(port, host)) === 'open') {\n this.log.info(`The port #${port} at ${host} is busy. ` +\n `Assuming the screen streaming is already running`);\n return;\n }\n if ((await checkPortStatus(tcpPort, TCP_HOST)) === 'open') {\n this.log.errorAndThrow(`The port #${tcpPort} at ${TCP_HOST} is busy. ` +\n `Make sure there are no leftovers from previous sessions.`);\n }\n this._screenStreamingProps = null;\n\n const deviceInfo = await getDeviceInfo(this.adb, this.log);\n const deviceStreamingProc = await initDeviceStreamingProc(this.adb, this.log, deviceInfo, {\n width,\n height,\n bitRate,\n });\n let gstreamerPipeline;\n try {\n gstreamerPipeline = await initGstreamerPipeline(deviceStreamingProc, deviceInfo, this.log, {\n width,\n height,\n quality,\n tcpPort,\n considerRotation,\n logPipelineDetails,\n });\n } catch (e) {\n if (deviceStreamingProc.kill(0)) {\n deviceStreamingProc.kill();\n }\n throw e;\n }\n\n let mjpegSocket;\n let mjpegServer;\n try {\n await new B((resolve, reject) => {\n mjpegSocket = net.createConnection(tcpPort, TCP_HOST, () => {\n this.log.info(`Successfully connected to MJPEG stream at tcp://${TCP_HOST}:${tcpPort}`);\n mjpegServer = http.createServer((req, res) => {\n const remoteAddress = extractRemoteAddress(req);\n const currentPathname = url.parse(req.url).pathname;\n this.log.info(`Got an incoming screen bradcasting request from ${remoteAddress} ` +\n `(${req.headers['user-agent'] || 'User Agent unknown'}) at ${currentPathname}`);\n\n if (pathname && currentPathname !== pathname) {\n this.log.info('Rejecting the broadcast request since it does not match the given pathname');\n res.writeHead(404, {\n Connection: 'close',\n 'Content-Type': 'text/plain; charset=utf-8',\n });\n res.write(`'${currentPathname}' did not match any known endpoints`);\n res.end();\n return;\n }\n\n this.log.info('Starting MJPEG broadcast');\n res.writeHead(200, {\n 'Cache-Control': 'no-store, no-cache, must-revalidate, pre-check=0, post-check=0, max-age=0',\n Pragma: 'no-cache',\n Connection: 'close',\n 'Content-Type': `multipart/x-mixed-replace; boundary=${BOUNDARY_STRING}`\n });\n\n mjpegSocket.pipe(res);\n });\n mjpegServer.on('error', (e) => {\n this.log.warn(e);\n reject(e);\n });\n mjpegServer.on('close', () => {\n this.log.debug(`MJPEG server at http://${host}:${port} has been closed`);\n });\n mjpegServer.on('listening', () => {\n this.log.info(`Successfully started MJPEG server at http://${host}:${port}`);\n resolve();\n });\n mjpegServer.listen(port, host);\n });\n mjpegSocket.on('error', (e) => {\n this.log.error(e);\n reject(e);\n });\n }).timeout(STREAMING_STARTUP_TIMEOUT_MS,\n `Cannot connect to the streaming server within ${STREAMING_STARTUP_TIMEOUT_MS}ms`);\n } catch (e) {\n if (deviceStreamingProc.kill(0)) {\n deviceStreamingProc.kill();\n }\n if (gstreamerPipeline.isRunning) {\n await gstreamerPipeline.stop();\n }\n if (mjpegSocket) {\n mjpegSocket.destroy();\n }\n if (mjpegServer && mjpegServer.listening) {\n mjpegServer.close();\n }\n throw e;\n }\n\n this._screenStreamingProps = {\n deviceStreamingProc,\n gstreamerPipeline,\n mjpegSocket,\n mjpegServer,\n };\n};\n\n/**\n * Stop screen streaming.\n * If no screen streaming server has been started then nothing is done.\n */\ncommands.mobileStopScreenStreaming = async function mobileStopScreenStreaming (/* options = {} */) {\n if (_.isEmpty(this._screenStreamingProps)) {\n if (!_.isUndefined(this._screenStreamingProps)) {\n this.log.debug(`Screen streaming is not running. There is nothing to stop`);\n }\n return;\n }\n\n const {\n deviceStreamingProc,\n gstreamerPipeline,\n mjpegSocket,\n mjpegServer,\n } = this._screenStreamingProps;\n\n try {\n mjpegSocket.end();\n if (mjpegServer.listening) {\n mjpegServer.close();\n }\n if (deviceStreamingProc.kill(0)) {\n deviceStreamingProc.kill('SIGINT');\n }\n if (gstreamerPipeline.isRunning) {\n try {\n await gstreamerPipeline.stop('SIGINT');\n } catch (e) {\n this.log.warn(e);\n try {\n await gstreamerPipeline.stop('SIGKILL');\n } catch (e1) {\n this.log.error(e1);\n }\n }\n }\n this.log.info(`Successfully terminated the screen streaming MJPEG server`);\n } finally {\n this._screenStreamingProps = null;\n }\n};\n\n\nexport default commands;\n"],"mappings":"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"}
|
|
@@ -1,18 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
7
|
exports.default = void 0;
|
|
9
8
|
exports.parseWindowProperties = parseWindowProperties;
|
|
10
9
|
exports.parseWindows = parseWindows;
|
|
11
|
-
|
|
12
10
|
require("source-map-support/register");
|
|
13
|
-
|
|
14
11
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
15
|
-
|
|
16
12
|
const WINDOW_TITLE_PATTERN = /^\s+Window\s#\d+\sWindow\{[0-9a-f]+\s\w+\s([\w-]+)\}:$/;
|
|
17
13
|
const FRAME_PATTERN = /\bm?[Ff]rame=\[([0-9.-]+),([0-9.-]+)\]\[([0-9.-]+),([0-9.-]+)\]/;
|
|
18
14
|
const VIEW_VISIBILITY_PATTERN = /\bmViewVisibility=(0x[0-9a-fA-F]+)/;
|
|
@@ -30,26 +26,21 @@ const commands = {};
|
|
|
30
26
|
|
|
31
27
|
function parseWindowProperties(name, props, log = null) {
|
|
32
28
|
const result = _lodash.default.cloneDeep(DEFAULT_WINDOW_PROPERTIES);
|
|
33
|
-
|
|
34
29
|
const propLines = props.join('\n');
|
|
35
30
|
const frameMatch = FRAME_PATTERN.exec(propLines);
|
|
36
|
-
|
|
37
31
|
if (!frameMatch) {
|
|
38
32
|
log === null || log === void 0 ? void 0 : log.debug(propLines);
|
|
39
33
|
throw new Error(`Cannot parse the frame size from '${name}' window properties`);
|
|
40
34
|
}
|
|
41
|
-
|
|
42
35
|
result.x = parseFloat(frameMatch[1]);
|
|
43
36
|
result.y = parseFloat(frameMatch[2]);
|
|
44
37
|
result.width = parseFloat(frameMatch[3]) - result.x;
|
|
45
38
|
result.height = parseFloat(frameMatch[4]) - result.y;
|
|
46
39
|
const visibilityMatch = VIEW_VISIBILITY_PATTERN.exec(propLines);
|
|
47
|
-
|
|
48
40
|
if (!visibilityMatch) {
|
|
49
41
|
log === null || log === void 0 ? void 0 : log.debug(propLines);
|
|
50
42
|
throw new Error(`Cannot parse the visibility value from '${name}' window properties`);
|
|
51
43
|
}
|
|
52
|
-
|
|
53
44
|
result.visible = parseInt(visibilityMatch[1], 16) === VIEW_VISIBLE;
|
|
54
45
|
return result;
|
|
55
46
|
}
|
|
@@ -57,36 +48,29 @@ function parseWindowProperties(name, props, log = null) {
|
|
|
57
48
|
function parseWindows(lines, log = null) {
|
|
58
49
|
const windows = {};
|
|
59
50
|
let currentWindowName = null;
|
|
60
|
-
|
|
61
51
|
for (const line of lines.split('\n').map(_lodash.default.trimEnd)) {
|
|
62
52
|
const match = WINDOW_TITLE_PATTERN.exec(line);
|
|
63
|
-
|
|
64
53
|
if (match) {
|
|
65
54
|
currentWindowName = match[1];
|
|
66
55
|
windows[currentWindowName] = [];
|
|
67
56
|
continue;
|
|
68
57
|
}
|
|
69
|
-
|
|
70
58
|
if (_lodash.default.trim(line).length === 0) {
|
|
71
59
|
currentWindowName = null;
|
|
72
60
|
continue;
|
|
73
61
|
}
|
|
74
|
-
|
|
75
62
|
if (currentWindowName && _lodash.default.isArray(windows[currentWindowName])) {
|
|
76
63
|
windows[currentWindowName].push(line);
|
|
77
64
|
}
|
|
78
65
|
}
|
|
79
|
-
|
|
80
66
|
if (_lodash.default.isEmpty(windows)) {
|
|
81
67
|
log === null || log === void 0 ? void 0 : log.debug(lines.join('\n'));
|
|
82
68
|
throw new Error('Cannot parse any window information from the dumpsys output');
|
|
83
69
|
}
|
|
84
|
-
|
|
85
70
|
const result = {
|
|
86
71
|
statusBar: null,
|
|
87
72
|
navigationBar: null
|
|
88
73
|
};
|
|
89
|
-
|
|
90
74
|
for (const [name, props] of _lodash.default.toPairs(windows)) {
|
|
91
75
|
if (name.startsWith(STATUS_BAR_WINDOW_NAME_PREFIX)) {
|
|
92
76
|
result.statusBar = parseWindowProperties(name, props, log);
|
|
@@ -94,29 +78,23 @@ function parseWindows(lines, log = null) {
|
|
|
94
78
|
result.navigationBar = parseWindowProperties(name, props, log);
|
|
95
79
|
}
|
|
96
80
|
}
|
|
97
|
-
|
|
98
81
|
const unmatchedWindows = [['statusBar', STATUS_BAR_WINDOW_NAME_PREFIX], ['navigationBar', NAVIGATION_BAR_WINDOW_NAME_PREFIX]].filter(([name]) => _lodash.default.isNil(result[name]));
|
|
99
|
-
|
|
100
82
|
for (const [window, namePrefix] of unmatchedWindows) {
|
|
101
83
|
log === null || log === void 0 ? void 0 : log.info(`No windows have been found whose title matches to ` + `'${namePrefix}'. Assuming it is invisible. ` + `Only the following windows are available: ${_lodash.default.keys(windows)}`);
|
|
102
84
|
result[window] = _lodash.default.cloneDeep(DEFAULT_WINDOW_PROPERTIES);
|
|
103
85
|
}
|
|
104
|
-
|
|
105
86
|
return result;
|
|
106
87
|
}
|
|
107
|
-
|
|
108
88
|
commands.getSystemBars = async function getSystemBars() {
|
|
109
89
|
let stdout;
|
|
110
|
-
|
|
111
90
|
try {
|
|
112
91
|
stdout = await this.adb.shell(['dumpsys', 'window', 'windows']);
|
|
113
92
|
} catch (e) {
|
|
114
93
|
throw new Error(`Cannot retrieve system bars details. Original error: ${e.message}`);
|
|
115
94
|
}
|
|
116
|
-
|
|
117
95
|
return parseWindows(stdout, this.log);
|
|
118
96
|
};
|
|
119
97
|
|
|
120
98
|
var _default = commands;
|
|
121
99
|
exports.default = _default;
|
|
122
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJXSU5ET1dfVElUTEVfUEFUVEVSTiIsIkZSQU1FX1BBVFRFUk4iLCJWSUVXX1ZJU0lCSUxJVFlfUEFUVEVSTiIsIlZJRVdfVklTSUJMRSIsIlNUQVRVU19CQVJfV0lORE9XX05BTUVfUFJFRklYIiwiTkFWSUdBVElPTl9CQVJfV0lORE9XX05BTUVfUFJFRklYIiwiREVGQVVMVF9XSU5ET1dfUFJPUEVSVElFUyIsInZpc2libGUiLCJ4IiwieSIsIndpZHRoIiwiaGVpZ2h0IiwiY29tbWFuZHMiLCJwYXJzZVdpbmRvd1Byb3BlcnRpZXMiLCJuYW1lIiwicHJvcHMiLCJsb2ciLCJyZXN1bHQiLCJfIiwiY2xvbmVEZWVwIiwicHJvcExpbmVzIiwiam9pbiIsImZyYW1lTWF0Y2giLCJleGVjIiwiZGVidWciLCJFcnJvciIsInBhcnNlRmxvYXQiLCJ2aXNpYmlsaXR5TWF0Y2giLCJwYXJzZUludCIsInBhcnNlV2luZG93cyIsImxpbmVzIiwid2luZG93cyIsImN1cnJlbnRXaW5kb3dOYW1lIiwibGluZSIsInNwbGl0IiwibWFwIiwidHJpbUVuZCIsIm1hdGNoIiwidHJpbSIsImxlbmd0aCIsImlzQXJyYXkiLCJwdXNoIiwiaXNFbXB0eSIsInN0YXR1c0JhciIsIm5hdmlnYXRpb25CYXIiLCJ0b1BhaXJzIiwic3RhcnRzV2l0aCIsInVubWF0Y2hlZFdpbmRvd3MiLCJmaWx0ZXIiLCJpc05pbCIsIndpbmRvdyIsIm5hbWVQcmVmaXgiLCJpbmZvIiwia2V5cyIsImdldFN5c3RlbUJhcnMiLCJzdGRvdXQiLCJhZGIiLCJzaGVsbCIsImUiLCJtZXNzYWdlIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL3N5c3RlbS1iYXJzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5cbmNvbnN0IFdJTkRPV19USVRMRV9QQVRURVJOID0gL15cXHMrV2luZG93XFxzI1xcZCtcXHNXaW5kb3dcXHtbMC05YS1mXStcXHNcXHcrXFxzKFtcXHctXSspXFx9OiQvO1xuY29uc3QgRlJBTUVfUEFUVEVSTiA9IC9cXGJtP1tGZl1yYW1lPVxcWyhbMC05Li1dKyksKFswLTkuLV0rKVxcXVxcWyhbMC05Li1dKyksKFswLTkuLV0rKVxcXS87XG5jb25zdCBWSUVXX1ZJU0lCSUxJVFlfUEFUVEVSTiA9IC9cXGJtVmlld1Zpc2liaWxpdHk9KDB4WzAtOWEtZkEtRl0rKS87XG4vLyBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC92aWV3L1ZpZXcjVklTSUJMRVxuY29uc3QgVklFV19WSVNJQkxFID0gMHgwO1xuY29uc3QgU1RBVFVTX0JBUl9XSU5ET1dfTkFNRV9QUkVGSVggPSAnU3RhdHVzQmFyJztcbmNvbnN0IE5BVklHQVRJT05fQkFSX1dJTkRPV19OQU1FX1BSRUZJWCA9ICdOYXZpZ2F0aW9uQmFyJztcbmNvbnN0IERFRkFVTFRfV0lORE9XX1BST1BFUlRJRVMgPSB7XG4gIHZpc2libGU6IGZhbHNlLFxuICB4OiAwLCB5OiAwLCB3aWR0aDogMCwgaGVpZ2h0OiAwLFxufTtcblxuY29uc3QgY29tbWFuZHMgPSB7fTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBXaW5kb3dQcm9wZXJ0aWVzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHZpc2libGUgV2hldGhlciB0aGUgd2luZG93IGlzIHZpc2libGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB4IFdpbmRvdyB4IGNvb3JkaW5hdGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB5IFdpbmRvdyB5IGNvb3JkaW5hdGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB3aWR0aCBXaW5kb3cgd2lkdGhcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBoZWlnaHQgV2luZG93IGhlaWdodFxuICovXG5cbi8qKlxuICogUGFyc2VzIHdpbmRvdyBwcm9wZXJ0aWVzIGZyb20gYWRiIGR1bXBzeXMgb3V0cHV0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHdpbmRvdyB3aG9zZSBwcm9wZXJ0aWVzIGFyZSBiZWluZyBwYXJzZWRcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gcHJvcHMgVGhlIGxpc3Qgb2YgcGFydGljdWxhciB3aW5kb3cgcHJvcGVydHkgbGluZXMuXG4gKiBDaGVjayB0aGUgY29ycmVzcG9uZGluZyB1bml0IHRlc3RzIGZvciBtb3JlIGRldGFpbHMgb24gdGhlIGlucHV0IGZvcm1hdC5cbiAqIEBwYXJhbSB7T2JqZWN0P30gbG9nIExvZ2dlciBpbnN0YW5jZVxuICogQHJldHVybnMge1dpbmRvd1Byb3BlcnRpZXN9IFBhcnNlZCBwcm9wZXJ0aWVzIG9iamVjdFxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBpc3N1ZSB3aGlsZSBwYXJzaW5nIHRoZSBwcm9wZXJ0aWVzIHN0cmluZ1xuICovXG5mdW5jdGlvbiBwYXJzZVdpbmRvd1Byb3BlcnRpZXMgKG5hbWUsIHByb3BzLCBsb2cgPSBudWxsKSB7XG4gIGNvbnN0IHJlc3VsdCA9IF8uY2xvbmVEZWVwKERFRkFVTFRfV0lORE9XX1BST1BFUlRJRVMpO1xuICBjb25zdCBwcm9wTGluZXMgPSBwcm9wcy5qb2luKCdcXG4nKTtcbiAgY29uc3QgZnJhbWVNYXRjaCA9IEZSQU1FX1BBVFRFUk4uZXhlYyhwcm9wTGluZXMpO1xuICBpZiAoIWZyYW1lTWF0Y2gpIHtcbiAgICBsb2c/LmRlYnVnKHByb3BMaW5lcyk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcGFyc2UgdGhlIGZyYW1lIHNpemUgZnJvbSAnJHtuYW1lfScgd2luZG93IHByb3BlcnRpZXNgKTtcbiAgfVxuICByZXN1bHQueCA9IHBhcnNlRmxvYXQoZnJhbWVNYXRjaFsxXSk7XG4gIHJlc3VsdC55ID0gcGFyc2VGbG9hdChmcmFtZU1hdGNoWzJdKTtcbiAgcmVzdWx0LndpZHRoID0gcGFyc2VGbG9hdChmcmFtZU1hdGNoWzNdKSAtIHJlc3VsdC54O1xuICByZXN1bHQuaGVpZ2h0ID0gcGFyc2VGbG9hdChmcmFtZU1hdGNoWzRdKSAtIHJlc3VsdC55O1xuICBjb25zdCB2aXNpYmlsaXR5TWF0Y2ggPSBWSUVXX1ZJU0lCSUxJVFlfUEFUVEVSTi5leGVjKHByb3BMaW5lcyk7XG4gIGlmICghdmlzaWJpbGl0eU1hdGNoKSB7XG4gICAgbG9nPy5kZWJ1Zyhwcm9wTGluZXMpO1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHBhcnNlIHRoZSB2aXNpYmlsaXR5IHZhbHVlIGZyb20gJyR7bmFtZX0nIHdpbmRvdyBwcm9wZXJ0aWVzYCk7XG4gIH1cbiAgcmVzdWx0LnZpc2libGUgPSBwYXJzZUludCh2aXNpYmlsaXR5TWF0Y2hbMV0sIDE2KSA9PT0gVklFV19WSVNJQkxFO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIHN0YXR1cyBhbmQgbmF2aWdhdGlvbiBiYXIgaW5mb3JtYXRpb24gZnJvbSB0aGUgd2luZG93IG1hbmFnZXIgb3V0cHV0LlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gbGluZXMgT3V0cHV0IGZyb20gZHVtcHN5cyBjb21tYW5kLlxuICogQ2hlY2sgdGhlIGNvcnJlc3BvbmRpbmcgdW5pdCB0ZXN0cyBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBpbnB1dCBmb3JtYXQuXG4gKiBAcGFyYW0ge09iamVjdD99IGxvZyBMb2dnZXIgaW5zdGFuY2VcbiAqIEByZXR1cm4ge09iamVjdH0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdHdvIGl0ZW1zIHdoZXJlIGtleXMgYXJlIHN0YXR1c0JhciBhbmQgbmF2aWdhdGlvbkJhcixcbiAqIGFuZCB2YWx1ZXMgYXJlIGNvcnJlc3BvbmRpbmcgV2luZG93UHJvcGVydGllcyBvYmplY3RzXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgbm8gd2luZG93IHByb3BlcnRpZXMgY291bGQgYmUgcGFyc2VkXG4gKi9cbmZ1bmN0aW9uIHBhcnNlV2luZG93cyAobGluZXMsIGxvZyA9IG51bGwpIHtcbiAgY29uc3Qgd2luZG93cyA9IHt9O1xuICBsZXQgY3VycmVudFdpbmRvd05hbWUgPSBudWxsO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMuc3BsaXQoJ1xcbicpLm1hcChfLnRyaW1FbmQpKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBXSU5ET1dfVElUTEVfUEFUVEVSTi5leGVjKGxpbmUpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgY3VycmVudFdpbmRvd05hbWUgPSBtYXRjaFsxXTtcbiAgICAgIHdpbmRvd3NbY3VycmVudFdpbmRvd05hbWVdID0gW107XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKF8udHJpbShsaW5lKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGN1cnJlbnRXaW5kb3dOYW1lID0gbnVsbDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50V2luZG93TmFtZSAmJiBfLmlzQXJyYXkod2luZG93c1tjdXJyZW50V2luZG93TmFtZV0pKSB7XG4gICAgICB3aW5kb3dzW2N1cnJlbnRXaW5kb3dOYW1lXS5wdXNoKGxpbmUpO1xuICAgIH1cbiAgfVxuICBpZiAoXy5pc0VtcHR5KHdpbmRvd3MpKSB7XG4gICAgbG9nPy5kZWJ1ZyhsaW5lcy5qb2luKCdcXG4nKSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcGFyc2UgYW55IHdpbmRvdyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBkdW1wc3lzIG91dHB1dCcpO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0ID0ge3N0YXR1c0JhcjogbnVsbCwgbmF2aWdhdGlvbkJhcjogbnVsbH07XG4gIGZvciAoY29uc3QgW25hbWUsIHByb3BzXSBvZiBfLnRvUGFpcnMod2luZG93cykpIHtcbiAgICBpZiAobmFtZS5zdGFydHNXaXRoKFNUQVRVU19CQVJfV0lORE9XX05BTUVfUFJFRklYKSkge1xuICAgICAgcmVzdWx0LnN0YXR1c0JhciA9IHBhcnNlV2luZG93UHJvcGVydGllcyhuYW1lLCBwcm9wcywgbG9nKTtcbiAgICB9IGVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aChOQVZJR0FUSU9OX0JBUl9XSU5ET1dfTkFNRV9QUkVGSVgpKSB7XG4gICAgICByZXN1bHQubmF2aWdhdGlvbkJhciA9IHBhcnNlV2luZG93UHJvcGVydGllcyhuYW1lLCBwcm9wcywgbG9nKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgdW5tYXRjaGVkV2luZG93cyA9IFtcbiAgICBbJ3N0YXR1c0JhcicsIFNUQVRVU19CQVJfV0lORE9XX05BTUVfUFJFRklYXSxcbiAgICBbJ25hdmlnYXRpb25CYXInLCBOQVZJR0FUSU9OX0JBUl9XSU5ET1dfTkFNRV9QUkVGSVhdXG4gIF0uZmlsdGVyKChbbmFtZV0pID0+IF8uaXNOaWwocmVzdWx0W25hbWVdKSk7XG4gIGZvciAoY29uc3QgW3dpbmRvdywgbmFtZVByZWZpeF0gb2YgdW5tYXRjaGVkV2luZG93cykge1xuICAgIGxvZz8uaW5mbyhgTm8gd2luZG93cyBoYXZlIGJlZW4gZm91bmQgd2hvc2UgdGl0bGUgbWF0Y2hlcyB0byBgICtcbiAgICAgIGAnJHtuYW1lUHJlZml4fScuIEFzc3VtaW5nIGl0IGlzIGludmlzaWJsZS4gYCArXG4gICAgICBgT25seSB0aGUgZm9sbG93aW5nIHdpbmRvd3MgYXJlIGF2YWlsYWJsZTogJHtfLmtleXMod2luZG93cyl9YCk7XG4gICAgcmVzdWx0W3dpbmRvd10gPSBfLmNsb25lRGVlcChERUZBVUxUX1dJTkRPV19QUk9QRVJUSUVTKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5jb21tYW5kcy5nZXRTeXN0ZW1CYXJzID0gYXN5bmMgZnVuY3Rpb24gZ2V0U3lzdGVtQmFycyAoKSB7XG4gIGxldCBzdGRvdXQ7XG4gIHRyeSB7XG4gICAgc3Rkb3V0ID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydkdW1wc3lzJywgJ3dpbmRvdycsICd3aW5kb3dzJ10pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmV0cmlldmUgc3lzdGVtIGJhcnMgZGV0YWlscy4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG4gIHJldHVybiBwYXJzZVdpbmRvd3Moc3Rkb3V0LCB0aGlzLmxvZyk7XG59O1xuXG4vLyBmb3IgdW5pdCB0ZXN0c1xuZXhwb3J0IHsgcGFyc2VXaW5kb3dzLCBwYXJzZVdpbmRvd1Byb3BlcnRpZXMgfTtcbmV4cG9ydCBkZWZhdWx0IGNvbW1hbmRzO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUE7O0FBRUEsTUFBTUEsb0JBQW9CLEdBQUcsd0RBQTdCO0FBQ0EsTUFBTUMsYUFBYSxHQUFHLGlFQUF0QjtBQUNBLE1BQU1DLHVCQUF1QixHQUFHLG9DQUFoQztBQUVBLE1BQU1DLFlBQVksR0FBRyxHQUFyQjtBQUNBLE1BQU1DLDZCQUE2QixHQUFHLFdBQXRDO0FBQ0EsTUFBTUMsaUNBQWlDLEdBQUcsZUFBMUM7QUFDQSxNQUFNQyx5QkFBeUIsR0FBRztFQUNoQ0MsT0FBTyxFQUFFLEtBRHVCO0VBRWhDQyxDQUFDLEVBQUUsQ0FGNkI7RUFFMUJDLENBQUMsRUFBRSxDQUZ1QjtFQUVwQkMsS0FBSyxFQUFFLENBRmE7RUFFVkMsTUFBTSxFQUFFO0FBRkUsQ0FBbEM7QUFLQSxNQUFNQyxRQUFRLEdBQUcsRUFBakI7O0FBcUJBLFNBQVNDLHFCQUFULENBQWdDQyxJQUFoQyxFQUFzQ0MsS0FBdEMsRUFBNkNDLEdBQUcsR0FBRyxJQUFuRCxFQUF5RDtFQUN2RCxNQUFNQyxNQUFNLEdBQUdDLGVBQUEsQ0FBRUMsU0FBRixDQUFZYix5QkFBWixDQUFmOztFQUNBLE1BQU1jLFNBQVMsR0FBR0wsS0FBSyxDQUFDTSxJQUFOLENBQVcsSUFBWCxDQUFsQjtFQUNBLE1BQU1DLFVBQVUsR0FBR3JCLGFBQWEsQ0FBQ3NCLElBQWQsQ0FBbUJILFNBQW5CLENBQW5COztFQUNBLElBQUksQ0FBQ0UsVUFBTCxFQUFpQjtJQUNmTixHQUFHLFNBQUgsSUFBQUEsR0FBRyxXQUFILFlBQUFBLEdBQUcsQ0FBRVEsS0FBTCxDQUFXSixTQUFYO0lBQ0Es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
|
|
100
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJXSU5ET1dfVElUTEVfUEFUVEVSTiIsIkZSQU1FX1BBVFRFUk4iLCJWSUVXX1ZJU0lCSUxJVFlfUEFUVEVSTiIsIlZJRVdfVklTSUJMRSIsIlNUQVRVU19CQVJfV0lORE9XX05BTUVfUFJFRklYIiwiTkFWSUdBVElPTl9CQVJfV0lORE9XX05BTUVfUFJFRklYIiwiREVGQVVMVF9XSU5ET1dfUFJPUEVSVElFUyIsInZpc2libGUiLCJ4IiwieSIsIndpZHRoIiwiaGVpZ2h0IiwiY29tbWFuZHMiLCJwYXJzZVdpbmRvd1Byb3BlcnRpZXMiLCJuYW1lIiwicHJvcHMiLCJsb2ciLCJyZXN1bHQiLCJfIiwiY2xvbmVEZWVwIiwicHJvcExpbmVzIiwiam9pbiIsImZyYW1lTWF0Y2giLCJleGVjIiwiZGVidWciLCJFcnJvciIsInBhcnNlRmxvYXQiLCJ2aXNpYmlsaXR5TWF0Y2giLCJwYXJzZUludCIsInBhcnNlV2luZG93cyIsImxpbmVzIiwid2luZG93cyIsImN1cnJlbnRXaW5kb3dOYW1lIiwibGluZSIsInNwbGl0IiwibWFwIiwidHJpbUVuZCIsIm1hdGNoIiwidHJpbSIsImxlbmd0aCIsImlzQXJyYXkiLCJwdXNoIiwiaXNFbXB0eSIsInN0YXR1c0JhciIsIm5hdmlnYXRpb25CYXIiLCJ0b1BhaXJzIiwic3RhcnRzV2l0aCIsInVubWF0Y2hlZFdpbmRvd3MiLCJmaWx0ZXIiLCJpc05pbCIsIndpbmRvdyIsIm5hbWVQcmVmaXgiLCJpbmZvIiwia2V5cyIsImdldFN5c3RlbUJhcnMiLCJzdGRvdXQiLCJhZGIiLCJzaGVsbCIsImUiLCJtZXNzYWdlIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL3N5c3RlbS1iYXJzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5cbmNvbnN0IFdJTkRPV19USVRMRV9QQVRURVJOID0gL15cXHMrV2luZG93XFxzI1xcZCtcXHNXaW5kb3dcXHtbMC05YS1mXStcXHNcXHcrXFxzKFtcXHctXSspXFx9OiQvO1xuY29uc3QgRlJBTUVfUEFUVEVSTiA9IC9cXGJtP1tGZl1yYW1lPVxcWyhbMC05Li1dKyksKFswLTkuLV0rKVxcXVxcWyhbMC05Li1dKyksKFswLTkuLV0rKVxcXS87XG5jb25zdCBWSUVXX1ZJU0lCSUxJVFlfUEFUVEVSTiA9IC9cXGJtVmlld1Zpc2liaWxpdHk9KDB4WzAtOWEtZkEtRl0rKS87XG4vLyBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC92aWV3L1ZpZXcjVklTSUJMRVxuY29uc3QgVklFV19WSVNJQkxFID0gMHgwO1xuY29uc3QgU1RBVFVTX0JBUl9XSU5ET1dfTkFNRV9QUkVGSVggPSAnU3RhdHVzQmFyJztcbmNvbnN0IE5BVklHQVRJT05fQkFSX1dJTkRPV19OQU1FX1BSRUZJWCA9ICdOYXZpZ2F0aW9uQmFyJztcbmNvbnN0IERFRkFVTFRfV0lORE9XX1BST1BFUlRJRVMgPSB7XG4gIHZpc2libGU6IGZhbHNlLFxuICB4OiAwLCB5OiAwLCB3aWR0aDogMCwgaGVpZ2h0OiAwLFxufTtcblxuY29uc3QgY29tbWFuZHMgPSB7fTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBXaW5kb3dQcm9wZXJ0aWVzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHZpc2libGUgV2hldGhlciB0aGUgd2luZG93IGlzIHZpc2libGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB4IFdpbmRvdyB4IGNvb3JkaW5hdGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB5IFdpbmRvdyB5IGNvb3JkaW5hdGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB3aWR0aCBXaW5kb3cgd2lkdGhcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBoZWlnaHQgV2luZG93IGhlaWdodFxuICovXG5cbi8qKlxuICogUGFyc2VzIHdpbmRvdyBwcm9wZXJ0aWVzIGZyb20gYWRiIGR1bXBzeXMgb3V0cHV0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHdpbmRvdyB3aG9zZSBwcm9wZXJ0aWVzIGFyZSBiZWluZyBwYXJzZWRcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gcHJvcHMgVGhlIGxpc3Qgb2YgcGFydGljdWxhciB3aW5kb3cgcHJvcGVydHkgbGluZXMuXG4gKiBDaGVjayB0aGUgY29ycmVzcG9uZGluZyB1bml0IHRlc3RzIGZvciBtb3JlIGRldGFpbHMgb24gdGhlIGlucHV0IGZvcm1hdC5cbiAqIEBwYXJhbSB7T2JqZWN0P30gbG9nIExvZ2dlciBpbnN0YW5jZVxuICogQHJldHVybnMge1dpbmRvd1Byb3BlcnRpZXN9IFBhcnNlZCBwcm9wZXJ0aWVzIG9iamVjdFxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBpc3N1ZSB3aGlsZSBwYXJzaW5nIHRoZSBwcm9wZXJ0aWVzIHN0cmluZ1xuICovXG5mdW5jdGlvbiBwYXJzZVdpbmRvd1Byb3BlcnRpZXMgKG5hbWUsIHByb3BzLCBsb2cgPSBudWxsKSB7XG4gIGNvbnN0IHJlc3VsdCA9IF8uY2xvbmVEZWVwKERFRkFVTFRfV0lORE9XX1BST1BFUlRJRVMpO1xuICBjb25zdCBwcm9wTGluZXMgPSBwcm9wcy5qb2luKCdcXG4nKTtcbiAgY29uc3QgZnJhbWVNYXRjaCA9IEZSQU1FX1BBVFRFUk4uZXhlYyhwcm9wTGluZXMpO1xuICBpZiAoIWZyYW1lTWF0Y2gpIHtcbiAgICBsb2c/LmRlYnVnKHByb3BMaW5lcyk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcGFyc2UgdGhlIGZyYW1lIHNpemUgZnJvbSAnJHtuYW1lfScgd2luZG93IHByb3BlcnRpZXNgKTtcbiAgfVxuICByZXN1bHQueCA9IHBhcnNlRmxvYXQoZnJhbWVNYXRjaFsxXSk7XG4gIHJlc3VsdC55ID0gcGFyc2VGbG9hdChmcmFtZU1hdGNoWzJdKTtcbiAgcmVzdWx0LndpZHRoID0gcGFyc2VGbG9hdChmcmFtZU1hdGNoWzNdKSAtIHJlc3VsdC54O1xuICByZXN1bHQuaGVpZ2h0ID0gcGFyc2VGbG9hdChmcmFtZU1hdGNoWzRdKSAtIHJlc3VsdC55O1xuICBjb25zdCB2aXNpYmlsaXR5TWF0Y2ggPSBWSUVXX1ZJU0lCSUxJVFlfUEFUVEVSTi5leGVjKHByb3BMaW5lcyk7XG4gIGlmICghdmlzaWJpbGl0eU1hdGNoKSB7XG4gICAgbG9nPy5kZWJ1Zyhwcm9wTGluZXMpO1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHBhcnNlIHRoZSB2aXNpYmlsaXR5IHZhbHVlIGZyb20gJyR7bmFtZX0nIHdpbmRvdyBwcm9wZXJ0aWVzYCk7XG4gIH1cbiAgcmVzdWx0LnZpc2libGUgPSBwYXJzZUludCh2aXNpYmlsaXR5TWF0Y2hbMV0sIDE2KSA9PT0gVklFV19WSVNJQkxFO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIHN0YXR1cyBhbmQgbmF2aWdhdGlvbiBiYXIgaW5mb3JtYXRpb24gZnJvbSB0aGUgd2luZG93IG1hbmFnZXIgb3V0cHV0LlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gbGluZXMgT3V0cHV0IGZyb20gZHVtcHN5cyBjb21tYW5kLlxuICogQ2hlY2sgdGhlIGNvcnJlc3BvbmRpbmcgdW5pdCB0ZXN0cyBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBpbnB1dCBmb3JtYXQuXG4gKiBAcGFyYW0ge09iamVjdD99IGxvZyBMb2dnZXIgaW5zdGFuY2VcbiAqIEByZXR1cm4ge09iamVjdH0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdHdvIGl0ZW1zIHdoZXJlIGtleXMgYXJlIHN0YXR1c0JhciBhbmQgbmF2aWdhdGlvbkJhcixcbiAqIGFuZCB2YWx1ZXMgYXJlIGNvcnJlc3BvbmRpbmcgV2luZG93UHJvcGVydGllcyBvYmplY3RzXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgbm8gd2luZG93IHByb3BlcnRpZXMgY291bGQgYmUgcGFyc2VkXG4gKi9cbmZ1bmN0aW9uIHBhcnNlV2luZG93cyAobGluZXMsIGxvZyA9IG51bGwpIHtcbiAgY29uc3Qgd2luZG93cyA9IHt9O1xuICBsZXQgY3VycmVudFdpbmRvd05hbWUgPSBudWxsO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMuc3BsaXQoJ1xcbicpLm1hcChfLnRyaW1FbmQpKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBXSU5ET1dfVElUTEVfUEFUVEVSTi5leGVjKGxpbmUpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgY3VycmVudFdpbmRvd05hbWUgPSBtYXRjaFsxXTtcbiAgICAgIHdpbmRvd3NbY3VycmVudFdpbmRvd05hbWVdID0gW107XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKF8udHJpbShsaW5lKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGN1cnJlbnRXaW5kb3dOYW1lID0gbnVsbDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50V2luZG93TmFtZSAmJiBfLmlzQXJyYXkod2luZG93c1tjdXJyZW50V2luZG93TmFtZV0pKSB7XG4gICAgICB3aW5kb3dzW2N1cnJlbnRXaW5kb3dOYW1lXS5wdXNoKGxpbmUpO1xuICAgIH1cbiAgfVxuICBpZiAoXy5pc0VtcHR5KHdpbmRvd3MpKSB7XG4gICAgbG9nPy5kZWJ1ZyhsaW5lcy5qb2luKCdcXG4nKSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcGFyc2UgYW55IHdpbmRvdyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBkdW1wc3lzIG91dHB1dCcpO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0ID0ge3N0YXR1c0JhcjogbnVsbCwgbmF2aWdhdGlvbkJhcjogbnVsbH07XG4gIGZvciAoY29uc3QgW25hbWUsIHByb3BzXSBvZiBfLnRvUGFpcnMod2luZG93cykpIHtcbiAgICBpZiAobmFtZS5zdGFydHNXaXRoKFNUQVRVU19CQVJfV0lORE9XX05BTUVfUFJFRklYKSkge1xuICAgICAgcmVzdWx0LnN0YXR1c0JhciA9IHBhcnNlV2luZG93UHJvcGVydGllcyhuYW1lLCBwcm9wcywgbG9nKTtcbiAgICB9IGVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aChOQVZJR0FUSU9OX0JBUl9XSU5ET1dfTkFNRV9QUkVGSVgpKSB7XG4gICAgICByZXN1bHQubmF2aWdhdGlvbkJhciA9IHBhcnNlV2luZG93UHJvcGVydGllcyhuYW1lLCBwcm9wcywgbG9nKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgdW5tYXRjaGVkV2luZG93cyA9IFtcbiAgICBbJ3N0YXR1c0JhcicsIFNUQVRVU19CQVJfV0lORE9XX05BTUVfUFJFRklYXSxcbiAgICBbJ25hdmlnYXRpb25CYXInLCBOQVZJR0FUSU9OX0JBUl9XSU5ET1dfTkFNRV9QUkVGSVhdXG4gIF0uZmlsdGVyKChbbmFtZV0pID0+IF8uaXNOaWwocmVzdWx0W25hbWVdKSk7XG4gIGZvciAoY29uc3QgW3dpbmRvdywgbmFtZVByZWZpeF0gb2YgdW5tYXRjaGVkV2luZG93cykge1xuICAgIGxvZz8uaW5mbyhgTm8gd2luZG93cyBoYXZlIGJlZW4gZm91bmQgd2hvc2UgdGl0bGUgbWF0Y2hlcyB0byBgICtcbiAgICAgIGAnJHtuYW1lUHJlZml4fScuIEFzc3VtaW5nIGl0IGlzIGludmlzaWJsZS4gYCArXG4gICAgICBgT25seSB0aGUgZm9sbG93aW5nIHdpbmRvd3MgYXJlIGF2YWlsYWJsZTogJHtfLmtleXMod2luZG93cyl9YCk7XG4gICAgcmVzdWx0W3dpbmRvd10gPSBfLmNsb25lRGVlcChERUZBVUxUX1dJTkRPV19QUk9QRVJUSUVTKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5jb21tYW5kcy5nZXRTeXN0ZW1CYXJzID0gYXN5bmMgZnVuY3Rpb24gZ2V0U3lzdGVtQmFycyAoKSB7XG4gIGxldCBzdGRvdXQ7XG4gIHRyeSB7XG4gICAgc3Rkb3V0ID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydkdW1wc3lzJywgJ3dpbmRvdycsICd3aW5kb3dzJ10pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmV0cmlldmUgc3lzdGVtIGJhcnMgZGV0YWlscy4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG4gIHJldHVybiBwYXJzZVdpbmRvd3Moc3Rkb3V0LCB0aGlzLmxvZyk7XG59O1xuXG4vLyBmb3IgdW5pdCB0ZXN0c1xuZXhwb3J0IHsgcGFyc2VXaW5kb3dzLCBwYXJzZVdpbmRvd1Byb3BlcnRpZXMgfTtcbmV4cG9ydCBkZWZhdWx0IGNvbW1hbmRzO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7QUFFQSxNQUFNQSxvQkFBb0IsR0FBRyx3REFBd0Q7QUFDckYsTUFBTUMsYUFBYSxHQUFHLGlFQUFpRTtBQUN2RixNQUFNQyx1QkFBdUIsR0FBRyxvQ0FBb0M7QUFFcEUsTUFBTUMsWUFBWSxHQUFHLEdBQUc7QUFDeEIsTUFBTUMsNkJBQTZCLEdBQUcsV0FBVztBQUNqRCxNQUFNQyxpQ0FBaUMsR0FBRyxlQUFlO0FBQ3pELE1BQU1DLHlCQUF5QixHQUFHO0VBQ2hDQyxPQUFPLEVBQUUsS0FBSztFQUNkQyxDQUFDLEVBQUUsQ0FBQztFQUFFQyxDQUFDLEVBQUUsQ0FBQztFQUFFQyxLQUFLLEVBQUUsQ0FBQztFQUFFQyxNQUFNLEVBQUU7QUFDaEMsQ0FBQztBQUVELE1BQU1DLFFBQVEsR0FBRyxDQUFDLENBQUM7O0FBcUJuQixTQUFTQyxxQkFBcUIsQ0FBRUMsSUFBSSxFQUFFQyxLQUFLLEVBQUVDLEdBQUcsR0FBRyxJQUFJLEVBQUU7RUFDdkQsTUFBTUMsTUFBTSxHQUFHQyxlQUFDLENBQUNDLFNBQVMsQ0FBQ2IseUJBQXlCLENBQUM7RUFDckQsTUFBTWMsU0FBUyxHQUFHTCxLQUFLLENBQUNNLElBQUksQ0FBQyxJQUFJLENBQUM7RUFDbEMsTUFBTUMsVUFBVSxHQUFHckIsYUFBYSxDQUFDc0IsSUFBSSxDQUFDSCxTQUFTLENBQUM7RUFDaEQsSUFBSSxDQUFDRSxVQUFVLEVBQUU7SUFDZk4sR0FBRyxhQUFIQSxHQUFHLHVCQUFIQSxHQUFHLENBQUVRLEtBQUssQ0FBQ0osU0FBUyxDQUFDO0lBQ3JCLE1BQU0sSUFBSUssS0FB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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-bars.js","names":["WINDOW_TITLE_PATTERN","FRAME_PATTERN","VIEW_VISIBILITY_PATTERN","VIEW_VISIBLE","STATUS_BAR_WINDOW_NAME_PREFIX","NAVIGATION_BAR_WINDOW_NAME_PREFIX","DEFAULT_WINDOW_PROPERTIES","visible","x","y","width","height","commands","parseWindowProperties","name","props","log","result","_","cloneDeep","propLines","join","frameMatch","exec","debug","Error","parseFloat","visibilityMatch","parseInt","parseWindows","lines","windows","currentWindowName","line","split","map","trimEnd","match","trim","length","isArray","push","isEmpty","statusBar","navigationBar","toPairs","startsWith","unmatchedWindows","filter","isNil","window","namePrefix","info","keys","getSystemBars","stdout","adb","shell","e","message"],"sources":["../../../lib/commands/system-bars.js"],"sourcesContent":["import _ from 'lodash';\n\nconst WINDOW_TITLE_PATTERN = /^\\s+Window\\s#\\d+\\sWindow\\{[0-9a-f]+\\s\\w+\\s([\\w-]+)\\}:$/;\nconst FRAME_PATTERN = /\\bm?[Ff]rame=\\[([0-9.-]+),([0-9.-]+)\\]\\[([0-9.-]+),([0-9.-]+)\\]/;\nconst VIEW_VISIBILITY_PATTERN = /\\bmViewVisibility=(0x[0-9a-fA-F]+)/;\n// https://developer.android.com/reference/android/view/View#VISIBLE\nconst VIEW_VISIBLE = 0x0;\nconst STATUS_BAR_WINDOW_NAME_PREFIX = 'StatusBar';\nconst NAVIGATION_BAR_WINDOW_NAME_PREFIX = 'NavigationBar';\nconst DEFAULT_WINDOW_PROPERTIES = {\n visible: false,\n x: 0, y: 0, width: 0, height: 0,\n};\n\nconst commands = {};\n\n/**\n * @typedef {Object} WindowProperties\n * @property {boolean} visible Whether the window is visible\n * @property {number} x Window x coordinate\n * @property {number} y Window y coordinate\n * @property {number} width Window width\n * @property {number} height Window height\n */\n\n/**\n * Parses window properties from adb dumpsys output\n *\n * @param {string} name The name of the window whose properties are being parsed\n * @param {Array<string>} props The list of particular window property lines.\n * Check the corresponding unit tests for more details on the input format.\n * @param {Object?} log Logger instance\n * @returns {WindowProperties} Parsed properties object\n * @throws {Error} If there was an issue while parsing the properties string\n */\nfunction parseWindowProperties (name, props, log = null) {\n const result = _.cloneDeep(DEFAULT_WINDOW_PROPERTIES);\n const propLines = props.join('\\n');\n const frameMatch = FRAME_PATTERN.exec(propLines);\n if (!frameMatch) {\n log?.debug(propLines);\n throw new Error(`Cannot parse the frame size from '${name}' window properties`);\n }\n result.x = parseFloat(frameMatch[1]);\n result.y = parseFloat(frameMatch[2]);\n result.width = parseFloat(frameMatch[3]) - result.x;\n result.height = parseFloat(frameMatch[4]) - result.y;\n const visibilityMatch = VIEW_VISIBILITY_PATTERN.exec(propLines);\n if (!visibilityMatch) {\n log?.debug(propLines);\n throw new Error(`Cannot parse the visibility value from '${name}' window properties`);\n }\n result.visible = parseInt(visibilityMatch[1], 16) === VIEW_VISIBLE;\n return result;\n}\n\n/**\n * Extracts status and navigation bar information from the window manager output.\n *\n * @param {Array<string>} lines Output from dumpsys command.\n * Check the corresponding unit tests for more details on the input format.\n * @param {Object?} log Logger instance\n * @return {Object} An object containing two items where keys are statusBar and navigationBar,\n * and values are corresponding WindowProperties objects\n * @throws {Error} If no window properties could be parsed\n */\nfunction parseWindows (lines, log = null) {\n const windows = {};\n let currentWindowName = null;\n for (const line of lines.split('\\n').map(_.trimEnd)) {\n const match = WINDOW_TITLE_PATTERN.exec(line);\n if (match) {\n currentWindowName = match[1];\n windows[currentWindowName] = [];\n continue;\n }\n if (_.trim(line).length === 0) {\n currentWindowName = null;\n continue;\n }\n\n if (currentWindowName && _.isArray(windows[currentWindowName])) {\n windows[currentWindowName].push(line);\n }\n }\n if (_.isEmpty(windows)) {\n log?.debug(lines.join('\\n'));\n throw new Error('Cannot parse any window information from the dumpsys output');\n }\n\n const result = {statusBar: null, navigationBar: null};\n for (const [name, props] of _.toPairs(windows)) {\n if (name.startsWith(STATUS_BAR_WINDOW_NAME_PREFIX)) {\n result.statusBar = parseWindowProperties(name, props, log);\n } else if (name.startsWith(NAVIGATION_BAR_WINDOW_NAME_PREFIX)) {\n result.navigationBar = parseWindowProperties(name, props, log);\n }\n }\n const unmatchedWindows = [\n ['statusBar', STATUS_BAR_WINDOW_NAME_PREFIX],\n ['navigationBar', NAVIGATION_BAR_WINDOW_NAME_PREFIX]\n ].filter(([name]) => _.isNil(result[name]));\n for (const [window, namePrefix] of unmatchedWindows) {\n log?.info(`No windows have been found whose title matches to ` +\n `'${namePrefix}'. Assuming it is invisible. ` +\n `Only the following windows are available: ${_.keys(windows)}`);\n result[window] = _.cloneDeep(DEFAULT_WINDOW_PROPERTIES);\n }\n return result;\n}\n\ncommands.getSystemBars = async function getSystemBars () {\n let stdout;\n try {\n stdout = await this.adb.shell(['dumpsys', 'window', 'windows']);\n } catch (e) {\n throw new Error(`Cannot retrieve system bars details. Original error: ${e.message}`);\n }\n return parseWindows(stdout, this.log);\n};\n\n// for unit tests\nexport { parseWindows, parseWindowProperties };\nexport default commands;\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"system-bars.js","names":["WINDOW_TITLE_PATTERN","FRAME_PATTERN","VIEW_VISIBILITY_PATTERN","VIEW_VISIBLE","STATUS_BAR_WINDOW_NAME_PREFIX","NAVIGATION_BAR_WINDOW_NAME_PREFIX","DEFAULT_WINDOW_PROPERTIES","visible","x","y","width","height","commands","parseWindowProperties","name","props","log","result","_","cloneDeep","propLines","join","frameMatch","exec","debug","Error","parseFloat","visibilityMatch","parseInt","parseWindows","lines","windows","currentWindowName","line","split","map","trimEnd","match","trim","length","isArray","push","isEmpty","statusBar","navigationBar","toPairs","startsWith","unmatchedWindows","filter","isNil","window","namePrefix","info","keys","getSystemBars","stdout","adb","shell","e","message"],"sources":["../../../lib/commands/system-bars.js"],"sourcesContent":["import _ from 'lodash';\n\nconst WINDOW_TITLE_PATTERN = /^\\s+Window\\s#\\d+\\sWindow\\{[0-9a-f]+\\s\\w+\\s([\\w-]+)\\}:$/;\nconst FRAME_PATTERN = /\\bm?[Ff]rame=\\[([0-9.-]+),([0-9.-]+)\\]\\[([0-9.-]+),([0-9.-]+)\\]/;\nconst VIEW_VISIBILITY_PATTERN = /\\bmViewVisibility=(0x[0-9a-fA-F]+)/;\n// https://developer.android.com/reference/android/view/View#VISIBLE\nconst VIEW_VISIBLE = 0x0;\nconst STATUS_BAR_WINDOW_NAME_PREFIX = 'StatusBar';\nconst NAVIGATION_BAR_WINDOW_NAME_PREFIX = 'NavigationBar';\nconst DEFAULT_WINDOW_PROPERTIES = {\n visible: false,\n x: 0, y: 0, width: 0, height: 0,\n};\n\nconst commands = {};\n\n/**\n * @typedef {Object} WindowProperties\n * @property {boolean} visible Whether the window is visible\n * @property {number} x Window x coordinate\n * @property {number} y Window y coordinate\n * @property {number} width Window width\n * @property {number} height Window height\n */\n\n/**\n * Parses window properties from adb dumpsys output\n *\n * @param {string} name The name of the window whose properties are being parsed\n * @param {Array<string>} props The list of particular window property lines.\n * Check the corresponding unit tests for more details on the input format.\n * @param {Object?} log Logger instance\n * @returns {WindowProperties} Parsed properties object\n * @throws {Error} If there was an issue while parsing the properties string\n */\nfunction parseWindowProperties (name, props, log = null) {\n const result = _.cloneDeep(DEFAULT_WINDOW_PROPERTIES);\n const propLines = props.join('\\n');\n const frameMatch = FRAME_PATTERN.exec(propLines);\n if (!frameMatch) {\n log?.debug(propLines);\n throw new Error(`Cannot parse the frame size from '${name}' window properties`);\n }\n result.x = parseFloat(frameMatch[1]);\n result.y = parseFloat(frameMatch[2]);\n result.width = parseFloat(frameMatch[3]) - result.x;\n result.height = parseFloat(frameMatch[4]) - result.y;\n const visibilityMatch = VIEW_VISIBILITY_PATTERN.exec(propLines);\n if (!visibilityMatch) {\n log?.debug(propLines);\n throw new Error(`Cannot parse the visibility value from '${name}' window properties`);\n }\n result.visible = parseInt(visibilityMatch[1], 16) === VIEW_VISIBLE;\n return result;\n}\n\n/**\n * Extracts status and navigation bar information from the window manager output.\n *\n * @param {Array<string>} lines Output from dumpsys command.\n * Check the corresponding unit tests for more details on the input format.\n * @param {Object?} log Logger instance\n * @return {Object} An object containing two items where keys are statusBar and navigationBar,\n * and values are corresponding WindowProperties objects\n * @throws {Error} If no window properties could be parsed\n */\nfunction parseWindows (lines, log = null) {\n const windows = {};\n let currentWindowName = null;\n for (const line of lines.split('\\n').map(_.trimEnd)) {\n const match = WINDOW_TITLE_PATTERN.exec(line);\n if (match) {\n currentWindowName = match[1];\n windows[currentWindowName] = [];\n continue;\n }\n if (_.trim(line).length === 0) {\n currentWindowName = null;\n continue;\n }\n\n if (currentWindowName && _.isArray(windows[currentWindowName])) {\n windows[currentWindowName].push(line);\n }\n }\n if (_.isEmpty(windows)) {\n log?.debug(lines.join('\\n'));\n throw new Error('Cannot parse any window information from the dumpsys output');\n }\n\n const result = {statusBar: null, navigationBar: null};\n for (const [name, props] of _.toPairs(windows)) {\n if (name.startsWith(STATUS_BAR_WINDOW_NAME_PREFIX)) {\n result.statusBar = parseWindowProperties(name, props, log);\n } else if (name.startsWith(NAVIGATION_BAR_WINDOW_NAME_PREFIX)) {\n result.navigationBar = parseWindowProperties(name, props, log);\n }\n }\n const unmatchedWindows = [\n ['statusBar', STATUS_BAR_WINDOW_NAME_PREFIX],\n ['navigationBar', NAVIGATION_BAR_WINDOW_NAME_PREFIX]\n ].filter(([name]) => _.isNil(result[name]));\n for (const [window, namePrefix] of unmatchedWindows) {\n log?.info(`No windows have been found whose title matches to ` +\n `'${namePrefix}'. Assuming it is invisible. ` +\n `Only the following windows are available: ${_.keys(windows)}`);\n result[window] = _.cloneDeep(DEFAULT_WINDOW_PROPERTIES);\n }\n return result;\n}\n\ncommands.getSystemBars = async function getSystemBars () {\n let stdout;\n try {\n stdout = await this.adb.shell(['dumpsys', 'window', 'windows']);\n } catch (e) {\n throw new Error(`Cannot retrieve system bars details. Original error: ${e.message}`);\n }\n return parseWindows(stdout, this.log);\n};\n\n// for unit tests\nexport { parseWindows, parseWindowProperties };\nexport default commands;\n"],"mappings":"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"}
|